0

Eliminate RenderFrame::GetInterfaceRegistry()'

R=rockot@chromium.org

Change-Id: Ice65be679658f544f46e1906b79642de5f337d67
Reviewed-on: https://chromium-review.googlesource.com/580789
Commit-Queue: Ben Goodger <ben@chromium.org>
Reviewed-by: Ken Rockot <rockot@chromium.org>
Cr-Commit-Position: refs/heads/master@{#489127}
This commit is contained in:
Ben Goodger
2017-07-24 23:11:36 +00:00
committed by Commit Bot
parent 471aa60b45
commit d5ee3cc2bf
25 changed files with 170 additions and 45 deletions

@@ -122,10 +122,10 @@ ChromeRenderFrameObserver::ChromeRenderFrameObserver(
: content::RenderFrameObserver(render_frame), : content::RenderFrameObserver(render_frame),
translate_helper_(nullptr), translate_helper_(nullptr),
phishing_classifier_(nullptr) { phishing_classifier_(nullptr) {
render_frame->GetInterfaceRegistry()->AddInterface( registry_.AddInterface(
base::Bind(&ChromeRenderFrameObserver::OnImageContextMenuRendererRequest, base::Bind(&ChromeRenderFrameObserver::OnImageContextMenuRendererRequest,
base::Unretained(this))); base::Unretained(this)));
render_frame->GetInterfaceRegistry()->AddInterface( registry_.AddInterface(
base::Bind(&ChromeRenderFrameObserver::OnThumbnailCapturerRequest, base::Bind(&ChromeRenderFrameObserver::OnThumbnailCapturerRequest,
base::Unretained(this))); base::Unretained(this)));
@@ -145,6 +145,12 @@ ChromeRenderFrameObserver::ChromeRenderFrameObserver(
ChromeRenderFrameObserver::~ChromeRenderFrameObserver() { ChromeRenderFrameObserver::~ChromeRenderFrameObserver() {
} }
void ChromeRenderFrameObserver::OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) {
registry_.TryBindInterface(interface_name, interface_pipe);
}
bool ChromeRenderFrameObserver::OnMessageReceived(const IPC::Message& message) { bool ChromeRenderFrameObserver::OnMessageReceived(const IPC::Message& message) {
// Filter only. // Filter only.
bool handled = true; bool handled = true;

@@ -12,6 +12,7 @@
#include "chrome/common/thumbnail_capturer.mojom.h" #include "chrome/common/thumbnail_capturer.mojom.h"
#include "content/public/renderer/render_frame_observer.h" #include "content/public/renderer/render_frame_observer.h"
#include "mojo/public/cpp/bindings/binding_set.h" #include "mojo/public/cpp/bindings/binding_set.h"
#include "services/service_manager/public/cpp/binder_registry.h"
namespace gfx { namespace gfx {
class Size; class Size;
@@ -39,6 +40,9 @@ class ChromeRenderFrameObserver
enum TextCaptureType { PRELIMINARY_CAPTURE, FINAL_CAPTURE }; enum TextCaptureType { PRELIMINARY_CAPTURE, FINAL_CAPTURE };
// RenderFrameObserver implementation. // RenderFrameObserver implementation.
void OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) override;
bool OnMessageReceived(const IPC::Message& message) override; bool OnMessageReceived(const IPC::Message& message) override;
void DidStartProvisionalLoad(blink::WebDataSource* data_source) override; void DidStartProvisionalLoad(blink::WebDataSource* data_source) override;
void DidFinishLoad() override; void DidFinishLoad() override;
@@ -93,6 +97,8 @@ class ChromeRenderFrameObserver
mojo::BindingSet<chrome::mojom::ThumbnailCapturer> mojo::BindingSet<chrome::mojom::ThumbnailCapturer>
thumbnail_capturer_bindings_; thumbnail_capturer_bindings_;
service_manager::BinderRegistry registry_;
DISALLOW_COPY_AND_ASSIGN(ChromeRenderFrameObserver); DISALLOW_COPY_AND_ASSIGN(ChromeRenderFrameObserver);
}; };

@@ -106,7 +106,7 @@ ContentSettingsObserver::ContentSettingsObserver(
ClearBlockedContentSettings(); ClearBlockedContentSettings();
render_frame->GetWebFrame()->SetContentSettingsClient(this); render_frame->GetWebFrame()->SetContentSettingsClient(this);
render_frame->GetInterfaceRegistry()->AddInterface( registry_.AddInterface(
base::Bind(&ContentSettingsObserver::OnInsecureContentRendererRequest, base::Bind(&ContentSettingsObserver::OnInsecureContentRendererRequest,
base::Unretained(this))); base::Unretained(this)));
@@ -160,6 +160,12 @@ void ContentSettingsObserver::DidBlockContentType(
} }
} }
void ContentSettingsObserver::OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) {
registry_.TryBindInterface(interface_name, interface_pipe);
}
bool ContentSettingsObserver::OnMessageReceived(const IPC::Message& message) { bool ContentSettingsObserver::OnMessageReceived(const IPC::Message& message) {
bool handled = true; bool handled = true;
IPC_BEGIN_MESSAGE_MAP(ContentSettingsObserver, message) IPC_BEGIN_MESSAGE_MAP(ContentSettingsObserver, message)

@@ -19,6 +19,7 @@
#include "content/public/renderer/render_frame_observer_tracker.h" #include "content/public/renderer/render_frame_observer_tracker.h"
#include "extensions/features/features.h" #include "extensions/features/features.h"
#include "mojo/public/cpp/bindings/binding_set.h" #include "mojo/public/cpp/bindings/binding_set.h"
#include "services/service_manager/public/cpp/binder_registry.h"
#include "third_party/WebKit/public/platform/WebContentSettingsClient.h" #include "third_party/WebKit/public/platform/WebContentSettingsClient.h"
#include "url/gurl.h" #include "url/gurl.h"
@@ -95,6 +96,9 @@ class ContentSettingsObserver
FRIEND_TEST_ALL_PREFIXES(ChromeRenderViewTest, PluginsTemporarilyAllowed); FRIEND_TEST_ALL_PREFIXES(ChromeRenderViewTest, PluginsTemporarilyAllowed);
// RenderFrameObserver implementation. // RenderFrameObserver implementation.
void OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) override;
bool OnMessageReceived(const IPC::Message& message) override; bool OnMessageReceived(const IPC::Message& message) override;
void DidCommitProvisionalLoad(bool is_new_navigation, void DidCommitProvisionalLoad(bool is_new_navigation,
bool is_same_document_navigation) override; bool is_same_document_navigation) override;
@@ -170,6 +174,8 @@ class ContentSettingsObserver
mojo::BindingSet<chrome::mojom::InsecureContentRenderer> mojo::BindingSet<chrome::mojom::InsecureContentRenderer>
insecure_content_renderer_bindings_; insecure_content_renderer_bindings_;
service_manager::BinderRegistry registry_;
DISALLOW_COPY_AND_ASSIGN(ContentSettingsObserver); DISALLOW_COPY_AND_ASSIGN(ContentSettingsObserver);
}; };

@@ -161,8 +161,7 @@ AutofillAgent::AutofillAgent(content::RenderFrame* render_frame,
render_frame->GetWebFrame()->SetAutofillClient(this); render_frame->GetWebFrame()->SetAutofillClient(this);
password_autofill_agent->SetAutofillAgent(this); password_autofill_agent->SetAutofillAgent(this);
// AutofillAgent is guaranteed to outlive |render_frame|. registry_.AddInterface(
render_frame->GetInterfaceRegistry()->AddInterface(
base::Bind(&AutofillAgent::BindRequest, base::Unretained(this))); base::Bind(&AutofillAgent::BindRequest, base::Unretained(this)));
} }
@@ -178,6 +177,12 @@ bool AutofillAgent::FormDataCompare::operator()(const FormData& lhs,
std::tie(rhs.name, rhs.origin, rhs.action, rhs.is_form_tag); std::tie(rhs.name, rhs.origin, rhs.action, rhs.is_form_tag);
} }
void AutofillAgent::OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) {
registry_.TryBindInterface(interface_name, interface_pipe);
}
void AutofillAgent::DidCommitProvisionalLoad(bool is_new_navigation, void AutofillAgent::DidCommitProvisionalLoad(bool is_new_navigation,
bool is_same_document_navigation) { bool is_same_document_navigation) {
blink::WebFrame* frame = render_frame()->GetWebFrame(); blink::WebFrame* frame = render_frame()->GetWebFrame();

@@ -20,6 +20,7 @@
#include "components/autofill/content/renderer/page_click_tracker.h" #include "components/autofill/content/renderer/page_click_tracker.h"
#include "content/public/renderer/render_frame_observer.h" #include "content/public/renderer/render_frame_observer.h"
#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/binding.h"
#include "services/service_manager/public/cpp/binder_registry.h"
#include "third_party/WebKit/public/web/WebAutofillClient.h" #include "third_party/WebKit/public/web/WebAutofillClient.h"
#include "third_party/WebKit/public/web/WebFormControlElement.h" #include "third_party/WebKit/public/web/WebFormControlElement.h"
#include "third_party/WebKit/public/web/WebFormElement.h" #include "third_party/WebKit/public/web/WebFormElement.h"
@@ -131,6 +132,9 @@ class AutofillAgent : public content::RenderFrameObserver,
}; };
// content::RenderFrameObserver: // content::RenderFrameObserver:
void OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) override;
void DidCommitProvisionalLoad(bool is_new_navigation, void DidCommitProvisionalLoad(bool is_new_navigation,
bool is_same_document_navigation) override; bool is_same_document_navigation) override;
void DidFinishDocumentLoad() override; void DidFinishDocumentLoad() override;
@@ -292,6 +296,8 @@ class AutofillAgent : public content::RenderFrameObserver,
mojom::AutofillDriverPtr autofill_driver_; mojom::AutofillDriverPtr autofill_driver_;
service_manager::BinderRegistry registry_;
base::WeakPtrFactory<AutofillAgent> weak_ptr_factory_; base::WeakPtrFactory<AutofillAgent> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(AutofillAgent); DISALLOW_COPY_AND_ASSIGN(AutofillAgent);

