From 1c57e078aa6549e57e8d4dbf9db067baa9f50ed2 Mon Sep 17 00:00:00 2001 From: Jeremy Rose Date: Fri, 23 Apr 2021 12:57:40 -0700 Subject: [PATCH] refactor: remove ProcessPreferences (#28786) --- shell/browser/electron_browser_client.cc | 67 ++++++------------------ shell/browser/electron_browser_client.h | 15 ------ 2 files changed, 17 insertions(+), 65 deletions(-) diff --git a/shell/browser/electron_browser_client.cc b/shell/browser/electron_browser_client.cc index bc66016cd1..98f76eb073 100644 --- a/shell/browser/electron_browser_client.cc +++ b/shell/browser/electron_browser_client.cc @@ -101,6 +101,7 @@ #include "shell/common/options_switches.h" #include "shell/common/platform_util.h" #include "third_party/blink/public/common/loader/url_loader_throttle.h" +#include "third_party/blink/public/common/tokens/tokens.h" #include "third_party/blink/public/common/web_preferences/web_preferences.h" #include "third_party/blink/public/mojom/badging/badging.mojom.h" #include "ui/base/resource/resource_bundle.h" @@ -368,30 +369,6 @@ content::WebContents* ElectronBrowserClient::GetWebContentsFromProcessID( return WebContentsPreferences::GetWebContentsFromProcessID(process_id); } -void ElectronBrowserClient::AddProcessPreferences( - int process_id, - ElectronBrowserClient::ProcessPreferences prefs) { - process_preferences_[process_id] = prefs; -} - -void ElectronBrowserClient::RemoveProcessPreferences(int process_id) { - process_preferences_.erase(process_id); -} - -bool ElectronBrowserClient::IsProcessObserved(int process_id) const { - return process_preferences_.find(process_id) != process_preferences_.end(); -} - -bool ElectronBrowserClient::RendererUsesNativeWindowOpen(int process_id) const { - auto it = process_preferences_.find(process_id); - return it != process_preferences_.end() && it->second.native_window_open; -} - -bool ElectronBrowserClient::RendererDisablesPopups(int process_id) const { - auto it = process_preferences_.find(process_id); - return it != process_preferences_.end() && it->second.disable_popups; -} - content::SiteInstance* ElectronBrowserClient::GetSiteInstanceFromAffinity( content::BrowserContext* browser_context, const GURL& url, @@ -407,8 +384,6 @@ void ElectronBrowserClient::RenderProcessWillLaunch( content::RenderProcessHost* host) { // When a render process is crashed, it might be reused. int process_id = host->GetID(); - if (IsProcessObserved(process_id)) - return; auto* browser_context = host->GetBrowserContext(); ALLOW_UNUSED_LOCAL(browser_context); @@ -422,20 +397,6 @@ void ElectronBrowserClient::RenderProcessWillLaunch( new ElectronExtensionMessageFilter(process_id, browser_context)); #endif - ProcessPreferences prefs; - auto* web_preferences = - WebContentsPreferences::From(GetWebContentsFromProcessID(process_id)); - if (web_preferences) { - prefs.sandbox = web_preferences->IsEnabled(options::kSandbox); - prefs.native_window_open = - web_preferences->IsEnabled(options::kNativeWindowOpen); - prefs.disable_popups = web_preferences->IsEnabled("disablePopups"); - prefs.web_security = web_preferences->IsEnabled(options::kWebSecurity, - true /* default value */); - prefs.browser_context = host->GetBrowserContext(); - } - - AddProcessPreferences(host->GetID(), prefs); // ensure the ProcessPreferences is removed later host->AddObserver(this); } @@ -699,10 +660,11 @@ bool ElectronBrowserClient::CanCreateWindow( bool* no_javascript_access) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - int opener_render_process_id = opener->GetProcess()->GetID(); - - if (RendererUsesNativeWindowOpen(opener_render_process_id)) { - if (RendererDisablesPopups(opener_render_process_id)) { + content::WebContents* web_contents = + content::WebContents::FromRenderFrameHost(opener); + WebContentsPreferences* prefs = WebContentsPreferences::From(web_contents); + if (prefs && prefs->IsEnabled(options::kNativeWindowOpen)) { + if (prefs->IsEnabled("disablePopups")) { // without allowpopups attribute should return // null from window.open calls return false; @@ -921,7 +883,6 @@ void ElectronBrowserClient::RenderProcessHostDestroyed( int process_id = host->GetID(); pending_processes_.erase(process_id); renderer_is_subframe_.erase(process_id); - RemoveProcessPreferences(process_id); host->RemoveObserver(this); } @@ -1390,11 +1351,17 @@ void ElectronBrowserClient::OverrideURLLoaderFactoryParams( const url::Origin& origin, bool is_for_isolated_world, network::mojom::URLLoaderFactoryParams* factory_params) { - // Bypass CORB and CORS when web security is disabled. - auto it = process_preferences_.find(factory_params->process_id); - if (it != process_preferences_.end() && !it->second.web_security) { - factory_params->is_corb_enabled = false; - factory_params->disable_web_security = true; + if (factory_params->top_frame_id) { + // Bypass CORB and CORS when web security is disabled. + auto* rfh = content::RenderFrameHost::FromFrameToken( + factory_params->process_id, + blink::LocalFrameToken(factory_params->top_frame_id.value())); + auto* web_contents = content::WebContents::FromRenderFrameHost(rfh); + auto* prefs = WebContentsPreferences::From(web_contents); + if (prefs && !prefs->IsEnabled(options::kWebSecurity, true)) { + factory_params->is_corb_enabled = false; + factory_params->disable_web_security = true; + } } extensions::URLLoaderFactoryManager::OverrideURLLoaderFactoryParams( diff --git a/shell/browser/electron_browser_client.h b/shell/browser/electron_browser_client.h index 636c05215a..853ffc77e1 100644 --- a/shell/browser/electron_browser_client.h +++ b/shell/browser/electron_browser_client.h @@ -272,19 +272,6 @@ class ElectronBrowserClient : public content::ContentBrowserClient, const content::ChildProcessTerminationInfo& info) override; private: - struct ProcessPreferences { - bool sandbox = false; - bool native_window_open = false; - bool disable_popups = false; - bool web_security = true; - content::BrowserContext* browser_context = nullptr; - }; - - void AddProcessPreferences(int process_id, ProcessPreferences prefs); - void RemoveProcessPreferences(int process_id); - bool IsProcessObserved(int process_id) const; - bool RendererUsesNativeWindowOpen(int process_id) const; - bool RendererDisablesPopups(int process_id) const; content::SiteInstance* GetSiteInstanceFromAffinity( content::BrowserContext* browser_context, const GURL& url, @@ -302,8 +289,6 @@ class ElectronBrowserClient : public content::ContentBrowserClient, Delegate* delegate_ = nullptr; - std::map process_preferences_; - std::string user_agent_override_ = ""; // Simple shared ID generator, used by ProxyingURLLoaderFactory and