diff options
author | jyasskin@chromium.org <jyasskin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-14 00:30:56 +0000 |
---|---|---|
committer | jyasskin@chromium.org <jyasskin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-14 00:30:56 +0000 |
commit | 64a82a5b9bf3ca133cef8963645416ff3ff4c05b (patch) | |
tree | 4690074a155f39078985d5fc35912ef9d6ad6b8f /chrome/browser/extensions/api/alarms/alarm_manager.h | |
parent | 0d54ab228ff3fa7dd6c64dcdabadd6ded2330bbb (diff) | |
download | chromium_src-64a82a5b9bf3ca133cef8963645416ff3ff4c05b.zip chromium_src-64a82a5b9bf3ca133cef8963645416ff3ff4c05b.tar.gz chromium_src-64a82a5b9bf3ca133cef8963645416ff3ff4c05b.tar.bz2 |
Refactor chrome.alarms interface to support absolute alarm deadlines.
BUG=122817
TEST=Created an extension with absolute delays under 5 minutes away,
and watched that they didn't fire for 5 minutes.
Review URL: https://chromiumcodereview.appspot.com/10545104
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@142037 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions/api/alarms/alarm_manager.h')
-rw-r--r-- | chrome/browser/extensions/api/alarms/alarm_manager.h | 46 |
1 files changed, 30 insertions, 16 deletions
diff --git a/chrome/browser/extensions/api/alarms/alarm_manager.h b/chrome/browser/extensions/api/alarms/alarm_manager.h index 6930998..2c46f9f 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_; |