Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(52)

Unified Diff: content/renderer/render_frame_impl.cc

Issue 2566583002: Change allowed bindings to be per RenderFrame instead of per RenderView. (Closed)
Patch Set: rebase Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/renderer/render_frame_impl.h ('k') | content/renderer/render_process_impl.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/render_frame_impl.cc
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 71213fce8182bc921564fdfe5a70ff0f05004e79..3457a0fe969b0ebd384f2bd29725fd824ca3cdc7 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -140,6 +140,7 @@
#include "content/renderer/stats_collection_controller.h"
#include "content/renderer/web_frame_utils.h"
#include "content/renderer/web_ui_extension.h"
+#include "content/renderer/web_ui_extension_data.h"
#include "crypto/sha2.h"
#include "gin/modules/console.h"
#include "gin/modules/module_registry.h"
@@ -1129,6 +1130,7 @@ RenderFrameImpl::RenderFrameImpl(const CreateParams& params)
engagement_binding_(this),
frame_binding_(this),
host_zoom_binding_(this),
+ frame_bindings_control_binding_(this),
has_accessed_initial_document_(false),
weak_factory_(this) {
// We don't have a service_manager::Connection at this point, so use empty
@@ -1249,8 +1251,6 @@ void RenderFrameImpl::Initialize() {
"parent", parent_id);
}
- MaybeEnableMojoBindings();
-
#if BUILDFLAG(ENABLE_PLUGINS)
new PepperBrowserConnection(this);
#endif
@@ -1282,6 +1282,13 @@ void RenderFrameImpl::Initialize() {
DCHECK(render_view_->HasAddedInputHandler());
input_handler_manager->RegisterRoutingID(GetRoutingID());
}
+
+ const base::CommandLine& command_line =
+ *base::CommandLine::ForCurrentProcess();
+ if (command_line.HasSwitch(switches::kDomAutomationController))
+ enabled_bindings_ |= BINDINGS_POLICY_DOM_AUTOMATION;
+ if (command_line.HasSwitch(switches::kStatsCollectionController))
+ enabled_bindings_ |= BINDINGS_POLICY_STATS_COLLECTION;
}
void RenderFrameImpl::InitializeBlameContext(RenderFrameImpl* parent_frame) {
@@ -1649,6 +1656,11 @@ void RenderFrameImpl::BindFrame(mojom::FrameRequest request,
std::move(pending_remote_interface_provider_request_));
}
+void RenderFrameImpl::BindFrameBindingsControl(
+ mojom::FrameBindingsControlAssociatedRequest request) {
+ frame_bindings_control_binding_.Bind(std::move(request));
+}
+
ManifestManager* RenderFrameImpl::manifest_manager() {
return manifest_manager_;
}
@@ -2707,6 +2719,22 @@ void RenderFrameImpl::GetInterfaceProvider(
browser_info.identity, browser_spec);
}
+void RenderFrameImpl::AllowBindings(int32_t enabled_bindings_flags) {
+ if (IsMainFrame() && (enabled_bindings_flags & BINDINGS_POLICY_WEB_UI) &&
+ !(enabled_bindings_ & BINDINGS_POLICY_WEB_UI)) {
+ // TODO(sammc): Move WebUIExtensionData to be a RenderFrameObserver.
+ // WebUIExtensionData deletes itself when |render_view_| is destroyed.
+ new WebUIExtensionData(render_view_);
+ }
+
+ enabled_bindings_ |= enabled_bindings_flags;
+
+ // Keep track of the total bindings accumulated in this process.
+ RenderProcess::current()->AddBindings(enabled_bindings_flags);
+
+ MaybeEnableMojoBindings();
+}
+
// mojom::HostZoom implementation ----------------------------------------------
void RenderFrameImpl::SetHostZoomLevel(const GURL& url, double zoom_level) {
@@ -3691,15 +3719,13 @@ void RenderFrameImpl::didCreateNewDocument(blink::WebLocalFrame* frame) {
void RenderFrameImpl::didClearWindowObject(blink::WebLocalFrame* frame) {
DCHECK_EQ(frame_, frame);
- int enabled_bindings = render_view_->GetEnabledBindings();
-
- if (enabled_bindings & BINDINGS_POLICY_WEB_UI)
+ if (enabled_bindings_ & BINDINGS_POLICY_WEB_UI)
WebUIExtension::Install(frame);
- if (enabled_bindings & BINDINGS_POLICY_DOM_AUTOMATION)
+ if (enabled_bindings_ & BINDINGS_POLICY_DOM_AUTOMATION)
DomAutomationController::Install(this, frame);
- if (enabled_bindings & BINDINGS_POLICY_STATS_COLLECTION)
+ if (enabled_bindings_ & BINDINGS_POLICY_STATS_COLLECTION)
StatsCollectionController::Install(frame);
const base::CommandLine& command_line =
@@ -6293,7 +6319,6 @@ void RenderFrameImpl::SendUpdateState() {
}
void RenderFrameImpl::MaybeEnableMojoBindings() {
- int enabled_bindings = RenderProcess::current()->GetEnabledBindings();
// BINDINGS_POLICY_WEB_UI, BINDINGS_POLICY_MOJO and BINDINGS_POLICY_HEADLESS
// are mutually exclusive. They provide access to Mojo bindings, but do so in
// incompatible ways.
@@ -6303,22 +6328,23 @@ void RenderFrameImpl::MaybeEnableMojoBindings() {
// Make sure that at most one of BINDINGS_POLICY_WEB_UI, BINDINGS_POLICY_MOJO
// and BINDINGS_POLICY_HEADLESS have been set.
// NOTE x & (x - 1) == 0 is true iff x is zero or a power of two.
- DCHECK_EQ((enabled_bindings & kAllBindingsTypes) &
- ((enabled_bindings & kAllBindingsTypes) - 1),
+ DCHECK_EQ((enabled_bindings_ & kAllBindingsTypes) &
+ ((enabled_bindings_ & kAllBindingsTypes) - 1),
0);
+ DCHECK_EQ(RenderProcess::current()->GetEnabledBindings(), enabled_bindings_);
+
// If an MojoBindingsController already exists for this RenderFrameImpl, avoid
// creating another one. It is not kept as a member, as it deletes itself when
// the frame is destroyed.
if (RenderFrameObserverTracker<MojoBindingsController>::Get(this))
return;
- if (IsMainFrame() &&
- enabled_bindings & BINDINGS_POLICY_WEB_UI) {
+ if (IsMainFrame() && enabled_bindings_ & BINDINGS_POLICY_WEB_UI) {
new MojoBindingsController(this, MojoBindingsType::FOR_WEB_UI);
- } else if (enabled_bindings & BINDINGS_POLICY_MOJO) {
+ } else if (enabled_bindings_ & BINDINGS_POLICY_MOJO) {
new MojoBindingsController(this, MojoBindingsType::FOR_LAYOUT_TESTS);
- } else if (enabled_bindings & BINDINGS_POLICY_HEADLESS) {
+ } else if (enabled_bindings_ & BINDINGS_POLICY_HEADLESS) {
new MojoBindingsController(this, MojoBindingsType::FOR_HEADLESS);
}
}
@@ -6593,6 +6619,9 @@ void RenderFrameImpl::RegisterMojoInterfaces() {
GetAssociatedInterfaceRegistry()->AddInterface(
base::Bind(&RenderFrameImpl::BindEngagement, weak_factory_.GetWeakPtr()));
+ GetAssociatedInterfaceRegistry()->AddInterface(base::Bind(
+ &RenderFrameImpl::BindFrameBindingsControl, weak_factory_.GetWeakPtr()));
+
if (!frame_->parent()) {
// Only main frame have ImageDownloader service.
GetInterfaceRegistry()->AddInterface(base::Bind(
@@ -6666,6 +6695,10 @@ base::SingleThreadTaskRunner* RenderFrameImpl::GetUnthrottledTaskRunner() {
return GetWebFrame()->unthrottledTaskRunner();
}
+int RenderFrameImpl::GetEnabledBindings() const {
+ return enabled_bindings_;
+}
+
blink::WebPlugin* RenderFrameImpl::GetWebPluginForFind() {
if (frame_->document().isPluginDocument())
return frame_->document().to<WebPluginDocument>().plugin();
« no previous file with comments | « content/renderer/render_frame_impl.h ('k') | content/renderer/render_process_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698