Commit 65031e84 authored by Ehsan Karamad's avatar Ehsan Karamad Committed by Commit Bot

[ MimeHandlerView ] Use Associated Binding

Mojo calls from browser to renderer are currently on a non-associated
channel. Essentially, the SetInternalId API on
MimeHandlerViewContianerManager must be received before the document
is loaded. Right now this is not guaranteed and there is room for race
bugs.

Right now SetInternalId seems to be the only IPC which requires to be
on an associated channel. Eventually this IPC could be singled out into
its own interface and have a separate binding in MHCVCM for it.

TBR=wjmaclean@chromium.org

Bug: 659750
Change-Id: I2b337c4876f3eb3e4bc6b1e6f72033ccd4edda03
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1617016Reviewed-by: default avatarEhsan Karamad <ekaramad@chromium.org>
Reviewed-by: default avatarŁukasz Anforowicz <lukasza@chromium.org>
Commit-Queue: Ehsan Karamad <ekaramad@chromium.org>
Cr-Commit-Position: refs/heads/master@{#662511}
parent eefa3a5c
...@@ -462,11 +462,6 @@ void ChromeContentRendererClient::RenderFrameCreated( ...@@ -462,11 +462,6 @@ void ChromeContentRendererClient::RenderFrameCreated(
#if BUILDFLAG(ENABLE_EXTENSIONS) #if BUILDFLAG(ENABLE_EXTENSIONS)
ChromeExtensionsRendererClient::GetInstance()->RenderFrameCreated( ChromeExtensionsRendererClient::GetInstance()->RenderFrameCreated(
render_frame, registry); render_frame, registry);
if (content::MimeHandlerViewMode::UsesCrossProcessFrame()) {
registry->AddInterface(base::BindRepeating(
&extensions::MimeHandlerViewContainerManager::BindRequest,
render_frame->GetRoutingID()));
}
#endif #endif
#if BUILDFLAG(ENABLE_PLUGINS) #if BUILDFLAG(ENABLE_PLUGINS)
...@@ -533,6 +528,14 @@ void ChromeContentRendererClient::RenderFrameCreated( ...@@ -533,6 +528,14 @@ void ChromeContentRendererClient::RenderFrameCreated(
associated_interfaces); associated_interfaces);
} }
#if BUILDFLAG(ENABLE_EXTENSIONS)
if (content::MimeHandlerViewMode::UsesCrossProcessFrame()) {
associated_interfaces->AddInterface(base::BindRepeating(
&extensions::MimeHandlerViewContainerManager::BindRequest,
render_frame->GetRoutingID()));
}
#endif
// Owned by |render_frame|. // Owned by |render_frame|.
page_load_metrics::MetricsRenderFrameObserver* metrics_render_frame_observer = page_load_metrics::MetricsRenderFrameObserver* metrics_render_frame_observer =
new page_load_metrics::MetricsRenderFrameObserver(render_frame); new page_load_metrics::MetricsRenderFrameObserver(render_frame);
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h" #include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h"
#include "extensions/common/guest_view/extensions_guest_view_messages.h" #include "extensions/common/guest_view/extensions_guest_view_messages.h"
#include "ppapi/buildflags/buildflags.h" #include "ppapi/buildflags/buildflags.h"
#include "services/service_manager/public/cpp/interface_provider.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
#include "third_party/skia/include/core/SkColor.h" #include "third_party/skia/include/core/SkColor.h"
#if BUILDFLAG(ENABLE_PLUGINS) #if BUILDFLAG(ENABLE_PLUGINS)
...@@ -166,9 +166,10 @@ void MimeHandlerViewAttachHelper::ResumeAttachOrDestroy( ...@@ -166,9 +166,10 @@ void MimeHandlerViewAttachHelper::ResumeAttachOrDestroy(
auto* guest_view = pending_guests_[element_instance_id]; auto* guest_view = pending_guests_[element_instance_id];
pending_guests_.erase(element_instance_id); pending_guests_.erase(element_instance_id);
if (!plugin_rfh) { if (!plugin_rfh) {
mojom::MimeHandlerViewContainerManagerPtr container_manager; mojom::MimeHandlerViewContainerManagerAssociatedPtr container_manager;
guest_view->GetEmbedderFrame()->GetRemoteInterfaces()->GetInterface( guest_view->GetEmbedderFrame()
&container_manager); ->GetRemoteAssociatedInterfaces()
->GetInterface(&container_manager);
container_manager->DestroyFrameContainer(element_instance_id); container_manager->DestroyFrameContainer(element_instance_id);
guest_view->Destroy(true); guest_view->Destroy(true);
return; return;
......
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
#include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/embedded_test_server/embedded_test_server.h"
#include "net/test/embedded_test_server/http_request.h" #include "net/test/embedded_test_server/http_request.h"
#include "services/network/public/cpp/features.h" #include "services/network/public/cpp/features.h"
#include "services/service_manager/public/cpp/interface_provider.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
#include "ui/base/ui_base_features.h" #include "ui/base/ui_base_features.h"
#include "url/url_constants.h" #include "url/url_constants.h"
...@@ -327,9 +327,11 @@ IN_PROC_BROWSER_TEST_P(MimeHandlerViewCrossProcessTest, ...@@ -327,9 +327,11 @@ IN_PROC_BROWSER_TEST_P(MimeHandlerViewCrossProcessTest,
render_frame_observer.WaitUntilDeleted(); render_frame_observer.WaitUntilDeleted();
// Send the IPC. During destruction MHVFC would cause a UaF since it was not // Send the IPC. During destruction MHVFC would cause a UaF since it was not
// removed from the global map. // removed from the global map.
extensions::mojom::MimeHandlerViewContainerManagerPtr container_manager; extensions::mojom::MimeHandlerViewContainerManagerAssociatedPtr
embedder_web_contents->GetMainFrame()->GetRemoteInterfaces()->GetInterface( container_manager;
&container_manager); embedder_web_contents->GetMainFrame()
->GetRemoteAssociatedInterfaces()
->GetInterface(&container_manager);
container_manager->DestroyFrameContainer(element_instance_id); container_manager->DestroyFrameContainer(element_instance_id);
// Running the following JS code fails if the renderer has crashed. // Running the following JS code fails if the renderer has crashed.
ASSERT_TRUE(content::ExecJs(embedder_web_contents, "window.name = 'foo'")); ASSERT_TRUE(content::ExecJs(embedder_web_contents, "window.name = 'foo'"));
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_constants.h" #include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_constants.h"
#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h" #include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h"
#include "extensions/common/mojo/guest_view.mojom.h" #include "extensions/common/mojo/guest_view.mojom.h"
#include "services/service_manager/public/cpp/interface_provider.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
#include "third_party/blink/public/common/frame/frame_owner_element_type.h" #include "third_party/blink/public/common/frame/frame_owner_element_type.h"
namespace extensions { namespace extensions {
...@@ -180,7 +180,7 @@ void MimeHandlerViewEmbedder::DidCreateMimeHandlerViewGuest( ...@@ -180,7 +180,7 @@ void MimeHandlerViewEmbedder::DidCreateMimeHandlerViewGuest(
mojom::MimeHandlerViewContainerManager* mojom::MimeHandlerViewContainerManager*
MimeHandlerViewEmbedder::GetContainerManager() { MimeHandlerViewEmbedder::GetContainerManager() {
if (!container_manager_) { if (!container_manager_) {
render_frame_host_->GetRemoteInterfaces()->GetInterface( render_frame_host_->GetRemoteAssociatedInterfaces()->GetInterface(
&container_manager_); &container_manager_);
} }
return container_manager_.get(); return container_manager_.get();
......
...@@ -78,7 +78,7 @@ class MimeHandlerViewEmbedder : public content::WebContentsObserver { ...@@ -78,7 +78,7 @@ class MimeHandlerViewEmbedder : public content::WebContentsObserver {
// to after it is created. // to after it is created.
mime_handler::BeforeUnloadControlPtrInfo pending_before_unload_control_; mime_handler::BeforeUnloadControlPtrInfo pending_before_unload_control_;
mojom::MimeHandlerViewContainerManagerPtr container_manager_; mojom::MimeHandlerViewContainerManagerAssociatedPtr container_manager_;
const std::string internal_id_; const std::string internal_id_;
......
...@@ -36,8 +36,9 @@ ...@@ -36,8 +36,9 @@
#include "extensions/common/mojo/guest_view.mojom.h" #include "extensions/common/mojo/guest_view.mojom.h"
#include "extensions/strings/grit/extensions_strings.h" #include "extensions/strings/grit/extensions_strings.h"
#include "services/service_manager/public/cpp/binder_registry.h" #include "services/service_manager/public/cpp/binder_registry.h"
#include "services/service_manager/public/cpp/interface_provider.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
#include "third_party/blink/public/platform/web_gesture_event.h" #include "third_party/blink/public/platform/web_gesture_event.h"
using content::WebContents; using content::WebContents;
using guest_view::GuestViewBase; using guest_view::GuestViewBase;
...@@ -114,9 +115,11 @@ MimeHandlerViewGuest::~MimeHandlerViewGuest() { ...@@ -114,9 +115,11 @@ MimeHandlerViewGuest::~MimeHandlerViewGuest() {
if (GetEmbedderFrame() && GetEmbedderFrame()->GetParent()) { if (GetEmbedderFrame() && GetEmbedderFrame()->GetParent()) {
// TODO(ekaramad): This should only be needed if the embedder frame is in // TODO(ekaramad): This should only be needed if the embedder frame is in
// a plugin element (https://crbug.com/957373). // a plugin element (https://crbug.com/957373).
mojom::MimeHandlerViewContainerManagerPtr container_manager; mojom::MimeHandlerViewContainerManagerAssociatedPtr container_manager;
GetEmbedderFrame()->GetParent()->GetRemoteInterfaces()->GetInterface( GetEmbedderFrame()
&container_manager); ->GetParent()
->GetRemoteAssociatedInterfaces()
->GetInterface(&container_manager);
container_manager->DestroyFrameContainer(element_instance_id()); container_manager->DestroyFrameContainer(element_instance_id());
} }
} }
...@@ -448,8 +451,8 @@ void MimeHandlerViewGuest::DocumentOnLoadCompletedInMainFrame() { ...@@ -448,8 +451,8 @@ void MimeHandlerViewGuest::DocumentOnLoadCompletedInMainFrame() {
// just send the upadte to the embedder (full page MHV). // just send the upadte to the embedder (full page MHV).
auto* rfh = maybe_has_frame_container_ ? GetEmbedderFrame()->GetParent() auto* rfh = maybe_has_frame_container_ ? GetEmbedderFrame()->GetParent()
: GetEmbedderFrame(); : GetEmbedderFrame();
mojom::MimeHandlerViewContainerManagerPtr container_manager; mojom::MimeHandlerViewContainerManagerAssociatedPtr container_manager;
rfh->GetRemoteInterfaces()->GetInterface(&container_manager); rfh->GetRemoteAssociatedInterfaces()->GetInterface(&container_manager);
container_manager->DidLoad(element_instance_id(), original_resource_url_); container_manager->DidLoad(element_instance_id(), original_resource_url_);
return; return;
} }
......
...@@ -42,7 +42,7 @@ RenderFrameMap* GetRenderFrameMap() { ...@@ -42,7 +42,7 @@ RenderFrameMap* GetRenderFrameMap() {
// static // static
void MimeHandlerViewContainerManager::BindRequest( void MimeHandlerViewContainerManager::BindRequest(
int32_t routing_id, int32_t routing_id,
mojom::MimeHandlerViewContainerManagerRequest request) { mojom::MimeHandlerViewContainerManagerAssociatedRequest request) {
CHECK(content::MimeHandlerViewMode::UsesCrossProcessFrame()); CHECK(content::MimeHandlerViewMode::UsesCrossProcessFrame());
auto* render_frame = content::RenderFrame::FromRoutingID(routing_id); auto* render_frame = content::RenderFrame::FromRoutingID(routing_id);
if (!render_frame) if (!render_frame)
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
#include "extensions/common/guest_view/mime_handler_view_uma_types.h" #include "extensions/common/guest_view/mime_handler_view_uma_types.h"
#include "extensions/common/mojo/guest_view.mojom.h" #include "extensions/common/mojo/guest_view.mojom.h"
#include "extensions/renderer/guest_view/mime_handler_view/post_message_support.h" #include "extensions/renderer/guest_view/mime_handler_view/post_message_support.h"
#include "mojo/public/cpp/bindings/binding_set.h" #include "mojo/public/cpp/bindings/associated_binding_set.h"
#include "third_party/blink/public/web/web_element.h" #include "third_party/blink/public/web/web_element.h"
#include "url/gurl.h" #include "url/gurl.h"
...@@ -49,7 +49,7 @@ class MimeHandlerViewContainerManager ...@@ -49,7 +49,7 @@ class MimeHandlerViewContainerManager
public: public:
static void BindRequest( static void BindRequest(
int32_t routing_id, int32_t routing_id,
mojom::MimeHandlerViewContainerManagerRequest request); mojom::MimeHandlerViewContainerManagerAssociatedRequest request);
// Returns the container manager associated with |render_frame|. If none // Returns the container manager associated with |render_frame|. If none
// exists and |create_if_does_not_exist| is set true, creates and returns a // exists and |create_if_does_not_exist| is set true, creates and returns a
// new instance for |render_frame|. // new instance for |render_frame|.
...@@ -134,7 +134,7 @@ class MimeHandlerViewContainerManager ...@@ -134,7 +134,7 @@ class MimeHandlerViewContainerManager
// The plugin element that is managed by MimeHandlerViewContainerManager. // The plugin element that is managed by MimeHandlerViewContainerManager.
blink::WebElement plugin_element_; blink::WebElement plugin_element_;
mojo::BindingSet<mojom::MimeHandlerViewContainerManager> bindings_; mojo::AssociatedBindingSet<mojom::MimeHandlerViewContainerManager> bindings_;
mojo::Binding<mime_handler::BeforeUnloadControl> mojo::Binding<mime_handler::BeforeUnloadControl>
before_unload_control_binding_; before_unload_control_binding_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment