| Index: content/browser/frame_host/frame_tree.cc | 
| diff --git a/content/browser/frame_host/frame_tree.cc b/content/browser/frame_host/frame_tree.cc | 
| index fef82eebab84760c00737a9e5886fd9809f59184..0dff87bd98430c6dd3924bfe97ba28e8b9b5f5c3 100644 | 
| --- a/content/browser/frame_host/frame_tree.cc | 
| +++ b/content/browser/frame_host/frame_tree.cc | 
| @@ -12,6 +12,8 @@ | 
| #include "content/browser/frame_host/navigator.h" | 
| #include "content/browser/frame_host/render_frame_host_factory.h" | 
| #include "content/browser/frame_host/render_frame_host_impl.h" | 
| +#include "content/browser/renderer_host/render_view_host_factory.h" | 
| +#include "content/browser/renderer_host/render_view_host_impl.h" | 
|  | 
| namespace content { | 
|  | 
| @@ -52,7 +54,8 @@ FrameTree::FrameTree(Navigator* navigator, | 
| render_view_delegate_(render_view_delegate), | 
| render_widget_delegate_(render_widget_delegate), | 
| manager_delegate_(manager_delegate), | 
| -      root_(new FrameTreeNode(navigator, | 
| +      root_(new FrameTreeNode(this, | 
| +                              navigator, | 
| render_frame_delegate, | 
| render_view_delegate, | 
| render_widget_delegate, | 
| @@ -94,7 +97,7 @@ void FrameTree::OnFirstNavigationAfterSwap(int main_frame_id) { | 
| root_->set_frame_id(main_frame_id); | 
| } | 
|  | 
| -RenderFrameHostImpl* FrameTree::AddFrame(int render_frame_host_id, | 
| +RenderFrameHostImpl* FrameTree::AddFrame(int frame_routing_id, | 
| int64 parent_frame_id, | 
| int64 frame_id, | 
| const std::string& frame_name) { | 
| @@ -104,10 +107,11 @@ RenderFrameHostImpl* FrameTree::AddFrame(int render_frame_host_id, | 
| if (!parent) | 
| return NULL; | 
|  | 
| -  scoped_ptr<FrameTreeNode> node(CreateNode( | 
| -      frame_id, frame_name, render_frame_host_id, parent)); | 
| -  RenderFrameHostImpl* render_frame = node->render_frame_host(); | 
| -  parent->AddChild(node.Pass()); | 
| +  scoped_ptr<FrameTreeNode> node(new FrameTreeNode( | 
| +      this, parent->navigator(), render_frame_delegate_, render_view_delegate_, | 
| +      render_widget_delegate_, manager_delegate_, frame_id, frame_name)); | 
| +  RenderFrameHostImpl* render_frame = node->current_frame_host(); | 
| +  parent->AddChild(node.Pass(), frame_routing_id); | 
| return render_frame; | 
| } | 
|  | 
| @@ -147,12 +151,12 @@ void FrameTree::SetFrameUrl(int64 frame_id, const GURL& url) { | 
| node->set_current_url(url); | 
| } | 
|  | 
| -void FrameTree::SwapMainFrame(RenderFrameHostImpl* render_frame_host) { | 
| -  return root_->ResetForMainFrame(render_frame_host); | 
| +void FrameTree::ResetForMainFrameSwap() { | 
| +  return root_->ResetForMainFrameSwap(); | 
| } | 
|  | 
| RenderFrameHostImpl* FrameTree::GetMainFrame() const { | 
| -  return root_->render_frame_host(); | 
| +  return root_->current_frame_host(); | 
| } | 
|  | 
| void FrameTree::SetFrameRemoveListener( | 
| @@ -160,32 +164,78 @@ void FrameTree::SetFrameRemoveListener( | 
| on_frame_removed_ = on_frame_removed; | 
| } | 
|  | 
| +void FrameTree::ClearFrameRemoveListenerForTesting() { | 
| +  on_frame_removed_.Reset(); | 
| +} | 
| + | 
| +RenderViewHostImpl* FrameTree::CreateRenderViewHostForMainFrame( | 
| +    SiteInstance* site_instance, | 
| +    int routing_id, | 
| +    int main_frame_routing_id, | 
| +    bool swapped_out, | 
| +    bool hidden) { | 
| +  DCHECK(main_frame_routing_id != MSG_ROUTING_NONE); | 
| +  RenderViewHostMap::iterator iter = | 
| +      render_view_host_map_.find(site_instance->GetId()); | 
| +  CHECK(iter == render_view_host_map_.end()); | 
| +  RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>( | 
| +      RenderViewHostFactory::Create(site_instance, | 
| +                                    render_view_delegate_, | 
| +                                    render_widget_delegate_, | 
| +                                    routing_id, | 
| +                                    main_frame_routing_id, | 
| +                                    swapped_out, | 
| +                                    hidden)); | 
| + | 
| +  render_view_host_map_[site_instance->GetId()] = | 
| +      RenderViewHostRefCount(rvh, 0); | 
| +  return rvh; | 
| +} | 
| + | 
| +RenderViewHostImpl* FrameTree::GetRenderViewHostForSubFrame( | 
| +    SiteInstance* site_instance) { | 
| +  RenderViewHostMap::iterator iter = | 
| +      render_view_host_map_.find(site_instance->GetId()); | 
| +  CHECK(iter != render_view_host_map_.end()); | 
| +  RenderViewHostRefCount rvh_refcount = iter->second; | 
| +  return rvh_refcount.first; | 
| +} | 
| + | 
| +void FrameTree::RegisterRenderFrameHost( | 
| +    RenderFrameHostImpl* render_frame_host) { | 
| +  SiteInstance* site_instance = | 
| +      render_frame_host->render_view_host()->GetSiteInstance(); | 
| +  RenderViewHostMap::iterator iter = | 
| +      render_view_host_map_.find(site_instance->GetId()); | 
| +  CHECK(iter != render_view_host_map_.end()); | 
| + | 
| +  // Increment the refcount. | 
| +  CHECK_GE(iter->second.second, 0); | 
| +  iter->second.second++; | 
| +} | 
| + | 
| +void FrameTree::UnregisterRenderFrameHost( | 
| +    RenderFrameHostImpl* render_frame_host) { | 
| +  SiteInstance* site_instance = | 
| +      render_frame_host->render_view_host()->GetSiteInstance(); | 
| +  RenderViewHostMap::iterator iter = | 
| +      render_view_host_map_.find(site_instance->GetId()); | 
| +  CHECK(iter != render_view_host_map_.end()); | 
| + | 
| +  // Decrement the refcount and shutdown the RenderViewHost if no one else is | 
| +  // using it. | 
| +  CHECK_GT(iter->second.second, 0); | 
| +  iter->second.second--; | 
| +  if (iter->second.second == 0) { | 
| +    iter->second.first->Shutdown(); | 
| +    render_view_host_map_.erase(iter); | 
| +  } | 
| +} | 
| + | 
| FrameTreeNode* FrameTree::FindByFrameID(int64 frame_id) { | 
| FrameTreeNode* node = NULL; | 
| ForEach(base::Bind(&FrameTreeNodeForFrameId, frame_id, &node)); | 
| return node; | 
| } | 
|  | 
| -scoped_ptr<FrameTreeNode> FrameTree::CreateNode( | 
| -    int64 frame_id, | 
| -    const std::string& frame_name, | 
| -    int render_frame_host_id, | 
| -    FrameTreeNode* parent_node) { | 
| -  scoped_ptr<FrameTreeNode> frame_tree_node(new FrameTreeNode( | 
| -      parent_node->navigator(), render_frame_delegate_, render_view_delegate_, | 
| -      render_widget_delegate_, manager_delegate_, frame_id, frame_name)); | 
| - | 
| -  scoped_ptr<RenderFrameHostImpl> render_frame_host( | 
| -      RenderFrameHostFactory::Create( | 
| -          parent_node->render_frame_host()->render_view_host(), | 
| -          parent_node->render_frame_host()->delegate(), | 
| -          this, | 
| -          frame_tree_node.get(), | 
| -          render_frame_host_id, | 
| -          false)); | 
| - | 
| -  frame_tree_node->set_render_frame_host(render_frame_host.release(), true); | 
| -  return frame_tree_node.Pass(); | 
| -} | 
| - | 
| }  // namespace content | 
|  |