frame_tree_node.h revision 1e9bf3e0803691d0a228da41fc608347b6db4340
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 3// found in the LICENSE file. 4 5#ifndef CONTENT_BROWSER_FRAME_HOST_FRAME_TREE_NODE_H_ 6#define CONTENT_BROWSER_FRAME_HOST_FRAME_TREE_NODE_H_ 7 8#include <string> 9 10#include "base/basictypes.h" 11#include "base/memory/scoped_ptr.h" 12#include "base/memory/scoped_vector.h" 13#include "content/common/content_export.h" 14#include "url/gurl.h" 15 16namespace content { 17 18class RenderFrameHostImpl; 19 20// When a page contains iframes, its renderer process maintains a tree structure 21// of those frames. We are mirroring this tree in the browser process. This 22// class represents a node in this tree and is a wrapper for all objects that 23// are frame-specific (as opposed to page-specific). 24class CONTENT_EXPORT FrameTreeNode { 25 public: 26 static const int64 kInvalidFrameId; 27 28 FrameTreeNode(int64 frame_id, const std::string& name, 29 scoped_ptr<RenderFrameHostImpl> render_frame_host); 30 ~FrameTreeNode(); 31 32 void AddChild(scoped_ptr<FrameTreeNode> child); 33 void RemoveChild(int64 child_id); 34 35 // Transitional API allowing the RenderFrameHost of a FrameTreeNode 36 // representing the main frame to be provided by someone else. After 37 // this is called, the FrameTreeNode no longer owns its RenderFrameHost. 38 // 39 // This should only be used for the main frame (aka root) in a frame tree. 40 // 41 // TODO(ajwong): Remove this method once the main frame RenderFrameHostImpl is 42 // no longer owned by the RenderViewHostImpl. 43 void ResetForMainFrame(RenderFrameHostImpl* new_render_frame_host); 44 45 void set_frame_id(int64 frame_id) { 46 DCHECK_EQ(frame_id_, kInvalidFrameId); 47 frame_id_ = frame_id; 48 } 49 50 int64 frame_id() const { 51 return frame_id_; 52 } 53 54 const std::string& frame_name() const { 55 return frame_name_; 56 } 57 58 size_t child_count() const { 59 return children_.size(); 60 } 61 62 FrameTreeNode* child_at(size_t index) const { 63 return children_[index]; 64 } 65 66 const GURL& current_url() const { 67 return current_url_; 68 } 69 70 void set_current_url(const GURL& url) { 71 current_url_ = url; 72 } 73 74 RenderFrameHostImpl* render_frame_host() const { 75 return render_frame_host_; 76 } 77 78 private: 79 // The unique identifier for the frame in the page. 80 int64 frame_id_; 81 82 // The assigned name of the frame. This name can be empty, unlike the unique 83 // name generated internally in the DOM tree. 84 std::string frame_name_; 85 86 // The immediate children of this specific frame. 87 ScopedVector<FrameTreeNode> children_; 88 89 // When ResetForMainFrame() is called, this is set to false and the 90 // |render_frame_host_| below is not deleted on destruction. 91 // 92 // For the mainframe, the FrameTree does not own the |render_frame_host_|. 93 // This is a transitional wart because RenderViewHostManager does not yet 94 // have the bookkeeping logic to handle creating a pending RenderFrameHost 95 // along with a pending RenderViewHost. Thus, for the main frame, the 96 // RenderViewHost currently retains ownership and the FrameTreeNode should 97 // not delete it on destruction. 98 bool owns_render_frame_host_; 99 100 // The active RenderFrameHost for this frame. The FrameTreeNode does not 101 // always own this pointer. See comments above |owns_render_frame_host_|. 102 // TODO(ajwong): Replace with RenderFrameHostManager. 103 RenderFrameHostImpl* render_frame_host_; 104 105 // Track the current frame's last committed URL, so we can estimate the 106 // process impact of out-of-process iframes. 107 // TODO(creis): Remove this when we can store subframe URLs in the 108 // NavigationController. 109 GURL current_url_; 110 111 DISALLOW_COPY_AND_ASSIGN(FrameTreeNode); 112}; 113 114} // namespace content 115 116#endif // CONTENT_BROWSER_FRAME_HOST_FRAME_TREE_NODE_H_ 117