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