Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(304)

Side by Side Diff: chrome/browser/extensions/activity_log/activity_log.h

Issue 2077723002: [Extensions] Short-circuit activity logging if not enabled (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add Test Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | chrome/browser/extensions/activity_log/activity_log.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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 #ifndef CHROME_BROWSER_EXTENSIONS_ACTIVITY_LOG_ACTIVITY_LOG_H_ 5 #ifndef CHROME_BROWSER_EXTENSIONS_ACTIVITY_LOG_ACTIVITY_LOG_H_
6 #define CHROME_BROWSER_EXTENSIONS_ACTIVITY_LOG_ACTIVITY_LOG_H_ 6 #define CHROME_BROWSER_EXTENSIONS_ACTIVITY_LOG_ACTIVITY_LOG_H_
7 7
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <map> 10 #include <map>
11 #include <string> 11 #include <string>
12 #include <vector> 12 #include <vector>
13 13
14 #include "base/callback.h" 14 #include "base/callback.h"
15 #include "base/gtest_prod_util.h" 15 #include "base/gtest_prod_util.h"
16 #include "base/macros.h" 16 #include "base/macros.h"
17 #include "base/observer_list_threadsafe.h" 17 #include "base/observer_list_threadsafe.h"
18 #include "base/scoped_observer.h" 18 #include "base/scoped_observer.h"
19 #include "base/synchronization/lock.h"
20 #include "base/threading/thread.h" 19 #include "base/threading/thread.h"
21 #include "chrome/browser/extensions/activity_log/activity_actions.h" 20 #include "chrome/browser/extensions/activity_log/activity_actions.h"
22 #include "chrome/browser/extensions/activity_log/activity_log_policy.h" 21 #include "chrome/browser/extensions/activity_log/activity_log_policy.h"
23 #include "extensions/browser/api_activity_monitor.h" 22 #include "content/public/browser/notification_observer.h"
23 #include "content/public/browser/notification_registrar.h"
24 #include "extensions/browser/browser_context_keyed_api_factory.h" 24 #include "extensions/browser/browser_context_keyed_api_factory.h"
25 #include "extensions/browser/extension_registry_observer.h" 25 #include "extensions/browser/extension_registry_observer.h"
26 #include "extensions/browser/script_execution_observer.h" 26 #include "extensions/browser/script_execution_observer.h"
27 #include "extensions/common/dom_action_types.h" 27 #include "extensions/common/dom_action_types.h"
28 28
29 class Profile; 29 class Profile;
30 30
31 namespace content { 31 namespace content {
32 class BrowserContext; 32 class BrowserContext;
33 } 33 }
34 34
35 namespace user_prefs { 35 namespace user_prefs {
36 class PrefRegistrySyncable; 36 class PrefRegistrySyncable;
37 } 37 }
38 38
39 namespace extensions { 39 namespace extensions {
40 class Extension; 40 class Extension;
41 class ExtensionRegistry; 41 class ExtensionRegistry;
42 42
43 // A utility for tracing interesting activity for each extension. 43 // A utility for tracing interesting activity for each extension.
44 // It writes to an ActivityDatabase on a separate thread to record the activity. 44 // It writes to an ActivityDatabase on a separate thread to record the activity.
45 // Each profile has different extensions, so we keep a different database for 45 // Each profile has different extensions, so we keep a different database for
46 // each profile. 46 // each profile.
47 // 47 //
48 class ActivityLog : public BrowserContextKeyedAPI, 48 class ActivityLog : public BrowserContextKeyedAPI,
49 public ApiActivityMonitor,
50 public ScriptExecutionObserver, 49 public ScriptExecutionObserver,
51 public ExtensionRegistryObserver { 50 public ExtensionRegistryObserver,
51 public content::NotificationObserver {
52 public: 52 public:
53 // Observers can listen for activity events. There is probably only one 53 // Observers can listen for activity events. There is probably only one
54 // observer: the activityLogPrivate API. 54 // observer: the activityLogPrivate API.
55 class Observer { 55 class Observer {
56 public: 56 public:
57 virtual void OnExtensionActivity(scoped_refptr<Action> activity) = 0; 57 virtual void OnExtensionActivity(scoped_refptr<Action> activity) = 0;
58 }; 58 };
59 59
60 static BrowserContextKeyedAPIFactory<ActivityLog>* GetFactoryInstance(); 60 static BrowserContextKeyedAPIFactory<ActivityLog>* GetFactoryInstance();
61 61
62 // ActivityLog is a KeyedService, so don't instantiate it with 62 // ActivityLog is a KeyedService, so don't instantiate it with
63 // the constructor; use GetInstance instead. 63 // the constructor; use GetInstance instead.
64 static ActivityLog* GetInstance(content::BrowserContext* context); 64 static ActivityLog* GetInstance(content::BrowserContext* context);
65 65
66 // Add/remove observer: the activityLogPrivate API only listens when the 66 // Add/remove observer: the activityLogPrivate API only listens when the
67 // ActivityLog extension is registered for an event. 67 // ActivityLog extension is registered for an event.
68 void AddObserver(Observer* observer); 68 void AddObserver(Observer* observer);
69 void RemoveObserver(Observer* observer); 69 void RemoveObserver(Observer* observer);
70 70
71 // Logs an extension action: passes it to any installed policy to be logged 71 // Logs an extension action: passes it to any installed policy to be logged
72 // to the database, to any observers, and logs to the console if in testing 72 // to the database, to any observers, and logs to the console if in testing
73 // mode. 73 // mode.
74 void LogAction(scoped_refptr<Action> action); 74 void LogAction(scoped_refptr<Action> action);
75 75
76 // Returns true if an event for the given extension should be logged.
77 bool ShouldLog(const std::string& extension_id) const;
78
76 // Gets all actions that match the specified fields. URLs are treated like 79 // Gets all actions that match the specified fields. URLs are treated like
77 // prefixes; other fields are exact matches. Empty strings are not matched to 80 // prefixes; other fields are exact matches. Empty strings are not matched to
78 // anything. For daysAgo, today is 0, yesterday is 1, etc.; a negative number 81 // anything. For daysAgo, today is 0, yesterday is 1, etc.; a negative number
79 // of days is treated as a missing parameter. 82 // of days is treated as a missing parameter.
80 void GetFilteredActions( 83 void GetFilteredActions(
81 const std::string& extension_id, 84 const std::string& extension_id,
82 const Action::ActionType type, 85 const Action::ActionType type,
83 const std::string& api_name, 86 const std::string& api_name,
84 const std::string& page_url, 87 const std::string& page_url,
85 const std::string& arg_url, 88 const std::string& arg_url,
86 const int days_ago, 89 const int days_ago,
87 const base::Callback< 90 const base::Callback<
88 void(std::unique_ptr<std::vector<scoped_refptr<Action>>>)>& callback); 91 void(std::unique_ptr<std::vector<scoped_refptr<Action>>>)>& callback);
89 92
90 // ExtensionRegistryObserver. 93 // ExtensionRegistryObserver.
91 // We keep track of whether the whitelisted extension is installed; if it is, 94 // We keep track of whether the whitelisted extension is installed; if it is,
92 // we want to recompute whether to have logging enabled. 95 // we want to recompute whether to have logging enabled.
93 void OnExtensionLoaded(content::BrowserContext* browser_context, 96 void OnExtensionLoaded(content::BrowserContext* browser_context,
94 const Extension* extension) override; 97 const Extension* extension) override;
95 void OnExtensionUnloaded(content::BrowserContext* browser_context, 98 void OnExtensionUnloaded(content::BrowserContext* browser_context,
96 const Extension* extension, 99 const Extension* extension,
97 UnloadedExtensionInfo::Reason reason) override; 100 UnloadedExtensionInfo::Reason reason) override;
98 void OnExtensionUninstalled(content::BrowserContext* browser_context, 101 void OnExtensionUninstalled(content::BrowserContext* browser_context,
99 const Extension* extension, 102 const Extension* extension,
100 extensions::UninstallReason reason) override; 103 extensions::UninstallReason reason) override;
101 104
102 // ApiActivityMonitor.
103 void OnApiEventDispatched(
104 const std::string& extension_id,
105 const std::string& event_name,
106 std::unique_ptr<base::ListValue> event_args) override;
107 void OnApiFunctionCalled(
108 const std::string& extension_id,
109 const std::string& api_name,
110 std::unique_ptr<base::ListValue> event_args) override;
111
112 static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); 105 static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
113 106
114 // Remove actions from the activity log database which IDs specified in the 107 // Remove actions from the activity log database which IDs specified in the
115 // action_ids array. 108 // action_ids array.
116 void RemoveActions(const std::vector<int64_t>& action_ids); 109 void RemoveActions(const std::vector<int64_t>& action_ids);
117 110
118 // Clean up URLs from the activity log database. 111 // Clean up URLs from the activity log database.
119 // If restrict_urls is empty then all URLs in the activity log database are 112 // If restrict_urls is empty then all URLs in the activity log database are
120 // removed, otherwise only those in restrict_urls are removed. 113 // removed, otherwise only those in restrict_urls are removed.
121 void RemoveURLs(const std::vector<GURL>& restrict_urls); 114 void RemoveURLs(const std::vector<GURL>& restrict_urls);
(...skipping 29 matching lines...) Expand all
151 const ExecutingScriptsMap& extension_ids, 144 const ExecutingScriptsMap& extension_ids,
152 const GURL& on_url) override; 145 const GURL& on_url) override;
153 146
154 // At the moment, ActivityLog will use only one policy for summarization. 147 // At the moment, ActivityLog will use only one policy for summarization.
155 // These methods are used to choose and set the most appropriate policy. 148 // These methods are used to choose and set the most appropriate policy.
156 // Changing policies at runtime is not recommended, and likely only should be 149 // Changing policies at runtime is not recommended, and likely only should be
157 // done for unit tests. 150 // done for unit tests.
158 void ChooseDatabasePolicy(); 151 void ChooseDatabasePolicy();
159 void SetDatabasePolicy(ActivityLogPolicy::PolicyType policy_type); 152 void SetDatabasePolicy(ActivityLogPolicy::PolicyType policy_type);
160 153
154 // Checks the current |is_active_| state and modifies it if appropriate.
155 void CheckActive();
156
157 // content::NotificationObserver:
158 void Observe(int type,
159 const content::NotificationSource& source,
160 const content::NotificationDetails& details) override;
161
161 // BrowserContextKeyedAPI implementation. 162 // BrowserContextKeyedAPI implementation.
162 static const char* service_name() { return "ActivityLog"; } 163 static const char* service_name() { return "ActivityLog"; }
163 static const bool kServiceRedirectedInIncognito = true; 164 static const bool kServiceRedirectedInIncognito = true;
164 static const bool kServiceIsCreatedWithBrowserContext = false; 165 static const bool kServiceIsCreatedWithBrowserContext = false;
165 166
166 typedef base::ObserverListThreadSafe<Observer> ObserverList; 167 typedef base::ObserverListThreadSafe<Observer> ObserverList;
167 scoped_refptr<ObserverList> observers_; 168 scoped_refptr<ObserverList> observers_;
168 169
169 // Policy objects are owned by the ActivityLog, but cannot be scoped_ptrs 170 // Policy objects are owned by the ActivityLog, but cannot be scoped_ptrs
170 // since they may need to do some cleanup work on the database thread. 171 // since they may need to do some cleanup work on the database thread.
(...skipping 24 matching lines...) Expand all
195 // added or removed, enabled_ may change. 196 // added or removed, enabled_ may change.
196 ScopedObserver<extensions::ExtensionRegistry, 197 ScopedObserver<extensions::ExtensionRegistry,
197 extensions::ExtensionRegistryObserver> 198 extensions::ExtensionRegistryObserver>
198 extension_registry_observer_; 199 extension_registry_observer_;
199 200
200 // Set if the watchdog app is installed and enabled. Maintained by 201 // Set if the watchdog app is installed and enabled. Maintained by
201 // kWatchdogExtensionActive pref variable. Since there are multiple valid 202 // kWatchdogExtensionActive pref variable. Since there are multiple valid
202 // extension IDs, this needs to be an int to count how many are installed. 203 // extension IDs, this needs to be an int to count how many are installed.
203 int watchdog_apps_active_; 204 int watchdog_apps_active_;
204 205
206 // True if the activity log is currently active.
207 bool is_active_;
208
209 content::NotificationRegistrar registrar_;
210
205 FRIEND_TEST_ALL_PREFIXES(ActivityLogApiTest, TriggerEvent); 211 FRIEND_TEST_ALL_PREFIXES(ActivityLogApiTest, TriggerEvent);
206 FRIEND_TEST_ALL_PREFIXES(ActivityLogEnabledTest, AppAndCommandLine); 212 FRIEND_TEST_ALL_PREFIXES(ActivityLogEnabledTest, AppAndCommandLine);
207 FRIEND_TEST_ALL_PREFIXES(ActivityLogEnabledTest, CommandLineSwitch); 213 FRIEND_TEST_ALL_PREFIXES(ActivityLogEnabledTest, CommandLineSwitch);
208 FRIEND_TEST_ALL_PREFIXES(ActivityLogEnabledTest, NoSwitch); 214 FRIEND_TEST_ALL_PREFIXES(ActivityLogEnabledTest, NoSwitch);
209 FRIEND_TEST_ALL_PREFIXES(ActivityLogEnabledTest, PrefSwitch); 215 FRIEND_TEST_ALL_PREFIXES(ActivityLogEnabledTest, PrefSwitch);
210 FRIEND_TEST_ALL_PREFIXES(ActivityLogEnabledTest, WatchdogSwitch); 216 FRIEND_TEST_ALL_PREFIXES(ActivityLogEnabledTest, WatchdogSwitch);
211 DISALLOW_COPY_AND_ASSIGN(ActivityLog); 217 DISALLOW_COPY_AND_ASSIGN(ActivityLog);
212 }; 218 };
213 219
214 template <> 220 template <>
215 void BrowserContextKeyedAPIFactory<ActivityLog>::DeclareFactoryDependencies(); 221 void BrowserContextKeyedAPIFactory<ActivityLog>::DeclareFactoryDependencies();
216 222
217 } // namespace extensions 223 } // namespace extensions
218 224
219 #endif // CHROME_BROWSER_EXTENSIONS_ACTIVITY_LOG_ACTIVITY_LOG_H_ 225 #endif // CHROME_BROWSER_EXTENSIONS_ACTIVITY_LOG_ACTIVITY_LOG_H_
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/extensions/activity_log/activity_log.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698