Commit 6af4a18e authored by Mugdha Lakhani's avatar Mugdha Lakhani Committed by Commit Bot

[Prerender] Remove ChromeRenderFrame dependency from PrerenderContents.

This splits part of chrome_render_frame.mojom into
render_frame_prerender_messages.mojom

and creates a class PrerenderRenderFrameObserver to handle
the StartPrerendering mojom message.

The motivation is to remove chrome deps from PrerenderContents so it can
be componentized.

Bug: 1096088
Change-Id: I60146c2af867e7b57de392c97e010dc481338d06
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2324842
Commit-Queue: Mugdha Lakhani <nator@chromium.org>
Reviewed-by: default avatarJohn Abd-El-Malek <jam@chromium.org>
Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Cr-Commit-Position: refs/heads/master@{#792651}
parent 6d63b58a
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include "components/history/core/browser/history_types.h" #include "components/history/core/browser/history_types.h"
#include "components/prerender/common/prerender_final_status.h" #include "components/prerender/common/prerender_final_status.h"
#include "components/prerender/common/prerender_util.h" #include "components/prerender/common/prerender_util.h"
#include "components/prerender/common/render_frame_prerender_messages.mojom.h"
#include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "content/public/browser/navigation_handle.h" #include "content/public/browser/navigation_handle.h"
...@@ -434,10 +435,11 @@ void PrerenderContents::RenderFrameCreated( ...@@ -434,10 +435,11 @@ void PrerenderContents::RenderFrameCreated(
// new RenderFrame it's being used for prerendering before any navigations // new RenderFrame it's being used for prerendering before any navigations
// occur. Note that this is always triggered before the first navigation, so // occur. Note that this is always triggered before the first navigation, so
// there's no need to send the message just after the WebContents is created. // there's no need to send the message just after the WebContents is created.
mojo::AssociatedRemote<chrome::mojom::ChromeRenderFrame> chrome_render_frame; mojo::AssociatedRemote<prerender::mojom::PrerenderMessages>
prerender_render_frame;
render_frame_host->GetRemoteAssociatedInterfaces()->GetInterface( render_frame_host->GetRemoteAssociatedInterfaces()->GetInterface(
&chrome_render_frame); &prerender_render_frame);
chrome_render_frame->SetIsPrerendering( prerender_render_frame->SetIsPrerendering(
prerender_mode_, PrerenderHistograms::GetHistogramPrefix(origin_)); prerender_mode_, PrerenderHistograms::GetHistogramPrefix(origin_));
} }
...@@ -635,11 +637,11 @@ void PrerenderContents::PrepareForUse() { ...@@ -635,11 +637,11 @@ void PrerenderContents::PrepareForUse() {
if (prerender_contents_.get()) { if (prerender_contents_.get()) {
auto frames = prerender_contents_->GetAllFrames(); auto frames = prerender_contents_->GetAllFrames();
for (auto* frame : frames) { for (auto* frame : frames) {
mojo::AssociatedRemote<chrome::mojom::ChromeRenderFrame> mojo::AssociatedRemote<prerender::mojom::PrerenderMessages>
chrome_render_frame; prerender_render_frame;
frame->GetRemoteAssociatedInterfaces()->GetInterface( frame->GetRemoteAssociatedInterfaces()->GetInterface(
&chrome_render_frame); &prerender_render_frame);
chrome_render_frame->SetIsPrerendering( prerender_render_frame->SetIsPrerendering(
prerender::mojom::PrerenderMode::kNoPrerender, std::string()); prerender::mojom::PrerenderMode::kNoPrerender, std::string());
} }
} }
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
module chrome.mojom; module chrome.mojom;
import "components/prerender/common/prerender_types.mojom";
import "mojo/public/mojom/base/string16.mojom"; import "mojo/public/mojom/base/string16.mojom";
import "third_party/blink/public/mojom/window_features/window_features.mojom"; import "third_party/blink/public/mojom/window_features/window_features.mojom";
import "ui/gfx/geometry/mojom/geometry.mojom"; import "ui/gfx/geometry/mojom/geometry.mojom";
...@@ -59,10 +58,4 @@ interface ChromeRenderFrame { ...@@ -59,10 +58,4 @@ interface ChromeRenderFrame {
// Requests the Media Feed Url from the renderer (if the page has one). // Requests the Media Feed Url from the renderer (if the page has one).
GetMediaFeedURL() => (url.mojom.Url? url); GetMediaFeedURL() => (url.mojom.Url? url);
// Tells a renderer if it's currently being prerendered. Must only be set
// before any navigation occurs, and only set to kNoPrerender at most once
// after that.
SetIsPrerendering(prerender.mojom.PrerenderMode mode,
string histogram_prefix);
}; };
...@@ -90,6 +90,7 @@ ...@@ -90,6 +90,7 @@
#include "components/prerender/common/prerender_types.mojom.h" #include "components/prerender/common/prerender_types.mojom.h"
#include "components/prerender/common/prerender_url_loader_throttle.h" #include "components/prerender/common/prerender_url_loader_throttle.h"
#include "components/prerender/renderer/prerender_helper.h" #include "components/prerender/renderer/prerender_helper.h"
#include "components/prerender/renderer/prerender_render_frame_observer.h"
#include "components/prerender/renderer/prerenderer_client.h" #include "components/prerender/renderer/prerenderer_client.h"
#include "components/safe_browsing/buildflags.h" #include "components/safe_browsing/buildflags.h"
#include "components/safe_browsing/content/renderer/threat_dom_details.h" #include "components/safe_browsing/content/renderer/threat_dom_details.h"
...@@ -487,6 +488,8 @@ void ChromeContentRendererClient::RenderFrameCreated( ...@@ -487,6 +488,8 @@ void ChromeContentRendererClient::RenderFrameCreated(
new ChromeRenderFrameObserver(render_frame, web_cache_impl_.get()); new ChromeRenderFrameObserver(render_frame, web_cache_impl_.get());
service_manager::BinderRegistry* registry = render_frame_observer->registry(); service_manager::BinderRegistry* registry = render_frame_observer->registry();
new prerender::PrerenderRenderFrameObserver(render_frame);
bool should_whitelist_for_content_settings = bool should_whitelist_for_content_settings =
base::CommandLine::ForCurrentProcess()->HasSwitch( base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kInstantProcess); switches::kInstantProcess);
......
...@@ -28,7 +28,6 @@ ...@@ -28,7 +28,6 @@
#include "components/crash/core/common/crash_key.h" #include "components/crash/core/common/crash_key.h"
#include "components/offline_pages/buildflags/buildflags.h" #include "components/offline_pages/buildflags/buildflags.h"
#include "components/prerender/renderer/prerender_helper.h" #include "components/prerender/renderer/prerender_helper.h"
#include "components/prerender/renderer/prerender_observer_list.h"
#include "components/translate/content/renderer/translate_agent.h" #include "components/translate/content/renderer/translate_agent.h"
#include "components/translate/core/common/translate_util.h" #include "components/translate/core/common/translate_util.h"
#include "components/web_cache/renderer/web_cache_impl.h" #include "components/web_cache/renderer/web_cache_impl.h"
...@@ -286,30 +285,6 @@ void ChromeRenderFrameObserver::OnDestruct() { ...@@ -286,30 +285,6 @@ void ChromeRenderFrameObserver::OnDestruct() {
delete this; delete this;
} }
void ChromeRenderFrameObserver::SetIsPrerendering(
prerender::mojom::PrerenderMode mode,
const std::string& histogram_prefix) {
bool is_prerendering = mode != prerender::mojom::PrerenderMode::kNoPrerender;
if (is_prerendering) {
// If the PrerenderHelper for this frame already exists, don't create it. It
// can already be created for subframes during handling of
// RenderFrameCreated, if the parent frame was prerendering at time of
// subframe creation.
auto* prerender_helper = prerender::PrerenderHelper::Get(render_frame());
if (!prerender_helper) {
// The PrerenderHelper will destroy itself either after recording
// histograms or on destruction of the RenderView.
prerender_helper = new prerender::PrerenderHelper(render_frame(), mode,
histogram_prefix);
}
prerender_helper->SetIsPrerendering(mode, histogram_prefix);
}
prerender::PrerenderObserverList::SetIsPrerenderingForFrame(render_frame(),
is_prerendering);
}
void ChromeRenderFrameObserver::SetWindowFeatures( void ChromeRenderFrameObserver::SetWindowFeatures(
blink::mojom::WindowFeaturesPtr window_features) { blink::mojom::WindowFeaturesPtr window_features) {
render_frame()->GetRenderView()->GetWebView()->SetWindowFeatures( render_frame()->GetRenderView()->GetWebView()->SetWindowFeatures(
......
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
#include "base/timer/timer.h" #include "base/timer/timer.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "chrome/common/chrome_render_frame.mojom.h" #include "chrome/common/chrome_render_frame.mojom.h"
#include "components/prerender/common/prerender_types.mojom.h"
#include "components/safe_browsing/buildflags.h" #include "components/safe_browsing/buildflags.h"
#include "content/public/renderer/render_frame_observer.h" #include "content/public/renderer/render_frame_observer.h"
#include "mojo/public/cpp/bindings/associated_receiver_set.h" #include "mojo/public/cpp/bindings/associated_receiver_set.h"
...@@ -92,8 +91,6 @@ class ChromeRenderFrameObserver : public content::RenderFrameObserver, ...@@ -92,8 +91,6 @@ class ChromeRenderFrameObserver : public content::RenderFrameObserver,
void SetCCTClientHeader(const std::string& header) override; void SetCCTClientHeader(const std::string& header) override;
#endif #endif
void GetMediaFeedURL(GetMediaFeedURLCallback callback) override; void GetMediaFeedURL(GetMediaFeedURLCallback callback) override;
void SetIsPrerendering(prerender::mojom::PrerenderMode mode,
const std::string& histogram_prefix) override;
// Initialize a |phishing_classifier_delegate_|. // Initialize a |phishing_classifier_delegate_|.
void SetClientSidePhishingDetection(); void SetClientSidePhishingDetection();
......
...@@ -31,6 +31,7 @@ mojom("mojo_bindings") { ...@@ -31,6 +31,7 @@ mojom("mojo_bindings") {
sources = [ sources = [
"prerender_canceler.mojom", "prerender_canceler.mojom",
"prerender_types.mojom", "prerender_types.mojom",
"render_frame_prerender_messages.mojom",
] ]
deps = [ "//url/mojom:url_mojom_gurl" ] deps = [ "//url/mojom:url_mojom_gurl" ]
} }
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
module prerender.mojom;
import "components/prerender/common/prerender_types.mojom";
// Prerender messages sent from the browser to the render frame.
interface PrerenderMessages {
// Tells a renderer if it's currently being prerendered. Must only be set
// before any navigation occurs, and only set to kNoPrerender at most once
// after that.
SetIsPrerendering(prerender.mojom.PrerenderMode mode,
string histogram_prefix);
};
...@@ -9,6 +9,8 @@ static_library("renderer") { ...@@ -9,6 +9,8 @@ static_library("renderer") {
"prerender_observer.h", "prerender_observer.h",
"prerender_observer_list.cc", "prerender_observer_list.cc",
"prerender_observer_list.h", "prerender_observer_list.h",
"prerender_render_frame_observer.cc",
"prerender_render_frame_observer.h",
"prerenderer_client.cc", "prerenderer_client.cc",
"prerenderer_client.h", "prerenderer_client.h",
] ]
......
include_rules = [ include_rules = [
"+content/public/renderer", "+content/public/renderer",
"+mojo/public/cpp/bindings",
"+third_party/blink/public", "+third_party/blink/public",
] ]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/prerender/renderer/prerender_render_frame_observer.h"
#include "components/prerender/common/prerender_types.mojom.h"
#include "components/prerender/renderer/prerender_helper.h"
#include "components/prerender/renderer/prerender_observer_list.h"
#include "content/public/renderer/render_frame.h"
#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
namespace prerender {
PrerenderRenderFrameObserver::PrerenderRenderFrameObserver(
content::RenderFrame* render_frame)
: content::RenderFrameObserver(render_frame) {
render_frame->GetAssociatedInterfaceRegistry()->AddInterface(
base::BindRepeating(
&PrerenderRenderFrameObserver::OnRenderFrameObserverRequest,
base::Unretained(this)));
}
PrerenderRenderFrameObserver::~PrerenderRenderFrameObserver() = default;
void PrerenderRenderFrameObserver::OnRenderFrameObserverRequest(
mojo::PendingAssociatedReceiver<prerender::mojom::PrerenderMessages>
receiver) {
receivers_.Add(this, std::move(receiver));
}
void PrerenderRenderFrameObserver::OnDestruct() {
delete this;
}
void PrerenderRenderFrameObserver::SetIsPrerendering(
prerender::mojom::PrerenderMode mode,
const std::string& histogram_prefix) {
bool is_prerendering = mode != prerender::mojom::PrerenderMode::kNoPrerender;
if (is_prerendering) {
// If the PrerenderHelper for this frame already exists, don't create it. It
// can already be created for subframes during handling of
// RenderFrameCreated, if the parent frame was prerendering at time of
// subframe creation.
auto* prerender_helper = prerender::PrerenderHelper::Get(render_frame());
if (!prerender_helper) {
// The PrerenderHelper will destroy itself either after recording
// histograms or on destruction of the RenderView.
prerender_helper = new prerender::PrerenderHelper(render_frame(), mode,
histogram_prefix);
}
prerender_helper->SetIsPrerendering(mode, histogram_prefix);
}
prerender::PrerenderObserverList::SetIsPrerenderingForFrame(render_frame(),
is_prerendering);
}
} // namespace prerender
\ No newline at end of file
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_PRERENDER_RENDERER_PRERENDER_RENDER_FRAME_OBSERVER_H_
#define COMPONENTS_PRERENDER_RENDERER_PRERENDER_RENDER_FRAME_OBSERVER_H_
#include "components/prerender/common/prerender_types.mojom.h"
#include "components/prerender/common/render_frame_prerender_messages.mojom.h"
#include "content/public/renderer/render_frame_observer.h"
#include "mojo/public/cpp/bindings/associated_receiver_set.h"
#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
namespace content {
class RenderFrame;
}
namespace prerender {
class PrerenderRenderFrameObserver
: public content::RenderFrameObserver,
public prerender::mojom::PrerenderMessages {
public:
explicit PrerenderRenderFrameObserver(content::RenderFrame* render_frame);
~PrerenderRenderFrameObserver() override;
// prerender::mojom::PrerenderMessages:
void SetIsPrerendering(prerender::mojom::PrerenderMode mode,
const std::string& histogram_prefix) override;
private:
// RenderFrameObserver implementation.
void OnDestruct() override;
void OnRenderFrameObserverRequest(
mojo::PendingAssociatedReceiver<prerender::mojom::PrerenderMessages>
receiver);
mojo::AssociatedReceiverSet<prerender::mojom::PrerenderMessages> receivers_;
};
} // namespace prerender
#endif // COMPONENTS_PRERENDER_RENDERER_PRERENDER_RENDER_FRAME_OBSERVER_H_
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment