Index: components/page_load_metrics/browser/metrics_web_contents_observer.h |
diff --git a/components/page_load_metrics/browser/metrics_web_contents_observer.h b/components/page_load_metrics/browser/metrics_web_contents_observer.h |
deleted file mode 100644 |
index fd06800b54fe3396ec79a05bfebbdd185fc067e9..0000000000000000000000000000000000000000 |
--- a/components/page_load_metrics/browser/metrics_web_contents_observer.h |
+++ /dev/null |
@@ -1,371 +0,0 @@ |
-// Copyright 2015 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#ifndef COMPONENTS_PAGE_LOAD_METRICS_BROWSER_METRICS_WEB_CONTENTS_OBSERVER_H_ |
-#define COMPONENTS_PAGE_LOAD_METRICS_BROWSER_METRICS_WEB_CONTENTS_OBSERVER_H_ |
- |
-#include <map> |
-#include <memory> |
-#include <vector> |
- |
-#include "base/macros.h" |
-#include "base/time/time.h" |
-#include "components/page_load_metrics/browser/page_load_metrics_observer.h" |
-#include "components/page_load_metrics/common/page_load_timing.h" |
-#include "content/public/browser/render_widget_host.h" |
-#include "content/public/browser/web_contents.h" |
-#include "content/public/browser/web_contents_observer.h" |
-#include "content/public/browser/web_contents_user_data.h" |
-#include "net/base/net_errors.h" |
-#include "third_party/WebKit/public/web/WebInputEvent.h" |
- |
-namespace content { |
-class NavigationHandle; |
-class RenderFrameHost; |
-} // namespace content |
- |
-namespace IPC { |
-class Message; |
-} // namespace IPC |
- |
-namespace page_load_metrics { |
- |
-class PageLoadTracker; |
- |
-namespace internal { |
- |
-extern const char kErrorEvents[]; |
-extern const char kAbortChainSizeReload[]; |
-extern const char kAbortChainSizeForwardBack[]; |
-extern const char kAbortChainSizeNewNavigation[]; |
-extern const char kAbortChainSizeNoCommit[]; |
-extern const char kAbortChainSizeSameURL[]; |
- |
-} // namespace internal |
- |
-// These errors are internal to the page_load_metrics subsystem and do not |
-// reflect actual errors that occur during a page load. |
-// |
-// If you add elements to this enum, make sure you update the enum |
-// value in histograms.xml. Only add elements to the end to prevent |
-// inconsistencies between versions. |
-enum InternalErrorLoadEvent { |
- // A timing IPC was sent from the renderer that did not line up with previous |
- // data we've received (i.e. navigation start is different or the timing |
- // struct is somehow invalid). This error can only occur once the IPC is |
- // vetted in other ways (see other errors). |
- ERR_BAD_TIMING_IPC, |
- |
- // The following IPCs are not mutually exclusive. |
- // |
- // We received an IPC when we weren't tracking a committed load. This will |
- // often happen if we get an IPC from a bad URL scheme (that is, the renderer |
- // sent us an IPC from a navigation we don't care about). |
- ERR_IPC_WITH_NO_RELEVANT_LOAD, |
- |
- // Received a notification from a frame that has been navigated away from. |
- ERR_IPC_FROM_WRONG_FRAME, |
- |
- // We received an IPC even through the last committed url from the browser |
- // was not http/s. This can happen with the renderer sending IPCs for the |
- // new tab page. This will often come paired with |
- // ERR_IPC_WITH_NO_RELEVANT_LOAD. |
- ERR_IPC_FROM_BAD_URL_SCHEME, |
- |
- // If we track a navigation, but the renderer sends us no IPCs. This could |
- // occur if the browser filters loads less aggressively than the renderer. |
- ERR_NO_IPCS_RECEIVED, |
- |
- // Tracks frequency with which we record an abort time that occurred before |
- // navigation start. This is expected to happen in some cases (see comments in |
- // cc file for details). We use this error counter to understand how often it |
- // happens. |
- ERR_ABORT_BEFORE_NAVIGATION_START, |
- |
- // A new navigation triggers abort updates in multiple trackers in |
- // |aborted_provisional_loads_|, when usually there should only be one (the |
- // navigation that just aborted because of this one). If this happens, the |
- // latest aborted load is used to track the chain size. |
- ERR_NAVIGATION_SIGNALS_MULIPLE_ABORTED_LOADS, |
- |
- // Received user input without a relevant load. This error type is deprecated, |
- // as it is valid to receive user input without a relevant load. We leave the |
- // enum value here since it's also used in histogram recording, so it's |
- // important that we not re-use this enum entry for a different value. |
- DEPRECATED_ERR_USER_INPUT_WITH_NO_RELEVANT_LOAD, |
- |
- // A TimeTicks value in the browser process has value less than |
- // navigation_start_. This could happen if navigation_start_ was computed in |
- // renderer process and the system clock has inter process time tick skew. |
- ERR_INTER_PROCESS_TIME_TICK_SKEW, |
- |
- // Add values before this final count. |
- ERR_LAST_ENTRY, |
-}; |
- |
-// This class serves as a functional interface to various chrome// features. |
-// Impl version is defined in chrome/browser/page_load_metrics. |
-class PageLoadMetricsEmbedderInterface { |
- public: |
- virtual ~PageLoadMetricsEmbedderInterface() {} |
- virtual bool IsPrerendering(content::WebContents* web_contents) = 0; |
- virtual bool IsNewTabPageUrl(const GURL& url) = 0; |
- virtual void RegisterObservers(PageLoadTracker* metrics) = 0; |
-}; |
- |
-// This class tracks a given page load, starting from navigation start / |
-// provisional load, until a new navigation commits or the navigation fails. |
-// MetricsWebContentsObserver manages a set of provisional PageLoadTrackers, as |
-// well as a committed PageLoadTracker. |
-class PageLoadTracker { |
- public: |
- // Caller must guarantee that the embedder_interface pointer outlives this |
- // class. The PageLoadTracker must not hold on to |
- // currently_committed_load_or_null or navigation_handle beyond the scope of |
- // the constructor. |
- PageLoadTracker(bool in_foreground, |
- PageLoadMetricsEmbedderInterface* embedder_interface, |
- const GURL& currently_committed_url, |
- content::NavigationHandle* navigation_handle, |
- int aborted_chain_size, |
- int aborted_chain_size_same_url); |
- ~PageLoadTracker(); |
- void Redirect(content::NavigationHandle* navigation_handle); |
- void Commit(content::NavigationHandle* navigation_handle); |
- void FailedProvisionalLoad(content::NavigationHandle* navigation_handle); |
- void WebContentsHidden(); |
- void WebContentsShown(); |
- |
- void OnInputEvent(const blink::WebInputEvent& event); |
- |
- void NotifyClientRedirectTo(const PageLoadTracker& destination); |
- |
- // Returns true if the timing was successfully updated. |
- bool UpdateTiming(const PageLoadTiming& timing, |
- const PageLoadMetadata& metadata); |
- |
- // Signals that we should stop tracking metrics for the associated page load. |
- // We may stop tracking a page load if it doesn't meet the criteria for |
- // tracking metrics in DidFinishNavigation. |
- void StopTracking(); |
- |
- int aborted_chain_size() const { return aborted_chain_size_; } |
- int aborted_chain_size_same_url() const { |
- return aborted_chain_size_same_url_; |
- } |
- |
- UserAbortType abort_type() const { return abort_type_; } |
- base::TimeTicks abort_time() const { return abort_time_; } |
- |
- void AddObserver(std::unique_ptr<PageLoadMetricsObserver> observer); |
- |
- // If the user performs some abort-like action while we are tracking this page |
- // load, notify the tracker. Note that we may not classify this as an abort if |
- // we've already performed a first paint. |
- // is_certainly_browser_timestamp signifies if the timestamp passed is taken |
- // in the |
- // browser process or not. We need this to possibly clamp browser timestamp on |
- // a machine with inter process time tick skew. |
- void NotifyAbort(UserAbortType abort_type, |
- base::TimeTicks timestamp, |
- bool is_certainly_browser_timestamp); |
- void UpdateAbort(UserAbortType abort_type, |
- base::TimeTicks timestamp, |
- bool is_certainly_browser_timestamp); |
- |
- // This method returns true if this page load has been aborted with type of |
- // ABORT_OTHER, and the |abort_cause_time| is within a sufficiently close |
- // delta to when it was aborted. Note that only provisional loads can be |
- // aborted with ABORT_OTHER. While this heuristic is coarse, it works better |
- // and is simpler than other feasible methods. See https://goo.gl/WKRG98. |
- bool IsLikelyProvisionalAbort(base::TimeTicks abort_cause_time); |
- |
- bool MatchesOriginalNavigation(content::NavigationHandle* navigation_handle); |
- |
- // Only valid to call post-commit. |
- const GURL& committed_url() const { |
- DCHECK(!commit_time_.is_null()); |
- return url_; |
- } |
- |
- base::TimeTicks navigation_start() const { return navigation_start_; } |
- |
- PageLoadExtraInfo ComputePageLoadExtraInfo(); |
- |
- private: |
- // This function converts a TimeTicks value taken in the browser process |
- // to navigation_start_ if: |
- // - base::TimeTicks is not comparable across processes because the clock |
- // is not system wide monotonic. |
- // - *event_time < navigation_start_ |
- void ClampBrowserTimestampIfInterProcessTimeTickSkew( |
- base::TimeTicks* event_time); |
- |
- void UpdateAbortInternal(UserAbortType abort_type, |
- base::TimeTicks timestamp, |
- bool is_certainly_browser_timestamp); |
- |
- // If |final_navigation| is null, then this is an "unparented" abort chain, |
- // and represents a sequence of provisional aborts that never ends with a |
- // committed load. |
- void LogAbortChainHistograms(content::NavigationHandle* final_navigation); |
- |
- // Whether we stopped tracking this navigation after it was initiated. We may |
- // stop tracking a navigation if it doesn't meet the criteria for tracking |
- // metrics in DidFinishNavigation. |
- bool did_stop_tracking_; |
- |
- // The navigation start in TimeTicks, not the wall time reported by Blink. |
- const base::TimeTicks navigation_start_; |
- |
- // Time this page load was committed. If this page load hasn't committed, |
- // |commit_time_| will be zero. |
- base::TimeTicks commit_time_; |
- |
- // The URL of this page load. This is the provisional url before commit |
- // (before redirects), and the committed url after commit. |
- GURL url_; |
- |
- std::unique_ptr<FailedProvisionalLoadInfo> failed_provisional_load_info_; |
- |
- // Will be ABORT_NONE if we have not aborted this load yet. Otherwise will |
- // be the first abort action the user performed. |
- UserAbortType abort_type_; |
- base::TimeTicks abort_time_; |
- |
- // We record separate metrics for events that occur after a background, |
- // because metrics like layout/paint are delayed artificially |
- // when they occur in the background. |
- base::TimeTicks background_time_; |
- base::TimeTicks foreground_time_; |
- bool started_in_foreground_; |
- |
- PageLoadTiming timing_; |
- PageLoadMetadata metadata_; |
- |
- // This is a subtle member. If a provisional load A gets aborted by |
- // provisional load B, which gets aborted by C that eventually commits, then |
- // there exists an abort chain of length 2, starting at A's navigation_start. |
- // This is useful because it allows histograming abort chain lengths based on |
- // what the last load's transition type is. i.e. holding down F-5 to spam |
- // reload will produce a long chain with the RELOAD transition. |
- const int aborted_chain_size_; |
- |
- // This member counts consecutive provisional aborts that share a url. It will |
- // always be less than or equal to |aborted_chain_size_|. |
- const int aborted_chain_size_same_url_; |
- |
- // Interface to chrome features. Must outlive the class. |
- PageLoadMetricsEmbedderInterface* const embedder_interface_; |
- |
- std::vector<std::unique_ptr<PageLoadMetricsObserver>> observers_; |
- |
- DISALLOW_COPY_AND_ASSIGN(PageLoadTracker); |
-}; |
- |
-// MetricsWebContentsObserver tracks page loads and loading metrics |
-// related data based on IPC messages received from a |
-// MetricsRenderFrameObserver. |
-class MetricsWebContentsObserver |
- : public content::WebContentsObserver, |
- public content::WebContentsUserData<MetricsWebContentsObserver>, |
- public content::RenderWidgetHost::InputEventObserver { |
- public: |
- // Note that the returned metrics is owned by the web contents. |
- static MetricsWebContentsObserver* CreateForWebContents( |
- content::WebContents* web_contents, |
- std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface); |
- MetricsWebContentsObserver( |
- content::WebContents* web_contents, |
- std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface); |
- ~MetricsWebContentsObserver() override; |
- |
- // content::WebContentsObserver implementation: |
- bool OnMessageReceived(const IPC::Message& message, |
- content::RenderFrameHost* render_frame_host) override; |
- void DidStartNavigation( |
- content::NavigationHandle* navigation_handle) override; |
- void DidFinishNavigation( |
- content::NavigationHandle* navigation_handle) override; |
- void DidRedirectNavigation( |
- content::NavigationHandle* navigation_handle) override; |
- void NavigationStopped() override; |
- void OnInputEvent(const blink::WebInputEvent& event) override; |
- void WasShown() override; |
- void WasHidden() override; |
- void RenderProcessGone(base::TerminationStatus status) override; |
- void RenderViewHostChanged(content::RenderViewHost* old_host, |
- content::RenderViewHost* new_host) override; |
- |
- // This getter function is required for testing. |
- const PageLoadExtraInfo GetPageLoadExtraInfoForCommittedLoad(); |
- |
- private: |
- friend class content::WebContentsUserData<MetricsWebContentsObserver>; |
- |
- void HandleFailedNavigationForTrackedLoad( |
- content::NavigationHandle* navigation_handle, |
- std::unique_ptr<PageLoadTracker> tracker); |
- |
- void HandleCommittedNavigationForTrackedLoad( |
- content::NavigationHandle* navigation_handle, |
- std::unique_ptr<PageLoadTracker> tracker); |
- |
- // Notify all loads, provisional and committed, that we performed an action |
- // that might abort them. |
- void NotifyAbortAllLoads(UserAbortType abort_type); |
- void NotifyAbortAllLoadsWithTimestamp(UserAbortType abort_type, |
- base::TimeTicks timestamp, |
- bool is_certainly_browser_timestamp); |
- |
- // Register / Unregister input event callback to given RenderViewHost |
- void RegisterInputEventObserver(content::RenderViewHost* host); |
- void UnregisterInputEventObserver(content::RenderViewHost* host); |
- |
- // Notify aborted provisional loads that a new navigation occurred. This is |
- // used for more consistent attribution tracking for aborted provisional |
- // loads. This method returns the provisional load that was likely aborted |
- // by this navigation, to help instantiate the new PageLoadTracker. |
- std::unique_ptr<PageLoadTracker> NotifyAbortedProvisionalLoadsNewNavigation( |
- content::NavigationHandle* new_navigation); |
- |
- void OnTimingUpdated(content::RenderFrameHost*, |
- const PageLoadTiming& timing, |
- const PageLoadMetadata& metadata); |
- |
- bool ShouldTrackNavigation( |
- content::NavigationHandle* navigation_handle) const; |
- |
- // True if the web contents is currently in the foreground. |
- bool in_foreground_; |
- |
- // The PageLoadTrackers must be deleted before the |embedder_interface_|, |
- // because they hold a pointer to the |embedder_interface_|. |
- std::unique_ptr<PageLoadMetricsEmbedderInterface> embedder_interface_; |
- |
- // This map tracks all of the navigations ongoing that are not committed |
- // yet. Once a navigation is committed, it moves from the map to |
- // committed_load_. Note that a PageLoadTrackers NavigationHandle is only |
- // valid until commit time, when we remove it from the map. |
- std::map<content::NavigationHandle*, std::unique_ptr<PageLoadTracker>> |
- provisional_loads_; |
- |
- // Tracks aborted provisional loads for a little bit longer than usual (one |
- // more navigation commit at the max), in order to better understand how the |
- // navigation failed. This is because most provisional loads are destroyed |
- // and vanish before we get signal about what caused the abort (new |
- // navigation, stop button, etc.). |
- std::vector<std::unique_ptr<PageLoadTracker>> aborted_provisional_loads_; |
- |
- std::unique_ptr<PageLoadTracker> committed_load_; |
- |
- // Has the MWCO observed at least one navigation? |
- bool has_navigated_; |
- |
- DISALLOW_COPY_AND_ASSIGN(MetricsWebContentsObserver); |
-}; |
- |
-} // namespace page_load_metrics |
- |
-#endif // COMPONENTS_PAGE_LOAD_METRICS_BROWSER_METRICS_WEB_CONTENTS_OBSERVER_H_ |