Index: content/browser/frame_host/render_frame_host_impl.cc |
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc |
index e6d4b1da1e73e3b285bf29309c521a3e2afe1506..791b00c363c041c27f2bbcf8c2cb888b25a71e78 100644 |
--- a/content/browser/frame_host/render_frame_host_impl.cc |
+++ b/content/browser/frame_host/render_frame_host_impl.cc |
@@ -88,6 +88,7 @@ |
#include "content/public/common/file_chooser_params.h" |
#include "content/public/common/isolated_world_ids.h" |
#include "content/public/common/service_manager_connection.h" |
+#include "content/public/common/service_names.h" |
#include "content/public/common/url_constants.h" |
#include "content/public/common/url_utils.h" |
#include "device/generic_sensor/sensor_provider_impl.h" |
@@ -812,7 +813,7 @@ void RenderFrameHostImpl::Create( |
const service_manager::Identity& remote_identity, |
media::mojom::InterfaceFactoryRequest request) { |
auto registry = base::MakeUnique<service_manager::InterfaceRegistry>( |
- service_manager::Identity(), service_manager::InterfaceProviderSpec()); |
+ std::string()); |
#if defined(OS_ANDROID) && defined(ENABLE_MOJO_CDM) |
registry->AddInterface( |
base::Bind(&ProvisionFetcherImpl::Create, this)); |
@@ -822,6 +823,8 @@ void RenderFrameHostImpl::Create( |
service_manager::mojom::InterfaceProviderPtr interfaces; |
registry->Bind(GetProxy(&interfaces), |
service_manager::Identity(), |
+ service_manager::InterfaceProviderSpec(), |
+ service_manager::Identity(), |
service_manager::InterfaceProviderSpec()); |
media_registries_.push_back(std::move(registry)); |
@@ -1536,6 +1539,15 @@ void RenderFrameHostImpl::DisableSwapOutTimerForTesting() { |
swapout_event_monitor_timeout_.reset(); |
} |
+void RenderFrameHostImpl::OnRendererConnect( |
+ const service_manager::ServiceInfo& local_info, |
+ const service_manager::ServiceInfo& remote_info) { |
+ if (remote_info.identity.name() != kRendererServiceName) |
+ return; |
+ browser_info_ = local_info; |
+ renderer_info_ = remote_info; |
+} |
+ |
void RenderFrameHostImpl::OnContextMenu(const ContextMenuParams& params) { |
// Validate the URLs in |params|. If the renderer can't request the URLs |
// directly, don't show them in the context menu. |
@@ -2587,7 +2599,19 @@ void RenderFrameHostImpl::SetUpMojoIfNeeded() { |
return; |
interface_registry_ = base::MakeUnique<service_manager::InterfaceRegistry>( |
- service_manager::Identity(), service_manager::InterfaceProviderSpec()); |
+ mojom::kNavigation_FrameSpec); |
+ |
+ ServiceManagerConnection* service_manager_connection = |
+ BrowserContext::GetServiceManagerConnectionFor( |
+ GetProcess()->GetBrowserContext()); |
+ // |service_manager_connection| may not be set in unit tests using |
+ // TestBrowserContext. |
+ if (service_manager_connection) { |
+ on_connect_handler_id_ = service_manager_connection->AddOnConnectHandler( |
+ base::Bind(&RenderFrameHostImpl::OnRendererConnect, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ } |
+ |
if (!GetProcess()->GetRemoteInterfaces()) |
return; |
@@ -2607,6 +2631,16 @@ void RenderFrameHostImpl::SetUpMojoIfNeeded() { |
void RenderFrameHostImpl::InvalidateMojoConnection() { |
interface_registry_.reset(); |
+ |
+ ServiceManagerConnection* service_manager_connection = |
+ BrowserContext::GetServiceManagerConnectionFor( |
+ GetProcess()->GetBrowserContext()); |
+ // |service_manager_connection| may be null in tests using TestBrowserContext. |
+ if (service_manager_connection) { |
+ service_manager_connection->RemoveOnConnectHandler(on_connect_handler_id_); |
+ on_connect_handler_id_ = 0; |
+ } |
+ |
frame_.reset(); |
frame_host_binding_.Close(); |
@@ -2875,9 +2909,17 @@ void RenderFrameHostImpl::FilesSelectedInChooser( |
void RenderFrameHostImpl::GetInterfaceProvider( |
service_manager::mojom::InterfaceProviderRequest interfaces) { |
+ service_manager::InterfaceProviderSpec browser_spec, renderer_spec; |
+ // TODO(beng): CHECK these return true. |
+ service_manager::GetInterfaceProviderSpec( |
+ mojom::kNavigation_FrameSpec, browser_info_.interface_provider_specs, |
+ &browser_spec); |
+ service_manager::GetInterfaceProviderSpec( |
+ mojom::kNavigation_FrameSpec, renderer_info_.interface_provider_specs, |
+ &renderer_spec); |
interface_registry_->Bind(std::move(interfaces), |
- service_manager::Identity(), |
- service_manager::InterfaceProviderSpec()); |
+ browser_info_.identity, browser_spec, |
+ renderer_info_.identity, renderer_spec); |
} |
#if defined(USE_EXTERNAL_POPUP_MENU) |