Index: chrome/renderer/chrome_content_renderer_client.cc |
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc |
index 6d5817a8fdbfb482f8748e949cfcaeb8ae076176..c528de8a0b4b735d90ab547a10aa5121e4fe752c 100644 |
--- a/chrome/renderer/chrome_content_renderer_client.cc |
+++ b/chrome/renderer/chrome_content_renderer_client.cc |
@@ -734,8 +734,13 @@ bool ChromeContentRendererClient::CrossesExtensionExtents( |
const GURL& new_url, |
bool is_initial_navigation) { |
const ExtensionSet* extensions = extension_dispatcher_->extensions(); |
- bool is_extension_url = !!extensions->GetByURL(new_url); |
+ |
+ // Determine if the new URL is an extension. |
+ // Exclude bookmark apps, which do not use the app process model. |
GURL old_url(frame->top()->document().url()); |
+ const Extension* new_url_extension = extensions->GetByURL(new_url); |
Aaron Boodman
2011/11/18 18:19:52
Pull this into a helper, so that you don't have to
Charlie Reis
2011/11/18 19:45:42
Done.
|
+ if (new_url_extension && new_url_extension->from_bookmark()) |
+ new_url_extension = NULL; |
// If old_url is still empty and this is an initial navigation, then this is |
// a window.open operation. We should look at the opener URL. |
@@ -746,7 +751,7 @@ bool ChromeContentRendererClient::CrossesExtensionExtents( |
GURL opener_url = frame->opener()->document().url(); |
bool opener_is_extension_url = !!extensions->GetByURL(opener_url); |
WebSecurityOrigin opener = frame->opener()->document().securityOrigin(); |
- if (!is_extension_url && |
+ if (!new_url_extension && |
!opener_is_extension_url && |
extension_dispatcher_->is_extension_process() && |
opener.canRequest(WebURL(new_url))) |
@@ -758,15 +763,22 @@ bool ChromeContentRendererClient::CrossesExtensionExtents( |
old_url = frame->top()->opener()->top()->document().url(); |
} |
+ // Determine if the old URL is an extension (excluding bookmark apps). |
+ const Extension* old_url_extension = extensions->GetByURL(old_url); |
+ if (old_url_extension && old_url_extension->from_bookmark()) |
+ old_url_extension = NULL; |
+ |
// TODO(creis): Temporary workaround for crbug.com/59285: Only return true if |
// we would enter an extension app's extent from a non-app, or if we leave an |
// extension with no web extent. We avoid swapping processes to exit a hosted |
// app for now, since we do not yet support postMessage calls from outside the |
// app back into it (e.g., as in Facebook OAuth 2.0). |
- bool old_url_is_hosted_app = extensions->GetByURL(old_url) && |
- !extensions->GetByURL(old_url)->web_extent().is_empty(); |
- return !extensions->InSameExtent(old_url, new_url) && |
- !old_url_is_hosted_app; |
+ bool old_url_is_hosted_app = old_url_extension && |
+ !old_url_extension->web_extent().is_empty(); |
+ if (old_url_is_hosted_app) |
+ return false; |
+ |
+ return old_url_extension != new_url_extension; |
} |
void ChromeContentRendererClient::OnPurgeMemory() { |