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

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

Issue 8404018: chrome.loadTimes() shouldn't be affected by in-document navigation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sync and merge Created 9 years, 1 month 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 | Annotate | Revision Log
« no previous file with comments | « content/renderer/render_view_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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_view_impl.h" 5 #include "content/renderer/render_view_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 24 matching lines...) Expand all
35 #include "content/common/pepper_messages.h" 35 #include "content/common/pepper_messages.h"
36 #include "content/common/pepper_plugin_registry.h" 36 #include "content/common/pepper_plugin_registry.h"
37 #include "content/common/quota_dispatcher.h" 37 #include "content/common/quota_dispatcher.h"
38 #include "content/common/request_extra_data.h" 38 #include "content/common/request_extra_data.h"
39 #include "content/common/view_messages.h" 39 #include "content/common/view_messages.h"
40 #include "content/public/common/bindings_policy.h" 40 #include "content/public/common/bindings_policy.h"
41 #include "content/public/common/content_constants.h" 41 #include "content/public/common/content_constants.h"
42 #include "content/public/common/content_switches.h" 42 #include "content/public/common/content_switches.h"
43 #include "content/public/common/url_constants.h" 43 #include "content/public/common/url_constants.h"
44 #include "content/public/renderer/content_renderer_client.h" 44 #include "content/public/renderer/content_renderer_client.h"
45 #include "content/public/renderer/document_state.h"
45 #include "content/public/renderer/navigation_state.h" 46 #include "content/public/renderer/navigation_state.h"
46 #include "content/public/renderer/render_view_observer.h" 47 #include "content/public/renderer/render_view_observer.h"
47 #include "content/public/renderer/render_view_visitor.h" 48 #include "content/public/renderer/render_view_visitor.h"
48 #include "content/renderer/device_orientation_dispatcher.h" 49 #include "content/renderer/device_orientation_dispatcher.h"
49 #include "content/renderer/devtools_agent.h" 50 #include "content/renderer/devtools_agent.h"
50 #include "content/renderer/external_popup_menu.h" 51 #include "content/renderer/external_popup_menu.h"
51 #include "content/renderer/geolocation_dispatcher.h" 52 #include "content/renderer/geolocation_dispatcher.h"
52 #include "content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.h" 53 #include "content/renderer/gpu/webgraphicscontext3d_command_buffer_impl.h"
53 #include "content/renderer/intents_dispatcher.h" 54 #include "content/renderer/intents_dispatcher.h"
54 #include "content/renderer/java/java_bridge_dispatcher.h" 55 #include "content/renderer/java/java_bridge_dispatcher.h"
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 using WebKit::WebURLResponse; 231 using WebKit::WebURLResponse;
231 using WebKit::WebVector; 232 using WebKit::WebVector;
232 using WebKit::WebView; 233 using WebKit::WebView;
233 using WebKit::WebWidget; 234 using WebKit::WebWidget;
234 using WebKit::WebWindowFeatures; 235 using WebKit::WebWindowFeatures;
235 using WebKit::WebWorker; 236 using WebKit::WebWorker;
236 using WebKit::WebWorkerClient; 237 using WebKit::WebWorkerClient;
237 using appcache::WebApplicationCacheHostImpl; 238 using appcache::WebApplicationCacheHostImpl;
238 using base::Time; 239 using base::Time;
239 using base::TimeDelta; 240 using base::TimeDelta;
241 using content::DocumentState;
240 using content::NavigationState; 242 using content::NavigationState;
241 using content::RenderThread; 243 using content::RenderThread;
242 using content::RenderViewObserver; 244 using content::RenderViewObserver;
243 using content::RenderViewVisitor; 245 using content::RenderViewVisitor;
244 using content::V8ValueConverter; 246 using content::V8ValueConverter;
245 using webkit_glue::AltErrorPageResourceFetcher; 247 using webkit_glue::AltErrorPageResourceFetcher;
246 using webkit_glue::FormField; 248 using webkit_glue::FormField;
247 using webkit_glue::PasswordForm; 249 using webkit_glue::PasswordForm;
248 using webkit_glue::PasswordFormDomManager; 250 using webkit_glue::PasswordFormDomManager;
249 using webkit_glue::ResourceFetcher; 251 using webkit_glue::ResourceFetcher;
(...skipping 24 matching lines...) Expand all
274 static const float kScalingIncrementForGesture = 0.01f; 276 static const float kScalingIncrementForGesture = 0.01f;
275 277
276 static void GetRedirectChain(WebDataSource* ds, std::vector<GURL>* result) { 278 static void GetRedirectChain(WebDataSource* ds, std::vector<GURL>* result) {
277 WebVector<WebURL> urls; 279 WebVector<WebURL> urls;
278 ds->redirectChain(urls); 280 ds->redirectChain(urls);
279 result->reserve(urls.size()); 281 result->reserve(urls.size());
280 for (size_t i = 0; i < urls.size(); ++i) 282 for (size_t i = 0; i < urls.size(); ++i)
281 result->push_back(urls[i]); 283 result->push_back(urls[i]);
282 } 284 }
283 285
284 // If |data_source| is non-null and has a NavigationState associated with it, 286 // If |data_source| is non-null and has a DocumentState associated with it,
285 // the AltErrorPageResourceFetcher is reset. 287 // the AltErrorPageResourceFetcher is reset.
286 static void StopAltErrorPageFetcher(WebDataSource* data_source) { 288 static void StopAltErrorPageFetcher(WebDataSource* data_source) {
287 if (data_source) { 289 if (data_source) {
288 NavigationState* state = NavigationState::FromDataSource(data_source); 290 DocumentState* document_state = DocumentState::FromDataSource(data_source);
289 if (state) 291 if (document_state)
290 state->set_alt_error_page_fetcher(NULL); 292 document_state->set_alt_error_page_fetcher(NULL);
291 } 293 }
292 } 294 }
293 295
296 static bool IsReload(const ViewMsg_Navigate_Params& params) {
297 return
298 params.navigation_type == ViewMsg_Navigate_Type::RELOAD ||
299 params.navigation_type == ViewMsg_Navigate_Type::RELOAD_IGNORING_CACHE;
300 }
301
294 /////////////////////////////////////////////////////////////////////////////// 302 ///////////////////////////////////////////////////////////////////////////////
295 303
296 int32 RenderViewImpl::next_page_id_ = 1; 304 int32 RenderViewImpl::next_page_id_ = 1;
297 305
298 struct RenderViewImpl::PendingFileChooser { 306 struct RenderViewImpl::PendingFileChooser {
299 PendingFileChooser(const ViewHostMsg_RunFileChooser_Params& p, 307 PendingFileChooser(const ViewHostMsg_RunFileChooser_Params& p,
300 WebFileChooserCompletion* c) 308 WebFileChooserCompletion* c)
301 : params(p), 309 : params(p),
302 completion(c) { 310 completion(c) {
303 } 311 }
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
693 701
694 return handled; 702 return handled;
695 } 703 }
696 704
697 void RenderViewImpl::OnNavigate(const ViewMsg_Navigate_Params& params) { 705 void RenderViewImpl::OnNavigate(const ViewMsg_Navigate_Params& params) {
698 if (!webview()) 706 if (!webview())
699 return; 707 return;
700 708
701 FOR_EACH_OBSERVER(RenderViewObserver, observers_, Navigate(params.url)); 709 FOR_EACH_OBSERVER(RenderViewObserver, observers_, Navigate(params.url));
702 710
703 bool is_reload = 711 bool is_reload = IsReload(params);
704 params.navigation_type == ViewMsg_Navigate_Type::RELOAD ||
705 params.navigation_type == ViewMsg_Navigate_Type::RELOAD_IGNORING_CACHE;
706 712
707 // If this is a stale back/forward (due to a recent navigation the browser 713 // If this is a stale back/forward (due to a recent navigation the browser
708 // didn't know about), ignore it. 714 // didn't know about), ignore it.
709 if (IsBackForwardToStaleEntry(params, is_reload)) 715 if (IsBackForwardToStaleEntry(params, is_reload))
710 return; 716 return;
711 717
712 // Swap this renderer back in if necessary. 718 // Swap this renderer back in if necessary.
713 if (is_swapped_out_) 719 if (is_swapped_out_)
714 SetSwappedOut(false); 720 SetSwappedOut(false);
715 721
716 history_list_offset_ = params.current_history_list_offset; 722 history_list_offset_ = params.current_history_list_offset;
717 history_list_length_ = params.current_history_list_length; 723 history_list_length_ = params.current_history_list_length;
718 if (history_list_length_ >= 0) 724 if (history_list_length_ >= 0)
719 history_page_ids_.resize(history_list_length_, -1); 725 history_page_ids_.resize(history_list_length_, -1);
720 if (params.pending_history_list_offset >= 0 && 726 if (params.pending_history_list_offset >= 0 &&
721 params.pending_history_list_offset < history_list_length_) 727 params.pending_history_list_offset < history_list_length_)
722 history_page_ids_[params.pending_history_list_offset] = params.page_id; 728 history_page_ids_[params.pending_history_list_offset] = params.page_id;
723 729
724 content::GetContentClient()->SetActiveURL(params.url); 730 content::GetContentClient()->SetActiveURL(params.url);
725 731
726 WebFrame* main_frame = webview()->mainFrame(); 732 WebFrame* main_frame = webview()->mainFrame();
727 if (is_reload && main_frame->currentHistoryItem().isNull()) { 733 if (is_reload && main_frame->currentHistoryItem().isNull()) {
728 // We cannot reload if we do not have any history state. This happens, for 734 // We cannot reload if we do not have any history state. This happens, for
729 // example, when recovering from a crash. Our workaround here is a bit of 735 // example, when recovering from a crash. Our workaround here is a bit of
730 // a hack since it means that reload after a crashed tab does not cause an 736 // a hack since it means that reload after a crashed tab does not cause an
731 // end-to-end cache validation. 737 // end-to-end cache validation.
732 is_reload = false; 738 is_reload = false;
733 } 739 }
734 740
735 // A navigation resulting from loading a javascript URL should not be treated 741 pending_navigation_params_.reset(new ViewMsg_Navigate_Params);
736 // as a browser initiated event. Instead, we want it to look as if the page 742 *pending_navigation_params_.get() = params;
737 // initiated any load resulting from JS execution.
738 if (!params.url.SchemeIs(chrome::kJavaScriptScheme)) {
739 NavigationState* state = NavigationState::CreateBrowserInitiated(
740 params.page_id,
741 params.pending_history_list_offset,
742 params.transition,
743 params.request_time);
744 if (params.navigation_type == ViewMsg_Navigate_Type::RESTORE) {
745 // We're doing a load of a page that was restored from the last session.
746 // By default this prefers the cache over loading (LOAD_PREFERRING_CACHE)
747 // which can result in stale data for pages that are set to expire. We
748 // explicitly override that by setting the policy here so that as
749 // necessary we load from the network.
750 state->set_cache_policy_override(WebURLRequest::UseProtocolCachePolicy);
751 }
752 pending_navigation_state_.reset(state);
753 }
754
755 NavigationState* navigation_state = pending_navigation_state_.get();
756
757 if (navigation_state) {
758 // New loads need to reset the error page fetcher. Otherwise if there is an
759 // outstanding error page fetcher it may complete and clobber the current
760 // page load.
761 navigation_state->set_alt_error_page_fetcher(NULL);
762 }
763 743
764 // If we are reloading, then WebKit will use the history state of the current 744 // If we are reloading, then WebKit will use the history state of the current
765 // page, so we should just ignore any given history state. Otherwise, if we 745 // page, so we should just ignore any given history state. Otherwise, if we
766 // have history state, then we need to navigate to it, which corresponds to a 746 // have history state, then we need to navigate to it, which corresponds to a
767 // back/forward navigation event. 747 // back/forward navigation event.
768 if (is_reload) { 748 if (is_reload) {
769 if (navigation_state)
770 navigation_state->set_load_type(NavigationState::RELOAD);
771 bool ignore_cache = (params.navigation_type == 749 bool ignore_cache = (params.navigation_type ==
772 ViewMsg_Navigate_Type::RELOAD_IGNORING_CACHE); 750 ViewMsg_Navigate_Type::RELOAD_IGNORING_CACHE);
773 main_frame->reload(ignore_cache); 751 main_frame->reload(ignore_cache);
774 } else if (!params.state.empty()) { 752 } else if (!params.state.empty()) {
775 // We must know the page ID of the page we are navigating back to. 753 // We must know the page ID of the page we are navigating back to.
776 DCHECK_NE(params.page_id, -1); 754 DCHECK_NE(params.page_id, -1);
777 if (navigation_state)
778 navigation_state->set_load_type(NavigationState::HISTORY_LOAD);
779 main_frame->loadHistoryItem( 755 main_frame->loadHistoryItem(
780 webkit_glue::HistoryItemFromString(params.state)); 756 webkit_glue::HistoryItemFromString(params.state));
781 } else { 757 } else {
782 // Navigate to the given URL. 758 // Navigate to the given URL.
783 WebURLRequest request(params.url); 759 WebURLRequest request(params.url);
784 760
785 // A session history navigation should have been accompanied by state. 761 // A session history navigation should have been accompanied by state.
786 DCHECK_EQ(params.page_id, -1); 762 DCHECK_EQ(params.page_id, -1);
787 763
788 if (main_frame->isViewSourceModeEnabled()) 764 if (main_frame->isViewSourceModeEnabled())
(...skipping 10 matching lines...) Expand all
799 775
800 if (!params.extra_headers.empty()) { 776 if (!params.extra_headers.empty()) {
801 for (net::HttpUtil::HeadersIterator i(params.extra_headers.begin(), 777 for (net::HttpUtil::HeadersIterator i(params.extra_headers.begin(),
802 params.extra_headers.end(), "\n"); 778 params.extra_headers.end(), "\n");
803 i.GetNext(); ) { 779 i.GetNext(); ) {
804 request.addHTTPHeaderField(WebString::fromUTF8(i.name()), 780 request.addHTTPHeaderField(WebString::fromUTF8(i.name()),
805 WebString::fromUTF8(i.values())); 781 WebString::fromUTF8(i.values()));
806 } 782 }
807 } 783 }
808 784
809 if (navigation_state)
810 navigation_state->set_load_type(NavigationState::NORMAL_LOAD);
811 main_frame->loadRequest(request); 785 main_frame->loadRequest(request);
812 } 786 }
813 787
814 // In case LoadRequest failed before DidCreateDataSource was called. 788 // In case LoadRequest failed before DidCreateDataSource was called.
815 pending_navigation_state_.reset(); 789 pending_navigation_params_.reset();
816 } 790 }
817 791
818 bool RenderViewImpl::IsBackForwardToStaleEntry( 792 bool RenderViewImpl::IsBackForwardToStaleEntry(
819 const ViewMsg_Navigate_Params& params, 793 const ViewMsg_Navigate_Params& params,
820 bool is_reload) { 794 bool is_reload) {
821 // Make sure this isn't a back/forward to an entry we have already cropped 795 // Make sure this isn't a back/forward to an entry we have already cropped
822 // or replaced from our history, before the browser knew about it. If so, 796 // or replaced from our history, before the browser knew about it. If so,
823 // a new navigation has committed in the mean time, and we can ignore this. 797 // a new navigation has committed in the mean time, and we can ignore this.
824 bool is_back_forward = !is_reload && !params.state.empty(); 798 bool is_back_forward = !is_reload && !params.state.empty();
825 799
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
1045 1019
1046 // Tell the embedding application that the URL of the active page has changed 1020 // Tell the embedding application that the URL of the active page has changed
1047 void RenderViewImpl::UpdateURL(WebFrame* frame) { 1021 void RenderViewImpl::UpdateURL(WebFrame* frame) {
1048 WebDataSource* ds = frame->dataSource(); 1022 WebDataSource* ds = frame->dataSource();
1049 DCHECK(ds); 1023 DCHECK(ds);
1050 1024
1051 const WebURLRequest& request = ds->request(); 1025 const WebURLRequest& request = ds->request();
1052 const WebURLRequest& original_request = ds->originalRequest(); 1026 const WebURLRequest& original_request = ds->originalRequest();
1053 const WebURLResponse& response = ds->response(); 1027 const WebURLResponse& response = ds->response();
1054 1028
1055 NavigationState* navigation_state = NavigationState::FromDataSource(ds); 1029 DocumentState* document_state = DocumentState::FromDataSource(ds);
1056 DCHECK(navigation_state); 1030 NavigationState* navigation_state = document_state->navigation_state();
1057 1031
1058 ViewHostMsg_FrameNavigate_Params params; 1032 ViewHostMsg_FrameNavigate_Params params;
1059 params.http_status_code = response.httpStatusCode(); 1033 params.http_status_code = response.httpStatusCode();
1060 params.is_post = false; 1034 params.is_post = false;
1061 params.page_id = page_id_; 1035 params.page_id = page_id_;
1062 params.frame_id = frame->identifier(); 1036 params.frame_id = frame->identifier();
1063 params.socket_address.set_host(response.remoteIPAddress().utf8()); 1037 params.socket_address.set_host(response.remoteIPAddress().utf8());
1064 params.socket_address.set_port(response.remotePort()); 1038 params.socket_address.set_port(response.remotePort());
1065 params.was_fetched_via_proxy = response.wasFetchedViaProxy(); 1039 params.was_fetched_via_proxy = response.wasFetchedViaProxy();
1066 params.was_within_same_page = navigation_state->was_within_same_page(); 1040 params.was_within_same_page = navigation_state->was_within_same_page();
1067 if (!navigation_state->security_info().empty()) { 1041 if (!document_state->security_info().empty()) {
1068 // SSL state specified in the request takes precedence over the one in the 1042 // SSL state specified in the request takes precedence over the one in the
1069 // response. 1043 // response.
1070 // So far this is only intended for error pages that are not expected to be 1044 // So far this is only intended for error pages that are not expected to be
1071 // over ssl, so we should not get any clash. 1045 // over ssl, so we should not get any clash.
1072 DCHECK(response.securityInfo().isEmpty()); 1046 DCHECK(response.securityInfo().isEmpty());
1073 params.security_info = navigation_state->security_info(); 1047 params.security_info = document_state->security_info();
1074 } else { 1048 } else {
1075 params.security_info = response.securityInfo(); 1049 params.security_info = response.securityInfo();
1076 } 1050 }
1077 1051
1078 // Set the URL to be displayed in the browser UI to the user. 1052 // Set the URL to be displayed in the browser UI to the user.
1079 if (ds->hasUnreachableURL()) { 1053 if (ds->hasUnreachableURL()) {
1080 params.url = ds->unreachableURL(); 1054 params.url = ds->unreachableURL();
1081 } else { 1055 } else {
1082 params.url = request.url(); 1056 params.url = request.url();
1083 } 1057 }
1084 1058
1085 GetRedirectChain(ds, &params.redirects); 1059 GetRedirectChain(ds, &params.redirects);
1086 params.should_update_history = !ds->hasUnreachableURL() && 1060 params.should_update_history = !ds->hasUnreachableURL() &&
1087 !response.isMultipartPayload() && (response.httpStatusCode() != 404); 1061 !response.isMultipartPayload() && (response.httpStatusCode() != 404);
1088 1062
1089 params.searchable_form_url = navigation_state->searchable_form_url(); 1063 params.searchable_form_url = document_state->searchable_form_url();
1090 params.searchable_form_encoding = 1064 params.searchable_form_encoding =
1091 navigation_state->searchable_form_encoding(); 1065 document_state->searchable_form_encoding();
1092 1066
1093 const PasswordForm* password_form_data = 1067 const PasswordForm* password_form_data =
1094 navigation_state->password_form_data(); 1068 document_state->password_form_data();
1095 if (password_form_data) 1069 if (password_form_data)
1096 params.password_form = *password_form_data; 1070 params.password_form = *password_form_data;
1097 1071
1098 params.gesture = navigation_gesture_; 1072 params.gesture = navigation_gesture_;
1099 navigation_gesture_ = NavigationGestureUnknown; 1073 navigation_gesture_ = NavigationGestureUnknown;
1100 1074
1101 // Make navigation state a part of the FrameNavigate message so that commited 1075 // Make navigation state a part of the FrameNavigate message so that commited
1102 // entry had it at all times. 1076 // entry had it at all times.
1103 const WebHistoryItem& item = frame->currentHistoryItem(); 1077 const WebHistoryItem& item = frame->currentHistoryItem();
1104 if (!item.isNull()) { 1078 if (!item.isNull()) {
(...skipping 900 matching lines...) Expand 10 before | Expand all | Expand 10 after
2005 } 1979 }
2006 1980
2007 // Webkit is asking whether to navigate to a new URL. 1981 // Webkit is asking whether to navigate to a new URL.
2008 // This is fine normally, except if we're showing UI from one security 1982 // This is fine normally, except if we're showing UI from one security
2009 // context and they're trying to navigate to a different context. 1983 // context and they're trying to navigate to a different context.
2010 const GURL& url = request.url(); 1984 const GURL& url = request.url();
2011 1985
2012 // A content initiated navigation may have originated from a link-click, 1986 // A content initiated navigation may have originated from a link-click,
2013 // script, drag-n-drop operation, etc. 1987 // script, drag-n-drop operation, etc.
2014 bool is_content_initiated = 1988 bool is_content_initiated =
2015 NavigationState::FromDataSource(frame->provisionalDataSource())-> 1989 DocumentState::FromDataSource(frame->provisionalDataSource())->
2016 is_content_initiated(); 1990 navigation_state()->is_content_initiated();
2017 1991
2018 // Experimental: 1992 // Experimental:
2019 // If --enable-strict-site-isolation is enabled, send all top-level 1993 // If --enable-strict-site-isolation is enabled, send all top-level
2020 // navigations to the browser to let it swap processes when crossing site 1994 // navigations to the browser to let it swap processes when crossing site
2021 // boundaries. This is currently expected to break some script calls and 1995 // boundaries. This is currently expected to break some script calls and
2022 // navigations, such as form submissions. 1996 // navigations, such as form submissions.
2023 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 1997 const CommandLine& command_line = *CommandLine::ForCurrentProcess();
2024 if (!frame->parent() && (is_content_initiated || is_redirect) && 1998 if (!frame->parent() && (is_content_initiated || is_redirect) &&
2025 command_line.HasSwitch(switches::kEnableStrictSiteIsolation)) { 1999 command_line.HasSwitch(switches::kEnableStrictSiteIsolation)) {
2026 GURL referrer(request.httpHeaderField(WebString::fromUTF8("Referer"))); 2000 GURL referrer(request.httpHeaderField(WebString::fromUTF8("Referer")));
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
2185 WebFrame*, const WebURLError&) { 2159 WebFrame*, const WebURLError&) {
2186 NOTREACHED(); // Since we said we can handle all requests. 2160 NOTREACHED(); // Since we said we can handle all requests.
2187 } 2161 }
2188 2162
2189 void RenderViewImpl::willSendSubmitEvent(WebKit::WebFrame* frame, 2163 void RenderViewImpl::willSendSubmitEvent(WebKit::WebFrame* frame,
2190 const WebKit::WebFormElement& form) { 2164 const WebKit::WebFormElement& form) {
2191 // Some login forms have onSubmit handlers that put a hash of the password 2165 // Some login forms have onSubmit handlers that put a hash of the password
2192 // into a hidden field and then clear the password. (Issue 28910.) 2166 // into a hidden field and then clear the password. (Issue 28910.)
2193 // This method gets called before any of those handlers run, so save away 2167 // This method gets called before any of those handlers run, so save away
2194 // a copy of the password in case it gets lost. 2168 // a copy of the password in case it gets lost.
2195 NavigationState* navigation_state = 2169 DocumentState* document_state =
2196 NavigationState::FromDataSource(frame->dataSource()); 2170 DocumentState::FromDataSource(frame->dataSource());
2197 navigation_state->set_password_form_data( 2171 document_state->set_password_form_data(
2198 PasswordFormDomManager::CreatePasswordForm(form)); 2172 PasswordFormDomManager::CreatePasswordForm(form));
2199 } 2173 }
2200 2174
2201 void RenderViewImpl::willSubmitForm(WebFrame* frame, 2175 void RenderViewImpl::willSubmitForm(WebFrame* frame,
2202 const WebFormElement& form) { 2176 const WebFormElement& form) {
2203 NavigationState* navigation_state = 2177 DocumentState* document_state =
2204 NavigationState::FromDataSource(frame->provisionalDataSource()); 2178 DocumentState::FromDataSource(frame->provisionalDataSource());
2179 NavigationState* navigation_state = document_state->navigation_state();
2205 2180
2206 if (navigation_state->transition_type() == content::PAGE_TRANSITION_LINK) 2181 if (navigation_state->transition_type() == content::PAGE_TRANSITION_LINK)
2207 navigation_state->set_transition_type(content::PAGE_TRANSITION_FORM_SUBMIT); 2182 navigation_state->set_transition_type(content::PAGE_TRANSITION_FORM_SUBMIT);
2208 2183
2209 // Save these to be processed when the ensuing navigation is committed. 2184 // Save these to be processed when the ensuing navigation is committed.
2210 WebSearchableFormData web_searchable_form_data(form); 2185 WebSearchableFormData web_searchable_form_data(form);
2211 navigation_state->set_searchable_form_url(web_searchable_form_data.url()); 2186 document_state->set_searchable_form_url(web_searchable_form_data.url());
2212 navigation_state->set_searchable_form_encoding( 2187 document_state->set_searchable_form_encoding(
2213 web_searchable_form_data.encoding().utf8()); 2188 web_searchable_form_data.encoding().utf8());
2214 PasswordForm* password_form_data = 2189 PasswordForm* password_form_data =
2215 PasswordFormDomManager::CreatePasswordForm(form); 2190 PasswordFormDomManager::CreatePasswordForm(form);
2216 navigation_state->set_password_form_data(password_form_data); 2191 document_state->set_password_form_data(password_form_data);
2217 2192
2218 // In order to save the password that the user actually typed and not one 2193 // In order to save the password that the user actually typed and not one
2219 // that may have gotten transformed by the site prior to submit, recover it 2194 // that may have gotten transformed by the site prior to submit, recover it
2220 // from the form contents already stored by |willSendSubmitEvent| into the 2195 // from the form contents already stored by |willSendSubmitEvent| into the
2221 // dataSource's NavigationState (as opposed to the provisionalDataSource's, 2196 // dataSource's NavigationState (as opposed to the provisionalDataSource's,
2222 // which is what we're storing into now.) 2197 // which is what we're storing into now.)
2223 if (password_form_data) { 2198 if (password_form_data) {
2224 NavigationState* old_navigation_state = 2199 DocumentState* old_document_state =
2225 NavigationState::FromDataSource(frame->dataSource()); 2200 DocumentState::FromDataSource(frame->dataSource());
2226 if (old_navigation_state) { 2201 if (old_document_state) {
2227 PasswordForm* old_form_data = old_navigation_state->password_form_data(); 2202 PasswordForm* old_form_data = old_document_state->password_form_data();
2228 if (old_form_data && old_form_data->action == password_form_data->action) 2203 if (old_form_data && old_form_data->action == password_form_data->action)
2229 password_form_data->password_value = old_form_data->password_value; 2204 password_form_data->password_value = old_form_data->password_value;
2230 } 2205 }
2231 } 2206 }
2232 2207
2233 FOR_EACH_OBSERVER( 2208 FOR_EACH_OBSERVER(
2234 RenderViewObserver, observers_, WillSubmitForm(frame, form)); 2209 RenderViewObserver, observers_, WillSubmitForm(frame, form));
2235 } 2210 }
2236 2211
2237 void RenderViewImpl::willPerformClientRedirect( 2212 void RenderViewImpl::willPerformClientRedirect(
(...skipping 11 matching lines...) Expand all
2249 2224
2250 void RenderViewImpl::didCompleteClientRedirect( 2225 void RenderViewImpl::didCompleteClientRedirect(
2251 WebFrame* frame, const WebURL& from) { 2226 WebFrame* frame, const WebURL& from) {
2252 if (!frame->parent()) 2227 if (!frame->parent())
2253 completed_client_redirect_src_ = from; 2228 completed_client_redirect_src_ = from;
2254 FOR_EACH_OBSERVER( 2229 FOR_EACH_OBSERVER(
2255 RenderViewObserver, observers_, DidCompleteClientRedirect(frame, from)); 2230 RenderViewObserver, observers_, DidCompleteClientRedirect(frame, from));
2256 } 2231 }
2257 2232
2258 void RenderViewImpl::didCreateDataSource(WebFrame* frame, WebDataSource* ds) { 2233 void RenderViewImpl::didCreateDataSource(WebFrame* frame, WebDataSource* ds) {
2234 DocumentState* document_state = DocumentState::FromDataSource(ds);
2235 if (!document_state) {
2236 document_state = new DocumentState;
2237 ds->setExtraData(document_state);
2238 }
2239
2259 // The rest of RenderView assumes that a WebDataSource will always have a 2240 // The rest of RenderView assumes that a WebDataSource will always have a
2260 // non-null NavigationState. 2241 // non-null NavigationState.
2261 bool content_initiated = !pending_navigation_state_.get(); 2242 bool content_initiated = !pending_navigation_params_.get();
2262 NavigationState* state = content_initiated ? 2243 if (content_initiated)
2263 NavigationState::CreateContentInitiated() : 2244 document_state->set_navigation_state(
2264 pending_navigation_state_.release(); 2245 NavigationState::CreateContentInitiated());
2246 else
2247 PopulateStateFromPendingNavigationParams(document_state);
2265 2248
2266 // NavigationState::referred_by_prefetcher_ is true if we are 2249 // DocumentState::referred_by_prefetcher_ is true if we are
2267 // navigating from a page that used prefetching using a link on that 2250 // navigating from a page that used prefetching using a link on that
2268 // page. We are early enough in the request process here that we 2251 // page. We are early enough in the request process here that we
2269 // can still see the NavigationState of the previous page and set 2252 // can still see the DocumentState of the previous page and set
2270 // this value appropriately. 2253 // this value appropriately.
2271 // TODO(gavinp): catch the important case of navigation in a new 2254 // TODO(gavinp): catch the important case of navigation in a new
2272 // renderer process. 2255 // renderer process.
2273 if (webview()) { 2256 if (webview()) {
2274 if (WebFrame* old_frame = webview()->mainFrame()) { 2257 if (WebFrame* old_frame = webview()->mainFrame()) {
2275 const WebURLRequest& original_request = ds->originalRequest(); 2258 const WebURLRequest& original_request = ds->originalRequest();
2276 const GURL referrer( 2259 const GURL referrer(
2277 original_request.httpHeaderField(WebString::fromUTF8("Referer"))); 2260 original_request.httpHeaderField(WebString::fromUTF8("Referer")));
2278 if (!referrer.is_empty() && 2261 if (!referrer.is_empty() &&
2279 NavigationState::FromDataSource( 2262 DocumentState::FromDataSource(
2280 old_frame->dataSource())->was_prefetcher()) { 2263 old_frame->dataSource())->was_prefetcher()) {
2281 for (;old_frame;old_frame = old_frame->traverseNext(false)) { 2264 for (;old_frame;old_frame = old_frame->traverseNext(false)) {
2282 WebDataSource* old_frame_ds = old_frame->dataSource(); 2265 WebDataSource* old_frame_ds = old_frame->dataSource();
2283 if (old_frame_ds && referrer == GURL(old_frame_ds->request().url())) { 2266 if (old_frame_ds && referrer == GURL(old_frame_ds->request().url())) {
2284 state->set_was_referred_by_prefetcher(true); 2267 document_state->set_was_referred_by_prefetcher(true);
2285 break; 2268 break;
2286 } 2269 }
2287 } 2270 }
2288 } 2271 }
2289 } 2272 }
2290 } 2273 }
2291 2274
2292 if (content_initiated) { 2275 if (content_initiated) {
2293 const WebURLRequest& request = ds->request(); 2276 const WebURLRequest& request = ds->request();
2294 switch (request.cachePolicy()) { 2277 switch (request.cachePolicy()) {
2295 case WebURLRequest::UseProtocolCachePolicy: // normal load. 2278 case WebURLRequest::UseProtocolCachePolicy: // normal load.
2296 state->set_load_type(NavigationState::LINK_LOAD_NORMAL); 2279 document_state->set_load_type(DocumentState::LINK_LOAD_NORMAL);
2297 break; 2280 break;
2298 case WebURLRequest::ReloadIgnoringCacheData: // reload. 2281 case WebURLRequest::ReloadIgnoringCacheData: // reload.
2299 state->set_load_type(NavigationState::LINK_LOAD_RELOAD); 2282 document_state->set_load_type(DocumentState::LINK_LOAD_RELOAD);
2300 break; 2283 break;
2301 case WebURLRequest::ReturnCacheDataElseLoad: // allow stale data. 2284 case WebURLRequest::ReturnCacheDataElseLoad: // allow stale data.
2302 state->set_load_type(NavigationState::LINK_LOAD_CACHE_STALE_OK); 2285 document_state->set_load_type(
2286 DocumentState::LINK_LOAD_CACHE_STALE_OK);
2303 break; 2287 break;
2304 case WebURLRequest::ReturnCacheDataDontLoad: // Don't re-post. 2288 case WebURLRequest::ReturnCacheDataDontLoad: // Don't re-post.
2305 state->set_load_type(NavigationState::LINK_LOAD_CACHE_ONLY); 2289 document_state->set_load_type(DocumentState::LINK_LOAD_CACHE_ONLY);
2306 break; 2290 break;
2307 } 2291 }
2308 } 2292 }
2309 2293
2310 ds->setExtraData(state);
2311
2312 FOR_EACH_OBSERVER( 2294 FOR_EACH_OBSERVER(
2313 RenderViewObserver, observers_, DidCreateDataSource(frame, ds)); 2295 RenderViewObserver, observers_, DidCreateDataSource(frame, ds));
2314 } 2296 }
2315 2297
2298 void RenderViewImpl::PopulateStateFromPendingNavigationParams(
2299 DocumentState* document_state) {
2300 const ViewMsg_Navigate_Params& params = *pending_navigation_params_.get();
2301
2302 if (document_state->request_time().is_null())
2303 document_state->set_request_time(params.request_time);
2304
2305 // A navigation resulting from loading a javascript URL should not be treated
2306 // as a browser initiated event. Instead, we want it to look as if the page
2307 // initiated any load resulting from JS execution.
2308 if (!params.url.SchemeIs(chrome::kJavaScriptScheme)) {
2309 NavigationState* navigation_state = NavigationState::CreateBrowserInitiated(
2310 params.page_id,
2311 params.pending_history_list_offset,
2312 params.transition);
2313 if (params.navigation_type == ViewMsg_Navigate_Type::RESTORE) {
2314 // We're doing a load of a page that was restored from the last session.
2315 // By default this prefers the cache over loading (LOAD_PREFERRING_CACHE)
2316 // which can result in stale data for pages that are set to expire. We
2317 // explicitly override that by setting the policy here so that as
2318 // necessary we load from the network.
2319 document_state->set_cache_policy_override(
2320 WebURLRequest::UseProtocolCachePolicy);
2321 }
2322 document_state->set_navigation_state(navigation_state);
2323 } else {
2324 document_state->set_navigation_state(
2325 NavigationState::CreateContentInitiated());
2326 }
2327
2328 if (IsReload(params))
2329 document_state->set_load_type(DocumentState::RELOAD);
2330 else if (!params.state.empty())
2331 document_state->set_load_type(DocumentState::HISTORY_LOAD);
2332 else
2333 document_state->set_load_type(DocumentState::NORMAL_LOAD);
2334
2335 pending_navigation_params_.reset();
2336 }
2337
2316 void RenderViewImpl::didStartProvisionalLoad(WebFrame* frame) { 2338 void RenderViewImpl::didStartProvisionalLoad(WebFrame* frame) {
2317 WebDataSource* ds = frame->provisionalDataSource(); 2339 WebDataSource* ds = frame->provisionalDataSource();
2318 NavigationState* navigation_state = NavigationState::FromDataSource(ds); 2340 DocumentState* document_state = DocumentState::FromDataSource(ds);
2319 2341
2320 // Update the request time if WebKit has better knowledge of it. 2342 // Update the request time if WebKit has better knowledge of it.
2321 if (navigation_state->request_time().is_null()) { 2343 if (document_state->request_time().is_null()) {
2322 double event_time = ds->triggeringEventTime(); 2344 double event_time = ds->triggeringEventTime();
2323 if (event_time != 0.0) 2345 if (event_time != 0.0)
2324 navigation_state->set_request_time(Time::FromDoubleT(event_time)); 2346 document_state->set_request_time(Time::FromDoubleT(event_time));
2325 } 2347 }
2326 2348
2327 // Start time is only set after request time. 2349 // Start time is only set after request time.
2328 navigation_state->set_start_load_time(Time::Now()); 2350 document_state->set_start_load_time(Time::Now());
2329 2351
2330 bool is_top_most = !frame->parent(); 2352 bool is_top_most = !frame->parent();
2331 if (is_top_most) { 2353 if (is_top_most) {
2332 navigation_gesture_ = frame->isProcessingUserGesture() ? 2354 navigation_gesture_ = frame->isProcessingUserGesture() ?
2333 NavigationGestureUser : NavigationGestureAuto; 2355 NavigationGestureUser : NavigationGestureAuto;
2334 2356
2335 // Make sure redirect tracking state is clear for the new load. 2357 // Make sure redirect tracking state is clear for the new load.
2336 completed_client_redirect_src_ = GURL(); 2358 completed_client_redirect_src_ = GURL();
2337 } else if (frame->parent()->isLoading()) { 2359 } else if (frame->parent()->isLoading()) {
2338 // Take note of AUTO_SUBFRAME loads here, so that we can know how to 2360 // Take note of AUTO_SUBFRAME loads here, so that we can know how to
2339 // load an error page. See didFailProvisionalLoad. 2361 // load an error page. See didFailProvisionalLoad.
2340 navigation_state->set_transition_type( 2362 document_state->navigation_state()->set_transition_type(
2341 content::PAGE_TRANSITION_AUTO_SUBFRAME); 2363 content::PAGE_TRANSITION_AUTO_SUBFRAME);
2342 } 2364 }
2343 2365
2344 FOR_EACH_OBSERVER( 2366 FOR_EACH_OBSERVER(
2345 RenderViewObserver, observers_, DidStartProvisionalLoad(frame)); 2367 RenderViewObserver, observers_, DidStartProvisionalLoad(frame));
2346 2368
2347 Send(new ViewHostMsg_DidStartProvisionalLoadForFrame( 2369 Send(new ViewHostMsg_DidStartProvisionalLoadForFrame(
2348 routing_id_, frame->identifier(), is_top_most, GetOpenerUrl(), 2370 routing_id_, frame->identifier(), is_top_most, GetOpenerUrl(),
2349 ds->request().url())); 2371 ds->request().url()));
2350 } 2372 }
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
2403 routing_id_, params)); 2425 routing_id_, params));
2404 2426
2405 // Don't display an error page if this is simply a cancelled load. Aside 2427 // Don't display an error page if this is simply a cancelled load. Aside
2406 // from being dumb, WebCore doesn't expect it and it will cause a crash. 2428 // from being dumb, WebCore doesn't expect it and it will cause a crash.
2407 if (error.reason == net::ERR_ABORTED) 2429 if (error.reason == net::ERR_ABORTED)
2408 return; 2430 return;
2409 2431
2410 // Make sure we never show errors in view source mode. 2432 // Make sure we never show errors in view source mode.
2411 frame->enableViewSourceMode(false); 2433 frame->enableViewSourceMode(false);
2412 2434
2413 NavigationState* navigation_state = NavigationState::FromDataSource(ds); 2435 DocumentState* document_state = DocumentState::FromDataSource(ds);
2436 NavigationState* navigation_state = document_state->navigation_state();
2414 2437
2415 // If this is a failed back/forward/reload navigation, then we need to do a 2438 // If this is a failed back/forward/reload navigation, then we need to do a
2416 // 'replace' load. This is necessary to avoid messing up session history. 2439 // 'replace' load. This is necessary to avoid messing up session history.
2417 // Otherwise, we do a normal load, which simulates a 'go' navigation as far 2440 // Otherwise, we do a normal load, which simulates a 'go' navigation as far
2418 // as session history is concerned. 2441 // as session history is concerned.
2419 // 2442 //
2420 // AUTO_SUBFRAME loads should always be treated as loads that do not advance 2443 // AUTO_SUBFRAME loads should always be treated as loads that do not advance
2421 // the page id. 2444 // the page id.
2422 // 2445 //
2423 bool replace = 2446 bool replace =
2424 navigation_state->pending_page_id() != -1 || 2447 navigation_state->pending_page_id() != -1 ||
2425 navigation_state->transition_type() == 2448 navigation_state->transition_type() ==
2426 content::PAGE_TRANSITION_AUTO_SUBFRAME; 2449 content::PAGE_TRANSITION_AUTO_SUBFRAME;
2427 2450
2428 // If we failed on a browser initiated request, then make sure that our error 2451 // If we failed on a browser initiated request, then make sure that our error
2429 // page load is regarded as the same browser initiated request. 2452 // page load is regarded as the same browser initiated request.
2430 if (!navigation_state->is_content_initiated()) { 2453 if (!navigation_state->is_content_initiated()) {
2431 pending_navigation_state_.reset(NavigationState::CreateBrowserInitiated( 2454 pending_navigation_params_.reset(new ViewMsg_Navigate_Params);
2432 navigation_state->pending_page_id(), 2455 pending_navigation_params_->page_id =
2433 navigation_state->pending_history_list_offset(), 2456 navigation_state->pending_page_id();
2434 navigation_state->transition_type(), 2457 pending_navigation_params_->pending_history_list_offset =
2435 navigation_state->request_time())); 2458 navigation_state->pending_history_list_offset();
2459 pending_navigation_params_->transition =
2460 navigation_state->transition_type();
2461 pending_navigation_params_->request_time =
2462 document_state->request_time();
2436 } 2463 }
2437 2464
2438 // Provide the user with a more helpful error page? 2465 // Provide the user with a more helpful error page?
2439 if (MaybeLoadAlternateErrorPage(frame, error, replace)) 2466 if (MaybeLoadAlternateErrorPage(frame, error, replace))
2440 return; 2467 return;
2441 2468
2442 // Fallback to a local error page. 2469 // Fallback to a local error page.
2443 LoadNavigationErrorPage(frame, failed_request, error, std::string(), replace); 2470 LoadNavigationErrorPage(frame, failed_request, error, std::string(), replace);
2444 } 2471 }
2445 2472
2446 void RenderViewImpl::didReceiveDocumentData( 2473 void RenderViewImpl::didReceiveDocumentData(
2447 WebFrame* frame, const char* data, size_t data_len, 2474 WebFrame* frame, const char* data, size_t data_len,
2448 bool& prevent_default) { 2475 bool& prevent_default) {
2449 NavigationState* navigation_state = 2476 DocumentState* document_state =
2450 NavigationState::FromDataSource(frame->dataSource()); 2477 DocumentState::FromDataSource(frame->dataSource());
2451 navigation_state->set_use_error_page(false); 2478 document_state->set_use_error_page(false);
2452 } 2479 }
2453 2480
2454 void RenderViewImpl::didCommitProvisionalLoad(WebFrame* frame, 2481 void RenderViewImpl::didCommitProvisionalLoad(WebFrame* frame,
2455 bool is_new_navigation) { 2482 bool is_new_navigation) {
2456 NavigationState* navigation_state = 2483 DocumentState* document_state =
2457 NavigationState::FromDataSource(frame->dataSource()); 2484 DocumentState::FromDataSource(frame->dataSource());
2485 NavigationState* navigation_state = document_state->navigation_state();
2458 2486
2459 navigation_state->set_commit_load_time(Time::Now()); 2487 if (document_state->commit_load_time().is_null())
2488 document_state->set_commit_load_time(Time::Now());
2489
2460 if (is_new_navigation) { 2490 if (is_new_navigation) {
2461 // When we perform a new navigation, we need to update the last committed 2491 // When we perform a new navigation, we need to update the last committed
2462 // session history entry with state for the page we are leaving. 2492 // session history entry with state for the page we are leaving.
2463 UpdateSessionHistory(frame); 2493 UpdateSessionHistory(frame);
2464 2494
2465 // We bump our Page ID to correspond with the new session history entry. 2495 // We bump our Page ID to correspond with the new session history entry.
2466 page_id_ = next_page_id_++; 2496 page_id_ = next_page_id_++;
2467 2497
2468 // Advance our offset in session history, applying the length limit. There 2498 // Advance our offset in session history, applying the length limit. There
2469 // is now no forward history. 2499 // is now no forward history.
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
2553 UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); 2583 UpdateEncoding(frame, frame->view()->pageEncoding().utf8());
2554 } 2584 }
2555 2585
2556 void RenderViewImpl::didChangeIcon(WebFrame* frame, WebIconURL::Type type) { 2586 void RenderViewImpl::didChangeIcon(WebFrame* frame, WebIconURL::Type type) {
2557 FOR_EACH_OBSERVER(RenderViewObserver, observers_, 2587 FOR_EACH_OBSERVER(RenderViewObserver, observers_,
2558 DidChangeIcon(frame, type)); 2588 DidChangeIcon(frame, type));
2559 } 2589 }
2560 2590
2561 void RenderViewImpl::didFinishDocumentLoad(WebFrame* frame) { 2591 void RenderViewImpl::didFinishDocumentLoad(WebFrame* frame) {
2562 WebDataSource* ds = frame->dataSource(); 2592 WebDataSource* ds = frame->dataSource();
2563 NavigationState* navigation_state = NavigationState::FromDataSource(ds); 2593 DocumentState* document_state = DocumentState::FromDataSource(ds);
2564 DCHECK(navigation_state); 2594 document_state->set_finish_document_load_time(Time::Now());
2565 navigation_state->set_finish_document_load_time(Time::Now());
2566 2595
2567 Send(new ViewHostMsg_DocumentLoadedInFrame(routing_id_, frame->identifier())); 2596 Send(new ViewHostMsg_DocumentLoadedInFrame(routing_id_, frame->identifier()));
2568 2597
2569 FOR_EACH_OBSERVER(RenderViewObserver, observers_, 2598 FOR_EACH_OBSERVER(RenderViewObserver, observers_,
2570 DidFinishDocumentLoad(frame)); 2599 DidFinishDocumentLoad(frame));
2571 2600
2572 // Check whether we have new encoding name. 2601 // Check whether we have new encoding name.
2573 UpdateEncoding(frame, frame->view()->pageEncoding().utf8()); 2602 UpdateEncoding(frame, frame->view()->pageEncoding().utf8());
2574 } 2603 }
2575 2604
2576 void RenderViewImpl::didHandleOnloadEvents(WebFrame* frame) { 2605 void RenderViewImpl::didHandleOnloadEvents(WebFrame* frame) {
2577 if (webview()->mainFrame() == frame) { 2606 if (webview()->mainFrame() == frame) {
2578 Send(new ViewHostMsg_DocumentOnLoadCompletedInMainFrame(routing_id_, 2607 Send(new ViewHostMsg_DocumentOnLoadCompletedInMainFrame(routing_id_,
2579 page_id_)); 2608 page_id_));
2580 } 2609 }
2581 } 2610 }
2582 2611
2583 void RenderViewImpl::didFailLoad(WebFrame* frame, const WebURLError& error) { 2612 void RenderViewImpl::didFailLoad(WebFrame* frame, const WebURLError& error) {
2584 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidFailLoad(frame, error)); 2613 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidFailLoad(frame, error));
2585 } 2614 }
2586 2615
2587 void RenderViewImpl::didFinishLoad(WebFrame* frame) { 2616 void RenderViewImpl::didFinishLoad(WebFrame* frame) {
2588 WebDataSource* ds = frame->dataSource(); 2617 WebDataSource* ds = frame->dataSource();
2589 NavigationState* navigation_state = NavigationState::FromDataSource(ds); 2618 DocumentState* document_state = DocumentState::FromDataSource(ds);
2590 DCHECK(navigation_state); 2619 if (document_state->finish_load_time().is_null())
2591 navigation_state->set_finish_load_time(Time::Now()); 2620 document_state->set_finish_load_time(Time::Now());
2592 2621
2593 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidFinishLoad(frame)); 2622 FOR_EACH_OBSERVER(RenderViewObserver, observers_, DidFinishLoad(frame));
2594 2623
2595 Send(new ViewHostMsg_DidFinishLoad(routing_id_, frame->identifier())); 2624 Send(new ViewHostMsg_DidFinishLoad(routing_id_, frame->identifier()));
2596 } 2625 }
2597 2626
2598 void RenderViewImpl::didNavigateWithinPage( 2627 void RenderViewImpl::didNavigateWithinPage(
2599 WebFrame* frame, bool is_new_navigation) { 2628 WebFrame* frame, bool is_new_navigation) {
2600 // If this was a reference fragment navigation that we initiated, then we 2629 // If this was a reference fragment navigation that we initiated, then we
2601 // could end up having a non-null pending navigation state. We just need to 2630 // could end up having a non-null pending navigation params. We just need to
2602 // update the ExtraData on the datasource so that others who read the 2631 // update the ExtraData on the datasource so that others who read the
2603 // ExtraData will get the new NavigationState. Similarly, if we did not 2632 // ExtraData will get the new NavigationState. Similarly, if we did not
2604 // initiate this navigation, then we need to take care to reset any pre- 2633 // initiate this navigation, then we need to take care to reset any pre-
2605 // existing navigation state to a content-initiated navigation state. 2634 // existing navigation state to a content-initiated navigation state.
2606 // DidCreateDataSource conveniently takes care of this for us. 2635 // DidCreateDataSource conveniently takes care of this for us.
2607 didCreateDataSource(frame, frame->dataSource()); 2636 didCreateDataSource(frame, frame->dataSource());
2608 2637
2609 NavigationState* new_state = 2638 DocumentState* document_state =
2610 NavigationState::FromDataSource(frame->dataSource()); 2639 DocumentState::FromDataSource(frame->dataSource());
2640 NavigationState* new_state = document_state->navigation_state();
2611 new_state->set_was_within_same_page(true); 2641 new_state->set_was_within_same_page(true);
2612 2642
2613 didCommitProvisionalLoad(frame, is_new_navigation); 2643 didCommitProvisionalLoad(frame, is_new_navigation);
2614 2644
2615 WebDataSource* datasource = frame->view()->mainFrame()->dataSource(); 2645 WebDataSource* datasource = frame->view()->mainFrame()->dataSource();
2616 UpdateTitle(frame, datasource->pageTitle(), datasource->pageTitleDirection()); 2646 UpdateTitle(frame, datasource->pageTitle(), datasource->pageTitleDirection());
2617 } 2647 }
2618 2648
2619 void RenderViewImpl::didUpdateCurrentHistoryItem(WebFrame* frame) { 2649 void RenderViewImpl::didUpdateCurrentHistoryItem(WebFrame* frame) {
2620 StartNavStateSyncTimerIfNecessary(); 2650 StartNavStateSyncTimerIfNecessary();
(...skipping 17 matching lines...) Expand all
2638 provisional_data_source ? provisional_data_source : top_data_source; 2668 provisional_data_source ? provisional_data_source : top_data_source;
2639 2669
2640 GURL request_url(request.url()); 2670 GURL request_url(request.url());
2641 GURL new_url; 2671 GURL new_url;
2642 if (content::GetContentClient()->renderer()->WillSendRequest( 2672 if (content::GetContentClient()->renderer()->WillSendRequest(
2643 frame, request_url, &new_url)) { 2673 frame, request_url, &new_url)) {
2644 request.setURL(WebURL(new_url)); 2674 request.setURL(WebURL(new_url));
2645 } 2675 }
2646 2676
2647 content::PageTransition transition_type = content::PAGE_TRANSITION_LINK; 2677 content::PageTransition transition_type = content::PAGE_TRANSITION_LINK;
2648 NavigationState* data_state = NavigationState::FromDataSource(data_source); 2678 DocumentState* document_state = DocumentState::FromDataSource(data_source);
2649 if (data_state) { 2679 NavigationState* navigation_state = document_state->navigation_state();
2650 if (data_state->is_cache_policy_override_set()) 2680 if (document_state) {
2651 request.setCachePolicy(data_state->cache_policy_override()); 2681 if (document_state->is_cache_policy_override_set())
2652 transition_type = data_state->transition_type(); 2682 request.setCachePolicy(document_state->cache_policy_override());
2683 transition_type = navigation_state->transition_type();
2653 } 2684 }
2654 2685
2655 request.setExtraData( 2686 request.setExtraData(
2656 new RequestExtraData((frame == top_frame), 2687 new RequestExtraData((frame == top_frame),
2657 frame->identifier(), 2688 frame->identifier(),
2658 frame->parent() == top_frame, 2689 frame->parent() == top_frame,
2659 frame->parent() ? frame->parent()->identifier() : -1, 2690 frame->parent() ? frame->parent()->identifier() : -1,
2660 transition_type)); 2691 transition_type));
2661 2692
2662 NavigationState* top_data_state = 2693 DocumentState* top_document_state =
2663 NavigationState::FromDataSource(top_data_source); 2694 DocumentState::FromDataSource(top_data_source);
2664 // TODO(gavinp): separate out prefetching and prerender field trials 2695 // TODO(gavinp): separate out prefetching and prerender field trials
2665 // if the rel=prerender rel type is sticking around. 2696 // if the rel=prerender rel type is sticking around.
2666 if (top_data_state && 2697 if (top_document_state &&
2667 (request.targetType() == WebURLRequest::TargetIsPrefetch || 2698 (request.targetType() == WebURLRequest::TargetIsPrefetch ||
2668 request.targetType() == WebURLRequest::TargetIsPrerender)) 2699 request.targetType() == WebURLRequest::TargetIsPrerender))
2669 top_data_state->set_was_prefetcher(true); 2700 top_document_state->set_was_prefetcher(true);
2670 2701
2671 request.setRequestorID(routing_id_); 2702 request.setRequestorID(routing_id_);
2672 request.setHasUserGesture(frame->isProcessingUserGesture()); 2703 request.setHasUserGesture(frame->isProcessingUserGesture());
2673 2704
2674 if (!renderer_preferences_.enable_referrers) 2705 if (!renderer_preferences_.enable_referrers)
2675 request.clearHTTPHeaderField("Referer"); 2706 request.clearHTTPHeaderField("Referer");
2676 } 2707 }
2677 2708
2678 void RenderViewImpl::didReceiveResponse( 2709 void RenderViewImpl::didReceiveResponse(
2679 WebFrame* frame, unsigned identifier, const WebURLResponse& response) { 2710 WebFrame* frame, unsigned identifier, const WebURLResponse& response) {
2680 2711
2681 // Only do this for responses that correspond to a provisional data source 2712 // Only do this for responses that correspond to a provisional data source
2682 // of the top-most frame. If we have a provisional data source, then we 2713 // of the top-most frame. If we have a provisional data source, then we
2683 // can't have any sub-resources yet, so we know that this response must 2714 // can't have any sub-resources yet, so we know that this response must
2684 // correspond to a frame load. 2715 // correspond to a frame load.
2685 if (!frame->provisionalDataSource() || frame->parent()) 2716 if (!frame->provisionalDataSource() || frame->parent())
2686 return; 2717 return;
2687 2718
2688 // If we are in view source mode, then just let the user see the source of 2719 // If we are in view source mode, then just let the user see the source of
2689 // the server's error page. 2720 // the server's error page.
2690 if (frame->isViewSourceModeEnabled()) 2721 if (frame->isViewSourceModeEnabled())
2691 return; 2722 return;
2692 2723
2693 NavigationState* navigation_state = 2724 DocumentState* document_state =
2694 NavigationState::FromDataSource(frame->provisionalDataSource()); 2725 DocumentState::FromDataSource(frame->provisionalDataSource());
2695 CHECK(navigation_state);
2696 int http_status_code = response.httpStatusCode(); 2726 int http_status_code = response.httpStatusCode();
2697 2727
2698 // Record page load flags. 2728 // Record page load flags.
2699 navigation_state->set_was_fetched_via_spdy(response.wasFetchedViaSPDY()); 2729 document_state->set_was_fetched_via_spdy(response.wasFetchedViaSPDY());
2700 navigation_state->set_was_npn_negotiated(response.wasNpnNegotiated()); 2730 document_state->set_was_npn_negotiated(response.wasNpnNegotiated());
2701 navigation_state->set_was_alternate_protocol_available( 2731 document_state->set_was_alternate_protocol_available(
2702 response.wasAlternateProtocolAvailable()); 2732 response.wasAlternateProtocolAvailable());
2703 navigation_state->set_was_fetched_via_proxy(response.wasFetchedViaProxy()); 2733 document_state->set_was_fetched_via_proxy(response.wasFetchedViaProxy());
2704 navigation_state->set_http_status_code(http_status_code); 2734 document_state->set_http_status_code(http_status_code);
2705 // Whether or not the http status code actually corresponds to an error is 2735 // Whether or not the http status code actually corresponds to an error is
2706 // only checked when the page is done loading, if |use_error_page| is 2736 // only checked when the page is done loading, if |use_error_page| is
2707 // still true. 2737 // still true.
2708 navigation_state->set_use_error_page(true); 2738 document_state->set_use_error_page(true);
2709 } 2739 }
2710 2740
2711 void RenderViewImpl::didFinishResourceLoad( 2741 void RenderViewImpl::didFinishResourceLoad(
2712 WebFrame* frame, unsigned identifier) { 2742 WebFrame* frame, unsigned identifier) {
2713 NavigationState* navigation_state = 2743 DocumentState* document_state =
2714 NavigationState::FromDataSource(frame->dataSource()); 2744 DocumentState::FromDataSource(frame->dataSource());
2715 if (!navigation_state->use_error_page()) 2745 if (!document_state->use_error_page())
2716 return; 2746 return;
2717 2747
2718 // Do not show error page when DevTools is attached. 2748 // Do not show error page when DevTools is attached.
2719 if (devtools_agent_->IsAttached()) 2749 if (devtools_agent_->IsAttached())
2720 return; 2750 return;
2721 2751
2722 // Display error page, if appropriate. 2752 // Display error page, if appropriate.
2723 int http_status_code = navigation_state->http_status_code(); 2753 int http_status_code = document_state->http_status_code();
2724 if (http_status_code == 404) { 2754 if (http_status_code == 404) {
2725 // On 404s, try a remote search page as a fallback. 2755 // On 404s, try a remote search page as a fallback.
2726 const GURL& document_url = frame->document().url(); 2756 const GURL& document_url = frame->document().url();
2727 2757
2728 const GURL& error_page_url = 2758 const GURL& error_page_url =
2729 GetAlternateErrorPageURL(document_url, HTTP_404); 2759 GetAlternateErrorPageURL(document_url, HTTP_404);
2730 if (error_page_url.is_valid()) { 2760 if (error_page_url.is_valid()) {
2731 WebURLError original_error; 2761 WebURLError original_error;
2732 original_error.domain = "http"; 2762 original_error.domain = "http";
2733 original_error.reason = 404; 2763 original_error.reason = 404;
2734 original_error.unreachableURL = document_url; 2764 original_error.unreachableURL = document_url;
2735 2765
2736 navigation_state->set_alt_error_page_fetcher( 2766 document_state->set_alt_error_page_fetcher(
2737 new AltErrorPageResourceFetcher( 2767 new AltErrorPageResourceFetcher(
2738 error_page_url, frame, original_error, 2768 error_page_url, frame, original_error,
2739 NewCallback(this, &RenderViewImpl::AltErrorPageFinished))); 2769 NewCallback(this, &RenderViewImpl::AltErrorPageFinished)));
2740 return; 2770 return;
2741 } 2771 }
2742 } 2772 }
2743 2773
2744 std::string error_domain; 2774 std::string error_domain;
2745 if (content::GetContentClient()->renderer()->HasErrorPage( 2775 if (content::GetContentClient()->renderer()->HasErrorPage(
2746 http_status_code, &error_domain)) { 2776 http_status_code, &error_domain)) {
(...skipping 1239 matching lines...) Expand 10 before | Expand all | Expand 10 after
3986 // Load an empty page first so there is an immediate response to the error, 4016 // Load an empty page first so there is an immediate response to the error,
3987 // and then kick off a request for the alternate error page. 4017 // and then kick off a request for the alternate error page.
3988 frame->loadHTMLString(std::string(), 4018 frame->loadHTMLString(std::string(),
3989 GURL(chrome::kUnreachableWebDataURL), 4019 GURL(chrome::kUnreachableWebDataURL),
3990 error.unreachableURL, 4020 error.unreachableURL,
3991 replace); 4021 replace);
3992 4022
3993 // Now, create a fetcher for the error page and associate it with the data 4023 // Now, create a fetcher for the error page and associate it with the data
3994 // source we just created via the LoadHTMLString call. That way if another 4024 // source we just created via the LoadHTMLString call. That way if another
3995 // navigation occurs, the fetcher will get destroyed. 4025 // navigation occurs, the fetcher will get destroyed.
3996 NavigationState* navigation_state = 4026 DocumentState* document_state =
3997 NavigationState::FromDataSource(frame->provisionalDataSource()); 4027 DocumentState::FromDataSource(frame->provisionalDataSource());
3998 navigation_state->set_alt_error_page_fetcher( 4028 document_state->set_alt_error_page_fetcher(
3999 new AltErrorPageResourceFetcher( 4029 new AltErrorPageResourceFetcher(
4000 error_page_url, frame, error, 4030 error_page_url, frame, error,
4001 NewCallback(this, &RenderViewImpl::AltErrorPageFinished))); 4031 NewCallback(this, &RenderViewImpl::AltErrorPageFinished)));
4002 return true; 4032 return true;
4003 } 4033 }
4004 4034
4005 void RenderViewImpl::AltErrorPageFinished(WebFrame* frame, 4035 void RenderViewImpl::AltErrorPageFinished(WebFrame* frame,
4006 const WebURLError& original_error, 4036 const WebURLError& original_error,
4007 const std::string& html) { 4037 const std::string& html) {
4008 // Here, we replace the blank page we loaded previously. 4038 // Here, we replace the blank page we loaded previously.
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
4042 // our set, possibly invalidating the iterator. So we iterate on a copy that 4072 // our set, possibly invalidating the iterator. So we iterate on a copy that
4043 // won't change out from under us. 4073 // won't change out from under us.
4044 pepper_delegate_.ViewFlushedPaint(); 4074 pepper_delegate_.ViewFlushedPaint();
4045 4075
4046 WebFrame* main_frame = webview()->mainFrame(); 4076 WebFrame* main_frame = webview()->mainFrame();
4047 4077
4048 // If we have a provisional frame we are between the start and commit stages 4078 // If we have a provisional frame we are between the start and commit stages
4049 // of loading and we don't want to save stats. 4079 // of loading and we don't want to save stats.
4050 if (!main_frame->provisionalDataSource()) { 4080 if (!main_frame->provisionalDataSource()) {
4051 WebDataSource* ds = main_frame->dataSource(); 4081 WebDataSource* ds = main_frame->dataSource();
4052 NavigationState* navigation_state = NavigationState::FromDataSource(ds); 4082 DocumentState* document_state = DocumentState::FromDataSource(ds);
4053 DCHECK(navigation_state);
4054 4083
4055 // TODO(jar): The following code should all be inside a method, probably in 4084 // TODO(jar): The following code should all be inside a method, probably in
4056 // NavigatorState. 4085 // NavigatorState.
4057 Time now = Time::Now(); 4086 Time now = Time::Now();
4058 if (navigation_state->first_paint_time().is_null()) { 4087 if (document_state->first_paint_time().is_null()) {
4059 navigation_state->set_first_paint_time(now); 4088 document_state->set_first_paint_time(now);
4060 } 4089 }
4061 if (navigation_state->first_paint_after_load_time().is_null() && 4090 if (document_state->first_paint_after_load_time().is_null() &&
4062 !navigation_state->finish_load_time().is_null()) { 4091 !document_state->finish_load_time().is_null()) {
4063 navigation_state->set_first_paint_after_load_time(now); 4092 document_state->set_first_paint_after_load_time(now);
4064 } 4093 }
4065 } 4094 }
4066 } 4095 }
4067 4096
4068 void RenderViewImpl::OnViewContextSwapBuffersPosted() { 4097 void RenderViewImpl::OnViewContextSwapBuffersPosted() {
4069 RenderWidget::OnSwapBuffersPosted(); 4098 RenderWidget::OnSwapBuffersPosted();
4070 } 4099 }
4071 4100
4072 void RenderViewImpl::OnViewContextSwapBuffersComplete() { 4101 void RenderViewImpl::OnViewContextSwapBuffersComplete() {
4073 RenderWidget::OnSwapBuffersComplete(); 4102 RenderWidget::OnSwapBuffersComplete();
(...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after
4704 return webview()->settings()->useThreadedCompositor(); 4733 return webview()->settings()->useThreadedCompositor();
4705 } 4734 }
4706 4735
4707 void RenderViewImpl::OnJavaBridgeInit( 4736 void RenderViewImpl::OnJavaBridgeInit(
4708 const IPC::ChannelHandle& channel_handle) { 4737 const IPC::ChannelHandle& channel_handle) {
4709 DCHECK(!java_bridge_dispatcher_.get()); 4738 DCHECK(!java_bridge_dispatcher_.get());
4710 #if defined(ENABLE_JAVA_BRIDGE) 4739 #if defined(ENABLE_JAVA_BRIDGE)
4711 java_bridge_dispatcher_.reset(new JavaBridgeDispatcher(this, channel_handle)); 4740 java_bridge_dispatcher_.reset(new JavaBridgeDispatcher(this, channel_handle));
4712 #endif 4741 #endif
4713 } 4742 }
OLDNEW
« no previous file with comments | « content/renderer/render_view_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698