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 9e1dc16c788f45b95351c66347be38730ad05eb4..3b905af94bfaf2ea3d24ad5419ff0c53f5bf16e1 100644 |
--- a/content/browser/frame_host/frame_tree.cc |
+++ b/content/browser/frame_host/frame_tree.cc |
@@ -11,6 +11,8 @@ |
#include "content/browser/frame_host/frame_tree_node.h" |
#include "content/browser/frame_host/navigator.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 { |
@@ -28,18 +30,6 @@ bool FrameTreeNodeForId(int64 frame_tree_node_id, |
return true; |
} |
-// TODO(creis): Remove this version along with FrameTreeNode::frame_id(). |
-bool FrameTreeNodeForFrameId(int64 frame_id, |
- FrameTreeNode** out_node, |
- FrameTreeNode* node) { |
- if (node->frame_id() == frame_id) { |
- *out_node = node; |
- // Terminate iteration once the node has been found. |
- return false; |
- } |
- return true; |
-} |
- |
} // namespace |
FrameTree::FrameTree(Navigator* navigator, |
@@ -53,9 +43,7 @@ FrameTree::FrameTree(Navigator* navigator, |
render_view_delegate, |
render_widget_delegate, |
manager_delegate, |
- FrameTreeNode::kInvalidFrameId, |
- std::string(), |
- scoped_ptr<RenderFrameHostImpl>())) { |
+ std::string())) { |
} |
FrameTree::~FrameTree() { |
@@ -83,30 +71,26 @@ void FrameTree::ForEach( |
} |
} |
-bool FrameTree::IsFirstNavigationAfterSwap() const { |
- return root_->frame_id() == FrameTreeNode::kInvalidFrameId; |
-} |
- |
-void FrameTree::OnFirstNavigationAfterSwap(int main_frame_id) { |
- root_->set_frame_id(main_frame_id); |
-} |
- |
-void FrameTree::AddFrame(int render_frame_host_id, |
+void FrameTree::AddFrame(RenderViewHostImpl* parent_render_view_host, |
+ int render_frame_host_id, |
int64 parent_frame_id, |
int64 frame_id, |
const std::string& frame_name) { |
- FrameTreeNode* parent = FindByFrameID(parent_frame_id); |
+ int64 parent_frame_tree_node_id = |
+ parent_render_view_host->GetFrameTreeNodeID(parent_frame_id); |
+ FrameTreeNode* parent = FindByID(parent_frame_tree_node_id); |
// TODO(ajwong): Should the renderer be killed here? Would there be a race on |
// shutdown that might make this case possible? |
if (!parent) |
return; |
- parent->AddChild(CreateNode(frame_id, frame_name, render_frame_host_id, |
- parent->navigator(), |
- parent->render_frame_host()->GetProcess())); |
+ parent->AddChild(CreateNode(frame_id, frame_name, parent->navigator(), |
+ parent_render_view_host), |
+ render_frame_host_id); |
} |
-void FrameTree::RemoveFrame(int64 parent_frame_id, int64 frame_id) { |
+void FrameTree::RemoveFrame(int64 parent_frame_tree_node_id, |
+ int64 frame_tree_node_id) { |
// If switches::kSitePerProcess is not specified, then the FrameTree only |
// contains a node for the root element. However, even in this case |
// frame detachments need to be broadcast outwards. |
@@ -114,11 +98,12 @@ void FrameTree::RemoveFrame(int64 parent_frame_id, int64 frame_id) { |
// TODO(ajwong): Move this below the |parent| check after the FrameTree is |
// guaranteed to be correctly populated even without the |
// switches::kSitePerProcess flag. |
- FrameTreeNode* parent = FindByFrameID(parent_frame_id); |
- FrameTreeNode* child = FindByFrameID(frame_id); |
+ FrameTreeNode* parent = FindByID(parent_frame_tree_node_id); |
+ FrameTreeNode* child = FindByID(frame_tree_node_id); |
if (!on_frame_removed_.is_null()) { |
+ // TODO(creis): This should be the frame ID, not the FTN ID. |
on_frame_removed_.Run( |
- root_->render_frame_host()->render_view_host(), frame_id); |
+ root_->render_frame_host()->render_view_host(), frame_tree_node_id); |
} |
// TODO(ajwong): Should the renderer be killed here? Would there be a race on |
@@ -129,8 +114,8 @@ void FrameTree::RemoveFrame(int64 parent_frame_id, int64 frame_id) { |
parent->RemoveChild(child); |
} |
-void FrameTree::SetFrameUrl(int64 frame_id, const GURL& url) { |
- FrameTreeNode* node = FindByFrameID(frame_id); |
+void FrameTree::SetFrameUrl(int64 frame_tree_node_id, const GURL& url) { |
+ FrameTreeNode* node = FindByID(frame_tree_node_id); |
// TODO(ajwong): Should the renderer be killed here? Would there be a race on |
// shutdown that might make this case possible? |
if (!node) |
@@ -140,10 +125,6 @@ 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); |
-} |
- |
RenderFrameHostImpl* FrameTree::GetMainFrame() const { |
return root_->render_frame_host(); |
} |
@@ -153,25 +134,46 @@ void FrameTree::SetFrameRemoveListener( |
on_frame_removed_ = on_frame_removed; |
} |
-FrameTreeNode* FrameTree::FindByFrameID(int64 frame_id) { |
- FrameTreeNode* node = NULL; |
- ForEach(base::Bind(&FrameTreeNodeForFrameId, frame_id, &node)); |
- return node; |
+RenderViewHostImpl* FrameTree::GetRenderViewHostForNewFrame( |
+ SiteInstance* site_instance, |
+ int routing_id, |
+ int main_frame_routing_id, |
+ bool swapped_out, |
+ bool hidden) { |
+ RenderViewHostMap::iterator iter = |
+ render_view_host_map_.find(site_instance->GetId()); |
+ RenderViewHostImpl* rvh = NULL; |
+ if (iter != render_view_host_map_.end()) { |
+ rvh = iter->second; |
+ } else { |
+ 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()] = rvh; |
+ } |
+ return rvh; |
} |
scoped_ptr<FrameTreeNode> FrameTree::CreateNode( |
int64 frame_id, |
const std::string& frame_name, |
- int render_frame_host_id, |
Navigator* navigator, |
- RenderProcessHost* render_process_host) { |
- scoped_ptr<RenderFrameHostImpl> render_frame_host( |
- new RenderFrameHostImpl(root_->render_frame_host()->render_view_host(), |
- this, render_frame_host_id, false)); |
- |
- return make_scoped_ptr(new FrameTreeNode(navigator, |
- render_view_delegate_, render_widget_delegate_, manager_delegate_, |
- frame_id, frame_name, render_frame_host.Pass())); |
+ RenderViewHostImpl* render_view_host) { |
+ // Create the FrameTreeNode with a unique browser-wide ID, and make sure the |
+ // renderer-specific frame_id can be used to find it. |
+ FrameTreeNode* node(new FrameTreeNode(navigator, |
+ render_view_delegate_, |
+ render_widget_delegate_, |
+ manager_delegate_, |
+ frame_name)); |
+ render_view_host->RegisterFrameID(frame_id, node->frame_tree_node_id()); |
+ return make_scoped_ptr(node); |
} |
} // namespace content |