OLD | NEW |
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 "extensions/browser/api/alarms/alarms_api.h" |
6 | 6 |
7 #include "base/strings/string_number_conversions.h" | 7 #include "base/strings/string_number_conversions.h" |
8 #include "base/time/clock.h" | 8 #include "base/time/clock.h" |
9 #include "base/time/default_clock.h" | 9 #include "base/time/default_clock.h" |
10 #include "base/values.h" | 10 #include "base/values.h" |
11 #include "chrome/browser/extensions/api/alarms/alarm_manager.h" | 11 #include "extensions/browser/api/alarms/alarm_manager.h" |
12 #include "chrome/common/extensions/api/alarms.h" | 12 #include "extensions/common/api/alarms.h" |
13 #include "extensions/common/error_utils.h" | 13 #include "extensions/common/error_utils.h" |
14 | 14 |
15 namespace alarms = extensions::api::alarms; | 15 namespace extensions { |
16 | 16 |
17 namespace extensions { | 17 namespace alarms = core_api::alarms; |
18 | 18 |
19 namespace { | 19 namespace { |
20 | 20 |
21 const char kDefaultAlarmName[] = ""; | 21 const char kDefaultAlarmName[] = ""; |
22 const char kBothRelativeAndAbsoluteTime[] = | 22 const char kBothRelativeAndAbsoluteTime[] = |
23 "Cannot set both when and delayInMinutes."; | 23 "Cannot set both when and delayInMinutes."; |
24 const char kNoScheduledTime[] = | 24 const char kNoScheduledTime[] = |
25 "Must set at least one of when, delayInMinutes, or periodInMinutes."; | 25 "Must set at least one of when, delayInMinutes, or periodInMinutes."; |
26 const int kReleaseDelayMinimum = 1; | 26 const int kReleaseDelayMinimum = 1; |
27 const int kDevDelayMinimum = 0; | 27 const int kDevDelayMinimum = 0; |
28 | 28 |
29 bool ValidateAlarmCreateInfo(const std::string& alarm_name, | 29 bool ValidateAlarmCreateInfo(const std::string& alarm_name, |
30 const alarms::AlarmCreateInfo& create_info, | 30 const alarms::AlarmCreateInfo& create_info, |
31 const Extension* extension, | 31 const Extension* extension, |
32 std::string* error, | 32 std::string* error, |
33 std::vector<std::string>* warnings) { | 33 std::vector<std::string>* warnings) { |
34 if (create_info.delay_in_minutes.get() && | 34 if (create_info.delay_in_minutes.get() && create_info.when.get()) { |
35 create_info.when.get()) { | |
36 *error = kBothRelativeAndAbsoluteTime; | 35 *error = kBothRelativeAndAbsoluteTime; |
37 return false; | 36 return false; |
38 } | 37 } |
39 if (create_info.delay_in_minutes == NULL && | 38 if (create_info.delay_in_minutes == NULL && create_info.when == NULL && |
40 create_info.when == NULL && | |
41 create_info.period_in_minutes == NULL) { | 39 create_info.period_in_minutes == NULL) { |
42 *error = kNoScheduledTime; | 40 *error = kNoScheduledTime; |
43 return false; | 41 return false; |
44 } | 42 } |
45 | 43 |
46 // Users can always use an absolute timeout to request an arbitrarily-short or | 44 // Users can always use an absolute timeout to request an arbitrarily-short or |
47 // negative delay. We won't honor the short timeout, but we can't check it | 45 // negative delay. We won't honor the short timeout, but we can't check it |
48 // and warn the user because it would introduce race conditions (say they | 46 // and warn the user because it would introduce race conditions (say they |
49 // compute a long-enough timeout, but then the call into the alarms interface | 47 // compute a long-enough timeout, but then the call into the alarms interface |
50 // gets delayed past the boundary). However, it's still worth warning about | 48 // gets delayed past the boundary). However, it's still worth warning about |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 alarm_name)); | 81 alarm_name)); |
84 } | 82 } |
85 } | 83 } |
86 | 84 |
87 return true; | 85 return true; |
88 } | 86 } |
89 | 87 |
90 } // namespace | 88 } // namespace |
91 | 89 |
92 AlarmsCreateFunction::AlarmsCreateFunction() | 90 AlarmsCreateFunction::AlarmsCreateFunction() |
93 : clock_(new base::DefaultClock()), owns_clock_(true) {} | 91 : clock_(new base::DefaultClock()), owns_clock_(true) { |
| 92 } |
94 | 93 |
95 AlarmsCreateFunction::AlarmsCreateFunction(base::Clock* clock) | 94 AlarmsCreateFunction::AlarmsCreateFunction(base::Clock* clock) |
96 : clock_(clock), owns_clock_(false) {} | 95 : clock_(clock), owns_clock_(false) { |
| 96 } |
97 | 97 |
98 AlarmsCreateFunction::~AlarmsCreateFunction() { | 98 AlarmsCreateFunction::~AlarmsCreateFunction() { |
99 if (owns_clock_) | 99 if (owns_clock_) |
100 delete clock_; | 100 delete clock_; |
101 } | 101 } |
102 | 102 |
103 bool AlarmsCreateFunction::RunAsync() { | 103 bool AlarmsCreateFunction::RunAsync() { |
104 scoped_ptr<alarms::Create::Params> params( | 104 scoped_ptr<alarms::Create::Params> params( |
105 alarms::Create::Params::Create(*args_)); | 105 alarms::Create::Params::Create(*args_)); |
106 EXTENSION_FUNCTION_VALIDATE(params.get()); | 106 EXTENSION_FUNCTION_VALIDATE(params.get()); |
107 const std::string& alarm_name = | 107 const std::string& alarm_name = |
108 params->name.get() ? *params->name : kDefaultAlarmName; | 108 params->name.get() ? *params->name : kDefaultAlarmName; |
109 std::vector<std::string> warnings; | 109 std::vector<std::string> warnings; |
110 if (!ValidateAlarmCreateInfo( | 110 if (!ValidateAlarmCreateInfo(alarm_name, params->alarm_info, extension(), |
111 alarm_name, params->alarm_info, extension(), &error_, &warnings)) { | 111 &error_, &warnings)) { |
112 return false; | 112 return false; |
113 } | 113 } |
114 for (std::vector<std::string>::const_iterator it = warnings.begin(); | 114 for (std::vector<std::string>::const_iterator it = warnings.begin(); |
115 it != warnings.end(); ++it) | 115 it != warnings.end(); ++it) |
116 WriteToConsole(content::CONSOLE_MESSAGE_LEVEL_WARNING, *it); | 116 WriteToConsole(content::CONSOLE_MESSAGE_LEVEL_WARNING, *it); |
117 | 117 |
118 Alarm alarm(alarm_name, | 118 Alarm alarm(alarm_name, params->alarm_info, |
119 params->alarm_info, | |
120 base::TimeDelta::FromMinutes( | 119 base::TimeDelta::FromMinutes( |
121 Manifest::IsUnpackedLocation(extension()->location()) | 120 Manifest::IsUnpackedLocation(extension()->location()) |
122 ? kDevDelayMinimum | 121 ? kDevDelayMinimum |
123 : kReleaseDelayMinimum), | 122 : kReleaseDelayMinimum), |
124 clock_->Now()); | 123 clock_->Now()); |
125 AlarmManager::Get(browser_context())->AddAlarm( | 124 AlarmManager::Get(browser_context()) |
126 extension_id(), alarm, base::Bind(&AlarmsCreateFunction::Callback, this)); | 125 ->AddAlarm(extension_id(), alarm, |
| 126 base::Bind(&AlarmsCreateFunction::Callback, this)); |
127 | 127 |
128 return true; | 128 return true; |
129 } | 129 } |
130 | 130 |
131 void AlarmsCreateFunction::Callback() { | 131 void AlarmsCreateFunction::Callback() { |
132 SendResponse(true); | 132 SendResponse(true); |
133 } | 133 } |
134 | 134 |
135 bool AlarmsGetFunction::RunAsync() { | 135 bool AlarmsGetFunction::RunAsync() { |
136 scoped_ptr<alarms::Get::Params> params(alarms::Get::Params::Create(*args_)); | 136 scoped_ptr<alarms::Get::Params> params(alarms::Get::Params::Create(*args_)); |
137 EXTENSION_FUNCTION_VALIDATE(params.get()); | 137 EXTENSION_FUNCTION_VALIDATE(params.get()); |
138 | 138 |
139 std::string name = params->name.get() ? *params->name : kDefaultAlarmName; | 139 std::string name = params->name.get() ? *params->name : kDefaultAlarmName; |
140 AlarmManager::Get(browser_context()) | 140 AlarmManager::Get(browser_context()) |
141 ->GetAlarm(extension_id(), | 141 ->GetAlarm(extension_id(), name, |
142 name, | |
143 base::Bind(&AlarmsGetFunction::Callback, this, name)); | 142 base::Bind(&AlarmsGetFunction::Callback, this, name)); |
144 | 143 |
145 return true; | 144 return true; |
146 } | 145 } |
147 | 146 |
148 void AlarmsGetFunction::Callback( | 147 void AlarmsGetFunction::Callback(const std::string& name, |
149 const std::string& name, extensions::Alarm* alarm) { | 148 extensions::Alarm* alarm) { |
150 if (alarm) { | 149 if (alarm) { |
151 results_ = alarms::Get::Results::Create(*alarm->js_alarm); | 150 results_ = alarms::Get::Results::Create(*alarm->js_alarm); |
152 } | 151 } |
153 SendResponse(true); | 152 SendResponse(true); |
154 } | 153 } |
155 | 154 |
156 bool AlarmsGetAllFunction::RunAsync() { | 155 bool AlarmsGetAllFunction::RunAsync() { |
157 AlarmManager::Get(browser_context())->GetAllAlarms( | 156 AlarmManager::Get(browser_context()) |
158 extension_id(), base::Bind(&AlarmsGetAllFunction::Callback, this)); | 157 ->GetAllAlarms(extension_id(), |
| 158 base::Bind(&AlarmsGetAllFunction::Callback, this)); |
159 return true; | 159 return true; |
160 } | 160 } |
161 | 161 |
162 void AlarmsGetAllFunction::Callback(const AlarmList* alarms) { | 162 void AlarmsGetAllFunction::Callback(const AlarmList* alarms) { |
163 if (alarms) { | 163 if (alarms) { |
164 std::vector<linked_ptr<extensions::api::alarms::Alarm> > create_arg; | 164 std::vector<linked_ptr<alarms::Alarm>> create_arg; |
165 create_arg.reserve(alarms->size()); | 165 create_arg.reserve(alarms->size()); |
166 for (size_t i = 0, size = alarms->size(); i < size; ++i) { | 166 for (size_t i = 0, size = alarms->size(); i < size; ++i) { |
167 create_arg.push_back((*alarms)[i].js_alarm); | 167 create_arg.push_back((*alarms)[i].js_alarm); |
168 } | 168 } |
169 results_ = alarms::GetAll::Results::Create(create_arg); | 169 results_ = alarms::GetAll::Results::Create(create_arg); |
170 } else { | 170 } else { |
171 SetResult(new base::ListValue()); | 171 SetResult(new base::ListValue()); |
172 } | 172 } |
173 SendResponse(true); | 173 SendResponse(true); |
174 } | 174 } |
175 | 175 |
176 bool AlarmsClearFunction::RunAsync() { | 176 bool AlarmsClearFunction::RunAsync() { |
177 scoped_ptr<alarms::Clear::Params> params( | 177 scoped_ptr<alarms::Clear::Params> params( |
178 alarms::Clear::Params::Create(*args_)); | 178 alarms::Clear::Params::Create(*args_)); |
179 EXTENSION_FUNCTION_VALIDATE(params.get()); | 179 EXTENSION_FUNCTION_VALIDATE(params.get()); |
180 | 180 |
181 std::string name = params->name.get() ? *params->name : kDefaultAlarmName; | 181 std::string name = params->name.get() ? *params->name : kDefaultAlarmName; |
182 AlarmManager::Get(browser_context()) | 182 AlarmManager::Get(browser_context()) |
183 ->RemoveAlarm(extension_id(), | 183 ->RemoveAlarm(extension_id(), name, |
184 name, | |
185 base::Bind(&AlarmsClearFunction::Callback, this, name)); | 184 base::Bind(&AlarmsClearFunction::Callback, this, name)); |
186 | 185 |
187 return true; | 186 return true; |
188 } | 187 } |
189 | 188 |
190 void AlarmsClearFunction::Callback(const std::string& name, bool success) { | 189 void AlarmsClearFunction::Callback(const std::string& name, bool success) { |
191 SetResult(new base::FundamentalValue(success)); | 190 SetResult(new base::FundamentalValue(success)); |
192 SendResponse(true); | 191 SendResponse(true); |
193 } | 192 } |
194 | 193 |
195 bool AlarmsClearAllFunction::RunAsync() { | 194 bool AlarmsClearAllFunction::RunAsync() { |
196 AlarmManager::Get(browser_context())->RemoveAllAlarms( | 195 AlarmManager::Get(browser_context()) |
197 extension_id(), base::Bind(&AlarmsClearAllFunction::Callback, this)); | 196 ->RemoveAllAlarms(extension_id(), |
| 197 base::Bind(&AlarmsClearAllFunction::Callback, this)); |
198 return true; | 198 return true; |
199 } | 199 } |
200 | 200 |
201 void AlarmsClearAllFunction::Callback() { | 201 void AlarmsClearAllFunction::Callback() { |
202 SetResult(new base::FundamentalValue(true)); | 202 SetResult(new base::FundamentalValue(true)); |
203 SendResponse(true); | 203 SendResponse(true); |
204 } | 204 } |
205 | 205 |
206 } // namespace extensions | 206 } // namespace extensions |
OLD | NEW |