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

Side by Side Diff: content/renderer/render_frame_impl.cc

Issue 958083002: PlzNavigate: Show error pages when the navigation failed before commit (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@support-data-urls
Patch Set: Added a browsertest Created 5 years, 8 months 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/render_frame_impl.h" 5 #include "content/renderer/render_frame_impl.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 9
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
(...skipping 1037 matching lines...) Expand 10 before | Expand all | Expand 10 after
1048 IPC_MESSAGE_HANDLER(FrameMsg_AddStyleSheetByURL, 1048 IPC_MESSAGE_HANDLER(FrameMsg_AddStyleSheetByURL,
1049 OnAddStyleSheetByURL) 1049 OnAddStyleSheetByURL)
1050 IPC_MESSAGE_HANDLER(FrameMsg_SetAccessibilityMode, 1050 IPC_MESSAGE_HANDLER(FrameMsg_SetAccessibilityMode,
1051 OnSetAccessibilityMode) 1051 OnSetAccessibilityMode)
1052 IPC_MESSAGE_HANDLER(FrameMsg_DisownOpener, OnDisownOpener) 1052 IPC_MESSAGE_HANDLER(FrameMsg_DisownOpener, OnDisownOpener)
1053 IPC_MESSAGE_HANDLER(FrameMsg_CommitNavigation, OnCommitNavigation) 1053 IPC_MESSAGE_HANDLER(FrameMsg_CommitNavigation, OnCommitNavigation)
1054 IPC_MESSAGE_HANDLER(FrameMsg_DidUpdateSandboxFlags, OnDidUpdateSandboxFlags) 1054 IPC_MESSAGE_HANDLER(FrameMsg_DidUpdateSandboxFlags, OnDidUpdateSandboxFlags)
1055 IPC_MESSAGE_HANDLER(FrameMsg_SetTextTrackSettings, 1055 IPC_MESSAGE_HANDLER(FrameMsg_SetTextTrackSettings,
1056 OnTextTrackSettingsChanged) 1056 OnTextTrackSettingsChanged)
1057 IPC_MESSAGE_HANDLER(FrameMsg_PostMessageEvent, OnPostMessageEvent) 1057 IPC_MESSAGE_HANDLER(FrameMsg_PostMessageEvent, OnPostMessageEvent)
1058 IPC_MESSAGE_HANDLER(FrameMsg_FailedNavigation, OnFailedNavigation)
1058 #if defined(OS_ANDROID) 1059 #if defined(OS_ANDROID)
1059 IPC_MESSAGE_HANDLER(FrameMsg_SelectPopupMenuItems, OnSelectPopupMenuItems) 1060 IPC_MESSAGE_HANDLER(FrameMsg_SelectPopupMenuItems, OnSelectPopupMenuItems)
1060 #elif defined(OS_MACOSX) 1061 #elif defined(OS_MACOSX)
1061 IPC_MESSAGE_HANDLER(FrameMsg_SelectPopupMenuItem, OnSelectPopupMenuItem) 1062 IPC_MESSAGE_HANDLER(FrameMsg_SelectPopupMenuItem, OnSelectPopupMenuItem)
1062 IPC_MESSAGE_HANDLER(InputMsg_CopyToFindPboard, OnCopyToFindPboard) 1063 IPC_MESSAGE_HANDLER(InputMsg_CopyToFindPboard, OnCopyToFindPboard)
1063 #endif 1064 #endif
1064 IPC_END_MESSAGE_MAP() 1065 IPC_END_MESSAGE_MAP()
1065 1066
1066 return handled; 1067 return handled;
1067 } 1068 }
(...skipping 1518 matching lines...) Expand 10 before | Expand all | Expand 10 after
2586 // 2587 //
2587 // Note: It is important this notification occur before DidStopLoading so the 2588 // Note: It is important this notification occur before DidStopLoading so the
2588 // SSL manager can react to the provisional load failure before being 2589 // SSL manager can react to the provisional load failure before being
2589 // notified the load stopped. 2590 // notified the load stopped.
2590 // 2591 //
2591 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), 2592 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(),
2592 DidFailProvisionalLoad(frame, error)); 2593 DidFailProvisionalLoad(frame, error));
2593 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, 2594 FOR_EACH_OBSERVER(RenderFrameObserver, observers_,
2594 DidFailProvisionalLoad(error)); 2595 DidFailProvisionalLoad(error));
2595 2596
2596 bool show_repost_interstitial = 2597 SendFailedProvisionalLoad(failed_request, error, frame);
2597 (error.reason == net::ERR_CACHE_MISS &&
2598 EqualsASCII(failed_request.httpMethod(), "POST"));
2599 2598
2600 FrameHostMsg_DidFailProvisionalLoadWithError_Params params; 2599 if (!ShouldDisplayErrorPageForFailedLoad(error.reason, error.unreachableURL))
2601 params.error_code = error.reason;
2602 GetContentClient()->renderer()->GetNavigationErrorStrings(
2603 render_view_.get(),
2604 frame,
2605 failed_request,
2606 error,
2607 NULL,
2608 &params.error_description);
2609 params.url = error.unreachableURL;
2610 params.showing_repost_interstitial = show_repost_interstitial;
2611 Send(new FrameHostMsg_DidFailProvisionalLoadWithError(
2612 routing_id_, params));
2613
2614 // Don't display an error page if this is simply a cancelled load. Aside
2615 // from being dumb, Blink doesn't expect it and it will cause a crash.
2616 if (error.reason == net::ERR_ABORTED)
2617 return; 2600 return;
2618 2601
2619 // Don't display "client blocked" error page if browser has asked us not to.
2620 if (error.reason == net::ERR_BLOCKED_BY_CLIENT &&
2621 render_view_->renderer_preferences_.disable_client_blocked_error_page) {
2622 return;
2623 }
2624
2625 // Allow the embedder to suppress an error page.
2626 if (GetContentClient()->renderer()->ShouldSuppressErrorPage(this,
2627 error.unreachableURL)) {
2628 return;
2629 }
2630
2631 if (RenderThreadImpl::current() &&
2632 RenderThreadImpl::current()->layout_test_mode()) {
2633 return;
2634 }
2635
2636 // Make sure we never show errors in view source mode. 2602 // Make sure we never show errors in view source mode.
2637 frame->enableViewSourceMode(false); 2603 frame->enableViewSourceMode(false);
2638 2604
2639 DocumentState* document_state = DocumentState::FromDataSource(ds); 2605 DocumentState* document_state = DocumentState::FromDataSource(ds);
2640 NavigationStateImpl* navigation_state = 2606 NavigationStateImpl* navigation_state =
2641 static_cast<NavigationStateImpl*>(document_state->navigation_state()); 2607 static_cast<NavigationStateImpl*>(document_state->navigation_state());
2642 2608
2643 // If this is a failed back/forward/reload navigation, then we need to do a 2609 // If this is a failed back/forward/reload navigation, then we need to do a
2644 // 'replace' load. This is necessary to avoid messing up session history. 2610 // 'replace' load. This is necessary to avoid messing up session history.
2645 // Otherwise, we do a normal load, which simulates a 'go' navigation as far 2611 // Otherwise, we do a normal load, which simulates a 'go' navigation as far
(...skipping 1501 matching lines...) Expand 10 before | Expand all | Expand 10 after
4147 request.setCheckForBrowserSideNavigation(false); 4113 request.setCheckForBrowserSideNavigation(false);
4148 4114
4149 // Record this before starting the load. A lower bound of this time is needed 4115 // Record this before starting the load. A lower bound of this time is needed
4150 // to sanitize the navigationStart override set below. 4116 // to sanitize the navigationStart override set below.
4151 base::TimeTicks renderer_navigation_start = base::TimeTicks::Now(); 4117 base::TimeTicks renderer_navigation_start = base::TimeTicks::Now();
4152 frame_->loadRequest(request); 4118 frame_->loadRequest(request);
4153 UpdateFrameNavigationTiming(frame_, request_params.browser_navigation_start, 4119 UpdateFrameNavigationTiming(frame_, request_params.browser_navigation_start,
4154 renderer_navigation_start); 4120 renderer_navigation_start);
4155 } 4121 }
4156 4122
4123 void RenderFrameImpl::OnFailedNavigation(
4124 const CommonNavigationParams& common_params,
4125 const RequestNavigationParams& request_params,
4126 bool has_stale_copy_in_cache,
4127 int error_code) {
4128 bool is_reload = IsReload(common_params.navigation_type);
4129 bool is_history_navigation = request_params.page_state.IsValid();
4130 WebURLRequest::CachePolicy cache_policy =
4131 WebURLRequest::UseProtocolCachePolicy;
4132 if (!RenderFrameImpl::PrepareRenderViewForNavigation(
4133 common_params.url, is_history_navigation, request_params, &is_reload,
4134 &cache_policy)) {
4135 return;
4136 }
4137
4138 GetContentClient()->SetActiveURL(common_params.url);
4139
4140 pending_navigation_params_.reset(new NavigationParams(
4141 common_params, StartNavigationParams(), request_params));
4142
4143 // Inform the browser of the start of the provisional load. This is needed so
4144 // that the load is properly tracked by the WebNavigation API.
4145 // TODO(clamy): Properly set is_transition_navigation.
4146 Send(new FrameHostMsg_DidStartProvisionalLoadForFrame(
4147 routing_id_, common_params.url, false));
4148
4149 // Send the provisional load failure.
4150 blink::WebURLError error =
4151 CreateWebURLError(common_params.url, has_stale_copy_in_cache, error_code);
4152 WebURLRequest failed_request = CreateURLRequestForNavigation(
4153 common_params, scoped_ptr<StreamOverrideParameters>(),
4154 frame_->isViewSourceModeEnabled());
4155 SendFailedProvisionalLoad(failed_request, error, frame_);
4156
4157 if (!ShouldDisplayErrorPageForFailedLoad(error_code, common_params.url))
4158 return;
4159
4160 // Make sure errors are not shown in view source mode.
4161 frame_->enableViewSourceMode(false);
4162
4163 // Replace the current history entry in reloads, history navigations and loads
4164 // of the same url. This corresponds to Blink's notion of a standard
4165 // commit.
4166 // TODO(clamy): see if initial commits in subframes should be handled
4167 // separately.
4168 bool replace = is_reload || is_history_navigation ||
4169 common_params.url == GetLoadingUrl();
4170 LoadNavigationErrorPage(failed_request, error, replace);
4171 }
4172
4157 WebNavigationPolicy RenderFrameImpl::DecidePolicyForNavigation( 4173 WebNavigationPolicy RenderFrameImpl::DecidePolicyForNavigation(
4158 RenderFrame* render_frame, 4174 RenderFrame* render_frame,
4159 const NavigationPolicyInfo& info) { 4175 const NavigationPolicyInfo& info) {
4160 #ifdef OS_ANDROID 4176 #ifdef OS_ANDROID
4161 // The handlenavigation API is deprecated and will be removed once 4177 // The handlenavigation API is deprecated and will be removed once
4162 // crbug.com/325351 is resolved. 4178 // crbug.com/325351 is resolved.
4163 if (info.urlRequest.url() != GURL(kSwappedOutURL) && 4179 if (info.urlRequest.url() != GURL(kSwappedOutURL) &&
4164 GetContentClient()->renderer()->HandleNavigation( 4180 GetContentClient()->renderer()->HandleNavigation(
4165 render_frame, 4181 render_frame,
4166 static_cast<DocumentState*>(info.extraData), 4182 static_cast<DocumentState*>(info.extraData),
(...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after
4644 WebString::fromUTF8(charset), 4660 WebString::fromUTF8(charset),
4645 base_url, 4661 base_url,
4646 params.history_url_for_data_url, 4662 params.history_url_for_data_url,
4647 false); 4663 false);
4648 } else { 4664 } else {
4649 CHECK(false) << "Invalid URL passed: " 4665 CHECK(false) << "Invalid URL passed: "
4650 << params.url.possibly_invalid_spec(); 4666 << params.url.possibly_invalid_spec();
4651 } 4667 }
4652 } 4668 }
4653 4669
4670 void RenderFrameImpl::SendFailedProvisionalLoad(
4671 const blink::WebURLRequest& request,
4672 const blink::WebURLError& error,
4673 blink::WebLocalFrame* frame) {
4674 bool show_repost_interstitial = (error.reason == net::ERR_CACHE_MISS &&
4675 EqualsASCII(request.httpMethod(), "POST"));
4676
4677 FrameHostMsg_DidFailProvisionalLoadWithError_Params params;
4678 params.error_code = error.reason;
4679 GetContentClient()->renderer()->GetNavigationErrorStrings(
4680 render_view_.get(), frame, request, error, NULL,
4681 &params.error_description);
4682 params.url = error.unreachableURL;
4683 params.showing_repost_interstitial = show_repost_interstitial;
4684 Send(new FrameHostMsg_DidFailProvisionalLoadWithError(routing_id_, params));
4685 }
4686
4687 bool RenderFrameImpl::ShouldDisplayErrorPageForFailedLoad(
4688 int error_code,
4689 const GURL& unreachable_url) {
4690 // Don't display an error page if this is simply a cancelled load. Aside
4691 // from being dumb, Blink doesn't expect it and it will cause a crash.
4692 if (error_code == net::ERR_ABORTED)
4693 return false;
4694
4695 // Don't display "client blocked" error page if browser has asked us not to.
4696 if (error_code == net::ERR_BLOCKED_BY_CLIENT &&
4697 render_view_->renderer_preferences_.disable_client_blocked_error_page) {
4698 return false;
4699 }
4700
4701 // Allow the embedder to suppress an error page.
4702 if (GetContentClient()->renderer()->ShouldSuppressErrorPage(
4703 this, unreachable_url)) {
4704 return false;
4705 }
4706
4707 if (RenderThreadImpl::current() &&
4708 RenderThreadImpl::current()->layout_test_mode()) {
4709 return false;
4710 }
4711
4712 return true;
4713 }
4714
4654 GURL RenderFrameImpl::GetLoadingUrl() const { 4715 GURL RenderFrameImpl::GetLoadingUrl() const {
4655 WebDataSource* ds = frame_->dataSource(); 4716 WebDataSource* ds = frame_->dataSource();
4656 if (ds->hasUnreachableURL()) 4717 if (ds->hasUnreachableURL())
4657 return ds->unreachableURL(); 4718 return ds->unreachableURL();
4658 4719
4659 const WebURLRequest& request = ds->request(); 4720 const WebURLRequest& request = ds->request();
4660 return request.url(); 4721 return request.url();
4661 } 4722 }
4662 4723
4663 void RenderFrameImpl::PopulateDocumentStateFromPending( 4724 void RenderFrameImpl::PopulateDocumentStateFromPending(
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
4708 // initiated any load resulting from JS execution. 4769 // initiated any load resulting from JS execution.
4709 if (!pending_navigation_params_->common_params.url.SchemeIs( 4770 if (!pending_navigation_params_->common_params.url.SchemeIs(
4710 url::kJavaScriptScheme)) { 4771 url::kJavaScriptScheme)) {
4711 return NavigationStateImpl::CreateBrowserInitiated( 4772 return NavigationStateImpl::CreateBrowserInitiated(
4712 pending_navigation_params_->common_params, 4773 pending_navigation_params_->common_params,
4713 pending_navigation_params_->start_params, 4774 pending_navigation_params_->start_params,
4714 pending_navigation_params_->request_params); 4775 pending_navigation_params_->request_params);
4715 } 4776 }
4716 return NavigationStateImpl::CreateContentInitiated(); 4777 return NavigationStateImpl::CreateContentInitiated();
4717 } 4778 }
4779
4718 #if defined(OS_ANDROID) 4780 #if defined(OS_ANDROID)
4719 4781
4720 WebMediaPlayer* RenderFrameImpl::CreateAndroidWebMediaPlayer( 4782 WebMediaPlayer* RenderFrameImpl::CreateAndroidWebMediaPlayer(
4721 const blink::WebURL& url, 4783 const blink::WebURL& url,
4722 WebMediaPlayerClient* client, 4784 WebMediaPlayerClient* client,
4723 media::MediaPermission* media_permission, 4785 media::MediaPermission* media_permission,
4724 blink::WebContentDecryptionModule* initial_cdm) { 4786 blink::WebContentDecryptionModule* initial_cdm) {
4725 GpuChannelHost* gpu_channel_host = 4787 GpuChannelHost* gpu_channel_host =
4726 RenderThreadImpl::current()->EstablishGpuChannelSync( 4788 RenderThreadImpl::current()->EstablishGpuChannelSync(
4727 CAUSE_FOR_GPU_LAUNCH_VIDEODECODEACCELERATOR_INITIALIZE); 4789 CAUSE_FOR_GPU_LAUNCH_VIDEODECODEACCELERATOR_INITIALIZE);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
4782 #elif defined(ENABLE_BROWSER_CDMS) 4844 #elif defined(ENABLE_BROWSER_CDMS)
4783 cdm_manager_, 4845 cdm_manager_,
4784 #endif 4846 #endif
4785 this); 4847 this);
4786 } 4848 }
4787 4849
4788 return cdm_factory_; 4850 return cdm_factory_;
4789 } 4851 }
4790 4852
4791 } // namespace content 4853 } // namespace content
OLDNEW
« content/public/test/test_navigation_observer.h ('K') | « content/renderer/render_frame_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698