1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/common/extensions/extension_process_policy.h"
6
7 #include "chrome/common/extensions/extension_constants.h"
8 #include "chrome/common/extensions/extension_set.h"
9 #include "chrome/common/extensions/manifest_handlers/app_isolation_info.h"
10 #include "extensions/common/extension.h"
11
12 namespace extensions {
13
GetNonBookmarkAppExtension(const ExtensionSet & extensions,const GURL & url)14 const extensions::Extension* GetNonBookmarkAppExtension(
15 const ExtensionSet& extensions, const GURL& url) {
16 // Exclude bookmark apps, which do not use the app process model.
17 const extensions::Extension* extension =
18 extensions.GetExtensionOrAppByURL(url);
19 if (extension && extension->from_bookmark())
20 extension = NULL;
21 return extension;
22 }
23
CrossesExtensionProcessBoundary(const ExtensionSet & extensions,const GURL & old_url,const GURL & new_url,bool should_consider_workaround)24 bool CrossesExtensionProcessBoundary(
25 const ExtensionSet& extensions,
26 const GURL& old_url,
27 const GURL& new_url,
28 bool should_consider_workaround) {
29 const extensions::Extension* old_url_extension = GetNonBookmarkAppExtension(
30 extensions,
31 old_url);
32 const extensions::Extension* new_url_extension = GetNonBookmarkAppExtension(
33 extensions,
34 new_url);
35
36 // TODO(creis): Temporary workaround for crbug.com/59285: Do not swap process
37 // to navigate from a hosted app to a normal page or another hosted app
38 // (unless either is the web store). This is because some OAuth providers
39 // use non-app popups that communicate with non-app iframes inside the app
40 // (e.g., Facebook). This would require out-of-process iframes to support.
41 // See http://crbug.com/99379.
42 // Note that we skip this exception for isolated apps, which require strict
43 // process separation from non-app pages.
44 if (should_consider_workaround) {
45 bool old_url_is_hosted_app = old_url_extension &&
46 !old_url_extension->web_extent().is_empty() &&
47 !AppIsolationInfo::HasIsolatedStorage(old_url_extension);
48 bool new_url_is_normal_or_hosted = !new_url_extension ||
49 (!new_url_extension->web_extent().is_empty() &&
50 !AppIsolationInfo::HasIsolatedStorage(new_url_extension));
51 bool either_is_web_store =
52 (old_url_extension &&
53 old_url_extension->id() == extension_misc::kWebStoreAppId) ||
54 (new_url_extension &&
55 new_url_extension->id() == extension_misc::kWebStoreAppId);
56 if (old_url_is_hosted_app &&
57 new_url_is_normal_or_hosted &&
58 !either_is_web_store)
59 return false;
60 }
61
62 return old_url_extension != new_url_extension;
63 }
64
65 } // namespace extensions
66