Index: content/browser/frame_host/navigation_handle_impl.h |
diff --git a/content/browser/frame_host/navigation_handle_impl.h b/content/browser/frame_host/navigation_handle_impl.h |
index 18d12057910e42cb264d6d58d7e967fbfa0d6d29..c28761be683878d90f79c8c5cbcb610a75461cd0 100644 |
--- a/content/browser/frame_host/navigation_handle_impl.h |
+++ b/content/browser/frame_host/navigation_handle_impl.h |
@@ -17,6 +17,7 @@ |
#include "content/browser/frame_host/frame_tree_node.h" |
#include "content/browser/frame_host/render_frame_host_impl.h" |
#include "content/common/content_export.h" |
+#include "content/public/browser/global_request_id.h" |
#include "content/public/browser/navigation_data.h" |
#include "content/public/browser/navigation_throttle.h" |
#include "content/public/browser/ssl_status.h" |
@@ -31,6 +32,7 @@ class NavigatorDelegate; |
class ResourceRequestBodyImpl; |
class ServiceWorkerContextWrapper; |
class ServiceWorkerNavigationHandle; |
+class SiteInstance; |
// This class keeps track of a single navigation. It is created upon receipt of |
// a DidStartProvisionalLoad IPC in a RenderFrameHost. The RenderFrameHost owns |
@@ -220,11 +222,18 @@ class CONTENT_EXPORT NavigationHandleImpl : public NavigationHandle { |
// NavigationHandle will not call |callback| with a result of DEFER. |
// If the result is PROCEED, then 'ReadyToCommitNavigation' will be called |
// with |render_frame_host| and |response_headers| just before calling |
- // |callback|. |
+ // |callback|. Should a transfer navigation happen, |transfer_callback| will |
+ // be run on the IO thread. |
+ // PlzNavigate: transfer navigations are not possible. |
void WillProcessResponse( |
RenderFrameHostImpl* render_frame_host, |
scoped_refptr<net::HttpResponseHeaders> response_headers, |
const SSLStatus& ssl_status, |
+ const GlobalRequestID& request_id, |
+ bool should_replace_current_entry, |
+ bool is_download, |
+ bool is_stream, |
+ const base::Closure& transfer_callback, |
const ThrottleChecksFinishedCallback& callback); |
// Returns the FrameTreeNode this navigation is happening in. |
@@ -251,6 +260,18 @@ class CONTENT_EXPORT NavigationHandleImpl : public NavigationHandle { |
SSLStatus ssl_status() { return ssl_status_; } |
+ // This is valid after the network response has started. |
+ // TODO(clamy): See if this can be initialized earlier if needed by |
+ // non-transfer code. There may be some issues in PlzNavigate, where |
+ // WillStartRequest will be called before starting a request on the IO thread. |
+ const GlobalRequestID& request_id() const { |
+ DCHECK_GE(state_, WILL_PROCESS_RESPONSE); |
+ return request_id_; |
+ } |
+ |
+ // Called when the navigation is transferred to a different renderer. |
+ void Transfer(); |
+ |
private: |
friend class NavigationHandleImplTest; |
@@ -281,6 +302,19 @@ class CONTENT_EXPORT NavigationHandleImpl : public NavigationHandle { |
NavigationThrottle::ThrottleCheckResult CheckWillRedirectRequest(); |
NavigationThrottle::ThrottleCheckResult CheckWillProcessResponse(); |
+ // Called when WillProcessResponse checks are done, to find the final |
+ // RenderFrameHost for the navigation. Checks whether the navigation should be |
+ // transferred. Returns false if the transfer attempt results in the |
+ // destruction of this NavigationHandle and the navigation should no longer |
+ // proceed. This can happen when the RenderFrameHostManager determines a |
+ // transfer is needed, but WebContentsDelegate::ShouldTransferNavigation |
+ // returns false. |
+ bool MaybeTransferAndProceed(); |
+ |
+ // Helper method for MaybeTransferAndProceed. Returns false if the transfer |
+ // attempt results in the destruction of this NavigationHandle. |
+ bool MaybeTransferAndProceedInternal(); |
+ |
// Helper function to run and reset the |complete_callback_|. This marks the |
// end of a round of NavigationThrottleChecks. |
void RunCompleteCallback(NavigationThrottle::ThrottleCheckResult result); |
@@ -306,6 +340,10 @@ class CONTENT_EXPORT NavigationHandleImpl : public NavigationHandle { |
bool was_redirected_; |
scoped_refptr<net::HttpResponseHeaders> response_headers_; |
+ // The original url of the navigation. This may differ from |url_| if the |
+ // navigation encounters redirects. |
+ const GURL original_url_; |
+ |
// The HTTP method used for the navigation. |
std::string method_; |
@@ -352,6 +390,24 @@ class CONTENT_EXPORT NavigationHandleImpl : public NavigationHandle { |
SSLStatus ssl_status_; |
+ // The id of the URLRequest tied to this navigation. |
+ GlobalRequestID request_id_; |
+ |
+ // Whether the current NavigationEntry should be replaced upon commit. |
+ bool should_replace_current_entry_; |
+ |
+ // The chain of redirects. |
+ std::vector<GURL> redirect_chain_; |
+ |
+ // A callback to run on the IO thread if the navigation transfers. |
+ base::Closure transfer_callback_; |
+ |
+ // Whether the navigation ended up being a download or a stream. |
+ bool is_download_; |
+ bool is_stream_; |
+ |
+ base::WeakPtrFactory<NavigationHandleImpl> weak_factory_; |
+ |
DISALLOW_COPY_AND_ASSIGN(NavigationHandleImpl); |
}; |