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 |