123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- 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 79d62d4dd739fbe51fedaf1b38e83669d625d7fc..f728b88778b7c9137833fece9615856a60fb399c 100644
- --- a/chrome/renderer/chrome_content_renderer_client.cc
- +++ b/chrome/renderer/chrome_content_renderer_client.cc
- @@ -1296,6 +1296,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 416b7a8f3ba1b6941761c1df4ea108219c415489..2733d0dbbc10c5465a319b080d9b079258ba896d 100644
- --- a/chrome/renderer/chrome_content_renderer_client.h
- +++ b/chrome/renderer/chrome_content_renderer_client.h
- @@ -127,6 +127,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 ea6d8e6357233f519c3cf41a96d8453993a9ce71..c513aff3e1c3da45e45954bc0beb80469de6a450 100644
- --- a/content/public/renderer/content_renderer_client.cc
- +++ b/content/public/renderer/content_renderer_client.cc
- @@ -114,6 +114,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 9d321040de33acac09e83cc582f685740f425009..8f328979cc232c4f81a7f040e2424273a8248015 100644
- --- a/content/public/renderer/content_renderer_client.h
- +++ b/content/public/renderer/content_renderer_client.h
- @@ -228,6 +228,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 a5a95523e16fd35018f9646ae4a4d51e5ca626c0..4133bb215a66be974e5dfc0f3e0c89614bb58523 100644
- --- a/content/renderer/render_frame_impl.cc
- +++ b/content/renderer/render_frame_impl.cc
- @@ -5478,6 +5478,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.
|