Chromium Code Reviews| 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>::DestructorAtExit g_token_frame_map = | |
|
boliu
2017/03/30 22:42:02
Leaky is fine for android, android doesn't have cl
liberato (no reviews please)
2017/04/04 17:49:28
Done.
| |
| 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 RenderFrameHost* RenderFrameHost::FromOverlayRoutingToken( | |
| 371 const base::UnguessableToken& token) { | |
| 372 return RenderFrameHostImpl::FromOverlayRoutingToken(token); | |
|
boliu
2017/03/30 22:42:02
DCHECK UI thread as well
liberato (no reviews please)
2017/04/04 17:49:28
Done.
| |
| 373 } | |
| 374 | |
| 375 // static | |
| 376 RenderFrameHostImpl* RenderFrameHostImpl::FromOverlayRoutingToken( | |
| 377 const base::UnguessableToken& token) { | |
| 378 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 379 auto it = g_token_frame_map.Get().find(token); | |
| 380 return it == g_token_frame_map.Get().end() ? nullptr : it->second; | |
| 381 } | |
| 382 #endif | |
| 383 | |
| 359 RenderFrameHostImpl::RenderFrameHostImpl(SiteInstance* site_instance, | 384 RenderFrameHostImpl::RenderFrameHostImpl(SiteInstance* site_instance, |
| 360 RenderViewHostImpl* render_view_host, | 385 RenderViewHostImpl* render_view_host, |
| 361 RenderFrameHostDelegate* delegate, | 386 RenderFrameHostDelegate* delegate, |
| 362 RenderWidgetHostDelegate* rwh_delegate, | 387 RenderWidgetHostDelegate* rwh_delegate, |
| 363 FrameTree* frame_tree, | 388 FrameTree* frame_tree, |
| 364 FrameTreeNode* frame_tree_node, | 389 FrameTreeNode* frame_tree_node, |
| 365 int32_t routing_id, | 390 int32_t routing_id, |
| 366 int32_t widget_routing_id, | 391 int32_t widget_routing_id, |
| 367 bool hidden, | 392 bool hidden, |
| 368 bool renderer_initiated_creation) | 393 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. | 477 // so we do it early while |this| object is still in a sane state. |
| 453 navigation_handle_.reset(); | 478 navigation_handle_.reset(); |
| 454 | 479 |
| 455 // Release the WebUI instances before all else as the WebUI may accesses the | 480 // Release the WebUI instances before all else as the WebUI may accesses the |
| 456 // RenderFrameHost during cleanup. | 481 // RenderFrameHost during cleanup. |
| 457 ClearAllWebUI(); | 482 ClearAllWebUI(); |
| 458 | 483 |
| 459 GetProcess()->RemoveRoute(routing_id_); | 484 GetProcess()->RemoveRoute(routing_id_); |
| 460 g_routing_id_frame_map.Get().erase( | 485 g_routing_id_frame_map.Get().erase( |
| 461 RenderFrameHostID(GetProcess()->GetID(), routing_id_)); | 486 RenderFrameHostID(GetProcess()->GetID(), routing_id_)); |
| 487 #if defined(OS_ANDROID) | |
| 488 if (overlay_routing_token_.has_value()) | |
| 489 g_token_frame_map.Get().erase(overlay_routing_token_.value()); | |
| 490 #endif | |
| 462 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 491 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| 463 base::Bind(&NotifyRenderFrameDetachedOnIO, | 492 base::Bind(&NotifyRenderFrameDetachedOnIO, |
| 464 GetProcess()->GetID(), routing_id_)); | 493 GetProcess()->GetID(), routing_id_)); |
| 465 | 494 |
| 466 site_instance_->RemoveObserver(this); | 495 site_instance_->RemoveObserver(this); |
| 467 | 496 |
| 468 if (delegate_ && render_frame_created_) | 497 if (delegate_ && render_frame_created_) |
| 469 delegate_->RenderFrameDeleted(this); | 498 delegate_->RenderFrameDeleted(this); |
| 470 | 499 |
| 471 // If this was the last active frame in the SiteInstance, the | 500 // 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 | 534 |
| 506 int RenderFrameHostImpl::GetRoutingID() { | 535 int RenderFrameHostImpl::GetRoutingID() { |
| 507 return routing_id_; | 536 return routing_id_; |
| 508 } | 537 } |
| 509 | 538 |
| 510 ui::AXTreeIDRegistry::AXTreeID RenderFrameHostImpl::GetAXTreeID() { | 539 ui::AXTreeIDRegistry::AXTreeID RenderFrameHostImpl::GetAXTreeID() { |
| 511 return ui::AXTreeIDRegistry::GetInstance()->GetOrCreateAXTreeID( | 540 return ui::AXTreeIDRegistry::GetInstance()->GetOrCreateAXTreeID( |
| 512 GetProcess()->GetID(), routing_id_); | 541 GetProcess()->GetID(), routing_id_); |
| 513 } | 542 } |
| 514 | 543 |
| 544 #if defined(OS_ANDROID) | |
| 545 const base::UnguessableToken& RenderFrameHostImpl::GetOverlayRoutingToken() { | |
| 546 if (!overlay_routing_token_.has_value()) { | |
| 547 overlay_routing_token_ = base::UnguessableToken::Create(); | |
| 548 g_token_frame_map.Get().insert( | |
| 549 std::make_pair(overlay_routing_token_.value(), this)); | |
| 550 } | |
| 551 | |
| 552 return overlay_routing_token_.value(); | |
| 553 } | |
| 554 #endif | |
| 555 | |
| 515 SiteInstanceImpl* RenderFrameHostImpl::GetSiteInstance() { | 556 SiteInstanceImpl* RenderFrameHostImpl::GetSiteInstance() { |
| 516 return site_instance_.get(); | 557 return site_instance_.get(); |
| 517 } | 558 } |
| 518 | 559 |
| 519 RenderProcessHost* RenderFrameHostImpl::GetProcess() { | 560 RenderProcessHost* RenderFrameHostImpl::GetProcess() { |
| 520 return process_; | 561 return process_; |
| 521 } | 562 } |
| 522 | 563 |
| 523 RenderFrameHostImpl* RenderFrameHostImpl::GetParent() { | 564 RenderFrameHostImpl* RenderFrameHostImpl::GetParent() { |
| 524 return parent_; | 565 return parent_; |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 808 IPC_MESSAGE_HANDLER(FrameHostMsg_FocusedNodeChanged, OnFocusedNodeChanged) | 849 IPC_MESSAGE_HANDLER(FrameHostMsg_FocusedNodeChanged, OnFocusedNodeChanged) |
| 809 IPC_MESSAGE_HANDLER(FrameHostMsg_SetHasReceivedUserGesture, | 850 IPC_MESSAGE_HANDLER(FrameHostMsg_SetHasReceivedUserGesture, |
| 810 OnSetHasReceivedUserGesture) | 851 OnSetHasReceivedUserGesture) |
| 811 #if BUILDFLAG(USE_EXTERNAL_POPUP_MENU) | 852 #if BUILDFLAG(USE_EXTERNAL_POPUP_MENU) |
| 812 IPC_MESSAGE_HANDLER(FrameHostMsg_ShowPopup, OnShowPopup) | 853 IPC_MESSAGE_HANDLER(FrameHostMsg_ShowPopup, OnShowPopup) |
| 813 IPC_MESSAGE_HANDLER(FrameHostMsg_HidePopup, OnHidePopup) | 854 IPC_MESSAGE_HANDLER(FrameHostMsg_HidePopup, OnHidePopup) |
| 814 #endif | 855 #endif |
| 815 #if defined(OS_ANDROID) | 856 #if defined(OS_ANDROID) |
| 816 IPC_MESSAGE_HANDLER(FrameHostMsg_NavigationHandledByEmbedder, | 857 IPC_MESSAGE_HANDLER(FrameHostMsg_NavigationHandledByEmbedder, |
| 817 OnNavigationHandledByEmbedder) | 858 OnNavigationHandledByEmbedder) |
| 859 IPC_MESSAGE_HANDLER(FrameHostMsg_RequestOverlayRoutingToken, | |
| 860 OnRequestOverlayRoutingToken) | |
| 818 #endif | 861 #endif |
| 819 IPC_MESSAGE_HANDLER(FrameHostMsg_ShowCreatedWindow, OnShowCreatedWindow) | 862 IPC_MESSAGE_HANDLER(FrameHostMsg_ShowCreatedWindow, OnShowCreatedWindow) |
| 820 IPC_END_MESSAGE_MAP() | 863 IPC_END_MESSAGE_MAP() |
| 821 | 864 |
| 822 // No further actions here, since we may have been deleted. | 865 // No further actions here, since we may have been deleted. |
| 823 return handled; | 866 return handled; |
| 824 } | 867 } |
| 825 | 868 |
| 826 void RenderFrameHostImpl::OnAssociatedInterfaceRequest( | 869 void RenderFrameHostImpl::OnAssociatedInterfaceRequest( |
| 827 const std::string& interface_name, | 870 const std::string& interface_name, |
| (...skipping 1580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2408 } | 2451 } |
| 2409 #endif | 2452 #endif |
| 2410 | 2453 |
| 2411 #if defined(OS_ANDROID) | 2454 #if defined(OS_ANDROID) |
| 2412 void RenderFrameHostImpl::OnNavigationHandledByEmbedder() { | 2455 void RenderFrameHostImpl::OnNavigationHandledByEmbedder() { |
| 2413 if (navigation_handle_) | 2456 if (navigation_handle_) |
| 2414 navigation_handle_->set_net_error_code(net::ERR_ABORTED); | 2457 navigation_handle_->set_net_error_code(net::ERR_ABORTED); |
| 2415 | 2458 |
| 2416 OnDidStopLoading(); | 2459 OnDidStopLoading(); |
| 2417 } | 2460 } |
| 2461 | |
| 2462 void RenderFrameHostImpl::OnRequestOverlayRoutingToken() { | |
| 2463 // Make sure that we have a token. | |
| 2464 GetOverlayRoutingToken(); | |
| 2465 | |
| 2466 Send(new FrameMsg_SetOverlayRoutingToken( | |
| 2467 routing_id_, overlay_routing_token_.value().GetHighForSerialization(), | |
| 2468 overlay_routing_token_.value().GetLowForSerialization())); | |
| 2469 } | |
| 2418 #endif | 2470 #endif |
| 2419 | 2471 |
| 2420 void RenderFrameHostImpl::OnShowCreatedWindow(int pending_widget_routing_id, | 2472 void RenderFrameHostImpl::OnShowCreatedWindow(int pending_widget_routing_id, |
| 2421 WindowOpenDisposition disposition, | 2473 WindowOpenDisposition disposition, |
| 2422 const gfx::Rect& initial_rect, | 2474 const gfx::Rect& initial_rect, |
| 2423 bool user_gesture) { | 2475 bool user_gesture) { |
| 2424 delegate_->ShowCreatedWindow(GetProcess()->GetID(), pending_widget_routing_id, | 2476 delegate_->ShowCreatedWindow(GetProcess()->GetID(), pending_widget_routing_id, |
| 2425 disposition, initial_rect, user_gesture); | 2477 disposition, initial_rect, user_gesture); |
| 2426 } | 2478 } |
| 2427 | 2479 |
| (...skipping 1213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3641 service_manager::mojom::InterfaceProviderPtr provider; | 3693 service_manager::mojom::InterfaceProviderPtr provider; |
| 3642 BindInterfaceRegistryForRenderFrameHost(mojo::MakeRequest(&provider), this); | 3694 BindInterfaceRegistryForRenderFrameHost(mojo::MakeRequest(&provider), this); |
| 3643 java_interfaces_.reset(new service_manager::InterfaceProvider); | 3695 java_interfaces_.reset(new service_manager::InterfaceProvider); |
| 3644 java_interfaces_->Bind(std::move(provider)); | 3696 java_interfaces_->Bind(std::move(provider)); |
| 3645 } | 3697 } |
| 3646 return java_interfaces_.get(); | 3698 return java_interfaces_.get(); |
| 3647 } | 3699 } |
| 3648 #endif | 3700 #endif |
| 3649 | 3701 |
| 3650 } // namespace content | 3702 } // namespace content |
| OLD | NEW |