Commit 20edca70 authored by clamy@chromium.org's avatar clamy@chromium.org

Add a static FrameTreeNode lookup method in FrameTreeNode

This CL adds a static FrameTree::GloballyFindByID that can be used by to find a FrameTreeNode given a frame tree node id.

BUG=376082

Review URL: https://codereview.chromium.org/429603002

Cr-Commit-Position: refs/heads/master@{#289513}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@289513 0039d316-1c4b-4281-b951-d872f2087c98
parent 134bec5e
...@@ -8,18 +8,29 @@ ...@@ -8,18 +8,29 @@
#include "base/bind.h" #include "base/bind.h"
#include "base/callback.h" #include "base/callback.h"
#include "base/containers/hash_tables.h"
#include "base/lazy_instance.h"
#include "content/browser/frame_host/frame_tree_node.h" #include "content/browser/frame_host/frame_tree_node.h"
#include "content/browser/frame_host/navigator.h" #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_factory.h"
#include "content/browser/frame_host/render_frame_host_impl.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_factory.h"
#include "content/browser/renderer_host/render_view_host_impl.h" #include "content/browser/renderer_host/render_view_host_impl.h"
#include "content/public/browser/browser_thread.h"
namespace content { namespace content {
namespace { namespace {
// This is a global map between frame_tree_node_ids and pointer to
// FrameTreeNodes.
typedef base::hash_map<int64, FrameTreeNode*> FrameTreeNodeIDMap;
base::LazyInstance<FrameTreeNodeIDMap> g_frame_tree_node_id_map =
LAZY_INSTANCE_INITIALIZER;
// Used with FrameTree::ForEach() to search for the FrameTreeNode // Used with FrameTree::ForEach() to search for the FrameTreeNode
// corresponding to |frame_tree_node_id|. // corresponding to |frame_tree_node_id| whithin a specific FrameTree.
bool FrameTreeNodeForId(int64 frame_tree_node_id, bool FrameTreeNodeForId(int64 frame_tree_node_id,
FrameTreeNode** out_node, FrameTreeNode** out_node,
FrameTreeNode* node) { FrameTreeNode* node) {
...@@ -84,9 +95,22 @@ FrameTree::FrameTree(Navigator* navigator, ...@@ -84,9 +95,22 @@ FrameTree::FrameTree(Navigator* navigator,
manager_delegate, manager_delegate,
std::string())), std::string())),
focused_frame_tree_node_id_(-1) { focused_frame_tree_node_id_(-1) {
std::pair<FrameTreeNodeIDMap::iterator, bool> result =
g_frame_tree_node_id_map.Get().insert(
std::make_pair(root_->frame_tree_node_id(), root_.get()));
CHECK(result.second);
} }
FrameTree::~FrameTree() { FrameTree::~FrameTree() {
g_frame_tree_node_id_map.Get().erase(root_->frame_tree_node_id());
}
// static
FrameTreeNode* FrameTree::GloballyFindByID(int64 frame_tree_node_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
FrameTreeNodeIDMap* nodes = g_frame_tree_node_id_map.Pointer();
FrameTreeNodeIDMap::iterator it = nodes->find(frame_tree_node_id);
return it == nodes->end() ? NULL : it->second;
} }
FrameTreeNode* FrameTree::FindByID(int64 frame_tree_node_id) { FrameTreeNode* FrameTree::FindByID(int64 frame_tree_node_id) {
...@@ -124,6 +148,10 @@ RenderFrameHostImpl* FrameTree::AddFrame(FrameTreeNode* parent, ...@@ -124,6 +148,10 @@ RenderFrameHostImpl* FrameTree::AddFrame(FrameTreeNode* parent,
scoped_ptr<FrameTreeNode> node(new FrameTreeNode( scoped_ptr<FrameTreeNode> node(new FrameTreeNode(
this, parent->navigator(), render_frame_delegate_, render_view_delegate_, this, parent->navigator(), render_frame_delegate_, render_view_delegate_,
render_widget_delegate_, manager_delegate_, frame_name)); render_widget_delegate_, manager_delegate_, frame_name));
std::pair<FrameTreeNodeIDMap::iterator, bool> result =
g_frame_tree_node_id_map.Get().insert(
std::make_pair(node->frame_tree_node_id(), node.get()));
CHECK(result.second);
FrameTreeNode* node_ptr = node.get(); FrameTreeNode* node_ptr = node.get();
// AddChild is what creates the RenderFrameHost. // AddChild is what creates the RenderFrameHost.
parent->AddChild(node.Pass(), new_routing_id); parent->AddChild(node.Pass(), new_routing_id);
...@@ -142,7 +170,7 @@ void FrameTree::RemoveFrame(FrameTreeNode* child) { ...@@ -142,7 +170,7 @@ void FrameTree::RemoveFrame(FrameTreeNode* child) {
if (!on_frame_removed_.is_null()) { if (!on_frame_removed_.is_null()) {
on_frame_removed_.Run(render_frame_host); on_frame_removed_.Run(render_frame_host);
} }
g_frame_tree_node_id_map.Get().erase(child->frame_tree_node_id());
parent->RemoveChild(child); parent->RemoveChild(child);
} }
......
...@@ -50,9 +50,13 @@ class CONTENT_EXPORT FrameTree { ...@@ -50,9 +50,13 @@ class CONTENT_EXPORT FrameTree {
RenderFrameHostManager::Delegate* manager_delegate); RenderFrameHostManager::Delegate* manager_delegate);
~FrameTree(); ~FrameTree();
// Returns the FrameTreeNode with the given |frame_tree_node_id|.
static FrameTreeNode* GloballyFindByID(int64 frame_tree_node_id);
FrameTreeNode* root() const { return root_.get(); } FrameTreeNode* root() const { return root_.get(); }
// Returns the FrameTreeNode with the given |frame_tree_node_id|. // Returns the FrameTreeNode with the given |frame_tree_node_id| if it is part
// of this FrameTree.
FrameTreeNode* FindByID(int64 frame_tree_node_id); FrameTreeNode* FindByID(int64 frame_tree_node_id);
// Returns the FrameTreeNode with the given renderer-specific |routing_id|. // Returns the FrameTreeNode with the given renderer-specific |routing_id|.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment