OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 #ifndef COMPONENTS_PAGE_LOAD_METRICS_BROWSER_METRICS_WEB_CONTENTS_OBSERVER_H_ | 5 #ifndef COMPONENTS_PAGE_LOAD_METRICS_BROWSER_METRICS_WEB_CONTENTS_OBSERVER_H_ |
6 #define COMPONENTS_PAGE_LOAD_METRICS_BROWSER_METRICS_WEB_CONTENTS_OBSERVER_H_ | 6 #define COMPONENTS_PAGE_LOAD_METRICS_BROWSER_METRICS_WEB_CONTENTS_OBSERVER_H_ |
7 | 7 |
8 #include <map> | 8 #include <map> |
9 #include <memory> | 9 #include <memory> |
10 #include <vector> | 10 #include <vector> |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 bool is_certainly_browser_timestamp); | 172 bool is_certainly_browser_timestamp); |
173 void UpdateAbort(UserAbortType abort_type, | 173 void UpdateAbort(UserAbortType abort_type, |
174 base::TimeTicks timestamp, | 174 base::TimeTicks timestamp, |
175 bool is_certainly_browser_timestamp); | 175 bool is_certainly_browser_timestamp); |
176 | 176 |
177 // This method returns true if this page load has been aborted with type of | 177 // This method returns true if this page load has been aborted with type of |
178 // ABORT_OTHER, and the |abort_cause_time| is within a sufficiently close | 178 // ABORT_OTHER, and the |abort_cause_time| is within a sufficiently close |
179 // delta to when it was aborted. Note that only provisional loads can be | 179 // delta to when it was aborted. Note that only provisional loads can be |
180 // aborted with ABORT_OTHER. While this heuristic is coarse, it works better | 180 // aborted with ABORT_OTHER. While this heuristic is coarse, it works better |
181 // and is simpler than other feasible methods. See https://goo.gl/WKRG98. | 181 // and is simpler than other feasible methods. See https://goo.gl/WKRG98. |
182 bool IsLikelyProvisionalAbort(base::TimeTicks abort_cause_time); | 182 bool IsLikelyProvisionalAbort(base::TimeTicks abort_cause_time) const; |
183 | 183 |
184 bool MatchesOriginalNavigation(content::NavigationHandle* navigation_handle); | 184 bool MatchesOriginalNavigation(content::NavigationHandle* navigation_handle); |
185 | 185 |
186 // Only valid to call post-commit. | 186 // Only valid to call post-commit. |
187 const GURL& committed_url() const { | 187 const GURL& committed_url() const { |
188 DCHECK(!commit_time_.is_null()); | 188 DCHECK(!commit_time_.is_null()); |
189 return url_; | 189 return url_; |
190 } | 190 } |
191 | 191 |
192 base::TimeTicks navigation_start() const { return navigation_start_; } | 192 base::TimeTicks navigation_start() const { return navigation_start_; } |
193 | 193 |
194 PageLoadExtraInfo ComputePageLoadExtraInfo(); | 194 PageLoadExtraInfo ComputePageLoadExtraInfo(); |
195 | 195 |
| 196 ui::PageTransition page_transition() const { return page_transition_; } |
| 197 |
196 private: | 198 private: |
197 // This function converts a TimeTicks value taken in the browser process | 199 // This function converts a TimeTicks value taken in the browser process |
198 // to navigation_start_ if: | 200 // to navigation_start_ if: |
199 // - base::TimeTicks is not comparable across processes because the clock | 201 // - base::TimeTicks is not comparable across processes because the clock |
200 // is not system wide monotonic. | 202 // is not system wide monotonic. |
201 // - *event_time < navigation_start_ | 203 // - *event_time < navigation_start_ |
202 void ClampBrowserTimestampIfInterProcessTimeTickSkew( | 204 void ClampBrowserTimestampIfInterProcessTimeTickSkew( |
203 base::TimeTicks* event_time); | 205 base::TimeTicks* event_time); |
204 | 206 |
205 void UpdateAbortInternal(UserAbortType abort_type, | 207 void UpdateAbortInternal(UserAbortType abort_type, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 // We record separate metrics for events that occur after a background, | 239 // We record separate metrics for events that occur after a background, |
238 // because metrics like layout/paint are delayed artificially | 240 // because metrics like layout/paint are delayed artificially |
239 // when they occur in the background. | 241 // when they occur in the background. |
240 base::TimeTicks background_time_; | 242 base::TimeTicks background_time_; |
241 base::TimeTicks foreground_time_; | 243 base::TimeTicks foreground_time_; |
242 bool started_in_foreground_; | 244 bool started_in_foreground_; |
243 | 245 |
244 PageLoadTiming timing_; | 246 PageLoadTiming timing_; |
245 PageLoadMetadata metadata_; | 247 PageLoadMetadata metadata_; |
246 | 248 |
| 249 ui::PageTransition page_transition_; |
| 250 |
247 // This is a subtle member. If a provisional load A gets aborted by | 251 // This is a subtle member. If a provisional load A gets aborted by |
248 // provisional load B, which gets aborted by C that eventually commits, then | 252 // provisional load B, which gets aborted by C that eventually commits, then |
249 // there exists an abort chain of length 2, starting at A's navigation_start. | 253 // there exists an abort chain of length 2, starting at A's navigation_start. |
250 // This is useful because it allows histograming abort chain lengths based on | 254 // This is useful because it allows histograming abort chain lengths based on |
251 // what the last load's transition type is. i.e. holding down F-5 to spam | 255 // what the last load's transition type is. i.e. holding down F-5 to spam |
252 // reload will produce a long chain with the RELOAD transition. | 256 // reload will produce a long chain with the RELOAD transition. |
253 const int aborted_chain_size_; | 257 const int aborted_chain_size_; |
254 | 258 |
255 // This member counts consecutive provisional aborts that share a url. It will | 259 // This member counts consecutive provisional aborts that share a url. It will |
256 // always be less than or equal to |aborted_chain_size_|. | 260 // always be less than or equal to |aborted_chain_size_|. |
(...skipping 20 matching lines...) Expand all Loading... |
277 content::WebContents* web_contents, | 281 content::WebContents* web_contents, |
278 std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface); | 282 std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface); |
279 MetricsWebContentsObserver( | 283 MetricsWebContentsObserver( |
280 content::WebContents* web_contents, | 284 content::WebContents* web_contents, |
281 std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface); | 285 std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface); |
282 ~MetricsWebContentsObserver() override; | 286 ~MetricsWebContentsObserver() override; |
283 | 287 |
284 // content::WebContentsObserver implementation: | 288 // content::WebContentsObserver implementation: |
285 bool OnMessageReceived(const IPC::Message& message, | 289 bool OnMessageReceived(const IPC::Message& message, |
286 content::RenderFrameHost* render_frame_host) override; | 290 content::RenderFrameHost* render_frame_host) override; |
287 void DidStartNavigation( | |
288 content::NavigationHandle* navigation_handle) override; | |
289 void DidFinishNavigation( | 291 void DidFinishNavigation( |
290 content::NavigationHandle* navigation_handle) override; | 292 content::NavigationHandle* navigation_handle) override; |
291 void DidRedirectNavigation( | 293 void DidRedirectNavigation( |
292 content::NavigationHandle* navigation_handle) override; | 294 content::NavigationHandle* navigation_handle) override; |
293 void NavigationStopped() override; | 295 void NavigationStopped() override; |
294 void OnInputEvent(const blink::WebInputEvent& event) override; | 296 void OnInputEvent(const blink::WebInputEvent& event) override; |
295 void WasShown() override; | 297 void WasShown() override; |
296 void WasHidden() override; | 298 void WasHidden() override; |
297 void RenderProcessGone(base::TerminationStatus status) override; | 299 void RenderProcessGone(base::TerminationStatus status) override; |
298 void RenderViewHostChanged(content::RenderViewHost* old_host, | 300 void RenderViewHostChanged(content::RenderViewHost* old_host, |
299 content::RenderViewHost* new_host) override; | 301 content::RenderViewHost* new_host) override; |
300 | 302 |
| 303 // This method is forwarded from the MetricsNavigationThrottle. |
| 304 void WillStartNavigationRequest(content::NavigationHandle* navigation_handle); |
| 305 |
301 // This getter function is required for testing. | 306 // This getter function is required for testing. |
302 const PageLoadExtraInfo GetPageLoadExtraInfoForCommittedLoad(); | 307 const PageLoadExtraInfo GetPageLoadExtraInfoForCommittedLoad(); |
303 | 308 |
304 private: | 309 private: |
305 friend class content::WebContentsUserData<MetricsWebContentsObserver>; | 310 friend class content::WebContentsUserData<MetricsWebContentsObserver>; |
306 | 311 |
307 void HandleFailedNavigationForTrackedLoad( | 312 void HandleFailedNavigationForTrackedLoad( |
308 content::NavigationHandle* navigation_handle, | 313 content::NavigationHandle* navigation_handle, |
309 std::unique_ptr<PageLoadTracker> tracker); | 314 std::unique_ptr<PageLoadTracker> tracker); |
310 | 315 |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 | 367 |
363 // Has the MWCO observed at least one navigation? | 368 // Has the MWCO observed at least one navigation? |
364 bool has_navigated_; | 369 bool has_navigated_; |
365 | 370 |
366 DISALLOW_COPY_AND_ASSIGN(MetricsWebContentsObserver); | 371 DISALLOW_COPY_AND_ASSIGN(MetricsWebContentsObserver); |
367 }; | 372 }; |
368 | 373 |
369 } // namespace page_load_metrics | 374 } // namespace page_load_metrics |
370 | 375 |
371 #endif // COMPONENTS_PAGE_LOAD_METRICS_BROWSER_METRICS_WEB_CONTENTS_OBSERVER_H_ | 376 #endif // COMPONENTS_PAGE_LOAD_METRICS_BROWSER_METRICS_WEB_CONTENTS_OBSERVER_H_ |
OLD | NEW |