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

Side by Side Diff: content/browser/frame_host/render_frame_host_impl.cc

Issue 2821473002: Service CreateNewWindow on the UI thread with a new mojo interface (Closed)
Patch Set: s/FrameInterfaceBroker/FrameHostInterfaceBroker and s/frame_interface_broker/frame_host_interface_b… Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/frame_host/render_frame_host_impl.h" 5 #include "content/browser/frame_host/render_frame_host_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/command_line.h" 11 #include "base/command_line.h"
12 #include "base/containers/hash_tables.h" 12 #include "base/containers/hash_tables.h"
13 #include "base/lazy_instance.h" 13 #include "base/lazy_instance.h"
14 #include "base/memory/ptr_util.h" 14 #include "base/memory/ptr_util.h"
15 #include "base/metrics/histogram_macros.h" 15 #include "base/metrics/histogram_macros.h"
16 #include "base/metrics/user_metrics.h" 16 #include "base/metrics/user_metrics.h"
17 #include "base/process/kill.h" 17 #include "base/process/kill.h"
18 #include "base/time/time.h" 18 #include "base/time/time.h"
19 #include "build/build_config.h" 19 #include "build/build_config.h"
20 #include "content/browser/accessibility/browser_accessibility_manager.h" 20 #include "content/browser/accessibility/browser_accessibility_manager.h"
21 #include "content/browser/accessibility/browser_accessibility_state_impl.h" 21 #include "content/browser/accessibility/browser_accessibility_state_impl.h"
22 #include "content/browser/bluetooth/web_bluetooth_service_impl.h" 22 #include "content/browser/bluetooth/web_bluetooth_service_impl.h"
23 #include "content/browser/browser_main_loop.h" 23 #include "content/browser/browser_main_loop.h"
24 #include "content/browser/child_process_security_policy_impl.h" 24 #include "content/browser/child_process_security_policy_impl.h"
25 #include "content/browser/devtools/render_frame_devtools_agent_host.h" 25 #include "content/browser/devtools/render_frame_devtools_agent_host.h"
26 #include "content/browser/dom_storage/dom_storage_context_wrapper.h"
26 #include "content/browser/download/mhtml_generation_manager.h" 27 #include "content/browser/download/mhtml_generation_manager.h"
27 #include "content/browser/frame_host/cross_process_frame_connector.h" 28 #include "content/browser/frame_host/cross_process_frame_connector.h"
28 #include "content/browser/frame_host/debug_urls.h" 29 #include "content/browser/frame_host/debug_urls.h"
29 #include "content/browser/frame_host/frame_tree.h" 30 #include "content/browser/frame_host/frame_tree.h"
30 #include "content/browser/frame_host/frame_tree_node.h" 31 #include "content/browser/frame_host/frame_tree_node.h"
31 #include "content/browser/frame_host/navigation_entry_impl.h" 32 #include "content/browser/frame_host/navigation_entry_impl.h"
32 #include "content/browser/frame_host/navigation_handle_impl.h" 33 #include "content/browser/frame_host/navigation_handle_impl.h"
33 #include "content/browser/frame_host/navigation_request.h" 34 #include "content/browser/frame_host/navigation_request.h"
34 #include "content/browser/frame_host/navigator.h" 35 #include "content/browser/frame_host/navigator.h"
35 #include "content/browser/frame_host/navigator_impl.h" 36 #include "content/browser/frame_host/navigator_impl.h"
(...skipping 16 matching lines...) Expand all
52 #include "content/browser/renderer_host/render_view_host_delegate_view.h" 53 #include "content/browser/renderer_host/render_view_host_delegate_view.h"
53 #include "content/browser/renderer_host/render_view_host_impl.h" 54 #include "content/browser/renderer_host/render_view_host_impl.h"
54 #include "content/browser/renderer_host/render_widget_host_delegate.h" 55 #include "content/browser/renderer_host/render_widget_host_delegate.h"
55 #include "content/browser/renderer_host/render_widget_host_impl.h" 56 #include "content/browser/renderer_host/render_widget_host_impl.h"
56 #include "content/browser/renderer_host/render_widget_host_view_base.h" 57 #include "content/browser/renderer_host/render_widget_host_view_base.h"
57 #include "content/browser/shared_worker/shared_worker_service_impl.h" 58 #include "content/browser/shared_worker/shared_worker_service_impl.h"
58 #include "content/browser/websockets/websocket_manager.h" 59 #include "content/browser/websockets/websocket_manager.h"
59 #include "content/browser/webui/web_ui_controller_factory_registry.h" 60 #include "content/browser/webui/web_ui_controller_factory_registry.h"
60 #include "content/common/accessibility_messages.h" 61 #include "content/common/accessibility_messages.h"
61 #include "content/common/associated_interface_provider_impl.h" 62 #include "content/common/associated_interface_provider_impl.h"
63 #include "content/common/associated_interface_registry_impl.h"
62 #include "content/common/associated_interfaces.mojom.h" 64 #include "content/common/associated_interfaces.mojom.h"
63 #include "content/common/content_security_policy/content_security_policy.h" 65 #include "content/common/content_security_policy/content_security_policy.h"
64 #include "content/common/frame_messages.h" 66 #include "content/common/frame_messages.h"
65 #include "content/common/frame_owner_properties.h" 67 #include "content/common/frame_owner_properties.h"
66 #include "content/common/input_messages.h" 68 #include "content/common/input_messages.h"
67 #include "content/common/inter_process_time_ticks_converter.h" 69 #include "content/common/inter_process_time_ticks_converter.h"
68 #include "content/common/navigation_params.h" 70 #include "content/common/navigation_params.h"
69 #include "content/common/render_message_filter.mojom.h" 71 #include "content/common/render_message_filter.mojom.h"
70 #include "content/common/renderer.mojom.h" 72 #include "content/common/renderer.mojom.h"
71 #include "content/common/site_isolation_policy.h" 73 #include "content/common/site_isolation_policy.h"
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 nav_entry_id_(0), 387 nav_entry_id_(0),
386 accessibility_reset_token_(0), 388 accessibility_reset_token_(0),
387 accessibility_reset_count_(0), 389 accessibility_reset_count_(0),
388 browser_plugin_embedder_ax_tree_id_(ui::AXTreeIDRegistry::kNoAXTreeID), 390 browser_plugin_embedder_ax_tree_id_(ui::AXTreeIDRegistry::kNoAXTreeID),
389 no_create_browser_accessibility_manager_for_testing_(false), 391 no_create_browser_accessibility_manager_for_testing_(false),
390 web_ui_type_(WebUI::kNoWebUI), 392 web_ui_type_(WebUI::kNoWebUI),
391 pending_web_ui_type_(WebUI::kNoWebUI), 393 pending_web_ui_type_(WebUI::kNoWebUI),
392 should_reuse_web_ui_(false), 394 should_reuse_web_ui_(false),
393 has_selection_(false), 395 has_selection_(false),
394 last_navigation_previews_state_(PREVIEWS_UNSPECIFIED), 396 last_navigation_previews_state_(PREVIEWS_UNSPECIFIED),
395 frame_host_binding_(this), 397 frame_host_interface_broker_binding_(this),
398 frame_host_associated_binding_(this),
396 waiting_for_init_(renderer_initiated_creation), 399 waiting_for_init_(renderer_initiated_creation),
397 has_focused_editable_element_(false), 400 has_focused_editable_element_(false),
398 weak_ptr_factory_(this) { 401 weak_ptr_factory_(this) {
399 frame_tree_->AddRenderViewHostRef(render_view_host_); 402 frame_tree_->AddRenderViewHostRef(render_view_host_);
400 GetProcess()->AddRoute(routing_id_, this); 403 GetProcess()->AddRoute(routing_id_, this);
401 g_routing_id_frame_map.Get().insert(std::make_pair( 404 g_routing_id_frame_map.Get().insert(std::make_pair(
402 RenderFrameHostID(GetProcess()->GetID(), routing_id_), 405 RenderFrameHostID(GetProcess()->GetID(), routing_id_),
403 this)); 406 this));
404 site_instance_->AddObserver(this); 407 site_instance_->AddObserver(this);
405 GetSiteInstance()->IncrementActiveFrameCount(); 408 GetSiteInstance()->IncrementActiveFrameCount();
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 IPC_MESSAGE_HANDLER(FrameHostMsg_ShowCreatedWindow, OnShowCreatedWindow) 824 IPC_MESSAGE_HANDLER(FrameHostMsg_ShowCreatedWindow, OnShowCreatedWindow)
822 IPC_END_MESSAGE_MAP() 825 IPC_END_MESSAGE_MAP()
823 826
824 // No further actions here, since we may have been deleted. 827 // No further actions here, since we may have been deleted.
825 return handled; 828 return handled;
826 } 829 }
827 830
828 void RenderFrameHostImpl::OnAssociatedInterfaceRequest( 831 void RenderFrameHostImpl::OnAssociatedInterfaceRequest(
829 const std::string& interface_name, 832 const std::string& interface_name,
830 mojo::ScopedInterfaceEndpointHandle handle) { 833 mojo::ScopedInterfaceEndpointHandle handle) {
831 delegate_->OnAssociatedInterfaceRequest( 834 if (associated_registry_->CanBindRequest(interface_name)) {
832 this, interface_name, std::move(handle)); 835 associated_registry_->BindRequest(interface_name, std::move(handle));
836 } else {
837 delegate_->OnAssociatedInterfaceRequest(this, interface_name,
838 std::move(handle));
839 }
833 } 840 }
834 841
835 void RenderFrameHostImpl::AccessibilityPerformAction( 842 void RenderFrameHostImpl::AccessibilityPerformAction(
836 const ui::AXActionData& action_data) { 843 const ui::AXActionData& action_data) {
837 Send(new AccessibilityMsg_PerformAction(routing_id_, action_data)); 844 Send(new AccessibilityMsg_PerformAction(routing_id_, action_data));
838 } 845 }
839 846
840 bool RenderFrameHostImpl::AccessibilityViewHasFocus() const { 847 bool RenderFrameHostImpl::AccessibilityViewHasFocus() const {
841 RenderWidgetHostView* view = render_view_host_->GetWidget()->GetView(); 848 RenderWidgetHostView* view = render_view_host_->GetWidget()->GetView();
842 if (view) 849 if (view)
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
1108 // shutdown). Ignore such messages. 1115 // shutdown). Ignore such messages.
1109 if (!is_active() || frame_tree_node_->current_frame_host() != this || 1116 if (!is_active() || frame_tree_node_->current_frame_host() != this ||
1110 !render_frame_created_) 1117 !render_frame_created_)
1111 return; 1118 return;
1112 1119
1113 frame_tree_->AddFrame(frame_tree_node_, GetProcess()->GetID(), new_routing_id, 1120 frame_tree_->AddFrame(frame_tree_node_, GetProcess()->GetID(), new_routing_id,
1114 scope, frame_name, frame_unique_name, sandbox_flags, 1121 scope, frame_name, frame_unique_name, sandbox_flags,
1115 container_policy, frame_owner_properties); 1122 container_policy, frame_owner_properties);
1116 } 1123 }
1117 1124
1118 void RenderFrameHostImpl::OnCreateNewWindow(
1119 int32_t render_view_route_id,
1120 int32_t main_frame_route_id,
1121 int32_t main_frame_widget_route_id,
1122 const mojom::CreateNewWindowParams& params,
1123 SessionStorageNamespace* session_storage_namespace) {
1124 mojom::CreateNewWindowParamsPtr validated_params(params.Clone());
1125 GetProcess()->FilterURL(false, &validated_params->target_url);
1126
1127 // TODO(nick): http://crbug.com/674307 |opener_url|, |opener_security_origin|,
1128 // and |opener_top_level_frame_url| should not be parameters; we can just use
1129 // last_committed_url(), etc. Of these, |opener_top_level_frame_url| is
1130 // particularly egregious, since an oopif isn't expected to know its top URL.
1131 GetProcess()->FilterURL(false, &validated_params->opener_url);
1132 GetProcess()->FilterURL(true, &validated_params->opener_security_origin);
1133
1134 // Ignore creation when sent from a frame that's not current.
1135 if (frame_tree_node_->current_frame_host() == this) {
1136 delegate_->CreateNewWindow(GetSiteInstance(), render_view_route_id,
1137 main_frame_route_id, main_frame_widget_route_id,
1138 *validated_params, session_storage_namespace);
1139 }
1140
1141 // Our caller (RenderWidgetHelper::OnCreateNewWindowOnUI) will send
1142 // ViewMsg_Close if the above step did not adopt |main_frame_route_id|.
1143 }
1144
1145 void RenderFrameHostImpl::SetLastCommittedOrigin(const url::Origin& origin) { 1125 void RenderFrameHostImpl::SetLastCommittedOrigin(const url::Origin& origin) {
1146 last_committed_origin_ = origin; 1126 last_committed_origin_ = origin;
1147 CSPContext::SetSelf(origin); 1127 CSPContext::SetSelf(origin);
1148 } 1128 }
1149 1129
1150 void RenderFrameHostImpl::OnDetach() { 1130 void RenderFrameHostImpl::OnDetach() {
1151 frame_tree_->RemoveFrame(frame_tree_node_); 1131 frame_tree_->RemoveFrame(frame_tree_node_);
1152 } 1132 }
1153 1133
1154 void RenderFrameHostImpl::OnFrameFocused() { 1134 void RenderFrameHostImpl::OnFrameFocused() {
(...skipping 1296 matching lines...) Expand 10 before | Expand all | Expand 10 after
2451 #endif 2431 #endif
2452 2432
2453 void RenderFrameHostImpl::OnShowCreatedWindow(int pending_widget_routing_id, 2433 void RenderFrameHostImpl::OnShowCreatedWindow(int pending_widget_routing_id,
2454 WindowOpenDisposition disposition, 2434 WindowOpenDisposition disposition,
2455 const gfx::Rect& initial_rect, 2435 const gfx::Rect& initial_rect,
2456 bool user_gesture) { 2436 bool user_gesture) {
2457 delegate_->ShowCreatedWindow(GetProcess()->GetID(), pending_widget_routing_id, 2437 delegate_->ShowCreatedWindow(GetProcess()->GetID(), pending_widget_routing_id,
2458 disposition, initial_rect, user_gesture); 2438 disposition, initial_rect, user_gesture);
2459 } 2439 }
2460 2440
2441 void RenderFrameHostImpl::CreateNewWindow(
2442 mojom::CreateNewWindowParamsPtr params,
2443 const CreateNewWindowCallback& callback) {
2444 DCHECK_CURRENTLY_ON(BrowserThread::UI);
2445
2446 bool no_javascript_access = false;
2447
2448 // Ignore creation when sent from a frame that's not current or created.
2449 bool can_create_window =
2450 frame_tree_node_->current_frame_host() == this && render_frame_created_ &&
dcheng 2017/04/24 14:00:39 Out of curiosity, why didn't the original need to
Charlie Harrison 2017/04/24 14:26:37 This sounds like a good solution, and it looks pre
dcheng 2017/04/24 14:43:44 Acknowledged.
2451 GetContentClient()->browser()->CanCreateWindow(
2452 this, params->opener_url, params->opener_top_level_frame_url,
2453 params->opener_security_origin, params->window_container_type,
2454 params->target_url, params->referrer, params->frame_name,
2455 params->disposition, *params->features, params->user_gesture,
2456 params->opener_suppressed, &no_javascript_access);
2457
2458 mojom::CreateNewWindowReplyPtr reply = mojom::CreateNewWindowReply::New();
2459 if (!can_create_window) {
2460 RunCreateWindowCompleteCallback(callback, std::move(reply),
2461 MSG_ROUTING_NONE, MSG_ROUTING_NONE,
2462 MSG_ROUTING_NONE, 0);
2463 return;
2464 }
2465
2466 // This will clone the sessionStorage for namespace_id_to_clone.
2467
2468 StoragePartition* storage_partition = BrowserContext::GetStoragePartition(
2469 GetSiteInstance()->GetBrowserContext(), GetSiteInstance());
2470 DOMStorageContextWrapper* dom_storage_context =
2471 static_cast<DOMStorageContextWrapper*>(
2472 storage_partition->GetDOMStorageContext());
2473 scoped_refptr<SessionStorageNamespaceImpl> cloned_namespace =
dcheng 2017/04/24 14:00:40 If you're feeling adventurous, one new possibility
Charlie Harrison 2017/04/24 14:26:37 Hey! I didn't know we had that! Did I miss a chrom
dcheng 2017/04/24 14:43:44 It's relatively new and there's been no PSA. I thi
Charlie Harrison 2017/04/24 14:49:07 base/style owners have 100% successfully condition
2474 new SessionStorageNamespaceImpl(dom_storage_context,
2475 params->session_storage_namespace_id);
2476 reply->cloned_session_storage_namespace_id = cloned_namespace->id();
2477
2478 // If the opener is suppressed or script access is disallowed, we should
2479 // open the window in a new BrowsingInstance, and thus a new process. That
2480 // means the current renderer process will not be able to route messages to
2481 // it. Because of this, we will immediately show and navigate the window
2482 // in OnCreateNewWindowOnUI, using the params provided here.
2483 int render_view_route_id = MSG_ROUTING_NONE;
2484 int main_frame_route_id = MSG_ROUTING_NONE;
2485 int main_frame_widget_route_id = MSG_ROUTING_NONE;
2486 int render_process_id = GetProcess()->GetID();
2487 if (!params->opener_suppressed && !no_javascript_access) {
2488 render_view_route_id = GetProcess()->GetNextRoutingID();
2489 main_frame_route_id = GetProcess()->GetNextRoutingID();
2490 // TODO(avi): When RenderViewHostImpl has-a RenderWidgetHostImpl, this
2491 // should be updated to give the widget a distinct routing ID.
2492 // https://crbug.com/545684
2493 main_frame_widget_route_id = render_view_route_id;
2494 // Block resource requests until the frame is created, since the HWND might
2495 // be needed if a response ends up creating a plugin. We'll only have a
2496 // single frame at this point. These requests will be resumed either in
2497 // WebContentsImpl::CreateNewWindow or RenderFrameHost::Init.
2498 // TODO(crbug.com/581037): Now that NPAPI is deprecated we should be able to
2499 // remove this, but more investigation is needed.
2500 auto block_requests_for_route = base::Bind(
2501 [](const GlobalFrameRoutingId& id) {
2502 auto* rdh = ResourceDispatcherHostImpl::Get();
2503 if (rdh)
2504 rdh->BlockRequestsForRoute(id);
2505 },
2506 GlobalFrameRoutingId(render_process_id, main_frame_route_id));
2507 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
2508 block_requests_for_route);
2509 }
2510
2511 DCHECK(IsRenderFrameLive());
2512
2513 // Actually validate the params and create the window.
2514 mojom::CreateNewWindowParamsPtr validated_params(params.Clone());
2515 GetProcess()->FilterURL(false, &validated_params->target_url);
2516
2517 // TODO(nick): http://crbug.com/674307 |opener_url|, |opener_security_origin|,
2518 // and |opener_top_level_frame_url| should not be parameters; we can just use
2519 // last_committed_url(), etc. Of these, |opener_top_level_frame_url| is
2520 // particularly egregious, since an oopif isn't expected to know its top URL.
2521 GetProcess()->FilterURL(false, &validated_params->opener_url);
2522 GetProcess()->FilterURL(true, &validated_params->opener_security_origin);
2523
2524 delegate_->CreateNewWindow(this, render_view_route_id, main_frame_route_id,
2525 main_frame_widget_route_id, *validated_params,
2526 cloned_namespace.get());
2527
2528 // If we did not create a WebContents to host the renderer-created
2529 // RenderFrame/RenderView/RenderWidget objects, make sure to send invalid
2530 // routing ids back to the renderer.
2531 if (main_frame_route_id != MSG_ROUTING_NONE) {
2532 bool succeeded =
2533 RenderWidgetHost::FromID(render_process_id,
2534 main_frame_widget_route_id) != nullptr;
2535 if (!succeeded) {
2536 DCHECK(!RenderFrameHost::FromID(render_process_id, main_frame_route_id));
2537 DCHECK(!RenderViewHost::FromID(render_process_id, render_view_route_id));
2538 RunCreateWindowCompleteCallback(callback, std::move(reply),
2539 MSG_ROUTING_NONE, MSG_ROUTING_NONE,
2540 MSG_ROUTING_NONE, 0);
2541 return;
2542 }
2543 DCHECK(RenderFrameHost::FromID(render_process_id, main_frame_route_id));
2544 DCHECK(RenderViewHost::FromID(render_process_id, render_view_route_id));
2545 }
2546
2547 RunCreateWindowCompleteCallback(
2548 callback, std::move(reply), render_view_route_id, main_frame_route_id,
2549 main_frame_widget_route_id, cloned_namespace->id());
2550 }
2551
2552 void RenderFrameHostImpl::RunCreateWindowCompleteCallback(
2553 const CreateNewWindowCallback& callback,
2554 mojom::CreateNewWindowReplyPtr reply,
2555 int render_view_route_id,
2556 int main_frame_route_id,
2557 int main_frame_widget_route_id,
2558 int cloned_session_storage_namespace_id) {
2559 reply->route_id = render_view_route_id;
2560 reply->main_frame_route_id = main_frame_route_id;
2561 reply->main_frame_widget_route_id = main_frame_widget_route_id;
2562 reply->cloned_session_storage_namespace_id =
2563 cloned_session_storage_namespace_id;
2564 callback.Run(std::move(reply));
2565 }
2566
2461 void RenderFrameHostImpl::RegisterMojoInterfaces() { 2567 void RenderFrameHostImpl::RegisterMojoInterfaces() {
2462 device::GeolocationServiceContext* geolocation_service_context = 2568 device::GeolocationServiceContext* geolocation_service_context =
2463 delegate_ ? delegate_->GetGeolocationServiceContext() : NULL; 2569 delegate_ ? delegate_->GetGeolocationServiceContext() : NULL;
2464 2570
2465 #if !defined(OS_ANDROID) 2571 #if !defined(OS_ANDROID)
2466 // The default (no-op) implementation of InstalledAppProvider. On Android, the 2572 // The default (no-op) implementation of InstalledAppProvider. On Android, the
2467 // real implementation is provided in Java. 2573 // real implementation is provided in Java.
2468 GetInterfaceRegistry()->AddInterface( 2574 GetInterfaceRegistry()->AddInterface(
2469 base::Bind(&InstalledAppProviderImplDefault::Create)); 2575 base::Bind(&InstalledAppProviderImplDefault::Create));
2470 #endif // !defined(OS_ANDROID) 2576 #endif // !defined(OS_ANDROID)
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after
2898 3004
2899 // An error page is expected to commit, hence why is_loading_ is set to true. 3005 // An error page is expected to commit, hence why is_loading_ is set to true.
2900 is_loading_ = true; 3006 is_loading_ = true;
2901 frame_tree_node_->ResetNavigationRequest(true, true); 3007 frame_tree_node_->ResetNavigationRequest(true, true);
2902 } 3008 }
2903 3009
2904 void RenderFrameHostImpl::SetUpMojoIfNeeded() { 3010 void RenderFrameHostImpl::SetUpMojoIfNeeded() {
2905 if (interface_registry_.get()) 3011 if (interface_registry_.get())
2906 return; 3012 return;
2907 3013
3014 associated_registry_ = base::MakeUnique<AssociatedInterfaceRegistryImpl>();
2908 interface_registry_ = base::MakeUnique<service_manager::InterfaceRegistry>( 3015 interface_registry_ = base::MakeUnique<service_manager::InterfaceRegistry>(
2909 mojom::kNavigation_FrameSpec); 3016 mojom::kNavigation_FrameSpec);
2910 3017
3018 auto make_binding = [](RenderFrameHostImpl* impl,
3019 mojom::FrameHostAssociatedRequest request) {
3020 impl->frame_host_associated_binding_.Bind(std::move(request));
3021 };
3022 static_cast<AssociatedInterfaceRegistry*>(associated_registry_.get())
3023 ->AddInterface(base::Bind(make_binding, base::Unretained(this)));
3024
2911 ServiceManagerConnection* service_manager_connection = 3025 ServiceManagerConnection* service_manager_connection =
2912 BrowserContext::GetServiceManagerConnectionFor( 3026 BrowserContext::GetServiceManagerConnectionFor(
2913 GetProcess()->GetBrowserContext()); 3027 GetProcess()->GetBrowserContext());
2914 // |service_manager_connection| may not be set in unit tests using 3028 // |service_manager_connection| may not be set in unit tests using
2915 // TestBrowserContext. 3029 // TestBrowserContext.
2916 if (service_manager_connection) { 3030 if (service_manager_connection) {
2917 on_connect_handler_id_ = service_manager_connection->AddOnConnectHandler( 3031 on_connect_handler_id_ = service_manager_connection->AddOnConnectHandler(
2918 base::Bind(&RenderFrameHostImpl::OnRendererConnect, 3032 base::Bind(&RenderFrameHostImpl::OnRendererConnect,
2919 weak_ptr_factory_.GetWeakPtr())); 3033 weak_ptr_factory_.GetWeakPtr()));
2920 } 3034 }
2921 3035
2922 RegisterMojoInterfaces(); 3036 RegisterMojoInterfaces();
2923 mojom::FrameFactoryPtr frame_factory; 3037 mojom::FrameFactoryPtr frame_factory;
2924 BindInterface(GetProcess(), &frame_factory); 3038 BindInterface(GetProcess(), &frame_factory);
2925 frame_factory->CreateFrame(routing_id_, MakeRequest(&frame_), 3039 frame_factory->CreateFrame(
2926 frame_host_binding_.CreateInterfacePtrAndBind()); 3040 routing_id_, MakeRequest(&frame_),
3041 frame_host_interface_broker_binding_.CreateInterfacePtrAndBind());
2927 3042
2928 service_manager::mojom::InterfaceProviderPtr remote_interfaces; 3043 service_manager::mojom::InterfaceProviderPtr remote_interfaces;
2929 service_manager::mojom::InterfaceProviderRequest remote_interfaces_request( 3044 service_manager::mojom::InterfaceProviderRequest remote_interfaces_request(
2930 &remote_interfaces); 3045 &remote_interfaces);
2931 remote_interfaces_.reset(new service_manager::InterfaceProvider); 3046 remote_interfaces_.reset(new service_manager::InterfaceProvider);
2932 remote_interfaces_->Bind(std::move(remote_interfaces)); 3047 remote_interfaces_->Bind(std::move(remote_interfaces));
2933 frame_->GetInterfaceProvider(std::move(remote_interfaces_request)); 3048 frame_->GetInterfaceProvider(std::move(remote_interfaces_request));
2934 } 3049 }
2935 3050
2936 void RenderFrameHostImpl::InvalidateMojoConnection() { 3051 void RenderFrameHostImpl::InvalidateMojoConnection() {
2937 interface_registry_.reset(); 3052 interface_registry_.reset();
2938 3053
2939 ServiceManagerConnection* service_manager_connection = 3054 ServiceManagerConnection* service_manager_connection =
2940 BrowserContext::GetServiceManagerConnectionFor( 3055 BrowserContext::GetServiceManagerConnectionFor(
2941 GetProcess()->GetBrowserContext()); 3056 GetProcess()->GetBrowserContext());
2942 // |service_manager_connection| may be null in tests using TestBrowserContext. 3057 // |service_manager_connection| may be null in tests using TestBrowserContext.
2943 if (service_manager_connection) { 3058 if (service_manager_connection) {
2944 service_manager_connection->RemoveOnConnectHandler(on_connect_handler_id_); 3059 service_manager_connection->RemoveOnConnectHandler(on_connect_handler_id_);
2945 on_connect_handler_id_ = 0; 3060 on_connect_handler_id_ = 0;
2946 } 3061 }
2947 3062
2948 frame_.reset(); 3063 frame_.reset();
2949 frame_host_binding_.Close(); 3064 frame_host_interface_broker_binding_.Close();
2950 frame_bindings_control_.reset(); 3065 frame_bindings_control_.reset();
2951 3066
2952 // Disconnect with ImageDownloader Mojo service in RenderFrame. 3067 // Disconnect with ImageDownloader Mojo service in RenderFrame.
2953 mojo_image_downloader_.reset(); 3068 mojo_image_downloader_.reset();
2954 } 3069 }
2955 3070
2956 bool RenderFrameHostImpl::IsFocused() { 3071 bool RenderFrameHostImpl::IsFocused() {
2957 return GetRenderWidgetHost()->is_focused() && 3072 return GetRenderWidgetHost()->is_focused() &&
2958 frame_tree_->GetFocusedFrame() && 3073 frame_tree_->GetFocusedFrame() &&
2959 (frame_tree_->GetFocusedFrame() == frame_tree_node() || 3074 (frame_tree_->GetFocusedFrame() == frame_tree_node() ||
(...skipping 719 matching lines...) Expand 10 before | Expand all | Expand 10 after
3679 } 3794 }
3680 3795
3681 void RenderFrameHostImpl::ForwardGetInterfaceToRenderFrame( 3796 void RenderFrameHostImpl::ForwardGetInterfaceToRenderFrame(
3682 const std::string& interface_name, 3797 const std::string& interface_name,
3683 mojo::ScopedMessagePipeHandle pipe) { 3798 mojo::ScopedMessagePipeHandle pipe) {
3684 GetRemoteInterfaces()->GetInterface(interface_name, std::move(pipe)); 3799 GetRemoteInterfaces()->GetInterface(interface_name, std::move(pipe));
3685 } 3800 }
3686 #endif 3801 #endif
3687 3802
3688 } // namespace content 3803 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698