summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/api/alarms/alarm_manager.h
diff options
context:
space:
mode:
authorjyasskin@chromium.org <jyasskin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-14 00:30:56 +0000
committerjyasskin@chromium.org <jyasskin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-14 00:30:56 +0000
commit64a82a5b9bf3ca133cef8963645416ff3ff4c05b (patch)
tree4690074a155f39078985d5fc35912ef9d6ad6b8f /chrome/browser/extensions/api/alarms/alarm_manager.h
parent0d54ab228ff3fa7dd6c64dcdabadd6ded2330bbb (diff)
downloadchromium_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.h46
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_;