Index: chrome/browser/chrome_content_browser_client.cc |
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc |
index 9679ace6f7191eb3b92cefed99db4e08c2ab3712..d26d539b8da744b2b5a3ffff275a075498a6ab2c 100644 |
--- a/chrome/browser/chrome_content_browser_client.cc |
+++ b/chrome/browser/chrome_content_browser_client.cc |
@@ -768,20 +768,12 @@ void SetApplicationLocaleOnIOThread(const std::string& locale) { |
g_io_thread_application_locale.Get() = locale; |
} |
-void HandleBlockedPopupOnUIThread(const BlockedWindowParams& params) { |
- RenderFrameHost* render_frame_host = RenderFrameHost::FromID( |
- params.render_process_id(), params.opener_render_frame_id()); |
- if (!render_frame_host) |
- return; |
- WebContents* tab = WebContents::FromRenderFrameHost(render_frame_host); |
- // The tab might already have navigated away. We only need to do this check |
- // for main frames, since the RenderFrameHost for a subframe opener will have |
- // already been deleted if the main frame navigates away. |
- if (!tab || |
- (!render_frame_host->GetParent() && |
- tab->GetMainFrame() != render_frame_host)) |
- return; |
- |
+void HandleBlockedPopupOnUIThread(const BlockedWindowParams& params, |
+ RenderFrameHost* render_frame_host, |
+ WebContents* tab) { |
+ DCHECK(tab); |
+ DCHECK(render_frame_host->GetParent() || |
+ tab->GetMainFrame() == render_frame_host); |
prerender::PrerenderContents* prerender_contents = |
prerender::PrerenderContents::FromWebContents(tab); |
if (prerender_contents) { |
@@ -796,22 +788,6 @@ void HandleBlockedPopupOnUIThread(const BlockedWindowParams& params) { |
popup_helper->AddBlockedPopup(params); |
} |
-#if BUILDFLAG(ENABLE_PLUGINS) |
-void HandleFlashDownloadActionOnUIThread(int render_process_id, |
- int render_frame_id, |
- const GURL& source_url) { |
- DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- RenderFrameHost* render_frame_host = |
- RenderFrameHost::FromID(render_process_id, render_frame_id); |
- if (!render_frame_host) |
- return; |
- WebContents* web_contents = |
- WebContents::FromRenderFrameHost(render_frame_host); |
- FlashDownloadInterception::InterceptFlashDownloadNavigation(web_contents, |
- source_url); |
-} |
-#endif // BUILDFLAG(ENABLE_PLUGINS) |
- |
// An implementation of the SSLCertReporter interface used by |
// SSLErrorHandler. Uses CertificateReportingService to send reports. The |
// service handles queueing and re-sending of failed reports. Each certificate |
@@ -855,14 +831,6 @@ float GetDeviceScaleAdjustment() { |
return ratio * (kMaxFSM - kMinFSM) + kMinFSM; |
} |
-void HandleSingleTabModeBlockOnUIThread(const BlockedWindowParams& params) { |
- WebContents* web_contents = tab_util::GetWebContentsByFrameID( |
- params.render_process_id(), params.opener_render_frame_id()); |
- if (!web_contents) |
- return; |
- |
- SingleTabModeTabHelper::FromWebContents(web_contents)->HandleOpenUrl(params); |
-} |
#endif // defined(OS_ANDROID) |
#if BUILDFLAG(ENABLE_EXTENSIONS) |
@@ -966,6 +934,38 @@ WebContents* GetWebContents(int render_process_id, int render_frame_id) { |
return WebContents::FromRenderFrameHost(rfh); |
} |
+#if BUILDFLAG(ENABLE_EXTENSIONS) |
+// Returns true if there is exists an extension with the same origin as |
+// |source_origin| in |opener_render_process_id| with |
+// APIPermission::kBackground. |
+bool SecurityOriginHasExtensionBackgroundPermission( |
+ extensions::ProcessMap* process_map, |
+ extensions::ExtensionRegistry* registry, |
+ const GURL& source_origin, |
+ int opener_render_process_id) { |
+ if (source_origin.SchemeIs(extensions::kExtensionScheme)) { |
+ const std::string& id = source_origin.host(); |
+ const Extension* extension = registry->enabled_extensions().GetByID(id); |
+ return extension && |
+ extension->permissions_data()->HasAPIPermission( |
+ APIPermission::kBackground) && |
+ process_map->Contains(id, opener_render_process_id); |
+ } |
+ |
+ for (const auto& extension_id : |
+ process_map->GetExtensionsInProcess(opener_render_process_id)) { |
+ const Extension* extension = registry->GetExtensionById( |
+ extension_id, extensions::ExtensionRegistry::ENABLED); |
+ if (extension->web_extent().MatchesSecurityOrigin(source_origin) && |
+ extension->permissions_data()->HasAPIPermission( |
+ APIPermission::kBackground)) { |
+ return true; |
+ } |
+ } |
+ return false; |
+} |
+#endif |
+ |
} // namespace |
ChromeContentBrowserClient::ChromeContentBrowserClient() |
@@ -2430,8 +2430,7 @@ ChromeContentBrowserClient::GetPlatformNotificationService() { |
} |
bool ChromeContentBrowserClient::CanCreateWindow( |
- int opener_render_process_id, |
- int opener_render_frame_id, |
+ RenderFrameHost* opener, |
const GURL& opener_url, |
const GURL& opener_top_level_frame_url, |
const GURL& source_origin, |
@@ -2443,21 +2442,26 @@ bool ChromeContentBrowserClient::CanCreateWindow( |
const blink::mojom::WindowFeatures& features, |
bool user_gesture, |
bool opener_suppressed, |
- content::ResourceContext* context, |
bool* no_javascript_access) { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ DCHECK(opener); |
+ content::WebContents* web_contents = |
+ content::WebContents::FromRenderFrameHost(opener); |
+ Profile* profile = |
+ Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
+ DCHECK(profile); |
*no_javascript_access = false; |
// If the opener is trying to create a background window but doesn't have |
// the appropriate permission, fail the attempt. |
if (container_type == content::mojom::WindowContainerType::BACKGROUND) { |
#if BUILDFLAG(ENABLE_EXTENSIONS) |
- ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); |
- InfoMap* map = io_data->GetExtensionInfoMap(); |
- if (!map->SecurityOriginHasAPIPermission(source_origin, |
- opener_render_process_id, |
- APIPermission::kBackground)) { |
+ auto* process_map = extensions::ProcessMap::Get(profile); |
+ auto* registry = extensions::ExtensionRegistry::Get(profile); |
+ if (!SecurityOriginHasExtensionBackgroundPermission( |
+ process_map, registry, source_origin, |
+ opener->GetProcess()->GetID())) { |
return false; |
} |
@@ -2468,7 +2472,7 @@ bool ChromeContentBrowserClient::CanCreateWindow( |
// already. We must use the full URL to find hosted apps, though, and not |
// just the origin. |
const Extension* extension = |
- map->extensions().GetExtensionOrAppByURL(opener_url); |
+ registry->enabled_extensions().GetExtensionOrAppByURL(opener_url); |
if (extension && !extensions::BackgroundInfo::AllowJSAccess(extension)) |
*no_javascript_access = true; |
#endif |
@@ -2478,18 +2482,16 @@ bool ChromeContentBrowserClient::CanCreateWindow( |
#if BUILDFLAG(ENABLE_EXTENSIONS) |
if (extensions::WebViewRendererState::GetInstance()->IsGuest( |
- opener_render_process_id)) { |
+ opener->GetProcess()->GetID())) { |
return true; |
} |
if (target_url.SchemeIs(extensions::kExtensionScheme)) { |
- // Intentionally duplicating |io_data| and |map| code from above because we |
- // want to reduce calls to retrieve them as this function is a SYNC IPC |
- // handler. |
- ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); |
- InfoMap* map = io_data->GetExtensionInfoMap(); |
+ // Intentionally duplicating |registry| code from above because we want to |
+ // reduce calls to retrieve them as this function is a SYNC IPC handler. |
+ auto* registry = extensions::ExtensionRegistry::Get(profile); |
const Extension* extension = |
- map->extensions().GetExtensionOrAppByURL(opener_url); |
+ registry->enabled_extensions().GetExtensionOrAppByURL(opener_url); |
if (extension && extension->is_platform_app()) { |
AppLoadedInTabSource source = |
opener_top_level_frame_url == |
@@ -2509,48 +2511,41 @@ bool ChromeContentBrowserClient::CanCreateWindow( |
#endif |
HostContentSettingsMap* content_settings = |
- ProfileIOData::FromResourceContext(context)->GetHostContentSettingsMap(); |
+ HostContentSettingsMapFactory::GetForProfile(profile); |
#if BUILDFLAG(ENABLE_PLUGINS) |
if (FlashDownloadInterception::ShouldStopFlashDownloadAction( |
content_settings, opener_top_level_frame_url, target_url, |
user_gesture)) { |
- BrowserThread::PostTask( |
- BrowserThread::UI, FROM_HERE, |
- base::Bind(&HandleFlashDownloadActionOnUIThread, |
- opener_render_process_id, opener_render_frame_id, |
- opener_top_level_frame_url)); |
+ FlashDownloadInterception::InterceptFlashDownloadNavigation( |
+ web_contents, opener_top_level_frame_url); |
return false; |
} |
#endif |
- BlockedWindowParams blocked_params( |
- target_url, referrer, frame_name, disposition, features, user_gesture, |
- opener_suppressed, opener_render_process_id, opener_render_frame_id); |
- |
if (!user_gesture && |
!base::CommandLine::ForCurrentProcess()->HasSwitch( |
switches::kDisablePopupBlocking)) { |
- if (content_settings->GetContentSetting(opener_top_level_frame_url, |
- opener_top_level_frame_url, |
- CONTENT_SETTINGS_TYPE_POPUPS, |
- std::string()) != |
- CONTENT_SETTING_ALLOW) { |
- BrowserThread::PostTask(BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&HandleBlockedPopupOnUIThread, |
- blocked_params)); |
+ if (content_settings->GetContentSetting( |
+ opener_top_level_frame_url, opener_top_level_frame_url, |
+ CONTENT_SETTINGS_TYPE_POPUPS, |
+ std::string()) != CONTENT_SETTING_ALLOW) { |
+ BlockedWindowParams blocked_params(target_url, referrer, frame_name, |
+ disposition, features, user_gesture, |
+ opener_suppressed); |
+ HandleBlockedPopupOnUIThread(blocked_params, opener, web_contents); |
return false; |
} |
} |
#if defined(OS_ANDROID) |
- if (SingleTabModeTabHelper::IsRegistered(opener_render_process_id, |
- opener_render_frame_id)) { |
- BrowserThread::PostTask(BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&HandleSingleTabModeBlockOnUIThread, |
- blocked_params)); |
+ auto* single_tab_mode_helper = |
+ SingleTabModeTabHelper::FromWebContents(web_contents); |
+ if (single_tab_mode_helper->block_all_new_windows()) { |
+ BlockedWindowParams blocked_params(target_url, referrer, frame_name, |
+ disposition, features, user_gesture, |
+ opener_suppressed); |
+ single_tab_mode_helper->HandleOpenUrl(blocked_params); |
return false; |
} |
#endif |