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

Side by Side 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: 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/api/alarms/alarms_api.h" 5 #include "chrome/browser/extensions/api/alarms/alarms_api.h"
6 6
7 #include "base/string_number_conversions.h" 7 #include "base/string_number_conversions.h"
8 #include "base/values.h" 8 #include "base/values.h"
9 #include "chrome/browser/extensions/api/alarms/alarm_manager.h" 9 #include "chrome/browser/extensions/api/alarms/alarm_manager.h"
10 #include "chrome/browser/extensions/extension_system.h" 10 #include "chrome/browser/extensions/extension_system.h"
11 #include "chrome/common/extensions/api/alarms.h" 11 #include "chrome/common/extensions/api/alarms.h"
12 #include "chrome/common/extensions/extension_error_utils.h" 12 #include "chrome/common/extensions/extension_error_utils.h"
13 13
14 namespace alarms = extensions::api::alarms; 14 namespace alarms = extensions::api::alarms;
15 15
16 namespace extensions { 16 namespace extensions {
17 17
18 namespace { 18 namespace {
19 19
20 const char kDefaultAlarmName[] = ""; 20 const char kDefaultAlarmName[] = "";
21 const char kAlarmNotFound[] = "No alarm named '*' exists."; 21 const char kAlarmNotFound[] = "No alarm named '*' exists.";
22 const char kDelayLessThanMinimum[] = "Delay is less than minimum of * minutes."; 22 const char kDelayLessThanMinimum[] = "Delay is less than minimum of * minutes.";
23 const char kDelayIsNonInteger[] = "Delay is not an integer value."; 23 const char kDelayIsNonInteger[] = "Delay is not an integer value.";
24 24 const char kBothRelativeAndAbsoluteTime[] =
25 "Cannot set both approxTimeToFire and delayInMinutes.";
26 const char kNeitherRelativeNorAbsoluteTime[] =
27 "Must set one of approxTimeToFire and delayInMinutes.";
28 const char kRepeatingAlarmMustBeRelative[] =
29 "A repeating alarm must set delayInMinutes.";
25 const int kReleaseDelayMinimum = 5; 30 const int kReleaseDelayMinimum = 5;
26 const int kDevDelayMinimum = 0; 31 const int kDevDelayMinimum = 0;
27 32
28 bool ValidateDelayTime(double delay_in_minutes, 33 bool ValidateAlarmCreateInfo(const alarms::AlarmCreateInfo& create_info,
29 const Extension* extension, 34 const Extension* extension,
30 std::string* error) { 35 std::string* error) {
31 double delay_minimum = kDevDelayMinimum; 36 if (create_info.delay_in_minutes.get() &&
32 if (extension->location() != Extension::LOAD) { 37 create_info.approx_time_to_fire.get()) {
33 // In release mode we check for integer delay values and a stricter delay 38 *error = kBothRelativeAndAbsoluteTime;
34 // minimum. 39 return false;
35 if (delay_in_minutes != static_cast<int>(delay_in_minutes)) { 40 }
36 *error = kDelayIsNonInteger; 41 if (create_info.delay_in_minutes == NULL &&
42 create_info.approx_time_to_fire == NULL) {
43 *error = kNeitherRelativeNorAbsoluteTime;
44 return false;
45 }
46 const bool repeating = create_info.repeating.get() ?
47 *create_info.repeating : false;
48 if (repeating && create_info.approx_time_to_fire.get()) {
49 *error = kRepeatingAlarmMustBeRelative;
50 return false;
51 }
52
53 // Users can always use an absolute timeout to request an arbitrarily-short or
54 // negative delay. We won't honor the short timeout, but we can't check it
55 // and warn the user because it would introduce race conditions (say they
56 // compute a long-enough timeout, but then the call into the alarms interface
57 // gets delayed past the boundary). However, it's still worth warning about
58 // relative delays that are shorter than we'll honor.
59 if (create_info.delay_in_minutes.get()) {
60 const double delay_in_minutes = *create_info.delay_in_minutes;
61 double delay_minimum = kDevDelayMinimum;
62 if (extension->location() != Extension::LOAD) {
63 // In release mode we check for integer delay values and a stricter delay
64 // minimum.
65 if (delay_in_minutes != static_cast<int>(delay_in_minutes)) {
66 *error = kDelayIsNonInteger;
67 return false;
68 }
69 delay_minimum = kReleaseDelayMinimum;
70 }
71
72 // Validate against our found delay minimum.
73 if (delay_in_minutes < delay_minimum) {
74 *error = ExtensionErrorUtils::FormatErrorMessage(
75 kDelayLessThanMinimum,
76 base::DoubleToString(delay_minimum));
37 return false; 77 return false;
38 } 78 }
39 delay_minimum = kReleaseDelayMinimum;
40 } 79 }
41 80
42 // Validate against our found delay minimum.
43 if (delay_in_minutes < delay_minimum) {
44 *error = ExtensionErrorUtils::FormatErrorMessage(kDelayLessThanMinimum,
45 base::DoubleToString(delay_minimum));
46 return false;
47 }
48 return true; 81 return true;
49 } 82 }
50 83
51 } // namespace 84 } // namespace
52 85
86 AlarmsCreateFunction::AlarmsCreateFunction()
87 : now_(&base::Time::Now) {
88 }
89
53 bool AlarmsCreateFunction::RunImpl() { 90 bool AlarmsCreateFunction::RunImpl() {
54 scoped_ptr<alarms::Create::Params> params( 91 scoped_ptr<alarms::Create::Params> params(
55 alarms::Create::Params::Create(*args_)); 92 alarms::Create::Params::Create(*args_));
56 EXTENSION_FUNCTION_VALIDATE(params.get()); 93 EXTENSION_FUNCTION_VALIDATE(params.get());
57 94 if (!ValidateAlarmCreateInfo(params->alarm_info, GetExtension(), &error_))
58 double delay_in_minutes = params->alarm_info.delay_in_minutes;
59 if (!ValidateDelayTime(delay_in_minutes, GetExtension(), &error_))
60 return false; 95 return false;
61 96
62 linked_ptr<AlarmManager::Alarm> alarm(new AlarmManager::Alarm()); 97 Alarm alarm(params->name.get() ? *params->name : kDefaultAlarmName,
63 alarm->name = params->name.get() ? *params->name : kDefaultAlarmName; 98 params->alarm_info,
64 alarm->delay_in_minutes = params->alarm_info.delay_in_minutes; 99 base::TimeDelta::FromMinutes(
65 alarm->repeating = params->alarm_info.repeating.get() ? 100 GetExtension()->location() == Extension::LOAD
66 *params->alarm_info.repeating : false; 101 ? kDevDelayMinimum : kReleaseDelayMinimum),
102 now_);
67 ExtensionSystem::Get(profile())->alarm_manager()->AddAlarm( 103 ExtensionSystem::Get(profile())->alarm_manager()->AddAlarm(
68 extension_id(), alarm); 104 extension_id(), alarm);
69 105
70 return true; 106 return true;
71 } 107 }
72 108
73 bool AlarmsGetFunction::RunImpl() { 109 bool AlarmsGetFunction::RunImpl() {
74 scoped_ptr<alarms::Get::Params> params( 110 scoped_ptr<alarms::Get::Params> params(
75 alarms::Get::Params::Create(*args_)); 111 alarms::Get::Params::Create(*args_));
76 EXTENSION_FUNCTION_VALIDATE(params.get()); 112 EXTENSION_FUNCTION_VALIDATE(params.get());
77 113
78 std::string name = params->name.get() ? *params->name : kDefaultAlarmName; 114 std::string name = params->name.get() ? *params->name : kDefaultAlarmName;
79 const AlarmManager::Alarm* alarm = 115 const Alarm* alarm =
80 ExtensionSystem::Get(profile())->alarm_manager()->GetAlarm( 116 ExtensionSystem::Get(profile())->alarm_manager()->GetAlarm(
81 extension_id(), name); 117 extension_id(), name);
82 118
83 if (!alarm) { 119 if (!alarm) {
84 error_ = ExtensionErrorUtils::FormatErrorMessage(kAlarmNotFound, name); 120 error_ = ExtensionErrorUtils::FormatErrorMessage(kAlarmNotFound, name);
85 return false; 121 return false;
86 } 122 }
87 123
88 result_.reset(alarms::Get::Result::Create(*alarm)); 124 result_.reset(alarms::Get::Result::Create(*alarm->js_alarm));
89 return true; 125 return true;
90 } 126 }
91 127
92 bool AlarmsGetAllFunction::RunImpl() { 128 bool AlarmsGetAllFunction::RunImpl() {
93 const AlarmManager::AlarmList* alarms = 129 const AlarmManager::AlarmList* alarms =
94 ExtensionSystem::Get(profile())->alarm_manager()->GetAllAlarms( 130 ExtensionSystem::Get(profile())->alarm_manager()->GetAllAlarms(
95 extension_id()); 131 extension_id());
96 if (alarms) { 132 if (alarms) {
97 result_.reset(alarms::GetAll::Result::Create(*alarms)); 133 std::vector<linked_ptr<extensions::api::alarms::Alarm> > create_arg;
134 create_arg.reserve(alarms->size());
135 for (size_t i = 0, size = alarms->size(); i < size; ++i) {
136 create_arg.push_back((*alarms)[i].js_alarm);
137 }
138 result_.reset(alarms::GetAll::Result::Create(create_arg));
98 } else { 139 } else {
99 result_.reset(new base::ListValue()); 140 result_.reset(new base::ListValue());
100 } 141 }
101 return true; 142 return true;
102 } 143 }
103 144
104 bool AlarmsClearFunction::RunImpl() { 145 bool AlarmsClearFunction::RunImpl() {
105 scoped_ptr<alarms::Clear::Params> params( 146 scoped_ptr<alarms::Clear::Params> params(
106 alarms::Clear::Params::Create(*args_)); 147 alarms::Clear::Params::Create(*args_));
107 EXTENSION_FUNCTION_VALIDATE(params.get()); 148 EXTENSION_FUNCTION_VALIDATE(params.get());
(...skipping 10 matching lines...) Expand all
118 return true; 159 return true;
119 } 160 }
120 161
121 bool AlarmsClearAllFunction::RunImpl() { 162 bool AlarmsClearAllFunction::RunImpl() {
122 ExtensionSystem::Get(profile())->alarm_manager()->RemoveAllAlarms( 163 ExtensionSystem::Get(profile())->alarm_manager()->RemoveAllAlarms(
123 extension_id()); 164 extension_id());
124 return true; 165 return true;
125 } 166 }
126 167
127 } // namespace extensions 168 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698