Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1072)

Unified Diff: content/browser/frame_host/render_frame_host_manager.h

Issue 701953006: PlzNavigate: Speculatively spawns a renderer process for navigations. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed missing references to |base| namespace. Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 3b80d6304c89347ee86018c36e53f56f4acd543c..b5a8bfc5c76b2cdc36646f78738560daf41eff8a 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 {
@@ -31,6 +32,7 @@ class InterstitialPageImpl;
class NavigationControllerImpl;
class NavigationEntry;
class NavigationEntryImpl;
+class NavigatorTestWithBrowserSideNavigation;
class RenderFrameHost;
class RenderFrameHostDelegate;
class RenderFrameHostImpl;
@@ -42,6 +44,7 @@ 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
@@ -289,7 +292,8 @@ class CONTENT_EXPORT RenderFrameHostManager : public NotificationObserver {
// Called when a renderer's frame navigates.
void DidNavigateFrame(RenderFrameHostImpl* render_frame_host,
- bool was_caused_by_user_gesture);
+ bool was_caused_by_user_gesture,
+ bool was_within_same_page);
// Called when a renderer sets its opener to null.
void DidDisownOpener(RenderFrameHost* render_frame_host);
@@ -367,17 +371,34 @@ 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 has begun so that it can speculatively
+ // create 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 RenderFrameHost
+ // in which the navigation will commit.
RenderFrameHostImpl* GetFrameHostForNavigation(const GURL& url,
ui::PageTransition transition);
+ // PlzNavigate
+ // Cancels any state for any ongoing navigation.
+ void CleanUpNavigation();
+
+ // PlzNavigate
+ // Clears the speculative members, returning the RenderFrameHost to the caller
+ // for disposal.
+ scoped_ptr<RenderFrameHostImpl> UnsetSpeculativeRenderFrameHost();
+
// Notification methods to tell this RenderFrameHostManager that the frame it
// is responsible for has started or stopped loading a document.
void OnDidStartLoading();
void OnDidStopLoading();
private:
+ friend class NavigatorTestWithBrowserSideNavigation;
friend class RenderFrameHostManagerTest;
friend class TestWebContents;
@@ -478,6 +499,15 @@ class CONTENT_EXPORT RenderFrameHostManager : public NotificationObserver {
int frame_routing_id,
int flags);
+ // PlzNavigate
+ // Creates and initializes a speculative RenderFrameHost and/or WebUI for an
+ // ongoing navigation. They might be destroyed and re-created later if the
+ // navigation is redirected to a different site.
+ 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
@@ -497,6 +527,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 (not pending)
+ // RenderFrameHost to be the active one.
void CommitPending();
// Runs the unload handler in the old RenderFrameHost, after the new
@@ -583,6 +615,7 @@ class CONTENT_EXPORT RenderFrameHostManager : public NotificationObserver {
// transitioning between two Web UI pages: the RFH won't be swapped, so the
// pending pointer will be unused, but there will be a pending Web UI
// associated with the navigation.
+ // Note: This is not used in PlzNavigate.
scoped_ptr<RenderFrameHostImpl> pending_render_frame_host_;
// If a pending request needs to be transferred to another process, this
@@ -598,6 +631,7 @@ class CONTENT_EXPORT RenderFrameHostManager : public NotificationObserver {
// page. The scoped_ptr is used if pending_web_ui_ != web_ui_, the WeakPtr is
// used for when they reference the same object. If either is non-NULL, the
// other should be NULL.
+ // Note: These are not used in PlzNavigate.
scoped_ptr<WebUIImpl> pending_web_ui_;
base::WeakPtr<WebUIImpl> pending_and_current_web_ui_;
@@ -617,6 +651,22 @@ class CONTENT_EXPORT RenderFrameHostManager : public NotificationObserver {
NotificationRegistrar registrar_;
+ // PlzNavigate
+ // These members store a speculative RenderFrameHost and WebUI. They are
+ // created early in during a navigation so the renderer process can be started
+ // in parallel with it. This is purely an optimization and is not required for
+ // correct behavior. 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: PlzNavigate only uses speculative RenderFrameHosts and not pending
+ // ones.
+ 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_;
+
base::WeakPtrFactory<RenderFrameHostManager> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(RenderFrameHostManager);

Powered by Google App Engine
This is Rietveld 408576698