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