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

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

Issue 1002803002: Classify navigations without page id in parallel to the existing classifier. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: intended 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 1124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1135 bool ignore_cache = (common_params.navigation_type == 1135 bool ignore_cache = (common_params.navigation_type ==
1136 FrameMsg_Navigate_Type::RELOAD_IGNORING_CACHE); 1136 FrameMsg_Navigate_Type::RELOAD_IGNORING_CACHE);
1137 1137
1138 if (reload_original_url) 1138 if (reload_original_url)
1139 frame->reloadWithOverrideURL(common_params.url, true); 1139 frame->reloadWithOverrideURL(common_params.url, true);
1140 else 1140 else
1141 frame->reload(ignore_cache); 1141 frame->reload(ignore_cache);
1142 } else if (is_history_navigation) { 1142 } else if (is_history_navigation) {
1143 // We must know the page ID of the page we are navigating back to. 1143 // We must know the page ID of the page we are navigating back to.
1144 DCHECK_NE(request_params.page_id, -1); 1144 DCHECK_NE(request_params.page_id, -1);
1145 // We must know the nav entry ID of the page we are navigating back to,
1146 // which should be the case because history navigations are routed via the
1147 // browser.
1148 DCHECK_NE(0, request_params.nav_entry_id);
1145 scoped_ptr<HistoryEntry> entry = 1149 scoped_ptr<HistoryEntry> entry =
1146 PageStateToHistoryEntry(request_params.page_state); 1150 PageStateToHistoryEntry(request_params.page_state);
1147 if (entry) { 1151 if (entry) {
1148 // Ensure we didn't save the swapped out URL in UpdateState, since the 1152 // Ensure we didn't save the swapped out URL in UpdateState, since the
1149 // browser should never be telling us to navigate to swappedout://. 1153 // browser should never be telling us to navigate to swappedout://.
1150 CHECK(entry->root().urlString() != WebString::fromUTF8(kSwappedOutURL)); 1154 CHECK(entry->root().urlString() != WebString::fromUTF8(kSwappedOutURL));
1151 scoped_ptr<NavigationParams> navigation_params( 1155 scoped_ptr<NavigationParams> navigation_params(
1152 new NavigationParams(*pending_navigation_params_.get())); 1156 new NavigationParams(*pending_navigation_params_.get()));
1153 render_view_->history_controller()->GoToEntry( 1157 render_view_->history_controller()->GoToEntry(
1154 entry.Pass(), navigation_params.Pass(), cache_policy); 1158 entry.Pass(), navigation_params.Pass(), cache_policy);
(...skipping 1455 matching lines...) Expand 10 before | Expand all | Expand 10 after
2610 const blink::WebURLError& error, 2614 const blink::WebURLError& error,
2611 blink::WebHistoryCommitType commit_type) { 2615 blink::WebHistoryCommitType commit_type) {
2612 TRACE_EVENT1("navigation", "RenderFrameImpl::didFailProvisionalLoad", 2616 TRACE_EVENT1("navigation", "RenderFrameImpl::didFailProvisionalLoad",
2613 "id", routing_id_); 2617 "id", routing_id_);
2614 DCHECK(!frame_ || frame_ == frame); 2618 DCHECK(!frame_ || frame_ == frame);
2615 WebDataSource* ds = frame->provisionalDataSource(); 2619 WebDataSource* ds = frame->provisionalDataSource();
2616 DCHECK(ds); 2620 DCHECK(ds);
2617 2621
2618 const WebURLRequest& failed_request = ds->request(); 2622 const WebURLRequest& failed_request = ds->request();
2619 2623
2624 DocumentState* document_state = DocumentState::FromDataSource(ds);
2625 NavigationStateImpl* navigation_state =
2626 static_cast<NavigationStateImpl*>(document_state->navigation_state());
2627
2620 // Notify the browser that we failed a provisional load with an error. 2628 // Notify the browser that we failed a provisional load with an error.
2621 // 2629 //
2622 // Note: It is important this notification occur before DidStopLoading so the 2630 // Note: It is important this notification occur before DidStopLoading so the
2623 // SSL manager can react to the provisional load failure before being 2631 // SSL manager can react to the provisional load failure before being
2624 // notified the load stopped. 2632 // notified the load stopped.
2625 // 2633 //
2626 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), 2634 FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(),
2627 DidFailProvisionalLoad(frame, error)); 2635 DidFailProvisionalLoad(frame, error));
2628 FOR_EACH_OBSERVER(RenderFrameObserver, observers_, 2636 FOR_EACH_OBSERVER(RenderFrameObserver, observers_,
2629 DidFailProvisionalLoad(error)); 2637 DidFailProvisionalLoad(error));
2630 2638
2631 SendFailedProvisionalLoad(failed_request, error, frame); 2639 SendFailedProvisionalLoad(failed_request,
2640 error,
2641 navigation_state->request_params().nav_entry_id,
2642 frame);
2632 2643
2633 if (!ShouldDisplayErrorPageForFailedLoad(error.reason, error.unreachableURL)) 2644 if (!ShouldDisplayErrorPageForFailedLoad(error.reason, error.unreachableURL))
2634 return; 2645 return;
2635 2646
2636 // Make sure we never show errors in view source mode. 2647 // Make sure we never show errors in view source mode.
2637 frame->enableViewSourceMode(false); 2648 frame->enableViewSourceMode(false);
2638 2649
2639 DocumentState* document_state = DocumentState::FromDataSource(ds);
2640 NavigationStateImpl* navigation_state =
2641 static_cast<NavigationStateImpl*>(document_state->navigation_state());
2642
2643 // If this is a failed back/forward/reload navigation, then we need to do a 2650 // 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. 2651 // '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 2652 // Otherwise, we do a normal load, which simulates a 'go' navigation as far
2646 // as session history is concerned. 2653 // as session history is concerned.
2647 bool replace = commit_type != blink::WebStandardCommit; 2654 bool replace = commit_type != blink::WebStandardCommit;
2648 2655
2649 // If we failed on a browser initiated request, then make sure that our error 2656 // If we failed on a browser initiated request, then make sure that our error
2650 // page load is regarded as the same browser initiated request. 2657 // page load is regarded as the same browser initiated request.
2651 if (!navigation_state->IsContentInitiated()) { 2658 if (!navigation_state->IsContentInitiated()) {
2652 pending_navigation_params_.reset(new NavigationParams( 2659 pending_navigation_params_.reset(new NavigationParams(
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
2719 !navigation_state->start_params().should_replace_current_entry) { 2726 !navigation_state->start_params().should_replace_current_entry) {
2720 // Advance our offset in session history, applying the length limit. 2727 // Advance our offset in session history, applying the length limit.
2721 // There is now no forward history. 2728 // There is now no forward history.
2722 render_view_->history_list_offset_++; 2729 render_view_->history_list_offset_++;
2723 if (render_view_->history_list_offset_ >= kMaxSessionHistoryEntries) 2730 if (render_view_->history_list_offset_ >= kMaxSessionHistoryEntries)
2724 render_view_->history_list_offset_ = kMaxSessionHistoryEntries - 1; 2731 render_view_->history_list_offset_ = kMaxSessionHistoryEntries - 1;
2725 render_view_->history_list_length_ = 2732 render_view_->history_list_length_ =
2726 render_view_->history_list_offset_ + 1; 2733 render_view_->history_list_offset_ + 1;
2727 } 2734 }
2728 } else { 2735 } else {
2729 // Inspect the navigation_state on this frame to see if the navigation 2736 if (navigation_state->request_params().page_id != -1) {
2730 // corresponds to a session history navigation... Note: |frame| may or
2731 // may not be the toplevel frame, but for the case of capturing session
2732 // history, the first committed frame suffices. We keep track of whether
2733 // we've seen this commit before so that only capture session history once
2734 // per navigation.
2735 //
2736 // Note that we need to check if the page ID changed. In the case of a
2737 // reload, the page ID doesn't change, and UpdateSessionHistory gets the
2738 // previous URL and the current page ID, which would be wrong.
2739 if (navigation_state->request_params().page_id != -1 &&
2740 navigation_state->request_params().page_id != render_view_->page_id_) {
2741 // This is a successful session history navigation! 2737 // This is a successful session history navigation!
2742 render_view_->page_id_ = navigation_state->request_params().page_id; 2738 render_view_->page_id_ = navigation_state->request_params().page_id;
2743 2739
2744 render_view_->history_list_offset_ = 2740 render_view_->history_list_offset_ =
2745 navigation_state->request_params().pending_history_list_offset; 2741 navigation_state->request_params().pending_history_list_offset;
2746 } 2742 }
2747 } 2743 }
2748 2744
2749 bool sent = Send( 2745 bool sent = Send(
2750 new FrameHostMsg_DidAssignPageId(routing_id_, render_view_->page_id_)); 2746 new FrameHostMsg_DidAssignPageId(routing_id_, render_view_->page_id_));
(...skipping 1136 matching lines...) Expand 10 before | Expand all | Expand 10 after
3887 DocumentState* document_state = DocumentState::FromDataSource(ds); 3883 DocumentState* document_state = DocumentState::FromDataSource(ds);
3888 NavigationStateImpl* navigation_state = 3884 NavigationStateImpl* navigation_state =
3889 static_cast<NavigationStateImpl*>(document_state->navigation_state()); 3885 static_cast<NavigationStateImpl*>(document_state->navigation_state());
3890 InternalDocumentStateData* internal_data = 3886 InternalDocumentStateData* internal_data =
3891 InternalDocumentStateData::FromDocumentState(document_state); 3887 InternalDocumentStateData::FromDocumentState(document_state);
3892 3888
3893 FrameHostMsg_DidCommitProvisionalLoad_Params params; 3889 FrameHostMsg_DidCommitProvisionalLoad_Params params;
3894 params.http_status_code = response.httpStatusCode(); 3890 params.http_status_code = response.httpStatusCode();
3895 params.url_is_unreachable = ds->hasUnreachableURL(); 3891 params.url_is_unreachable = ds->hasUnreachableURL();
3896 params.is_post = false; 3892 params.is_post = false;
3893 params.did_create_new_entry = commit_type == blink::WebStandardCommit;
3894 params.intended_as_new_entry =
Charlie Reis 2015/04/24 22:02:02 nit: Move above did_create_new_entry if you do tha
Avi (use Gerrit) 2015/04/24 22:17:15 Done.
3895 navigation_state->request_params().intended_as_new_entry;
3897 params.post_id = -1; 3896 params.post_id = -1;
3898 params.page_id = render_view_->page_id_; 3897 params.page_id = render_view_->page_id_;
3898 params.nav_entry_id = navigation_state->request_params().nav_entry_id;
3899 // We need to track the RenderViewHost routing_id because of downstream 3899 // We need to track the RenderViewHost routing_id because of downstream
3900 // dependencies (crbug.com/392171 DownloadRequestHandle, SaveFileManager, 3900 // dependencies (crbug.com/392171 DownloadRequestHandle, SaveFileManager,
3901 // ResourceDispatcherHostImpl, MediaStreamUIProxy, 3901 // ResourceDispatcherHostImpl, MediaStreamUIProxy,
3902 // SpeechRecognitionDispatcherHost and possibly others). They look up the view 3902 // SpeechRecognitionDispatcherHost and possibly others). They look up the view
3903 // based on the ID stored in the resource requests. Once those dependencies 3903 // based on the ID stored in the resource requests. Once those dependencies
3904 // are unwound or moved to RenderFrameHost (crbug.com/304341) we can move the 3904 // are unwound or moved to RenderFrameHost (crbug.com/304341) we can move the
3905 // client to be based on the routing_id of the RenderFrameHost. 3905 // client to be based on the routing_id of the RenderFrameHost.
3906 params.render_view_routing_id = render_view_->routing_id(); 3906 params.render_view_routing_id = render_view_->routing_id();
3907 params.socket_address.set_host(response.remoteIPAddress().utf8()); 3907 params.socket_address.set_host(response.remoteIPAddress().utf8());
3908 params.socket_address.set_port(response.remotePort()); 3908 params.socket_address.set_port(response.remotePort());
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
4180 // TODO(clamy): Properly set is_transition_navigation. 4180 // TODO(clamy): Properly set is_transition_navigation.
4181 Send(new FrameHostMsg_DidStartProvisionalLoadForFrame( 4181 Send(new FrameHostMsg_DidStartProvisionalLoadForFrame(
4182 routing_id_, common_params.url, false)); 4182 routing_id_, common_params.url, false));
4183 4183
4184 // Send the provisional load failure. 4184 // Send the provisional load failure.
4185 blink::WebURLError error = 4185 blink::WebURLError error =
4186 CreateWebURLError(common_params.url, has_stale_copy_in_cache, error_code); 4186 CreateWebURLError(common_params.url, has_stale_copy_in_cache, error_code);
4187 WebURLRequest failed_request = CreateURLRequestForNavigation( 4187 WebURLRequest failed_request = CreateURLRequestForNavigation(
4188 common_params, scoped_ptr<StreamOverrideParameters>(), 4188 common_params, scoped_ptr<StreamOverrideParameters>(),
4189 frame_->isViewSourceModeEnabled()); 4189 frame_->isViewSourceModeEnabled());
4190 SendFailedProvisionalLoad(failed_request, error, frame_); 4190 SendFailedProvisionalLoad(
4191 failed_request, error, request_params.nav_entry_id, frame_);
4191 4192
4192 if (!ShouldDisplayErrorPageForFailedLoad(error_code, common_params.url)) { 4193 if (!ShouldDisplayErrorPageForFailedLoad(error_code, common_params.url)) {
4193 Send(new FrameHostMsg_DidDropNavigation(routing_id_)); 4194 Send(new FrameHostMsg_DidDropNavigation(routing_id_));
4194 return; 4195 return;
4195 } 4196 }
4196 4197
4197 // Make sure errors are not shown in view source mode. 4198 // Make sure errors are not shown in view source mode.
4198 frame_->enableViewSourceMode(false); 4199 frame_->enableViewSourceMode(false);
4199 4200
4200 // Replace the current history entry in reloads, history navigations and loads 4201 // Replace the current history entry in reloads, history navigations and loads
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after
4700 false); 4701 false);
4701 } else { 4702 } else {
4702 CHECK(false) << "Invalid URL passed: " 4703 CHECK(false) << "Invalid URL passed: "
4703 << params.url.possibly_invalid_spec(); 4704 << params.url.possibly_invalid_spec();
4704 } 4705 }
4705 } 4706 }
4706 4707
4707 void RenderFrameImpl::SendFailedProvisionalLoad( 4708 void RenderFrameImpl::SendFailedProvisionalLoad(
4708 const blink::WebURLRequest& request, 4709 const blink::WebURLRequest& request,
4709 const blink::WebURLError& error, 4710 const blink::WebURLError& error,
4711 int nav_entry_id,
4710 blink::WebLocalFrame* frame) { 4712 blink::WebLocalFrame* frame) {
4711 bool show_repost_interstitial = (error.reason == net::ERR_CACHE_MISS && 4713 bool show_repost_interstitial = (error.reason == net::ERR_CACHE_MISS &&
4712 EqualsASCII(request.httpMethod(), "POST")); 4714 EqualsASCII(request.httpMethod(), "POST"));
4713 4715
4714 FrameHostMsg_DidFailProvisionalLoadWithError_Params params; 4716 FrameHostMsg_DidFailProvisionalLoadWithError_Params params;
4715 params.error_code = error.reason; 4717 params.error_code = error.reason;
4718 params.nav_entry_id = nav_entry_id;
4716 GetContentClient()->renderer()->GetNavigationErrorStrings( 4719 GetContentClient()->renderer()->GetNavigationErrorStrings(
4717 render_view_.get(), frame, request, error, NULL, 4720 render_view_.get(), frame, request, error, NULL,
4718 &params.error_description); 4721 &params.error_description);
4719 params.url = error.unreachableURL; 4722 params.url = error.unreachableURL;
4720 params.showing_repost_interstitial = show_repost_interstitial; 4723 params.showing_repost_interstitial = show_repost_interstitial;
4721 Send(new FrameHostMsg_DidFailProvisionalLoadWithError(routing_id_, params)); 4724 Send(new FrameHostMsg_DidFailProvisionalLoadWithError(routing_id_, params));
4722 } 4725 }
4723 4726
4724 bool RenderFrameImpl::ShouldDisplayErrorPageForFailedLoad( 4727 bool RenderFrameImpl::ShouldDisplayErrorPageForFailedLoad(
4725 int error_code, 4728 int error_code,
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
4881 #elif defined(ENABLE_BROWSER_CDMS) 4884 #elif defined(ENABLE_BROWSER_CDMS)
4882 cdm_manager_, 4885 cdm_manager_,
4883 #endif 4886 #endif
4884 this); 4887 this);
4885 } 4888 }
4886 4889
4887 return cdm_factory_; 4890 return cdm_factory_;
4888 } 4891 }
4889 4892
4890 } // namespace content 4893 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698