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