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 = |
+ 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); |
+} |
+ |
+// 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, |