| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/frame_host/frame_tree.h" | 5 #include "content/browser/frame_host/frame_tree.h" |
| 6 | 6 |
| 7 #include <queue> | 7 #include <queue> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 : render_frame_delegate_(render_frame_delegate), | 51 : render_frame_delegate_(render_frame_delegate), |
| 52 render_view_delegate_(render_view_delegate), | 52 render_view_delegate_(render_view_delegate), |
| 53 render_widget_delegate_(render_widget_delegate), | 53 render_widget_delegate_(render_widget_delegate), |
| 54 manager_delegate_(manager_delegate), | 54 manager_delegate_(manager_delegate), |
| 55 root_(new FrameTreeNode(navigator, | 55 root_(new FrameTreeNode(navigator, |
| 56 render_frame_delegate, | 56 render_frame_delegate, |
| 57 render_view_delegate, | 57 render_view_delegate, |
| 58 render_widget_delegate, | 58 render_widget_delegate, |
| 59 manager_delegate, | 59 manager_delegate, |
| 60 FrameTreeNode::kInvalidFrameId, | 60 FrameTreeNode::kInvalidFrameId, |
| 61 std::string(), | 61 std::string())) { |
| 62 scoped_ptr<RenderFrameHostImpl>())) { | |
| 63 } | 62 } |
| 64 | 63 |
| 65 FrameTree::~FrameTree() { | 64 FrameTree::~FrameTree() { |
| 66 } | 65 } |
| 67 | 66 |
| 68 FrameTreeNode* FrameTree::FindByID(int64 frame_tree_node_id) { | 67 FrameTreeNode* FrameTree::FindByID(int64 frame_tree_node_id) { |
| 69 FrameTreeNode* node = NULL; | 68 FrameTreeNode* node = NULL; |
| 70 ForEach(base::Bind(&FrameTreeNodeForId, frame_tree_node_id, &node)); | 69 ForEach(base::Bind(&FrameTreeNodeForId, frame_tree_node_id, &node)); |
| 71 return node; | 70 return node; |
| 72 } | 71 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 98 void FrameTree::AddFrame(int render_frame_host_id, | 97 void FrameTree::AddFrame(int render_frame_host_id, |
| 99 int64 parent_frame_id, | 98 int64 parent_frame_id, |
| 100 int64 frame_id, | 99 int64 frame_id, |
| 101 const std::string& frame_name) { | 100 const std::string& frame_name) { |
| 102 FrameTreeNode* parent = FindByFrameID(parent_frame_id); | 101 FrameTreeNode* parent = FindByFrameID(parent_frame_id); |
| 103 // TODO(ajwong): Should the renderer be killed here? Would there be a race on | 102 // TODO(ajwong): Should the renderer be killed here? Would there be a race on |
| 104 // shutdown that might make this case possible? | 103 // shutdown that might make this case possible? |
| 105 if (!parent) | 104 if (!parent) |
| 106 return; | 105 return; |
| 107 | 106 |
| 108 parent->AddChild(CreateNode(frame_id, frame_name, render_frame_host_id, | 107 parent->AddChild( |
| 109 parent->navigator(), | 108 CreateNode(frame_id, frame_name, render_frame_host_id, parent)); |
| 110 parent->render_frame_host()->GetProcess())); | |
| 111 } | 109 } |
| 112 | 110 |
| 113 void FrameTree::RemoveFrame(int64 parent_frame_id, int64 frame_id) { | 111 void FrameTree::RemoveFrame(RenderFrameHostImpl* render_frame_host, |
| 112 int64 parent_frame_id, |
| 113 int64 frame_id) { |
| 114 // If switches::kSitePerProcess is not specified, then the FrameTree only | 114 // If switches::kSitePerProcess is not specified, then the FrameTree only |
| 115 // contains a node for the root element. However, even in this case | 115 // contains a node for the root element. However, even in this case |
| 116 // frame detachments need to be broadcast outwards. | 116 // frame detachments need to be broadcast outwards. |
| 117 // | 117 // |
| 118 // TODO(ajwong): Move this below the |parent| check after the FrameTree is | 118 // TODO(ajwong): Move this below the |parent| check after the FrameTree is |
| 119 // guaranteed to be correctly populated even without the | 119 // guaranteed to be correctly populated even without the |
| 120 // switches::kSitePerProcess flag. | 120 // switches::kSitePerProcess flag. |
| 121 FrameTreeNode* parent = FindByFrameID(parent_frame_id); | 121 FrameTreeNode* parent = FindByFrameID(parent_frame_id); |
| 122 FrameTreeNode* child = FindByFrameID(frame_id); | 122 FrameTreeNode* child = FindByFrameID(frame_id); |
| 123 if (!on_frame_removed_.is_null()) { | 123 if (!on_frame_removed_.is_null()) { |
| 124 on_frame_removed_.Run( | 124 on_frame_removed_.Run( |
| 125 root_->render_frame_host()->render_view_host(), frame_id); | 125 render_frame_host->render_view_host(), frame_id); |
| 126 } | 126 } |
| 127 | 127 |
| 128 // TODO(ajwong): Should the renderer be killed here? Would there be a race on | 128 // TODO(ajwong): Should the renderer be killed here? Would there be a race on |
| 129 // shutdown that might make this case possible? | 129 // shutdown that might make this case possible? |
| 130 if (!parent || !child) | 130 if (!parent || !child) |
| 131 return; | 131 return; |
| 132 | 132 |
| 133 parent->RemoveChild(child); | 133 parent->RemoveChild(child); |
| 134 } | 134 } |
| 135 | 135 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 160 FrameTreeNode* FrameTree::FindByFrameID(int64 frame_id) { | 160 FrameTreeNode* FrameTree::FindByFrameID(int64 frame_id) { |
| 161 FrameTreeNode* node = NULL; | 161 FrameTreeNode* node = NULL; |
| 162 ForEach(base::Bind(&FrameTreeNodeForFrameId, frame_id, &node)); | 162 ForEach(base::Bind(&FrameTreeNodeForFrameId, frame_id, &node)); |
| 163 return node; | 163 return node; |
| 164 } | 164 } |
| 165 | 165 |
| 166 scoped_ptr<FrameTreeNode> FrameTree::CreateNode( | 166 scoped_ptr<FrameTreeNode> FrameTree::CreateNode( |
| 167 int64 frame_id, | 167 int64 frame_id, |
| 168 const std::string& frame_name, | 168 const std::string& frame_name, |
| 169 int render_frame_host_id, | 169 int render_frame_host_id, |
| 170 Navigator* navigator, | 170 FrameTreeNode* parent_node) { |
| 171 RenderProcessHost* render_process_host) { | 171 scoped_ptr<FrameTreeNode> frame_tree_node(new FrameTreeNode( |
| 172 parent_node->navigator(), render_frame_delegate_, render_view_delegate_, |
| 173 render_widget_delegate_, manager_delegate_, frame_id, frame_name)); |
| 174 |
| 172 scoped_ptr<RenderFrameHostImpl> render_frame_host( | 175 scoped_ptr<RenderFrameHostImpl> render_frame_host( |
| 173 RenderFrameHostFactory::Create( | 176 RenderFrameHostFactory::Create( |
| 174 root_->render_frame_host()->render_view_host(), | 177 parent_node->render_frame_host()->render_view_host(), |
| 175 root_->render_frame_host()->delegate(), | 178 parent_node->render_frame_host()->delegate(), |
| 176 this, | 179 this, |
| 180 frame_tree_node.get(), |
| 177 render_frame_host_id, | 181 render_frame_host_id, |
| 178 false)); | 182 false)); |
| 179 | 183 |
| 180 return make_scoped_ptr(new FrameTreeNode(navigator, | 184 frame_tree_node->set_render_frame_host(render_frame_host.release(), true); |
| 181 render_frame_delegate_, render_view_delegate_, render_widget_delegate_, | 185 return frame_tree_node.Pass(); |
| 182 manager_delegate_, frame_id, frame_name, render_frame_host.Pass())); | |
| 183 } | 186 } |
| 184 | 187 |
| 185 } // namespace content | 188 } // namespace content |
| OLD | NEW |