14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#ifndef CONTENT_BROWSER_FRAME_HOST_FRAME_TREE_NODE_H_ 61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define CONTENT_BROWSER_FRAME_HOST_FRAME_TREE_NODE_H_ 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <string> 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/basictypes.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/ref_counted.h" 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/memory/scoped_vector.h" 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/browser/frame_host/render_frame_host_impl.h" 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/frame_host/render_frame_host_manager.h" 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/common/content_export.h" 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "url/gurl.h" 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace content { 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class FrameTree; 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class Navigator; 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class RenderFrameHostImpl; 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// When a page contains iframes, its renderer process maintains a tree structure 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// of those frames. We are mirroring this tree in the browser process. This 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// class represents a node in this tree and is a wrapper for all objects that 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// are frame-specific (as opposed to page-specific). 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class CONTENT_EXPORT FrameTreeNode { 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameTreeNode(FrameTree* frame_tree, 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Navigator* navigator, 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameHostDelegate* render_frame_delegate, 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RenderViewHostDelegate* render_view_delegate, 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RenderWidgetHostDelegate* render_widget_delegate, 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RenderFrameHostManager::Delegate* manager_delegate, 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& name); 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ~FrameTreeNode(); 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool IsMainFrame() const; 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 441675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch void AddChild(scoped_ptr<FrameTreeNode> child, 451675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch int process_id, 461675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch int frame_routing_id); 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void RemoveChild(FrameTreeNode* child); 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Clears process specific-state in this node to prepare for a new process. 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ResetForNewProcess(); 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameTree* frame_tree() const { 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return frame_tree_; 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Navigator* navigator() { 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return navigator_.get(); 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RenderFrameHostManager* render_manager() { 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return &render_manager_; 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int64 frame_tree_node_id() const { 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return frame_tree_node_id_; 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& frame_name() const { 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return frame_name_; 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) size_t child_count() const { 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return children_.size(); 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameTreeNode* parent() const { return parent_; } 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FrameTreeNode* child_at(size_t index) const { 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return children_[index]; 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const GURL& current_url() const { 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return current_url_; 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void set_current_url(const GURL& url) { 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) current_url_ = url; 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RenderFrameHostImpl* current_frame_host() const { 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return render_manager_.current_frame_host(); 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private: 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void set_parent(FrameTreeNode* parent) { parent_ = parent; } 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The next available browser-global FrameTreeNode ID. 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static int64 next_frame_tree_node_id_; 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The FrameTree that owns us. 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameTree* frame_tree_; // not owned. 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The Navigator object responsible for managing navigations at this node 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // of the frame tree. 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<Navigator> navigator_; 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Manages creation and swapping of RenderFrameHosts for this frame. This 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // must be declared before |children_| so that it gets deleted after them. 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // That's currently necessary so that RenderFrameHostImpl's destructor can 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // call GetProcess. 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RenderFrameHostManager render_manager_; 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // A browser-global identifier for the frame in the page, which stays stable 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // even if the frame does a cross-process navigation. 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const int64 frame_tree_node_id_; 116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The assigned name of the frame. This name can be empty, unlike the unique 1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // name generated internally in the DOM tree. 1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) std::string frame_name_; 1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The parent node of this frame. NULL if this node is the root or if it has 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // not yet been attached to the frame tree. 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FrameTreeNode* parent_; 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The immediate children of this specific frame. 1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ScopedVector<FrameTreeNode> children_; 1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Track the current frame's last committed URL, so we can estimate the 1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // process impact of out-of-process iframes. 1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // TODO(creis): Remove this when we can store subframe URLs in the 1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // NavigationController. 1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) GURL current_url_; 1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FrameTreeNode); 1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace content 1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif // CONTENT_BROWSER_FRAME_HOST_FRAME_TREE_NODE_H_ 140