Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6295)

Unified Diff: chrome/browser/ui/browser.cc

Issue 2521793003: Fix WebContentsDelegate::ShouldCreateWebContents implementations. (Closed)
Patch Set: Rename in MaybeCreateBackgroundContents Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/browser.cc
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 5d77f9c65fb9e0492e3971d9cff5083be4816c44..434636764411e2cd30a0cab292636dc101fb509d 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -1580,11 +1580,13 @@ void Browser::ShowRepostFormWarningDialog(WebContents* source) {
}
bool Browser::ShouldCreateWebContents(
- WebContents* web_contents,
+ content::WebContents* web_contents,
+ content::SiteInstance* source_site_instance,
int32_t route_id,
int32_t main_frame_route_id,
int32_t main_frame_widget_route_id,
WindowContainerType window_container_type,
+ const GURL& opener_url,
const std::string& frame_name,
const GURL& target_url,
const std::string& partition_id,
@@ -1592,8 +1594,9 @@ bool Browser::ShouldCreateWebContents(
if (window_container_type == WINDOW_CONTAINER_TYPE_BACKGROUND) {
// If a BackgroundContents is created, suppress the normal WebContents.
return !MaybeCreateBackgroundContents(
- route_id, main_frame_route_id, main_frame_widget_route_id, web_contents,
- frame_name, target_url, partition_id, session_storage_namespace);
+ source_site_instance, opener_url, route_id, main_frame_route_id,
+ main_frame_widget_route_id, frame_name, target_url, partition_id,
+ session_storage_namespace);
}
return true;
@@ -2519,21 +2522,19 @@ bool Browser::ShouldStartShutdown() const {
}
bool Browser::MaybeCreateBackgroundContents(
+ content::SiteInstance* source_site_instance,
+ const GURL& opener_url,
int32_t route_id,
int32_t main_frame_route_id,
int32_t main_frame_widget_route_id,
- WebContents* opener_web_contents,
const std::string& frame_name,
const GURL& target_url,
const std::string& partition_id,
content::SessionStorageNamespace* session_storage_namespace) {
- GURL opener_url = opener_web_contents->GetURL();
ExtensionService* extensions_service =
extensions::ExtensionSystem::Get(profile_)->extension_service();
- if (!opener_url.is_valid() ||
- frame_name.empty() ||
- !extensions_service ||
+ if (!opener_url.is_valid() || frame_name.empty() || !extensions_service ||
!extensions_service->is_ready())
return false;
@@ -2554,11 +2555,10 @@ bool Browser::MaybeCreateBackgroundContents(
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::ProcessMap::Get(profile_);
- if (!opener_site_instance->GetProcess() ||
- !process_map->Contains(
- extension->id(), opener_site_instance->GetProcess()->GetID())) {
+ if (!source_site_instance->GetProcess() ||
+ !process_map->Contains(extension->id(),
+ source_site_instance->GetProcess()->GetID())) {
return false;
}
@@ -2576,28 +2576,33 @@ bool Browser::MaybeCreateBackgroundContents(
delete existing;
}
- // If script access is not allowed, create the the background contents in a
- // new SiteInstance, so that a separate process is used.
- 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_instance.get(), route_id, main_frame_route_id,
- main_frame_widget_route_id, profile_, frame_name,
- base::ASCIIToUTF16(extension->id()), partition_id,
- session_storage_namespace);
-
- // 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(),
- ui::PAGE_TRANSITION_LINK,
- std::string()); // No extra headers.
+ BackgroundContents* contents = nullptr;
+ if (allow_js_access) {
+ contents = service->CreateBackgroundContents(
+ source_site_instance, route_id, main_frame_route_id,
+ main_frame_widget_route_id, profile_, frame_name,
+ base::ASCIIToUTF16(extension->id()), partition_id,
+ session_storage_namespace);
+ } else {
+ // If script access is not allowed, create the the background contents in a
+ // new SiteInstance, so that a separate process is used. We must not use any
+ // of the passed-in routing IDs, as they are objects in the opener's
+ // process.
+ contents = service->CreateBackgroundContents(
+ content::SiteInstance::Create(
+ source_site_instance->GetBrowserContext()),
+ MSG_ROUTING_NONE, MSG_ROUTING_NONE, MSG_ROUTING_NONE, profile_,
+ frame_name, base::ASCIIToUTF16(extension->id()), partition_id,
+ session_storage_namespace);
+
+ // 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) {
+ contents->web_contents()->GetController().LoadURL(
+ target_url, content::Referrer(), ui::PAGE_TRANSITION_LINK,
+ std::string()); // No extra headers.
+ }
}
return contents != NULL;
« no previous file with comments | « chrome/browser/ui/browser.h ('k') | components/offline_pages/content/background_loader/background_loader_contents.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698