Home | History | Annotate | Download | only in prerender
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_PRERENDER_PRERENDER_HISTOGRAMS_H_
      6 #define CHROME_BROWSER_PRERENDER_PRERENDER_HISTOGRAMS_H_
      7 
      8 #include <string>
      9 
     10 #include "base/time/time.h"
     11 #include "chrome/browser/prerender/prerender_contents.h"
     12 #include "chrome/browser/prerender/prerender_events.h"
     13 #include "chrome/browser/prerender/prerender_final_status.h"
     14 #include "chrome/browser/prerender/prerender_local_predictor.h"
     15 #include "chrome/browser/prerender/prerender_origin.h"
     16 #include "url/gurl.h"
     17 
     18 namespace prerender {
     19 
     20 // PrerenderHistograms is responsible for recording all prerender specific
     21 // histograms for PrerenderManager.  It keeps track of the type of prerender
     22 // currently underway (based on the PrerenderOrigin of the most recent
     23 // prerenders, and any experiments detected).
     24 // PrerenderHistograms does not necessarily record all histograms related to
     25 // prerendering, only the ones in the context of PrerenderManager.
     26 class PrerenderHistograms {
     27  public:
     28   // Owned by a PrerenderManager object for the lifetime of the
     29   // PrerenderManager.
     30   PrerenderHistograms();
     31 
     32   // Records the perceived page load time for a page - effectively the time from
     33   // when the user navigates to a page to when it finishes loading.  The actual
     34   // load may have started prior to navigation due to prerender hints.
     35   void RecordPerceivedPageLoadTime(Origin origin,
     36                                    base::TimeDelta perceived_page_load_time,
     37                                    bool was_prerender,
     38                                    bool was_complete_prerender,
     39                                    const GURL& url);
     40 
     41   // Records, in a histogram, the percentage of the page load time that had
     42   // elapsed by the time it is swapped in.  Values outside of [0, 1.0] are
     43   // invalid and ignored.
     44   void RecordPercentLoadDoneAtSwapin(Origin origin, double fraction) const;
     45 
     46   // Records the actual pageload time of a prerender that has not been swapped
     47   // in yet, but finished loading.
     48   void RecordPageLoadTimeNotSwappedIn(Origin origin,
     49                                       base::TimeDelta page_load_time,
     50                                       const GURL& url) const;
     51 
     52   // Records the time from when a page starts prerendering to when the user
     53   // navigates to it. This must be called on the UI thread.
     54   void RecordTimeUntilUsed(Origin origin,
     55                            base::TimeDelta time_until_used) const;
     56 
     57   // Record a PerSessionCount data point.
     58   void RecordPerSessionCount(Origin origin, int count) const;
     59 
     60   // Record time between two prerender requests.
     61   void RecordTimeBetweenPrerenderRequests(Origin origin,
     62                                           base::TimeDelta time) const;
     63 
     64   // Record a final status of a prerendered page in a histogram.
     65   void RecordFinalStatus(Origin origin,
     66                          uint8 experiment_id,
     67                          PrerenderContents::MatchCompleteStatus mc_status,
     68                          FinalStatus final_status) const;
     69 
     70   // To be called when a new prerender is added.
     71   void RecordPrerender(Origin origin, const GURL& url);
     72 
     73   // To be called when a new prerender is started.
     74   void RecordPrerenderStarted(Origin origin) const;
     75 
     76   // To be called when we know how many prerenders are running after starting
     77   // a prerender.
     78   void RecordConcurrency(size_t prerender_count) const;
     79 
     80   // Called when we swap in a prerender.
     81   void RecordUsedPrerender(Origin origin) const;
     82 
     83   // Record the time since a page was recently visited.
     84   void RecordTimeSinceLastRecentVisit(Origin origin,
     85                                       base::TimeDelta time) const;
     86 
     87   // Record a percentage of pixels of the final page already in place at
     88   // swap-in.
     89   void RecordFractionPixelsFinalAtSwapin(Origin origin, double fraction) const;
     90 
     91   // Records a prerender event.
     92   void RecordEvent(Origin origin, uint8 experiment_id, PrerenderEvent event)
     93       const;
     94 
     95   // Record a prerender cookie status bitmap. Must be in the range
     96   // [0, PrerenderContents::kNumCookieStatuses).
     97   void RecordCookieStatus(Origin origin,
     98                           uint8 experiment_id,
     99                           int cookie_status) const;
    100 
    101   void RecordPrerenderPageVisitedStatus(Origin origin,
    102                                         uint8 experiment_id,
    103                                         bool visited_before) const;
    104 
    105  private:
    106   base::TimeTicks GetCurrentTimeTicks() const;
    107 
    108   // Returns the time elapsed since the last prerender happened.
    109   base::TimeDelta GetTimeSinceLastPrerender() const;
    110 
    111   // Returns whether the PrerenderManager is currently within the prerender
    112   // window - effectively, up to 30 seconds after a prerender tag has been
    113   // observed.
    114   bool WithinWindow() const;
    115 
    116   // Returns the current experiment.
    117   uint8 GetCurrentExperimentId() const;
    118 
    119   // Returns whether or not there is currently an origin/experiment wash.
    120   bool IsOriginExperimentWash() const;
    121 
    122   // An integer indicating a Prerendering Experiment being currently conducted.
    123   // (The last experiment ID seen).
    124   uint8 last_experiment_id_;
    125 
    126   // Origin of the last prerender seen.
    127   Origin last_origin_;
    128 
    129   // A boolean indicating that we have recently encountered a combination of
    130   // different experiments and origins, making an attribution of PPLT's to
    131   // experiments / origins impossible.
    132   bool origin_experiment_wash_;
    133 
    134   // The time when we last saw a prerender request coming from a renderer.
    135   // This is used to record perceived PLT's for a certain amount of time
    136   // from the point that we last saw a <link rel=prerender> tag.
    137   base::TimeTicks last_prerender_seen_time_;
    138 
    139   // Indicates whether we have recorded page load events after the most
    140   // recent prerender.  These must be initialized to true, so that we don't
    141   // start recording events before the first prerender occurs.
    142   bool seen_any_pageload_;
    143   bool seen_pageload_started_after_prerender_;
    144 
    145   DISALLOW_COPY_AND_ASSIGN(PrerenderHistograms);
    146 };
    147 
    148 }  // namespace prerender
    149 
    150 #endif  // CHROME_BROWSER_PRERENDER_PRERENDER_HISTOGRAMS_H_
    151