Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1075)

Unified Diff: chrome/browser/extensions/api/alarms/alarm_manager.cc

Issue 10545128: Unrevert r141537: Add extensions::StateStore and use that instead of (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix.crash Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/extensions/api/alarms/alarm_manager.h ('k') | chrome/browser/extensions/extension_prefs.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « chrome/browser/extensions/api/alarms/alarm_manager.h ('k') | chrome/browser/extensions/extension_prefs.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698