Chromium Code Reviews| Index: content/browser/renderer_host/frame_tree.cc |
| diff --git a/content/browser/renderer_host/frame_tree.cc b/content/browser/renderer_host/frame_tree.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..35cad55bfa0aa871dc265b0f043b9d280d6db913 |
| --- /dev/null |
| +++ b/content/browser/renderer_host/frame_tree.cc |
| @@ -0,0 +1,116 @@ |
| +// Copyright 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "content/browser/renderer_host/frame_tree.h" |
| + |
| +#include <queue> |
| + |
| +#include "base/bind.h" |
| +#include "base/callback.h" |
| +#include "content/browser/renderer_host/frame_tree_node.h" |
| +#include "content/browser/renderer_host/render_frame_host_impl.h" |
| + |
| +namespace content { |
| + |
| +namespace { |
| +bool FindHelper(int64 frame_id, FrameTreeNode** out_node, |
| + FrameTreeNode* node) { |
| + if (node->frame_id() == frame_id) { |
| + *out_node = node; |
| + return false; |
|
nasko
2013/09/11 22:26:24
Put a comment on why we return false. It is not im
awong
2013/09/21 01:19:56
Done.
|
| + } |
| + return true; |
| +} |
| + |
| +} // namespace |
| + |
| +FrameTree::FrameTree() |
| + : root_(new FrameTreeNode(FrameTreeNode::kInvalidFrameId, std::string(), |
| + scoped_ptr<RenderFrameHostImpl>())) { |
| +} |
| + |
| +FrameTree::~FrameTree() { |
| +} |
| + |
| +FrameTreeNode* FrameTree::FindByID(int64 frame_id) { |
| + FrameTreeNode* node = NULL; |
| + ForEach(base::Bind(&FindHelper, frame_id, &node)); |
| + return node; |
| +} |
| + |
| +void FrameTree::ForEach( |
| + const base::Callback<bool(FrameTreeNode*)>& on_node) const { |
| + std::queue<FrameTreeNode*> queue; |
| + queue.push(root_.get()); |
| + |
| + while (!queue.empty()) { |
| + FrameTreeNode* node = queue.front(); |
| + queue.pop(); |
| + if (!on_node.Run(node)) |
| + break; |
| + |
| + for (size_t i = 0; i < node->child_count(); ++i) |
| + queue.push(node->child_at(i)); |
| + } |
| +} |
| + |
| +bool FrameTree::IsFirstNavigation() const { |
| + return root_->frame_id() == FrameTreeNode::kInvalidFrameId; |
| +} |
| + |
| +void FrameTree::OnFirstNavigation(int main_frame_id) { |
| + root_->set_frame_id(main_frame_id); |
| +} |
| + |
| +void FrameTree::AddFrame(int render_frame_host_id, int64 parent_frame_id, |
| + int64 frame_id, const std::string& frame_name) { |
| + FrameTreeNode* parent = FindByID(parent_frame_id); |
| + parent->AddChild(CreateNode(frame_id, frame_name, render_frame_host_id, |
| + parent->render_frame_host()->GetProcess())); |
| +} |
| + |
| +void FrameTree::RemoveFrame(int64 parent_frame_id, int64 frame_id) { |
| + FrameTreeNode* parent = FindByID(parent_frame_id); |
| + |
| + // TODO(ajwong): Should this DCHECK()? |
|
nasko
2013/09/11 22:26:24
Yes, it will be helpful to DCHECK here.
awong
2013/09/21 01:19:56
Just removed the check cause we crash immediately.
Charlie Reis
2013/09/24 18:25:58
Is this done in response to a message from the ren
|
| + if (!parent) |
| + return; |
| + |
| + parent->RemoveChild(frame_id); |
| + if (!on_frame_removed_.is_null()) |
| + on_frame_removed_.Run(frame_id); |
| +} |
| + |
| +void FrameTree::SetFrameUrl(int64 frame_id, const GURL& url) { |
| + FrameTreeNode* node = FindByID(frame_id); |
| + if (node) |
| + node->set_current_url(url); |
| +} |
| + |
| +scoped_ptr<RenderFrameHostImpl> FrameTree::SwapMainFrame( |
| + scoped_ptr<RenderFrameHostImpl> render_frame_host) { |
| + return root_->ResetRenderFrameHost(render_frame_host.Pass()); |
| +} |
| + |
| +RenderFrameHostImpl* FrameTree::GetMainFrame() const { |
| + return root_->render_frame_host(); |
| +} |
| + |
| +void FrameTree::SetFrameRemoveListener( |
| + const base::Callback<void(int64)>& on_frame_removed) { |
| + on_frame_removed_ = on_frame_removed; |
| +} |
| + |
| +scoped_ptr<FrameTreeNode> FrameTree::CreateNode( |
| + int64 frame_id, const std::string& frame_name, int render_frame_host_id, |
| + RenderProcessHost* render_process_host) { |
| + scoped_ptr<RenderFrameHostImpl> render_frame_host( |
| + new RenderFrameHostImpl(render_process_host, this, render_frame_host_id, |
| + false)); |
| + |
| + return make_scoped_ptr(new FrameTreeNode(frame_id, frame_name, |
| + render_frame_host.Pass())); |
| +} |
| + |
| +} // namespace content |