| Index: content/renderer/render_frame_impl.cc
|
| diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
|
| index 933dd38915709fc28af4fe4007645f6302830594..4a0113e4f72a809eb8fab8f14a57b32097caa117 100644
|
| --- a/content/renderer/render_frame_impl.cc
|
| +++ b/content/renderer/render_frame_impl.cc
|
| @@ -1132,6 +1132,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) {
|
| @@ -2607,6 +2611,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
|
| @@ -2618,7 +2626,10 @@ void RenderFrameImpl::didFailProvisionalLoad(
|
| FOR_EACH_OBSERVER(RenderFrameObserver, observers_,
|
| DidFailProvisionalLoad(error));
|
|
|
| - SendFailedProvisionalLoad(failed_request, error, frame);
|
| + SendFailedProvisionalLoad(failed_request,
|
| + error,
|
| + navigation_state->request_params().nav_entry_id,
|
| + frame);
|
|
|
| if (!ShouldDisplayErrorPageForFailedLoad(error.reason, error.unreachableURL))
|
| return;
|
| @@ -2626,10 +2637,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
|
| @@ -2716,18 +2723,7 @@ 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_) {
|
| + 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;
|
|
|
| @@ -3884,8 +3880,12 @@ void RenderFrameImpl::SendDidCommitProvisionalLoad(
|
| params.http_status_code = response.httpStatusCode();
|
| params.url_is_unreachable = ds->hasUnreachableURL();
|
| params.is_post = false;
|
| + params.intended_as_new_entry =
|
| + navigation_state->request_params().intended_as_new_entry;
|
| + 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,
|
| @@ -4177,7 +4177,8 @@ 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.nav_entry_id, frame_);
|
|
|
| if (!ShouldDisplayErrorPageForFailedLoad(error_code, common_params.url)) {
|
| Send(new FrameHostMsg_DidDropNavigation(routing_id_));
|
| @@ -4697,12 +4698,14 @@ void RenderFrameImpl::LoadDataURL(const CommonNavigationParams& params,
|
| void RenderFrameImpl::SendFailedProvisionalLoad(
|
| const blink::WebURLRequest& request,
|
| const blink::WebURLError& error,
|
| + int nav_entry_id,
|
| 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 = nav_entry_id;
|
| GetContentClient()->renderer()->GetNavigationErrorStrings(
|
| render_view_.get(), frame, request, error, NULL,
|
| ¶ms.error_description);
|
|
|