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_H_ 6 #define CONTENT_BROWSER_FRAME_HOST_FRAME_TREE_H_ 7 8 #include <string> 9 10 #include "base/callback.h" 11 #include "base/memory/scoped_ptr.h" 12 #include "content/browser/frame_host/frame_tree_node.h" 13 #include "content/common/content_export.h" 14 15 namespace content { 16 17 class FrameTreeNode; 18 class Navigator; 19 class RenderFrameHostDelegate; 20 class RenderProcessHost; 21 class RenderViewHostDelegate; 22 class RenderViewHostImpl; 23 class RenderFrameHostManager; 24 class RenderWidgetHostDelegate; 25 26 // Represents the frame tree for a page. With the exception of the main frame, 27 // all FrameTreeNodes will be created/deleted in response to frame attach and 28 // detach events in the DOM. 29 // 30 // The main frame's FrameTreeNode is special in that it is reused. This allows 31 // it to serve as an anchor for state that needs to persist across top-level 32 // page navigations. 33 // 34 // TODO(ajwong): Move NavigationController ownership to the main frame 35 // FrameTreeNode. Possibly expose access to it from here. 36 // 37 // This object is only used on the UI thread. 38 class CONTENT_EXPORT FrameTree { 39 public: 40 // Each FrameTreeNode will default to using the given |navigator| for 41 // navigation tasks in the frame. 42 // A set of delegates are remembered here so that we can create 43 // RenderFrameHostManagers. 44 // TODO(creis): This set of delegates will change as we move things to 45 // Navigator. 46 FrameTree(Navigator* navigator, 47 RenderFrameHostDelegate* render_frame_delegate, 48 RenderViewHostDelegate* render_view_delegate, 49 RenderWidgetHostDelegate* render_widget_delegate, 50 RenderFrameHostManager::Delegate* manager_delegate); 51 ~FrameTree(); 52 root()53 FrameTreeNode* root() const { return root_.get(); } 54 55 // Returns the FrameTreeNode with the given |frame_tree_node_id|. 56 FrameTreeNode* FindByID(int64 frame_tree_node_id); 57 58 // Returns the FrameTreeNode with the given renderer-specific |routing_id|. 59 FrameTreeNode* FindByRoutingID(int routing_id, int process_id); 60 61 // Executes |on_node| on each node in the frame tree. If |on_node| returns 62 // false, terminates the iteration immediately. Returning false is useful 63 // if |on_node| is just doing a search over the tree. The iteration proceeds 64 // top-down and visits a node before adding its children to the queue, making 65 // it safe to remove children during the callback. 66 void ForEach(const base::Callback<bool(FrameTreeNode*)>& on_node) const; 67 68 // Frame tree manipulation routines. 69 RenderFrameHostImpl* AddFrame(FrameTreeNode* parent, 70 int new_routing_id, 71 const std::string& frame_name); 72 void RemoveFrame(FrameTreeNode* child); 73 74 // Clears process specific-state after a main frame process swap. 75 // This destroys most of the frame tree but retains the root node so that 76 // navigation state may be kept on it between process swaps. Used to 77 // support bookkeeping for top-level navigations. 78 // TODO(creis): Look into how we can remove the need for this method. 79 void ResetForMainFrameSwap(); 80 81 // Update the frame tree after a process exits. Any nodes currently using the 82 // given |render_view_host| will lose all their children. 83 // TODO(creis): This should take a RenderProcessHost once RenderFrameHost 84 // knows its process. Until then, we would just be asking the RenderViewHost 85 // for its process, so we'll skip that step. 86 void RenderProcessGone(RenderViewHost* render_view_host); 87 88 // Convenience accessor for the main frame's RenderFrameHostImpl. 89 RenderFrameHostImpl* GetMainFrame() const; 90 91 // Returns the focused frame. 92 FrameTreeNode* GetFocusedFrame(); 93 94 // Sets the focused frame. 95 void SetFocusedFrame(FrameTreeNode* node); 96 97 // Allows a client to listen for frame removal. The listener should expect 98 // to receive the RenderViewHostImpl containing the frame and the renderer- 99 // specific frame routing ID of the removed frame. 100 // TODO(creis): These parameters will later change to be the RenderFrameHost. 101 void SetFrameRemoveListener( 102 const base::Callback<void(RenderViewHostImpl*, int)>& on_frame_removed); 103 104 // Creates a RenderViewHost for a new main frame RenderFrameHost in the given 105 // |site_instance|. The RenderViewHost will have its Shutdown method called 106 // when all of the RenderFrameHosts using it are deleted. 107 RenderViewHostImpl* CreateRenderViewHostForMainFrame( 108 SiteInstance* site_instance, 109 int routing_id, 110 int main_frame_routing_id, 111 bool swapped_out, 112 bool hidden); 113 114 // Returns the existing RenderViewHost for a new subframe RenderFrameHost. 115 // There should always be such a RenderViewHost, because the main frame 116 // RenderFrameHost for each SiteInstance should be created before subframes. 117 RenderViewHostImpl* GetRenderViewHostForSubFrame(SiteInstance* site_instance); 118 119 // Keeps track of which RenderFrameHosts are using each RenderViewHost. When 120 // the number drops to zero, we call Shutdown on the RenderViewHost. 121 void RegisterRenderFrameHost(RenderFrameHostImpl* render_frame_host); 122 void UnregisterRenderFrameHost(RenderFrameHostImpl* render_frame_host); 123 124 private: 125 typedef base::hash_map<int, RenderViewHostImpl*> RenderViewHostMap; 126 typedef std::multimap<int, RenderViewHostImpl*> RenderViewHostMultiMap; 127 128 // These delegates are installed into all the RenderViewHosts and 129 // RenderFrameHosts that we create. 130 RenderFrameHostDelegate* render_frame_delegate_; 131 RenderViewHostDelegate* render_view_delegate_; 132 RenderWidgetHostDelegate* render_widget_delegate_; 133 RenderFrameHostManager::Delegate* manager_delegate_; 134 135 // Map of SiteInstance ID to a RenderViewHost. This allows us to look up the 136 // RenderViewHost for a given SiteInstance when creating RenderFrameHosts. 137 // Combined with the refcount on RenderViewHost, this allows us to call 138 // Shutdown on the RenderViewHost and remove it from the map when no more 139 // RenderFrameHosts are using it. 140 // 141 // Must be declared before |root_| so that it is deleted afterward. Otherwise 142 // the map will be cleared before we delete the RenderFrameHosts in the tree. 143 RenderViewHostMap render_view_host_map_; 144 145 // Map of SiteInstance ID to RenderViewHosts that are pending shutdown. The 146 // renderers of these RVH are currently executing the unload event in 147 // background. When the SwapOutACK is received, they will be deleted. In the 148 // meantime, they are kept in this map, as they should not be reused (part of 149 // their state is already gone away). 150 RenderViewHostMultiMap render_view_host_pending_shutdown_map_; 151 152 scoped_ptr<FrameTreeNode> root_; 153 154 int64 focused_frame_tree_node_id_; 155 156 base::Callback<void(RenderViewHostImpl*, int)> on_frame_removed_; 157 158 DISALLOW_COPY_AND_ASSIGN(FrameTree); 159 }; 160 161 } // namespace content 162 163 #endif // CONTENT_BROWSER_FRAME_HOST_FRAME_TREE_H_ 164