Chromium Code Reviews| Index: content/renderer/render_frame_impl.cc | 
| diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc | 
| index 84891997f0ec8c558433ddf78ed728162c07047c..4c46aadf142066626a46c3bf2a3a761af0fe8b22 100644 | 
| --- a/content/renderer/render_frame_impl.cc | 
| +++ b/content/renderer/render_frame_impl.cc | 
| @@ -137,6 +137,7 @@ | 
| #include "third_party/WebKit/public/web/WebMediaStreamRegistry.h" | 
| #include "third_party/WebKit/public/web/WebNavigationPolicy.h" | 
| #include "third_party/WebKit/public/web/WebPageSerializer.h" | 
| +#include "third_party/WebKit/public/web/WebPerformance.h" | 
| #include "third_party/WebKit/public/web/WebPlugin.h" | 
| #include "third_party/WebKit/public/web/WebPluginParams.h" | 
| #include "third_party/WebKit/public/web/WebRange.h" | 
| @@ -423,6 +424,7 @@ bool IsTopLevelNavigation(WebFrame* frame) { | 
| } | 
| WebURLRequest CreateURLRequestForNavigation( | 
| + const RequestNavigationParams& request_params, | 
| const CommonNavigationParams& common_params, | 
| scoped_ptr<StreamOverrideParameters> stream_override, | 
| bool is_view_source_mode_enabled) { | 
| @@ -443,41 +445,34 @@ WebURLRequest CreateURLRequestForNavigation( | 
| extra_data->set_stream_override(stream_override.Pass()); | 
| request.setExtraData(extra_data); | 
| - // Set the ui timestamp for this navigation. Currently the timestamp here is | 
| - // only non empty when the navigation was triggered by an Android intent. The | 
| - // timestamp is converted to a double version supported by blink. It will be | 
| - // passed back to the browser in the DidCommitProvisionalLoad and the | 
| - // DocumentLoadComplete IPCs. | 
| - base::TimeDelta ui_timestamp = common_params.ui_timestamp - base::TimeTicks(); | 
| - request.setUiStartTime(ui_timestamp.InSecondsF()); | 
| - request.setInputPerfMetricReportPolicy( | 
| - static_cast<WebURLRequest::InputToLoadPerfMetricReportPolicy>( | 
| - common_params.report_type)); | 
| - return request; | 
| -} | 
| - | 
| -void UpdateFrameNavigationTiming(WebFrame* frame, | 
| - base::TimeTicks browser_navigation_start, | 
| - base::TimeTicks renderer_navigation_start) { | 
| // The browser provides the navigation_start time to bootstrap the | 
| // Navigation Timing information for the browser-initiated navigations. In | 
| // case of cross-process navigations, this carries over the time of | 
| // finishing the onbeforeunload handler of the previous page. | 
| - DCHECK(!browser_navigation_start.is_null()); | 
| - if (frame->provisionalDataSource()) { | 
| + // TODO(csharrison) should we only do this for WebFrameLoadType::Standard? | 
| + if (!request_params.browser_navigation_start.is_null()) { | 
| // |browser_navigation_start| is likely before this process existed, so we | 
| // can't use InterProcessTimeTicksConverter. We need at least to ensure | 
| // that the browser-side navigation start we set is not later than the one | 
| // on the renderer side. | 
| base::TimeTicks navigation_start = std::min( | 
| - browser_navigation_start, renderer_navigation_start); | 
| + request_params.browser_navigation_start, base::TimeTicks::Now()); | 
| double navigation_start_seconds = | 
| (navigation_start - base::TimeTicks()).InSecondsF(); | 
| - frame->provisionalDataSource()->setNavigationStartTime( | 
| - navigation_start_seconds); | 
| - // TODO(clamy): We need to provide additional timing values for the | 
| - // Navigation Timing API to work with browser-side navigations. | 
| + request.setBrowserNavigationStartTime(navigation_start_seconds); | 
| 
 
clamy
2015/10/28 12:40:01
Instead of adding the start time to the WebURLRequ
 
Charlie Harrison
2015/10/28 14:45:00
Good idea! Will do that.
 
 | 
| } | 
| + | 
| + // Set the ui timestamp for this navigation. Currently the timestamp here is | 
| + // only non empty when the navigation was triggered by an Android intent. The | 
| + // timestamp is converted to a double version supported by blink. It will be | 
| + // passed back to the browser in the DidCommitProvisionalLoad and the | 
| + // DocumentLoadComplete IPCs. | 
| + base::TimeDelta ui_timestamp = common_params.ui_timestamp - base::TimeTicks(); | 
| + request.setUiStartTime(ui_timestamp.InSecondsF()); | 
| + request.setInputPerfMetricReportPolicy( | 
| + static_cast<WebURLRequest::InputToLoadPerfMetricReportPolicy>( | 
| + common_params.report_type)); | 
| + return request; | 
| } | 
| // PlzNavigate | 
| @@ -2703,12 +2698,20 @@ void RenderFrameImpl::didStartProvisionalLoad(blink::WebLocalFrame* frame, | 
| ->set_transition_type(ui::PAGE_TRANSITION_AUTO_SUBFRAME); | 
| } | 
| + // See if we have a better timestamp from a browser initiated navigation. | 
| + // Otherwise use the renderer-marked timestamp. | 
| + DCHECK(ds->getNavigationStartTime()); | 
| + double browser_navigation_start = ds->request().browserNavigationStartTime(); | 
| + double navigation_start = | 
| + browser_navigation_start ? browser_navigation_start | 
| + : ds->getNavigationStartTime(); | 
| + | 
| FOR_EACH_OBSERVER(RenderViewObserver, render_view_->observers(), | 
| DidStartProvisionalLoad(frame)); | 
| FOR_EACH_OBSERVER(RenderFrameObserver, observers_, DidStartProvisionalLoad()); | 
| Send(new FrameHostMsg_DidStartProvisionalLoadForFrame( | 
| - routing_id_, ds->request().url())); | 
| + routing_id_, ds->request().url(), navigation_start)); | 
| } | 
| void RenderFrameImpl::didReceiveServerRedirectForProvisionalLoad( | 
| @@ -4312,14 +4315,16 @@ void RenderFrameImpl::OnFailedNavigation( | 
| // Inform the browser of the start of the provisional load. This is needed so | 
| // that the load is properly tracked by the WebNavigation API. | 
| + base::TimeDelta navigation_start = | 
| + (request_params.browser_navigation_start - base::TimeTicks()); | 
| Send(new FrameHostMsg_DidStartProvisionalLoadForFrame( | 
| - routing_id_, common_params.url)); | 
| + routing_id_, common_params.url, navigation_start.InSecondsF())); | 
| 
 
