OLD | NEW |
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" |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 // WebView). | 154 // WebView). |
155 bool g_allow_injecting_javascript = false; | 155 bool g_allow_injecting_javascript = false; |
156 | 156 |
157 // The (process id, routing id) pair that identifies one RenderFrame. | 157 // The (process id, routing id) pair that identifies one RenderFrame. |
158 typedef std::pair<int32_t, int32_t> RenderFrameHostID; | 158 typedef std::pair<int32_t, int32_t> RenderFrameHostID; |
159 typedef base::hash_map<RenderFrameHostID, RenderFrameHostImpl*> | 159 typedef base::hash_map<RenderFrameHostID, RenderFrameHostImpl*> |
160 RoutingIDFrameMap; | 160 RoutingIDFrameMap; |
161 base::LazyInstance<RoutingIDFrameMap>::DestructorAtExit g_routing_id_frame_map = | 161 base::LazyInstance<RoutingIDFrameMap>::DestructorAtExit g_routing_id_frame_map = |
162 LAZY_INSTANCE_INITIALIZER; | 162 LAZY_INSTANCE_INITIALIZER; |
163 | 163 |
| 164 #if defined(OS_ANDROID) |
| 165 typedef base::hash_map<base::UnguessableToken, |
| 166 RenderFrameHostImpl*, |
| 167 base::UnguessableTokenHash> |
| 168 TokenFrameMap; |
| 169 base::LazyInstance<TokenFrameMap>::Leaky g_token_frame_map = |
| 170 LAZY_INSTANCE_INITIALIZER; |
| 171 #endif |
| 172 |
164 // Translate a WebKit text direction into a base::i18n one. | 173 // Translate a WebKit text direction into a base::i18n one. |
165 base::i18n::TextDirection WebTextDirectionToChromeTextDirection( | 174 base::i18n::TextDirection WebTextDirectionToChromeTextDirection( |
166 blink::WebTextDirection dir) { | 175 blink::WebTextDirection dir) { |
167 switch (dir) { | 176 switch (dir) { |
168 case blink::WebTextDirectionLeftToRight: | 177 case blink::WebTextDirectionLeftToRight: |
169 return base::i18n::LEFT_TO_RIGHT; | 178 return base::i18n::LEFT_TO_RIGHT; |
170 case blink::WebTextDirectionRightToLeft: | 179 case blink::WebTextDirectionRightToLeft: |
171 return base::i18n::RIGHT_TO_LEFT; | 180 return base::i18n::RIGHT_TO_LEFT; |
172 default: | 181 default: |
173 NOTREACHED(); | 182 NOTREACHED(); |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 | 358 |
350 // static | 359 // static |
351 RenderFrameHostImpl* RenderFrameHostImpl::FromAXTreeID( | 360 RenderFrameHostImpl* RenderFrameHostImpl::FromAXTreeID( |
352 ui::AXTreeIDRegistry::AXTreeID ax_tree_id) { | 361 ui::AXTreeIDRegistry::AXTreeID ax_tree_id) { |
353 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 362 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
354 ui::AXTreeIDRegistry::FrameID frame_id = | 363 ui::AXTreeIDRegistry::FrameID frame_id = |
355 ui::AXTreeIDRegistry::GetInstance()->GetFrameID(ax_tree_id); | 364 ui::AXTreeIDRegistry::GetInstance()->GetFrameID(ax_tree_id); |
356 return RenderFrameHostImpl::FromID(frame_id.first, frame_id.second); | 365 return RenderFrameHostImpl::FromID(frame_id.first, frame_id.second); |
357 } | 366 } |
358 | 367 |
| 368 #if defined(OS_ANDROID) |
| 369 // static |
| 370 RenderFrameHostImpl* RenderFrameHostImpl::FromOverlayRoutingToken( |
| 371 const base::UnguessableToken& token) { |
| 372 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 373 auto it = g_token_frame_map.Get().find(token); |
| 374 return it == g_token_frame_map.Get().end() ? nullptr : it->second; |
| 375 } |
| 376 #endif |
| 377 |
359 RenderFrameHostImpl::RenderFrameHostImpl(SiteInstance* site_instance, | 378 RenderFrameHostImpl::RenderFrameHostImpl(SiteInstance* site_instance, |
360 RenderViewHostImpl* render_view_host, | 379 RenderViewHostImpl* render_view_host, |
361 RenderFrameHostDelegate* delegate, | 380 RenderFrameHostDelegate* delegate, |
362 RenderWidgetHostDelegate* rwh_delegate, | 381 RenderWidgetHostDelegate* rwh_delegate, |
363 FrameTree* frame_tree, | 382 FrameTree* frame_tree, |
364 FrameTreeNode* frame_tree_node, | 383 FrameTreeNode* frame_tree_node, |
365 int32_t routing_id, | 384 int32_t routing_id, |
366 int32_t widget_routing_id, | 385 int32_t widget_routing_id, |
367 bool hidden, | 386 bool hidden, |
368 bool renderer_initiated_creation) | 387 bool renderer_initiated_creation) |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 // so we do it early while |this| object is still in a sane state. | 471 // so we do it early while |this| object is still in a sane state. |
453 navigation_handle_.reset(); | 472 navigation_handle_.reset(); |
454 | 473 |
455 // Release the WebUI instances before all else as the WebUI may accesses the | 474 // Release the WebUI instances before all else as the WebUI may accesses the |
456 // RenderFrameHost during cleanup. | 475 // RenderFrameHost during cleanup. |
457 ClearAllWebUI(); | 476 ClearAllWebUI(); |
458 | 477 |
459 GetProcess()->RemoveRoute(routing_id_); | 478 GetProcess()->RemoveRoute(routing_id_); |
460 g_routing_id_frame_map.Get().erase( | 479 g_routing_id_frame_map.Get().erase( |
461 RenderFrameHostID(GetProcess()->GetID(), routing_id_)); | 480 RenderFrameHostID(GetProcess()->GetID(), routing_id_)); |
| 481 #if defined(OS_ANDROID) |
| 482 if (overlay_routing_token_.has_value()) |
| 483 g_token_frame_map.Get().erase(overlay_routing_token_.value()); |
| 484 #endif |
462 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 485 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
463 base::Bind(&NotifyRenderFrameDetachedOnIO, | 486 base::Bind(&NotifyRenderFrameDetachedOnIO, |
464 GetProcess()->GetID(), routing_id_)); | 487 GetProcess()->GetID(), routing_id_)); |
465 | 488 |
466 site_instance_->RemoveObserver(this); | 489 site_instance_->RemoveObserver(this); |
467 | 490 |
468 if (delegate_ && render_frame_created_) | 491 if (delegate_ && render_frame_created_) |
469 delegate_->RenderFrameDeleted(this); | 492 delegate_->RenderFrameDeleted(this); |
470 | 493 |
471 // If this was the last active frame in the SiteInstance, the | 494 // If this was the last active frame in the SiteInstance, the |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
505 | 528 |
506 int RenderFrameHostImpl::GetRoutingID() { | 529 int RenderFrameHostImpl::GetRoutingID() { |
507 return routing_id_; | 530 return routing_id_; |
508 } | 531 } |
509 | 532 |
510 ui::AXTreeIDRegistry::AXTreeID RenderFrameHostImpl::GetAXTreeID() { | 533 ui::AXTreeIDRegistry::AXTreeID RenderFrameHostImpl::GetAXTreeID() { |
511 return ui::AXTreeIDRegistry::GetInstance()->GetOrCreateAXTreeID( | 534 return ui::AXTreeIDRegistry::GetInstance()->GetOrCreateAXTreeID( |
512 GetProcess()->GetID(), routing_id_); | 535 GetProcess()->GetID(), routing_id_); |
513 } | 536 } |
514 | 537 |
| 538 #if defined(OS_ANDROID) |
| 539 const base::UnguessableToken& RenderFrameHostImpl::GetOverlayRoutingToken() { |
| 540 if (!overlay_routing_token_.has_value()) { |
| 541 overlay_routing_token_ = base::UnguessableToken::Create(); |
| 542 g_token_frame_map.Get().insert( |
| 543 std::make_pair(overlay_routing_token_.value(), this)); |
| 544 } |
| 545 |
| 546 return overlay_routing_token_.value(); |
| 547 } |
| 548 #endif |
| 549 |
515 SiteInstanceImpl* RenderFrameHostImpl::GetSiteInstance() { | 550 SiteInstanceImpl* RenderFrameHostImpl::GetSiteInstance() { |
516 return site_instance_.get(); | 551 return site_instance_.get(); |
517 } | 552 } |
518 | 553 |
519 RenderProcessHost* RenderFrameHostImpl::GetProcess() { | 554 RenderProcessHost* RenderFrameHostImpl::GetProcess() { |
520 return process_; | 555 return process_; |
521 } | 556 } |
522 | 557 |
523 RenderFrameHostImpl* RenderFrameHostImpl::GetParent() { | 558 RenderFrameHostImpl* RenderFrameHostImpl::GetParent() { |
524 return parent_; | 559 return parent_; |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 IPC_MESSAGE_HANDLER(FrameHostMsg_FocusedNodeChanged, OnFocusedNodeChanged) | 843 IPC_MESSAGE_HANDLER(FrameHostMsg_FocusedNodeChanged, OnFocusedNodeChanged) |
809 IPC_MESSAGE_HANDLER(FrameHostMsg_SetHasReceivedUserGesture, | 844 IPC_MESSAGE_HANDLER(FrameHostMsg_SetHasReceivedUserGesture, |
810 OnSetHasReceivedUserGesture) | 845 OnSetHasReceivedUserGesture) |
811 #if BUILDFLAG(USE_EXTERNAL_POPUP_MENU) | 846 #if BUILDFLAG(USE_EXTERNAL_POPUP_MENU) |
812 IPC_MESSAGE_HANDLER(FrameHostMsg_ShowPopup, OnShowPopup) | 847 IPC_MESSAGE_HANDLER(FrameHostMsg_ShowPopup, OnShowPopup) |
813 IPC_MESSAGE_HANDLER(FrameHostMsg_HidePopup, OnHidePopup) | 848 IPC_MESSAGE_HANDLER(FrameHostMsg_HidePopup, OnHidePopup) |
814 #endif | 849 #endif |
815 #if defined(OS_ANDROID) | 850 #if defined(OS_ANDROID) |
816 IPC_MESSAGE_HANDLER(FrameHostMsg_NavigationHandledByEmbedder, | 851 IPC_MESSAGE_HANDLER(FrameHostMsg_NavigationHandledByEmbedder, |
817 OnNavigationHandledByEmbedder) | 852 OnNavigationHandledByEmbedder) |
| 853 IPC_MESSAGE_HANDLER(FrameHostMsg_RequestOverlayRoutingToken, |
| 854 OnRequestOverlayRoutingToken) |
818 #endif | 855 #endif |
819 IPC_MESSAGE_HANDLER(FrameHostMsg_ShowCreatedWindow, OnShowCreatedWindow) | 856 IPC_MESSAGE_HANDLER(FrameHostMsg_ShowCreatedWindow, OnShowCreatedWindow) |
820 IPC_END_MESSAGE_MAP() | 857 IPC_END_MESSAGE_MAP() |
821 | 858 |
822 // No further actions here, since we may have been deleted. | 859 // No further actions here, since we may have been deleted. |
823 return handled; | 860 return handled; |
824 } | 861 } |
825 | 862 |
826 void RenderFrameHostImpl::OnAssociatedInterfaceRequest( | 863 void RenderFrameHostImpl::OnAssociatedInterfaceRequest( |
827 const std::string& interface_name, | 864 const std::string& interface_name, |
(...skipping 1580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2408 } | 2445 } |
2409 #endif | 2446 #endif |
2410 | 2447 |
2411 #if defined(OS_ANDROID) | 2448 #if defined(OS_ANDROID) |
2412 void RenderFrameHostImpl::OnNavigationHandledByEmbedder() { | 2449 void RenderFrameHostImpl::OnNavigationHandledByEmbedder() { |
2413 if (navigation_handle_) | 2450 if (navigation_handle_) |
2414 navigation_handle_->set_net_error_code(net::ERR_ABORTED); | 2451 navigation_handle_->set_net_error_code(net::ERR_ABORTED); |
2415 | 2452 |
2416 OnDidStopLoading(); | 2453 OnDidStopLoading(); |
2417 } | 2454 } |
| 2455 |
| 2456 void RenderFrameHostImpl::OnRequestOverlayRoutingToken() { |
| 2457 // Make sure that we have a token. |
| 2458 GetOverlayRoutingToken(); |
| 2459 |
| 2460 Send(new FrameMsg_SetOverlayRoutingToken( |
| 2461 routing_id_, overlay_routing_token_.value().GetHighForSerialization(), |
| 2462 overlay_routing_token_.value().GetLowForSerialization())); |
| 2463 } |
2418 #endif | 2464 #endif |
2419 | 2465 |
2420 void RenderFrameHostImpl::OnShowCreatedWindow(int pending_widget_routing_id, | 2466 void RenderFrameHostImpl::OnShowCreatedWindow(int pending_widget_routing_id, |
2421 WindowOpenDisposition disposition, | 2467 WindowOpenDisposition disposition, |
2422 const gfx::Rect& initial_rect, | 2468 const gfx::Rect& initial_rect, |
2423 bool user_gesture) { | 2469 bool user_gesture) { |
2424 delegate_->ShowCreatedWindow(GetProcess()->GetID(), pending_widget_routing_id, | 2470 delegate_->ShowCreatedWindow(GetProcess()->GetID(), pending_widget_routing_id, |
2425 disposition, initial_rect, user_gesture); | 2471 disposition, initial_rect, user_gesture); |
2426 } | 2472 } |
2427 | 2473 |
(...skipping 1213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3641 service_manager::mojom::InterfaceProviderPtr provider; | 3687 service_manager::mojom::InterfaceProviderPtr provider; |
3642 BindInterfaceRegistryForRenderFrameHost(mojo::MakeRequest(&provider), this); | 3688 BindInterfaceRegistryForRenderFrameHost(mojo::MakeRequest(&provider), this); |
3643 java_interfaces_.reset(new service_manager::InterfaceProvider); | 3689 java_interfaces_.reset(new service_manager::InterfaceProvider); |
3644 java_interfaces_->Bind(std::move(provider)); | 3690 java_interfaces_->Bind(std::move(provider)); |
3645 } | 3691 } |
3646 return java_interfaces_.get(); | 3692 return java_interfaces_.get(); |
3647 } | 3693 } |
3648 #endif | 3694 #endif |
3649 | 3695 |
3650 } // namespace content | 3696 } // namespace content |
OLD | NEW |