Index: chrome/browser/extensions/api/alarms/alarm_manager.cc |
diff --git a/chrome/browser/extensions/api/alarms/alarm_manager.cc b/chrome/browser/extensions/api/alarms/alarm_manager.cc |
index 2861a036ffd0857ca6eb47db6a1d7ddd4d73e5b7..1dc8ba5a199ee869164d4ea36fdc4cc0bc153012 100644 |
--- a/chrome/browser/extensions/api/alarms/alarm_manager.cc |
+++ b/chrome/browser/extensions/api/alarms/alarm_manager.cc |
@@ -8,11 +8,12 @@ |
#include "base/json/json_writer.h" |
#include "base/message_loop.h" |
#include "base/time.h" |
+#include "base/value_conversions.h" |
#include "base/values.h" |
#include "chrome/browser/extensions/extension_event_router.h" |
-#include "chrome/browser/extensions/extension_prefs.h" |
#include "chrome/browser/extensions/extension_service.h" |
#include "chrome/browser/extensions/extension_system.h" |
+#include "chrome/browser/extensions/state_store.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/common/chrome_notification_types.h" |
#include "content/public/browser/notification_service.h" |
@@ -23,6 +24,10 @@ namespace { |
const char kOnAlarmEvent[] = "alarms.onAlarm"; |
+// A list of alarms that this extension has set. |
+const char kRegisteredAlarms[] = "alarms"; |
+const char kAlarmScheduledRunTime[] = "scheduled_run_time"; |
+ |
// The minimum period between polling for alarms to run. |
const base::TimeDelta kDefaultMinPollPeriod = base::TimeDelta::FromMinutes(5); |
@@ -45,12 +50,52 @@ class DefaultAlarmDelegate : public AlarmManager::Delegate { |
Profile* profile_; |
}; |
+// Contains the state we persist for each alarm. |
+struct AlarmState { |
+ linked_ptr<AlarmManager::Alarm> alarm; |
+ base::Time scheduled_run_time; |
+ |
+ AlarmState() {} |
+ ~AlarmState() {} |
+}; |
+ |
// Creates a TimeDelta from a delay as specified in the API. |
base::TimeDelta TimeDeltaFromDelay(double delay_in_minutes) { |
return base::TimeDelta::FromMicroseconds( |
delay_in_minutes * base::Time::kMicrosecondsPerMinute); |
} |
+std::vector<AlarmState> AlarmsFromValue(const base::ListValue* list) { |
+ typedef AlarmManager::Alarm Alarm; |
+ std::vector<AlarmState> alarms; |
+ for (size_t i = 0; i < list->GetSize(); ++i) { |
+ base::DictionaryValue* alarm_dict = NULL; |
+ AlarmState alarm; |
+ alarm.alarm.reset(new Alarm()); |
+ if (list->GetDictionary(i, &alarm_dict) && |
+ Alarm::Populate(*alarm_dict, alarm.alarm.get())) { |
+ base::Value* time_value = NULL; |
+ if (alarm_dict->Get(kAlarmScheduledRunTime, &time_value)) |
+ base::GetValueAsTime(*time_value, &alarm.scheduled_run_time); |
+ alarms.push_back(alarm); |
+ } |
+ } |
+ return alarms; |
+} |
+ |
+scoped_ptr<base::ListValue> AlarmsToValue( |
+ const std::vector<AlarmState>& alarms) { |
+ scoped_ptr<base::ListValue> list(new ListValue()); |
+ for (size_t i = 0; i < alarms.size(); ++i) { |
+ scoped_ptr<base::DictionaryValue> alarm = alarms[i].alarm->ToValue().Pass(); |
+ alarm->Set(kAlarmScheduledRunTime, |
+ base::CreateTimeValue(alarms[i].scheduled_run_time)); |
+ list->Append(alarm.release()); |
+ } |
+ return list.Pass(); |
+} |
+ |
+ |
} // namespace |
// AlarmManager |
@@ -61,6 +106,10 @@ AlarmManager::AlarmManager(Profile* profile) |
last_poll_time_(base::Time()) { |
registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, |
content::Source<Profile>(profile_)); |
+ |
+ StateStore* storage = ExtensionSystem::Get(profile_)->state_store(); |
+ if (storage) |
+ storage->RegisterKey(kRegisteredAlarms); |
} |
AlarmManager::~AlarmManager() { |
@@ -70,7 +119,7 @@ void AlarmManager::AddAlarm(const std::string& extension_id, |
const linked_ptr<Alarm>& alarm) { |
base::TimeDelta alarm_time = TimeDeltaFromDelay(alarm->delay_in_minutes); |
AddAlarmImpl(extension_id, alarm, alarm_time); |
- WriteToPrefs(extension_id); |
+ WriteToStorage(extension_id); |
} |
const AlarmManager::Alarm* AlarmManager::GetAlarm( |
@@ -111,7 +160,7 @@ bool AlarmManager::RemoveAlarm(const std::string& extension_id, |
return false; |
RemoveAlarmIterator(it); |
- WriteToPrefs(extension_id); |
+ WriteToStorage(extension_id); |
return true; |
} |
@@ -126,7 +175,7 @@ void AlarmManager::RemoveAllAlarms(const std::string& extension_id) { |
RemoveAlarmIterator(AlarmIterator(list, list->second.begin())); |
CHECK(alarms_.find(extension_id) == alarms_.end()); |
- WriteToPrefs(extension_id); |
+ WriteToStorage(extension_id); |
} |
void AlarmManager::RemoveAlarmIterator(const AlarmIterator& iter) { |
@@ -159,7 +208,7 @@ void AlarmManager::OnAlarm(const std::string& extension_id, |
scheduled_times_[alarm].time = |
last_poll_time_ + TimeDeltaFromDelay(alarm->delay_in_minutes); |
} |
- WriteToPrefs(extension_id_copy); |
+ WriteToStorage(extension_id_copy); |
} |
void AlarmManager::AddAlarmImpl(const std::string& extension_id, |
@@ -180,43 +229,41 @@ void AlarmManager::AddAlarmImpl(const std::string& extension_id, |
ScheduleNextPoll(base::TimeDelta::FromMinutes(0)); |
} |
-void AlarmManager::WriteToPrefs(const std::string& extension_id) { |
- ExtensionService* service = |
- ExtensionSystem::Get(profile_)->extension_service(); |
- if (!service || !service->extension_prefs()) |
+void AlarmManager::WriteToStorage(const std::string& extension_id) { |
+ StateStore* storage = ExtensionSystem::Get(profile_)->state_store(); |
+ if (!storage) |
return; |
- std::vector<AlarmPref> alarm_prefs; |
- |
+ std::vector<AlarmState> alarm_states; |
AlarmMap::iterator list = alarms_.find(extension_id); |
if (list != alarms_.end()) { |
for (AlarmList::iterator it = list->second.begin(); |
it != list->second.end(); ++it) { |
- AlarmPref pref; |
+ AlarmState pref; |
pref.alarm = *it; |
pref.scheduled_run_time = scheduled_times_[it->get()].time; |
- alarm_prefs.push_back(pref); |
+ alarm_states.push_back(pref); |
} |
} |
- service->extension_prefs()->SetRegisteredAlarms(extension_id, alarm_prefs); |
+ scoped_ptr<Value> alarms(AlarmsToValue(alarm_states).release()); |
+ storage->SetExtensionValue(extension_id, kRegisteredAlarms, alarms.Pass()); |
} |
-void AlarmManager::ReadFromPrefs(const std::string& extension_id) { |
- ExtensionService* service = |
- ExtensionSystem::Get(profile_)->extension_service(); |
- if (!service || !service->extension_prefs()) |
+void AlarmManager::ReadFromStorage(const std::string& extension_id, |
+ scoped_ptr<base::Value> value) { |
+ base::ListValue* list = NULL; |
+ if (!value.get() || !value->GetAsList(&list)) |
return; |
- std::vector<AlarmPref> alarm_prefs = |
- service->extension_prefs()->GetRegisteredAlarms(extension_id); |
- for (size_t i = 0; i < alarm_prefs.size(); ++i) { |
+ std::vector<AlarmState> alarm_states = AlarmsFromValue(list); |
+ for (size_t i = 0; i < alarm_states.size(); ++i) { |
base::TimeDelta delay = |
- alarm_prefs[i].scheduled_run_time - base::Time::Now(); |
+ alarm_states[i].scheduled_run_time - base::Time::Now(); |
if (delay < base::TimeDelta::FromSeconds(0)) |
delay = base::TimeDelta::FromSeconds(0); |
- AddAlarmImpl(extension_id, alarm_prefs[i].alarm, delay); |
+ AddAlarmImpl(extension_id, alarm_states[i].alarm, delay); |
} |
} |
@@ -291,7 +338,12 @@ void AlarmManager::Observe( |
case chrome::NOTIFICATION_EXTENSION_LOADED: { |
const Extension* extension = |
content::Details<const Extension>(details).ptr(); |
- ReadFromPrefs(extension->id()); |
+ StateStore* storage = ExtensionSystem::Get(profile_)->state_store(); |
+ if (storage) { |
+ storage->GetExtensionValue(extension->id(), kRegisteredAlarms, |
+ base::Bind(&AlarmManager::ReadFromStorage, |
+ AsWeakPtr(), extension->id())); |
+ } |
break; |
} |
default: |
@@ -300,10 +352,4 @@ void AlarmManager::Observe( |
} |
} |
-AlarmPref::AlarmPref() { |
-} |
- |
-AlarmPref::~AlarmPref() { |
-} |
- |
} // namespace extensions |