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 "chrome/browser/page_load_metrics/metrics_web_contents_observer.h" | 5 #include "chrome/browser/page_load_metrics/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 832 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
843 std::move(provisional_loads_[navigation_handle])); | 843 std::move(provisional_loads_[navigation_handle])); |
844 provisional_loads_.erase(navigation_handle); | 844 provisional_loads_.erase(navigation_handle); |
845 | 845 |
846 // Ignore same-page navigations. | 846 // Ignore same-page navigations. |
847 if (navigation_handle->HasCommitted() && navigation_handle->IsSamePage()) { | 847 if (navigation_handle->HasCommitted() && navigation_handle->IsSamePage()) { |
848 if (finished_nav) | 848 if (finished_nav) |
849 finished_nav->StopTracking(); | 849 finished_nav->StopTracking(); |
850 return; | 850 return; |
851 } | 851 } |
852 | 852 |
| 853 // Ignore internally generated aborts for navigations with HTTP responses that |
| 854 // don't commit, such as HTTP 204 responses and downloads. |
| 855 if (!navigation_handle->HasCommitted() && |
| 856 navigation_handle->GetNetErrorCode() == net::ERR_ABORTED && |
| 857 navigation_handle->GetResponseHeaders()) { |
| 858 if (finished_nav) |
| 859 finished_nav->StopTracking(); |
| 860 return; |
| 861 } |
| 862 |
853 const bool should_track = | 863 const bool should_track = |
854 finished_nav && ShouldTrackNavigation(navigation_handle); | 864 finished_nav && ShouldTrackNavigation(navigation_handle); |
855 | 865 |
856 if (finished_nav && !should_track) | 866 if (finished_nav && !should_track) |
857 finished_nav->StopTracking(); | 867 finished_nav->StopTracking(); |
858 | 868 |
859 if (navigation_handle->HasCommitted()) { | 869 if (navigation_handle->HasCommitted()) { |
860 // Notify other loads that they may have been aborted by this committed | 870 // Notify other loads that they may have been aborted by this committed |
861 // load. is_certainly_browser_timestamp is set to false because | 871 // load. is_certainly_browser_timestamp is set to false because |
862 // NavigationStart() could be set in either the renderer or browser process. | 872 // NavigationStart() could be set in either the renderer or browser process. |
863 NotifyAbortAllLoadsWithTimestamp( | 873 NotifyAbortAllLoadsWithTimestamp( |
864 AbortTypeForPageTransition(navigation_handle->GetPageTransition()), | 874 AbortTypeForPageTransition(navigation_handle->GetPageTransition()), |
865 IsNavigationUserInitiated(navigation_handle), | 875 IsNavigationUserInitiated(navigation_handle), |
866 navigation_handle->NavigationStart(), false); | 876 navigation_handle->NavigationStart(), false); |
867 | 877 |
868 if (should_track) { | 878 if (should_track) { |
869 HandleCommittedNavigationForTrackedLoad(navigation_handle, | 879 HandleCommittedNavigationForTrackedLoad(navigation_handle, |
870 std::move(finished_nav)); | 880 std::move(finished_nav)); |
871 } else { | 881 } else { |
872 committed_load_.reset(); | 882 committed_load_.reset(); |
873 } | 883 } |
874 } else if (should_track) { | 884 } else if (should_track) { |
875 HandleFailedNavigationForTrackedLoad(navigation_handle, | 885 HandleFailedNavigationForTrackedLoad(navigation_handle, |
876 std::move(finished_nav)); | 886 std::move(finished_nav)); |
877 } | 887 } |
878 } | 888 } |
879 | 889 |
880 // Handle a pre-commit error. Navigations that result in an error page will be | 890 // Handle a pre-commit error. Navigations that result in an error page will be |
881 // ignored. Note that downloads/204s will result in HasCommitted() returning | 891 // ignored. |
882 // false. | |
883 // TODO(csharrison): Track changes to NavigationHandle for signals when this is | |
884 // the case (HTTP response headers). | |
885 void MetricsWebContentsObserver::HandleFailedNavigationForTrackedLoad( | 892 void MetricsWebContentsObserver::HandleFailedNavigationForTrackedLoad( |
886 content::NavigationHandle* navigation_handle, | 893 content::NavigationHandle* navigation_handle, |
887 std::unique_ptr<PageLoadTracker> tracker) { | 894 std::unique_ptr<PageLoadTracker> tracker) { |
888 tracker->FailedProvisionalLoad(navigation_handle); | 895 tracker->FailedProvisionalLoad(navigation_handle); |
889 | 896 |
890 net::Error error = navigation_handle->GetNetErrorCode(); | 897 net::Error error = navigation_handle->GetNetErrorCode(); |
891 | 898 |
892 // net::OK: This case occurs when the NavigationHandle finishes and reports | 899 // net::OK: This case occurs when the NavigationHandle finishes and reports |
893 // !HasCommitted(), but reports no net::Error. This should not occur | 900 // !HasCommitted(), but reports no net::Error. This should not occur |
894 // pre-PlzNavigate, but afterwards it should represent the navigation stopped | 901 // pre-PlzNavigate, but afterwards it should represent the navigation stopped |
895 // by the user before it was ready to commit. | 902 // by the user before it was ready to commit. |
896 // net::ERR_ABORTED: An aborted provisional load has error | 903 // net::ERR_ABORTED: An aborted provisional load has error |
897 // net::ERR_ABORTED. Note that this can come from some non user-initiated | 904 // net::ERR_ABORTED. |
898 // errors, such as downloads, or 204 responses. See crbug.com/542369. | |
899 if ((error == net::OK) || (error == net::ERR_ABORTED)) { | 905 if ((error == net::OK) || (error == net::ERR_ABORTED)) { |
900 tracker->NotifyAbort(ABORT_OTHER, false, base::TimeTicks::Now(), true); | 906 tracker->NotifyAbort(ABORT_OTHER, false, base::TimeTicks::Now(), true); |
901 aborted_provisional_loads_.push_back(std::move(tracker)); | 907 aborted_provisional_loads_.push_back(std::move(tracker)); |
902 } | 908 } |
903 } | 909 } |
904 | 910 |
905 void MetricsWebContentsObserver::HandleCommittedNavigationForTrackedLoad( | 911 void MetricsWebContentsObserver::HandleCommittedNavigationForTrackedLoad( |
906 content::NavigationHandle* navigation_handle, | 912 content::NavigationHandle* navigation_handle, |
907 std::unique_ptr<PageLoadTracker> tracker) { | 913 std::unique_ptr<PageLoadTracker> tracker) { |
908 if (!navigation_handle->HasUserGesture() && | 914 if (!navigation_handle->HasUserGesture() && |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1094 content::NavigationHandle* navigation_handle) const { | 1100 content::NavigationHandle* navigation_handle) const { |
1095 DCHECK(navigation_handle->IsInMainFrame()); | 1101 DCHECK(navigation_handle->IsInMainFrame()); |
1096 DCHECK(!navigation_handle->HasCommitted() || | 1102 DCHECK(!navigation_handle->HasCommitted() || |
1097 !navigation_handle->IsSamePage()); | 1103 !navigation_handle->IsSamePage()); |
1098 | 1104 |
1099 return BrowserPageTrackDecider(embedder_interface_.get(), web_contents(), | 1105 return BrowserPageTrackDecider(embedder_interface_.get(), web_contents(), |
1100 navigation_handle).ShouldTrack(); | 1106 navigation_handle).ShouldTrack(); |
1101 } | 1107 } |
1102 | 1108 |
1103 } // namespace page_load_metrics | 1109 } // namespace page_load_metrics |
OLD | NEW |