clamy
2015/10/28 12:40:01
nit: in PlzNavigate, you don't really care about w
 
 | 
| // Send the provisional load failure. | 
| blink::WebURLError error = | 
| CreateWebURLError(common_params.url, has_stale_copy_in_cache, error_code); | 
| WebURLRequest failed_request = CreateURLRequestForNavigation( | 
| - common_params, scoped_ptr<StreamOverrideParameters>(), | 
| + request_params, common_params, scoped_ptr<StreamOverrideParameters>(), | 
| frame_->isViewSourceModeEnabled()); | 
| SendFailedProvisionalLoad(failed_request, error, frame_); | 
| @@ -4655,7 +4660,8 @@ void RenderFrameImpl::NavigateInternal( | 
| bool should_load_request = false; | 
| WebHistoryItem item_for_history_navigation; | 
| WebURLRequest request = CreateURLRequestForNavigation( | 
| - common_params, stream_params.Pass(), frame_->isViewSourceModeEnabled()); | 
| + request_params, common_params, stream_params.Pass(), | 
| + frame_->isViewSourceModeEnabled()); | 
| #if defined(OS_ANDROID) | 
| request.setHasUserGesture(start_params.has_user_gesture); | 
| #endif | 
| @@ -4780,10 +4786,6 @@ void RenderFrameImpl::NavigateInternal( | 
| } | 
| if (should_load_request) { | 
| - // Record this before starting the load. We need a lower bound of this | 
| - // time to sanitize the navigationStart override set below. | 
| - base::TimeTicks renderer_navigation_start = base::TimeTicks::Now(); | 
| - | 
| // Perform a navigation to a data url if needed. | 
| if (!common_params.base_url_for_data_url.is_empty() || | 
| (browser_side_navigation && | 
| @@ -4794,12 +4796,12 @@ void RenderFrameImpl::NavigateInternal( | 
| frame_->toWebLocalFrame()->load(request, load_type, | 
| item_for_history_navigation); | 
| } | 
| - | 
| - if (load_type == blink::WebFrameLoadType::Standard) { | 
| - UpdateFrameNavigationTiming(frame_, | 
| - request_params.browser_navigation_start, | 
| - renderer_navigation_start); | 
| + if (load_type == blink::WebFrameLoadType::Standard && | 
| + frame_->provisionalDataSource()) { | 
| + frame_->provisionalDataSource()->setNavigationStartTime( | 
| + request.browserNavigationStartTime()); | 
| } | 
| + | 
| } | 
| // In case LoadRequest failed before didCreateDataSource was called. | 
| @@ -5022,6 +5024,8 @@ void RenderFrameImpl::BeginNavigation(blink::WebURLRequest* request) { | 
| GetRequestContextFrameTypeForWebURLRequest(*request) == | 
| REQUEST_CONTEXT_FRAME_TYPE_NESTED); | 
| + double navigation_start_seconds = | 
| + (base::TimeTicks::Now() - base::TimeTicks()).InSecondsF(); | 
| Send(new FrameHostMsg_BeginNavigation( | 
| routing_id_, | 
| MakeCommonNavigationParams(request, should_replace_current_entry), | 
| @@ -5029,7 +5033,8 @@ void RenderFrameImpl::BeginNavigation(blink::WebURLRequest* request) { | 
| request->httpMethod().latin1(), GetWebURLRequestHeaders(*request), | 
| GetLoadFlagsForWebURLRequest(*request), request->hasUserGesture(), | 
| request->skipServiceWorker(), | 
| - GetRequestContextTypeForWebURLRequest(*request)), | 
| + GetRequestContextTypeForWebURLRequest(*request), | 
| + navigation_start_seconds), | 
| GetRequestBodyForWebURLRequest(*request))); | 
| } |