From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Tue, 4 Feb 2020 08:59:32 -0700 Subject: Revert "Remove ContentRendererClient::ShouldFork." This reverts the CL at https://chromium-review.googlesource.com/c/chromium/src/+/1812128. We use it to force a new renderer process for navigations, and need to start a new renderer process for every navigation to keep Node.js working properly. Once Native Modules in the renderer process are required to be NAPI or context aware (Electron v11), this patch can be removed. diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc index 6ed2fa09d79bd35b261cbb028883adc0a71bdbac..42975c626cd4ff3c2c22936e98ebf7e1865e4d0c 100644 --- a/chrome/renderer/chrome_content_renderer_client.cc +++ b/chrome/renderer/chrome_content_renderer_client.cc @@ -1269,6 +1269,25 @@ bool ChromeContentRendererClient::AllowPopup() { #endif } +bool ChromeContentRendererClient::ShouldFork(WebLocalFrame* frame, + const GURL& url, + const std::string& http_method, + bool is_initial_navigation, + bool is_server_redirect) { + DCHECK(!frame->Parent()); + + // If |url| matches one of the prerendered URLs, stop this navigation and try + // to swap in the prerendered page on the browser process. If the prerendered + // page no longer exists by the time the OpenURL IPC is handled, a normal + // navigation is attempted. + if (prerender_dispatcher_.get() && + prerender_dispatcher_->IsPrerenderURL(url)) { + return true; + } + + return false; +} + void ChromeContentRendererClient::WillSendRequest( WebLocalFrame* frame, ui::PageTransition transition_type, diff --git a/chrome/renderer/chrome_content_renderer_client.h b/chrome/renderer/chrome_content_renderer_client.h index b5f29c1f2193dfd0f72ab238c9474dc5a20ee235..771637be7ca510e24e16914d2a3565729f3da301 100644 --- a/chrome/renderer/chrome_content_renderer_client.h +++ b/chrome/renderer/chrome_content_renderer_client.h @@ -123,6 +123,11 @@ class ChromeContentRendererClient base::SingleThreadTaskRunner* compositor_thread_task_runner) override; bool RunIdleHandlerWhenWidgetsHidden() override; bool AllowPopup() override; + bool ShouldFork(blink::WebLocalFrame* frame, + const GURL& url, + const std::string& http_method, + bool is_initial_navigation, + bool is_server_redirect) override; void WillSendRequest(blink::WebLocalFrame* frame, ui::PageTransition transition_type, const blink::WebURL& url, diff --git a/content/public/renderer/content_renderer_client.cc b/content/public/renderer/content_renderer_client.cc index 37f552964f5443188ac813713e06d4a7cf960384..1aa65b17d65211a4528db242e22453cbd287865a 100644 --- a/content/public/renderer/content_renderer_client.cc +++ b/content/public/renderer/content_renderer_client.cc @@ -108,6 +108,14 @@ bool ContentRendererClient::HandleNavigation( } #endif +bool ContentRendererClient::ShouldFork(blink::WebLocalFrame* frame, + const GURL& url, + const std::string& http_method, + bool is_initial_navigation, + bool is_server_redirect) { + return false; +} + void ContentRendererClient::WillSendRequest( blink::WebLocalFrame* frame, ui::PageTransition transition_type, diff --git a/content/public/renderer/content_renderer_client.h b/content/public/renderer/content_renderer_client.h index 541fb915a2096a6ea56860662fff9f1dec9929cf..e4637fc393bafcdeac62cd4257f42451306dbeed 100644 --- a/content/public/renderer/content_renderer_client.h +++ b/content/public/renderer/content_renderer_client.h @@ -214,6 +214,13 @@ class CONTENT_EXPORT ContentRendererClient { bool is_redirect); #endif + // Returns true if we should fork a new process for the given navigation. + virtual bool ShouldFork(blink::WebLocalFrame* frame, + const GURL& url, + const std::string& http_method, + bool is_initial_navigation, + bool is_server_redirect); + // Notifies the embedder that the given frame is requesting the resource at // |url|. If the function returns a valid |new_url|, the request must be // updated to use it. The |force_ignore_site_for_cookies| output parameter diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 3a01380b4fc373f41d631f585d4576b10129b130..5cafa3e47e96327963706e51af1414b76bcff5e7 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc @@ -5767,6 +5767,23 @@ void RenderFrameImpl::BeginNavigation( // we can do a per-frame check here rather than a process-wide check. bool should_fork = HasWebUIScheme(url) || HasWebUIScheme(old_url) || (enabled_bindings_ & kWebUIBindingsPolicyMask); + + if (!should_fork && url.SchemeIs(url::kFileScheme)) { + // Fork non-file to file opens (see https://crbug.com/1031119). Note that + // this may fork unnecessarily if another tab (hosting a file or not) + // targeted this one before its initial navigation, but that shouldn't + // cause a problem. + should_fork = !old_url.SchemeIs(url::kFileScheme); + } + + if (!should_fork) { + // Give the embedder a chance. + bool is_initial_navigation = render_view_->history_list_length_ == 0; + should_fork = GetContentClient()->renderer()->ShouldFork( + frame_, url, info->url_request.HttpMethod().Utf8(), + is_initial_navigation, false /* is_redirect */); + } + if (should_fork) { OpenURL(std::move(info)); return; // Suppress the load here.