From 8b88e5718f7c5fcfef7829944761d17029ba41ef Mon Sep 17 00:00:00 2001 From: Oksana Zhuravlova Date: Mon, 7 Jan 2019 21:54:00 +0000 Subject: [PATCH] Add DocumentInterfaceBroker mojom interface This change adds a new mojom interface DocumentInterfaceBroker and its implementation in RenderFrameHostImpl. RenderFrameImpl and LocalFrameClientImpl now store content and blink versions of pointers to this new interface and add methods that make it available to other classes. Bug: 718652 Change-Id: Iad2030a51e7ee2ca6443723f3758d9e53d1f9e9a Reviewed-on: https://chromium-review.googlesource.com/c/1285324 Commit-Queue: Oksana Zhuravlova Reviewed-by: Tommy Li Reviewed-by: Dmitry Gozman Reviewed-by: Chrome Cunningham Reviewed-by: Rebekah Potter Reviewed-by: Daniel Cheng Reviewed-by: Ken Rockot Cr-Commit-Position: refs/heads/master@{#620490} --- components/plugins/renderer/webview_plugin.cc | 7 +- .../renderer/print_render_frame_helper.cc | 11 +- content/browser/bad_message.h | 1 + content/browser/frame_host/frame_tree.cc | 10 + content/browser/frame_host/frame_tree.h | 4 + .../frame_tree_node_blame_context_unittest.cc | 2 + .../browser/frame_host/frame_tree_unittest.cc | 100 +++++++-- .../navigation_controller_impl_browsertest.cc | 4 +- .../navigation_controller_impl_unittest.cc | 16 ++ .../frame_host/render_frame_host_impl.cc | 93 +++++++-- .../frame_host/render_frame_host_impl.h | 42 +++- .../render_frame_host_impl_browsertest.cc | 12 +- .../render_frame_host_manager_unittest.cc | 88 +++++--- .../frame_host/render_frame_message_filter.cc | 41 +++- .../frame_host/render_frame_message_filter.h | 19 +- content/browser/navigation_browsertest.cc | 35 +++- content/browser/portal/portal.cc | 11 +- .../render_process_host_unittest.cc | 2 + .../renderer_host/render_view_host_impl.cc | 11 +- .../render_widget_host_view_browsertest.cc | 4 +- .../browser/security_exploit_browsertest.cc | 51 +++-- .../browser/site_per_process_browsertest.cc | 33 ++- .../browser/webauth/webauth_browsertest.cc | 4 +- content/common/BUILD.gn | 1 + .../document_scoped_interface_bundle.mojom | 19 ++ content/common/frame.mojom | 30 ++- content/common/frame_messages.h | 29 ++- content/common/renderer.mojom | 11 +- content/public/renderer/render_frame.h | 6 + content/public/test/browser_test_utils.cc | 4 +- content/public/test/mock_render_thread.cc | 44 +++- content/public/test/mock_render_thread.h | 23 +- content/public/test/navigation_simulator.cc | 29 ++- content/public/test/navigation_simulator.h | 5 + content/public/test/render_view_test.cc | 13 +- content/renderer/render_frame_impl.cc | 127 ++++++++--- content/renderer/render_frame_impl.h | 28 ++- .../renderer/render_frame_impl_browsertest.cc | 197 +++++++++++++++++- content/renderer/render_thread_impl.cc | 17 +- content/renderer/render_view_browsertest.cc | 20 +- content/renderer/render_view_impl.cc | 20 +- ...did_commit_provisional_load_interceptor.cc | 10 +- .../did_commit_provisional_load_interceptor.h | 3 +- content/test/test_render_frame.cc | 37 +++- content/test/test_render_frame.h | 3 + content/test/test_render_frame_host.cc | 40 +++- content/test/test_render_frame_host.h | 9 + extensions/renderer/DEPS | 1 + extensions/renderer/scoped_web_frame.cc | 17 +- media/blink/DEPS | 3 +- media/blink/webmediaplayer_impl_unittest.cc | 18 +- third_party/blink/public/mojom/BUILD.gn | 2 + .../frame/document_interface_broker.mojom | 13 ++ .../frame/frame_host_test_interface.mojom | 23 ++ .../blink/public/web/web_local_frame.h | 5 +- .../blink/public/web/web_local_frame_client.h | 3 +- .../blink/public/web/web_remote_frame.h | 1 + .../core/exported/local_frame_client_impl.cc | 35 +++- .../core/exported/local_frame_client_impl.h | 11 +- .../renderer/core/exported/web_frame_test.cc | 18 +- .../core/exported/web_remote_frame_impl.cc | 6 +- .../core/exported/web_remote_frame_impl.h | 1 + .../renderer/core/exported/web_view_test.cc | 9 +- .../core/exported/worker_shadow_page.cc | 21 +- .../renderer/core/frame/frame_test_helpers.cc | 26 ++- .../blink/renderer/core/frame/local_frame.cc | 6 + .../blink/renderer/core/frame/local_frame.h | 7 + .../renderer/core/frame/local_frame_client.h | 8 + .../core/frame/web_local_frame_impl.cc | 39 +++- .../core/frame/web_local_frame_impl.h | 12 +- .../renderer/core/loader/empty_clients.cc | 6 + .../renderer/core/loader/empty_clients.h | 4 + tools/metrics/histograms/enums.xml | 1 + 73 files changed, 1317 insertions(+), 305 deletions(-) create mode 100644 content/common/document_scoped_interface_bundle.mojom create mode 100644 third_party/blink/public/mojom/frame/document_interface_broker.mojom create mode 100644 third_party/blink/public/mojom/frame/frame_host_test_interface.mojom diff --git a/components/plugins/renderer/webview_plugin.cc b/components/plugins/renderer/webview_plugin.cc index 2e782233f6725c..4d768ee8bd711f 100644 --- a/components/plugins/renderer/webview_plugin.cc +++ b/components/plugins/renderer/webview_plugin.cc @@ -17,6 +17,7 @@ #include "content/public/renderer/render_view.h" #include "gin/converter.h" #include "skia/ext/platform_canvas.h" +#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom.h" #include "third_party/blink/public/platform/web_coalesced_input_event.h" #include "third_party/blink/public/platform/web_url.h" #include "third_party/blink/public/platform/web_url_response.h" @@ -263,8 +264,10 @@ WebViewPlugin::WebViewHelper::WebViewHelper(WebViewPlugin* plugin, // ApplyWebPreferences before making a WebLocalFrame so that the frame sees a // consistent view of our preferences. content::RenderView::ApplyWebPreferences(preferences, web_view_); - WebLocalFrame* web_frame = - WebLocalFrame::CreateMainFrame(web_view_, this, nullptr, nullptr); + blink::mojom::DocumentInterfaceBrokerPtrInfo document_interface_broker; + WebLocalFrame* web_frame = WebLocalFrame::CreateMainFrame( + web_view_, this, nullptr, + mojo::MakeRequest(&document_interface_broker).PassMessagePipe(), nullptr); WebFrameWidget::CreateForMainFrame(this, web_frame); } diff --git a/components/printing/renderer/print_render_frame_helper.cc b/components/printing/renderer/print_render_frame_helper.cc index 4110bc8fd2cd5a..02d4b6fecf7227 100644 --- a/components/printing/renderer/print_render_frame_helper.cc +++ b/components/printing/renderer/print_render_frame_helper.cc @@ -40,6 +40,7 @@ #include "printing/units.h" #include "third_party/blink/public/common/frame/frame_owner_element_type.h" #include "third_party/blink/public/common/frame/sandbox_flags.h" +#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/web_data.h" #include "third_party/blink/public/platform/web_double_size.h" @@ -684,8 +685,10 @@ void PrintRenderFrameHelper::PrintHeaderAndFooter( }; HeaderAndFooterClient frame_client; + blink::mojom::DocumentInterfaceBrokerPtrInfo document_interface_broker; blink::WebLocalFrame* frame = blink::WebLocalFrame::CreateMainFrame( - web_view, &frame_client, nullptr, nullptr); + web_view, &frame_client, nullptr, + mojo::MakeRequest(&document_interface_broker).PassMessagePipe(), nullptr); blink::WebWidgetClient web_widget_client; blink::WebFrameWidget::CreateForMainFrame(&web_widget_client, frame); @@ -920,8 +923,10 @@ void PrepareFrameAndViewForPrint::CopySelection( /*opener=*/nullptr); owns_web_view_ = true; content::RenderView::ApplyWebPreferences(prefs, web_view); - blink::WebLocalFrame* main_frame = - blink::WebLocalFrame::CreateMainFrame(web_view, this, nullptr, nullptr); + blink::mojom::DocumentInterfaceBrokerPtrInfo document_interface_broker; + blink::WebLocalFrame* main_frame = blink::WebLocalFrame::CreateMainFrame( + web_view, this, nullptr, + mojo::MakeRequest(&document_interface_broker).PassMessagePipe(), nullptr); frame_.Reset(main_frame); blink::WebFrameWidget::CreateForMainFrame(this, main_frame); node_to_print_.Reset(); diff --git a/content/browser/bad_message.h b/content/browser/bad_message.h index a7b01acd0b9d74..c223db0bd0ef0a 100644 --- a/content/browser/bad_message.h +++ b/content/browser/bad_message.h @@ -236,6 +236,7 @@ enum BadMessageReason { RFH_CHILD_FRAME_NEEDS_OWNER_ELEMENT_TYPE = 208, OBSOLETE_RFH_INVALID_WEB_REPORTING_CRASH_ID = 209, RFH_DETACH_MAIN_FRAME = 210, + RFH_DOCUMENT_INTERFACE_BROKER_MISSING = 211, // Please add new elements here. The naming convention is abbreviated class // name (e.g. RenderFrameHost becomes RFH) plus a unique description of the diff --git a/content/browser/frame_host/frame_tree.cc b/content/browser/frame_host/frame_tree.cc index 7311e0fe38bc05..d9e8d4e70d7dd0 100644 --- a/content/browser/frame_host/frame_tree.cc +++ b/content/browser/frame_host/frame_tree.cc @@ -175,6 +175,10 @@ FrameTreeNode* FrameTree::AddFrame( int process_id, int new_routing_id, service_manager::mojom::InterfaceProviderRequest interface_provider_request, + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_content_request, + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_blink_request, blink::WebTreeScopeType scope, const std::string& frame_name, const std::string& frame_unique_name, @@ -217,6 +221,12 @@ FrameTreeNode* FrameTree::AddFrame( added_node->current_frame_host()->BindInterfaceProviderRequest( std::move(interface_provider_request)); + DCHECK(document_interface_broker_content_request.is_pending()); + DCHECK(document_interface_broker_blink_request.is_pending()); + added_node->current_frame_host()->BindDocumentInterfaceBrokerRequest( + std::move(document_interface_broker_content_request), + std::move(document_interface_broker_blink_request)); + // The last committed NavigationEntry may have a FrameNavigationEntry with the // same |frame_unique_name|, since we don't remove FrameNavigationEntries if // their frames are deleted. If there is a stale one, remove it to avoid diff --git a/content/browser/frame_host/frame_tree.h b/content/browser/frame_host/frame_tree.h index 03b4f49d46000b..1a768cf8bd3704 100644 --- a/content/browser/frame_host/frame_tree.h +++ b/content/browser/frame_host/frame_tree.h @@ -154,6 +154,10 @@ class CONTENT_EXPORT FrameTree { int new_routing_id, service_manager::mojom::InterfaceProviderRequest interface_provider_request, + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_content_request, + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_blink_request, blink::WebTreeScopeType scope, const std::string& frame_name, const std::string& frame_unique_name, diff --git a/content/browser/frame_host/frame_tree_node_blame_context_unittest.cc b/content/browser/frame_host/frame_tree_node_blame_context_unittest.cc index 262ce978dd98ca..1b7f75bbaf4456 100644 --- a/content/browser/frame_host/frame_tree_node_blame_context_unittest.cc +++ b/content/browser/frame_host/frame_tree_node_blame_context_unittest.cc @@ -100,6 +100,8 @@ class FrameTreeNodeBlameContextTest : public RenderViewHostImplTestHarness { tree()->AddFrame( node, process_id(), child_id, TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), base::StringPrintf("uniqueName%d", child_id), false, base::UnguessableToken::Create(), blink::FramePolicy(), diff --git a/content/browser/frame_host/frame_tree_unittest.cc b/content/browser/frame_host/frame_tree_unittest.cc index 1b702c3861adb4..20c5bb3d137f2c 100644 --- a/content/browser/frame_host/frame_tree_unittest.cc +++ b/content/browser/frame_host/frame_tree_unittest.cc @@ -57,6 +57,11 @@ CreateStubInterfaceProviderRequest() { return TestRenderFrameHost::CreateStubInterfaceProviderRequest(); } +blink::mojom::DocumentInterfaceBrokerRequest +CreateStubDocumentInterfaceBrokerRequest() { + return TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(); +} + // Logs calls to WebContentsObserver along with the state of the frame tree, // for later use in EXPECT_EQ(). class TreeWalkingWebContentsLogger : public WebContentsObserver { @@ -165,31 +170,43 @@ TEST_F(FrameTreeTest, Shape) { // Simulate attaching a series of frames to build the frame tree. frame_tree->AddFrame( root, process_id, 14, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), "uniqueName0", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), false, kOwnerType); frame_tree->AddFrame( root, process_id, 15, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), "uniqueName1", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), false, kOwnerType); frame_tree->AddFrame( root, process_id, 16, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), "uniqueName2", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), false, kOwnerType); frame_tree->AddFrame( root->child_at(0), process_id, 244, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), "uniqueName3", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), false, kOwnerType); frame_tree->AddFrame( root->child_at(1), process_id, 255, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, no_children_node, "uniqueName4", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), false, kOwnerType); frame_tree->AddFrame( root->child_at(0), process_id, 245, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), "uniqueName5", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), false, kOwnerType); @@ -203,26 +220,36 @@ TEST_F(FrameTreeTest, Shape) { FrameTreeNode* child_16 = root->child_at(2); frame_tree->AddFrame( child_16, process_id, 264, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), "uniqueName6", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), false, kOwnerType); frame_tree->AddFrame( child_16, process_id, 265, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), "uniqueName7", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), false, kOwnerType); frame_tree->AddFrame( child_16, process_id, 266, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), "uniqueName8", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), false, kOwnerType); frame_tree->AddFrame( child_16, process_id, 267, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, deep_subtree, "uniqueName9", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), false, kOwnerType); frame_tree->AddFrame( child_16, process_id, 268, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), "uniqueName10", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), false, kOwnerType); @@ -230,24 +257,35 @@ TEST_F(FrameTreeTest, Shape) { FrameTreeNode* child_267 = child_16->child_at(3); frame_tree->AddFrame( child_267, process_id, 365, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), "uniqueName11", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), false, kOwnerType); - frame_tree->AddFrame( - child_267->child_at(0), process_id, 455, - CreateStubInterfaceProviderRequest(), blink::WebTreeScopeType::kDocument, - std::string(), "uniqueName12", false, base::UnguessableToken::Create(), - blink::FramePolicy(), FrameOwnerProperties(), false, kOwnerType); - frame_tree->AddFrame( - child_267->child_at(0)->child_at(0), process_id, 555, - CreateStubInterfaceProviderRequest(), blink::WebTreeScopeType::kDocument, - std::string(), "uniqueName13", false, base::UnguessableToken::Create(), - blink::FramePolicy(), FrameOwnerProperties(), false, kOwnerType); - frame_tree->AddFrame( - child_267->child_at(0)->child_at(0)->child_at(0), process_id, 655, - CreateStubInterfaceProviderRequest(), blink::WebTreeScopeType::kDocument, - std::string(), "uniqueName14", false, base::UnguessableToken::Create(), - blink::FramePolicy(), FrameOwnerProperties(), false, kOwnerType); + frame_tree->AddFrame(child_267->child_at(0), process_id, 455, + CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + blink::WebTreeScopeType::kDocument, std::string(), + "uniqueName12", false, base::UnguessableToken::Create(), + blink::FramePolicy(), FrameOwnerProperties(), false, + kOwnerType); + frame_tree->AddFrame(child_267->child_at(0)->child_at(0), process_id, 555, + CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + blink::WebTreeScopeType::kDocument, std::string(), + "uniqueName13", false, base::UnguessableToken::Create(), + blink::FramePolicy(), FrameOwnerProperties(), false, + kOwnerType); + frame_tree->AddFrame(child_267->child_at(0)->child_at(0)->child_at(0), + process_id, 655, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + blink::WebTreeScopeType::kDocument, std::string(), + "uniqueName14", false, base::UnguessableToken::Create(), + blink::FramePolicy(), FrameOwnerProperties(), false, + kOwnerType); // Now that's it's fully built, verify the tree structure is as expected. EXPECT_EQ( @@ -321,16 +359,22 @@ TEST_F(FrameTreeTest, FindFrames) { constexpr auto kOwnerType = blink::FrameOwnerElementType::kIframe; main_test_rfh()->OnCreateChildFrame( 22, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, "child0", "uniqueName0", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); main_test_rfh()->OnCreateChildFrame( 23, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, "child1", "uniqueName1", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); main_test_rfh()->OnCreateChildFrame( 24, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), "uniqueName2", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); @@ -341,6 +385,8 @@ TEST_F(FrameTreeTest, FindFrames) { // Add one grandchild frame. child1->current_frame_host()->OnCreateChildFrame( 33, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, "grandchild", "uniqueName3", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); @@ -382,16 +428,22 @@ TEST_F(FrameTreeTest, GetSibling) { FrameTreeNode* root = frame_tree->root(); main_test_rfh()->OnCreateChildFrame( 22, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, "child0", "uniqueName0", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); main_test_rfh()->OnCreateChildFrame( 23, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, "child1", "uniqueName1", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); main_test_rfh()->OnCreateChildFrame( 24, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, "child2", "uniqueName2", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); @@ -402,6 +454,8 @@ TEST_F(FrameTreeTest, GetSibling) { // Add one grandchild frame. child1->current_frame_host()->OnCreateChildFrame( 33, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, "grandchild", "uniqueName3", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); @@ -436,6 +490,8 @@ TEST_F(FrameTreeTest, ObserverWalksTreeDuringFrameCreation) { // Simulate attaching a series of frames to build the frame tree. main_test_rfh()->OnCreateChildFrame( 14, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), "uniqueName0", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); @@ -445,6 +501,8 @@ TEST_F(FrameTreeTest, ObserverWalksTreeDuringFrameCreation) { activity.GetLog()); main_test_rfh()->OnCreateChildFrame( 18, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), "uniqueName1", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); @@ -468,6 +526,8 @@ TEST_F(FrameTreeTest, ObserverWalksTreeAfterCrash) { constexpr auto kOwnerType = blink::FrameOwnerElementType::kIframe; main_test_rfh()->OnCreateChildFrame( 22, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), "uniqueName0", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); @@ -477,6 +537,8 @@ TEST_F(FrameTreeTest, ObserverWalksTreeAfterCrash) { activity.GetLog()); main_test_rfh()->OnCreateChildFrame( 23, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), "uniqueName1", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); @@ -508,6 +570,8 @@ TEST_F(FrameTreeTest, FailAddFrameWithWrongProcessId) { // Simulate attaching a frame from mismatched process id. ASSERT_FALSE(frame_tree->AddFrame( root, process_id + 1, 1, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), "uniqueName0", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), false, blink::FrameOwnerElementType::kIframe)); @@ -525,11 +589,15 @@ TEST_F(FrameTreeTest, ProcessCrashClearsGlobalMap) { constexpr auto kOwnerType = blink::FrameOwnerElementType::kIframe; main_test_rfh()->OnCreateChildFrame( 22, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), "uniqueName0", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); main_test_rfh()->OnCreateChildFrame( 23, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), "uniqueName1", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); @@ -538,6 +606,8 @@ TEST_F(FrameTreeTest, ProcessCrashClearsGlobalMap) { RenderFrameHostImpl* child1_rfh = root->child_at(0)->current_frame_host(); child1_rfh->OnCreateChildFrame( 33, CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), "uniqueName2", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); diff --git a/content/browser/frame_host/navigation_controller_impl_browsertest.cc b/content/browser/frame_host/navigation_controller_impl_browsertest.cc index e3b5cdcd820331..354c22f349d2e9 100644 --- a/content/browser/frame_host/navigation_controller_impl_browsertest.cc +++ b/content/browser/frame_host/navigation_controller_impl_browsertest.cc @@ -6848,8 +6848,8 @@ class HistoryNavigationBeforeCommitInjector bool WillDispatchDidCommitProvisionalLoad( RenderFrameHost* render_frame_host, ::FrameHostMsg_DidCommitProvisionalLoad_Params* params, - service_manager::mojom::InterfaceProviderRequest* - interface_provider_request) override { + mojom::DidCommitProvisionalLoadInterfaceParamsPtr& interface_params) + override { if (!render_frame_host->GetParent() && params->url == url_) { did_trigger_history_navigation_ = true; web_contents()->GetController().GoBack(); diff --git a/content/browser/frame_host/navigation_controller_impl_unittest.cc b/content/browser/frame_host/navigation_controller_impl_unittest.cc index 98cdf3a0e64485..3dabfe4c666759 100644 --- a/content/browser/frame_host/navigation_controller_impl_unittest.cc +++ b/content/browser/frame_host/navigation_controller_impl_unittest.cc @@ -2105,6 +2105,8 @@ TEST_F(NavigationControllerTest, NewSubframe) { main_test_rfh()->OnCreateChildFrame( process()->GetNextRoutingID(), TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), unique_name, false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), blink::FrameOwnerElementType::kIframe); @@ -2183,6 +2185,8 @@ TEST_F(NavigationControllerTest, AutoSubframe) { main_test_rfh()->OnCreateChildFrame( process()->GetNextRoutingID(), TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), unique_name0, false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); @@ -2229,6 +2233,8 @@ TEST_F(NavigationControllerTest, AutoSubframe) { main_test_rfh()->OnCreateChildFrame( process()->GetNextRoutingID(), TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), unique_name1, false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); @@ -2275,6 +2281,8 @@ TEST_F(NavigationControllerTest, AutoSubframe) { subframe->OnCreateChildFrame( process()->GetNextRoutingID(), TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), unique_name2, false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); @@ -2339,6 +2347,8 @@ TEST_F(NavigationControllerTest, BackSubframe) { main_test_rfh()->OnCreateChildFrame( process()->GetNextRoutingID(), TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), unique_name, false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), blink::FrameOwnerElementType::kIframe); @@ -3745,6 +3755,8 @@ TEST_F(NavigationControllerTest, SameSubframe) { main_test_rfh()->OnCreateChildFrame( process()->GetNextRoutingID(), TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), unique_name, false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), blink::FrameOwnerElementType::kIframe); @@ -3921,6 +3933,8 @@ TEST_F(NavigationControllerTest, SubframeWhilePending) { main_test_rfh()->OnCreateChildFrame( process()->GetNextRoutingID(), TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), unique_name, false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), blink::FrameOwnerElementType::kIframe); @@ -5180,6 +5194,8 @@ TEST_F(NavigationControllerTest, SubFrameNavigationUIData) { main_test_rfh()->OnCreateChildFrame( process()->GetNextRoutingID(), TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), unique_name, false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), blink::FrameOwnerElementType::kIframe); diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc index e88062fb633db0..5f4562c307b438 100644 --- a/content/browser/frame_host/render_frame_host_impl.cc +++ b/content/browser/frame_host/render_frame_host_impl.cc @@ -789,6 +789,8 @@ RenderFrameHostImpl::RenderFrameHostImpl(SiteInstance* site_instance, has_focused_editable_element_(false), active_sandbox_flags_(blink::WebSandboxFlags::kNone), document_scoped_interface_provider_binding_(this), + document_interface_broker_content_binding_(this), + document_interface_broker_blink_binding_(this), keep_alive_timeout_(base::TimeDelta::FromSeconds(30)), subframe_unload_timeout_(base::TimeDelta::FromMilliseconds( RenderViewHostImpl::kUnloadTimeoutMS)), @@ -1032,10 +1034,8 @@ const base::UnguessableToken& RenderFrameHostImpl::GetOverlayRoutingToken() { void RenderFrameHostImpl::DidCommitProvisionalLoadForTesting( std::unique_ptr params, - service_manager::mojom::InterfaceProviderRequest - interface_provider_request) { - DidCommitProvisionalLoad(std::move(params), - std::move(interface_provider_request)); + mojom::DidCommitProvisionalLoadInterfaceParamsPtr interface_params) { + DidCommitProvisionalLoad(std::move(params), std::move(interface_params)); } void RenderFrameHostImpl::AudioContextPlaybackStarted(int audio_context_id) { @@ -1663,8 +1663,20 @@ bool RenderFrameHostImpl::CreateRenderFrame(int proxy_routing_id, service_manager::mojom::InterfaceProviderPtr interface_provider; BindInterfaceProviderRequest(mojo::MakeRequest(&interface_provider)); + blink::mojom::DocumentInterfaceBrokerPtrInfo + document_interface_broker_content_info; + blink::mojom::DocumentInterfaceBrokerPtrInfo + document_interface_broker_blink_info; + BindDocumentInterfaceBrokerRequest( + mojo::MakeRequest(&document_interface_broker_content_info), + mojo::MakeRequest(&document_interface_broker_blink_info)); + mojom::CreateFrameParamsPtr params = mojom::CreateFrameParams::New(); - params->interface_provider = interface_provider.PassInterface(); + params->interface_bundle = mojom::DocumentScopedInterfaceBundle::New( + interface_provider.PassInterface(), + std::move(document_interface_broker_content_info), + std::move(document_interface_broker_blink_info)); + params->routing_id = routing_id_; params->proxy_routing_id = proxy_routing_id; params->opener_routing_id = opener_routing_id; @@ -1870,6 +1882,10 @@ void RenderFrameHostImpl::OnCreateChildFrame( int new_routing_id, service_manager::mojom::InterfaceProviderRequest new_interface_provider_provider_request, + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_content_request, + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_blink_request, blink::WebTreeScopeType scope, const std::string& frame_name, const std::string& frame_unique_name, @@ -1881,6 +1897,8 @@ void RenderFrameHostImpl::OnCreateChildFrame( // TODO(lukasza): Call ReceivedBadMessage when |frame_unique_name| is empty. DCHECK(!frame_unique_name.empty()); DCHECK(new_interface_provider_provider_request.is_pending()); + DCHECK(document_interface_broker_content_request.is_pending()); + DCHECK(document_interface_broker_blink_request.is_pending()); if (owner_type == blink::FrameOwnerElementType::kNone) { // Any child frame must have a HTMLFrameOwnerElement in its parent document // and therefore the corresponding type of kNone (specific to main frames) @@ -1896,12 +1914,16 @@ void RenderFrameHostImpl::OnCreateChildFrame( if (!is_active() || !IsCurrent() || !render_frame_created_) return; - // |new_routing_id|, |new_interface_provider_provider_request|, and - // |devtools_frame_token| were generated on the browser's IO thread and not - // taken from the renderer process. + // |new_routing_id|, |new_interface_provider_provider_request|, + // |document_interface_broker_content_handle|, + // |document_interface_broker_blink_handle| and |devtools_frame_token| were + // generated on the browser's IO thread and not taken from the renderer + // process. frame_tree_->AddFrame( frame_tree_node_, GetProcess()->GetID(), new_routing_id, - std::move(new_interface_provider_provider_request), scope, frame_name, + std::move(new_interface_provider_provider_request), + std::move(document_interface_broker_content_request), + std::move(document_interface_broker_blink_request), scope, frame_name, frame_unique_name, is_created_by_script, devtools_frame_token, frame_policy, frame_owner_properties, was_discarded_, owner_type); } @@ -2135,8 +2157,7 @@ void RenderFrameHostImpl::OnDidFailLoadWithError( void RenderFrameHostImpl::DidCommitProvisionalLoad( std::unique_ptr validated_params, - service_manager::mojom::InterfaceProviderRequest - interface_provider_request) { + mojom::DidCommitProvisionalLoadInterfaceParamsPtr interface_params) { if (GetNavigationHandle()) { main_frame_request_ids_ = {validated_params->request_id, GetNavigationHandle()->GetGlobalRequestID()}; @@ -2188,8 +2209,7 @@ void RenderFrameHostImpl::DidCommitProvisionalLoad( // bound to an interface connection servicing interface requests coming from // the document of the previously committed navigation. DCHECK(document_scoped_interface_provider_binding_.is_bound()); - - if (interface_provider_request.is_pending()) { + if (interface_params) { // As a general rule, expect the RenderFrame to have supplied the // request end of a new InterfaceProvider connection that will be used by // the new document to issue interface requests to access RenderFrameHost @@ -2199,7 +2219,15 @@ void RenderFrameHostImpl::DidCommitProvisionalLoad( dropped_interface_request_logger_ = std::make_unique( std::move(interface_provider_request_of_previous_document)); - BindInterfaceProviderRequest(std::move(interface_provider_request)); + BindInterfaceProviderRequest( + std::move(interface_params->interface_provider_request)); + + document_interface_broker_content_binding_.Close(); + document_interface_broker_blink_binding_.Close(); + BindDocumentInterfaceBrokerRequest( + std::move(interface_params->document_interface_broker_content_request), + std::move(interface_params->document_interface_broker_blink_request)); + } else { // If there had already been a real load committed in the frame, and this is // not a same-document navigation, then both the active document as well as @@ -2207,9 +2235,11 @@ void RenderFrameHostImpl::DidCommitProvisionalLoad( // should have rebound its InterfaceProvider to a new pipe, but failed to do // so. Kill the renderer, and close the old binding to ensure that any // pending interface requests originating from the previous document, hence - // possibly from a different security origin, will no longer dispatched. + // possibly from a different security origin, will no longer be dispatched. if (frame_tree_node_->has_committed_real_load()) { document_scoped_interface_provider_binding_.Close(); + document_interface_broker_content_binding_.Close(); + document_interface_broker_blink_binding_.Close(); bad_message::ReceivedBadMessage( process, bad_message::RFH_INTERFACE_PROVIDER_MISSING); return; @@ -2566,6 +2596,8 @@ void RenderFrameHostImpl::OnRenderProcessGone(int status, int exit_code) { SetRenderFrameCreated(false); InvalidateMojoConnection(); document_scoped_interface_provider_binding_.Close(); + document_interface_broker_content_binding_.Close(); + document_interface_broker_blink_binding_.Close(); SetLastCommittedUrl(GURL()); // Execute any pending AX tree snapshot callbacks with an empty response, @@ -3594,6 +3626,17 @@ void RenderFrameHostImpl::BindInterfaceProviderRequest( std::move(interface_provider_request))); } +void RenderFrameHostImpl::BindDocumentInterfaceBrokerRequest( + blink::mojom::DocumentInterfaceBrokerRequest content_request, + blink::mojom::DocumentInterfaceBrokerRequest blink_request) { + DCHECK(!document_interface_broker_content_binding_.is_bound()); + DCHECK(content_request.is_pending()); + document_interface_broker_content_binding_.Bind(std::move(content_request)); + DCHECK(!document_interface_broker_blink_binding_.is_bound()); + DCHECK(blink_request.is_pending()); + document_interface_broker_blink_binding_.Bind(std::move(blink_request)); +} + void RenderFrameHostImpl::SetKeepAliveTimeoutForTesting( base::TimeDelta timeout) { keep_alive_timeout_ = timeout; @@ -3763,10 +3806,22 @@ void RenderFrameHostImpl::CreateNewWindow( rfh->BindInterfaceProviderRequest( mojo::MakeRequest(&main_frame_interface_provider_info)); + blink::mojom::DocumentInterfaceBrokerPtrInfo + document_interface_broker_content_info; + + blink::mojom::DocumentInterfaceBrokerPtrInfo + document_interface_broker_blink_info; + rfh->BindDocumentInterfaceBrokerRequest( + mojo::MakeRequest(&document_interface_broker_content_info), + mojo::MakeRequest(&document_interface_broker_blink_info)); + mojom::CreateNewWindowReplyPtr reply = mojom::CreateNewWindowReply::New( render_view_route_id, main_frame_route_id, main_frame_widget_route_id, - std::move(main_frame_interface_provider_info), cloned_namespace->id(), - rfh->GetDevToolsFrameToken()); + mojom::DocumentScopedInterfaceBundle::New( + std::move(main_frame_interface_provider_info), + std::move(document_interface_broker_content_info), + std::move(document_interface_broker_blink_info)), + cloned_namespace->id(), rfh->GetDevToolsFrameToken()); std::move(callback).Run(mojom::CreateNewWindowStatus::kSuccess, std::move(reply)); } @@ -5729,6 +5784,10 @@ void RenderFrameHostImpl::GetInterface( } } +// This is a test-only interface, not exposed in production. +void RenderFrameHostImpl::GetFrameHostTestInterface( + blink::mojom::FrameHostTestInterfaceRequest request) {} + std::unique_ptr RenderFrameHostImpl::TakeNavigationRequestForSameDocumentCommit( const FrameHostMsg_DidCommitProvisionalLoad_Params& params) { diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h index 205ab6f5982f22..d44fd23ec96926 100644 --- a/content/browser/frame_host/render_frame_host_impl.h +++ b/content/browser/frame_host/render_frame_host_impl.h @@ -68,6 +68,7 @@ #include "third_party/blink/public/common/frame/user_activation_update_type.h" #include "third_party/blink/public/mojom/choosers/file_chooser.mojom.h" #include "third_party/blink/public/mojom/devtools/devtools_agent.mojom.h" +#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom.h" #include "third_party/blink/public/mojom/frame/find_in_page.mojom.h" #include "third_party/blink/public/mojom/frame/navigation_initiator.mojom.h" #include "third_party/blink/public/mojom/presentation/presentation.mojom.h" @@ -169,6 +170,7 @@ class CONTENT_EXPORT RenderFrameHostImpl public BrowserAccessibilityDelegate, public SiteInstanceImpl::Observer, public service_manager::mojom::InterfaceProvider, + public blink::mojom::DocumentInterfaceBroker, public CSPContext, public ui::AXActionHandler { public: @@ -341,9 +343,19 @@ class CONTENT_EXPORT RenderFrameHostImpl // interface that the RenderFrameHost corresponding to the child frame should // bind to expose services to the renderer process. The caller takes care of // sending down the client end of the pipe to the child RenderFrame to use. + // |document_interface_broker_content_handle| and + // |document_interface_broker_blink_handle| are the pipe handles bound by + // to request ends of DocumentInterfaceProviderInterface in content and blink + // parts of the child frame. RenderFrameHost should bind these handles to + // expose services to the renderer process. The caller takes care of sending + // down the client end of the pipe to the child RenderFrame to use. void OnCreateChildFrame(int new_routing_id, service_manager::mojom::InterfaceProviderRequest interface_provider_request, + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_content_request, + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_blink_request, blink::WebTreeScopeType scope, const std::string& frame_name, const std::string& frame_unique_name, @@ -764,13 +776,21 @@ class CONTENT_EXPORT RenderFrameHostImpl const base::UnguessableToken& GetOverlayRoutingToken(); // Binds the request end of the InterfaceProvider interface through which - // services provided by this RenderFrameHost are exposed to the correponding + // services provided by this RenderFrameHost are exposed to the corresponding // RenderFrame. The caller is responsible for plumbing the client end to the // the renderer process. void BindInterfaceProviderRequest( service_manager::mojom::InterfaceProviderRequest interface_provider_request); + // Binds content and blink request ends of the DocumentInterfaceProvider + // interface through which services provided by this RenderFrameHost are + // exposed to the corresponding RenderFrame. The caller is responsible for + // plumbing the client ends to the the renderer process. + void BindDocumentInterfaceBrokerRequest( + blink::mojom::DocumentInterfaceBrokerRequest content_request, + blink::mojom::DocumentInterfaceBrokerRequest blink_request); + // Exposed so that tests can swap out the implementation and intercept calls. mojo::AssociatedBinding& frame_host_binding_for_testing() { return frame_host_associated_binding_; @@ -807,8 +827,7 @@ class CONTENT_EXPORT RenderFrameHostImpl void DidCommitProvisionalLoadForTesting( std::unique_ptr params, - service_manager::mojom::InterfaceProviderRequest - interface_provider_request); + mojom::DidCommitProvisionalLoadInterfaceParamsPtr interface_params); service_manager::BinderRegistry& BinderRegistryForTesting() { return *registry_; @@ -1074,8 +1093,8 @@ class CONTENT_EXPORT RenderFrameHostImpl void DidCommitProvisionalLoad( std::unique_ptr validated_params, - service_manager::mojom::InterfaceProviderRequest - interface_provider_request) override; + mojom::DidCommitProvisionalLoadInterfaceParamsPtr interface_params) + override; void DidCommitSameDocumentNavigation( std::unique_ptr validated_params) override; @@ -1245,6 +1264,10 @@ class CONTENT_EXPORT RenderFrameHostImpl void GetInterface(const std::string& interface_name, mojo::ScopedMessagePipeHandle interface_pipe) override; + // blink::mojom::DocumentInterfaceBroker: + void GetFrameHostTestInterface( + blink::mojom::FrameHostTestInterfaceRequest request) override; + // Allows tests to disable the swapout event timer to simulate bugs that // happen before it fires (to avoid flakiness). void DisableSwapOutTimerForTesting(); @@ -1804,6 +1827,15 @@ class CONTENT_EXPORT RenderFrameHostImpl mojo::Binding document_scoped_interface_provider_binding_; + // Bindings for the DocumentInterfaceBroker through which this + // RenderFrameHostImpl exposes document-scoped Mojo services to the currently + // active document in the corresponding RenderFrame. Because of the type + // difference between content and blink, two separate pipes are used. + mojo::Binding + document_interface_broker_content_binding_; + mojo::Binding + document_interface_broker_blink_binding_; + // Logs interface requests that arrive after the frame has already committed a // non-same-document navigation, and has already unbound // |document_scoped_interface_provider_binding_| from the interface connection diff --git a/content/browser/frame_host/render_frame_host_impl_browsertest.cc b/content/browser/frame_host/render_frame_host_impl_browsertest.cc index af49ead4a8deef..198b6444af9fa2 100644 --- a/content/browser/frame_host/render_frame_host_impl_browsertest.cc +++ b/content/browser/frame_host/render_frame_host_impl_browsertest.cc @@ -1378,11 +1378,15 @@ class ScopedFakeInterfaceProviderRequestInjector bool WillDispatchDidCommitProvisionalLoad( RenderFrameHost* render_frame_host, ::FrameHostMsg_DidCommitProvisionalLoad_Params* params, - service_manager::mojom::InterfaceProviderRequest* - interface_provider_request) override { + mojom::DidCommitProvisionalLoadInterfaceParamsPtr& interface_params) + override { url_of_last_commit_ = params->url; - original_request_of_last_commit_ = std::move(*interface_provider_request); - *interface_provider_request = std::move(next_fake_request_); + if (interface_params) { + original_request_of_last_commit_ = + std::move(interface_params->interface_provider_request); + interface_params->interface_provider_request = + std::move(next_fake_request_); + } return true; } diff --git a/content/browser/frame_host/render_frame_host_manager_unittest.cc b/content/browser/frame_host/render_frame_host_manager_unittest.cc index ef31b4a2ff5892..c632362e263b8a 100644 --- a/content/browser/frame_host/render_frame_host_manager_unittest.cc +++ b/content/browser/frame_host/render_frame_host_manager_unittest.cc @@ -1913,12 +1913,16 @@ TEST_F(RenderFrameHostManagerTestWithSiteIsolation, DetachPendingChild) { contents()->GetMainFrame()->OnCreateChildFrame( contents()->GetMainFrame()->GetProcess()->GetNextRoutingID(), TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, "frame_name", "uniqueName1", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); contents()->GetMainFrame()->OnCreateChildFrame( contents()->GetMainFrame()->GetProcess()->GetNextRoutingID(), TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, "frame_name", "uniqueName2", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); @@ -2057,6 +2061,8 @@ TEST_F(RenderFrameHostManagerTestWithSiteIsolation, contents1->GetMainFrame()->OnCreateChildFrame( contents1->GetMainFrame()->GetProcess()->GetNextRoutingID(), TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, "frame_name", "uniqueName1", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), blink::FrameOwnerElementType::kIframe); @@ -2109,6 +2115,8 @@ TEST_F(RenderFrameHostManagerTestWithSiteIsolation, main_rfh->OnCreateChildFrame( main_rfh->GetProcess()->GetNextRoutingID(), TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), "uniqueName1", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), blink::FrameOwnerElementType::kIframe); @@ -2268,18 +2276,22 @@ TEST_F(RenderFrameHostManagerTest, TraverseComplexOpenerChain) { FrameTreeNode* root1 = tree1->root(); int process_id = root1->current_frame_host()->GetProcess()->GetID(); constexpr auto kOwnerType = blink::FrameOwnerElementType::kIframe; - tree1->AddFrame(root1, process_id, 12, - TestRenderFrameHost::CreateStubInterfaceProviderRequest(), - blink::WebTreeScopeType::kDocument, std::string(), - "uniqueName0", false, base::UnguessableToken::Create(), - blink::FramePolicy(), FrameOwnerProperties(), false, - kOwnerType); - tree1->AddFrame(root1, process_id, 13, - TestRenderFrameHost::CreateStubInterfaceProviderRequest(), - blink::WebTreeScopeType::kDocument, std::string(), - "uniqueName1", false, base::UnguessableToken::Create(), - blink::FramePolicy(), FrameOwnerProperties(), false, - kOwnerType); + tree1->AddFrame( + root1, process_id, 12, + TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + blink::WebTreeScopeType::kDocument, std::string(), "uniqueName0", false, + base::UnguessableToken::Create(), blink::FramePolicy(), + FrameOwnerProperties(), false, kOwnerType); + tree1->AddFrame( + root1, process_id, 13, + TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + blink::WebTreeScopeType::kDocument, std::string(), "uniqueName1", false, + base::UnguessableToken::Create(), blink::FramePolicy(), + FrameOwnerProperties(), false, kOwnerType); std::unique_ptr tab2( TestWebContents::Create(browser_context(), nullptr)); @@ -2287,18 +2299,22 @@ TEST_F(RenderFrameHostManagerTest, TraverseComplexOpenerChain) { FrameTree* tree2 = tab2->GetFrameTree(); FrameTreeNode* root2 = tree2->root(); process_id = root2->current_frame_host()->GetProcess()->GetID(); - tree2->AddFrame(root2, process_id, 22, - TestRenderFrameHost::CreateStubInterfaceProviderRequest(), - blink::WebTreeScopeType::kDocument, std::string(), - "uniqueName2", false, base::UnguessableToken::Create(), - blink::FramePolicy(), FrameOwnerProperties(), false, - kOwnerType); - tree2->AddFrame(root2, process_id, 23, - TestRenderFrameHost::CreateStubInterfaceProviderRequest(), - blink::WebTreeScopeType::kDocument, std::string(), - "uniqueName3", false, base::UnguessableToken::Create(), - blink::FramePolicy(), FrameOwnerProperties(), false, - kOwnerType); + tree2->AddFrame( + root2, process_id, 22, + TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + blink::WebTreeScopeType::kDocument, std::string(), "uniqueName2", false, + base::UnguessableToken::Create(), blink::FramePolicy(), + FrameOwnerProperties(), false, kOwnerType); + tree2->AddFrame( + root2, process_id, 23, + TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + blink::WebTreeScopeType::kDocument, std::string(), "uniqueName3", false, + base::UnguessableToken::Create(), blink::FramePolicy(), + FrameOwnerProperties(), false, kOwnerType); std::unique_ptr tab3( TestWebContents::Create(browser_context(), nullptr)); @@ -2311,12 +2327,14 @@ TEST_F(RenderFrameHostManagerTest, TraverseComplexOpenerChain) { FrameTree* tree4 = tab4->GetFrameTree(); FrameTreeNode* root4 = tree4->root(); process_id = root4->current_frame_host()->GetProcess()->GetID(); - tree4->AddFrame(root4, process_id, 42, - TestRenderFrameHost::CreateStubInterfaceProviderRequest(), - blink::WebTreeScopeType::kDocument, std::string(), - "uniqueName4", false, base::UnguessableToken::Create(), - blink::FramePolicy(), FrameOwnerProperties(), false, - kOwnerType); + tree4->AddFrame( + root4, process_id, 42, + TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + blink::WebTreeScopeType::kDocument, std::string(), "uniqueName4", false, + base::UnguessableToken::Create(), blink::FramePolicy(), + FrameOwnerProperties(), false, kOwnerType); root1->child_at(1)->SetOpener(root1->child_at(1)); root1->SetOpener(root2->child_at(1)); @@ -2366,18 +2384,24 @@ TEST_F(RenderFrameHostManagerTest, PageFocusPropagatesToSubframeProcesses) { main_test_rfh()->OnCreateChildFrame( main_test_rfh()->GetProcess()->GetNextRoutingID(), TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, "frame1", "uniqueName1", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); main_test_rfh()->OnCreateChildFrame( main_test_rfh()->GetProcess()->GetNextRoutingID(), TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, "frame2", "uniqueName2", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); main_test_rfh()->OnCreateChildFrame( main_test_rfh()->GetProcess()->GetNextRoutingID(), TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, "frame3", "uniqueName3", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); @@ -2475,6 +2499,8 @@ TEST_F(RenderFrameHostManagerTest, main_test_rfh()->OnCreateChildFrame( main_test_rfh()->GetProcess()->GetNextRoutingID(), TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, "frame1", "uniqueName1", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), kOwnerType); @@ -3068,6 +3094,8 @@ TEST_F(RenderFrameHostManagerTestWithSiteIsolation, main_test_rfh()->OnCreateChildFrame( main_test_rfh()->GetProcess()->GetNextRoutingID(), TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, "frame1", "uniqueName1", false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), blink::FrameOwnerElementType::kIframe); diff --git a/content/browser/frame_host/render_frame_message_filter.cc b/content/browser/frame_host/render_frame_message_filter.cc index 541ce8cfca7091..5ba72edd21cfbd 100644 --- a/content/browser/frame_host/render_frame_message_filter.cc +++ b/content/browser/frame_host/render_frame_message_filter.cc @@ -82,7 +82,9 @@ void CreateChildFrameOnUI( const FrameOwnerProperties& frame_owner_properties, blink::FrameOwnerElementType owner_type, int new_routing_id, - mojo::ScopedMessagePipeHandle interface_provider_request_handle) { + mojo::ScopedMessagePipeHandle interface_provider_request_handle, + mojo::ScopedMessagePipeHandle document_interface_broker_content_handle, + mojo::ScopedMessagePipeHandle document_interface_broker_blink_handle) { DCHECK_CURRENTLY_ON(BrowserThread::UI); RenderFrameHostImpl* render_frame_host = RenderFrameHostImpl::FromID(process_id, parent_routing_id); @@ -93,6 +95,10 @@ void CreateChildFrameOnUI( new_routing_id, service_manager::mojom::InterfaceProviderRequest( std::move(interface_provider_request_handle)), + blink::mojom::DocumentInterfaceBrokerRequest( + std::move(document_interface_broker_content_handle)), + blink::mojom::DocumentInterfaceBrokerRequest( + std::move(document_interface_broker_blink_handle)), scope, frame_name, frame_unique_name, is_created_by_script, devtools_frame_token, frame_policy, frame_owner_properties, owner_type); } @@ -436,26 +442,41 @@ void RenderFrameMessageFilter::DownloadUrl( void RenderFrameMessageFilter::OnCreateChildFrame( const FrameHostMsg_CreateChildFrame_Params& params, int* new_routing_id, - mojo::MessagePipeHandle* new_interface_provider, + FrameHostMsg_CreateChildFrame_Params_Reply* params_reply, base::UnguessableToken* devtools_frame_token) { *new_routing_id = render_widget_helper_->GetNextRoutingID(); service_manager::mojom::InterfaceProviderPtr interface_provider; auto interface_provider_request(mojo::MakeRequest(&interface_provider)); - *new_interface_provider = + params_reply->new_interface_provider = interface_provider.PassInterface().PassHandle().release(); + blink::mojom::DocumentInterfaceBrokerPtrInfo + document_interface_broker_content; + auto document_interface_broker_request_content( + mojo::MakeRequest(&document_interface_broker_content)); + params_reply->document_interface_broker_content_handle = + document_interface_broker_content.PassHandle().release(); + + blink::mojom::DocumentInterfaceBrokerPtrInfo document_interface_broker_blink; + auto document_interface_broker_request_blink( + mojo::MakeRequest(&document_interface_broker_blink)); + params_reply->document_interface_broker_blink_handle = + document_interface_broker_blink.PassHandle().release(); + *devtools_frame_token = base::UnguessableToken::Create(); base::PostTaskWithTraits( FROM_HERE, {BrowserThread::UI}, - base::BindOnce(&CreateChildFrameOnUI, render_process_id_, - params.parent_routing_id, params.scope, params.frame_name, - params.frame_unique_name, params.is_created_by_script, - *devtools_frame_token, params.frame_policy, - params.frame_owner_properties, - params.frame_owner_element_type, *new_routing_id, - interface_provider_request.PassMessagePipe())); + base::BindOnce( + &CreateChildFrameOnUI, render_process_id_, params.parent_routing_id, + params.scope, params.frame_name, params.frame_unique_name, + params.is_created_by_script, *devtools_frame_token, + params.frame_policy, params.frame_owner_properties, + params.frame_owner_element_type, *new_routing_id, + interface_provider_request.PassMessagePipe(), + document_interface_broker_request_content.PassMessagePipe(), + document_interface_broker_request_blink.PassMessagePipe())); } void RenderFrameMessageFilter::OnCookiesEnabled(int render_frame_id, diff --git a/content/browser/frame_host/render_frame_message_filter.h b/content/browser/frame_host/render_frame_message_filter.h index 8280d104a6d9b4..da3f345abfb1f0 100644 --- a/content/browser/frame_host/render_frame_message_filter.h +++ b/content/browser/frame_host/render_frame_message_filter.h @@ -27,13 +27,10 @@ #endif struct FrameHostMsg_CreateChildFrame_Params; +struct FrameHostMsg_CreateChildFrame_Params_Reply; struct FrameHostMsg_DownloadUrl_Params; class GURL; -namespace mojo { -class MessagePipeHandle; -} - namespace net { class URLRequestContextGetter; } @@ -104,12 +101,14 @@ class CONTENT_EXPORT RenderFrameMessageFilter void InitializeCookieManager( network::mojom::CookieManagerRequest cookie_manager_request); - // |new_render_frame_id| and |devtools_frame_token| are out parameters. - // Browser process defines them for the renderer process. - void OnCreateChildFrame(const FrameHostMsg_CreateChildFrame_Params& params, - int* new_render_frame_id, - mojo::MessagePipeHandle* new_interface_provider, - base::UnguessableToken* devtools_frame_token); + // |new_render_frame_id|, |document_interface_broker_content_handle|, + // |document_interface_broker_blink_handle| and |devtools_frame_token| are out + // parameters. Browser process defines them for the renderer process. + void OnCreateChildFrame( + const FrameHostMsg_CreateChildFrame_Params& params, + int* new_render_frame_id, + FrameHostMsg_CreateChildFrame_Params_Reply* params_reply, + base::UnguessableToken* devtools_frame_token); void OnCookiesEnabled(int render_frame_id, const GURL& url, const GURL& site_for_cookies, diff --git a/content/browser/navigation_browsertest.cc b/content/browser/navigation_browsertest.cc index 64f5e8a5c1c84a..7d08727e8d39e8 100644 --- a/content/browser/navigation_browsertest.cc +++ b/content/browser/navigation_browsertest.cc @@ -88,14 +88,29 @@ class InterceptAndCancelDidCommitProvisionalLoad return intercepted_requests_; } + std::vector& + intercepted_broker_content_requests() { + return intercepted_broker_content_requests_; + } + + std::vector& + intercepted_broker_blink_requests() { + return intercepted_broker_blink_requests_; + } + protected: bool WillDispatchDidCommitProvisionalLoad( RenderFrameHost* render_frame_host, ::FrameHostMsg_DidCommitProvisionalLoad_Params* params, - service_manager::mojom::InterfaceProviderRequest* - interface_provider_request) override { + mojom::DidCommitProvisionalLoadInterfaceParamsPtr& interface_params) + override { intercepted_messages_.push_back(*params); - intercepted_requests_.push_back(std::move(*interface_provider_request)); + intercepted_requests_.push_back( + std::move(interface_params->interface_provider_request)); + intercepted_broker_content_requests_.push_back( + std::move(interface_params->document_interface_broker_content_request)); + intercepted_broker_blink_requests_.push_back( + std::move(interface_params->document_interface_broker_blink_request)); if (loop_) loop_->Quit(); // Do not send the message to the RenderFrameHostImpl. @@ -106,6 +121,10 @@ class InterceptAndCancelDidCommitProvisionalLoad intercepted_messages_; std::vector<::service_manager::mojom::InterfaceProviderRequest> intercepted_requests_; + std::vector + intercepted_broker_content_requests_; + std::vector + intercepted_broker_blink_requests_; std::unique_ptr loop_; }; @@ -1193,7 +1212,10 @@ IN_PROC_BROWSER_TEST_F(NavigationBrowserTest, render_frame_host->DidCommitProvisionalLoadForTesting( std::make_unique<::FrameHostMsg_DidCommitProvisionalLoad_Params>( interceptor.intercepted_messages()[0]), - std::move(interceptor.intercepted_requests()[0])); + mojom::DidCommitProvisionalLoadInterfaceParams::New( + std::move(interceptor.intercepted_requests()[0]), + std::move(interceptor.intercepted_broker_content_requests()[0]), + std::move(interceptor.intercepted_broker_blink_requests()[0]))); recorder.WaitForEvents(5); EXPECT_EQ(5u, recorder.records().size()); EXPECT_STREQ("did-commit /infinite_load_1.html", @@ -1206,7 +1228,10 @@ IN_PROC_BROWSER_TEST_F(NavigationBrowserTest, render_frame_host->DidCommitProvisionalLoadForTesting( std::make_unique<::FrameHostMsg_DidCommitProvisionalLoad_Params>( interceptor.intercepted_messages()[1]), - std::move(interceptor.intercepted_requests()[1])); + mojom::DidCommitProvisionalLoadInterfaceParams::New( + std::move(interceptor.intercepted_requests()[1]), + std::move(interceptor.intercepted_broker_content_requests()[1]), + std::move(interceptor.intercepted_broker_blink_requests()[1]))); recorder.WaitForEvents(6); EXPECT_EQ(6u, recorder.records().size()); EXPECT_STREQ("did-commit /infinite_load_2.html", diff --git a/content/browser/portal/portal.cc b/content/browser/portal/portal.cc index 95fd56803e93ca..4be1bc32817849 100644 --- a/content/browser/portal/portal.cc +++ b/content/browser/portal/portal.cc @@ -57,14 +57,21 @@ RenderFrameProxyHost* Portal::CreateProxyAndAttachPortal() { service_manager::mojom::InterfaceProviderPtr interface_provider; auto interface_provider_request(mojo::MakeRequest(&interface_provider)); + blink::mojom::DocumentInterfaceBrokerPtrInfo + document_interface_broker_content; + blink::mojom::DocumentInterfaceBrokerPtrInfo document_interface_broker_blink; + // Create a FrameTreeNode in the outer WebContents to host the portal, in // response to the creation of a portal in the renderer process. FrameTreeNode* outer_node = outer_contents_impl->GetFrameTree()->AddFrame( owner_render_frame_host_->frame_tree_node(), owner_render_frame_host_->GetProcess()->GetID(), owner_render_frame_host_->GetProcess()->GetNextRoutingID(), - std::move(interface_provider_request), blink::WebTreeScopeType::kDocument, - "", "", true, base::UnguessableToken::Create(), blink::FramePolicy(), + std::move(interface_provider_request), + mojo::MakeRequest(&document_interface_broker_content), + mojo::MakeRequest(&document_interface_broker_blink), + blink::WebTreeScopeType::kDocument, "", "", true, + base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), false, blink::FrameOwnerElementType::kPortal); // Create the Portal WebContents. diff --git a/content/browser/renderer_host/render_process_host_unittest.cc b/content/browser/renderer_host/render_process_host_unittest.cc index 8f743ff8c8673c..7422cc8ab3bac1 100644 --- a/content/browser/renderer_host/render_process_host_unittest.cc +++ b/content/browser/renderer_host/render_process_host_unittest.cc @@ -132,6 +132,8 @@ TEST_F(RenderProcessHostUnitTest, ReuseCommittedSite) { main_test_rfh()->OnCreateChildFrame( process()->GetNextRoutingID(), TestRenderFrameHost::CreateStubInterfaceProviderRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), + TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, std::string(), unique_name, false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), blink::FrameOwnerElementType::kIframe); diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index 8befe9b350bb93..64191624452f3e 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc @@ -345,8 +345,15 @@ bool RenderViewHostImpl::CreateRenderView( params->main_frame_routing_id = main_frame_routing_id_; params->main_frame_widget_routing_id = render_widget_host_->GetRoutingID(); if (main_rfh) { - main_rfh->BindInterfaceProviderRequest( - mojo::MakeRequest(¶ms->main_frame_interface_provider)); + params->main_frame_interface_bundle = + mojom::DocumentScopedInterfaceBundle::New(); + main_rfh->BindInterfaceProviderRequest(mojo::MakeRequest( + ¶ms->main_frame_interface_bundle->interface_provider)); + main_rfh->BindDocumentInterfaceBrokerRequest( + mojo::MakeRequest(¶ms->main_frame_interface_bundle + ->document_interface_broker_content), + mojo::MakeRequest(¶ms->main_frame_interface_bundle + ->document_interface_broker_blink)); RenderWidgetHostImpl* main_rwh = main_rfh->GetRenderWidgetHost(); params->main_frame_widget_routing_id = main_rwh->GetRoutingID(); } diff --git a/content/browser/renderer_host/render_widget_host_view_browsertest.cc b/content/browser/renderer_host/render_widget_host_view_browsertest.cc index ef610dbcb71c52..4e96ec991068c6 100644 --- a/content/browser/renderer_host/render_widget_host_view_browsertest.cc +++ b/content/browser/renderer_host/render_widget_host_view_browsertest.cc @@ -155,8 +155,8 @@ class CommitBeforeSwapAckSentHelper bool WillDispatchDidCommitProvisionalLoad( RenderFrameHost* render_frame_host, ::FrameHostMsg_DidCommitProvisionalLoad_Params* params, - service_manager::mojom::InterfaceProviderRequest* - interface_provider_request) override { + mojom::DidCommitProvisionalLoadInterfaceParamsPtr& interface_params) + override { base::MessageLoopCurrent::ScopedNestableTaskAllower allow; frame_observer_->WaitForAnyFrameSubmission(); return true; diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc index 89b37840f496b4..c2a7ac0c03da5e 100644 --- a/content/browser/security_exploit_browsertest.cc +++ b/content/browser/security_exploit_browsertest.cc @@ -657,46 +657,46 @@ IN_PROC_BROWSER_TEST_F(SecurityExploitBrowserTest, MismatchedOriginOnCommit) { namespace { -// Interceptor that replaces |interface_provider_request| with the specified +// Interceptor that replaces |interface_params| with the specified // value for the first DidCommitProvisionalLoad message it observes in the given // |web_contents| while in scope. -class ScopedInterfaceProviderRequestReplacer +class ScopedInterfaceParamsReplacer : public DidCommitProvisionalLoadInterceptor { public: - ScopedInterfaceProviderRequestReplacer( + ScopedInterfaceParamsReplacer( WebContents* web_contents, - service_manager::mojom::InterfaceProviderRequest - interface_provider_request_override) + mojom::DidCommitProvisionalLoadInterfaceParamsPtr params_override) : DidCommitProvisionalLoadInterceptor(web_contents), - interface_provider_request_override_( - std::move(interface_provider_request_override)) {} - ~ScopedInterfaceProviderRequestReplacer() override = default; + params_override_(std::move(params_override)) {} + ~ScopedInterfaceParamsReplacer() override = default; protected: bool WillDispatchDidCommitProvisionalLoad( RenderFrameHost* render_frame_host, ::FrameHostMsg_DidCommitProvisionalLoad_Params* params, - service_manager::mojom::InterfaceProviderRequest* - interface_provider_request) override { - CHECK(interface_provider_request_override_.has_value()); - *interface_provider_request = - std::move(interface_provider_request_override_).value(); + mojom::DidCommitProvisionalLoadInterfaceParamsPtr& interface_params) + override { + interface_params.Swap(¶ms_override_); + return true; } private: - base::Optional - interface_provider_request_override_; + mojom::DidCommitProvisionalLoadInterfaceParamsPtr params_override_; - DISALLOW_COPY_AND_ASSIGN(ScopedInterfaceProviderRequestReplacer); + DISALLOW_COPY_AND_ASSIGN(ScopedInterfaceParamsReplacer); }; } // namespace -// Test that, as a general rule, not receiving a new InterfaceProviderRequest -// for a cross-document navigation properly terminates the renderer process. -// There is one exception to this rule, see: RenderFrameHostImplBrowserTest. +// Test that, as a general rule, not receiving new +// DidCommitProvisionalLoadInterfaceParamsPtr for a cross-document navigation +// properly terminates the renderer process. There is one exception to this +// rule, see: RenderFrameHostImplBrowserTest. // InterfaceProviderRequestIsOptionalForFirstCommit. +// TODO(crbug.com/718652): when all clients are converted to use +// DocumentInterfaceBroker, InterfaceProviderRequest-related code will be +// removed. IN_PROC_BROWSER_TEST_F(SecurityExploitBrowserTest, MissingInterfaceProviderOnNonSameDocumentCommit) { const GURL start_url(embedded_test_server()->GetURL("/title1.html")); @@ -709,8 +709,7 @@ IN_PROC_BROWSER_TEST_F(SecurityExploitBrowserTest, shell()->web_contents()->GetMainFrame()); RenderProcessHostKillWaiter kill_waiter(frame->GetProcess()); - ScopedInterfaceProviderRequestReplacer replacer(shell()->web_contents(), - nullptr); + ScopedInterfaceParamsReplacer replacer(shell()->web_contents(), nullptr); NavigateToURLAndExpectNoCommit(shell(), non_same_document_url); EXPECT_EQ(bad_message::RFH_INTERFACE_PROVIDER_MISSING, kill_waiter.Wait()); @@ -821,9 +820,17 @@ IN_PROC_BROWSER_TEST_F(SecurityExploitBrowserTest, PageStateToWrongEntry) { params->origin = url::Origin::Create(GURL("about:blank")); service_manager::mojom::InterfaceProviderPtr isolated_interface_provider; + blink::mojom::DocumentInterfaceBrokerPtr + isolated_document_interface_broker_content; + blink::mojom::DocumentInterfaceBrokerPtr + isolated_document_interface_broker_blink; static_cast(child0_0->current_frame_host()) ->DidCommitProvisionalLoad( - std::move(params), mojo::MakeRequest(&isolated_interface_provider)); + std::move(params), + mojom::DidCommitProvisionalLoadInterfaceParams::New( + mojo::MakeRequest(&isolated_interface_provider), + mojo::MakeRequest(&isolated_document_interface_broker_content), + mojo::MakeRequest(&isolated_document_interface_broker_blink))); // Make sure we haven't changed the FrameNavigationEntry. An attack would // modify the PageState but leave the SiteInstance as it was. diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index f98cf0e44f9f48..ad9b02f1d53a4b 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc @@ -6007,7 +6007,12 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, { mojom::CreateFrameParamsPtr params = mojom::CreateFrameParams::New(); params->routing_id = frame_routing_id; - mojo::MakeRequest(¶ms->interface_provider); + params->interface_bundle = mojom::DocumentScopedInterfaceBundle::New(); + mojo::MakeRequest(¶ms->interface_bundle->interface_provider); + mojo::MakeRequest( + ¶ms->interface_bundle->document_interface_broker_content); + mojo::MakeRequest( + ¶ms->interface_bundle->document_interface_broker_blink); params->proxy_routing_id = proxy_routing_id; params->opener_routing_id = IPC::mojom::kRoutingIdNone; params->parent_routing_id = @@ -6073,7 +6078,12 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, ParentDetachRemoteChild) { { mojom::CreateFrameParamsPtr params = mojom::CreateFrameParams::New(); params->routing_id = frame_routing_id; - mojo::MakeRequest(¶ms->interface_provider); + params->interface_bundle = mojom::DocumentScopedInterfaceBundle::New(); + mojo::MakeRequest(¶ms->interface_bundle->interface_provider); + mojo::MakeRequest( + ¶ms->interface_bundle->document_interface_broker_content); + mojo::MakeRequest( + ¶ms->interface_bundle->document_interface_broker_blink); params->proxy_routing_id = IPC::mojom::kRoutingIdNone; params->opener_routing_id = IPC::mojom::kRoutingIdNone; params->parent_routing_id = parent_routing_id; @@ -11565,8 +11575,8 @@ class CommitMessageOrderReverser : public DidCommitProvisionalLoadInterceptor { bool WillDispatchDidCommitProvisionalLoad( RenderFrameHost* render_frame_host, ::FrameHostMsg_DidCommitProvisionalLoad_Params* params, - service_manager::mojom::InterfaceProviderRequest* - interface_provider_request) override { + mojom::DidCommitProvisionalLoadInterfaceParamsPtr& interface_params) + override { // The DidCommitProvisionalLoad message is dispatched once this method // returns, so to defer committing the the navigation to |deferred_url_|, // run a nested message loop until the subsequent other commit message is @@ -12633,8 +12643,8 @@ class ClosePageBeforeCommitHelper : public DidCommitProvisionalLoadInterceptor { bool WillDispatchDidCommitProvisionalLoad( RenderFrameHost* render_frame_host, ::FrameHostMsg_DidCommitProvisionalLoad_Params* params, - service_manager::mojom::InterfaceProviderRequest* - interface_provider_request) override { + mojom::DidCommitProvisionalLoadInterfaceParamsPtr& interface_params) + override { RenderViewHostImpl* rvh = static_cast( render_frame_host->GetRenderViewHost()); EXPECT_TRUE(rvh->is_active()); @@ -14761,9 +14771,16 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, EXPECT_NE(another_url.host(), policy->GetOriginLock(process_id).host()); // Simulate a commit IPC. service_manager::mojom::InterfaceProviderPtr interface_provider; + blink::mojom::DocumentInterfaceBrokerPtrInfo + document_interface_broker_content; + blink::mojom::DocumentInterfaceBrokerPtrInfo document_interface_broker_blink; static_cast(root->current_frame_host()) - ->DidCommitProvisionalLoad(std::move(params), - mojo::MakeRequest(&interface_provider)); + ->DidCommitProvisionalLoad( + std::move(params), + mojom::DidCommitProvisionalLoadInterfaceParams::New( + mojo::MakeRequest(&interface_provider), + mojo::MakeRequest(&document_interface_broker_content), + mojo::MakeRequest(&document_interface_broker_blink))); // When the IPC message is received and validation fails, the process is // terminated. However, the notification for that should be processed in a diff --git a/content/browser/webauth/webauth_browsertest.cc b/content/browser/webauth/webauth_browsertest.cc index 37f09dfd4a872b..66d27a7fd34a9c 100644 --- a/content/browser/webauth/webauth_browsertest.cc +++ b/content/browser/webauth/webauth_browsertest.cc @@ -171,8 +171,8 @@ class ClosureExecutorBeforeNavigationCommit bool WillDispatchDidCommitProvisionalLoad( RenderFrameHost* render_frame_host, ::FrameHostMsg_DidCommitProvisionalLoad_Params* params, - service_manager::mojom::InterfaceProviderRequest* - interface_provider_request) override { + mojom::DidCommitProvisionalLoadInterfaceParamsPtr& interface_params) + override { if (closure_) std::move(closure_).Run(); return true; diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn index fb8d0975ece772..15ea1dfc0d2af7 100644 --- a/content/common/BUILD.gn +++ b/content/common/BUILD.gn @@ -481,6 +481,7 @@ mojom("mojo_bindings") { "associated_interfaces.mojom", "child.mojom", "child_control.mojom", + "document_scoped_interface_bundle.mojom", "field_trial_recorder.mojom", "frame.mojom", "frame_messages.mojom", diff --git a/content/common/document_scoped_interface_bundle.mojom b/content/common/document_scoped_interface_bundle.mojom new file mode 100644 index 00000000000000..81b28493dea9e4 --- /dev/null +++ b/content/common/document_scoped_interface_bundle.mojom @@ -0,0 +1,19 @@ +// Copyright 2018 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 content.mojom; + +import "services/service_manager/public/mojom/interface_provider.mojom"; +import "third_party/blink/public/mojom/frame/document_interface_broker.mojom"; + +struct DocumentScopedInterfaceBundle { + // The InterfaceProvider through which the main RenderFrame can access + // services exposed by its RenderFrameHost. + service_manager.mojom.InterfaceProvider interface_provider; + + // The DocumentInterfaceBroker through which the RenderFrame can access + // interfaces exposed by its RenderFrameHost + blink.mojom.DocumentInterfaceBroker document_interface_broker_content; + blink.mojom.DocumentInterfaceBroker document_interface_broker_blink; +}; diff --git a/content/common/frame.mojom b/content/common/frame.mojom index a92e669db97532..b54754479acacb 100644 --- a/content/common/frame.mojom +++ b/content/common/frame.mojom @@ -4,6 +4,7 @@ module content.mojom; +import "content/common/document_scoped_interface_bundle.mojom"; import "content/common/frame_messages.mojom"; import "content/common/navigation_client.mojom"; import "content/common/navigation_params.mojom"; @@ -18,6 +19,7 @@ import "services/network/public/mojom/url_loader_factory.mojom"; import "services/service_manager/public/mojom/interface_provider.mojom"; import "services/viz/public/interfaces/compositing/surface_id.mojom"; import "third_party/blink/public/mojom/blob/blob_url_store.mojom"; +import "third_party/blink/public/mojom/frame/document_interface_broker.mojom"; import "third_party/blink/public/mojom/feature_policy/feature_policy.mojom"; import "third_party/blink/public/mojom/frame/navigation_initiator.mojom"; import "third_party/blink/public/mojom/loader/url_loader_factory_bundle.mojom"; @@ -243,9 +245,7 @@ struct CreateNewWindowReply { // The ID of the widget for the main frame. int32 main_frame_widget_route_id; - // The InterfaceProvider through which the main RenderFrame can access - // services exposed by its RenderFrameHost. - service_manager.mojom.InterfaceProvider main_frame_interface_provider; + DocumentScopedInterfaceBundle main_frame_interface_bundle; // Duplicated from CreateNewWindowParams because legacy code. string cloned_session_storage_namespace_id; @@ -263,6 +263,12 @@ struct CreateNewWindowReply { // the frame is detached. Used by resource requests with "keepalive" specified. interface KeepAliveHandle {}; +struct DidCommitProvisionalLoadInterfaceParams { + service_manager.mojom.InterfaceProvider& interface_provider_request; + blink.mojom.DocumentInterfaceBroker& document_interface_broker_content_request; + blink.mojom.DocumentInterfaceBroker& document_interface_broker_blink_request; +}; + // Implemented by the frame server (i.e. the browser process). For messages that // must be associated with the IPC channel. interface FrameHost { @@ -283,22 +289,24 @@ interface FrameHost { IssueKeepAliveHandle(KeepAliveHandle& keep_alive_handle); // Sent by the renderer when a navigation commits in the frame. - // - // If |interface_provider_request| is non-empty, the FrameHost implementation - // must unbind the old InterfaceProvider connection, and drop any interface - // requests pending on it. Then it should bind |interface_provider_request| - // and start servicing GetInterface messages coming in on this new connection + + // If |interface_params| is non-empty, the FrameHost implementation + // must unbind the old InterfaceProvider and DocumentInterfaceBroker + // connections, and drop any interface requests pending on them. + // Then it should bind the appropriate requests and start servicing + // GetInterface messages coming in on these new connections // in a security context that is appropriate for the committed navigation. // - // The FrameHost implementation must enforce that |interface_provider_request| + // The FrameHost implementation must enforce that |interface_params| // is set for cross-document navigations. This prevents origin confusion by // ensuring that interface requests racing with navigation commit will be // either ignored, or serviced correctly in the security context of the // document they originated from (based on which InterfaceProvider connection - // the GetInterface messages arrive on). + // the GetInterface messages arrive on or DocumentInterfaceBroker + // connection the Get messages arrive on). DidCommitProvisionalLoad( DidCommitProvisionalLoadParams params, - service_manager.mojom.InterfaceProvider&? interface_provider_request); + DidCommitProvisionalLoadInterfaceParams? interface_params); // Sent by the renderer to indicate that a same document navigation // committed in the renderer process. diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h index da913e2a52dbc5..391aca4c487a3e 100644 --- a/content/common/frame_messages.h +++ b/content/common/frame_messages.h @@ -669,6 +669,14 @@ IPC_STRUCT_BEGIN(FrameHostMsg_CreateChildFrame_Params) IPC_STRUCT_MEMBER(blink::FrameOwnerElementType, frame_owner_element_type) IPC_STRUCT_END() +IPC_STRUCT_BEGIN(FrameHostMsg_CreateChildFrame_Params_Reply) + IPC_STRUCT_MEMBER(mojo::MessagePipeHandle, new_interface_provider) + IPC_STRUCT_MEMBER(mojo::MessagePipeHandle, + document_interface_broker_content_handle) + IPC_STRUCT_MEMBER(mojo::MessagePipeHandle, + document_interface_broker_blink_handle) +IPC_STRUCT_END() + IPC_STRUCT_TRAITS_BEGIN(content::CSPSource) IPC_STRUCT_TRAITS_MEMBER(scheme) IPC_STRUCT_TRAITS_MEMBER(host) @@ -1157,15 +1165,18 @@ IPC_MESSAGE_ROUTED4(FrameHostMsg_DidAddMessageToConsole, // // Each of these messages will have a corresponding FrameHostMsg_Detach message // sent when the frame is detached from the DOM. -// Note that |new_render_frame_id|, |new_interface_provider|, and -// |devtools_frame_token| are out parameters. Browser process defines them for -// the renderer process. -IPC_SYNC_MESSAGE_CONTROL1_3( - FrameHostMsg_CreateChildFrame, - FrameHostMsg_CreateChildFrame_Params, - int32_t, /* new_routing_id */ - mojo::MessagePipeHandle, /* new_interface_provider */ - base::UnguessableToken /* devtools_frame_token */) +// Note that |new_routing_id|, |params_reply|, and |devtools_frame_token| are +// out parameters. Browser process defines them for the renderer process. +// TODO(crbug.com/718652): move |new_routing_id| and |devtools_frame_token| into +// FrameHostMsg_CreateChildFrame_Params_Reply. +IPC_SYNC_MESSAGE_CONTROL1_3(FrameHostMsg_CreateChildFrame, + FrameHostMsg_CreateChildFrame_Params, + // new_routing_id + int32_t, + // params_reply + FrameHostMsg_CreateChildFrame_Params_Reply, + // devtools_frame_token + base::UnguessableToken) // Sent by the renderer to the parent RenderFrameHost when a child frame is // detached from the DOM. diff --git a/content/common/renderer.mojom b/content/common/renderer.mojom index 6fe1d0b948880f..8d4f05a21952e6 100644 --- a/content/common/renderer.mojom +++ b/content/common/renderer.mojom @@ -4,6 +4,7 @@ module content.mojom; +import "content/common/document_scoped_interface_bundle.mojom"; import "content/common/native_types.mojom"; import "content/common/service_worker/embedded_worker.mojom"; import "content/public/common/renderer_preferences.mojom"; @@ -11,7 +12,6 @@ import "ipc/constants.mojom"; import "mojo/public/mojom/base/time.mojom"; import "mojo/public/mojom/base/unguessable_token.mojom"; import "services/network/public/mojom/network_types.mojom"; -import "services/service_manager/public/mojom/interface_provider.mojom"; import "services/service_manager/public/mojom/service.mojom"; import "ui/gfx/geometry/mojo/geometry.mojom"; @@ -30,12 +30,9 @@ struct CreateViewParams { // set to something other than None. int32 main_frame_routing_id = IPC.mojom.kRoutingIdNone; - // The InterfaceProvider through which the main RenderFrame can access - // services exposed by its RenderFrameHost. - // // This is null precisely when |main_frame_routing_id| is MSG_ROUTING_NONE, // that is, when creating a RenderView for a remote main frame. - service_manager.mojom.InterfaceProvider? main_frame_interface_provider; + DocumentScopedInterfaceBundle? main_frame_interface_bundle; // The ID of the widget for the main frame. int32 main_frame_widget_routing_id = IPC.mojom.kRoutingIdNone; @@ -119,9 +116,7 @@ struct CreateFrameParams { // parent frame, in front of any other children. int32 previous_sibling_routing_id; - // The InterfaceProvider through which the RenderFrame can access services - // exposed by its RenderFrameHost. - service_manager.mojom.InterfaceProvider interface_provider; + DocumentScopedInterfaceBundle interface_bundle; // When the new frame has a parent, |replication_state| holds the new frame's // properties replicated from the process rendering the parent frame, such as diff --git a/content/public/renderer/render_frame.h b/content/public/renderer/render_frame.h index 45d3215921f420..95179687307fdb 100644 --- a/content/public/renderer/render_frame.h +++ b/content/public/renderer/render_frame.h @@ -20,6 +20,7 @@ #include "ppapi/buildflags/buildflags.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" #include "services/service_manager/public/cpp/binder_registry.h" +#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/public/web/web_navigation_policy.h" #include "third_party/blink/public/web/web_triggering_event_info.h" @@ -164,6 +165,11 @@ class CONTENT_EXPORT RenderFrame : public IPC::Listener, // interfaces exposed to it by the application running in this frame. virtual service_manager::InterfaceProvider* GetRemoteInterfaces() = 0; + // Returns the DocumentInterfaceBroker that this process can use to bind + // interfaces exposed to it by the application running in this frame. + virtual blink::mojom::DocumentInterfaceBroker* + GetDocumentInterfaceBroker() = 0; + // Returns the AssociatedInterfaceRegistry this frame can use to expose // frame-specific Channel-associated interfaces to the remote RenderFrameHost. virtual blink::AssociatedInterfaceRegistry* diff --git a/content/public/test/browser_test_utils.cc b/content/public/test/browser_test_utils.cc index 17104263ac2ff8..285c58214bf8a6 100644 --- a/content/public/test/browser_test_utils.cc +++ b/content/public/test/browser_test_utils.cc @@ -556,8 +556,8 @@ class CommitOriginInterceptor : public DidCommitProvisionalLoadInterceptor { bool WillDispatchDidCommitProvisionalLoad( RenderFrameHost* render_frame_host, ::FrameHostMsg_DidCommitProvisionalLoad_Params* params, - service_manager::mojom::InterfaceProviderRequest* - interface_provider_request) override { + mojom::DidCommitProvisionalLoadInterfaceParamsPtr& interface_params) + override { if (params->url == target_url_) { params->url = new_url_; params->origin = new_origin_; diff --git a/content/public/test/mock_render_thread.cc b/content/public/test/mock_render_thread.cc index d4e82c11f71528..c0869e488c2522 100644 --- a/content/public/test/mock_render_thread.cc +++ b/content/public/test/mock_render_thread.cc @@ -273,6 +273,18 @@ MockRenderThread::TakeInitialInterfaceProviderRequestForFrame( return interface_provider_request; } +blink::mojom::DocumentInterfaceBrokerRequest +MockRenderThread::TakeInitialDocumentInterfaceBrokerRequestForFrame( + int32_t routing_id) { + auto it = + frame_routing_id_to_initial_document_broker_requests_.find(routing_id); + if (it == frame_routing_id_to_initial_document_broker_requests_.end()) + return nullptr; + auto document_broker_request = std::move(it->second); + frame_routing_id_to_initial_document_broker_requests_.erase(it); + return document_broker_request; +} + void MockRenderThread::PassInitialInterfaceProviderRequestForFrame( int32_t routing_id, service_manager::mojom::InterfaceProviderRequest @@ -288,14 +300,26 @@ void MockRenderThread::PassInitialInterfaceProviderRequestForFrame( void MockRenderThread::OnCreateChildFrame( const FrameHostMsg_CreateChildFrame_Params& params, int* new_render_frame_id, - mojo::MessagePipeHandle* new_interface_provider, + FrameHostMsg_CreateChildFrame_Params_Reply* params_reply, base::UnguessableToken* devtools_frame_token) { *new_render_frame_id = GetNextRoutingID(); service_manager::mojom::InterfaceProviderPtr interface_provider; frame_routing_id_to_initial_interface_provider_requests_.emplace( *new_render_frame_id, mojo::MakeRequest(&interface_provider)); - *new_interface_provider = + params_reply->new_interface_provider = interface_provider.PassInterface().PassHandle().release(); + + blink::mojom::DocumentInterfaceBrokerPtr document_interface_broker; + frame_routing_id_to_initial_document_broker_requests_.emplace( + *new_render_frame_id, mojo::MakeRequest(&document_interface_broker)); + params_reply->document_interface_broker_content_handle = + document_interface_broker.PassInterface().PassHandle().release(); + + blink::mojom::DocumentInterfaceBrokerPtr document_interface_broker_blink; + mojo::MakeRequest(&document_interface_broker_blink); + params_reply->document_interface_broker_blink_handle = + document_interface_broker_blink.PassInterface().PassHandle().release(); + *devtools_frame_token = base::UnguessableToken::Create(); } @@ -335,9 +359,23 @@ void MockRenderThread::OnCreateWindow( mojom::CreateNewWindowReply* reply) { reply->route_id = GetNextRoutingID(); reply->main_frame_route_id = GetNextRoutingID(); + reply->main_frame_interface_bundle = + mojom::DocumentScopedInterfaceBundle::New(); frame_routing_id_to_initial_interface_provider_requests_.emplace( reply->main_frame_route_id, - mojo::MakeRequest(&reply->main_frame_interface_provider)); + mojo::MakeRequest( + &reply->main_frame_interface_bundle->interface_provider)); + + blink::mojom::DocumentInterfaceBrokerPtrInfo document_interface_broker; + frame_routing_id_to_initial_document_broker_requests_.emplace( + reply->main_frame_route_id, + mojo::MakeRequest(&document_interface_broker)); + reply->main_frame_interface_bundle->document_interface_broker_content = + std::move(document_interface_broker); + + mojo::MakeRequest(&document_interface_broker); + reply->main_frame_interface_bundle->document_interface_broker_blink = + std::move(document_interface_broker); reply->main_frame_widget_route_id = GetNextRoutingID(); reply->cloned_session_storage_namespace_id = blink::AllocateSessionStorageNamespaceId(); diff --git a/content/public/test/mock_render_thread.h b/content/public/test/mock_render_thread.h index d327be95a6e1de..8b800217439f11 100644 --- a/content/public/test/mock_render_thread.h +++ b/content/public/test/mock_render_thread.h @@ -18,8 +18,10 @@ #include "ipc/ipc_test_sink.h" #include "ipc/message_filter.h" #include "services/service_manager/public/mojom/connector.mojom.h" +#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom.h" struct FrameHostMsg_CreateChildFrame_Params; +struct FrameHostMsg_CreateChildFrame_Params_Reply; namespace IPC { class MessageFilter; @@ -111,10 +113,17 @@ class MockRenderThread : public RenderThread { // Returns the request end of the InterfaceProvider interface whose client end // was passed in to construct RenderFrame with |routing_id|; if any. The // client end will be used by the RenderFrame to service interface requests - // originating from the original the initial empty document. + // originating from the initial empty document. service_manager::mojom::InterfaceProviderRequest TakeInitialInterfaceProviderRequestForFrame(int32_t routing_id); + // Returns the request end of the DocumentInterfaceBroker interface whose + // client end was passed in to construct RenderFrame with |routing_id|; if + // any. The client end will be used by the RenderFrame to service interface + // requests originating from the initial empty document. + blink::mojom::DocumentInterfaceBrokerRequest + TakeInitialDocumentInterfaceBrokerRequestForFrame(int32_t routing_id); + // Called from the RenderViewTest harness to supply the request end of the // InterfaceProvider interface connection that the harness used to service the // initial empty document in the RenderFrame with |routing_id|. @@ -129,10 +138,11 @@ class MockRenderThread : public RenderThread { virtual bool OnMessageReceived(const IPC::Message& msg); // The Frame expects to be returned a valid route_id different from its own. - void OnCreateChildFrame(const FrameHostMsg_CreateChildFrame_Params& params, - int* new_render_frame_id, - mojo::MessagePipeHandle* new_interface_provider, - base::UnguessableToken* devtools_frame_token); + void OnCreateChildFrame( + const FrameHostMsg_CreateChildFrame_Params& params, + int* new_render_frame_id, + FrameHostMsg_CreateChildFrame_Params_Reply* params_reply, + base::UnguessableToken* devtools_frame_token); #if defined(OS_WIN) void OnDuplicateSection(base::SharedMemoryHandle renderer_handle, @@ -147,6 +157,9 @@ class MockRenderThread : public RenderThread { std::map frame_routing_id_to_initial_interface_provider_requests_; + std::map + frame_routing_id_to_initial_document_broker_requests_; + // The last known good deserializer for sync messages. std::unique_ptr reply_deserializer_; diff --git a/content/public/test/navigation_simulator.cc b/content/public/test/navigation_simulator.cc index 0c4a355a3169d1..5df85f3cd59258 100644 --- a/content/public/test/navigation_simulator.cc +++ b/content/public/test/navigation_simulator.cc @@ -280,6 +280,14 @@ NavigationSimulator::NavigationSimulator(const GURL& original_url, service_manager::mojom::InterfaceProviderPtr stub_interface_provider; interface_provider_request_ = mojo::MakeRequest(&stub_interface_provider); + + blink::mojom::DocumentInterfaceBrokerPtr + stub_document_interface_broker_content; + document_interface_broker_content_request_ = + mojo::MakeRequest(&stub_document_interface_broker_content); + blink::mojom::DocumentInterfaceBrokerPtr stub_document_interface_broker_blink; + document_interface_broker_blink_request_ = + mojo::MakeRequest(&stub_document_interface_broker_blink); } NavigationSimulator::~NavigationSimulator() {} @@ -532,11 +540,16 @@ void NavigationSimulator::Commit() { navigation_url_, params.item_sequence_number, params.document_sequence_number); - if (same_document_) + if (same_document_) { interface_provider_request_ = nullptr; + document_interface_broker_content_request_ = nullptr; + document_interface_broker_blink_request_ = nullptr; + } render_frame_host_->SendNavigateWithParamsAndInterfaceProvider( - ¶ms, std::move(interface_provider_request_), same_document_); + ¶ms, std::move(interface_provider_request_), + std::move(document_interface_broker_content_request_), + std::move(document_interface_broker_blink_request_), same_document_); // Simulate the UnloadACK in the old RenderFrameHost if it was swapped out at // commit time. @@ -670,6 +683,8 @@ void NavigationSimulator::CommitErrorPage() { render_frame_host_->SendNavigateWithParamsAndInterfaceProvider( ¶ms, std::move(interface_provider_request_), + std::move(document_interface_broker_content_request_), + std::move(document_interface_broker_blink_request_), false /* was_same_document */); // Simulate the UnloadACK in the old RenderFrameHost if it was swapped out at @@ -713,8 +728,16 @@ void NavigationSimulator::CommitSameDocument() { PageState::CreateForTesting(navigation_url_, false, nullptr, nullptr); interface_provider_request_ = nullptr; + document_interface_broker_content_request_ = nullptr; + document_interface_broker_blink_request_ = nullptr; render_frame_host_->SendNavigateWithParamsAndInterfaceProvider( - ¶ms, nullptr /* interface_provider_request */, true); + ¶ms, + // interface_provider_request + nullptr, + // document_interface_broker_content_handle + nullptr, + // document_interface_broker_blink_handle + nullptr, true); // Same-document commits should never hit network-related stages of committing // a navigation. diff --git a/content/public/test/navigation_simulator.h b/content/public/test/navigation_simulator.h index 2df0ade60634f0..2924b9a46b92a9 100644 --- a/content/public/test/navigation_simulator.h +++ b/content/public/test/navigation_simulator.h @@ -18,6 +18,7 @@ #include "mojo/public/cpp/bindings/associated_interface_request.h" #include "net/base/host_port_pair.h" #include "services/service_manager/public/cpp/interface_provider.h" +#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom.h" #include "ui/base/page_transition_types.h" class GURL; @@ -401,6 +402,10 @@ class NavigationSimulator : public WebContentsObserver { int session_history_offset_ = 0; bool has_user_gesture_ = true; service_manager::mojom::InterfaceProviderRequest interface_provider_request_; + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_content_request_; + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_blink_request_; std::string contents_mime_type_; bool auto_advance_ = true; diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc index ef1334cf7225ff..1ae6e886599658 100644 --- a/content/public/test/render_view_test.cc +++ b/content/public/test/render_view_test.cc @@ -348,9 +348,20 @@ void RenderViewTest::SetUp() { view_params->main_frame_widget_routing_id = render_thread_->GetNextRoutingID(); view_params->main_frame_routing_id = render_thread_->GetNextRoutingID(); + view_params->main_frame_interface_bundle = + mojom::DocumentScopedInterfaceBundle::New(); render_thread_->PassInitialInterfaceProviderRequestForFrame( view_params->main_frame_routing_id, - mojo::MakeRequest(&view_params->main_frame_interface_provider)); + mojo::MakeRequest( + &view_params->main_frame_interface_bundle->interface_provider)); + + blink::mojom::DocumentInterfaceBrokerPtrInfo info; + mojo::MakeRequest(&info); + view_params->main_frame_interface_bundle->document_interface_broker_content = + std::move(info); + mojo::MakeRequest(&info); + view_params->main_frame_interface_bundle->document_interface_broker_blink = + std::move(info); view_params->session_storage_namespace_id = blink::AllocateSessionStorageNamespaceId(); view_params->replicated_frame_state = FrameReplicationState(); diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 10ae35cf4a027c..39b2f6ee71c739 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc @@ -1236,9 +1236,11 @@ RenderFrameImpl* RenderFrameImpl::Create( RenderViewImpl* render_view, int32_t routing_id, service_manager::mojom::InterfaceProviderPtr interface_provider, + blink::mojom::DocumentInterfaceBrokerPtr document_interface_broker_content, const base::UnguessableToken& devtools_frame_token) { DCHECK(routing_id != MSG_ROUTING_NONE); CreateParams params(render_view, routing_id, std::move(interface_provider), + std::move(document_interface_broker_content), devtools_frame_token); if (g_create_render_frame_impl) @@ -1265,6 +1267,8 @@ RenderFrameImpl* RenderFrameImpl::CreateMainFrame( RenderViewImpl* render_view, int32_t routing_id, service_manager::mojom::InterfaceProviderPtr interface_provider, + blink::mojom::DocumentInterfaceBrokerPtr document_interface_broker_content, + blink::mojom::DocumentInterfaceBrokerPtr document_interface_broker_blink, int32_t widget_routing_id, bool hidden, const ScreenInfo& screen_info, @@ -1278,11 +1282,12 @@ RenderFrameImpl* RenderFrameImpl::CreateMainFrame( RenderFrameImpl* render_frame = RenderFrameImpl::Create( render_view, routing_id, std::move(interface_provider), - devtools_frame_token); + std::move(document_interface_broker_content), devtools_frame_token); render_frame->InitializeBlameContext(nullptr); WebLocalFrame* web_frame = WebLocalFrame::CreateMainFrame( render_view->webview(), render_frame, - render_frame->blink_interface_registry_.get(), opener, + render_frame->blink_interface_registry_.get(), + document_interface_broker_blink.PassInterface().PassHandle(), opener, // This conversion is a little sad, as this often comes from a // WebString... WebString::FromUTF8(replicated_state.name), @@ -1318,6 +1323,8 @@ RenderFrameImpl* RenderFrameImpl::CreateMainFrame( void RenderFrameImpl::CreateFrame( int routing_id, service_manager::mojom::InterfaceProviderPtr interface_provider, + blink::mojom::DocumentInterfaceBrokerPtr document_interface_broker_content, + blink::mojom::DocumentInterfaceBrokerPtr document_interface_broker_blink, int proxy_routing_id, int opener_routing_id, int parent_routing_id, @@ -1359,7 +1366,7 @@ void RenderFrameImpl::CreateFrame( // Create the RenderFrame and WebLocalFrame, linking the two. render_frame = RenderFrameImpl::Create( parent_proxy->render_view(), routing_id, std::move(interface_provider), - devtools_frame_token); + std::move(document_interface_broker_content), devtools_frame_token); render_frame->InitializeBlameContext(FromRoutingID(parent_routing_id)); render_frame->unique_name_helper_.set_propagated_name( replicated_state.unique_name); @@ -1367,6 +1374,7 @@ void RenderFrameImpl::CreateFrame( replicated_state.scope, WebString::FromUTF8(replicated_state.name), replicated_state.frame_policy.sandbox_flags, render_frame, render_frame->blink_interface_registry_.get(), + document_interface_broker_blink.PassInterface().PassHandle(), previous_sibling_web_frame, replicated_state.frame_policy.container_policy, ConvertFrameOwnerPropertiesToWebFrameOwnerProperties( @@ -1395,14 +1403,15 @@ void RenderFrameImpl::CreateFrame( const bool proxy_is_main_frame = !proxy->web_frame()->Parent(); render_view = proxy->render_view(); - render_frame = RenderFrameImpl::Create(render_view, routing_id, - std::move(interface_provider), - devtools_frame_token); + render_frame = RenderFrameImpl::Create( + render_view, routing_id, std::move(interface_provider), + std::move(document_interface_broker_content), devtools_frame_token); render_frame->InitializeBlameContext(nullptr); render_frame->proxy_routing_id_ = proxy_routing_id; proxy->set_provisional_frame_routing_id(routing_id); web_frame = blink::WebLocalFrame::CreateProvisional( render_frame, render_frame->blink_interface_registry_.get(), + document_interface_broker_blink.PassInterface().PassHandle(), proxy->web_frame(), replicated_state.frame_policy.sandbox_flags, replicated_state.frame_policy.container_policy); // The new |web_frame| is a main frame iff the proxy's frame was. @@ -1630,10 +1639,13 @@ RenderFrameImpl::CreateParams::CreateParams( RenderViewImpl* render_view, int32_t routing_id, service_manager::mojom::InterfaceProviderPtr interface_provider, + blink::mojom::DocumentInterfaceBrokerPtr document_interface_broker_content, const base::UnguessableToken& devtools_frame_token) : render_view(render_view), routing_id(routing_id), interface_provider(std::move(interface_provider)), + document_interface_broker_content( + std::move(document_interface_broker_content)), devtools_frame_token(devtools_frame_token) {} RenderFrameImpl::CreateParams::~CreateParams() = default; RenderFrameImpl::CreateParams::CreateParams(CreateParams&&) = default; @@ -1691,6 +1703,12 @@ RenderFrameImpl::RenderFrameImpl(CreateParams params) blink_interface_registry_.reset(new BlinkInterfaceRegistryImpl( registry_.GetWeakPtr(), associated_interfaces_.GetWeakPtr())); + // The DocumentInterfaceBroker to access Mojo services exposed by the RFHI + // must be provided at construction time. See: https://crbug.com/718652/. + CHECK(params.document_interface_broker_content.is_bound()); + document_interface_broker_ = + std::move(params.document_interface_broker_content); + // Must call after binding our own remote interfaces. media_factory_.SetupMojo(); @@ -2997,6 +3015,12 @@ service_manager::InterfaceProvider* RenderFrameImpl::GetRemoteInterfaces() { return &remote_interfaces_; } +blink::mojom::DocumentInterfaceBroker* +RenderFrameImpl::GetDocumentInterfaceBroker() { + DCHECK(document_interface_broker_.is_bound()); + return document_interface_broker_.get(); +} + blink::AssociatedInterfaceRegistry* RenderFrameImpl::GetAssociatedInterfaceRegistry() { return &associated_interfaces_; @@ -3882,9 +3906,9 @@ blink::WebLocalFrame* RenderFrameImpl::CreateChildFrame( // Synchronously notify the browser of a child frame creation to get the // routing_id for the RenderFrame. int child_routing_id = MSG_ROUTING_NONE; - mojo::MessagePipeHandle child_interface_provider_handle; base::UnguessableToken devtools_frame_token; FrameHostMsg_CreateChildFrame_Params params; + FrameHostMsg_CreateChildFrame_Params_Reply params_reply; params.parent_routing_id = routing_id_; params.scope = scope; params.frame_name = name.Utf8(); @@ -3913,8 +3937,7 @@ blink::WebLocalFrame* RenderFrameImpl::CreateChildFrame( frame_owner_properties); params.frame_owner_element_type = frame_owner_element_type; Send(new FrameHostMsg_CreateChildFrame(params, &child_routing_id, - &child_interface_provider_handle, - &devtools_frame_token)); + ¶ms_reply, &devtools_frame_token)); // Allocation of routing id failed, so we can't create a child frame. This can // happen if the synchronous IPC message above has failed. This can @@ -3923,11 +3946,31 @@ blink::WebLocalFrame* RenderFrameImpl::CreateChildFrame( if (child_routing_id == MSG_ROUTING_NONE) return nullptr; - CHECK(child_interface_provider_handle.is_valid()); + DCHECK(params_reply.new_interface_provider.is_valid()); service_manager::mojom::InterfaceProviderPtr child_interface_provider; child_interface_provider.Bind( service_manager::mojom::InterfaceProviderPtrInfo( - mojo::ScopedMessagePipeHandle(child_interface_provider_handle), 0u), + mojo::ScopedMessagePipeHandle(params_reply.new_interface_provider), + 0u), + GetTaskRunner(blink::TaskType::kInternalIPC)); + + DCHECK(params_reply.document_interface_broker_content_handle.is_valid()); + DCHECK(params_reply.document_interface_broker_blink_handle.is_valid()); + + blink::mojom::DocumentInterfaceBrokerPtr document_interface_broker_content; + document_interface_broker_content.Bind( + blink::mojom::DocumentInterfaceBrokerPtrInfo( + mojo::ScopedMessagePipeHandle( + params_reply.document_interface_broker_content_handle), + blink::mojom::DocumentInterfaceBroker::Version_), + GetTaskRunner(blink::TaskType::kInternalIPC)); + + blink::mojom::DocumentInterfaceBrokerPtr document_interface_broker_blink; + document_interface_broker_blink.Bind( + blink::mojom::DocumentInterfaceBrokerPtrInfo( + mojo::ScopedMessagePipeHandle( + params_reply.document_interface_broker_blink_handle), + blink::mojom::DocumentInterfaceBroker::Version_), GetTaskRunner(blink::TaskType::kInternalIPC)); // This method is always called by local frames, never remote frames. @@ -3941,7 +3984,7 @@ blink::WebLocalFrame* RenderFrameImpl::CreateChildFrame( // Create the RenderFrame and WebLocalFrame, linking the two. RenderFrameImpl* child_render_frame = RenderFrameImpl::Create( render_view_, child_routing_id, std::move(child_interface_provider), - devtools_frame_token); + std::move(document_interface_broker_content), devtools_frame_token); child_render_frame->unique_name_helper_.set_propagated_name( params.frame_unique_name); if (params.is_created_by_script) @@ -3949,7 +3992,8 @@ blink::WebLocalFrame* RenderFrameImpl::CreateChildFrame( child_render_frame->InitializeBlameContext(this); blink::WebLocalFrame* web_frame = parent->CreateLocalChild( scope, child_render_frame, - child_render_frame->blink_interface_registry_.get()); + child_render_frame->blink_interface_registry_.get(), + document_interface_broker_blink.PassInterface().PassHandle()); child_render_frame->in_frame_tree_ = true; child_render_frame->Initialize(); @@ -4255,7 +4299,8 @@ void RenderFrameImpl::DidStartProvisionalLoad( void RenderFrameImpl::DidCommitProvisionalLoad( const blink::WebHistoryItem& item, blink::WebHistoryCommitType commit_type, - blink::WebGlobalObjectReusePolicy global_object_reuse_policy) { + blink::WebGlobalObjectReusePolicy global_object_reuse_policy, + mojo::ScopedMessagePipeHandle document_interface_broker_blink_handle) { TRACE_EVENT2("navigation,rail", "RenderFrameImpl::didCommitProvisionalLoad", "id", routing_id_, "url", GetLoadingUrl().possibly_invalid_spec()); @@ -4341,8 +4386,16 @@ void RenderFrameImpl::DidCommitProvisionalLoad( service_manager::mojom::InterfaceProviderRequest remote_interface_provider_request; - if (global_object_reuse_policy != - blink::WebGlobalObjectReusePolicy::kUseExisting) { + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_request; + + // TODO(crbug.com/718652): check whether + // |document_interface_broker_blink_handle| is valid instead and remove the + // |global_object_reuse_policy| parameter. + bool reuse_existing_interfaces = + (global_object_reuse_policy == + blink::WebGlobalObjectReusePolicy::kUseExisting); + if (!reuse_existing_interfaces) { // If we're navigating to a new document, bind |remote_interfaces_| to a new // message pipe. The request end of the new InterfaceProvider interface will // be sent over as part of DidCommitProvisionalLoad. After the RFHI receives @@ -4359,6 +4412,21 @@ void RenderFrameImpl::DidCommitProvisionalLoad( remote_interfaces_.Close(); remote_interfaces_.Bind(std::move(interfaces_provider)); + // If we're navigating to a new document, bind |document_interface_broker_| + // to a new message pipe. The request end of the new DocumentInterfaceBroker + // interface will be sent over as part of DidCommitProvisionalLoad. After + // the RFHI receives the commit confirmation, it will immediately close the + // old message pipe to avoid Get calls racing with navigation + // commit, and bind the request end of the message pipe created here. Must + // initialize |document_interface_broker_| with a new working pipe *before* + // observers receive DidCommitProvisionalLoad, so they can already request + // remote interfaces. The interface requests will be serviced once the + // DocumentInterfaceBroker interface request is bound by the + // RenderFrameHostImpl. + document_interface_broker_.reset(); + document_interface_broker_request = + mojo::MakeRequest(&document_interface_broker_); + // AudioOutputIPCFactory may be null in tests. if (auto* factory = AudioOutputIPCFactory::get()) { // The RendererAudioOutputStreamFactory must be readily accessible on the @@ -4390,9 +4458,16 @@ void RenderFrameImpl::DidCommitProvisionalLoad( ui::PageTransition transition = GetTransitionType(frame_->GetDocumentLoader(), frame_, true /* loading */); - DidCommitNavigationInternal(item, commit_type, - false /* was_within_same_document */, transition, - std::move(remote_interface_provider_request)); + + DidCommitNavigationInternal( + item, commit_type, false /* was_within_same_document */, transition, + reuse_existing_interfaces + ? nullptr + : mojom::DidCommitProvisionalLoadInterfaceParams::New( + std::move(remote_interface_provider_request), + std::move(document_interface_broker_request), + blink::mojom::DocumentInterfaceBrokerRequest( + std::move(document_interface_broker_blink_handle)))); // Record time between receiving the message to commit the navigation until it // has committed. Only successful cross-document navigation handled by the @@ -4654,8 +4729,10 @@ void RenderFrameImpl::DidFinishSameDocumentNavigation( ui::PageTransition transition = GetTransitionType(frame_->GetDocumentLoader(), frame_, true /* loading */); DidCommitNavigationInternal(item, commit_type, - true /* was_within_same_document */, transition, - nullptr /* remote_interface_provider_request */); + // was_within_same_document + true, transition, + // interface_params + nullptr); } void RenderFrameImpl::DidUpdateCurrentHistoryItem() { @@ -5784,10 +5861,8 @@ void RenderFrameImpl::DidCommitNavigationInternal( blink::WebHistoryCommitType commit_type, bool was_within_same_document, ui::PageTransition transition, - service_manager::mojom::InterfaceProviderRequest - remote_interface_provider_request) { - DCHECK(!(was_within_same_document && - remote_interface_provider_request.is_pending())); + mojom::DidCommitProvisionalLoadInterfaceParamsPtr interface_params) { + DCHECK(!(was_within_same_document && interface_params)); UpdateStateForCommit(item, commit_type, transition); // This invocation must precede any calls to allowScripts(), allowImages(), or @@ -5800,7 +5875,7 @@ void RenderFrameImpl::DidCommitNavigationInternal( } else { GetFrameHost()->DidCommitProvisionalLoad( MakeDidCommitProvisionalLoadParams(commit_type, transition), - std::move(remote_interface_provider_request)); + std::move(interface_params)); } } diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index 6c9b951fd7db8c..6949c53d8456c0 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h @@ -198,6 +198,9 @@ class CONTENT_EXPORT RenderFrameImpl RenderViewImpl* render_view, int32_t routing_id, service_manager::mojom::InterfaceProviderPtr interface_provider, + blink::mojom::DocumentInterfaceBrokerPtr + document_interface_broker_content, + blink::mojom::DocumentInterfaceBrokerPtr document_interface_broker_blink, int32_t widget_routing_id, bool hidden, const ScreenInfo& screen_info, @@ -229,6 +232,9 @@ class CONTENT_EXPORT RenderFrameImpl static void CreateFrame( int routing_id, service_manager::mojom::InterfaceProviderPtr interface_provider, + blink::mojom::DocumentInterfaceBrokerPtr + document_interface_broker_content, + blink::mojom::DocumentInterfaceBrokerPtr document_interface_broker_blink, int proxy_routing_id, int opener_routing_id, int parent_routing_id, @@ -252,6 +258,8 @@ class CONTENT_EXPORT RenderFrameImpl RenderViewImpl* render_view, int32_t routing_id, service_manager::mojom::InterfaceProviderPtr interface_provider, + blink::mojom::DocumentInterfaceBrokerPtr + document_interface_broker_content, const base::UnguessableToken& devtools_frame_token); ~CreateParams(); @@ -261,6 +269,7 @@ class CONTENT_EXPORT RenderFrameImpl RenderViewImpl* render_view; int32_t routing_id; service_manager::mojom::InterfaceProviderPtr interface_provider; + blink::mojom::DocumentInterfaceBrokerPtr document_interface_broker_content; base::UnguessableToken devtools_frame_token; }; @@ -480,6 +489,7 @@ class CONTENT_EXPORT RenderFrameImpl const std::string& interface_name, mojo::ScopedMessagePipeHandle interface_pipe) override; service_manager::InterfaceProvider* GetRemoteInterfaces() override; + blink::mojom::DocumentInterfaceBroker* GetDocumentInterfaceBroker() override; blink::AssociatedInterfaceRegistry* GetAssociatedInterfaceRegistry() override; blink::AssociatedInterfaceProvider* GetRemoteAssociatedInterfaces() override; #if BUILDFLAG(ENABLE_PLUGINS) @@ -673,7 +683,9 @@ class CONTENT_EXPORT RenderFrameImpl void DidCommitProvisionalLoad( const blink::WebHistoryItem& item, blink::WebHistoryCommitType commit_type, - blink::WebGlobalObjectReusePolicy global_object_reuse_policy) override; + blink::WebGlobalObjectReusePolicy global_object_reuse_policy, + mojo::ScopedMessagePipeHandle document_interface_broker_blink_handle) + override; void DidCreateNewDocument() override; void DidClearWindowObject() override; void DidCreateDocumentElement() override; @@ -981,12 +993,17 @@ class CONTENT_EXPORT RenderFrameImpl typedef std::map HostZoomLevels; // Creates a new RenderFrame. |render_view| is the RenderView object that this - // frame belongs to, and |interface_provider| is the RenderFrameHost's - // InterfaceProvider through which services are exposed to the RenderFrame. + // frame belongs to, |interface_provider| is the RenderFrameHost's + // InterfaceProvider through which services are exposed to the RenderFrame, + // and |document_interface_broker_content| is the RenderFrameHost's + // DocumentInterfaceBroker through which services are exposed to the + // RenderFrame. static RenderFrameImpl* Create( RenderViewImpl* render_view, int32_t routing_id, service_manager::mojom::InterfaceProviderPtr interface_provider, + blink::mojom::DocumentInterfaceBrokerPtr + document_interface_broker_content, const base::UnguessableToken& devtools_frame_token); // Functions to add and remove observers for this object. @@ -1264,8 +1281,7 @@ class CONTENT_EXPORT RenderFrameImpl blink::WebHistoryCommitType commit_type, bool was_within_same_document, ui::PageTransition transition, - service_manager::mojom::InterfaceProviderRequest - remote_interface_provider_request); + mojom::DidCommitProvisionalLoadInterfaceParamsPtr interface_params); blink::WebComputedAXTree* GetOrCreateWebComputedAXTree() override; @@ -1460,6 +1476,8 @@ class CONTENT_EXPORT RenderFrameImpl service_manager::InterfaceProvider remote_interfaces_; std::unique_ptr blink_interface_registry_; + blink::mojom::DocumentInterfaceBrokerPtr document_interface_broker_; + service_manager::BindSourceInfo local_info_; service_manager::BindSourceInfo remote_info_; diff --git a/content/renderer/render_frame_impl_browsertest.cc b/content/renderer/render_frame_impl_browsertest.cc index 2484a670a46edc..0e7eac74c8923d 100644 --- a/content/renderer/render_frame_impl_browsertest.cc +++ b/content/renderer/render_frame_impl_browsertest.cc @@ -102,8 +102,19 @@ class RenderFrameImplTest : public RenderViewTest { service_manager::mojom::InterfaceProviderPtr stub_interface_provider; mojo::MakeRequest(&stub_interface_provider); + + blink::mojom::DocumentInterfaceBrokerPtr + stub_document_interface_broker_content; + mojo::MakeRequest(&stub_document_interface_broker_content); + + blink::mojom::DocumentInterfaceBrokerPtr + stub_document_interface_broker_blink; + mojo::MakeRequest(&stub_document_interface_broker_blink); + RenderFrameImpl::CreateFrame( - kSubframeRouteId, std::move(stub_interface_provider), MSG_ROUTING_NONE, + kSubframeRouteId, std::move(stub_interface_provider), + std::move(stub_document_interface_broker_content), + std::move(stub_document_interface_broker_blink), MSG_ROUTING_NONE, MSG_ROUTING_NONE, kFrameProxyRouteId, MSG_ROUTING_NONE, base::UnguessableToken::Create(), frame_replication_state, &compositor_deps_, widget_params, FrameOwnerProperties(), @@ -227,16 +238,22 @@ TEST_F(RenderFrameImplTest, LocalChildFrameWasShown) { service_manager::mojom::InterfaceProviderPtr stub_interface_provider; mojo::MakeRequest(&stub_interface_provider); + blink::mojom::DocumentInterfaceBrokerPtr stub_document_interface_broker; + mojo::MakeRequest(&stub_document_interface_broker); + // Create and initialize a local child frame of the simulated OOPIF, which // is a grandchild of the remote main frame. - RenderFrameImpl* grandchild = RenderFrameImpl::Create( - frame()->render_view(), kEmbeddedSubframeRouteId, - std::move(stub_interface_provider), base::UnguessableToken::Create()); + RenderFrameImpl* grandchild = + RenderFrameImpl::Create(frame()->render_view(), kEmbeddedSubframeRouteId, + std::move(stub_interface_provider), + std::move(stub_document_interface_broker), + base::UnguessableToken::Create()); blink::WebLocalFrame* parent_web_frame = frame()->GetWebFrame(); parent_web_frame->CreateLocalChild( blink::WebTreeScopeType::kDocument, grandchild, - grandchild->blink_interface_registry_.get()); + grandchild->blink_interface_registry_.get(), + mojo::MakeRequest(&stub_document_interface_broker).PassMessagePipe()); grandchild->in_frame_tree_ = true; grandchild->Initialize(); @@ -292,9 +309,11 @@ TEST_F(RenderFrameImplTest, LoFiNotUpdatedOnSubframeCommits) { frame()->GetWebFrame()->GetDocumentLoader()); navigation_state->set_was_within_same_document(false); + blink::mojom::DocumentInterfaceBrokerPtr stub_document_interface_broker; frame()->DidCommitProvisionalLoad( item, blink::kWebStandardCommit, - blink::WebGlobalObjectReusePolicy::kCreateNew); + blink::WebGlobalObjectReusePolicy::kCreateNew, + mojo::MakeRequest(&stub_document_interface_broker).PassMessagePipe()); EXPECT_EQ(SERVER_LOFI_ON, frame()->GetPreviewsState()); // The main frame's LoFi state should be reset to off on commit. @@ -306,7 +325,8 @@ TEST_F(RenderFrameImplTest, LoFiNotUpdatedOnSubframeCommits) { // but serves the purpose of testing the LoFi state logic. GetMainRenderFrame()->DidCommitProvisionalLoad( item, blink::kWebStandardCommit, - blink::WebGlobalObjectReusePolicy::kCreateNew); + blink::WebGlobalObjectReusePolicy::kCreateNew, + mojo::MakeRequest(&stub_document_interface_broker).PassMessagePipe()); EXPECT_EQ(PREVIEWS_UNSPECIFIED, GetMainRenderFrame()->GetPreviewsState()); // The subframe would be deleted here after a cross-document navigation. It // happens to be left around in this test because this does not simulate the @@ -352,9 +372,11 @@ TEST_F(RenderFrameImplTest, EffectiveConnectionType) { frame()->GetWebFrame()->GetDocumentLoader()); navigation_state->set_was_within_same_document(false); + blink::mojom::DocumentInterfaceBrokerPtr stub_document_interface_broker; frame()->DidCommitProvisionalLoad( item, blink::kWebStandardCommit, - blink::WebGlobalObjectReusePolicy::kCreateNew); + blink::WebGlobalObjectReusePolicy::kCreateNew, + mojo::MakeRequest(&stub_document_interface_broker).PassMessagePipe()); EXPECT_EQ(tests[i].type, frame()->GetEffectiveConnectionType()); // The main frame's effective connection type should be reset on commit. @@ -364,7 +386,8 @@ TEST_F(RenderFrameImplTest, EffectiveConnectionType) { GetMainRenderFrame()->DidCommitProvisionalLoad( item, blink::kWebStandardCommit, - blink::WebGlobalObjectReusePolicy::kCreateNew); + blink::WebGlobalObjectReusePolicy::kCreateNew, + mojo::MakeRequest(&stub_document_interface_broker).PassMessagePipe()); EXPECT_EQ(blink::WebEffectiveConnectionType::kTypeUnknown, GetMainRenderFrame()->GetEffectiveConnectionType()); @@ -742,6 +765,32 @@ class TestSimpleInterfaceProviderImpl DISALLOW_COPY_AND_ASSIGN(TestSimpleInterfaceProviderImpl); }; +class TestSimpleDocumentInterfaceBrokerImpl + : public blink::mojom::DocumentInterfaceBroker { + public: + using BinderCallback = base::RepeatingCallback; + TestSimpleDocumentInterfaceBrokerImpl(BinderCallback binder_callback) + : binding_(this), binder_callback_(binder_callback) {} + void BindAndFlush(blink::mojom::DocumentInterfaceBrokerRequest request) { + ASSERT_FALSE(binding_.is_bound()); + binding_.Bind(std::move(request)); + binding_.FlushForTesting(); + } + + private: + // mojom::DocumentInterfaceBroker + void GetFrameHostTestInterface( + blink::mojom::FrameHostTestInterfaceRequest request) override { + binder_callback_.Run(std::move(request)); + } + + mojo::Binding binding_; + BinderCallback binder_callback_; + + DISALLOW_COPY_AND_ASSIGN(TestSimpleDocumentInterfaceBrokerImpl); +}; + // Used to annotate the source of an interface request. struct SourceAnnotation { // The URL of the active document in the frame, at the time the interface was @@ -788,6 +837,36 @@ class FrameHostTestInterfaceImpl : public mojom::FrameHostTestInterface { DISALLOW_COPY_AND_ASSIGN(FrameHostTestInterfaceImpl); }; +// TODO(crbug.com/718652): this is a blink version of the FrameHostTestInterface +// implementation. The non-blink one will be removed when all clients are +// converted to use DocumentInterfaceBroker. +class BlinkFrameHostTestInterfaceImpl + : public blink::mojom::FrameHostTestInterface { + public: + BlinkFrameHostTestInterfaceImpl() : binding_(this) {} + ~BlinkFrameHostTestInterfaceImpl() override {} + + void BindAndFlush(blink::mojom::FrameHostTestInterfaceRequest request) { + binding_.Bind(std::move(request)); + binding_.WaitForIncomingMethodCall(); + } + + const base::Optional& ping_source() const { + return ping_source_; + } + + protected: + void Ping(const GURL& url, const std::string& event) override { + ping_source_ = SourceAnnotation{url, event}; + } + + private: + mojo::Binding binding_; + base::Optional ping_source_; + + DISALLOW_COPY_AND_ASSIGN(BlinkFrameHostTestInterfaceImpl); +}; + // RenderFrameObserver that issues FrameHostTestInterface interface requests // through the RenderFrame's |remote_interfaces_| in response to observing // important milestones in a frame's lifecycle. @@ -805,6 +884,16 @@ class FrameHostTestInterfaceRequestIssuer : public RenderFrameObserver { ptr->Ping( !document.IsNull() ? GURL(document.Url()) : GURL(kNoDocumentMarkerURL), event); + + blink::mojom::FrameHostTestInterfacePtr blink_ptr; + blink::mojom::DocumentInterfaceBroker* document_interface_broker = + render_frame()->GetDocumentInterfaceBroker(); + DCHECK(document_interface_broker); + document_interface_broker->GetFrameHostTestInterface( + mojo::MakeRequest(&blink_ptr)); + blink_ptr->Ping( + !document.IsNull() ? GURL(document.Url()) : GURL(kNoDocumentMarkerURL), + event); } private: @@ -924,6 +1013,9 @@ class ScopedNewFrameInterfaceProviderExerciser { interface_request_for_first_document_ = frame_->TakeLastInterfaceProviderRequest(); + + document_interface_broker_request_for_first_document_ = + frame_->TakeLastDocumentInterfaceBrokerRequest(); } service_manager::mojom::InterfaceProviderRequest @@ -931,11 +1023,22 @@ class ScopedNewFrameInterfaceProviderExerciser { return std::move(interface_request_for_initial_empty_document_); }; + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_request_for_initial_empty_document() { + return std::move( + document_interface_broker_request_for_initial_empty_document_); + } + service_manager::mojom::InterfaceProviderRequest interface_request_for_first_document() { return std::move(interface_request_for_first_document_); } + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_request_for_first_document() { + return std::move(document_interface_broker_request_for_first_document_); + } + private: void OnFrameCreated(TestRenderFrame* frame) { ASSERT_EQ(nullptr, frame_); @@ -956,6 +1059,8 @@ class ScopedNewFrameInterfaceProviderExerciser { interface_request_for_initial_empty_document_ = frame->TakeLastInterfaceProviderRequest(); + document_interface_broker_request_for_initial_empty_document_ = + frame->TakeLastDocumentInterfaceBrokerRequest(); EXPECT_TRUE(frame->current_history_item().IsNull()); } @@ -972,6 +1077,11 @@ class ScopedNewFrameInterfaceProviderExerciser { service_manager::mojom::InterfaceProviderRequest interface_request_for_first_document_; + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_request_for_initial_empty_document_; + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_request_for_first_document_; + DISALLOW_COPY_AND_ASSIGN(ScopedNewFrameInterfaceProviderExerciser); }; @@ -981,6 +1091,8 @@ class ScopedNewFrameInterfaceProviderExerciser { // FrameHostTestInterface requests. void ExpectPendingInterfaceRequestsFromSources( service_manager::mojom::InterfaceProviderRequest interface_provider_request, + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_request, std::vector expected_sources) { std::vector sources; ASSERT_TRUE(interface_provider_request.is_pending()); @@ -996,6 +1108,20 @@ void ExpectPendingInterfaceRequestsFromSources( })); provider.BindAndFlush(std::move(interface_provider_request)); EXPECT_THAT(sources, ::testing::ElementsAreArray(expected_sources)); + + std::vector document_interface_broker_sources; + ASSERT_TRUE(document_interface_broker_request.is_pending()); + TestSimpleDocumentInterfaceBrokerImpl broker(base::BindLambdaForTesting( + [&document_interface_broker_sources]( + blink::mojom::FrameHostTestInterfaceRequest request) { + BlinkFrameHostTestInterfaceImpl impl; + impl.BindAndFlush(std::move(request)); + ASSERT_TRUE(impl.ping_source().has_value()); + document_interface_broker_sources.push_back(impl.ping_source().value()); + })); + broker.BindAndFlush(std::move(document_interface_broker_request)); + EXPECT_THAT(document_interface_broker_sources, + ::testing::ElementsAreArray(expected_sources)); } } // namespace @@ -1043,6 +1169,9 @@ class RenderFrameRemoteInterfacesTest : public RenderViewTest { // Expect that |remote_interfaces_| is bound before the first committed load in // a child frame, and then re-bound on the first commit. +// TODO(crbug.com/718652): when all clients are converted to use +// DocumentInterfaceBroker, InterfaceProviderRequest-related code will be +// removed. TEST_F(RenderFrameRemoteInterfacesTest, ChildFrameAtFirstCommittedLoad) { constexpr struct { const char* main_frame_url_override; @@ -1073,6 +1202,8 @@ TEST_F(RenderFrameRemoteInterfacesTest, ChildFrameAtFirstCommittedLoad) { const GURL initial_empty_url(kAboutBlankURL); ExpectPendingInterfaceRequestsFromSources( child_frame_exerciser.interface_request_for_initial_empty_document(), + child_frame_exerciser + .document_interface_broker_request_for_initial_empty_document(), {{GURL(kNoDocumentMarkerURL), kFrameEventDidCreateNewFrame}, {initial_empty_url, kFrameEventDidCreateNewDocument}, {initial_empty_url, kFrameEventDidCreateDocumentElement}, @@ -1083,6 +1214,8 @@ TEST_F(RenderFrameRemoteInterfacesTest, ChildFrameAtFirstCommittedLoad) { {child_frame_url, kFrameEventDidCreateNewDocument}}); ExpectPendingInterfaceRequestsFromSources( child_frame_exerciser.interface_request_for_first_document(), + child_frame_exerciser + .document_interface_broker_request_for_first_document(), {{child_frame_url, kFrameEventDidCommitProvisionalLoad}, {child_frame_url, kFrameEventDidCreateDocumentElement}}); } @@ -1090,6 +1223,9 @@ TEST_F(RenderFrameRemoteInterfacesTest, ChildFrameAtFirstCommittedLoad) { // Expect that |remote_interfaces_| is bound before the first committed load in // the main frame of an opened window, and then re-bound on the first commit. +// TODO(crbug.com/718652): when all clients are converted to use +// DocumentInterfaceBroker, InterfaceProviderRequest-related code will be +// removed. TEST_F(RenderFrameRemoteInterfacesTest, MainFrameOfOpenedWindowAtFirstCommittedLoad) { constexpr struct { @@ -1133,11 +1269,15 @@ TEST_F(RenderFrameRemoteInterfacesTest, const GURL initial_empty_url; ExpectPendingInterfaceRequestsFromSources( main_frame_exerciser.interface_request_for_initial_empty_document(), + main_frame_exerciser + .document_interface_broker_request_for_initial_empty_document(), {{initial_empty_url, kFrameEventDidCreateNewFrame}, {initial_empty_url, kFrameEventWillCommitProvisionalLoad}, {new_window_url, kFrameEventDidCreateNewDocument}}); ExpectPendingInterfaceRequestsFromSources( main_frame_exerciser.interface_request_for_first_document(), + main_frame_exerciser + .document_interface_broker_request_for_first_document(), {{new_window_url, kFrameEventDidCommitProvisionalLoad}, {new_window_url, kFrameEventDidCreateDocumentElement}}); } @@ -1163,6 +1303,9 @@ TEST_F(RenderFrameRemoteInterfacesTest, // // TODO(https://crbug.com/778318): Once the Window object inheritance is fixed, // add a similar test for: . +// TODO(crbug.com/718652): when all clients are converted to use +// DocumentInterfaceBroker, InterfaceProviderRequest-related code will be +// removed. TEST_F(RenderFrameRemoteInterfacesTest, ChildFrameReusingWindowOfInitialDocument) { const GURL main_frame_url(kTestFirstURL); @@ -1182,6 +1325,8 @@ TEST_F(RenderFrameRemoteInterfacesTest, ExpectPendingInterfaceRequestsFromSources( child_frame_exerciser.interface_request_for_initial_empty_document(), + child_frame_exerciser + .document_interface_broker_request_for_initial_empty_document(), {{GURL(kNoDocumentMarkerURL), kFrameEventDidCreateNewFrame}, {initial_empty_url, kFrameEventDidCreateNewDocument}, {initial_empty_url, kFrameEventDidCreateDocumentElement}, @@ -1192,16 +1337,26 @@ TEST_F(RenderFrameRemoteInterfacesTest, auto request = child_frame_exerciser.interface_request_for_first_document(); ASSERT_FALSE(request.is_pending()); + auto document_interface_broker_request = + child_frame_exerciser + .document_interface_broker_request_for_first_document(); + ASSERT_FALSE(document_interface_broker_request.is_pending()); } // Expect that |remote_interfaces_| is bound to a new pipe on cross-document // navigations. +// TODO(crbug.com/718652): when all clients are converted to use +// DocumentInterfaceBroker, InterfaceProviderRequest-related code will be +// removed. TEST_F(RenderFrameRemoteInterfacesTest, ReplacedOnNonSameDocumentNavigation) { LoadHTMLWithUrlOverride("", kTestFirstURL); auto interface_provider_request_for_first_document = GetMainRenderFrame()->TakeLastInterfaceProviderRequest(); + auto document_interface_broker_request_for_first_document = + GetMainRenderFrame()->TakeLastDocumentInterfaceBrokerRequest(); + FrameHostTestInterfaceRequestIssuer requester(GetMainRenderFrame()); requester.RequestTestInterfaceOnFrameEvent(kFrameEventAfterCommit); @@ -1210,16 +1365,27 @@ TEST_F(RenderFrameRemoteInterfacesTest, ReplacedOnNonSameDocumentNavigation) { auto interface_provider_request_for_second_document = GetMainRenderFrame()->TakeLastInterfaceProviderRequest(); + auto document_interface_broker_request_for_second_document = + GetMainRenderFrame()->TakeLastDocumentInterfaceBrokerRequest(); + ASSERT_TRUE(interface_provider_request_for_first_document.is_pending()); + ASSERT_TRUE( + document_interface_broker_request_for_first_document.is_pending()); + ExpectPendingInterfaceRequestsFromSources( std::move(interface_provider_request_for_first_document), + std::move(document_interface_broker_request_for_first_document), {{GURL(kTestFirstURL), kFrameEventAfterCommit}, {GURL(kTestFirstURL), kFrameEventWillCommitProvisionalLoad}, {GURL(kTestSecondURL), kFrameEventDidCreateNewDocument}}); ASSERT_TRUE(interface_provider_request_for_second_document.is_pending()); + ASSERT_TRUE( + document_interface_broker_request_for_second_document.is_pending()); + ExpectPendingInterfaceRequestsFromSources( std::move(interface_provider_request_for_second_document), + std::move(document_interface_broker_request_for_second_document), {{GURL(kTestSecondURL), kFrameEventDidCommitProvisionalLoad}, {GURL(kTestSecondURL), kFrameEventDidCreateDocumentElement}}); } @@ -1227,21 +1393,34 @@ TEST_F(RenderFrameRemoteInterfacesTest, ReplacedOnNonSameDocumentNavigation) { // Expect that |remote_interfaces_| is not bound to a new pipe on same-document // navigations, i.e. the existing InterfaceProvider connection is continued to // be used. +// TODO(crbug.com/718652): when all clients are converted to use +// DocumentInterfaceBroker, InterfaceProviderRequest-related code will be +// removed. TEST_F(RenderFrameRemoteInterfacesTest, ReusedOnSameDocumentNavigation) { LoadHTMLWithUrlOverride("", kTestFirstURL); auto interface_provider_request = GetMainRenderFrame()->TakeLastInterfaceProviderRequest(); + auto document_interface_broker = + GetMainRenderFrame()->TakeLastDocumentInterfaceBrokerRequest(); + FrameHostTestInterfaceRequestIssuer requester(GetMainRenderFrame()); OnSameDocumentNavigation(GetMainFrame(), true /* is_new_navigation */); EXPECT_FALSE( GetMainRenderFrame()->TakeLastInterfaceProviderRequest().is_pending()); + EXPECT_FALSE(GetMainRenderFrame() + ->TakeLastDocumentInterfaceBrokerRequest() + .is_pending()); + ASSERT_TRUE(interface_provider_request.is_pending()); + ASSERT_TRUE(document_interface_broker.is_pending()); + ExpectPendingInterfaceRequestsFromSources( std::move(interface_provider_request), + std::move(document_interface_broker), {{GURL(kTestFirstURL), kFrameEventDidCommitSameDocumentLoad}}); } diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc index 19e131774bf589..2e17bf6f1522d3 100644 --- a/content/renderer/render_thread_impl.cc +++ b/content/renderer/render_thread_impl.cc @@ -2131,14 +2131,19 @@ void RenderThreadImpl::CreateView(mojom::CreateViewParamsPtr params) { void RenderThreadImpl::CreateFrame(mojom::CreateFrameParamsPtr params) { CompositorDependencies* compositor_deps = this; service_manager::mojom::InterfaceProviderPtr interface_provider( - std::move(params->interface_provider)); + std::move(params->interface_bundle->interface_provider)); + blink::mojom::DocumentInterfaceBrokerPtr document_interface_broker_content( + std::move(params->interface_bundle->document_interface_broker_content)); + blink::mojom::DocumentInterfaceBrokerPtr document_interface_broker_blink( + std::move(params->interface_bundle->document_interface_broker_blink)); RenderFrameImpl::CreateFrame( params->routing_id, std::move(interface_provider), - params->proxy_routing_id, params->opener_routing_id, - params->parent_routing_id, params->previous_sibling_routing_id, - params->devtools_frame_token, params->replication_state, compositor_deps, - *params->widget_params, params->frame_owner_properties, - params->has_committed_real_load); + std::move(document_interface_broker_content), + std::move(document_interface_broker_blink), params->proxy_routing_id, + params->opener_routing_id, params->parent_routing_id, + params->previous_sibling_routing_id, params->devtools_frame_token, + params->replication_state, compositor_deps, *params->widget_params, + params->frame_owner_properties, params->has_committed_real_load); } void RenderThreadImpl::CreateFrameProxy( diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc index 404f3ac28727c0..54f90b968b944d 100644 --- a/content/renderer/render_view_browsertest.cc +++ b/content/renderer/render_view_browsertest.cc @@ -988,11 +988,19 @@ TEST_F(RenderViewImplEnableZoomForDSFTest, UpdateDSFAfterSwapIn) { int routing_id = kProxyRoutingId + 1; service_manager::mojom::InterfaceProviderPtr stub_interface_provider; mojo::MakeRequest(&stub_interface_provider); + blink::mojom::DocumentInterfaceBrokerPtr + stub_document_interface_broker_content; + mojo::MakeRequest(&stub_document_interface_broker_content); + blink::mojom::DocumentInterfaceBrokerPtr stub_document_interface_broker_blink; + mojo::MakeRequest(&stub_document_interface_broker_blink); + mojom::CreateFrameWidgetParams widget_params; widget_params.routing_id = view()->GetRoutingID(); widget_params.hidden = false; RenderFrameImpl::CreateFrame( - routing_id, std::move(stub_interface_provider), kProxyRoutingId, + routing_id, std::move(stub_interface_provider), + std::move(stub_document_interface_broker_content), + std::move(stub_document_interface_broker_blink), kProxyRoutingId, MSG_ROUTING_NONE, MSG_ROUTING_NONE, MSG_ROUTING_NONE, base::UnguessableToken::Create(), replication_state, nullptr, widget_params, FrameOwnerProperties(), /*has_committed_real_load=*/true); @@ -1053,11 +1061,19 @@ TEST_F(RenderViewImplTest, DetachingProxyAlsoDestroysProvisionalFrame) { int routing_id = kProxyRoutingId + 1; service_manager::mojom::InterfaceProviderPtr stub_interface_provider; mojo::MakeRequest(&stub_interface_provider); + blink::mojom::DocumentInterfaceBrokerPtr + stub_document_interface_broker_content; + mojo::MakeRequest(&stub_document_interface_broker_content); + blink::mojom::DocumentInterfaceBrokerPtr stub_document_interface_broker_blink; + mojo::MakeRequest(&stub_document_interface_broker_blink); + mojom::CreateFrameWidgetParams widget_params; widget_params.routing_id = MSG_ROUTING_NONE; widget_params.hidden = false; RenderFrameImpl::CreateFrame( - routing_id, std::move(stub_interface_provider), kProxyRoutingId, + routing_id, std::move(stub_interface_provider), + std::move(stub_document_interface_broker_content), + std::move(stub_document_interface_broker_blink), kProxyRoutingId, MSG_ROUTING_NONE, frame()->GetRoutingID(), MSG_ROUTING_NONE, base::UnguessableToken::Create(), replication_state, nullptr, widget_params, FrameOwnerProperties(), /*has_committed_real_load=*/true); diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 1f242ea0ece6ac..14ee16470b6f70 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -529,12 +529,19 @@ void RenderViewImpl::Initialize( params->proxy_routing_id != MSG_ROUTING_NONE); if (params->main_frame_routing_id != MSG_ROUTING_NONE) { - CHECK(params->main_frame_interface_provider.is_valid()); + CHECK(params->main_frame_interface_bundle); service_manager::mojom::InterfaceProviderPtr main_frame_interface_provider( - std::move(params->main_frame_interface_provider)); + std::move(params->main_frame_interface_bundle->interface_provider)); + main_render_frame_ = RenderFrameImpl::CreateMainFrame( this, params->main_frame_routing_id, std::move(main_frame_interface_provider), + blink::mojom::DocumentInterfaceBrokerPtr( + std::move(params->main_frame_interface_bundle + ->document_interface_broker_content)), + blink::mojom::DocumentInterfaceBrokerPtr( + std::move(params->main_frame_interface_bundle + ->document_interface_broker_blink)), params->main_frame_widget_routing_id, params->hidden, GetWidget()->GetWebScreenInfo(), GetWidget()->compositor_deps(), opener_frame, params->devtools_main_frame_token, @@ -1395,8 +1402,13 @@ WebView* RenderViewImpl::CreateView( view_params->web_preferences = webkit_preferences_; view_params->view_id = reply->route_id; view_params->main_frame_routing_id = reply->main_frame_route_id; - view_params->main_frame_interface_provider = - std::move(reply->main_frame_interface_provider); + view_params->main_frame_interface_bundle = + mojom::DocumentScopedInterfaceBundle::New( + std::move(reply->main_frame_interface_bundle->interface_provider), + std::move(reply->main_frame_interface_bundle + ->document_interface_broker_content), + std::move(reply->main_frame_interface_bundle + ->document_interface_broker_blink)); view_params->main_frame_widget_routing_id = reply->main_frame_widget_route_id; view_params->session_storage_namespace_id = reply->cloned_session_storage_namespace_id; diff --git a/content/test/did_commit_provisional_load_interceptor.cc b/content/test/did_commit_provisional_load_interceptor.cc index 2afa7844ba8883..7ca80fd3487858 100644 --- a/content/test/did_commit_provisional_load_interceptor.cc +++ b/content/test/did_commit_provisional_load_interceptor.cc @@ -38,12 +38,12 @@ class DidCommitProvisionalLoadInterceptor::FrameAgent FrameHost* GetForwardingInterface() override { return impl_; } void DidCommitProvisionalLoad( std::unique_ptr<::FrameHostMsg_DidCommitProvisionalLoad_Params> params, - ::service_manager::mojom::InterfaceProviderRequest - interface_provider_request) override { - if (interceptor_->WillDispatchDidCommitProvisionalLoad( - rfhi_, params.get(), &interface_provider_request)) { + mojom::DidCommitProvisionalLoadInterfaceParamsPtr interface_params) + override { + if (interceptor_->WillDispatchDidCommitProvisionalLoad(rfhi_, params.get(), + interface_params)) { GetForwardingInterface()->DidCommitProvisionalLoad( - std::move(params), std::move(interface_provider_request)); + std::move(params), std::move(interface_params)); } } diff --git a/content/test/did_commit_provisional_load_interceptor.h b/content/test/did_commit_provisional_load_interceptor.h index bac23311dfe3e7..7178e4237b09d1 100644 --- a/content/test/did_commit_provisional_load_interceptor.h +++ b/content/test/did_commit_provisional_load_interceptor.h @@ -34,8 +34,7 @@ class DidCommitProvisionalLoadInterceptor : public WebContentsObserver { virtual bool WillDispatchDidCommitProvisionalLoad( RenderFrameHost* render_frame_host, ::FrameHostMsg_DidCommitProvisionalLoad_Params* params, - service_manager::mojom::InterfaceProviderRequest* - interface_provider_request) = 0; + mojom::DidCommitProvisionalLoadInterfaceParamsPtr& interface_params) = 0; private: class FrameAgent; diff --git a/content/test/test_render_frame.cc b/content/test/test_render_frame.cc index b87f1922419755..034e52b84b87cf 100644 --- a/content/test/test_render_frame.cc +++ b/content/test/test_render_frame.cc @@ -39,6 +39,11 @@ class MockFrameHost : public mojom::FrameHost { return std::move(last_interface_provider_request_); } + blink::mojom::DocumentInterfaceBrokerRequest + TakeLastDocumentInterfaceBrokerRequest() { + return std::move(last_document_interface_broker_request_); + } + // Holds on to the request end of the InterfaceProvider interface whose client // end is bound to the corresponding RenderFrame's |remote_interfaces_| to // facilitate retrieving the most recent |interface_provider_request| in @@ -49,6 +54,17 @@ class MockFrameHost : public mojom::FrameHost { last_interface_provider_request_ = std::move(interface_provider_request); } + // Holds on to the request end of the DocumentInterfaceBroker interface whose + // client end is bound to the corresponding RenderFrame's + // |document_interface_broker_| to facilitate retrieving the most recent + // |document_interface_broker_request| in tests. + void PassLastDocumentInterfaceBrokerRequest( + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_request) { + last_document_interface_broker_request_ = + std::move(document_interface_broker_request); + } + protected: // mojom::FrameHost: void CreateNewWindow(mojom::CreateNewWindowParamsPtr, @@ -76,9 +92,16 @@ class MockFrameHost : public mojom::FrameHost { void DidCommitProvisionalLoad( std::unique_ptr params, - service_manager::mojom::InterfaceProviderRequest request) override { + mojom::DidCommitProvisionalLoadInterfaceParamsPtr interface_params) + override { last_commit_params_ = std::move(params); - last_interface_provider_request_ = std::move(request); + if (interface_params) { + last_interface_provider_request_ = + std::move(interface_params->interface_provider_request); + last_document_interface_broker_request_ = + blink::mojom::DocumentInterfaceBrokerRequest(std::move( + interface_params->document_interface_broker_content_request)); + } } void DidCommitSameDocumentNavigation( @@ -128,6 +151,8 @@ class MockFrameHost : public mojom::FrameHost { last_commit_params_; service_manager::mojom::InterfaceProviderRequest last_interface_provider_request_; + blink::mojom::DocumentInterfaceBrokerRequest + last_document_interface_broker_request_; DISALLOW_COPY_AND_ASSIGN(MockFrameHost); }; @@ -146,6 +171,9 @@ TestRenderFrame::TestRenderFrame(RenderFrameImpl::CreateParams params) mock_frame_host_->PassLastInterfaceProviderRequest( mock_render_thread->TakeInitialInterfaceProviderRequestForFrame( params.routing_id)); + mock_frame_host_->PassLastDocumentInterfaceBrokerRequest( + mock_render_thread->TakeInitialDocumentInterfaceBrokerRequestForFrame( + params.routing_id)); } TestRenderFrame::~TestRenderFrame() {} @@ -242,6 +270,11 @@ TestRenderFrame::TakeLastInterfaceProviderRequest() { return mock_frame_host_->TakeLastInterfaceProviderRequest(); } +blink::mojom::DocumentInterfaceBrokerRequest +TestRenderFrame::TakeLastDocumentInterfaceBrokerRequest() { + return mock_frame_host_->TakeLastDocumentInterfaceBrokerRequest(); +} + mojom::FrameHost* TestRenderFrame::GetFrameHost() { // Need to mock this interface directly without going through a binding, // otherwise calling its sync methods could lead to a deadlock. diff --git a/content/test/test_render_frame.h b/content/test/test_render_frame.h index b0ad152a4da6b5..bfc73904434f21 100644 --- a/content/test/test_render_frame.h +++ b/content/test/test_render_frame.h @@ -67,6 +67,9 @@ class TestRenderFrame : public RenderFrameImpl { service_manager::mojom::InterfaceProviderRequest TakeLastInterfaceProviderRequest(); + blink::mojom::DocumentInterfaceBrokerRequest + TakeLastDocumentInterfaceBrokerRequest(); + private: explicit TestRenderFrame(RenderFrameImpl::CreateParams params); diff --git a/content/test/test_render_frame_host.cc b/content/test/test_render_frame_host.cc index 0e7dba59dbceab..c506653f87c867 100644 --- a/content/test/test_render_frame_host.cc +++ b/content/test/test_render_frame_host.cc @@ -110,6 +110,8 @@ TestRenderFrameHost* TestRenderFrameHost::AppendChild( std::string frame_unique_name = base::GenerateGUID(); OnCreateChildFrame( GetProcess()->GetNextRoutingID(), CreateStubInterfaceProviderRequest(), + CreateStubDocumentInterfaceBrokerRequest(), + CreateStubDocumentInterfaceBrokerRequest(), blink::WebTreeScopeType::kDocument, frame_name, frame_unique_name, false, base::UnguessableToken::Create(), blink::FramePolicy(), FrameOwnerProperties(), blink::FrameOwnerElementType::kIframe); @@ -337,16 +339,37 @@ void TestRenderFrameHost::SendNavigateWithParams( bool was_within_same_document) { service_manager::mojom::InterfaceProviderPtr interface_provider; service_manager::mojom::InterfaceProviderRequest interface_provider_request; - if (!was_within_same_document) + + blink::mojom::DocumentInterfaceBrokerPtr document_interface_broker_content; + blink::mojom::DocumentInterfaceBrokerPtr document_interface_broker_blink; + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_content_request; + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_blink_request; + + if (!was_within_same_document) { interface_provider_request = mojo::MakeRequest(&interface_provider); + document_interface_broker_content_request = + mojo::MakeRequest(&document_interface_broker_content); + document_interface_broker_blink_request = + mojo::MakeRequest(&document_interface_broker_blink); + } + SendNavigateWithParamsAndInterfaceProvider( - params, std::move(interface_provider_request), was_within_same_document); + params, std::move(interface_provider_request), + std::move(document_interface_broker_content_request), + std::move(document_interface_broker_blink_request), + was_within_same_document); } void TestRenderFrameHost::SendNavigateWithParamsAndInterfaceProvider( FrameHostMsg_DidCommitProvisionalLoad_Params* params, service_manager::mojom::InterfaceProviderRequest request, + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_content_request, + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_blink_request, bool was_within_same_document) { if (GetNavigationHandle()) { scoped_refptr response_headers = @@ -363,7 +386,10 @@ void TestRenderFrameHost::SendNavigateWithParamsAndInterfaceProvider( } else { DidCommitProvisionalLoad( std::make_unique(*params), - std::move(request)); + mojom::DidCommitProvisionalLoadInterfaceParams::New( + std::move(request), + std::move(document_interface_broker_content_request), + std::move(document_interface_broker_blink_request))); } last_commit_was_error_page_ = params->url_is_unreachable; } @@ -586,4 +612,12 @@ TestRenderFrameHost::CreateStubInterfaceProviderRequest() { return mojo::MakeRequest(&dead_interface_provider_proxy); } +// static +blink::mojom::DocumentInterfaceBrokerRequest +TestRenderFrameHost::CreateStubDocumentInterfaceBrokerRequest() { + ::blink::mojom::DocumentInterfaceBrokerPtrInfo + dead_document_interface_broker_proxy; + return mojo::MakeRequest(&dead_document_interface_broker_proxy); +} + } // namespace content diff --git a/content/test/test_render_frame_host.h b/content/test/test_render_frame_host.h index f1ca410676dee0..cca34125b1a3d0 100644 --- a/content/test/test_render_frame_host.h +++ b/content/test/test_render_frame_host.h @@ -101,6 +101,10 @@ class TestRenderFrameHost : public RenderFrameHostImpl, void SendNavigateWithParamsAndInterfaceProvider( FrameHostMsg_DidCommitProvisionalLoad_Params* params, service_manager::mojom::InterfaceProviderRequest request, + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_content_request, + blink::mojom::DocumentInterfaceBrokerRequest + document_interface_broker_blink_request, bool was_within_same_document); // With the current navigation logic this method is a no-op. @@ -184,6 +188,11 @@ class TestRenderFrameHost : public RenderFrameHostImpl, static service_manager::mojom::InterfaceProviderRequest CreateStubInterfaceProviderRequest(); + // Returns a pending DocumentInterfaceBrokerRequest that is safe to bind to an + // implementation, but will never receive any interface requests. + static blink::mojom::DocumentInterfaceBrokerRequest + CreateStubDocumentInterfaceBrokerRequest(); + protected: void SendCommitNavigation( mojom::NavigationClient* navigation_client, diff --git a/extensions/renderer/DEPS b/extensions/renderer/DEPS index 555104e680965e..f0de45690a1b72 100644 --- a/extensions/renderer/DEPS +++ b/extensions/renderer/DEPS @@ -13,6 +13,7 @@ include_rules = [ "+third_party/skia/include/core", "+third_party/cld_3", + "+third_party/blink/public/mojom/frame/document_interface_broker.mojom.h", "+third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h", "+third_party/blink/public/platform", "+third_party/blink/public/web", diff --git a/extensions/renderer/scoped_web_frame.cc b/extensions/renderer/scoped_web_frame.cc index 228406d011c68e..543ce742895d8a 100644 --- a/extensions/renderer/scoped_web_frame.cc +++ b/extensions/renderer/scoped_web_frame.cc @@ -4,22 +4,31 @@ #include "extensions/renderer/scoped_web_frame.h" +#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom.h" #include "third_party/blink/public/web/web_heap.h" #include "third_party/blink/public/web/web_view.h" #include "third_party/blink/public/web/web_widget.h" namespace extensions { +// returns a valid handle that can be passed to WebLocalFrame constructor +mojo::ScopedMessagePipeHandle CreateStubDocumentInterfaceBrokerHandle() { + blink::mojom::DocumentInterfaceBrokerPtrInfo info; + return mojo::MakeRequest(&info).PassMessagePipe(); +} + ScopedWebFrame::ScopedWebFrame() : view_(blink::WebView::Create(/*client=*/nullptr, /*widget_client=*/nullptr, /*is_hidden=*/false, /*compositing_enabled=*/false, /*opener=*/nullptr)), - frame_(blink::WebLocalFrame::CreateMainFrame(view_, - &frame_client_, - nullptr, - nullptr)) {} + frame_(blink::WebLocalFrame::CreateMainFrame( + view_, + &frame_client_, + nullptr, + CreateStubDocumentInterfaceBrokerHandle(), + nullptr)) {} ScopedWebFrame::~ScopedWebFrame() { view_->MainFrameWidget()->Close(); diff --git a/media/blink/DEPS b/media/blink/DEPS index 06b6b6bf8e1bf7..d7d401da6b05da 100644 --- a/media/blink/DEPS +++ b/media/blink/DEPS @@ -15,9 +15,10 @@ include_rules = [ "+services/network/public/cpp", "+services/network/public/mojom", "+services/service_manager/public/cpp", + "+third_party/blink/public/common", + "+third_party/blink/public/mojom", "+third_party/blink/public/platform", "+third_party/blink/public/web", - "+third_party/blink/public/common", # media/mojo is not part of "media" target and should not use MEDIA_EXPORT. "-media/base/media_export.h" diff --git a/media/blink/webmediaplayer_impl_unittest.cc b/media/blink/webmediaplayer_impl_unittest.cc index f26669717fb627..2d2709f47509d1 100644 --- a/media/blink/webmediaplayer_impl_unittest.cc +++ b/media/blink/webmediaplayer_impl_unittest.cc @@ -46,6 +46,7 @@ #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/picture_in_picture/picture_in_picture_control_info.h" +#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom.h" #include "third_party/blink/public/platform/web_fullscreen_video_status.h" #include "third_party/blink/public/platform/web_media_player.h" #include "third_party/blink/public/platform/web_media_player_client.h" @@ -94,6 +95,12 @@ MATCHER_P2(PlaybackRateChanged, old_rate_string, new_rate_string, "") { std::string(new_rate_string)); } +// returns a valid handle that can be passed to WebLocalFrame constructor +mojo::ScopedMessagePipeHandle CreateStubDocumentInterfaceBrokerHandle() { + blink::mojom::DocumentInterfaceBrokerPtrInfo info; + return mojo::MakeRequest(&info).PassMessagePipe(); +} + #if defined(OS_ANDROID) class MockRendererMediaPlayerManager : public RendererMediaPlayerManagerInterface { @@ -350,11 +357,12 @@ class WebMediaPlayerImplTest : public testing::Test { /*is_hidden=*/false, /*compositing_enabled=*/false, nullptr)), - web_local_frame_( - blink::WebLocalFrame::CreateMainFrame(web_view_, - &web_frame_client_, - nullptr, - nullptr)), + web_local_frame_(blink::WebLocalFrame::CreateMainFrame( + web_view_, + &web_frame_client_, + nullptr, + CreateStubDocumentInterfaceBrokerHandle(), + nullptr)), context_provider_(viz::TestContextProvider::Create()), audio_parameters_(TestAudioParameters::Normal()) { media_thread_.StartAndWaitForTesting(); diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn index 9047454928deac..3a8dcf77c97a0e 100644 --- a/third_party/blink/public/mojom/BUILD.gn +++ b/third_party/blink/public/mojom/BUILD.gn @@ -36,7 +36,9 @@ mojom("mojom_platform") { "file/file_utilities.mojom", "filesystem/file_system.mojom", "filesystem/file_writer.mojom", + "frame/document_interface_broker.mojom", "frame/find_in_page.mojom", + "frame/frame_host_test_interface.mojom", "frame/navigation_initiator.mojom", "leak_detector/leak_detector.mojom", "loader/code_cache.mojom", diff --git a/third_party/blink/public/mojom/frame/document_interface_broker.mojom b/third_party/blink/public/mojom/frame/document_interface_broker.mojom new file mode 100644 index 00000000000000..5afe5ceff2e709 --- /dev/null +++ b/third_party/blink/public/mojom/frame/document_interface_broker.mojom @@ -0,0 +1,13 @@ +// Copyright 2018 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 blink.mojom; + +import "third_party/blink/public/mojom/frame/frame_host_test_interface.mojom"; + +// An interface through which the renderer may request document-scoped +// interfaces from the browser. +interface DocumentInterfaceBroker { + GetFrameHostTestInterface(blink.mojom.FrameHostTestInterface& request); +}; diff --git a/third_party/blink/public/mojom/frame/frame_host_test_interface.mojom b/third_party/blink/public/mojom/frame/frame_host_test_interface.mojom new file mode 100644 index 00000000000000..19485a18cf1b1b --- /dev/null +++ b/third_party/blink/public/mojom/frame/frame_host_test_interface.mojom @@ -0,0 +1,23 @@ +// Copyright 2018 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 blink.mojom; + +import "url/mojom/url.mojom"; + +// TODO(crbug.com/718652) This is a copy of +// content/test/frame_host_test_interface.mojom to be used in parallel while +// InterfaceProvider->DocumentInterfaceBroker conversion is taking place. + +// Test interface used in RenderFrame and RenderFrameHost tests to exercise +// requesting document-scoped interfaces from the RenderFrameHost through +// the DocumentInterfaceBroker interface. +// +// The `Ping` method is invoked by clients immediately after making the +// FrameHostTestInterfaceRequest, so as to annotate where the request +// originates from. This allows verification that the request was delivered / +// not delivered to a certain DocumentInterfaceBroker implementation. +interface FrameHostTestInterface { + Ping(url.mojom.Url source_url, string source_event); +}; diff --git a/third_party/blink/public/web/web_local_frame.h b/third_party/blink/public/web/web_local_frame.h index 2db0a759786b16..dfc62665afb7c8 100644 --- a/third_party/blink/public/web/web_local_frame.h +++ b/third_party/blink/public/web/web_local_frame.h @@ -77,6 +77,7 @@ class WebLocalFrame : public WebFrame { WebView*, WebLocalFrameClient*, blink::InterfaceRegistry*, + mojo::ScopedMessagePipeHandle, WebFrame* opener = nullptr, const WebString& name = WebString(), WebSandboxFlags = WebSandboxFlags::kNone); @@ -101,6 +102,7 @@ class WebLocalFrame : public WebFrame { BLINK_EXPORT static WebLocalFrame* CreateProvisional( WebLocalFrameClient*, blink::InterfaceRegistry*, + mojo::ScopedMessagePipeHandle, WebRemoteFrame*, WebSandboxFlags, ParsedFeaturePolicy); @@ -110,7 +112,8 @@ class WebLocalFrame : public WebFrame { // it's no longer needed. virtual WebLocalFrame* CreateLocalChild(WebTreeScopeType, WebLocalFrameClient*, - blink::InterfaceRegistry*) = 0; + blink::InterfaceRegistry*, + mojo::ScopedMessagePipeHandle) = 0; // Returns the WebFrame associated with the current V8 context. This // function can return 0 if the context is associated with a Document that diff --git a/third_party/blink/public/web/web_local_frame_client.h b/third_party/blink/public/web/web_local_frame_client.h index 1e192d06aeb5a7..148ea2ff946658 100644 --- a/third_party/blink/public/web/web_local_frame_client.h +++ b/third_party/blink/public/web/web_local_frame_client.h @@ -398,7 +398,8 @@ class BLINK_EXPORT WebLocalFrameClient { // body is known. virtual void DidCommitProvisionalLoad(const WebHistoryItem&, WebHistoryCommitType, - WebGlobalObjectReusePolicy) {} + WebGlobalObjectReusePolicy, + mojo::ScopedMessagePipeHandle) {} // The frame's document has just been initialized. virtual void DidCreateNewDocument() {} diff --git a/third_party/blink/public/web/web_remote_frame.h b/third_party/blink/public/web/web_remote_frame.h index 25aed36088808b..07710adc2c7af8 100644 --- a/third_party/blink/public/web/web_remote_frame.h +++ b/third_party/blink/public/web/web_remote_frame.h @@ -55,6 +55,7 @@ class WebRemoteFrame : public WebFrame { WebSandboxFlags, WebLocalFrameClient*, blink::InterfaceRegistry*, + mojo::ScopedMessagePipeHandle, WebFrame* previous_sibling, const ParsedFeaturePolicy&, const WebFrameOwnerProperties&, diff --git a/third_party/blink/renderer/core/exported/local_frame_client_impl.cc b/third_party/blink/renderer/core/exported/local_frame_client_impl.cc index f079e52088ee93..a86a862ac65696 100644 --- a/third_party/blink/renderer/core/exported/local_frame_client_impl.cc +++ b/third_party/blink/renderer/core/exported/local_frame_client_impl.cc @@ -160,11 +160,21 @@ void ResetWheelAndTouchEventHandlerProperties(LocalFrame& frame) { } // namespace -LocalFrameClientImpl::LocalFrameClientImpl(WebLocalFrameImpl* frame) - : web_frame_(frame) {} +LocalFrameClientImpl::LocalFrameClientImpl( + WebLocalFrameImpl* frame, + mojo::ScopedMessagePipeHandle document_interface_broker_handle) + : web_frame_(frame) { + DCHECK(document_interface_broker_handle.is_valid()); + document_interface_broker_.Bind(mojom::blink::DocumentInterfaceBrokerPtrInfo( + std::move(document_interface_broker_handle), + mojom::blink::DocumentInterfaceBroker::Version_)); +} -LocalFrameClientImpl* LocalFrameClientImpl::Create(WebLocalFrameImpl* frame) { - return MakeGarbageCollected(frame); +LocalFrameClientImpl* LocalFrameClientImpl::Create( + WebLocalFrameImpl* frame, + mojo::ScopedMessagePipeHandle document_interface_broker_handle) { + return MakeGarbageCollected( + frame, std::move(document_interface_broker_handle)); } LocalFrameClientImpl::~LocalFrameClientImpl() = default; @@ -446,8 +456,17 @@ void LocalFrameClientImpl::DispatchDidCommitLoad( } if (web_frame_->Client()) { + mojom::blink::DocumentInterfaceBrokerRequest + document_interface_broker_request; + if (global_object_reuse_policy != + WebGlobalObjectReusePolicy::kUseExisting) { + document_interface_broker_request = + mojo::MakeRequest(&document_interface_broker_); + } + web_frame_->Client()->DidCommitProvisionalLoad( - WebHistoryItem(item), commit_type, global_object_reuse_policy); + WebHistoryItem(item), commit_type, global_object_reuse_policy, + document_interface_broker_request.PassMessagePipe()); if (web_frame_->GetFrame()->IsLocalRoot()) { // This update should be sent as soon as loading the new document begins // so that the browser and compositor could reset their states. However, @@ -1051,6 +1070,12 @@ LocalFrameClientImpl::GetInterfaceProvider() { return web_frame_->Client()->GetInterfaceProvider(); } +mojom::blink::DocumentInterfaceBroker* +LocalFrameClientImpl::GetDocumentInterfaceBroker() { + DCHECK(document_interface_broker_.is_bound()); + return document_interface_broker_.get(); +} + AssociatedInterfaceProvider* LocalFrameClientImpl::GetRemoteNavigationAssociatedInterfaces() { return web_frame_->Client()->GetRemoteNavigationAssociatedInterfaces(); diff --git a/third_party/blink/renderer/core/exported/local_frame_client_impl.h b/third_party/blink/renderer/core/exported/local_frame_client_impl.h index d6136ee8e1f048..e3df52df890c3a 100644 --- a/third_party/blink/renderer/core/exported/local_frame_client_impl.h +++ b/third_party/blink/renderer/core/exported/local_frame_client_impl.h @@ -36,6 +36,7 @@ #include "base/memory/scoped_refptr.h" +#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom-blink.h" #include "third_party/blink/public/platform/web_insecure_request_policy.h" #include "third_party/blink/renderer/core/frame/local_frame_client.h" #include "third_party/blink/renderer/core/frame/web_local_frame_impl.h" @@ -51,9 +52,10 @@ struct WebScrollIntoViewParams; class LocalFrameClientImpl final : public LocalFrameClient { public: - static LocalFrameClientImpl* Create(WebLocalFrameImpl*); + static LocalFrameClientImpl* Create(WebLocalFrameImpl*, + mojo::ScopedMessagePipeHandle); - explicit LocalFrameClientImpl(WebLocalFrameImpl*); + LocalFrameClientImpl(WebLocalFrameImpl*, mojo::ScopedMessagePipeHandle); ~LocalFrameClientImpl() override; void Trace(blink::Visitor*) override; @@ -254,6 +256,9 @@ class LocalFrameClientImpl final : public LocalFrameClient { std::unique_ptr CreateURLLoaderFactory() override; service_manager::InterfaceProvider* GetInterfaceProvider() override; + + mojom::blink::DocumentInterfaceBroker* GetDocumentInterfaceBroker() override; + AssociatedInterfaceProvider* GetRemoteNavigationAssociatedInterfaces() override; @@ -303,6 +308,8 @@ class LocalFrameClientImpl final : public LocalFrameClient { Member web_frame_; String user_agent_; + + mojom::blink::DocumentInterfaceBrokerPtr document_interface_broker_; }; DEFINE_TYPE_CASTS(LocalFrameClientImpl, diff --git a/third_party/blink/renderer/core/exported/web_frame_test.cc b/third_party/blink/renderer/core/exported/web_frame_test.cc index 91bce1707fe55b..dc315ebad00c57 100644 --- a/third_party/blink/renderer/core/exported/web_frame_test.cc +++ b/third_party/blink/renderer/core/exported/web_frame_test.cc @@ -4504,7 +4504,8 @@ class ClearScrollStateOnCommitWebFrameClient // frame_test_helpers::TestWebFrameClient: void DidCommitProvisionalLoad(const WebHistoryItem&, WebHistoryCommitType, - WebGlobalObjectReusePolicy) override { + WebGlobalObjectReusePolicy, + mojo::ScopedMessagePipeHandle) override { Frame()->View()->ResetScrollAndScaleState(); } }; @@ -6670,7 +6671,8 @@ class TestSubstituteDataWebFrameClient } void DidCommitProvisionalLoad(const WebHistoryItem&, WebHistoryCommitType, - WebGlobalObjectReusePolicy) override { + WebGlobalObjectReusePolicy, + mojo::ScopedMessagePipeHandle) override { if (Frame()->GetDocumentLoader()->GetResponse().CurrentRequestUrl() != WebURL(url_test_helpers::ToKURL("about:blank"))) commit_called_ = true; @@ -6724,7 +6726,8 @@ class TestWillInsertBodyWebFrameClient // frame_test_helpers::TestWebFrameClient: void DidCommitProvisionalLoad(const WebHistoryItem&, WebHistoryCommitType, - WebGlobalObjectReusePolicy) override { + WebGlobalObjectReusePolicy, + mojo::ScopedMessagePipeHandle) override { did_load_ = true; } @@ -9602,7 +9605,8 @@ class RemoteToLocalSwapWebFrameClient // frame_test_helpers::TestWebFrameClient: void DidCommitProvisionalLoad(const WebHistoryItem&, WebHistoryCommitType history_commit_type, - WebGlobalObjectReusePolicy) override { + WebGlobalObjectReusePolicy, + mojo::ScopedMessagePipeHandle) override { history_commit_type_ = history_commit_type; remote_frame_->Swap(Frame()); } @@ -9819,7 +9823,8 @@ class CommitTypeWebFrameClient : public frame_test_helpers::TestWebFrameClient { // frame_test_helpers::TestWebFrameClient: void DidCommitProvisionalLoad(const WebHistoryItem&, WebHistoryCommitType history_commit_type, - WebGlobalObjectReusePolicy) override { + WebGlobalObjectReusePolicy, + mojo::ScopedMessagePipeHandle) override { history_commit_type_ = history_commit_type; } @@ -10725,7 +10730,8 @@ class CallbackOrderingWebFrameClient } void DidCommitProvisionalLoad(const WebHistoryItem&, WebHistoryCommitType, - WebGlobalObjectReusePolicy) override { + WebGlobalObjectReusePolicy, + mojo::ScopedMessagePipeHandle) override { EXPECT_EQ(2, callback_count_++); } void DidFinishDocumentLoad() override { EXPECT_EQ(3, callback_count_++); } diff --git a/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc b/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc index eefe4b864996be..fee07e38c7dbf3 100644 --- a/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc +++ b/third_party/blink/renderer/core/exported/web_remote_frame_impl.cc @@ -144,13 +144,15 @@ WebLocalFrame* WebRemoteFrameImpl::CreateLocalChild( WebSandboxFlags sandbox_flags, WebLocalFrameClient* client, blink::InterfaceRegistry* interface_registry, + mojo::ScopedMessagePipeHandle document_interface_broker_handle, WebFrame* previous_sibling, const ParsedFeaturePolicy& container_policy, const WebFrameOwnerProperties& frame_owner_properties, FrameOwnerElementType frame_owner_element_type, WebFrame* opener) { - WebLocalFrameImpl* child = - WebLocalFrameImpl::Create(scope, client, interface_registry, opener); + WebLocalFrameImpl* child = WebLocalFrameImpl::Create( + scope, client, interface_registry, + std::move(document_interface_broker_handle), opener); InsertAfter(child, previous_sibling); RemoteFrameOwner* owner = RemoteFrameOwner::Create( static_cast(sandbox_flags), container_policy, diff --git a/third_party/blink/renderer/core/exported/web_remote_frame_impl.h b/third_party/blink/renderer/core/exported/web_remote_frame_impl.h index be49c0b0ff7bc7..93929468862376 100644 --- a/third_party/blink/renderer/core/exported/web_remote_frame_impl.h +++ b/third_party/blink/renderer/core/exported/web_remote_frame_impl.h @@ -51,6 +51,7 @@ class CORE_EXPORT WebRemoteFrameImpl final WebSandboxFlags, WebLocalFrameClient*, blink::InterfaceRegistry*, + mojo::ScopedMessagePipeHandle, WebFrame* previous_sibling, const ParsedFeaturePolicy&, const WebFrameOwnerProperties&, diff --git a/third_party/blink/renderer/core/exported/web_view_test.cc b/third_party/blink/renderer/core/exported/web_view_test.cc index 2254964f2e449f..053c7083f316e6 100644 --- a/third_party/blink/renderer/core/exported/web_view_test.cc +++ b/third_party/blink/renderer/core/exported/web_view_test.cc @@ -44,6 +44,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/frame/frame_owner_element_type.h" #include "third_party/blink/public/common/manifest/web_display_mode.h" +#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/web_coalesced_input_event.h" #include "third_party/blink/public/platform/web_cursor_info.h" @@ -498,8 +499,10 @@ TEST_F(WebViewTest, SetBaseBackgroundColorBeforeMainFrame) { web_view->SetBaseBackgroundColor(SK_ColorBLUE); EXPECT_EQ(SK_ColorBLUE, web_view->BackgroundColor()); frame_test_helpers::TestWebFrameClient web_frame_client; + mojom::blink::DocumentInterfaceBrokerPtrInfo document_interface_broker; WebLocalFrame* frame = WebLocalFrame::CreateMainFrame( - web_view, &web_frame_client, nullptr, nullptr); + web_view, &web_frame_client, nullptr, + mojo::MakeRequest(&document_interface_broker).PassMessagePipe(), nullptr); web_frame_client.Bind(frame); // This closes the WebView also. web_view->MainFrameWidget()->Close(); @@ -2562,8 +2565,10 @@ TEST_F(WebViewTest, ClientTapHandlingNullWebViewClient) { /*compositing_enabled=*/false, nullptr)); frame_test_helpers::TestWebFrameClient web_frame_client; frame_test_helpers::TestWebWidgetClient web_widget_client; + mojom::blink::DocumentInterfaceBrokerPtrInfo document_interface_broker; WebLocalFrame* local_frame = WebLocalFrame::CreateMainFrame( - web_view, &web_frame_client, nullptr, nullptr); + web_view, &web_frame_client, nullptr, + mojo::MakeRequest(&document_interface_broker).PassMessagePipe(), nullptr); web_frame_client.Bind(local_frame); blink::WebFrameWidget::CreateForMainFrame(&web_widget_client, local_frame); diff --git a/third_party/blink/renderer/core/exported/worker_shadow_page.cc b/third_party/blink/renderer/core/exported/worker_shadow_page.cc index 0fae7d6261021d..c11d7f7c9daa7c 100644 --- a/third_party/blink/renderer/core/exported/worker_shadow_page.cc +++ b/third_party/blink/renderer/core/exported/worker_shadow_page.cc @@ -5,6 +5,7 @@ #include "third_party/blink/renderer/core/exported/worker_shadow_page.h" #include "services/network/public/mojom/referrer_policy.mojom-shared.h" +#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/renderer/core/exported/web_view_impl.h" #include "third_party/blink/renderer/core/loader/frame_load_request.h" @@ -18,6 +19,11 @@ constexpr char kDoNotTrackHeader[] = "DNT"; } // namespace +mojo::ScopedMessagePipeHandle CreateStubDocumentInterfaceBrokerHandle() { + mojom::blink::DocumentInterfaceBrokerPtrInfo info; + return mojo::MakeRequest(&info).PassMessagePipe(); +} + WorkerShadowPage::WorkerShadowPage( Client* client, scoped_refptr loader_factory, @@ -28,13 +34,14 @@ WorkerShadowPage::WorkerShadowPage( /*is_hidden=*/false, /*compositing_enabled=*/false, nullptr)), - main_frame_( - WebLocalFrameImpl::CreateMainFrame(web_view_, - this, - nullptr /* interface_registry */, - nullptr /* opener */, - g_empty_atom, - WebSandboxFlags::kNone)), + main_frame_(WebLocalFrameImpl::CreateMainFrame( + web_view_, + this, + nullptr /* interface_registry */, + CreateStubDocumentInterfaceBrokerHandle(), + nullptr /* opener */, + g_empty_atom, + WebSandboxFlags::kNone)), loader_factory_(std::move(loader_factory)), preferences_(std::move(preferences)) { DCHECK(IsMainThread()); diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.cc b/third_party/blink/renderer/core/frame/frame_test_helpers.cc index 2a8d37d4c0db53..eac9562f1539e2 100644 --- a/third_party/blink/renderer/core/frame/frame_test_helpers.cc +++ b/third_party/blink/renderer/core/frame/frame_test_helpers.cc @@ -182,8 +182,10 @@ WebLocalFrameImpl* CreateLocalChild(WebLocalFrame& parent, TestWebFrameClient* client) { std::unique_ptr owned_client; client = CreateDefaultClientIfNeeded(client, owned_client); - WebLocalFrameImpl* frame = - ToWebLocalFrameImpl(parent.CreateLocalChild(scope, client, nullptr)); + mojom::blink::DocumentInterfaceBrokerPtrInfo document_interface_broker; + WebLocalFrameImpl* frame = ToWebLocalFrameImpl(parent.CreateLocalChild( + scope, client, nullptr, + mojo::MakeRequest(&document_interface_broker).PassMessagePipe())); client->Bind(frame, std::move(owned_client)); return frame; } @@ -194,8 +196,10 @@ WebLocalFrameImpl* CreateLocalChild( std::unique_ptr self_owned) { DCHECK(self_owned); TestWebFrameClient* client = self_owned.get(); - WebLocalFrameImpl* frame = - ToWebLocalFrameImpl(parent.CreateLocalChild(scope, client, nullptr)); + mojom::blink::DocumentInterfaceBrokerPtrInfo document_interface_broker; + WebLocalFrameImpl* frame = ToWebLocalFrameImpl(parent.CreateLocalChild( + scope, client, nullptr, + mojo::MakeRequest(&document_interface_broker).PassMessagePipe())); client->Bind(frame, std::move(self_owned)); return frame; } @@ -204,10 +208,12 @@ WebLocalFrameImpl* CreateProvisional(WebRemoteFrame& old_frame, TestWebFrameClient* client) { std::unique_ptr owned_client; client = CreateDefaultClientIfNeeded(client, owned_client); + mojom::blink::DocumentInterfaceBrokerPtrInfo document_interface_broker; WebLocalFrameImpl* frame = ToWebLocalFrameImpl(WebLocalFrame::CreateProvisional( - client, nullptr, &old_frame, WebSandboxFlags::kNone, - ParsedFeaturePolicy())); + client, nullptr, + mojo::MakeRequest(&document_interface_broker).PassMessagePipe(), + &old_frame, WebSandboxFlags::kNone, ParsedFeaturePolicy())); client->Bind(frame, std::move(owned_client)); // Create a local root, if necessary. if (!frame->Parent()) { @@ -245,9 +251,11 @@ WebLocalFrameImpl* CreateLocalChild(WebRemoteFrame& parent, TestWebWidgetClient* widget_client) { std::unique_ptr owned_client; client = CreateDefaultClientIfNeeded(client, owned_client); + mojom::blink::DocumentInterfaceBrokerPtrInfo document_interface_broker; WebLocalFrameImpl* frame = ToWebLocalFrameImpl(parent.CreateLocalChild( WebTreeScopeType::kDocument, name, WebSandboxFlags::kNone, client, - nullptr, previous_sibling, ParsedFeaturePolicy(), properties, + nullptr, mojo::MakeRequest(&document_interface_broker).PassMessagePipe(), + previous_sibling, ParsedFeaturePolicy(), properties, FrameOwnerElementType::kIframe, nullptr)); client->Bind(frame, std::move(owned_client)); @@ -306,8 +314,10 @@ WebViewImpl* WebViewHelper::InitializeWithOpener( std::unique_ptr owned_web_frame_client; web_frame_client = CreateDefaultClientIfNeeded(web_frame_client, owned_web_frame_client); + mojom::blink::DocumentInterfaceBrokerPtrInfo document_interface_broker; WebLocalFrame* frame = WebLocalFrame::CreateMainFrame( - web_view_, web_frame_client, nullptr, opener); + web_view_, web_frame_client, nullptr, + mojo::MakeRequest(&document_interface_broker).PassMessagePipe(), opener); web_frame_client->Bind(frame, std::move(owned_web_frame_client)); // TODO(dcheng): The main frame widget currently has a special case. diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc index f2263323d9e333..49b450b486162e 100644 --- a/third_party/blink/renderer/core/frame/local_frame.cc +++ b/third_party/blink/renderer/core/frame/local_frame.cc @@ -1288,6 +1288,12 @@ service_manager::InterfaceProvider& LocalFrame::GetInterfaceProvider() { return *Client()->GetInterfaceProvider(); } +mojom::blink::DocumentInterfaceBroker& +LocalFrame::GetDocumentInterfaceBroker() { + DCHECK(Client()); + return *Client()->GetDocumentInterfaceBroker(); +} + AssociatedInterfaceProvider* LocalFrame::GetRemoteNavigationAssociatedInterfaces() { DCHECK(Client()); diff --git a/third_party/blink/renderer/core/frame/local_frame.h b/third_party/blink/renderer/core/frame/local_frame.h index 736cf962834aa1..ddea30d0fee062 100644 --- a/third_party/blink/renderer/core/frame/local_frame.h +++ b/third_party/blink/renderer/core/frame/local_frame.h @@ -107,6 +107,12 @@ class WebContentSettingsClient; class WebPluginContainerImpl; class WebURLLoaderFactory; +namespace mojom { +namespace blink { +class DocumentInterfaceBroker; +} // namespace blink +} // namespace mojom + extern template class CORE_EXTERN_TEMPLATE_EXPORT Supplement; class CORE_EXPORT LocalFrame final : public Frame, @@ -296,6 +302,7 @@ class CORE_EXPORT LocalFrame final : public Frame, bool CanNavigate(const Frame&, const KURL& destination_url = KURL()); service_manager::InterfaceProvider& GetInterfaceProvider(); + mojom::blink::DocumentInterfaceBroker& GetDocumentInterfaceBroker(); InterfaceRegistry* GetInterfaceRegistry() { return interface_registry_; } // Returns an AssociatedInterfaceProvider the frame can use to request diff --git a/third_party/blink/renderer/core/frame/local_frame_client.h b/third_party/blink/renderer/core/frame/local_frame_client.h index 7446af713c8158..c4e16d5499c0d1 100644 --- a/third_party/blink/renderer/core/frame/local_frame_client.h +++ b/third_party/blink/renderer/core/frame/local_frame_client.h @@ -77,6 +77,10 @@ class InterfaceProvider; namespace blink { namespace mojom { enum class WebFeature : int32_t; + +namespace blink { +class DocumentInterfaceBroker; +} // namespace blink } // namespace mojom class AssociatedInterfaceProvider; @@ -381,6 +385,10 @@ class CORE_EXPORT LocalFrameClient : public FrameClient { return nullptr; } + virtual mojom::blink::DocumentInterfaceBroker* GetDocumentInterfaceBroker() { + return nullptr; + } + virtual AssociatedInterfaceProvider* GetRemoteNavigationAssociatedInterfaces() { return nullptr; diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc index 07f7adf673d669..5331c6eb030fa2 100644 --- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc +++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc @@ -1633,30 +1633,36 @@ WebLocalFrame* WebLocalFrame::CreateMainFrame( WebView* web_view, WebLocalFrameClient* client, InterfaceRegistry* interface_registry, + mojo::ScopedMessagePipeHandle document_interface_broker_handle, WebFrame* opener, const WebString& name, WebSandboxFlags sandbox_flags) { return WebLocalFrameImpl::CreateMainFrame( - web_view, client, interface_registry, opener, name, sandbox_flags); + web_view, client, interface_registry, + std::move(document_interface_broker_handle), opener, name, sandbox_flags); } WebLocalFrame* WebLocalFrame::CreateProvisional( WebLocalFrameClient* client, InterfaceRegistry* interface_registry, + mojo::ScopedMessagePipeHandle document_interface_broker_handle, WebRemoteFrame* old_web_frame, WebSandboxFlags flags, ParsedFeaturePolicy container_policy) { return WebLocalFrameImpl::CreateProvisional( - client, interface_registry, old_web_frame, flags, container_policy); + client, interface_registry, std::move(document_interface_broker_handle), + old_web_frame, flags, container_policy); } WebLocalFrameImpl* WebLocalFrameImpl::Create( WebTreeScopeType scope, WebLocalFrameClient* client, blink::InterfaceRegistry* interface_registry, + mojo::ScopedMessagePipeHandle document_interface_broker_handle, WebFrame* opener) { WebLocalFrameImpl* frame = MakeGarbageCollected( - scope, client, interface_registry); + scope, client, interface_registry, + std::move(document_interface_broker_handle)); frame->SetOpener(opener); return frame; } @@ -1665,11 +1671,13 @@ WebLocalFrameImpl* WebLocalFrameImpl::CreateMainFrame( WebView* web_view, WebLocalFrameClient* client, InterfaceRegistry* interface_registry, + mojo::ScopedMessagePipeHandle document_interface_broker_handle, WebFrame* opener, const WebString& name, WebSandboxFlags sandbox_flags) { WebLocalFrameImpl* frame = MakeGarbageCollected( - WebTreeScopeType::kDocument, client, interface_registry); + WebTreeScopeType::kDocument, client, interface_registry, + std::move(document_interface_broker_handle)); frame->SetOpener(opener); Page& page = *static_cast(web_view)->GetPage(); DCHECK(!page.MainFrame()); @@ -1683,12 +1691,14 @@ WebLocalFrameImpl* WebLocalFrameImpl::CreateMainFrame( WebLocalFrameImpl* WebLocalFrameImpl::CreateProvisional( WebLocalFrameClient* client, blink::InterfaceRegistry* interface_registry, + mojo::ScopedMessagePipeHandle document_interface_broker_handle, WebRemoteFrame* old_web_frame, WebSandboxFlags flags, ParsedFeaturePolicy container_policy) { DCHECK(client); WebLocalFrameImpl* web_frame = MakeGarbageCollected( - old_web_frame, client, interface_registry); + old_web_frame, client, interface_registry, + std::move(document_interface_broker_handle)); Frame* old_frame = ToWebRemoteFrameImpl(old_web_frame)->GetFrame(); web_frame->SetParent(old_web_frame->Parent()); web_frame->SetOpener(old_web_frame->Opener()); @@ -1727,9 +1737,11 @@ WebLocalFrameImpl* WebLocalFrameImpl::CreateProvisional( WebLocalFrameImpl* WebLocalFrameImpl::CreateLocalChild( WebTreeScopeType scope, WebLocalFrameClient* client, - blink::InterfaceRegistry* interface_registry) { + blink::InterfaceRegistry* interface_registry, + mojo::ScopedMessagePipeHandle document_interface_broker_handle) { WebLocalFrameImpl* frame = MakeGarbageCollected( - scope, client, interface_registry); + scope, client, interface_registry, + std::move(document_interface_broker_handle)); AppendChild(frame); return frame; } @@ -1737,10 +1749,13 @@ WebLocalFrameImpl* WebLocalFrameImpl::CreateLocalChild( WebLocalFrameImpl::WebLocalFrameImpl( WebTreeScopeType scope, WebLocalFrameClient* client, - blink::InterfaceRegistry* interface_registry) + blink::InterfaceRegistry* interface_registry, + mojo::ScopedMessagePipeHandle document_interface_broker_handle) : WebNavigationControl(scope), client_(client), - local_frame_client_(LocalFrameClientImpl::Create(this)), + local_frame_client_(LocalFrameClientImpl::Create( + this, + std::move(document_interface_broker_handle))), autofill_client_(nullptr), find_in_page_(FindInPage::Create(*this, interface_registry)), interface_registry_(interface_registry), @@ -1755,12 +1770,14 @@ WebLocalFrameImpl::WebLocalFrameImpl( WebLocalFrameImpl::WebLocalFrameImpl( WebRemoteFrame* old_web_frame, WebLocalFrameClient* client, - blink::InterfaceRegistry* interface_registry) + blink::InterfaceRegistry* interface_registry, + mojo::ScopedMessagePipeHandle document_interface_broker_handle) : WebLocalFrameImpl(old_web_frame->InShadowTree() ? WebTreeScopeType::kShadow : WebTreeScopeType::kDocument, client, - interface_registry) {} + interface_registry, + std::move(document_interface_broker_handle)) {} WebLocalFrameImpl::~WebLocalFrameImpl() { // The widget for the frame, if any, must have already been closed. diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.h b/third_party/blink/renderer/core/frame/web_local_frame_impl.h index 2456cee65fb951..ff8e60791cfdf4 100644 --- a/third_party/blink/renderer/core/frame/web_local_frame_impl.h +++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.h @@ -253,7 +253,8 @@ class CORE_EXPORT WebLocalFrameImpl final // WebLocalFrame methods: WebLocalFrameImpl* CreateLocalChild(WebTreeScopeType, WebLocalFrameClient*, - blink::InterfaceRegistry*) override; + blink::InterfaceRegistry*, + mojo::ScopedMessagePipeHandle) override; void SetAutofillClient(WebAutofillClient*) override; WebAutofillClient* AutofillClient() override; bool IsLocalRoot() const override; @@ -334,25 +335,30 @@ class CORE_EXPORT WebLocalFrameImpl final static WebLocalFrameImpl* Create(WebTreeScopeType, WebLocalFrameClient*, InterfaceRegistry*, + mojo::ScopedMessagePipeHandle, WebFrame* opener); static WebLocalFrameImpl* CreateMainFrame(WebView*, WebLocalFrameClient*, InterfaceRegistry*, + mojo::ScopedMessagePipeHandle, WebFrame* opener, const WebString& name, WebSandboxFlags); static WebLocalFrameImpl* CreateProvisional(WebLocalFrameClient*, InterfaceRegistry*, + mojo::ScopedMessagePipeHandle, WebRemoteFrame*, WebSandboxFlags, ParsedFeaturePolicy); WebLocalFrameImpl(WebTreeScopeType, WebLocalFrameClient*, - blink::InterfaceRegistry*); + blink::InterfaceRegistry*, + mojo::ScopedMessagePipeHandle); WebLocalFrameImpl(WebRemoteFrame*, WebLocalFrameClient*, - blink::InterfaceRegistry*); + blink::InterfaceRegistry*, + mojo::ScopedMessagePipeHandle); ~WebLocalFrameImpl() override; LocalFrame* CreateChildFrame(const AtomicString& name, diff --git a/third_party/blink/renderer/core/loader/empty_clients.cc b/third_party/blink/renderer/core/loader/empty_clients.cc index 563d50cf472677..aa71822513ae10 100644 --- a/third_party/blink/renderer/core/loader/empty_clients.cc +++ b/third_party/blink/renderer/core/loader/empty_clients.cc @@ -123,6 +123,12 @@ DocumentLoader* EmptyLocalFrameClient::CreateDocumentLoader( std::move(navigation_params)); } +mojom::blink::DocumentInterfaceBroker* +EmptyLocalFrameClient::GetDocumentInterfaceBroker() { + mojo::MakeRequest(&document_interface_broker_); + return document_interface_broker_.get(); +} + LocalFrame* EmptyLocalFrameClient::CreateFrame(const AtomicString&, HTMLFrameOwnerElement*) { return nullptr; diff --git a/third_party/blink/renderer/core/loader/empty_clients.h b/third_party/blink/renderer/core/loader/empty_clients.h index e6c7881242fc5b..c8684c4c2f211d 100644 --- a/third_party/blink/renderer/core/loader/empty_clients.h +++ b/third_party/blink/renderer/core/loader/empty_clients.h @@ -34,6 +34,7 @@ #include "base/macros.h" #include "cc/paint/paint_canvas.h" #include "services/service_manager/public/cpp/interface_provider.h" +#include "third_party/blink/public/mojom/frame/document_interface_broker.mojom-blink.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/web_focus_type.h" #include "third_party/blink/public/platform/web_menu_source_type.h" @@ -358,6 +359,8 @@ class CORE_EXPORT EmptyLocalFrameClient : public LocalFrameClient { return &interface_provider_; } + mojom::blink::DocumentInterfaceBroker* GetDocumentInterfaceBroker() override; + WebSpellCheckPanelHostClient* SpellCheckPanelHostClient() const override { return nullptr; } @@ -402,6 +405,7 @@ class CORE_EXPORT EmptyLocalFrameClient : public LocalFrameClient { WebTextCheckClient* text_check_client_; service_manager::InterfaceProvider interface_provider_; + mojom::blink::DocumentInterfaceBrokerPtr document_interface_broker_; DISALLOW_COPY_AND_ASSIGN(EmptyLocalFrameClient); }; diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 4ed92e7075e285..99810ffbc3e161 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml @@ -3779,6 +3779,7 @@ uploading your change for review. These are checked by presubmit scripts. +