frame_tree_node.h revision 1675a649fd7a8b3cb80ffddae2dc181f122353c5
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/ref_counted.h"
12#include "base/memory/scoped_ptr.h"
13#include "base/memory/scoped_vector.h"
14#include "content/browser/frame_host/render_frame_host_impl.h"
15#include "content/browser/frame_host/render_frame_host_manager.h"
16#include "content/common/content_export.h"
17#include "url/gurl.h"
18
19namespace content {
20
21class FrameTree;
22class Navigator;
23class RenderFrameHostImpl;
24
25// When a page contains iframes, its renderer process maintains a tree structure
26// of those frames. We are mirroring this tree in the browser process. This
27// class represents a node in this tree and is a wrapper for all objects that
28// are frame-specific (as opposed to page-specific).
29class CONTENT_EXPORT FrameTreeNode {
30 public:
31
32  FrameTreeNode(FrameTree* frame_tree,
33                Navigator* navigator,
34                RenderFrameHostDelegate* render_frame_delegate,
35                RenderViewHostDelegate* render_view_delegate,
36                RenderWidgetHostDelegate* render_widget_delegate,
37                RenderFrameHostManager::Delegate* manager_delegate,
38                const std::string& name);
39
40  ~FrameTreeNode();
41
42  bool IsMainFrame() const;
43
44  void AddChild(scoped_ptr<FrameTreeNode> child,
45                int process_id,
46                int frame_routing_id);
47  void RemoveChild(FrameTreeNode* child);
48
49  // Clears process specific-state in this node to prepare for a new process.
50  void ResetForNewProcess();
51
52  FrameTree* frame_tree() const {
53    return frame_tree_;
54  }
55
56  Navigator* navigator() {
57    return navigator_.get();
58  }
59
60  RenderFrameHostManager* render_manager() {
61    return &render_manager_;
62  }
63
64  int64 frame_tree_node_id() const {
65    return frame_tree_node_id_;
66  }
67
68  const std::string& frame_name() const {
69    return frame_name_;
70  }
71
72  size_t child_count() const {
73    return children_.size();
74  }
75
76  FrameTreeNode* parent() const { return parent_; }
77
78  FrameTreeNode* child_at(size_t index) const {
79    return children_[index];
80  }
81
82  const GURL& current_url() const {
83    return current_url_;
84  }
85
86  void set_current_url(const GURL& url) {
87    current_url_ = url;
88  }
89
90  RenderFrameHostImpl* current_frame_host() const {
91    return render_manager_.current_frame_host();
92  }
93
94 private:
95  void set_parent(FrameTreeNode* parent) { parent_ = parent; }
96
97  // The next available browser-global FrameTreeNode ID.
98  static int64 next_frame_tree_node_id_;
99
100  // The FrameTree that owns us.
101  FrameTree* frame_tree_;  // not owned.
102
103  // The Navigator object responsible for managing navigations at this node
104  // of the frame tree.
105  scoped_refptr<Navigator> navigator_;
106
107  // Manages creation and swapping of RenderFrameHosts for this frame.  This
108  // must be declared before |children_| so that it gets deleted after them.
109  //  That's currently necessary so that RenderFrameHostImpl's destructor can
110  // call GetProcess.
111  RenderFrameHostManager render_manager_;
112
113  // A browser-global identifier for the frame in the page, which stays stable
114  // even if the frame does a cross-process navigation.
115  const int64 frame_tree_node_id_;
116
117  // The assigned name of the frame. This name can be empty, unlike the unique
118  // name generated internally in the DOM tree.
119  std::string frame_name_;
120
121  // The parent node of this frame. NULL if this node is the root or if it has
122  // not yet been attached to the frame tree.
123  FrameTreeNode* parent_;
124
125  // The immediate children of this specific frame.
126  ScopedVector<FrameTreeNode> children_;
127
128  // Track the current frame's last committed URL, so we can estimate the
129  // process impact of out-of-process iframes.
130  // TODO(creis): Remove this when we can store subframe URLs in the
131  // NavigationController.
132  GURL current_url_;
133
134  DISALLOW_COPY_AND_ASSIGN(FrameTreeNode);
135};
136
137}  // namespace content
138
139#endif  // CONTENT_BROWSER_FRAME_HOST_FRAME_TREE_NODE_H_
140