Chromium Code Reviews| 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 6b07ec57ac1eb1f0ef69111b827e75baea1ef656..d45108512b5975b9aa70e14ce0ca56eae6fed34e 100644 |
| --- a/content/browser/frame_host/render_frame_host_impl.cc |
| +++ b/content/browser/frame_host/render_frame_host_impl.cc |
| @@ -161,6 +161,15 @@ typedef base::hash_map<RenderFrameHostID, RenderFrameHostImpl*> |
| base::LazyInstance<RoutingIDFrameMap>::DestructorAtExit g_routing_id_frame_map = |
| LAZY_INSTANCE_INITIALIZER; |
| +#if defined(OS_ANDROID) |
| +typedef base::hash_map<base::UnguessableToken, |
| + RenderFrameHostImpl*, |
| + base::UnguessableTokenHash> |
| + TokenFrameMap; |
| +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.
|
| + LAZY_INSTANCE_INITIALIZER; |
| +#endif |
| + |
| // Translate a WebKit text direction into a base::i18n one. |
| base::i18n::TextDirection WebTextDirectionToChromeTextDirection( |
| blink::WebTextDirection dir) { |
| @@ -356,6 +365,22 @@ RenderFrameHostImpl* RenderFrameHostImpl::FromAXTreeID( |
| return RenderFrameHostImpl::FromID(frame_id.first, frame_id.second); |
| } |
| +#if defined(OS_ANDROID) |
| +// static |
| +RenderFrameHost* RenderFrameHost::FromOverlayRoutingToken( |
| + const base::UnguessableToken& token) { |
| + 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.
|
| +} |
| + |
| +// static |
| +RenderFrameHostImpl* RenderFrameHostImpl::FromOverlayRoutingToken( |
| + const base::UnguessableToken& token) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + auto it = g_token_frame_map.Get().find(token); |
| + return it == g_token_frame_map.Get().end() ? nullptr : it->second; |
| +} |
| +#endif |
| + |
| RenderFrameHostImpl::RenderFrameHostImpl(SiteInstance* site_instance, |
| RenderViewHostImpl* render_view_host, |
| RenderFrameHostDelegate* delegate, |
| @@ -459,6 +484,10 @@ RenderFrameHostImpl::~RenderFrameHostImpl() { |
| GetProcess()->RemoveRoute(routing_id_); |
| g_routing_id_frame_map.Get().erase( |
| RenderFrameHostID(GetProcess()->GetID(), routing_id_)); |
| +#if defined(OS_ANDROID) |
| + if (overlay_routing_token_.has_value()) |
| + g_token_frame_map.Get().erase(overlay_routing_token_.value()); |
| +#endif |
| BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| base::Bind(&NotifyRenderFrameDetachedOnIO, |
| GetProcess()->GetID(), routing_id_)); |
| @@ -512,6 +541,18 @@ ui::AXTreeIDRegistry::AXTreeID RenderFrameHostImpl::GetAXTreeID() { |
| GetProcess()->GetID(), routing_id_); |
| } |
| +#if defined(OS_ANDROID) |
| +const base::UnguessableToken& RenderFrameHostImpl::GetOverlayRoutingToken() { |
| + if (!overlay_routing_token_.has_value()) { |
| + overlay_routing_token_ = base::UnguessableToken::Create(); |
| + g_token_frame_map.Get().insert( |
| + std::make_pair(overlay_routing_token_.value(), this)); |
| + } |
| + |
| + return overlay_routing_token_.value(); |
| +} |
| +#endif |
| + |
| SiteInstanceImpl* RenderFrameHostImpl::GetSiteInstance() { |
| return site_instance_.get(); |
| } |
| @@ -815,6 +856,8 @@ bool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) { |
| #if defined(OS_ANDROID) |
| IPC_MESSAGE_HANDLER(FrameHostMsg_NavigationHandledByEmbedder, |
| OnNavigationHandledByEmbedder) |
| + IPC_MESSAGE_HANDLER(FrameHostMsg_RequestOverlayRoutingToken, |
| + OnRequestOverlayRoutingToken) |
| #endif |
| IPC_MESSAGE_HANDLER(FrameHostMsg_ShowCreatedWindow, OnShowCreatedWindow) |
| IPC_END_MESSAGE_MAP() |
| @@ -2415,6 +2458,15 @@ void RenderFrameHostImpl::OnNavigationHandledByEmbedder() { |
| OnDidStopLoading(); |
| } |
| + |
| +void RenderFrameHostImpl::OnRequestOverlayRoutingToken() { |
| + // Make sure that we have a token. |
| + GetOverlayRoutingToken(); |
| + |
| + Send(new FrameMsg_SetOverlayRoutingToken( |
| + routing_id_, overlay_routing_token_.value().GetHighForSerialization(), |
| + overlay_routing_token_.value().GetLowForSerialization())); |
| +} |
| #endif |
| void RenderFrameHostImpl::OnShowCreatedWindow(int pending_widget_routing_id, |