activity_log.h revision 424c4d7b64af9d0d8fd9624f381f469654d5e3d2
15fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer// Use of this source code is governed by a BSD-style license that can be 35fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer// found in the LICENSE file. 45fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 55fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#ifndef CHROME_BROWSER_EXTENSIONS_ACTIVITY_LOG_ACTIVITY_LOG_H_ 65fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#define CHROME_BROWSER_EXTENSIONS_ACTIVITY_LOG_ACTIVITY_LOG_H_ 75fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 85fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#include <map> 95fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#include <string> 105fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#include <vector> 115fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 125fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#include "base/callback.h" 135fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#include "base/memory/singleton.h" 145fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#include "base/observer_list_threadsafe.h" 155fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#include "base/synchronization/lock.h" 165fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#include "base/threading/thread.h" 175fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#include "chrome/browser/extensions/activity_log/activity_actions.h" 185fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#include "chrome/browser/extensions/activity_log/activity_database.h" 195fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#include "chrome/browser/extensions/activity_log/activity_log_policy.h" 205fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#include "chrome/browser/extensions/install_observer.h" 215fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#include "chrome/browser/extensions/install_tracker.h" 225fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#include "chrome/browser/extensions/tab_helper.h" 235fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#include "chrome/browser/profiles/profile.h" 245fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#include "chrome/common/extensions/dom_action_types.h" 255fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#include "components/browser_context_keyed_service/browser_context_dependency_manager.h" 265fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#include "components/browser_context_keyed_service/browser_context_keyed_service.h" 275fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#include "components/browser_context_keyed_service/browser_context_keyed_service_factory.h" 285fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 295fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzerclass Profile; 305fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzerusing content::BrowserThread; 315fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 325fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzernamespace user_prefs { 335fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzerclass PrefRegistrySyncable; 345fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer} 355fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 365fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzernamespace extensions { 375fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzerclass Extension; 385fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzerclass ActivityLogPolicy; 395fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 405fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer// A utility for tracing interesting activity for each extension. 415fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer// It writes to an ActivityDatabase on a separate thread to record the activity. 425fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzerclass ActivityLog : public BrowserContextKeyedService, 435fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer public TabHelper::ScriptExecutionObserver, 445fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer public InstallObserver { 455fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer public: 465fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // Observers can listen for activity events. There is probably only one 475fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // observer: the activityLogPrivate API. 485fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer class Observer { 495fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer public: 505fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer virtual void OnExtensionActivity(scoped_refptr<Action> activity) = 0; 51e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall }; 525fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 535fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // ActivityLog is a singleton, so don't instantiate it with the constructor; 545fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // use GetInstance instead. 555fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer static ActivityLog* GetInstance(Profile* profile); 565fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 575fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // Specifies if AL was enabled at least for one profile. We use this method to 585fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // check if AL possibly enabled when a profile is not available, e.g., when 595fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // executing on thread other than UI. 605fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer static bool IsLogEnabledOnAnyProfile(); 615fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 625fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // Provides up-to-date information about whether the AL is enabled for a 635fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // profile. The AL is enabled if the user has installed the whitelisted 645fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // AL extension *or* set the --enable-extension-activity-logging flag. 655fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer bool IsLogEnabled(); 665fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 675fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // Add/remove observer: the activityLogPrivate API only listens when the 685fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // ActivityLog extension is registered for an event. 695fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer void AddObserver(Observer* observer); 705fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer void RemoveObserver(Observer* observer); 715fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 725fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // Logs an extension action: passes it to any installed policy to be logged 735fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // to the database, to any observers, and logs to the console if in testing 745fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // mode. 755fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer void LogAction(scoped_refptr<Action> action); 765fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 775fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // Retrieves the list of actions for a given extension on a specific day. 785fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // Today is 0, yesterday is 1, etc. Returns one day at a time. 795fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // Response is sent to the method/function in the callback. 805fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // Use base::Bind to create the callback. 815fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer void GetActions(const std::string& extension_id, 825fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer const int day, 835fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer const base::Callback 845fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer <void(scoped_ptr<std::vector<scoped_refptr<Action> > >)>& 855fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer callback); 865fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 875fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // Gets all actions that match the specified fields. URLs are treated like 885fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // prefixes; other fields are exact matches. Empty strings are not matched to 895fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // anything. 905fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer void GetFilteredActions( 915fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer const std::string& extension_id, 925fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer const Action::ActionType type, 935fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer const std::string& api_name, 945fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer const std::string& page_url, 955fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer const std::string& arg_url, 965fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer const base::Callback 975fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer <void(scoped_ptr<std::vector<scoped_refptr<Action> > >)>& callback); 985fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 995fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // Extension::InstallObserver 1005fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // We keep track of whether the whitelisted extension is installed; if it is, 1015fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // we want to recompute whether to have logging enabled. 1025fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer virtual void OnExtensionInstalled(const Extension* extension) OVERRIDE {} 1035fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer virtual void OnExtensionLoaded(const Extension* extension) OVERRIDE; 1045fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer virtual void OnExtensionUnloaded(const Extension* extension) OVERRIDE; 1055fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer virtual void OnExtensionUninstalled(const Extension* extension) OVERRIDE {} 1065fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // We also have to list the following from InstallObserver. 1075fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer virtual void OnBeginExtensionInstall(const std::string& extension_id, 1085fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer const std::string& extension_name, 1095fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer const gfx::ImageSkia& installing_icon, 1105fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer bool is_app, 1115fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer bool is_platform_app) OVERRIDE {} 1125fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer virtual void OnDownloadProgress(const std::string& extension_id, 1135fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer int percent_downloaded) OVERRIDE {} 1145fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer virtual void OnInstallFailure(const std::string& extension_id) OVERRIDE {} 1155fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer virtual void OnAppsReordered() OVERRIDE {} 1165fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer virtual void OnAppInstalledToAppList( 1175fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer const std::string& extension_id) OVERRIDE {} 1185fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer virtual void OnShutdown() OVERRIDE {} 1195fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 1205fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // BrowserContextKeyedService 1215fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer virtual void Shutdown() OVERRIDE; 1225fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 1235fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); 1245fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 1255fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // Clean up URLs from the activity log database. 1265fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // If restrict_urls is empty then all URLs in the activity log database are 1275fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // removed, otherwise only those in restrict_urls are removed. 1285fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer virtual void RemoveURLs(const std::vector<GURL>& restrict_urls); 129e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall virtual void RemoveURLs(const std::set<GURL>& restrict_urls); 1305fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer virtual void RemoveURL(const GURL& url); 1315fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 1325fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer private: 1335fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer friend class ActivityLogFactory; 1345fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer friend class ActivityLogTest; 135d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall friend class RenderViewActivityLogTest; 136d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall 137d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall explicit ActivityLog(Profile* profile); 138d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall virtual ~ActivityLog(); 139d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall 140d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall // Delayed initialization of Install Tracker which waits until after the 141d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall // ExtensionSystem/ExtensionService are done with their own setup. 142d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall void InitInstallTracker(); 143d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall 144d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall // TabHelper::ScriptExecutionObserver implementation. 145d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall // Fires when a ContentScript is executed. 1465fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer virtual void OnScriptsExecuted( 1475fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer const content::WebContents* web_contents, 1485fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer const ExecutingScriptsMap& extension_ids, 1495fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer int32 page_id, 1505fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer const GURL& on_url) OVERRIDE; 1515fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 1525fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // At the moment, ActivityLog will use only one policy for summarization. 1535fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // These methods are used to choose and set the most appropriate policy. 1545fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer void ChooseDefaultPolicy(); 1555fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer void SetDefaultPolicy(ActivityLogPolicy::PolicyType policy_type); 1565fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 1575fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer typedef ObserverListThreadSafe<Observer> ObserverList; 1585fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer scoped_refptr<ObserverList> observers_; 1595fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 1605fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // The policy object takes care of data summarization, compression, and 1615fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // logging. The policy object is owned by the ActivityLog, but this cannot 1625fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // be a scoped_ptr since some cleanup work must happen on the database 163d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall // thread. Calling policy_->Close() will free the object; see the comments 164d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall // on the ActivityDatabase class for full details. 165d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall ActivityLogPolicy* policy_; 166d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall 167d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall // TODO(dbabic,felt) change this into a list of policy types later. 168d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall ActivityLogPolicy::PolicyType policy_type_; 169d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall 170d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall Profile* profile_; 171d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall bool enabled_; // Whether logging is currently enabled. 172d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall bool policy_chosen_; // Whether we've already set the default policy. 173d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall // testing_mode_ controls whether to log API call arguments. By default, we 174d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall // don't log most arguments to avoid saving too much data. In testing mode, 175d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall // argument collection is enabled. We also whitelist some arguments for 176d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall // collection regardless of whether this bool is true. 177d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall // When testing_mode_ is enabled, we also print to the console. 178d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall bool testing_mode_; 179d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall // We need the DB, FILE, and IO threads to operate. In some cases (tests), 180d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall // these threads might not exist, so we avoid dispatching anything to the 181d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall // ActivityDatabase to prevent things from exploding. 182d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall bool has_threads_; 183d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall 184d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall // Used to track whether the whitelisted extension is installed. If it's 185d25948b9b4a9e361ef071dc8175df0407f60b7e0JP Abgrall // added or removed, enabled_ may change. 1865fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer InstallTracker* tracker_; 1875fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 1885fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // Set if the watchdog extension is present and active. Maintained by 1895fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // kWatchdogExtensionActive pref variable. 1905fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer bool watchdog_extension_active_; 1915fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 1925fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer // Specifies if AL was enabled at least for one profile. 1935fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer static bool enabled_on_any_profile_; 1945fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 1955fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer DISALLOW_COPY_AND_ASSIGN(ActivityLog); 1965fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer}; 1975fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 1985fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer// Each profile has different extensions, so we keep a different database for 1995fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer// each profile. 2005fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzerclass ActivityLogFactory : public BrowserContextKeyedServiceFactory { 2015fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer public: 2025fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer static ActivityLog* GetForProfile(Profile* profile) { 2035fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer return static_cast<ActivityLog*>( 2045fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer GetInstance()->GetServiceForBrowserContext(profile, true)); 2055fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer } 2065fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 2075fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer static ActivityLogFactory* GetInstance(); 2085fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 2095fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer private: 2105fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer friend struct DefaultSingletonTraits<ActivityLogFactory>; 2115fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer ActivityLogFactory(); 2125fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer virtual ~ActivityLogFactory(); 2135fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 2145fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer virtual BrowserContextKeyedService* BuildServiceInstanceFor( 2155fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer content::BrowserContext* profile) const OVERRIDE; 2165fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 2175fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer virtual content::BrowserContext* GetBrowserContextToUse( 2185fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer content::BrowserContext* context) const OVERRIDE; 2195fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 2205fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer DISALLOW_COPY_AND_ASSIGN(ActivityLogFactory); 2215fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer}; 2225fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 2235fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 2245fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer} // namespace extensions 2255fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer 2265fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer#endif // CHROME_BROWSER_EXTENSIONS_ACTIVITY_LOG_ACTIVITY_LOG_H_ 2275fe0b41dba699fa14432a633c863ea8cb7bf3f5dBernhard Rosenkränzer