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

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

Issue 10545104: Refactor chrome.alarms interface to support absolute alarm deadlines. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge with r141780 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
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 8591f01d0447de18b625771ec8c358e181c9925e..72101b61ac02698dd4ba091b24061da34e87a8bb 100644
--- a/chrome/browser/extensions/api/alarms/alarms_api.cc
+++ b/chrome/browser/extensions/api/alarms/alarms_api.cc
@@ -19,21 +19,27 @@ namespace {
const char kDefaultAlarmName[] = "";
const char kAlarmNotFound[] = "No alarm named '*' exists.";
-const char kDelayLessThanMinimum[] = "Delay is less than minimum of * minutes.";
-const char kDelayIsNonInteger[] = "Delay is not an integer value.";
-
+const char kDelayLessThanMinimum[] = "* is less than minimum of * minutes.";
+const char kDelayIsNonInteger[] = "* is not an integer value.";
+const char kBothRelativeAndAbsoluteTime[] =
+ "Cannot set both when and delayInMinutes.";
+const char kNoScheduledTime[] =
+ "Must set at least one of when, delayInMinutes, or periodInMinutes.";
const int kReleaseDelayMinimum = 5;
const int kDevDelayMinimum = 0;
-bool ValidateDelayTime(double delay_in_minutes,
- const Extension* extension,
- std::string* error) {
+bool ValidateDelay(double delay_in_minutes,
+ const Extension* extension,
+ const std::string& delay_or_period,
+ std::string* error) {
double delay_minimum = kDevDelayMinimum;
if (extension->location() != Extension::LOAD) {
// In release mode we check for integer delay values and a stricter delay
// minimum.
if (delay_in_minutes != static_cast<int>(delay_in_minutes)) {
- *error = kDelayIsNonInteger;
+ *error = ExtensionErrorUtils::FormatErrorMessage(
+ kDelayIsNonInteger,
+ delay_or_period);
return false;
}
delay_minimum = kReleaseDelayMinimum;
@@ -41,29 +47,71 @@ bool ValidateDelayTime(double delay_in_minutes,
// Validate against our found delay minimum.
if (delay_in_minutes < delay_minimum) {
- *error = ExtensionErrorUtils::FormatErrorMessage(kDelayLessThanMinimum,
+ *error = ExtensionErrorUtils::FormatErrorMessage(
+ kDelayLessThanMinimum,
+ delay_or_period,
base::DoubleToString(delay_minimum));
return false;
}
+
+ return true;
+}
+
+bool ValidateAlarmCreateInfo(const alarms::AlarmCreateInfo& create_info,
+ const Extension* extension,
+ std::string* error) {
+ if (create_info.delay_in_minutes.get() &&
+ create_info.when.get()) {
+ *error = kBothRelativeAndAbsoluteTime;
+ return false;
+ }
+ if (create_info.delay_in_minutes == NULL &&
+ create_info.when == NULL &&
+ create_info.period_in_minutes == NULL) {
+ *error = kNoScheduledTime;
+ return false;
+ }
+
+ // Users can always use an absolute timeout to request an arbitrarily-short or
+ // negative delay. We won't honor the short timeout, but we can't check it
+ // and warn the user because it would introduce race conditions (say they
+ // compute a long-enough timeout, but then the call into the alarms interface
+ // gets delayed past the boundary). However, it's still worth warning about
+ // relative delays that are shorter than we'll honor.
+ if (create_info.delay_in_minutes.get()) {
+ if (!ValidateDelay(*create_info.delay_in_minutes,
+ extension, "Delay", error))
+ return false;
+ }
+ if (create_info.period_in_minutes.get()) {
+ if (!ValidateDelay(*create_info.period_in_minutes,
+ extension, "Period", error))
+ return false;
+ }
+
return true;
}
} // namespace
+AlarmsCreateFunction::AlarmsCreateFunction()
+ : now_(&base::Time::Now) {
+}
+
bool AlarmsCreateFunction::RunImpl() {
scoped_ptr<alarms::Create::Params> params(
alarms::Create::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get());
-
- double delay_in_minutes = params->alarm_info.delay_in_minutes;
- if (!ValidateDelayTime(delay_in_minutes, GetExtension(), &error_))
+ if (!ValidateAlarmCreateInfo(
+ params->alarm_info, GetExtension(), &error_))
return false;
- linked_ptr<AlarmManager::Alarm> alarm(new AlarmManager::Alarm());
- alarm->name = params->name.get() ? *params->name : kDefaultAlarmName;
- alarm->delay_in_minutes = params->alarm_info.delay_in_minutes;
- alarm->repeating = params->alarm_info.repeating.get() ?
- *params->alarm_info.repeating : false;
+ Alarm alarm(params->name.get() ? *params->name : kDefaultAlarmName,
+ params->alarm_info,
+ base::TimeDelta::FromMinutes(
+ GetExtension()->location() == Extension::LOAD ?
+ kDevDelayMinimum : kReleaseDelayMinimum),
+ now_);
ExtensionSystem::Get(profile())->alarm_manager()->AddAlarm(
extension_id(), alarm);
@@ -76,7 +124,7 @@ bool AlarmsGetFunction::RunImpl() {
EXTENSION_FUNCTION_VALIDATE(params.get());
std::string name = params->name.get() ? *params->name : kDefaultAlarmName;
- const AlarmManager::Alarm* alarm =
+ const Alarm* alarm =
ExtensionSystem::Get(profile())->alarm_manager()->GetAlarm(
extension_id(), name);
@@ -85,7 +133,7 @@ bool AlarmsGetFunction::RunImpl() {
return false;
}
- result_.reset(alarms::Get::Result::Create(*alarm));
+ result_.reset(alarms::Get::Result::Create(*alarm->js_alarm));
return true;
}
@@ -94,7 +142,12 @@ bool AlarmsGetAllFunction::RunImpl() {
ExtensionSystem::Get(profile())->alarm_manager()->GetAllAlarms(
extension_id());
if (alarms) {
- result_.reset(alarms::GetAll::Result::Create(*alarms));
+ std::vector<linked_ptr<extensions::api::alarms::Alarm> > create_arg;
+ create_arg.reserve(alarms->size());
+ for (size_t i = 0, size = alarms->size(); i < size; ++i) {
+ create_arg.push_back((*alarms)[i].js_alarm);
+ }
+ result_.reset(alarms::GetAll::Result::Create(create_arg));
} else {
result_.reset(new base::ListValue());
}
« 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