@@ -687,8 +687,7 @@ PasswordAutofillAgent::PasswordAutofillAgent(content::RenderFrame* render_frame)
checked_safe_browsing_reputation_(false), checked_safe_browsing_reputation_(false),
binding_(this), binding_(this),
form_element_observer_(nullptr) { form_element_observer_(nullptr) {
// PasswordAutofillAgent is guaranteed to outlive |render_frame|. registry_.AddInterface(
render_frame->GetInterfaceRegistry()->AddInterface(
base::Bind(&PasswordAutofillAgent::BindRequest, base::Unretained(this))); base::Bind(&PasswordAutofillAgent::BindRequest, base::Unretained(this)));
} }
@@ -1282,6 +1281,12 @@ void PasswordAutofillAgent::SendPasswordForms(bool only_visible) {
} }
} }
void PasswordAutofillAgent::OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) {
registry_.TryBindInterface(interface_name, interface_pipe);
}
void PasswordAutofillAgent::DidFinishDocumentLoad() { void PasswordAutofillAgent::DidFinishDocumentLoad() {
// The |frame| contents have been parsed, but not yet rendered. Let the // The |frame| contents have been parsed, but not yet rendered. Let the
// PasswordManager know that forms are loaded, even though we can't yet tell // PasswordManager know that forms are loaded, even though we can't yet tell

@@ -22,6 +22,7 @@
#include "content/public/renderer/render_frame_observer.h" #include "content/public/renderer/render_frame_observer.h"
#include "content/public/renderer/render_view_observer.h" #include "content/public/renderer/render_view_observer.h"
#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/binding.h"
#include "services/service_manager/public/cpp/binder_registry.h"
#include "third_party/WebKit/public/web/WebInputElement.h" #include "third_party/WebKit/public/web/WebInputElement.h"
namespace blink { namespace blink {
@@ -201,6 +202,9 @@ class PasswordAutofillAgent : public content::RenderFrameObserver,
}; };
// RenderFrameObserver: // RenderFrameObserver:
void OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) override;
void DidFinishDocumentLoad() override; void DidFinishDocumentLoad() override;
void DidFinishLoad() override; void DidFinishLoad() override;
void FrameDetached() override; void FrameDetached() override;
@@ -312,6 +316,8 @@ class PasswordAutofillAgent : public content::RenderFrameObserver,
blink::WebFormElementObserver* form_element_observer_; blink::WebFormElementObserver* form_element_observer_;
service_manager::BinderRegistry registry_;
DISALLOW_COPY_AND_ASSIGN(PasswordAutofillAgent); DISALLOW_COPY_AND_ASSIGN(PasswordAutofillAgent);
}; };

