123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
- From: Shelley Vohr <[email protected]>
- 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 9b520e164c548bc48c2d0e2b861b74c8532a3952..b77a48597958463cfc9d9e1d7b5767e81d85492d 100644
- --- a/chrome/renderer/chrome_content_renderer_client.cc
- +++ b/chrome/renderer/chrome_content_renderer_client.cc
- @@ -1315,6 +1315,24 @@ ChromeContentRendererClient::GetProtocolHandlerSecurityLevel() {
- #endif
- }
-
- +bool ChromeContentRendererClient::ShouldFork(WebLocalFrame* frame,
- + const GURL& url,
- + const std::string& http_method,
- + 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 0b9f4e64d09774b1a249eac0b17a6519effd156c..eb25f5e7b54dddb07fefeaeca5448df2cd41753d 100644
- --- a/chrome/renderer/chrome_content_renderer_client.h
- +++ b/chrome/renderer/chrome_content_renderer_client.h
- @@ -122,6 +122,10 @@ 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_server_redirect) override;
- blink::ProtocolHandlerSecurityLevel GetProtocolHandlerSecurityLevel()
- override;
- void WillSendRequest(blink::WebLocalFrame* frame,
- diff --git a/content/public/renderer/content_renderer_client.cc b/content/public/renderer/content_renderer_client.cc
- index 32dbc4de0813795043e8e33840ff04540329d5e7..5f5593eb266189e06e23109d72adbeb145c23199 100644
- --- a/content/public/renderer/content_renderer_client.cc
- +++ b/content/public/renderer/content_renderer_client.cc
- @@ -112,6 +112,13 @@ bool ContentRendererClient::HandleNavigation(
- }
- #endif
-
- +bool ContentRendererClient::ShouldFork(blink::WebLocalFrame* frame,
- + const GURL& url,
- + const std::string& http_method,
- + 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 d8c7a1954d5acc0eb4bb675795038eae0e16bc05..bfc7b531b3d0958d8638330eb155e85c75ae6f8b 100644
- --- a/content/public/renderer/content_renderer_client.h
- +++ b/content/public/renderer/content_renderer_client.h
- @@ -202,6 +202,12 @@ 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_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.
- diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
- index 768301dae0e1c8ad0bc8e3f1762670fb636c36d4..12c7198e22e07a745949bae3e8a6765899d39875 100644
- --- a/content/renderer/render_frame_impl.cc
- +++ b/content/renderer/render_frame_impl.cc
- @@ -5038,6 +5038,22 @@ 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.
- + should_fork = GetContentClient()->renderer()->ShouldFork(
- + frame_, url, info->url_request.HttpMethod().Utf8(),
- + false /* is_redirect */);
- + }
- +
- if (should_fork) {
- OpenURL(std::move(info));
- return; // Suppress the load here.
|