| Index: chrome/browser/extensions/api/alarms/alarm_manager.h
|
| diff --git a/chrome/browser/extensions/api/alarms/alarm_manager.h b/chrome/browser/extensions/api/alarms/alarm_manager.h
|
| index 6930998c2075e505d2cef7adedae5715811e8755..2c46f9fdd07f7d5fa408661bc3a0a58e9aebe86d 100644
|
| --- a/chrome/browser/extensions/api/alarms/alarm_manager.h
|
| +++ b/chrome/browser/extensions/api/alarms/alarm_manager.h
|
| @@ -23,14 +23,33 @@ namespace extensions {
|
|
|
| class ExtensionAlarmsSchedulingTest;
|
|
|
| +struct Alarm {
|
| + typedef base::Time (*TimeProvider)();
|
| +
|
| + Alarm();
|
| + Alarm(const std::string& name,
|
| + const api::alarms::AlarmCreateInfo& create_info,
|
| + base::TimeDelta min_granularity,
|
| + TimeProvider now);
|
| + ~Alarm();
|
| +
|
| + linked_ptr<api::alarms::Alarm> js_alarm;
|
| + // The granularity isn't exposed to the extension's javascript, but we poll at
|
| + // least as often as the shortest alarm's granularity. It's initialized as
|
| + // the relative delay requested in creation, even if creation uses an absolute
|
| + // time. This will always be at least as large as the min_granularity
|
| + // constructor argument.
|
| + base::TimeDelta granularity;
|
| +};
|
| +
|
| // Manages the currently pending alarms for every extension in a profile.
|
| // There is one manager per virtual Profile.
|
| class AlarmManager
|
| : public content::NotificationObserver,
|
| public base::SupportsWeakPtr<AlarmManager> {
|
| public:
|
| - typedef extensions::api::alarms::Alarm Alarm;
|
| - typedef std::vector<linked_ptr<Alarm> > AlarmList;
|
| + typedef base::Time (*TimeProvider)();
|
| + typedef std::vector<Alarm> AlarmList;
|
|
|
| class Delegate {
|
| public:
|
| @@ -40,7 +59,8 @@ class AlarmManager
|
| const Alarm& alarm) = 0;
|
| };
|
|
|
| - explicit AlarmManager(Profile* profile);
|
| + // 'now' is usually &base::Time::Now.
|
| + explicit AlarmManager(Profile* profile, TimeProvider now);
|
| virtual ~AlarmManager();
|
|
|
| // Override the default delegate. Callee assumes onwership. Used for testing.
|
| @@ -48,7 +68,7 @@ class AlarmManager
|
|
|
| // Adds |alarm| for the given extension, and starts the timer.
|
| void AddAlarm(const std::string& extension_id,
|
| - const linked_ptr<Alarm>& alarm);
|
| + const Alarm& alarm);
|
|
|
| // Returns the alarm with the given name, or NULL if none exists.
|
| const Alarm* GetAlarm(const std::string& extension_id,
|
| @@ -70,6 +90,8 @@ class AlarmManager
|
| FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsTest, Clear);
|
| friend class ExtensionAlarmsSchedulingTest;
|
| FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest, PollScheduling);
|
| + FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest,
|
| + ReleasedExtensionPollsInfrequently);
|
| FRIEND_TEST_ALL_PREFIXES(ExtensionAlarmsSchedulingTest, TimerRunning);
|
|
|
| typedef std::string ExtensionId;
|
| @@ -79,12 +101,6 @@ class AlarmManager
|
| // "Not found" is represented by <alarms_.end(), invalid_iterator>.
|
| typedef std::pair<AlarmMap::iterator, AlarmList::iterator> AlarmIterator;
|
|
|
| - struct AlarmRuntimeInfo {
|
| - std::string extension_id;
|
| - base::Time time;
|
| - };
|
| - typedef std::map<const Alarm*, AlarmRuntimeInfo> AlarmRuntimeInfoMap;
|
| -
|
| // Helper to return the iterators within the AlarmMap and AlarmList for the
|
| // matching alarm, or an iterator to the end of the AlarmMap if none were
|
| // found.
|
| @@ -96,12 +112,11 @@ class AlarmManager
|
| void RemoveAlarmIterator(const AlarmIterator& iter);
|
|
|
| // Callback for when an alarm fires.
|
| - void OnAlarm(const std::string& extension_id, const std::string& name);
|
| + void OnAlarm(AlarmIterator iter);
|
|
|
| // Internal helper to add an alarm and start the timer with the given delay.
|
| void AddAlarmImpl(const std::string& extension_id,
|
| - const linked_ptr<Alarm>& alarm,
|
| - base::TimeDelta time_delay);
|
| + const Alarm& alarm);
|
|
|
| // Syncs our alarm data for the given extension to/from the state storage.
|
| void WriteToStorage(const std::string& extension_id);
|
| @@ -122,6 +137,7 @@ class AlarmManager
|
| const content::NotificationDetails& details) OVERRIDE;
|
|
|
| Profile* profile_;
|
| + const TimeProvider now_;
|
| content::NotificationRegistrar registrar_;
|
| scoped_ptr<Delegate> delegate_;
|
|
|
| @@ -129,11 +145,9 @@ class AlarmManager
|
| base::OneShotTimer<AlarmManager> timer_;
|
|
|
| // A map of our pending alarms, per extension.
|
| + // Invariant: None of the AlarmLists are empty.
|
| AlarmMap alarms_;
|
|
|
| - // A map of the next scheduled times associated with each alarm.
|
| - AlarmRuntimeInfoMap scheduled_times_;
|
| -
|
| // The previous and next time that alarms were and will be run.
|
| base::Time last_poll_time_;
|
| base::Time next_poll_time_;
|
|
|