Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / content / browser / frame_host / render_frame_proxy_host.cc
index 22d5bb7..35ed286 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "content/browser/frame_host/render_frame_proxy_host.h"
 
+#include "base/lazy_instance.h"
 #include "content/browser/frame_host/cross_process_frame_connector.h"
 #include "content/browser/frame_host/frame_tree.h"
 #include "content/browser/frame_host/frame_tree_node.h"
 #include "content/browser/renderer_host/render_widget_host_view_base.h"
 #include "content/browser/site_instance_impl.h"
 #include "content/common/frame_messages.h"
+#include "content/public/browser/browser_thread.h"
 #include "ipc/ipc_message.h"
 
 namespace content {
 
+namespace {
+
+// The (process id, routing id) pair that identifies one RenderFrameProxy.
+typedef std::pair<int32, int32> RenderFrameProxyHostID;
+typedef base::hash_map<RenderFrameProxyHostID, RenderFrameProxyHost*>
+    RoutingIDFrameProxyMap;
+base::LazyInstance<RoutingIDFrameProxyMap> g_routing_id_frame_proxy_map =
+  LAZY_INSTANCE_INITIALIZER;
+
+}
+
+// static
+RenderFrameProxyHost* RenderFrameProxyHost::FromID(int process_id,
+                                                   int routing_id) {
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+  RoutingIDFrameProxyMap* frames = g_routing_id_frame_proxy_map.Pointer();
+  RoutingIDFrameProxyMap::iterator it = frames->find(
+      RenderFrameProxyHostID(process_id, routing_id));
+  return it == frames->end() ? NULL : it->second;
+}
+
 RenderFrameProxyHost::RenderFrameProxyHost(SiteInstance* site_instance,
                                            FrameTreeNode* frame_tree_node)
     : routing_id_(site_instance->GetProcess()->GetNextRoutingID()),
       site_instance_(site_instance),
       frame_tree_node_(frame_tree_node) {
   GetProcess()->AddRoute(routing_id_, this);
+  CHECK(g_routing_id_frame_proxy_map.Get().insert(
+      std::make_pair(
+          RenderFrameProxyHostID(GetProcess()->GetID(), routing_id_),
+          this)).second);
 
   if (!frame_tree_node_->IsMainFrame() &&
       frame_tree_node_->parent()
@@ -45,6 +72,8 @@ RenderFrameProxyHost::~RenderFrameProxyHost() {
     Send(new FrameMsg_DeleteProxy(routing_id_));
 
   GetProcess()->RemoveRoute(routing_id_);
+  g_routing_id_frame_proxy_map.Get().erase(
+      RenderFrameProxyHostID(GetProcess()->GetID(), routing_id_));
 }
 
 void RenderFrameProxyHost::SetChildRWHView(RenderWidgetHostView* view) {
@@ -53,9 +82,8 @@ void RenderFrameProxyHost::SetChildRWHView(RenderWidgetHostView* view) {
 }
 
 RenderViewHostImpl* RenderFrameProxyHost::GetRenderViewHost() {
-  if (render_frame_host_.get())
-    return render_frame_host_->render_view_host();
-  return NULL;
+  return frame_tree_node_->frame_tree()->GetRenderViewHost(
+      site_instance_.get());
 }
 
 scoped_ptr<RenderFrameHostImpl> RenderFrameProxyHost::PassFrameHostOwnership() {
@@ -96,18 +124,23 @@ bool RenderFrameProxyHost::InitRenderFrameProxy() {
 
   int parent_routing_id = MSG_ROUTING_NONE;
   if (frame_tree_node_->parent()) {
-    parent_routing_id = frame_tree_node_->parent()->render_manager()->
-        GetRoutingIdForSiteInstance(site_instance_);
+    parent_routing_id = frame_tree_node_->parent()
+                            ->render_manager()
+                            ->GetRoutingIdForSiteInstance(site_instance_.get());
     CHECK_NE(parent_routing_id, MSG_ROUTING_NONE);
   }
 
-  Send(new FrameMsg_NewFrameProxy(
-      routing_id_,
-      parent_routing_id,
-      frame_tree_node_->frame_tree()->GetRenderViewHost(
-          site_instance_)->GetRoutingID()));
+  Send(new FrameMsg_NewFrameProxy(routing_id_,
+                                  parent_routing_id,
+                                  frame_tree_node_->frame_tree()
+                                      ->GetRenderViewHost(site_instance_.get())
+                                      ->GetRoutingID()));
 
   return true;
 }
 
+void RenderFrameProxyHost::DisownOpener() {
+  Send(new FrameMsg_DisownOpener(GetRoutingID()));
+}
+
 }  // namespace content