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 #include "components/page_load_metrics/browser/metrics_web_contents_observer.h" | 5 #include "components/page_load_metrics/browser/metrics_web_contents_observer.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <ostream> | 8 #include <ostream> |
9 #include <string> | 9 #include <string> |
10 #include <utility> | 10 #include <utility> |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
57 // Helper to allow use of Optional<> values in LOG() messages. | 57 // Helper to allow use of Optional<> values in LOG() messages. |
58 std::ostream& operator<<(std::ostream& os, | 58 std::ostream& operator<<(std::ostream& os, |
59 const base::Optional<base::TimeDelta>& opt) { | 59 const base::Optional<base::TimeDelta>& opt) { |
60 if (opt) | 60 if (opt) |
61 os << opt.value(); | 61 os << opt.value(); |
62 else | 62 else |
63 os << "(unset)"; | 63 os << "(unset)"; |
64 return os; | 64 return os; |
65 } | 65 } |
66 | 66 |
67 // The url we see from the renderer side is not always the same as what | |
68 // we see from the browser side (e.g. chrome://newtab). We want to be | |
69 // sure here that we aren't logging UMA for internal pages. | |
70 bool IsRelevantNavigation(content::NavigationHandle* navigation_handle, | |
71 const GURL& browser_url, | |
72 const std::string& mime_type) { | |
73 DCHECK(navigation_handle->HasCommitted()); | |
74 return navigation_handle->IsInMainFrame() && | |
75 !navigation_handle->IsSamePage() && | |
76 !navigation_handle->IsErrorPage() && | |
77 navigation_handle->GetURL().SchemeIsHTTPOrHTTPS() && | |
78 browser_url.SchemeIsHTTPOrHTTPS() && | |
79 (mime_type == "text/html" || mime_type == "application/xhtml+xml"); | |
80 } | |
81 | |
82 // If second is non-zero, first must also be non-zero and less than or equal to | 67 // If second is non-zero, first must also be non-zero and less than or equal to |
83 // second. | 68 // second. |
84 bool EventsInOrder(const base::Optional<base::TimeDelta>& first, | 69 bool EventsInOrder(const base::Optional<base::TimeDelta>& first, |
85 const base::Optional<base::TimeDelta>& second) { | 70 const base::Optional<base::TimeDelta>& second) { |
86 if (!second) { | 71 if (!second) { |
87 return true; | 72 return true; |
88 } | 73 } |
89 return first && first <= second; | 74 return first && first <= second; |
90 } | 75 } |
91 | 76 |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
216 UMA_HISTOGRAM_COUNTS(internal::kAbortChainSizeSameURL, | 201 UMA_HISTOGRAM_COUNTS(internal::kAbortChainSizeSameURL, |
217 aborted_chain_size_same_url); | 202 aborted_chain_size_same_url); |
218 } | 203 } |
219 } | 204 } |
220 | 205 |
221 void DispatchObserverTimingCallbacks(PageLoadMetricsObserver* observer, | 206 void DispatchObserverTimingCallbacks(PageLoadMetricsObserver* observer, |
222 const PageLoadTiming& last_timing, | 207 const PageLoadTiming& last_timing, |
223 const PageLoadTiming& new_timing, | 208 const PageLoadTiming& new_timing, |
224 const PageLoadMetadata& last_metadata, | 209 const PageLoadMetadata& last_metadata, |
225 const PageLoadExtraInfo& extra_info) { | 210 const PageLoadExtraInfo& extra_info) { |
226 observer->OnTimingUpdate(new_timing, extra_info); | 211 if (last_timing != new_timing) |
212 observer->OnTimingUpdate(new_timing, extra_info); | |
227 if (new_timing.dom_content_loaded_event_start && | 213 if (new_timing.dom_content_loaded_event_start && |
228 !last_timing.dom_content_loaded_event_start) | 214 !last_timing.dom_content_loaded_event_start) |
229 observer->OnDomContentLoadedEventStart(new_timing, extra_info); | 215 observer->OnDomContentLoadedEventStart(new_timing, extra_info); |
230 if (new_timing.load_event_start && !last_timing.load_event_start) | 216 if (new_timing.load_event_start && !last_timing.load_event_start) |
231 observer->OnLoadEventStart(new_timing, extra_info); | 217 observer->OnLoadEventStart(new_timing, extra_info); |
232 if (new_timing.first_layout && !last_timing.first_layout) | 218 if (new_timing.first_layout && !last_timing.first_layout) |
233 observer->OnFirstLayout(new_timing, extra_info); | 219 observer->OnFirstLayout(new_timing, extra_info); |
234 if (new_timing.first_paint && !last_timing.first_paint) | 220 if (new_timing.first_paint && !last_timing.first_paint) |
235 observer->OnFirstPaint(new_timing, extra_info); | 221 observer->OnFirstPaint(new_timing, extra_info); |
236 if (new_timing.first_text_paint && !last_timing.first_text_paint) | 222 if (new_timing.first_text_paint && !last_timing.first_text_paint) |
(...skipping 12 matching lines...) Expand all Loading... | |
249 | 235 |
250 } // namespace | 236 } // namespace |
251 | 237 |
252 PageLoadTracker::PageLoadTracker( | 238 PageLoadTracker::PageLoadTracker( |
253 bool in_foreground, | 239 bool in_foreground, |
254 PageLoadMetricsEmbedderInterface* embedder_interface, | 240 PageLoadMetricsEmbedderInterface* embedder_interface, |
255 const GURL& currently_committed_url, | 241 const GURL& currently_committed_url, |
256 content::NavigationHandle* navigation_handle, | 242 content::NavigationHandle* navigation_handle, |
257 int aborted_chain_size, | 243 int aborted_chain_size, |
258 int aborted_chain_size_same_url) | 244 int aborted_chain_size_same_url) |
259 : renderer_tracked_(false), | 245 : did_stop_tracking_(false), |
260 navigation_start_(navigation_handle->NavigationStart()), | 246 navigation_start_(navigation_handle->NavigationStart()), |
261 url_(navigation_handle->GetURL()), | 247 url_(navigation_handle->GetURL()), |
262 abort_type_(ABORT_NONE), | 248 abort_type_(ABORT_NONE), |
263 started_in_foreground_(in_foreground), | 249 started_in_foreground_(in_foreground), |
264 aborted_chain_size_(aborted_chain_size), | 250 aborted_chain_size_(aborted_chain_size), |
265 aborted_chain_size_same_url_(aborted_chain_size_same_url), | 251 aborted_chain_size_same_url_(aborted_chain_size_same_url), |
266 embedder_interface_(embedder_interface) { | 252 embedder_interface_(embedder_interface) { |
267 DCHECK(!navigation_handle->HasCommitted()); | 253 DCHECK(!navigation_handle->HasCommitted()); |
268 embedder_interface_->RegisterObservers(this); | 254 embedder_interface_->RegisterObservers(this); |
269 for (const auto& observer : observers_) { | 255 for (const auto& observer : observers_) { |
270 observer->OnStart(navigation_handle, currently_committed_url, | 256 observer->OnStart(navigation_handle, currently_committed_url, |
271 started_in_foreground_); | 257 started_in_foreground_); |
272 } | 258 } |
273 } | 259 } |
274 | 260 |
275 PageLoadTracker::~PageLoadTracker() { | 261 PageLoadTracker::~PageLoadTracker() { |
262 if (did_stop_tracking_) | |
263 return; | |
264 | |
276 const PageLoadExtraInfo info = ComputePageLoadExtraInfo(); | 265 const PageLoadExtraInfo info = ComputePageLoadExtraInfo(); |
277 | 266 |
278 if (info.time_to_commit && renderer_tracked() && timing_.IsEmpty()) { | 267 if (info.time_to_commit && timing_.IsEmpty()) { |
279 RecordInternalError(ERR_NO_IPCS_RECEIVED); | 268 RecordInternalError(ERR_NO_IPCS_RECEIVED); |
280 } | 269 } |
281 // Recall that trackers that are given ABORT_UNKNOWN_NAVIGATION have their | 270 // Recall that trackers that are given ABORT_UNKNOWN_NAVIGATION have their |
282 // chain length added to the next navigation. Take care not to double count | 271 // chain length added to the next navigation. Take care not to double count |
283 // them. Also do not double count committed loads, which call this already. | 272 // them. Also do not double count committed loads, which call this already. |
284 if (commit_time_.is_null() && abort_type_ != ABORT_UNKNOWN_NAVIGATION) | 273 if (commit_time_.is_null() && abort_type_ != ABORT_UNKNOWN_NAVIGATION) |
285 LogAbortChainHistograms(nullptr); | 274 LogAbortChainHistograms(nullptr); |
286 | 275 |
287 for (const auto& observer : observers_) { | 276 for (const auto& observer : observers_) { |
288 observer->OnComplete(timing_, info); | 277 observer->OnComplete(timing_, info); |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
438 const PageLoadExtraInfo info = ComputePageLoadExtraInfo(); | 427 const PageLoadExtraInfo info = ComputePageLoadExtraInfo(); |
439 for (const auto& observer : observers_) { | 428 for (const auto& observer : observers_) { |
440 DispatchObserverTimingCallbacks(observer.get(), last_timing, new_timing, | 429 DispatchObserverTimingCallbacks(observer.get(), last_timing, new_timing, |
441 last_metadata, info); | 430 last_metadata, info); |
442 } | 431 } |
443 return true; | 432 return true; |
444 } | 433 } |
445 return false; | 434 return false; |
446 } | 435 } |
447 | 436 |
448 void PageLoadTracker::set_renderer_tracked(bool renderer_tracked) { | 437 void PageLoadTracker::StopTracking() { |
449 renderer_tracked_ = renderer_tracked; | 438 did_stop_tracking_ = true; |
450 } | 439 } |
451 | 440 |
452 void PageLoadTracker::AddObserver( | 441 void PageLoadTracker::AddObserver( |
453 std::unique_ptr<PageLoadMetricsObserver> observer) { | 442 std::unique_ptr<PageLoadMetricsObserver> observer) { |
454 observers_.push_back(std::move(observer)); | 443 observers_.push_back(std::move(observer)); |
455 } | 444 } |
456 | 445 |
457 void PageLoadTracker::ClampBrowserTimestampIfInterProcessTimeTickSkew( | 446 void PageLoadTracker::ClampBrowserTimestampIfInterProcessTimeTickSkew( |
458 base::TimeTicks* event_time) { | 447 base::TimeTicks* event_time) { |
459 DCHECK(event_time != nullptr); | 448 DCHECK(event_time != nullptr); |
460 // Windows 10 GCE bot non-deterministically failed because TimeTicks::Now() | 449 // Windows 10 GCE bot non-deterministically failed because TimeTicks::Now() |
461 // called in the browser process e.g. commit_time was less than | 450 // called in the browser process e.g. commit_time was less than |
462 // navigation_start_ that was populated in the renderer process because the | 451 // navigation_start_ that was populated in the renderer process because the |
463 // clock was not system-wide monotonic. | 452 // clock was not system-wide monotonic. |
464 // Note that navigation_start_ can also be set in the browser process in | 453 // Note that navigation_start_ can also be set in the browser process in |
465 // some cases and in those cases event_time should never be < | 454 // some cases and in those cases event_time should never be < |
466 // navigation_start_. If it is due to a code error and it gets clamped in this | 455 // navigation_start_. If it is due to a code error and it gets clamped in this |
467 // function, on high resolution systems it should lead to a dcheck failure. | 456 // function, on high resolution systems it should lead to a dcheck failure. |
468 | 457 |
469 // TODO (shivanisha) Currently IsHighResolution is the best way to check | 458 // TODO(shivanisha): Currently IsHighResolution is the best way to check |
470 // if the clock is system-wide monotonic. However IsHighResolution | 459 // if the clock is system-wide monotonic. However IsHighResolution |
471 // does a broader check to see if the clock in use is high resolution | 460 // does a broader check to see if the clock in use is high resolution |
472 // which also implies it is system-wide monotonic (on Windows). | 461 // which also implies it is system-wide monotonic (on Windows). |
473 if (base::TimeTicks::IsHighResolution()) { | 462 if (base::TimeTicks::IsHighResolution()) { |
474 DCHECK(event_time->is_null() || *event_time >= navigation_start_); | 463 DCHECK(event_time->is_null() || *event_time >= navigation_start_); |
475 return; | 464 return; |
476 } | 465 } |
477 | 466 |
478 if (!event_time->is_null() && *event_time < navigation_start_) { | 467 if (!event_time->is_null() && *event_time < navigation_start_) { |
479 RecordInternalError(ERR_INTER_PROCESS_TIME_TICK_SKEW); | 468 RecordInternalError(ERR_INTER_PROCESS_TIME_TICK_SKEW); |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
637 IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(MetricsWebContentsObserver, message, | 626 IPC_BEGIN_MESSAGE_MAP_WITH_PARAM(MetricsWebContentsObserver, message, |
638 render_frame_host) | 627 render_frame_host) |
639 IPC_MESSAGE_HANDLER(PageLoadMetricsMsg_TimingUpdated, OnTimingUpdated) | 628 IPC_MESSAGE_HANDLER(PageLoadMetricsMsg_TimingUpdated, OnTimingUpdated) |
640 IPC_MESSAGE_UNHANDLED(handled = false) | 629 IPC_MESSAGE_UNHANDLED(handled = false) |
641 IPC_END_MESSAGE_MAP() | 630 IPC_END_MESSAGE_MAP() |
642 return handled; | 631 return handled; |
643 } | 632 } |
644 | 633 |
645 void MetricsWebContentsObserver::DidStartNavigation( | 634 void MetricsWebContentsObserver::DidStartNavigation( |
646 content::NavigationHandle* navigation_handle) { | 635 content::NavigationHandle* navigation_handle) { |
647 if (!navigation_handle->IsInMainFrame()) | 636 if (!navigation_handle->IsInMainFrame() || |
637 !ShouldTrackNavigation(navigation_handle)) | |
648 return; | 638 return; |
639 | |
640 // TODO(bmcquade): add support for tracking prerendered pages when they become | |
641 // visible. | |
649 if (embedder_interface_->IsPrerendering(web_contents())) | 642 if (embedder_interface_->IsPrerendering(web_contents())) |
650 return; | 643 return; |
651 if (embedder_interface_->IsNewTabPageUrl(navigation_handle->GetURL())) | |
652 return; | |
653 if (navigation_handle->GetURL().spec().compare(url::kAboutBlankURL) == 0) | |
654 return; | |
655 | 644 |
656 std::unique_ptr<PageLoadTracker> last_aborted = | 645 std::unique_ptr<PageLoadTracker> last_aborted = |
657 NotifyAbortedProvisionalLoadsNewNavigation(navigation_handle); | 646 NotifyAbortedProvisionalLoadsNewNavigation(navigation_handle); |
658 | 647 |
659 int chain_size_same_url = 0; | 648 int chain_size_same_url = 0; |
660 int chain_size = 0; | 649 int chain_size = 0; |
661 if (last_aborted) { | 650 if (last_aborted) { |
662 if (last_aborted->MatchesOriginalNavigation(navigation_handle)) { | 651 if (last_aborted->MatchesOriginalNavigation(navigation_handle)) { |
663 chain_size_same_url = last_aborted->aborted_chain_size_same_url() + 1; | 652 chain_size_same_url = last_aborted->aborted_chain_size_same_url() + 1; |
664 } else if (last_aborted->aborted_chain_size_same_url() > 0) { | 653 } else if (last_aborted->aborted_chain_size_same_url() > 0) { |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
705 | 694 |
706 void MetricsWebContentsObserver::DidFinishNavigation( | 695 void MetricsWebContentsObserver::DidFinishNavigation( |
707 content::NavigationHandle* navigation_handle) { | 696 content::NavigationHandle* navigation_handle) { |
708 if (!navigation_handle->IsInMainFrame()) | 697 if (!navigation_handle->IsInMainFrame()) |
709 return; | 698 return; |
710 | 699 |
711 std::unique_ptr<PageLoadTracker> finished_nav( | 700 std::unique_ptr<PageLoadTracker> finished_nav( |
712 std::move(provisional_loads_[navigation_handle])); | 701 std::move(provisional_loads_[navigation_handle])); |
713 provisional_loads_.erase(navigation_handle); | 702 provisional_loads_.erase(navigation_handle); |
714 | 703 |
715 // There's a chance a navigation could have started before we were added to a | 704 const bool should_track = |
716 // tab. Bail out early if this is the case. | 705 finished_nav && ShouldTrackNavigation(navigation_handle); |
717 if (!finished_nav) | |
718 return; | |
719 | 706 |
720 // Handle a pre-commit error here. Navigations that result in an error page | 707 if (finished_nav && !should_track) |
721 // will be ignored. Note that downloads/204s will result in HasCommitted() | 708 finished_nav->StopTracking(); |
722 // returning false. | |
723 // TODO(csharrison): Track changes to NavigationHandle for signals when this | |
724 // is the case (HTTP response headers). | |
725 if (!navigation_handle->HasCommitted()) { | |
726 finished_nav->FailedProvisionalLoad(navigation_handle); | |
727 | 709 |
728 net::Error error = navigation_handle->GetNetErrorCode(); | 710 if (navigation_handle->HasCommitted()) { |
711 // Ignore same-page navigations. | |
712 if (navigation_handle->IsSamePage()) | |
713 return; | |
729 | 714 |
730 // net::OK: This case occurs when the NavigationHandle finishes and reports | 715 if (should_track) { |
731 // !HasCommitted(), but reports no net::Error. This should not occur | 716 HandleCommittedNavigationForTrackedLoad(navigation_handle, |
732 // pre-PlzNavigate, but afterwards it should represent the navigation | 717 std::move(finished_nav)); |
733 // stopped by the user before it was ready to commit. | 718 } else { |
734 // net::ERR_ABORTED: An aborted provisional load has error net::ERR_ABORTED. | 719 committed_load_.reset(); |
735 // Note that this can come from some non user-initiated errors, such as | |
736 // downloads, or 204 responses. See crbug.com/542369. | |
737 if ((error == net::OK) || (error == net::ERR_ABORTED)) { | |
738 finished_nav->NotifyAbort(ABORT_OTHER, base::TimeTicks::Now(), true); | |
739 aborted_provisional_loads_.push_back(std::move(finished_nav)); | |
740 } | 720 } |
721 } else if (should_track) { | |
722 HandleFailedNavigationForTrackedLoad(navigation_handle, | |
723 std::move(finished_nav)); | |
724 } | |
725 } | |
741 | 726 |
742 return; | 727 // Handle a pre-commit error. Navigations that result in an error page will be |
728 // ignored. Note that downloads/204s will result in HasCommitted() returning | |
729 // false. | |
730 // TODO(csharrison): Track changes to NavigationHandle for signals when this is | |
731 // the case (HTTP response headers). | |
732 void MetricsWebContentsObserver::HandleFailedNavigationForTrackedLoad( | |
733 content::NavigationHandle* navigation_handle, | |
734 std::unique_ptr<PageLoadTracker> tracker) { | |
735 tracker->FailedProvisionalLoad(navigation_handle); | |
736 | |
737 net::Error error = navigation_handle->GetNetErrorCode(); | |
738 | |
739 // net::OK: This case occurs when the NavigationHandle finishes and reports | |
740 // !HasCommitted(), but reports no net::Error. This should not occur | |
741 // pre-PlzNavigate, but afterwards it should represent the navigation stopped | |
742 // by the user before it was ready to commit. | |
743 // net::ERR_ABORTED: An aborted provisional load has error | |
744 // net::ERR_ABORTED. Note that this can come from some non user-initiated | |
745 // errors, such as downloads, or 204 responses. See crbug.com/542369. | |
746 if ((error == net::OK) || (error == net::ERR_ABORTED)) { | |
747 tracker->NotifyAbort(ABORT_OTHER, base::TimeTicks::Now(), true); | |
748 aborted_provisional_loads_.push_back(std::move(tracker)); | |
743 } | 749 } |
750 } | |
744 | 751 |
745 // Don't treat a same-page nav as a new page load. | 752 void MetricsWebContentsObserver::HandleCommittedNavigationForTrackedLoad( |
746 if (navigation_handle->IsSamePage()) | 753 content::NavigationHandle* navigation_handle, |
747 return; | 754 std::unique_ptr<PageLoadTracker> tracker) { |
748 | |
749 if (!navigation_handle->HasUserGesture() && | 755 if (!navigation_handle->HasUserGesture() && |
750 (navigation_handle->GetPageTransition() & | 756 (navigation_handle->GetPageTransition() & |
751 ui::PAGE_TRANSITION_CLIENT_REDIRECT) != 0 && | 757 ui::PAGE_TRANSITION_CLIENT_REDIRECT) != 0 && |
752 committed_load_) | 758 committed_load_ && tracker) |
Charlie Harrison
2016/07/15 13:01:17
Can we DCHECK(tracker) here instead if keeping it
Bryan McQuade
2016/07/15 14:14:42
good catch, thanks! this test was left over from a
Charlie Harrison
2016/07/15 14:19:55
Fair enough, though a DCHECK just solidifies this
| |
753 committed_load_->NotifyClientRedirectTo(*finished_nav); | 759 committed_load_->NotifyClientRedirectTo(*tracker); |
754 | 760 |
755 // Notify other loads that they may have been aborted by this committed load. | 761 // Notify other loads that they may have been aborted by this committed load. |
756 // Note that by using the committed navigation start as the abort cause, we | 762 // Note that by using the committed navigation start as the abort cause, we |
757 // lose data on provisional loads that were aborted by other provisional | 763 // lose data on provisional loads that were aborted by other provisional |
758 // loads. Those will either be listed as ABORT_OTHER or as being aborted by | 764 // loads. Those will either be listed as ABORT_OTHER or as being aborted by |
759 // this load. | 765 // this load. |
760 // is_certainly_browser_timestamp is set to false because NavigationStart() | 766 // is_certainly_browser_timestamp is set to false because NavigationStart() |
761 // could be set in either the renderer or browser process. | 767 // could be set in either the renderer or browser process. |
762 NotifyAbortAllLoadsWithTimestamp( | 768 NotifyAbortAllLoadsWithTimestamp( |
763 AbortTypeForPageTransition(navigation_handle->GetPageTransition()), | 769 AbortTypeForPageTransition(navigation_handle->GetPageTransition()), |
Bryan McQuade
2016/07/15 14:14:42
looking at this bit of code, should we be notifyin
Charlie Harrison
2016/07/15 14:19:55
Oh good catch. Can you actually put this code in t
| |
764 navigation_handle->NavigationStart(), false); | 770 navigation_handle->NavigationStart(), false); |
765 | 771 |
766 committed_load_ = std::move(finished_nav); | 772 committed_load_ = std::move(tracker); |
767 aborted_provisional_loads_.clear(); | |
768 | |
769 const GURL& browser_url = web_contents()->GetLastCommittedURL(); | |
770 const std::string& mime_type = web_contents()->GetContentsMimeType(); | |
771 DCHECK(!browser_url.is_empty()); | |
772 DCHECK(!mime_type.empty()); | |
773 committed_load_->set_renderer_tracked( | |
774 IsRelevantNavigation(navigation_handle, browser_url, mime_type)); | |
775 | |
776 committed_load_->Commit(navigation_handle); | 773 committed_load_->Commit(navigation_handle); |
777 } | 774 } |
778 | 775 |
779 void MetricsWebContentsObserver::NavigationStopped() { | 776 void MetricsWebContentsObserver::NavigationStopped() { |
780 NotifyAbortAllLoads(ABORT_STOP); | 777 NotifyAbortAllLoads(ABORT_STOP); |
781 } | 778 } |
782 | 779 |
783 void MetricsWebContentsObserver::OnInputEvent( | 780 void MetricsWebContentsObserver::OnInputEvent( |
784 const blink::WebInputEvent& event) { | 781 const blink::WebInputEvent& event) { |
785 // Ignore browser navigation or reload which comes with type Undefined. | 782 // Ignore browser navigation or reload which comes with type Undefined. |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
887 | 884 |
888 aborted_provisional_loads_.clear(); | 885 aborted_provisional_loads_.clear(); |
889 return last_aborted_load; | 886 return last_aborted_load; |
890 } | 887 } |
891 | 888 |
892 void MetricsWebContentsObserver::OnTimingUpdated( | 889 void MetricsWebContentsObserver::OnTimingUpdated( |
893 content::RenderFrameHost* render_frame_host, | 890 content::RenderFrameHost* render_frame_host, |
894 const PageLoadTiming& timing, | 891 const PageLoadTiming& timing, |
895 const PageLoadMetadata& metadata) { | 892 const PageLoadMetadata& metadata) { |
896 bool error = false; | 893 bool error = false; |
897 if (!committed_load_ || !committed_load_->renderer_tracked()) { | 894 if (!committed_load_) { |
898 RecordInternalError(ERR_IPC_WITH_NO_RELEVANT_LOAD); | 895 RecordInternalError(ERR_IPC_WITH_NO_RELEVANT_LOAD); |
899 error = true; | 896 error = true; |
900 } | 897 } |
901 | 898 |
902 // We may receive notifications from frames that have been navigated away | 899 // We may receive notifications from frames that have been navigated away |
903 // from. We simply ignore them. | 900 // from. We simply ignore them. |
904 if (render_frame_host != web_contents()->GetMainFrame()) { | 901 if (render_frame_host != web_contents()->GetMainFrame()) { |
905 RecordInternalError(ERR_IPC_FROM_WRONG_FRAME); | 902 RecordInternalError(ERR_IPC_FROM_WRONG_FRAME); |
906 error = true; | 903 error = true; |
907 } | 904 } |
(...skipping 10 matching lines...) Expand all Loading... | |
918 return; | 915 return; |
919 | 916 |
920 if (!committed_load_->UpdateTiming(timing, metadata)) { | 917 if (!committed_load_->UpdateTiming(timing, metadata)) { |
921 // If the page load tracker cannot update its timing, something is wrong | 918 // If the page load tracker cannot update its timing, something is wrong |
922 // with the IPC (it's from another load, or it's invalid in some other way). | 919 // with the IPC (it's from another load, or it's invalid in some other way). |
923 // We expect this to be a rare occurrence. | 920 // We expect this to be a rare occurrence. |
924 RecordInternalError(ERR_BAD_TIMING_IPC); | 921 RecordInternalError(ERR_BAD_TIMING_IPC); |
925 } | 922 } |
926 } | 923 } |
927 | 924 |
925 bool MetricsWebContentsObserver::ShouldTrackNavigation( | |
926 content::NavigationHandle* navigation_handle) const { | |
927 DCHECK(navigation_handle->IsInMainFrame()); | |
928 if (!navigation_handle->GetURL().SchemeIsHTTPOrHTTPS()) | |
929 return false; | |
930 if (embedder_interface_->IsNewTabPageUrl(navigation_handle->GetURL())) | |
931 return false; | |
932 if (navigation_handle->HasCommitted()) { | |
933 if (navigation_handle->IsSamePage() || navigation_handle->IsErrorPage()) | |
934 return false; | |
935 const std::string& mime_type = web_contents()->GetContentsMimeType(); | |
936 if (mime_type != "text/html" && mime_type != "application/xhtml+xml") | |
937 return false; | |
938 } | |
939 return true; | |
940 } | |
941 | |
928 } // namespace page_load_metrics | 942 } // namespace page_load_metrics |
OLD | NEW |