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"
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/gtest_prod_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/scoped_observer.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/api/alarms.h"
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/browser_context_keyed_api_factory.h"
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/browser/extension_registry_observer.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Clock;
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace base
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace content {
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class BrowserContext;
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace content
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionAlarmsSchedulingTest;
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ExtensionRegistry;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Alarm {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Alarm();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Alarm(const std::string& name,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const api::alarms::AlarmCreateInfo& create_info,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::TimeDelta min_granularity,
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Time now);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~Alarm();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  linked_ptr<api::alarms::Alarm> js_alarm;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The granularity isn't exposed to the extension's javascript, but we poll at
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // least as often as the shortest alarm's granularity.  It's initialized as
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the relative delay requested in creation, even if creation uses an absolute
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // time.  This will always be at least as large as the min_granularity
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // constructor argument.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta granularity;
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // The minimum granularity is the minimum allowed polling rate. This stops
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // alarms from polling too often.
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  base::TimeDelta minimum_granularity;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Manages the currently pending alarms for every extension in a profile.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// There is one manager per virtual Profile.
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class AlarmManager : public BrowserContextKeyedAPI,
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                     public ExtensionRegistryObserver,
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     public base::SupportsWeakPtr<AlarmManager> {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<Alarm> AlarmList;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Delegate {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Delegate() {}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called when an alarm fires.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnAlarm(const std::string& extension_id,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const Alarm& alarm) = 0;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit AlarmManager(content::BrowserContext* context);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~AlarmManager();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override the default delegate. Callee assumes onwership. Used for testing.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_delegate(Delegate* delegate) { delegate_.reset(delegate); }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  typedef base::Callback<void()> AddAlarmCallback;
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Adds |alarm| for the given extension, and starts the timer. Invokes
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // |callback| when done.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddAlarm(const std::string& extension_id,
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                const Alarm& alarm,
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                const AddAlarmCallback& callback);
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  typedef base::Callback<void(Alarm*)> GetAlarmCallback;
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Passes the alarm with the given name, or NULL if none exists, to
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // |callback|.
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void GetAlarm(const std::string& extension_id,
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                const std::string& name,
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                const GetAlarmCallback& callback);
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  typedef base::Callback<void(const AlarmList*)> GetAllAlarmsCallback;
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Passes the list of pending alarms for the given extension, or
923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // NULL if none exist, to |callback|.
933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void GetAllAlarms(
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      const std::string& extension_id, const GetAllAlarmsCallback& callback);
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  typedef base::Callback<void(bool)> RemoveAlarmCallback;
973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Cancels and removes the alarm with the given name. Invokes |callback| when
983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // done.
993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void RemoveAlarm(const std::string& extension_id,
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                   const std::string& name,
1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                   const RemoveAlarmCallback& callback);
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  typedef base::Callback<void()> RemoveAllAlarmsCallback;
1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Cancels and removes all alarms for the given extension. Invokes |callback|
1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // when done.
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void RemoveAllAlarms(
1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      const std::string& extension_id, const RemoveAllAlarmsCallback& callback);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Replaces AlarmManager's owned clock with |clock| and takes ownership of it.
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetClockForTesting(base::Clock* clock);
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // BrowserContextKeyedAPI implementation.
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static BrowserContextKeyedAPIFactory<AlarmManager>* GetFactoryInstance();
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Convenience method to get the AlarmManager for a content::BrowserContext.
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static AlarmManager* Get(content::BrowserContext* browser_context);
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  friend void RunScheduleNextPoll(AlarmManager*);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class ExtensionAlarmsSchedulingTest;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest, PollScheduling);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           ReleasedExtensionPollsInfrequently);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest, TimerRunning);
1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest, MinimumGranularity);
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest,
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           DifferentMinimumGranularities);
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest,
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           RepeatingAlarmsScheduledPredictably);
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  friend class BrowserContextKeyedAPIFactory<AlarmManager>;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::string ExtensionId;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<ExtensionId, AlarmList> AlarmMap;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  typedef base::Callback<void(const std::string&)> ReadyAction;
1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  typedef std::queue<ReadyAction> ReadyQueue;
1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  typedef std::map<ExtensionId, ReadyQueue> ReadyMap;
1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Iterator used to identify a particular alarm within the Map/List pair.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "Not found" is represented by <alarms_.end(), invalid_iterator>.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::pair<AlarmMap::iterator, AlarmList::iterator> AlarmIterator;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Part of AddAlarm that is executed after alarms are loaded.
1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void AddAlarmWhenReady(const Alarm& alarm,
1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                         const AddAlarmCallback& callback,
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                         const std::string& extension_id);
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Part of GetAlarm that is executed after alarms are loaded.
1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void GetAlarmWhenReady(const std::string& name,
1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                         const GetAlarmCallback& callback,
1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                         const std::string& extension_id);
1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Part of GetAllAlarms that is executed after alarms are loaded.
1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void GetAllAlarmsWhenReady(const GetAllAlarmsCallback& callback,
1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                             const std::string& extension_id);
1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Part of RemoveAlarm that is executed after alarms are loaded.
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void RemoveAlarmWhenReady(const std::string& name,
1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                            const RemoveAlarmCallback& callback,
1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                            const std::string& extension_id);
1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Part of RemoveAllAlarms that is executed after alarms are loaded.
1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void RemoveAllAlarmsWhenReady(
1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      const RemoveAllAlarmsCallback& callback, const std::string& extension_id);
1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper to return the iterators within the AlarmMap and AlarmList for the
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // matching alarm, or an iterator to the end of the AlarmMap if none were
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // found.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AlarmIterator GetAlarmIterator(const std::string& extension_id,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const std::string& name);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper to cancel and remove the alarm at the given iterator. The iterator
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // must be valid.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveAlarmIterator(const AlarmIterator& iter);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Callback for when an alarm fires.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnAlarm(AlarmIterator iter);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Internal helper to add an alarm and start the timer with the given delay.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddAlarmImpl(const std::string& extension_id,
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const Alarm& alarm);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Syncs our alarm data for the given extension to/from the state storage.
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WriteToStorage(const std::string& extension_id);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadFromStorage(const std::string& extension_id,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       scoped_ptr<base::Value> value);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Set the timer to go off at the specified |time|, and set |next_poll_time|
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // appropriately.
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetNextPollTime(const base::Time& time);
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Schedules the next poll of alarms for when the next soonest alarm runs,
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // but not more often than the minimum granularity of all alarms.
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ScheduleNextPoll();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Polls the alarms, running any that have elapsed. After running them and
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // rescheduling repeating alarms, schedule the next poll.
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PollAlarms();
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Executes |action| for given extension, making sure that the extension's
2013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // alarm data has been synced from the storage.
2023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void RunWhenReady(const std::string& extension_id, const ReadyAction& action);
2033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // ExtensionRegistryObserver implementation.
205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnExtensionLoaded(content::BrowserContext* browser_context,
206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 const Extension* extension) OVERRIDE;
207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void OnExtensionUninstalled(content::BrowserContext* browser_context,
208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                      const Extension* extension) OVERRIDE;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // BrowserContextKeyedAPI implementation.
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static const char* service_name() {
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return "AlarmManager";
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static const bool kServiceHasOwnInstanceInIncognito = true;
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  content::BrowserContext* const browser_context_;
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<base::Clock> clock_;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Delegate> delegate_;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Listen to extension load notifications.
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ScopedObserver<ExtensionRegistry, ExtensionRegistryObserver>
222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      extension_registry_observer_;
223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The timer for this alarm manager.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::OneShotTimer<AlarmManager> timer_;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A map of our pending alarms, per extension.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invariant: None of the AlarmLists are empty.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AlarmMap alarms_;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // A map of actions waiting for alarm data to be synced from storage, per
2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // extension.
2333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ReadyMap ready_actions_;
2343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // The previous time that alarms were run.
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time last_poll_time_;
2373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Next poll's time.
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::Time next_poll_time_;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AlarmManager);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  //  namespace extensions
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_API_ALARMS_ALARM_MANAGER_H__
247