• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 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_EXTENSIONS_ACTIVITY_LOG_UMA_POLICY_H_
6 #define CHROME_BROWSER_EXTENSIONS_ACTIVITY_LOG_UMA_POLICY_H_
7 
8 #include <map>
9 #include <string>
10 
11 #include "chrome/browser/extensions/activity_log/activity_log_policy.h"
12 
13 #include "chrome/browser/ui/browser_list_observer.h"
14 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
15 #include "url/gurl.h"
16 
17 namespace extensions {
18 
19 // The UmaPolicy keeps track of how many extensions have read from or modified
20 // a given pageload. UmaPolicy records to a histogram when a given tab is
21 // closed. Caveats:
22 //   * If multiple tabs are open for the same URL at the same time, UmaPolicy
23 //     treats them as if they are the same.
24 //   * UmaPolicy does not record statistics for incognito tabs. (For privacy.)
25 //   * If the number of tabs open exceeds 50, UmaPolicy stops recording stats
26 //     for tabs 51+. (For memory.)
27 //   * UmaPolicy only handles top frames; stats are not recorded for iframes.
28 class UmaPolicy : public ActivityLogPolicy,
29                   public TabStripModelObserver,
30                   public chrome::BrowserListObserver {
31  public:
32   // The possible status bits for a pageload. If you alter this, make sure to
33   // also update GetHistogramName.
34   enum PageStatus {
35     NONE = 0,
36     CONTENT_SCRIPT = 1,
37     READ_DOM,
38     MODIFIED_DOM,
39     DOM_METHOD,
40     DOCUMENT_WRITE,
41     INNER_HTML,
42     CREATED_SCRIPT,
43     CREATED_IFRAME,
44     CREATED_DIV,
45     CREATED_LINK,
46     CREATED_INPUT,
47     CREATED_EMBED,
48     CREATED_OBJECT,
49     MAX_STATUS  // Insert new page statuses right before this one.
50   };
51 
52   explicit UmaPolicy(Profile* profile);
53 
54   virtual void ProcessAction(scoped_refptr<Action> action) OVERRIDE;
55   virtual void Close() OVERRIDE;
56 
57   // Gets the histogram name associated with each PageStatus.
58   static const char* GetHistogramName(PageStatus status);
59 
60  protected:
61   // Run when Close() is called.
62   virtual ~UmaPolicy();
63 
64  private:
65   // Used as a special key in the ExtensionMap.
66   static const char kNumberOfTabs[];
67 
68   // The max number of tabs we track at a time.
69   static const size_t kMaxTabsTracked;
70 
71   typedef std::map<std::string, int> ExtensionMap;
72   typedef std::map<std::string, ExtensionMap> SiteMap;
73 
74   // BrowserListObserver
75   virtual void OnBrowserAdded(Browser* browser) OVERRIDE;
76   virtual void OnBrowserRemoved(Browser* browser) OVERRIDE;
77 
78   // TabStripModelObserver
79   // Fired when a page loads, either as a new tab or replacing the contents of
80   // an older tab.
81   virtual void TabChangedAt(content::WebContents* contents,
82                             int index,
83                             TabChangeType change_type) OVERRIDE;
84   // Fired when a tab closes.
85   virtual void TabClosingAt(TabStripModel* tab_strip_model,
86                             content::WebContents* contents,
87                             int index) OVERRIDE;
88 
89   // Assign a status bitmask based on the action's properties.
90   int MatchActionToStatus(scoped_refptr<Action> action);
91 
92   // When a page is opened, add it to the SiteMap url_status_.
93   void SetupOpenedPage(const std::string& url);
94 
95   // When a page is closing, remove it from the SiteMap url_status_.
96   void CleanupClosedPage(const std::string& url);
97 
98   // When a page is closing, save statistics about the page to histograms.
99   void HistogramOnClose(const std::string& url);
100 
101   // Standardizes the way URLs are treated.
102   static std::string CleanURL(const GURL& gurl);
103 
104   // Used by UmaPolicyTest.ProcessActionTest.
url_status()105   SiteMap url_status() { return url_status_; }
106 
107   Profile* profile_;
108 
109   // URL -> extension id -> page status.
110   SiteMap url_status_;
111 
112   // tab index -> URL.
113   std::map<int32, std::string> tab_list_;
114 
115   FRIEND_TEST_ALL_PREFIXES(UmaPolicyTest, CleanURLTest);
116   FRIEND_TEST_ALL_PREFIXES(UmaPolicyTest, MatchActionToStatusTest);
117   FRIEND_TEST_ALL_PREFIXES(UmaPolicyTest, ProcessActionTest);
118   FRIEND_TEST_ALL_PREFIXES(UmaPolicyTest, SiteUrlTest);
119 };
120 
121 }  // namespace extensions
122 
123 #endif  // CHROME_BROWSER_EXTENSIONS_ACTIVITY_LOG_UMA_POLICY_H_
124