Index: content/browser/frame_host/render_frame_host_manager.h |
diff --git a/content/browser/frame_host/render_frame_host_manager.h b/content/browser/frame_host/render_frame_host_manager.h |
index ae8d9f9ddc4ff6cd18c405da388ebe0e6334e09a..4ad245d7d3e063824bf951c007caafad64b40190 100644 |
--- a/content/browser/frame_host/render_frame_host_manager.h |
+++ b/content/browser/frame_host/render_frame_host_manager.h |
@@ -20,6 +20,7 @@ |
#include "content/public/common/referrer.h" |
#include "ui/base/page_transition_types.h" |
+struct FrameHostMsg_BeginNavigation_Params; |
struct FrameMsg_Navigate_Params; |
namespace content { |
@@ -34,14 +35,13 @@ class NavigationEntryImpl; |
class RenderFrameHost; |
class RenderFrameHostDelegate; |
class RenderFrameHostImpl; |
-class RenderFrameHostManagerTest; |
class RenderFrameProxyHost; |
class RenderViewHost; |
class RenderViewHostImpl; |
class RenderWidgetHostDelegate; |
class RenderWidgetHostView; |
-class TestWebContents; |
class WebUIImpl; |
+struct CommonNavigationParams; |
// Manages RenderFrameHosts for a FrameTreeNode. It maintains a |
// current_frame_host() which is the content currently visible to the user. When |
@@ -366,12 +366,24 @@ class CONTENT_EXPORT RenderFrameHostManager : public NotificationObserver { |
// RenderFrameHostManager. Returns MSG_ROUTING_NONE if none is found. |
int GetRoutingIdForSiteInstance(SiteInstance* site_instance); |
- // PlzNavigate: Called when a navigation is ready to commit, to select the |
- // renderer that will commit it. |
+ // PlzNavigate |
+ // Notifies the RFHM that a navigation is about to begin so that it can |
+ // speculatively spawn a new renderer process if needed. |
+ void BeginNavigation(const FrameHostMsg_BeginNavigation_Params& params, |
+ const CommonNavigationParams& common_params); |
+ |
+ // PlzNavigate |
+ // Called when a navigation is ready to commit, to select the renderer that |
+ // will commit it. |
RenderFrameHostImpl* GetFrameHostForNavigation(const GURL& url, |
ui::PageTransition transition); |
+ // PlzNavigate |
+ // Cancels any ongoing navigation. |
+ void CleanUpNavigation(); |
+ |
private: |
+ friend class NavigatorTestWithBrowserSideNavigation; |
friend class RenderFrameHostManagerTest; |
friend class TestWebContents; |
@@ -466,6 +478,16 @@ class CONTENT_EXPORT RenderFrameHostManager : public NotificationObserver { |
int frame_routing_id, |
int flags); |
+ // PlzNavigate |
+ // Creates a new RenderFrameHost and does all required supporting work for the |
+ // speculative creation of a new renderer for an ongoing navigation request. |
+ // This RenderFrameHost might be destroyed later if the final navigation |
+ // destination doesn't match the initial one. |
+ bool CreateSpeculativeRenderFrameHost(const GURL& url, |
+ SiteInstance* old_instance, |
+ SiteInstance* new_instance, |
+ int bindings); |
+ |
// Sets up the necessary state for a new RenderViewHost with the given opener, |
// if necessary. It creates a RenderFrameProxy in the target renderer process |
// with the given |proxy_routing_id|, which is used to route IPC messages when |
@@ -485,6 +507,8 @@ class CONTENT_EXPORT RenderFrameHostManager : public NotificationObserver { |
// Sets the pending RenderFrameHost/WebUI to be the active one. Note that this |
// doesn't require the pending render_frame_host_ pointer to be non-NULL, |
// since there could be Web UI switching as well. Call this for every commit. |
+ // If PlzNavigate is enabled the method will set the speculative |
+ // RenderFrameHost to be the active one instead of the pending. |
void CommitPending(); |
// Runs the unload handler in the old RenderFrameHost, after the new |
@@ -531,6 +555,13 @@ class CONTENT_EXPORT RenderFrameHostManager : public NotificationObserver { |
// for the given |instance|. |
void DeleteRenderFrameProxyHost(SiteInstance* instance); |
+ // PlzNavigate |
+ // Returns the speculative RenderFrameHost or nullptr if there is no pending |
+ // one. |
+ RenderFrameHostImpl* speculative_render_frame_host() const { |
clamy
2014/12/02 12:59:27
If your accessor is private, why do you have an ac
carlosk
2014/12/03 14:31:11
Done.
|
+ return speculative_render_frame_host_.get(); |
+ } |
+ |
// For use in creating RenderFrameHosts. |
FrameTreeNode* frame_tree_node_; |
@@ -602,6 +633,21 @@ class CONTENT_EXPORT RenderFrameHostManager : public NotificationObserver { |
base::WeakPtrFactory<RenderFrameHostManager> weak_factory_; |
+ // PlzNavigate |
+ // Members to store the speculative RFH created upon starting a navigation |
+ // allowing the creation of the renderer process as early as possible. |
+ // The created instance might be discarded later on if the final URL's |
+ // SiteInstance isn't compatible with what was used to create it. |
+ // Note: speculative RenderFrameHost is only used for PlzNavigate and the |
+ // pending one only for the regular navigation. |
+ scoped_ptr<RenderFrameHostImpl> speculative_render_frame_host_; |
+ scoped_ptr<WebUIImpl> speculative_web_ui_; |
+ |
+ // PlzNavigate |
+ // If true at navigation commit time the current WebUI will be kept instead of |
+ // creating a new one. |
+ bool should_reuse_web_ui_; |
+ |
DISALLOW_COPY_AND_ASSIGN(RenderFrameHostManager); |
}; |