Index: content/renderer/render_frame_impl.cc |
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc |
index 3cf9e9b856fb9c83a4485e4129e9acf60d8d37c9..5d630bd73c4d758fbe92c4aa20c37ecd627dc3fd 100644 |
--- a/content/renderer/render_frame_impl.cc |
+++ b/content/renderer/render_frame_impl.cc |
@@ -1128,6 +1128,10 @@ void RenderFrameImpl::OnNavigate( |
} else if (is_history_navigation) { |
// We must know the page ID of the page we are navigating back to. |
DCHECK_NE(request_params.page_id, -1); |
+ // We must know the nav entry ID of the page we are navigating back to, |
+ // which should be the case because history navigations are routed via the |
+ // browser. |
+ DCHECK_NE(0, request_params.nav_entry_id); |
scoped_ptr<HistoryEntry> entry = |
PageStateToHistoryEntry(request_params.page_state); |
if (entry) { |
@@ -1175,6 +1179,10 @@ void RenderFrameImpl::OnNavigate( |
// A session history navigation should have been accompanied by state. |
CHECK_EQ(request_params.page_id, -1); |
+ // FYIREMOVEME(avi): Page id being -1 will happen with browser-initiated new |
+ // (non-history) navigations, and that's the test here. Nav entry unique |
+ // ids, however, are always provided with browser-initiated navigations, |
+ // history or new, so this test isn't valid for nav entry unique ids. |
// Record this before starting the load, we need a lower bound of this time |
// to sanitize the navigationStart override set below. |
@@ -2592,6 +2600,10 @@ void RenderFrameImpl::didFailProvisionalLoad( |
const WebURLRequest& failed_request = ds->request(); |
+ DocumentState* document_state = DocumentState::FromDataSource(ds); |
+ NavigationStateImpl* navigation_state = |
+ static_cast<NavigationStateImpl*>(document_state->navigation_state()); |
+ |
// Notify the browser that we failed a provisional load with an error. |
// |
// Note: It is important this notification occur before DidStopLoading so the |
@@ -2603,7 +2615,8 @@ void RenderFrameImpl::didFailProvisionalLoad( |
FOR_EACH_OBSERVER(RenderFrameObserver, observers_, |
DidFailProvisionalLoad(error)); |
- SendFailedProvisionalLoad(failed_request, error, frame); |
+ SendFailedProvisionalLoad( |
+ failed_request, error, navigation_state->request_params(), frame); |
if (!ShouldDisplayErrorPageForFailedLoad(error.reason, error.unreachableURL)) |
return; |
@@ -2611,10 +2624,6 @@ void RenderFrameImpl::didFailProvisionalLoad( |
// Make sure we never show errors in view source mode. |
frame->enableViewSourceMode(false); |
- DocumentState* document_state = DocumentState::FromDataSource(ds); |
- NavigationStateImpl* navigation_state = |
- static_cast<NavigationStateImpl*>(document_state->navigation_state()); |
- |
// If this is a failed back/forward/reload navigation, then we need to do a |
// 'replace' load. This is necessary to avoid messing up session history. |
// Otherwise, we do a normal load, which simulates a 'go' navigation as far |
@@ -2701,18 +2710,11 @@ void RenderFrameImpl::didCommitProvisionalLoad( |
render_view_->history_list_offset_ + 1; |
} |
} else { |
- // Inspect the navigation_state on this frame to see if the navigation |
- // corresponds to a session history navigation... Note: |frame| may or |
- // may not be the toplevel frame, but for the case of capturing session |
- // history, the first committed frame suffices. We keep track of whether |
- // we've seen this commit before so that only capture session history once |
- // per navigation. |
- // |
- // Note that we need to check if the page ID changed. In the case of a |
- // reload, the page ID doesn't change, and UpdateSessionHistory gets the |
- // previous URL and the current page ID, which would be wrong. |
- if (navigation_state->request_params().page_id != -1 && |
- navigation_state->request_params().page_id != render_view_->page_id_) { |
+ // FYIREMOVEME(avi): This used to check if the page id matched because |
+ // UpdateSessionHistory was called here, and we didn't want to call it twice |
+ // on the same load. After r271220, when it was moved elsewhere, we don't |
+ // have that worry. |
+ if (navigation_state->request_params().page_id != -1) { |
// This is a successful session history navigation! |
render_view_->page_id_ = navigation_state->request_params().page_id; |
@@ -3870,8 +3872,10 @@ void RenderFrameImpl::SendDidCommitProvisionalLoad( |
params.http_status_code = response.httpStatusCode(); |
params.url_is_unreachable = ds->hasUnreachableURL(); |
params.is_post = false; |
+ params.did_create_new_entry = commit_type == blink::WebStandardCommit; |
params.post_id = -1; |
params.page_id = render_view_->page_id_; |
+ params.nav_entry_id = navigation_state->request_params().nav_entry_id; |
// We need to track the RenderViewHost routing_id because of downstream |
// dependencies (crbug.com/392171 DownloadRequestHandle, SaveFileManager, |
// ResourceDispatcherHostImpl, MediaStreamUIProxy, |
@@ -4163,7 +4167,7 @@ void RenderFrameImpl::OnFailedNavigation( |
WebURLRequest failed_request = CreateURLRequestForNavigation( |
common_params, scoped_ptr<StreamOverrideParameters>(), |
frame_->isViewSourceModeEnabled()); |
- SendFailedProvisionalLoad(failed_request, error, frame_); |
+ SendFailedProvisionalLoad(failed_request, error, request_params, frame_); |
if (!ShouldDisplayErrorPageForFailedLoad(error_code, common_params.url)) { |
Send(new FrameHostMsg_DidDropNavigation(routing_id_)); |
@@ -4683,12 +4687,14 @@ void RenderFrameImpl::LoadDataURL(const CommonNavigationParams& params, |
void RenderFrameImpl::SendFailedProvisionalLoad( |
const blink::WebURLRequest& request, |
const blink::WebURLError& error, |
+ const RequestNavigationParams& request_params, |
Charlie Reis
2015/04/22 05:27:25
Any reason we need to pass in the whole request_pa
Avi (use Gerrit)
2015/04/22 18:31:51
Done.
|
blink::WebLocalFrame* frame) { |
bool show_repost_interstitial = (error.reason == net::ERR_CACHE_MISS && |
EqualsASCII(request.httpMethod(), "POST")); |
FrameHostMsg_DidFailProvisionalLoadWithError_Params params; |
params.error_code = error.reason; |
+ params.nav_entry_id = request_params.nav_entry_id; |
GetContentClient()->renderer()->GetNavigationErrorStrings( |
render_view_.get(), frame, request, error, NULL, |
¶ms.error_description); |