| 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..ae11acf28a19df9344bcb344932c4936e8c5ec4f 100644
|
| --- a/chrome/renderer/chrome_content_renderer_client.cc
|
| +++ b/chrome/renderer/chrome_content_renderer_client.cc
|
| @@ -729,14 +729,26 @@ void ChromeContentRendererClient::SetExtensionDispatcher(
|
| extension_dispatcher_.reset(extension_dispatcher);
|
| }
|
|
|
| +const Extension* ChromeContentRendererClient::GetNonBookmarkAppExtension(
|
| + const ExtensionSet* extensions, const GURL& url) {
|
| + // Exclude bookmark apps, which do not use the app process model.
|
| + const Extension* extension = extensions->GetByURL(url);
|
| + if (extension && extension->from_bookmark())
|
| + extension = NULL;
|
| + return extension;
|
| +}
|
| +
|
| bool ChromeContentRendererClient::CrossesExtensionExtents(
|
| WebFrame* frame,
|
| const GURL& new_url,
|
| bool is_initial_navigation) {
|
| const ExtensionSet* extensions = extension_dispatcher_->extensions();
|
| - bool is_extension_url = !!extensions->GetByURL(new_url);
|
| GURL old_url(frame->top()->document().url());
|
|
|
| + // Determine if the new URL is an extension (excluding bookmark apps).
|
| + const Extension* new_url_extension = GetNonBookmarkAppExtension(extensions,
|
| + new_url);
|
| +
|
| // 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.
|
| if (is_initial_navigation && old_url.is_empty() && frame->opener()) {
|
| @@ -746,7 +758,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 +770,21 @@ 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 = GetNonBookmarkAppExtension(extensions,
|
| + old_url);
|
| +
|
| // 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() {
|
|
|