OLD | NEW |
---|---|
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/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 833 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
844 void RenderFrameImpl::didReceiveServerRedirectForProvisionalLoad( | 844 void RenderFrameImpl::didReceiveServerRedirectForProvisionalLoad( |
845 blink::WebFrame* frame) { | 845 blink::WebFrame* frame) { |
846 // TODO(nasko): Move implementation here. Needed state: | 846 // TODO(nasko): Move implementation here. Needed state: |
847 // * page_id_ | 847 // * page_id_ |
848 render_view_->didReceiveServerRedirectForProvisionalLoad(frame); | 848 render_view_->didReceiveServerRedirectForProvisionalLoad(frame); |
849 } | 849 } |
850 | 850 |
851 void RenderFrameImpl::didFailProvisionalLoad( | 851 void RenderFrameImpl::didFailProvisionalLoad( |
852 blink::WebFrame* frame, | 852 blink::WebFrame* frame, |
853 const blink::WebURLError& error) { | 853 const blink::WebURLError& error) { |
854 // TODO(nasko): Move implementation here. Needed state: | 854 WebDataSource* ds = frame->provisionalDataSource(); |
855 // * page_id_ | 855 DCHECK(ds); |
856 // * pending_navigation_params_ | 856 |
857 // Needed methods | 857 const WebURLRequest& failed_request = ds->request(); |
858 // * MaybeLoadAlternateErrorPage | 858 |
859 // * LoadNavigationErrorPage | 859 // Call out to RenderViewImpl, so observers are notified. |
860 render_view_->didFailProvisionalLoad(frame, error); | 860 render_view_->didFailProvisionalLoad(frame, error); |
861 | |
862 bool show_repost_interstitial = | |
863 (error.reason == net::ERR_CACHE_MISS && | |
864 EqualsASCII(failed_request.httpMethod(), "POST")); | |
865 | |
866 FrameHostMsg_DidFailProvisionalLoadWithError_Params params; | |
867 params.frame_id = frame->identifier(); | |
868 params.frame_unique_name = frame->uniqueName(); | |
869 params.is_main_frame = !frame->parent(); | |
870 params.error_code = error.reason; | |
871 GetContentClient()->renderer()->GetNavigationErrorStrings( | |
872 frame, | |
873 failed_request, | |
874 error, | |
875 render_view_->renderer_preferences_.accept_languages, | |
Charlie Reis
2014/01/06 18:13:35
We're relying a lot on being friends with RenderVi
nasko
2014/01/06 18:47:03
I don't have a very concrete long term plan yet, j
Charlie Reis
2014/01/06 19:07:17
Ok. We can try to nail down these plans in the ne
| |
876 NULL, | |
877 ¶ms.error_description); | |
878 params.url = error.unreachableURL; | |
879 params.showing_repost_interstitial = show_repost_interstitial; | |
880 Send(new FrameHostMsg_DidFailProvisionalLoadWithError( | |
881 routing_id_, params)); | |
882 | |
883 // Don't display an error page if this is simply a cancelled load. Aside | |
884 // from being dumb, WebCore doesn't expect it and it will cause a crash. | |
885 if (error.reason == net::ERR_ABORTED) | |
886 return; | |
887 | |
888 // Don't display "client blocked" error page if browser has asked us not to. | |
889 if (error.reason == net::ERR_BLOCKED_BY_CLIENT && | |
890 render_view_->renderer_preferences_.disable_client_blocked_error_page) { | |
891 return; | |
892 } | |
893 | |
894 // Allow the embedder to suppress an error page. | |
895 if (GetContentClient()->renderer()->ShouldSuppressErrorPage( | |
896 error.unreachableURL)) { | |
897 return; | |
898 } | |
899 | |
900 if (RenderThreadImpl::current() && | |
901 RenderThreadImpl::current()->layout_test_mode()) { | |
902 return; | |
903 } | |
904 | |
905 // Make sure we never show errors in view source mode. | |
906 frame->enableViewSourceMode(false); | |
907 | |
908 DocumentState* document_state = DocumentState::FromDataSource(ds); | |
909 NavigationState* navigation_state = document_state->navigation_state(); | |
910 | |
911 // If this is a failed back/forward/reload navigation, then we need to do a | |
912 // 'replace' load. This is necessary to avoid messing up session history. | |
913 // Otherwise, we do a normal load, which simulates a 'go' navigation as far | |
914 // as session history is concerned. | |
915 // | |
916 // AUTO_SUBFRAME loads should always be treated as loads that do not advance | |
917 // the page id. | |
918 // | |
919 // TODO(davidben): This should also take the failed navigation's replacement | |
920 // state into account, if a location.replace() failed. | |
921 bool replace = | |
922 navigation_state->pending_page_id() != -1 || | |
923 PageTransitionCoreTypeIs(navigation_state->transition_type(), | |
924 PAGE_TRANSITION_AUTO_SUBFRAME); | |
925 | |
926 // If we failed on a browser initiated request, then make sure that our error | |
927 // page load is regarded as the same browser initiated request. | |
928 if (!navigation_state->is_content_initiated()) { | |
929 render_view_->pending_navigation_params_.reset(new ViewMsg_Navigate_Params); | |
930 render_view_->pending_navigation_params_->page_id = | |
931 navigation_state->pending_page_id(); | |
932 render_view_->pending_navigation_params_->pending_history_list_offset = | |
933 navigation_state->pending_history_list_offset(); | |
934 render_view_->pending_navigation_params_->should_clear_history_list = | |
935 navigation_state->history_list_was_cleared(); | |
936 render_view_->pending_navigation_params_->transition = | |
937 navigation_state->transition_type(); | |
938 render_view_->pending_navigation_params_->request_time = | |
939 document_state->request_time(); | |
940 render_view_->pending_navigation_params_->should_replace_current_entry = | |
941 replace; | |
942 } | |
943 | |
944 // Provide the user with a more helpful error page? | |
945 if (render_view_->MaybeLoadAlternateErrorPage(frame, error, replace)) | |
946 return; | |
947 | |
948 // Fallback to a local error page. | |
949 render_view_->LoadNavigationErrorPage( | |
950 frame, failed_request, error, std::string(), replace); | |
861 } | 951 } |
862 | 952 |
863 void RenderFrameImpl::didCommitProvisionalLoad(blink::WebFrame* frame, | 953 void RenderFrameImpl::didCommitProvisionalLoad(blink::WebFrame* frame, |
864 bool is_new_navigation) { | 954 bool is_new_navigation) { |
865 // TODO(nasko): Move implementation here. Needed state: | 955 // TODO(nasko): Move implementation here. Needed state: |
866 // * page_id_ | 956 // * page_id_ |
867 // * next_page_id_ | 957 // * next_page_id_ |
868 // * history_list_offset_ | 958 // * history_list_offset_ |
869 // * history_list_length_ | 959 // * history_list_length_ |
870 // * history_page_ids_ | 960 // * history_page_ids_ |
(...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1367 void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) { | 1457 void RenderFrameImpl::AddObserver(RenderFrameObserver* observer) { |
1368 observers_.AddObserver(observer); | 1458 observers_.AddObserver(observer); |
1369 } | 1459 } |
1370 | 1460 |
1371 void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) { | 1461 void RenderFrameImpl::RemoveObserver(RenderFrameObserver* observer) { |
1372 observer->RenderFrameGone(); | 1462 observer->RenderFrameGone(); |
1373 observers_.RemoveObserver(observer); | 1463 observers_.RemoveObserver(observer); |
1374 } | 1464 } |
1375 | 1465 |
1376 } // namespace content | 1466 } // namespace content |
OLD | NEW |