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

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

Issue 22900005: Fixing race conditions in chrome.alarms (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 4 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
Index: chrome/browser/extensions/api/alarms/alarms_api.cc
diff --git a/chrome/browser/extensions/api/alarms/alarms_api.cc b/chrome/browser/extensions/api/alarms/alarms_api.cc
index 916a8c232e90554870d96e6a65a7fb0819b7001d..cc49b6ed466b1bec4e0743682cb060087b43956d 100644
--- a/chrome/browser/extensions/api/alarms/alarms_api.cc
+++ b/chrome/browser/extensions/api/alarms/alarms_api.cc
@@ -107,8 +107,9 @@ bool AlarmsCreateFunction::RunImpl() {
params->name.get() ? *params->name : kDefaultAlarmName;
std::vector<std::string> warnings;
if (!ValidateAlarmCreateInfo(
- alarm_name, params->alarm_info, GetExtension(), &error_, &warnings))
+ alarm_name, params->alarm_info, GetExtension(), &error_, &warnings)) {
return false;
+ }
for (std::vector<std::string>::const_iterator it = warnings.begin();
it != warnings.end(); ++it)
WriteToConsole(content::CONSOLE_MESSAGE_LEVEL_WARNING, *it);
@@ -119,31 +120,45 @@ bool AlarmsCreateFunction::RunImpl() {
Manifest::IsUnpackedLocation(GetExtension()->location()) ?
kDevDelayMinimum : kReleaseDelayMinimum),
clock_->Now());
- AlarmManager::Get(profile())->AddAlarm(extension_id(), alarm);
+ AlarmManager::Get(profile())->AddAlarm(extension_id(), alarm, base::Bind(
+ &AlarmsCreateFunction::Callback, this));
return true;
}
+void AlarmsCreateFunction::Callback() {
+ SendResponse(true);
+}
+
bool AlarmsGetFunction::RunImpl() {
scoped_ptr<alarms::Get::Params> params(alarms::Get::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get());
std::string name = params->name.get() ? *params->name : kDefaultAlarmName;
- const Alarm* alarm =
- AlarmManager::Get(profile())->GetAlarm(extension_id(), name);
+ AlarmManager::Get(profile())->GetAlarm(extension_id(), name, base::Bind(
+ &AlarmsGetFunction::Callback, this, name));
+
+ return true;
+}
- if (!alarm) {
+void AlarmsGetFunction::Callback(
+ const std::string& name, extensions::Alarm* alarm) {
+ if (alarm) {
+ results_ = alarms::Get::Results::Create(*alarm->js_alarm);
+ SendResponse(true);
+ } else {
error_ = ErrorUtils::FormatErrorMessage(kAlarmNotFound, name);
- return false;
+ SendResponse(false);
}
+}
- results_ = alarms::Get::Results::Create(*alarm->js_alarm);
+bool AlarmsGetAllFunction::RunImpl() {
+ AlarmManager::Get(profile())->GetAllAlarms(extension_id(), base::Bind(
+ &AlarmsGetAllFunction::Callback, this));
return true;
}
-bool AlarmsGetAllFunction::RunImpl() {
- const AlarmManager::AlarmList* alarms =
- AlarmManager::Get(profile())->GetAllAlarms(extension_id());
+void AlarmsGetAllFunction::Callback(const AlarmList* alarms) {
if (alarms) {
std::vector<linked_ptr<extensions::api::alarms::Alarm> > create_arg;
create_arg.reserve(alarms->size());
@@ -154,7 +169,7 @@ bool AlarmsGetAllFunction::RunImpl() {
} else {
SetResult(new base::ListValue());
}
- return true;
+ SendResponse(true);
}
bool AlarmsClearFunction::RunImpl() {
@@ -163,20 +178,27 @@ bool AlarmsClearFunction::RunImpl() {
EXTENSION_FUNCTION_VALIDATE(params.get());
std::string name = params->name.get() ? *params->name : kDefaultAlarmName;
- bool success = AlarmManager::Get(profile())->RemoveAlarm(extension_id(),
- name);
+ AlarmManager::Get(profile())->RemoveAlarm(extension_id(), name, base::Bind(
+ &AlarmsClearFunction::Callback, this, name));
+
+ return true;
+}
- if (!success) {
+void AlarmsClearFunction::Callback(const std::string& name, bool success) {
+ if (!success)
error_ = ErrorUtils::FormatErrorMessage(kAlarmNotFound, name);
- return false;
- }
- return true;
+ SendResponse(success);
}
bool AlarmsClearAllFunction::RunImpl() {
- AlarmManager::Get(profile())->RemoveAllAlarms(extension_id());
+ AlarmManager::Get(profile())->RemoveAllAlarms(extension_id(), base::Bind(
+ &AlarmsClearAllFunction::Callback, this));
return true;
}
+void AlarmsClearAllFunction::Callback() {
+ SendResponse(true);
+}
+
} // namespace extensions
« no previous file with comments | « chrome/browser/extensions/api/alarms/alarms_api.h ('k') | chrome/browser/extensions/api/alarms/alarms_api_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698