@@ -167,9 +167,8 @@ PasswordGenerationAgent::PasswordGenerationAgent(
password_agent_(password_agent), password_agent_(password_agent),
binding_(this) { binding_(this) {
LogBoolean(Logger::STRING_GENERATION_RENDERER_ENABLED, enabled_); LogBoolean(Logger::STRING_GENERATION_RENDERER_ENABLED, enabled_);
// PasswordGenerationAgent is guaranteed to outlive |render_frame|. registry_.AddInterface(base::Bind(&PasswordGenerationAgent::BindRequest,
render_frame->GetInterfaceRegistry()->AddInterface(base::Bind( base::Unretained(this)));
&PasswordGenerationAgent::BindRequest, base::Unretained(this)));
} }
PasswordGenerationAgent::~PasswordGenerationAgent() {} PasswordGenerationAgent::~PasswordGenerationAgent() {}
@@ -178,6 +177,12 @@ void PasswordGenerationAgent::BindRequest(
binding_.Bind(std::move(request)); binding_.Bind(std::move(request));
} }
void PasswordGenerationAgent::OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) {
registry_.TryBindInterface(interface_name, interface_pipe);
}
void PasswordGenerationAgent::DidFinishDocumentLoad() { void PasswordGenerationAgent::DidFinishDocumentLoad() {
// Update stats for main frame navigation. // Update stats for main frame navigation.
if (!render_frame()->GetWebFrame()->Parent()) { if (!render_frame()->GetWebFrame()->Parent()) {

@@ -19,6 +19,7 @@
#include "components/autofill/content/renderer/renderer_save_password_progress_logger.h" #include "components/autofill/content/renderer/renderer_save_password_progress_logger.h"
#include "content/public/renderer/render_frame_observer.h" #include "content/public/renderer/render_frame_observer.h"
#include "mojo/public/cpp/bindings/binding.h" #include "mojo/public/cpp/bindings/binding.h"
#include "services/service_manager/public/cpp/binder_registry.h"
#include "third_party/WebKit/public/web/WebInputElement.h" #include "third_party/WebKit/public/web/WebInputElement.h"
#include "url/gurl.h" #include "url/gurl.h"
@@ -87,6 +88,9 @@ class PasswordGenerationAgent : public content::RenderFrameObserver,
typedef std::vector<AccountCreationFormData> AccountCreationFormDataList; typedef std::vector<AccountCreationFormData> AccountCreationFormDataList;
// RenderFrameObserver: // RenderFrameObserver:
void OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) override;
void DidFinishDocumentLoad() override; void DidFinishDocumentLoad() override;
void DidFinishLoad() override; void DidFinishLoad() override;
void OnDestruct() override; void OnDestruct() override;
@@ -193,6 +197,8 @@ class PasswordGenerationAgent : public content::RenderFrameObserver,
mojo::Binding<mojom::PasswordGenerationAgent> binding_; mojo::Binding<mojom::PasswordGenerationAgent> binding_;
service_manager::BinderRegistry registry_;
DISALLOW_COPY_AND_ASSIGN(PasswordGenerationAgent); DISALLOW_COPY_AND_ASSIGN(PasswordGenerationAgent);
}; };

@@ -25,13 +25,19 @@ OverlayJsRenderFrameObserver::OverlayJsRenderFrameObserver(
OverlayJsRenderFrameObserver::~OverlayJsRenderFrameObserver() {} OverlayJsRenderFrameObserver::~OverlayJsRenderFrameObserver() {}
void OverlayJsRenderFrameObserver::OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) {
registry_.TryBindInterface(interface_name, interface_pipe);
}
void OverlayJsRenderFrameObserver::DidStartProvisionalLoad( void OverlayJsRenderFrameObserver::DidStartProvisionalLoad(
blink::WebDataSource* data_source) { blink::WebDataSource* data_source) {
RegisterMojoInterface(); RegisterMojoInterface();
} }
void OverlayJsRenderFrameObserver::RegisterMojoInterface() { void OverlayJsRenderFrameObserver::RegisterMojoInterface() {
render_frame()->GetInterfaceRegistry()->AddInterface(base::Bind( registry_.AddInterface(base::Bind(
&OverlayJsRenderFrameObserver::CreateOverlayPageNotifierService, &OverlayJsRenderFrameObserver::CreateOverlayPageNotifierService,
weak_factory_.GetWeakPtr())); weak_factory_.GetWeakPtr()));
} }
@@ -62,11 +68,7 @@ void OverlayJsRenderFrameObserver::DidFinishLoad() {
} }
void OverlayJsRenderFrameObserver::DestroyOverlayPageNotifierService() { void OverlayJsRenderFrameObserver::DestroyOverlayPageNotifierService() {
if (render_frame()) { registry_.RemoveInterface<mojom::OverlayPageNotifierService>();
render_frame()
->GetInterfaceRegistry()
->RemoveInterface<mojom::OverlayPageNotifierService>();
}
} }
void OverlayJsRenderFrameObserver::OnDestruct() { void OverlayJsRenderFrameObserver::OnDestruct() {

@@ -10,6 +10,7 @@
#include "components/contextual_search/common/overlay_page_notifier_service.mojom.h" #include "components/contextual_search/common/overlay_page_notifier_service.mojom.h"
#include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_frame.h"
#include "content/public/renderer/render_frame_observer.h" #include "content/public/renderer/render_frame_observer.h"
#include "services/service_manager/public/cpp/binder_registry.h"
#include "third_party/WebKit/public/web/WebLocalFrame.h" #include "third_party/WebKit/public/web/WebLocalFrame.h"
#include "v8/include/v8.h" #include "v8/include/v8.h"
@@ -25,6 +26,9 @@ class OverlayJsRenderFrameObserver : public content::RenderFrameObserver {
~OverlayJsRenderFrameObserver() override; ~OverlayJsRenderFrameObserver() override;
// RenderFrameObserver implementation. // RenderFrameObserver implementation.
void OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) override;
void DidStartProvisionalLoad(blink::WebDataSource* data_source) override; void DidStartProvisionalLoad(blink::WebDataSource* data_source) override;
void DidClearWindowObject() override; void DidClearWindowObject() override;
void DidFinishLoad() override; void DidFinishLoad() override;
@@ -49,6 +53,8 @@ class OverlayJsRenderFrameObserver : public content::RenderFrameObserver {
// Track if the current page is presented in the contextual search overlay. // Track if the current page is presented in the contextual search overlay.
bool is_contextual_search_overlay_; bool is_contextual_search_overlay_;
service_manager::BinderRegistry registry_;
base::WeakPtrFactory<OverlayJsRenderFrameObserver> weak_factory_; base::WeakPtrFactory<OverlayJsRenderFrameObserver> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(OverlayJsRenderFrameObserver); DISALLOW_COPY_AND_ASSIGN(OverlayJsRenderFrameObserver);

@@ -27,6 +27,12 @@ DistillerJsRenderFrameObserver::DistillerJsRenderFrameObserver(
DistillerJsRenderFrameObserver::~DistillerJsRenderFrameObserver() {} DistillerJsRenderFrameObserver::~DistillerJsRenderFrameObserver() {}
void DistillerJsRenderFrameObserver::OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) {
registry_.TryBindInterface(interface_name, interface_pipe);
}
void DistillerJsRenderFrameObserver::DidStartProvisionalLoad( void DistillerJsRenderFrameObserver::DidStartProvisionalLoad(
blink::WebDataSource* data_source) { blink::WebDataSource* data_source) {
RegisterMojoInterface(); RegisterMojoInterface();
@@ -36,9 +42,7 @@ void DistillerJsRenderFrameObserver::DidFinishLoad() {
// If no message about the distilled page was received at this point, there // If no message about the distilled page was received at this point, there
// will not be one; remove the mojom::DistillerPageNotifierService from the // will not be one; remove the mojom::DistillerPageNotifierService from the
// registry. // registry.
render_frame() registry_.RemoveInterface<mojom::DistillerPageNotifierService>();
->GetInterfaceRegistry()
->RemoveInterface<mojom::DistillerPageNotifierService>();
} }
void DistillerJsRenderFrameObserver::DidCreateScriptContext( void DistillerJsRenderFrameObserver::DidCreateScriptContext(
@@ -54,7 +58,7 @@ void DistillerJsRenderFrameObserver::DidCreateScriptContext(
} }
void DistillerJsRenderFrameObserver::RegisterMojoInterface() { void DistillerJsRenderFrameObserver::RegisterMojoInterface() {
render_frame()->GetInterfaceRegistry()->AddInterface(base::Bind( registry_.AddInterface(base::Bind(
&DistillerJsRenderFrameObserver::CreateDistillerPageNotifierService, &DistillerJsRenderFrameObserver::CreateDistillerPageNotifierService,
weak_factory_.GetWeakPtr())); weak_factory_.GetWeakPtr()));
} }

@@ -11,6 +11,7 @@
#include "components/dom_distiller/content/renderer/distiller_page_notifier_service_impl.h" #include "components/dom_distiller/content/renderer/distiller_page_notifier_service_impl.h"
#include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_frame.h"
#include "content/public/renderer/render_frame_observer.h" #include "content/public/renderer/render_frame_observer.h"
#include "services/service_manager/public/cpp/binder_registry.h"
#include "third_party/WebKit/public/web/WebLocalFrame.h" #include "third_party/WebKit/public/web/WebLocalFrame.h"
#include "v8/include/v8.h" #include "v8/include/v8.h"
@@ -27,6 +28,9 @@ class DistillerJsRenderFrameObserver : public content::RenderFrameObserver {
~DistillerJsRenderFrameObserver() override; ~DistillerJsRenderFrameObserver() override;
// RenderFrameObserver implementation. // RenderFrameObserver implementation.
void OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) override;
void DidStartProvisionalLoad(blink::WebDataSource* data_source) override; void DidStartProvisionalLoad(blink::WebDataSource* data_source) override;
void DidFinishLoad() override; void DidFinishLoad() override;
void DidCreateScriptContext(v8::Local<v8::Context> context, void DidCreateScriptContext(v8::Local<v8::Context> context,
@@ -51,6 +55,8 @@ class DistillerJsRenderFrameObserver : public content::RenderFrameObserver {
// Track if the current page is distilled. This is needed for testing. // Track if the current page is distilled. This is needed for testing.
bool is_distiller_page_; bool is_distiller_page_;
service_manager::BinderRegistry registry_;
// Handle to "distiller" JavaScript object functionality. // Handle to "distiller" JavaScript object functionality.
std::unique_ptr<DistillerNativeJavaScript> native_javascript_handle_; std::unique_ptr<DistillerNativeJavaScript> native_javascript_handle_;
base::WeakPtrFactory<DistillerJsRenderFrameObserver> weak_factory_; base::WeakPtrFactory<DistillerJsRenderFrameObserver> weak_factory_;

@@ -29,13 +29,19 @@ SpellCheckPanel::SpellCheckPanel(content::RenderFrame* render_frame)
: content::RenderFrameObserver(render_frame), : content::RenderFrameObserver(render_frame),
spelling_panel_visible_(false) { spelling_panel_visible_(false) {
DCHECK(render_frame); DCHECK(render_frame);
render_frame->GetInterfaceRegistry()->AddInterface(base::Bind( registry_.AddInterface(base::Bind(&SpellCheckPanel::SpellCheckPanelRequest,
&SpellCheckPanel::SpellCheckPanelRequest, base::Unretained(this))); base::Unretained(this)));
render_frame->GetWebFrame()->SetSpellCheckPanelHostClient(this); render_frame->GetWebFrame()->SetSpellCheckPanelHostClient(this);
} }
SpellCheckPanel::~SpellCheckPanel() = default; SpellCheckPanel::~SpellCheckPanel() = default;
void SpellCheckPanel::OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) {
registry_.TryBindInterface(interface_name, interface_pipe);
}
void SpellCheckPanel::OnDestruct() { void SpellCheckPanel::OnDestruct() {
delete this; delete this;
} }

@@ -10,6 +10,7 @@
#include "components/spellcheck/spellcheck_build_features.h" #include "components/spellcheck/spellcheck_build_features.h"
#include "content/public/renderer/render_frame_observer.h" #include "content/public/renderer/render_frame_observer.h"
#include "mojo/public/cpp/bindings/binding_set.h" #include "mojo/public/cpp/bindings/binding_set.h"
#include "services/service_manager/public/cpp/binder_registry.h"
#include "third_party/WebKit/public/platform/WebSpellCheckPanelHostClient.h" #include "third_party/WebKit/public/platform/WebSpellCheckPanelHostClient.h"
#if !BUILDFLAG(HAS_SPELLCHECK_PANEL) #if !BUILDFLAG(HAS_SPELLCHECK_PANEL)
@@ -25,6 +26,9 @@ class SpellCheckPanel : public content::RenderFrameObserver,
private: private:
// content::RenderFrameObserver: // content::RenderFrameObserver:
void OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) override;
void OnDestruct() override; void OnDestruct() override;
// blink::WebSpellCheckPanelHostClient: // blink::WebSpellCheckPanelHostClient:
@@ -47,6 +51,8 @@ class SpellCheckPanel : public content::RenderFrameObserver,
// True if the browser is showing the spelling panel. // True if the browser is showing the spelling panel.
bool spelling_panel_visible_; bool spelling_panel_visible_;
service_manager::BinderRegistry registry_;
DISALLOW_COPY_AND_ASSIGN(SpellCheckPanel); DISALLOW_COPY_AND_ASSIGN(SpellCheckPanel);
}; };

@@ -163,9 +163,11 @@ class CONTENT_EXPORT RenderFrame : public IPC::Listener,
// Return true if this frame is hidden. // Return true if this frame is hidden.
virtual bool IsHidden() = 0; virtual bool IsHidden() = 0;
// Returns the BinderRegistry that this process uses to expose interfaces // Ask the RenderFrame (or its observers) to bind a request for
// to the application running in this frame. // |interface_name| to |interface_pipe|.
virtual service_manager::BinderRegistry* GetInterfaceRegistry() = 0; virtual void BindLocalInterface(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle interface_pipe) = 0;
// Returns the InterfaceProvider that this process can use to bind // Returns the InterfaceProvider that this process can use to bind
// interfaces exposed to it by the application running in this frame. // interfaces exposed to it by the application running in this frame.

@@ -13,6 +13,7 @@
#include "content/common/content_export.h" #include "content/common/content_export.h"
#include "ipc/ipc_listener.h" #include "ipc/ipc_listener.h"
#include "ipc/ipc_sender.h" #include "ipc/ipc_sender.h"
#include "mojo/public/cpp/system/message_pipe.h"
#include "third_party/WebKit/public/platform/WebLoadingBehaviorFlag.h" #include "third_party/WebKit/public/platform/WebLoadingBehaviorFlag.h"
#include "third_party/WebKit/public/platform/WebVector.h" #include "third_party/WebKit/public/platform/WebVector.h"
#include "third_party/WebKit/public/web/WebMeaningfulLayout.h" #include "third_party/WebKit/public/web/WebMeaningfulLayout.h"
@@ -131,6 +132,12 @@ class CONTENT_EXPORT RenderFrameObserver : public IPC::Listener,
// Called when a worker fetch context will be created. // Called when a worker fetch context will be created.
virtual void WillCreateWorkerFetchContext(blink::WebWorkerFetchContext*) {} virtual void WillCreateWorkerFetchContext(blink::WebWorkerFetchContext*) {}
// Called to give the embedder an opportunity to bind an interface request
// for a frame. If the request can be bound, |interface_pipe| will be taken.
virtual void OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) {}
// IPC::Listener implementation. // IPC::Listener implementation.
bool OnMessageReceived(const IPC::Message& message) override; bool OnMessageReceived(const IPC::Message& message) override;

@@ -1201,13 +1201,12 @@ RenderFrameImpl::RenderFrameImpl(const CreateParams& params)
base::Bind(&RenderFrameImpl::RequestOverlayRoutingToken, base::Bind(&RenderFrameImpl::RequestOverlayRoutingToken,
base::Unretained(this))), base::Unretained(this))),
weak_factory_(this) { weak_factory_(this) {
interface_registry_ = base::MakeUnique<service_manager::BinderRegistry>();
service_manager::mojom::InterfaceProviderPtr remote_interfaces; service_manager::mojom::InterfaceProviderPtr remote_interfaces;
pending_remote_interface_provider_request_ = MakeRequest(&remote_interfaces); pending_remote_interface_provider_request_ = MakeRequest(&remote_interfaces);
remote_interfaces_.reset(new service_manager::InterfaceProvider); remote_interfaces_.reset(new service_manager::InterfaceProvider);
remote_interfaces_->Bind(std::move(remote_interfaces)); remote_interfaces_->Bind(std::move(remote_interfaces));
blink_interface_registry_.reset( blink_interface_registry_.reset(
new BlinkInterfaceRegistryImpl(interface_registry_->GetWeakPtr())); new BlinkInterfaceRegistryImpl(registry_.GetWeakPtr()));
// Must call after binding our own remote interfaces. // Must call after binding our own remote interfaces.
media_factory_.SetupMojo(); media_factory_.SetupMojo();
@@ -1353,8 +1352,14 @@ void RenderFrameImpl::InitializeBlameContext(RenderFrameImpl* parent_frame) {
void RenderFrameImpl::GetInterface( void RenderFrameImpl::GetInterface(
const std::string& interface_name, const std::string& interface_name,
mojo::ScopedMessagePipeHandle interface_pipe) { mojo::ScopedMessagePipeHandle interface_pipe) {
// TODO(beng): We should be getting this info from the frame factory request. if (registry_.TryBindInterface(interface_name, &interface_pipe))
interface_registry_->BindInterface(interface_name, std::move(interface_pipe)); return;
for (auto& observer : observers_) {
observer.OnInterfaceRequestForFrame(interface_name, &interface_pipe);
if (!interface_pipe.is_valid())
return;
}
} }
RenderWidget* RenderFrameImpl::GetRenderWidget() { RenderWidget* RenderFrameImpl::GetRenderWidget() {
@@ -2652,8 +2657,10 @@ void RenderFrameImpl::ExecuteJavaScript(const base::string16& javascript) {
OnJavaScriptExecuteRequest(javascript, 0, false); OnJavaScriptExecuteRequest(javascript, 0, false);
} }
service_manager::BinderRegistry* RenderFrameImpl::GetInterfaceRegistry() { void RenderFrameImpl::BindLocalInterface(
return interface_registry_.get(); const std::string& interface_name,
mojo::ScopedMessagePipeHandle interface_pipe) {
GetInterface(interface_name, std::move(interface_pipe));
} }
service_manager::InterfaceProvider* RenderFrameImpl::GetRemoteInterfaces() { service_manager::InterfaceProvider* RenderFrameImpl::GetRemoteInterfaces() {
@@ -6289,7 +6296,7 @@ void RenderFrameImpl::InitializeUserMediaClient() {
this, RenderThreadImpl::current()->GetPeerConnectionDependencyFactory(), this, RenderThreadImpl::current()->GetPeerConnectionDependencyFactory(),
base::MakeUnique<MediaStreamDispatcher>(this), base::MakeUnique<MediaStreamDispatcher>(this),
render_thread->GetWorkerTaskRunner()); render_thread->GetWorkerTaskRunner());
GetInterfaceRegistry()->AddInterface( registry_.AddInterface(
base::Bind(&MediaDevicesListenerImpl::Create, GetRoutingID())); base::Bind(&MediaDevicesListenerImpl::Create, GetRoutingID()));
#endif #endif
} }
@@ -6682,13 +6689,13 @@ void RenderFrameImpl::RegisterMojoInterfaces() {
GetAssociatedInterfaceRegistry()->AddInterface(base::Bind( GetAssociatedInterfaceRegistry()->AddInterface(base::Bind(
&RenderFrameImpl::BindFrameBindingsControl, weak_factory_.GetWeakPtr())); &RenderFrameImpl::BindFrameBindingsControl, weak_factory_.GetWeakPtr()));
GetInterfaceRegistry()->AddInterface(base::Bind( registry_.AddInterface(base::Bind(&FrameInputHandlerImpl::CreateMojoService,
&FrameInputHandlerImpl::CreateMojoService, weak_factory_.GetWeakPtr())); weak_factory_.GetWeakPtr()));
if (!frame_->Parent()) { if (!frame_->Parent()) {
// Only main frame have ImageDownloader service. // Only main frame have ImageDownloader service.
GetInterfaceRegistry()->AddInterface(base::Bind( registry_.AddInterface(base::Bind(&ImageDownloaderImpl::CreateMojoService,
&ImageDownloaderImpl::CreateMojoService, base::Unretained(this))); base::Unretained(this)));
// Host zoom is per-page, so only added on the main frame. // Host zoom is per-page, so only added on the main frame.
GetAssociatedInterfaceRegistry()->AddInterface(base::Bind( GetAssociatedInterfaceRegistry()->AddInterface(base::Bind(

@@ -432,7 +432,9 @@ class CONTENT_EXPORT RenderFrameImpl
void ExecuteJavaScript(const base::string16& javascript) override; void ExecuteJavaScript(const base::string16& javascript) override;
bool IsMainFrame() override; bool IsMainFrame() override;
bool IsHidden() override; bool IsHidden() override;
service_manager::BinderRegistry* GetInterfaceRegistry() override; void BindLocalInterface(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle interface_pipe) override;
service_manager::InterfaceProvider* GetRemoteInterfaces() override; service_manager::InterfaceProvider* GetRemoteInterfaces() override;
AssociatedInterfaceRegistry* GetAssociatedInterfaceRegistry() override; AssociatedInterfaceRegistry* GetAssociatedInterfaceRegistry() override;
AssociatedInterfaceProvider* GetRemoteAssociatedInterfaces() override; AssociatedInterfaceProvider* GetRemoteAssociatedInterfaces() override;
@@ -1309,7 +1311,7 @@ class CONTENT_EXPORT RenderFrameImpl
// The PushMessagingClient attached to this frame, lazily initialized. // The PushMessagingClient attached to this frame, lazily initialized.
PushMessagingClient* push_messaging_client_; PushMessagingClient* push_messaging_client_;
std::unique_ptr<service_manager::BinderRegistry> interface_registry_; service_manager::BinderRegistry registry_;
std::unique_ptr<service_manager::InterfaceProvider> remote_interfaces_; std::unique_ptr<service_manager::InterfaceProvider> remote_interfaces_;
std::unique_ptr<BlinkInterfaceRegistryImpl> blink_interface_registry_; std::unique_ptr<BlinkInterfaceRegistryImpl> blink_interface_registry_;
service_manager::mojom::InterfaceProviderRequest service_manager::mojom::InterfaceProviderRequest

@@ -700,13 +700,10 @@ void BlinkTestRunner::DispatchBeforeInstallPromptEvent(
const std::vector<std::string>& event_platforms, const std::vector<std::string>& event_platforms,
const base::Callback<void(bool)>& callback) { const base::Callback<void(bool)>& callback) {
app_banner_service_.reset(new test_runner::AppBannerService()); app_banner_service_.reset(new test_runner::AppBannerService());
service_manager::BinderRegistry* registry =
render_view()->GetMainRenderFrame()->GetInterfaceRegistry();
blink::mojom::AppBannerControllerRequest request = blink::mojom::AppBannerControllerRequest request =
mojo::MakeRequest(&app_banner_service_->controller()); mojo::MakeRequest(&app_banner_service_->controller());
registry->BindInterface(blink::mojom::AppBannerController::Name_, render_view()->GetMainRenderFrame()->BindLocalInterface(
request.PassMessagePipe()); blink::mojom::AppBannerController::Name_, request.PassMessagePipe());
app_banner_service_->SendBannerPromptRequest(event_platforms, callback); app_banner_service_->SendBannerPromptRequest(event_platforms, callback);
} }

@@ -81,7 +81,7 @@ ExtensionsRenderFrameObserver::ExtensionsRenderFrameObserver(
content::RenderFrame* render_frame) content::RenderFrame* render_frame)
: content::RenderFrameObserver(render_frame), : content::RenderFrameObserver(render_frame),
webview_visually_deemphasized_(false) { webview_visually_deemphasized_(false) {
render_frame->GetInterfaceRegistry()->AddInterface( registry_.AddInterface(
base::Bind(&ExtensionsRenderFrameObserver::BindAppWindowRequest, base::Bind(&ExtensionsRenderFrameObserver::BindAppWindowRequest,
base::Unretained(this))); base::Unretained(this)));
} }
@@ -105,6 +105,12 @@ void ExtensionsRenderFrameObserver::SetVisuallyDeemphasized(bool deemphasized) {
render_frame()->GetRenderView()->GetWebView()->SetPageOverlayColor(color); render_frame()->GetRenderView()->GetWebView()->SetPageOverlayColor(color);
} }
void ExtensionsRenderFrameObserver::OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) {
registry_.TryBindInterface(interface_name, interface_pipe);
}
void ExtensionsRenderFrameObserver::DetailedConsoleMessageAdded( void ExtensionsRenderFrameObserver::DetailedConsoleMessageAdded(
const base::string16& message, const base::string16& message,
const base::string16& source, const base::string16& source,

@@ -11,6 +11,7 @@
#include "content/public/renderer/render_frame_observer.h" #include "content/public/renderer/render_frame_observer.h"
#include "extensions/common/mojo/app_window.mojom.h" #include "extensions/common/mojo/app_window.mojom.h"
#include "mojo/public/cpp/bindings/binding_set.h" #include "mojo/public/cpp/bindings/binding_set.h"
#include "services/service_manager/public/cpp/binder_registry.h"
namespace extensions { namespace extensions {
@@ -31,6 +32,9 @@ class ExtensionsRenderFrameObserver : public content::RenderFrameObserver,
void SetVisuallyDeemphasized(bool deemphasized) override; void SetVisuallyDeemphasized(bool deemphasized) override;
// RenderFrameObserver implementation. // RenderFrameObserver implementation.
void OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) override;
void DetailedConsoleMessageAdded(const base::string16& message, void DetailedConsoleMessageAdded(const base::string16& message,
const base::string16& source, const base::string16& source,
const base::string16& stack_trace, const base::string16& stack_trace,
@@ -43,6 +47,8 @@ class ExtensionsRenderFrameObserver : public content::RenderFrameObserver,
mojo::BindingSet<mojom::AppWindow> bindings_; mojo::BindingSet<mojom::AppWindow> bindings_;
service_manager::BinderRegistry registry_;
DISALLOW_COPY_AND_ASSIGN(ExtensionsRenderFrameObserver); DISALLOW_COPY_AND_ASSIGN(ExtensionsRenderFrameObserver);
}; };

@@ -16,7 +16,7 @@ HeadlessRenderFrameControllerImpl::HeadlessRenderFrameControllerImpl(
: content::RenderFrameObserver(render_frame), : content::RenderFrameObserver(render_frame),
render_frame_(render_frame), render_frame_(render_frame),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
render_frame->GetInterfaceRegistry()->AddInterface(base::Bind( registry_.AddInterface(base::Bind(
&HeadlessRenderFrameControllerImpl::OnRenderFrameControllerRequest, &HeadlessRenderFrameControllerImpl::OnRenderFrameControllerRequest,
base::Unretained(this))); base::Unretained(this)));
} }
@@ -68,6 +68,12 @@ void HeadlessRenderFrameControllerImpl::SendMessageToTabSocket(
find_it->second.OnMessageFromEmbedder(message); find_it->second.OnMessageFromEmbedder(message);
} }
void HeadlessRenderFrameControllerImpl::OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) {
registry_.TryBindInterface(interface_name, interface_pipe);
}
void HeadlessRenderFrameControllerImpl::DidCreateScriptContext( void HeadlessRenderFrameControllerImpl::DidCreateScriptContext(
v8::Local<v8::Context> context, v8::Local<v8::Context> context,
int world_id) { int world_id) {

@@ -11,6 +11,7 @@
#include "headless/lib/renderer/headless_tab_socket_bindings.h" #include "headless/lib/renderer/headless_tab_socket_bindings.h"
#include "headless/lib/tab_socket.mojom.h" #include "headless/lib/tab_socket.mojom.h"
#include "mojo/public/cpp/bindings/binding_set.h" #include "mojo/public/cpp/bindings/binding_set.h"
#include "services/service_manager/public/cpp/binder_registry.h"
namespace headless { namespace headless {
@@ -33,6 +34,9 @@ class HeadlessRenderFrameControllerImpl : public HeadlessRenderFrameController,
int32_t world_id) override; int32_t world_id) override;
// content::RenderFrameObserver implementation: // content::RenderFrameObserver implementation:
void OnInterfaceRequestForFrame(
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) override;
void DidCreateScriptContext(v8::Local<v8::Context> context, void DidCreateScriptContext(v8::Local<v8::Context> context,
int world_id) override; int world_id) override;
@@ -51,6 +55,7 @@ class HeadlessRenderFrameControllerImpl : public HeadlessRenderFrameController,
headless::TabSocketPtr tab_socket_ptr_; headless::TabSocketPtr tab_socket_ptr_;
InstallMainWorldTabSocketCallback InstallMainWorldTabSocketCallback
pending_install_main_world_tab_socket_callback_; pending_install_main_world_tab_socket_callback_;
service_manager::BinderRegistry registry_;
base::WeakPtrFactory<HeadlessRenderFrameControllerImpl> weak_ptr_factory_; base::WeakPtrFactory<HeadlessRenderFrameControllerImpl> weak_ptr_factory_;
}; };