alarm_manager.h revision cedac228d2dd51db4b79ea1e72c7f249408ee061
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_API_ALARMS_ALARM_MANAGER_H__
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_API_ALARMS_ALARM_MANAGER_H__
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <queue>
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <string>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/callback.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/scoped_observer.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/api/alarms.h"
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/browser_context_keyed_api_factory.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/extension_registry_observer.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Clock;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace base
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace content {
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class BrowserContext;
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace content
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionAlarmsSchedulingTest;
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ExtensionRegistry;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Alarm {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Alarm();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Alarm(const std::string& name,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const api::alarms::AlarmCreateInfo& create_info,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::TimeDelta min_granularity,
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Time now);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~Alarm();
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  linked_ptr<api::alarms::Alarm> js_alarm;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The granularity isn't exposed to the extension's javascript, but we poll at
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // least as often as the shortest alarm's granularity.  It's initialized as
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the relative delay requested in creation, even if creation uses an absolute
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // time.  This will always be at least as large as the min_granularity
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // constructor argument.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta granularity;
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // The minimum granularity is the minimum allowed polling rate. This stops
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // alarms from polling too often.
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::TimeDelta minimum_granularity;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Manages the currently pending alarms for every extension in a profile.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There is one manager per virtual Profile.
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class AlarmManager : public BrowserContextKeyedAPI,
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                     public ExtensionRegistryObserver,
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     public base::SupportsWeakPtr<AlarmManager> {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<Alarm> AlarmList;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Delegate {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Delegate() {}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called when an alarm fires.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnAlarm(const std::string& extension_id,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const Alarm& alarm) = 0;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit AlarmManager(content::BrowserContext* context);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~AlarmManager();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override the default delegate. Callee assumes onwership. Used for testing.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_delegate(Delegate* delegate) { delegate_.reset(delegate); }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  typedef base::Callback<void()> AddAlarmCallback;
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Adds |alarm| for the given extension, and starts the timer. Invokes
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // |callback| when done.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddAlarm(const std::string& extension_id,
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                const Alarm& alarm,
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                const AddAlarmCallback& callback);
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  typedef base::Callback<void(Alarm*)> GetAlarmCallback;
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Passes the alarm with the given name, or NULL if none exists, to
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // |callback|.
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void GetAlarm(const std::string& extension_id,
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                const std::string& name,
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                const GetAlarmCallback& callback);
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  typedef base::Callback<void(const AlarmList*)> GetAllAlarmsCallback;
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Passes the list of pending alarms for the given extension, or
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // NULL if none exist, to |callback|.
923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void GetAllAlarms(
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      const std::string& extension_id, const GetAllAlarmsCallback& callback);
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  typedef base::Callback<void(bool)> RemoveAlarmCallback;
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Cancels and removes the alarm with the given name. Invokes |callback| when
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // done.
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void RemoveAlarm(const std::string& extension_id,
993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                   const std::string& name,
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                   const RemoveAlarmCallback& callback);
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  typedef base::Callback<void()> RemoveAllAlarmsCallback;
1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Cancels and removes all alarms for the given extension. Invokes |callback|
1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // when done.
1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void RemoveAllAlarms(
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      const std::string& extension_id, const RemoveAllAlarmsCallback& callback);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Replaces AlarmManager's owned clock with |clock| and takes ownership of it.
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetClockForTesting(base::Clock* clock);
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // BrowserContextKeyedAPI implementation.
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static BrowserContextKeyedAPIFactory<AlarmManager>* GetFactoryInstance();
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Convenience method to get the AlarmManager for a content::BrowserContext.
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static AlarmManager* Get(content::BrowserContext* browser_context);
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  friend void RunScheduleNextPoll(AlarmManager*);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class ExtensionAlarmsSchedulingTest;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest, PollScheduling);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           ReleasedExtensionPollsInfrequently);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest, TimerRunning);
1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest, MinimumGranularity);
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest,
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           DifferentMinimumGranularities);
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest,
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           RepeatingAlarmsScheduledPredictably);
129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  friend class BrowserContextKeyedAPIFactory<AlarmManager>;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::string ExtensionId;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<ExtensionId, AlarmList> AlarmMap;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  typedef base::Callback<void(const std::string&)> ReadyAction;
1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  typedef std::queue<ReadyAction> ReadyQueue;
1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  typedef std::map<ExtensionId, ReadyQueue> ReadyMap;
1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Iterator used to identify a particular alarm within the Map/List pair.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "Not found" is represented by <alarms_.end(), invalid_iterator>.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::pair<AlarmMap::iterator, AlarmList::iterator> AlarmIterator;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Part of AddAlarm that is executed after alarms are loaded.
1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void AddAlarmWhenReady(const Alarm& alarm,
1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                         const AddAlarmCallback& callback,
1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                         const std::string& extension_id);
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Part of GetAlarm that is executed after alarms are loaded.
1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void GetAlarmWhenReady(const std::string& name,
1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                         const GetAlarmCallback& callback,
1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                         const std::string& extension_id);
1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Part of GetAllAlarms that is executed after alarms are loaded.
1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void GetAllAlarmsWhenReady(const GetAllAlarmsCallback& callback,
1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                             const std::string& extension_id);
1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Part of RemoveAlarm that is executed after alarms are loaded.
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void RemoveAlarmWhenReady(const std::string& name,
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                            const RemoveAlarmCallback& callback,
1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                            const std::string& extension_id);
1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Part of RemoveAllAlarms that is executed after alarms are loaded.
1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void RemoveAllAlarmsWhenReady(
1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      const RemoveAllAlarmsCallback& callback, const std::string& extension_id);
1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper to return the iterators within the AlarmMap and AlarmList for the
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // matching alarm, or an iterator to the end of the AlarmMap if none were
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // found.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AlarmIterator GetAlarmIterator(const std::string& extension_id,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const std::string& name);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper to cancel and remove the alarm at the given iterator. The iterator
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // must be valid.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveAlarmIterator(const AlarmIterator& iter);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for when an alarm fires.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnAlarm(AlarmIterator iter);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Internal helper to add an alarm and start the timer with the given delay.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddAlarmImpl(const std::string& extension_id,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const Alarm& alarm);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Syncs our alarm data for the given extension to/from the state storage.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WriteToStorage(const std::string& extension_id);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadFromStorage(const std::string& extension_id,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       scoped_ptr<base::Value> value);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Set the timer to go off at the specified |time|, and set |next_poll_time|
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // appropriately.
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetNextPollTime(const base::Time& time);
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Schedules the next poll of alarms for when the next soonest alarm runs,
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // but not more often than the minimum granularity of all alarms.
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ScheduleNextPoll();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Polls the alarms, running any that have elapsed. After running them and
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // rescheduling repeating alarms, schedule the next poll.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PollAlarms();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Executes |action| for given extension, making sure that the extension's
2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // alarm data has been synced from the storage.
2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void RunWhenReady(const std::string& extension_id, const ReadyAction& action);
2023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // ExtensionRegistryObserver implementation.
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnExtensionLoaded(content::BrowserContext* browser_context,
205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 const Extension* extension) OVERRIDE;
206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnExtensionUninstalled(content::BrowserContext* browser_context,
207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      const Extension* extension) OVERRIDE;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // BrowserContextKeyedAPI implementation.
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static const char* service_name() {
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return "AlarmManager";
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static const bool kServiceHasOwnInstanceInIncognito = true;
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  content::BrowserContext* const browser_context_;
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<base::Clock> clock_;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Delegate> delegate_;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Listen to extension load notifications.
220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      extension_registry_observer_;
222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The timer for this alarm manager.
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::OneShotTimer<AlarmManager> timer_;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A map of our pending alarms, per extension.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invariant: None of the AlarmLists are empty.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AlarmMap alarms_;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // A map of actions waiting for alarm data to be synced from storage, per
2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // extension.
2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ReadyMap ready_actions_;
2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // The previous time that alarms were run.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time last_poll_time_;
2363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Next poll's time.
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::Time next_poll_time_;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AlarmManager);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  //  namespace extensions
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_API_ALARMS_ALARM_MANAGER_H__
246