Index: chrome/browser/ui/browser.cc |
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc |
index 0f48ff8ec1d6992d30eee8d2eea1c072cfda1669..dd31b864aa6bd12d5e4e54b8bd7c74a83939dc71 100644 |
--- a/chrome/browser/ui/browser.cc |
+++ b/chrome/browser/ui/browser.cc |
@@ -2284,9 +2284,10 @@ void Browser::OpenBookmarkManagerEditNode(int64 node_id) { |
} |
bool Browser::MaybeCreateBackgroundContents(int route_id, |
- SiteInstance* site, |
- const GURL& opener_url, |
- const string16& frame_name) { |
+ WebContents* opener_web_contents, |
+ const string16& frame_name, |
+ const GURL& target_url) { |
+ GURL opener_url = opener_web_contents->GetURL(); |
ExtensionService* extensions_service = profile_->GetExtensionService(); |
if (!opener_url.is_valid() || |
@@ -2312,9 +2313,11 @@ bool Browser::MaybeCreateBackgroundContents(int route_id, |
return false; |
// Ensure that we're trying to open this from the extension's process. |
+ SiteInstance* opener_site_instance = opener_web_contents->GetSiteInstance(); |
extensions::ProcessMap* process_map = extensions_service->process_map(); |
- if (!site->GetProcess() || |
- !process_map->Contains(extension->id(), site->GetProcess()->GetID())) { |
+ if (!opener_site_instance->GetProcess() || |
+ !process_map->Contains( |
+ extension->id(), opener_site_instance->GetProcess()->GetID())) { |
return false; |
} |
@@ -2327,10 +2330,32 @@ bool Browser::MaybeCreateBackgroundContents(int route_id, |
delete existing; |
} |
+ // If script access is not allowed, created the the background contents in a |
Charlie Reis
2012/03/27 23:19:27
nit: create
Mihai Parparita -not on Chrome
2012/03/28 20:29:01
Done.
|
+ // new SiteInstance, so that a separate process is used. |
+ bool allow_js_access = extension->allow_background_js_access(); |
+ scoped_refptr<content::SiteInstance> site_instance = |
+ allow_js_access ? |
+ opener_site_instance : |
+ content::SiteInstance::Create(opener_web_contents->GetBrowserContext()); |
+ |
// Passed all the checks, so this should be created as a BackgroundContents. |
- BackgroundContents* contents = |
- service->CreateBackgroundContents(site, route_id, profile_, frame_name, |
- ASCIIToUTF16(extension->id())); |
+ BackgroundContents* contents = service->CreateBackgroundContents( |
+ site_instance, |
+ route_id, |
+ profile_, |
+ frame_name, |
+ ASCIIToUTF16(extension->id())); |
+ |
+ // When a separate process is used, the original renderer cannot access the |
+ // new window later, thus we need to navigate the window now. |
+ if (contents && !allow_js_access) { |
+ contents->web_contents()->GetController().LoadURL( |
+ target_url, |
+ content::Referrer(), |
+ content::PAGE_TRANSITION_LINK, |
+ std::string()); // No extra headers. |
+ } |
+ |
return contents != NULL; |
} |
@@ -4072,14 +4097,12 @@ bool Browser::ShouldCreateWebContents( |
WebContents* web_contents, |
int route_id, |
WindowContainerType window_container_type, |
- const string16& frame_name) { |
+ const string16& frame_name, |
+ const GURL& target_url) { |
if (window_container_type == WINDOW_CONTAINER_TYPE_BACKGROUND) { |
// If a BackgroundContents is created, suppress the normal WebContents. |
return !MaybeCreateBackgroundContents( |
- route_id, |
- web_contents->GetSiteInstance(), |
- web_contents->GetURL(), |
- frame_name); |
+ route_id, web_contents, frame_name, target_url); |
} |
return true; |