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

Side by Side Diff: extensions/browser/api/alarms/alarm_manager.cc

Issue 2078103002: Make AlarmManager::Alarm non copyable. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address comments Created 4 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
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 "extensions/browser/api/alarms/alarm_manager.h" 5 #include "extensions/browser/api/alarms/alarm_manager.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <utility> 9 #include <utility>
10 10
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 private: 59 private:
60 content::BrowserContext* browser_context_; 60 content::BrowserContext* browser_context_;
61 }; 61 };
62 62
63 // Creates a TimeDelta from a delay as specified in the API. 63 // Creates a TimeDelta from a delay as specified in the API.
64 base::TimeDelta TimeDeltaFromDelay(double delay_in_minutes) { 64 base::TimeDelta TimeDeltaFromDelay(double delay_in_minutes) {
65 return base::TimeDelta::FromMicroseconds(delay_in_minutes * 65 return base::TimeDelta::FromMicroseconds(delay_in_minutes *
66 base::Time::kMicrosecondsPerMinute); 66 base::Time::kMicrosecondsPerMinute);
67 } 67 }
68 68
69 std::vector<Alarm> AlarmsFromValue(const std::string extension_id, 69 AlarmManager::AlarmList AlarmsFromValue(const std::string extension_id,
70 bool is_unpacked, 70 bool is_unpacked,
71 const base::ListValue* list) { 71 const base::ListValue* list) {
72 std::vector<Alarm> alarms; 72 AlarmManager::AlarmList alarms;
73 for (size_t i = 0; i < list->GetSize(); ++i) { 73 for (size_t i = 0; i < list->GetSize(); ++i) {
74 const base::DictionaryValue* alarm_dict = nullptr; 74 const base::DictionaryValue* alarm_dict = nullptr;
75 Alarm alarm; 75 std::unique_ptr<Alarm> alarm(new Alarm());
76 if (list->GetDictionary(i, &alarm_dict) && 76 if (list->GetDictionary(i, &alarm_dict) &&
77 alarms::Alarm::Populate(*alarm_dict, alarm.js_alarm.get())) { 77 alarms::Alarm::Populate(*alarm_dict, alarm->js_alarm.get())) {
78 const base::Value* time_value = nullptr; 78 const base::Value* time_value = nullptr;
79 if (alarm_dict->Get(kAlarmGranularity, &time_value)) 79 if (alarm_dict->Get(kAlarmGranularity, &time_value))
80 base::GetValueAsTimeDelta(*time_value, &alarm.granularity); 80 base::GetValueAsTimeDelta(*time_value, &alarm->granularity);
81 alarm.minimum_granularity = base::TimeDelta::FromSecondsD( 81 alarm->minimum_granularity = base::TimeDelta::FromSecondsD(
82 (is_unpacked ? alarms_api_constants::kDevDelayMinimum 82 (is_unpacked ? alarms_api_constants::kDevDelayMinimum
83 : alarms_api_constants::kReleaseDelayMinimum) * 83 : alarms_api_constants::kReleaseDelayMinimum) *
84 kSecondsPerMinute); 84 kSecondsPerMinute);
85 if (alarm.granularity < alarm.minimum_granularity) 85 if (alarm->granularity < alarm->minimum_granularity)
86 alarm.granularity = alarm.minimum_granularity; 86 alarm->granularity = alarm->minimum_granularity;
87 alarms.push_back(alarm); 87 alarms.push_back(std::move(alarm));
88 } 88 }
89 } 89 }
90 return alarms; 90 return alarms;
91 } 91 }
92 92
93 std::unique_ptr<base::ListValue> AlarmsToValue( 93 std::unique_ptr<base::ListValue> AlarmsToValue(
94 const std::vector<Alarm>& alarms) { 94 const std::vector<std::unique_ptr<Alarm>>& alarms) {
95 std::unique_ptr<base::ListValue> list(new base::ListValue()); 95 std::unique_ptr<base::ListValue> list(new base::ListValue());
96 for (size_t i = 0; i < alarms.size(); ++i) { 96 for (size_t i = 0; i < alarms.size(); ++i) {
97 std::unique_ptr<base::DictionaryValue> alarm = 97 std::unique_ptr<base::DictionaryValue> alarm =
98 alarms[i].js_alarm->ToValue(); 98 alarms[i]->js_alarm->ToValue();
99 alarm->Set(kAlarmGranularity, 99 alarm->Set(kAlarmGranularity,
100 base::CreateTimeDeltaValue(alarms[i].granularity)); 100 base::CreateTimeDeltaValue(alarms[i]->granularity));
101 list->Append(std::move(alarm)); 101 list->Append(std::move(alarm));
102 } 102 }
103 return list; 103 return list;
104 } 104 }
105 105
106 } // namespace 106 } // namespace
107 107
108 // AlarmManager 108 // AlarmManager
109 109
110 AlarmManager::AlarmManager(content::BrowserContext* context) 110 AlarmManager::AlarmManager(content::BrowserContext* context)
111 : browser_context_(context), 111 : browser_context_(context),
112 clock_(new base::DefaultClock()), 112 clock_(new base::DefaultClock()),
113 delegate_(new DefaultAlarmDelegate(context)), 113 delegate_(new DefaultAlarmDelegate(context)),
114 extension_registry_observer_(this) { 114 extension_registry_observer_(this) {
115 extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_)); 115 extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_));
116 116
117 StateStore* storage = ExtensionSystem::Get(browser_context_)->state_store(); 117 StateStore* storage = ExtensionSystem::Get(browser_context_)->state_store();
118 if (storage) 118 if (storage)
119 storage->RegisterKey(kRegisteredAlarms); 119 storage->RegisterKey(kRegisteredAlarms);
120 } 120 }
121 121
122 AlarmManager::~AlarmManager() { 122 AlarmManager::~AlarmManager() {
123 } 123 }
124 124
125 void AlarmManager::AddAlarm(const std::string& extension_id, 125 void AlarmManager::AddAlarm(const std::string& extension_id,
126 const Alarm& alarm, 126 std::unique_ptr<Alarm> alarm,
127 const AddAlarmCallback& callback) { 127 const AddAlarmCallback& callback) {
128 RunWhenReady(extension_id, base::Bind(&AlarmManager::AddAlarmWhenReady, 128 RunWhenReady(extension_id,
129 AsWeakPtr(), alarm, callback)); 129 base::Bind(&AlarmManager::AddAlarmWhenReady, AsWeakPtr(),
130 base::Passed(std::move(alarm)), callback));
130 } 131 }
131 132
132 void AlarmManager::GetAlarm(const std::string& extension_id, 133 void AlarmManager::GetAlarm(const std::string& extension_id,
133 const std::string& name, 134 const std::string& name,
134 const GetAlarmCallback& callback) { 135 const GetAlarmCallback& callback) {
135 RunWhenReady(extension_id, base::Bind(&AlarmManager::GetAlarmWhenReady, 136 RunWhenReady(extension_id, base::Bind(&AlarmManager::GetAlarmWhenReady,
136 AsWeakPtr(), name, callback)); 137 AsWeakPtr(), name, callback));
137 } 138 }
138 139
139 void AlarmManager::GetAllAlarms(const std::string& extension_id, 140 void AlarmManager::GetAllAlarms(const std::string& extension_id,
140 const GetAllAlarmsCallback& callback) { 141 const GetAllAlarmsCallback& callback) {
141 RunWhenReady(extension_id, base::Bind(&AlarmManager::GetAllAlarmsWhenReady, 142 RunWhenReady(extension_id, base::Bind(&AlarmManager::GetAllAlarmsWhenReady,
142 AsWeakPtr(), callback)); 143 AsWeakPtr(), callback));
143 } 144 }
144 145
145 void AlarmManager::RemoveAlarm(const std::string& extension_id, 146 void AlarmManager::RemoveAlarm(const std::string& extension_id,
146 const std::string& name, 147 const std::string& name,
147 const RemoveAlarmCallback& callback) { 148 const RemoveAlarmCallback& callback) {
148 RunWhenReady(extension_id, base::Bind(&AlarmManager::RemoveAlarmWhenReady, 149 RunWhenReady(extension_id, base::Bind(&AlarmManager::RemoveAlarmWhenReady,
149 AsWeakPtr(), name, callback)); 150 AsWeakPtr(), name, callback));
150 } 151 }
151 152
152 void AlarmManager::RemoveAllAlarms(const std::string& extension_id, 153 void AlarmManager::RemoveAllAlarms(const std::string& extension_id,
153 const RemoveAllAlarmsCallback& callback) { 154 const RemoveAllAlarmsCallback& callback) {
154 RunWhenReady(extension_id, base::Bind(&AlarmManager::RemoveAllAlarmsWhenReady, 155 RunWhenReady(extension_id, base::Bind(&AlarmManager::RemoveAllAlarmsWhenReady,
155 AsWeakPtr(), callback)); 156 AsWeakPtr(), callback));
156 } 157 }
157 158
158 void AlarmManager::AddAlarmWhenReady(const Alarm& alarm, 159 void AlarmManager::AddAlarmWhenReady(std::unique_ptr<Alarm> alarm,
159 const AddAlarmCallback& callback, 160 const AddAlarmCallback& callback,
160 const std::string& extension_id) { 161 const std::string& extension_id) {
161 AddAlarmImpl(extension_id, alarm); 162 AddAlarmImpl(extension_id, std::move(alarm));
162 WriteToStorage(extension_id); 163 WriteToStorage(extension_id);
163 callback.Run(); 164 callback.Run();
164 } 165 }
165 166
166 void AlarmManager::GetAlarmWhenReady(const std::string& name, 167 void AlarmManager::GetAlarmWhenReady(const std::string& name,
167 const GetAlarmCallback& callback, 168 const GetAlarmCallback& callback,
168 const std::string& extension_id) { 169 const std::string& extension_id) {
169 AlarmIterator it = GetAlarmIterator(extension_id, name); 170 AlarmIterator it = GetAlarmIterator(extension_id, name);
170 callback.Run(it.first != alarms_.end() ? &*it.second : NULL); 171 callback.Run(it.first != alarms_.end() ? it.second->get() : nullptr);
171 } 172 }
172 173
173 void AlarmManager::GetAllAlarmsWhenReady(const GetAllAlarmsCallback& callback, 174 void AlarmManager::GetAllAlarmsWhenReady(const GetAllAlarmsCallback& callback,
174 const std::string& extension_id) { 175 const std::string& extension_id) {
175 AlarmMap::iterator list = alarms_.find(extension_id); 176 AlarmMap::iterator list = alarms_.find(extension_id);
176 callback.Run(list != alarms_.end() ? &list->second : NULL); 177 callback.Run(list != alarms_.end() ? &list->second : NULL);
177 } 178 }
178 179
179 void AlarmManager::RemoveAlarmWhenReady(const std::string& name, 180 void AlarmManager::RemoveAlarmWhenReady(const std::string& name,
180 const RemoveAlarmCallback& callback, 181 const RemoveAlarmCallback& callback,
(...skipping 27 matching lines...) Expand all
208 209
209 AlarmManager::AlarmIterator AlarmManager::GetAlarmIterator( 210 AlarmManager::AlarmIterator AlarmManager::GetAlarmIterator(
210 const std::string& extension_id, 211 const std::string& extension_id,
211 const std::string& name) { 212 const std::string& name) {
212 AlarmMap::iterator list = alarms_.find(extension_id); 213 AlarmMap::iterator list = alarms_.find(extension_id);
213 if (list == alarms_.end()) 214 if (list == alarms_.end())
214 return make_pair(alarms_.end(), AlarmList::iterator()); 215 return make_pair(alarms_.end(), AlarmList::iterator());
215 216
216 for (AlarmList::iterator it = list->second.begin(); it != list->second.end(); 217 for (AlarmList::iterator it = list->second.begin(); it != list->second.end();
217 ++it) { 218 ++it) {
218 if (it->js_alarm->name == name) 219 if (it->get()->js_alarm->name == name)
219 return make_pair(list, it); 220 return make_pair(list, it);
220 } 221 }
221 222
222 return make_pair(alarms_.end(), AlarmList::iterator()); 223 return make_pair(alarms_.end(), AlarmList::iterator());
223 } 224 }
224 225
225 void AlarmManager::SetClockForTesting(base::Clock* clock) { 226 void AlarmManager::SetClockForTesting(base::Clock* clock) {
226 clock_.reset(clock); 227 clock_.reset(clock);
227 } 228 }
228 229
(...skipping 21 matching lines...) Expand all
250 // We don't need to reschedule the poll otherwise, because in 251 // We don't need to reschedule the poll otherwise, because in
251 // the worst case we would just poll one extra time. 252 // the worst case we would just poll one extra time.
252 if (alarms_.empty()) { 253 if (alarms_.empty()) {
253 timer_.Stop(); 254 timer_.Stop();
254 next_poll_time_ = base::Time(); 255 next_poll_time_ = base::Time();
255 } 256 }
256 } 257 }
257 258
258 void AlarmManager::OnAlarm(AlarmIterator it) { 259 void AlarmManager::OnAlarm(AlarmIterator it) {
259 CHECK(it.first != alarms_.end()); 260 CHECK(it.first != alarms_.end());
260 Alarm& alarm = *it.second; 261 Alarm& alarm = *it.second->get();
261 std::string extension_id_copy(it.first->first); 262 std::string extension_id_copy(it.first->first);
262 delegate_->OnAlarm(extension_id_copy, alarm); 263 delegate_->OnAlarm(extension_id_copy, alarm);
263 264
264 // Update our scheduled time for the next alarm. 265 // Update our scheduled time for the next alarm.
265 if (double* period_in_minutes = alarm.js_alarm->period_in_minutes.get()) { 266 if (double* period_in_minutes = alarm.js_alarm->period_in_minutes.get()) {
266 // Get the timer's delay in JS time (i.e., convert it from minutes to 267 // Get the timer's delay in JS time (i.e., convert it from minutes to
267 // milliseconds). 268 // milliseconds).
268 double period_in_js_time = *period_in_minutes * 269 double period_in_js_time = *period_in_minutes *
269 base::Time::kMicrosecondsPerMinute / 270 base::Time::kMicrosecondsPerMinute /
270 base::Time::kMicrosecondsPerMillisecond; 271 base::Time::kMicrosecondsPerMillisecond;
271 // Find out how many periods have transpired since the alarm last went off 272 // Find out how many periods have transpired since the alarm last went off
272 // (it's possible that we missed some). 273 // (it's possible that we missed some).
273 int transpired_periods = 274 int transpired_periods =
274 (last_poll_time_.ToJsTime() - alarm.js_alarm->scheduled_time) / 275 (last_poll_time_.ToJsTime() - alarm.js_alarm->scheduled_time) /
275 period_in_js_time; 276 period_in_js_time;
276 // Schedule the alarm for the next period that is in-line with the original 277 // Schedule the alarm for the next period that is in-line with the original
277 // scheduling. 278 // scheduling.
278 alarm.js_alarm->scheduled_time += 279 alarm.js_alarm->scheduled_time +=
279 period_in_js_time * (transpired_periods + 1); 280 period_in_js_time * (transpired_periods + 1);
280 } else { 281 } else {
281 RemoveAlarmIterator(it); 282 RemoveAlarmIterator(it);
282 } 283 }
283 WriteToStorage(extension_id_copy); 284 WriteToStorage(extension_id_copy);
284 } 285 }
285 286
286 void AlarmManager::AddAlarmImpl(const std::string& extension_id, 287 void AlarmManager::AddAlarmImpl(const std::string& extension_id,
287 const Alarm& alarm) { 288 std::unique_ptr<Alarm> alarm) {
288 // Override any old alarm with the same name. 289 // Override any old alarm with the same name.
289 AlarmIterator old_alarm = 290 AlarmIterator old_alarm =
290 GetAlarmIterator(extension_id, alarm.js_alarm->name); 291 GetAlarmIterator(extension_id, alarm->js_alarm->name);
291 if (old_alarm.first != alarms_.end()) 292 if (old_alarm.first != alarms_.end())
292 RemoveAlarmIterator(old_alarm); 293 RemoveAlarmIterator(old_alarm);
293 294
294 alarms_[extension_id].push_back(alarm);
295 base::Time alarm_time = 295 base::Time alarm_time =
296 base::Time::FromJsTime(alarm.js_alarm->scheduled_time); 296 base::Time::FromJsTime(alarm->js_alarm->scheduled_time);
297 alarms_[extension_id].push_back(std::move(alarm));
297 if (next_poll_time_.is_null() || alarm_time < next_poll_time_) 298 if (next_poll_time_.is_null() || alarm_time < next_poll_time_)
298 SetNextPollTime(alarm_time); 299 SetNextPollTime(alarm_time);
299 } 300 }
300 301
301 void AlarmManager::WriteToStorage(const std::string& extension_id) { 302 void AlarmManager::WriteToStorage(const std::string& extension_id) {
302 StateStore* storage = ExtensionSystem::Get(browser_context_)->state_store(); 303 StateStore* storage = ExtensionSystem::Get(browser_context_)->state_store();
303 if (!storage) 304 if (!storage)
304 return; 305 return;
305 306
306 std::unique_ptr<base::Value> alarms; 307 std::unique_ptr<base::Value> alarms;
307 AlarmMap::iterator list = alarms_.find(extension_id); 308 AlarmMap::iterator list = alarms_.find(extension_id);
308 if (list != alarms_.end()) 309 if (list != alarms_.end())
309 alarms.reset(AlarmsToValue(list->second).release()); 310 alarms = AlarmsToValue(list->second);
310 else 311 else
311 alarms.reset(AlarmsToValue(std::vector<Alarm>()).release()); 312 alarms.reset(AlarmsToValue(AlarmList()).release());
312 storage->SetExtensionValue(extension_id, kRegisteredAlarms, 313 storage->SetExtensionValue(extension_id, kRegisteredAlarms,
313 std::move(alarms)); 314 std::move(alarms));
314 } 315 }
315 316
316 void AlarmManager::ReadFromStorage(const std::string& extension_id, 317 void AlarmManager::ReadFromStorage(const std::string& extension_id,
317 bool is_unpacked, 318 bool is_unpacked,
318 std::unique_ptr<base::Value> value) { 319 std::unique_ptr<base::Value> value) {
319 base::ListValue* list = NULL; 320 base::ListValue* list = NULL;
320 if (value.get() && value->GetAsList(&list)) { 321 if (value.get() && value->GetAsList(&list)) {
321 std::vector<Alarm> alarm_states = 322 AlarmList alarm_states = AlarmsFromValue(extension_id, is_unpacked, list);
322 AlarmsFromValue(extension_id, is_unpacked, list);
323 for (size_t i = 0; i < alarm_states.size(); ++i) 323 for (size_t i = 0; i < alarm_states.size(); ++i)
324 AddAlarmImpl(extension_id, alarm_states[i]); 324 AddAlarmImpl(extension_id, std::move(alarm_states[i]));
325 } 325 }
326 326
327 ReadyQueue& extension_ready_queue = ready_actions_[extension_id]; 327 ReadyQueue& extension_ready_queue = ready_actions_[extension_id];
328 while (!extension_ready_queue.empty()) { 328 while (!extension_ready_queue.empty()) {
329 extension_ready_queue.front().Run(extension_id); 329 extension_ready_queue.front().Run(extension_id);
330 extension_ready_queue.pop(); 330 extension_ready_queue.pop();
331 } 331 }
332 ready_actions_.erase(extension_id); 332 ready_actions_.erase(extension_id);
333 } 333 }
334 334
335 void AlarmManager::SetNextPollTime(const base::Time& time) { 335 void AlarmManager::SetNextPollTime(const base::Time& time) {
336 next_poll_time_ = time; 336 next_poll_time_ = time;
337 timer_.Start(FROM_HERE, 337 timer_.Start(FROM_HERE,
338 std::max(base::TimeDelta::FromSeconds(0), time - clock_->Now()), 338 std::max(base::TimeDelta::FromSeconds(0), time - clock_->Now()),
339 this, &AlarmManager::PollAlarms); 339 this, &AlarmManager::PollAlarms);
340 } 340 }
341 341
342 void AlarmManager::ScheduleNextPoll() { 342 void AlarmManager::ScheduleNextPoll() {
343 // If there are no alarms, stop the timer. 343 // If there are no alarms, stop the timer.
344 if (alarms_.empty()) { 344 if (alarms_.empty()) {
345 timer_.Stop(); 345 timer_.Stop();
346 next_poll_time_ = base::Time(); 346 next_poll_time_ = base::Time();
347 return; 347 return;
348 } 348 }
349 349
350 // Find the soonest alarm that is scheduled to run and the smallest 350 // Find the soonest alarm that is scheduled to run and the smallest
351 // granularity of any alarm. 351 // granularity of any alarm.
352 // alarms_ guarantees that none of its contained lists are empty. 352 // alarms_ guarantees that none of its contained lists are empty.
353 base::Time soonest_alarm_time = base::Time::FromJsTime( 353 base::Time soonest_alarm_time = base::Time::FromJsTime(
354 alarms_.begin()->second.begin()->js_alarm->scheduled_time); 354 alarms_.begin()->second.begin()->get()->js_alarm->scheduled_time);
355 base::TimeDelta min_granularity = kDefaultMinPollPeriod(); 355 base::TimeDelta min_granularity = kDefaultMinPollPeriod();
356 for (AlarmMap::const_iterator m_it = alarms_.begin(), m_end = alarms_.end(); 356 for (AlarmMap::const_iterator m_it = alarms_.begin(), m_end = alarms_.end();
357 m_it != m_end; ++m_it) { 357 m_it != m_end; ++m_it) {
358 for (AlarmList::const_iterator l_it = m_it->second.begin(); 358 for (AlarmList::const_iterator l_it = m_it->second.begin();
359 l_it != m_it->second.end(); ++l_it) { 359 l_it != m_it->second.end(); ++l_it) {
360 base::Time cur_alarm_time = 360 base::Time cur_alarm_time =
361 base::Time::FromJsTime(l_it->js_alarm->scheduled_time); 361 base::Time::FromJsTime(l_it->get()->js_alarm->scheduled_time);
362 if (cur_alarm_time < soonest_alarm_time) 362 if (cur_alarm_time < soonest_alarm_time)
363 soonest_alarm_time = cur_alarm_time; 363 soonest_alarm_time = cur_alarm_time;
364 if (l_it->granularity < min_granularity) 364 if (l_it->get()->granularity < min_granularity)
365 min_granularity = l_it->granularity; 365 min_granularity = l_it->get()->granularity;
366 base::TimeDelta cur_alarm_delta = cur_alarm_time - last_poll_time_; 366 base::TimeDelta cur_alarm_delta = cur_alarm_time - last_poll_time_;
367 if (cur_alarm_delta < l_it->minimum_granularity) 367 if (cur_alarm_delta < l_it->get()->minimum_granularity)
368 cur_alarm_delta = l_it->minimum_granularity; 368 cur_alarm_delta = l_it->get()->minimum_granularity;
369 if (cur_alarm_delta < min_granularity) 369 if (cur_alarm_delta < min_granularity)
370 min_granularity = cur_alarm_delta; 370 min_granularity = cur_alarm_delta;
371 } 371 }
372 } 372 }
373 373
374 base::Time next_poll(last_poll_time_ + min_granularity); 374 base::Time next_poll(last_poll_time_ + min_granularity);
375 // If the next alarm is more than min_granularity in the future, wait for it. 375 // If the next alarm is more than min_granularity in the future, wait for it.
376 // Otherwise, only poll as often as min_granularity. 376 // Otherwise, only poll as often as min_granularity.
377 // As a special case, if we've never checked for an alarm before 377 // As a special case, if we've never checked for an alarm before
378 // (e.g. during startup), let alarms fire asap. 378 // (e.g. during startup), let alarms fire asap.
(...skipping 13 matching lines...) Expand all
392 for (AlarmMap::iterator m_it = alarms_.begin(), m_end = alarms_.end(); 392 for (AlarmMap::iterator m_it = alarms_.begin(), m_end = alarms_.end();
393 m_it != m_end;) { 393 m_it != m_end;) {
394 AlarmMap::iterator cur_extension = m_it++; 394 AlarmMap::iterator cur_extension = m_it++;
395 395
396 // Iterate (a) backwards so that removing elements doesn't affect 396 // Iterate (a) backwards so that removing elements doesn't affect
397 // upcoming iterations, and (b) with indices so that if the last 397 // upcoming iterations, and (b) with indices so that if the last
398 // iteration destroys the AlarmList, I'm not about to use the end 398 // iteration destroys the AlarmList, I'm not about to use the end
399 // iterator that the destruction invalidates. 399 // iterator that the destruction invalidates.
400 for (size_t i = cur_extension->second.size(); i > 0; --i) { 400 for (size_t i = cur_extension->second.size(); i > 0; --i) {
401 AlarmList::iterator cur_alarm = cur_extension->second.begin() + i - 1; 401 AlarmList::iterator cur_alarm = cur_extension->second.begin() + i - 1;
402 if (base::Time::FromJsTime(cur_alarm->js_alarm->scheduled_time) <= 402 if (base::Time::FromJsTime(cur_alarm->get()->js_alarm->scheduled_time) <=
403 last_poll_time_) { 403 last_poll_time_) {
404 OnAlarm(make_pair(cur_extension, cur_alarm)); 404 OnAlarm(make_pair(cur_extension, cur_alarm));
405 } 405 }
406 } 406 }
407 } 407 }
408 408
409 ScheduleNextPoll(); 409 ScheduleNextPoll();
410 } 410 }
411 411
412 static void RemoveAllOnUninstallCallback() { 412 static void RemoveAllOnUninstallCallback() {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 if (granularity < min_granularity) 475 if (granularity < min_granularity)
476 granularity = min_granularity; 476 granularity = min_granularity;
477 477
478 // Check for repetition. 478 // Check for repetition.
479 if (create_info.period_in_minutes.get()) { 479 if (create_info.period_in_minutes.get()) {
480 js_alarm->period_in_minutes.reset( 480 js_alarm->period_in_minutes.reset(
481 new double(*create_info.period_in_minutes)); 481 new double(*create_info.period_in_minutes));
482 } 482 }
483 } 483 }
484 484
485 Alarm::Alarm(const Alarm& other) = default;
486
487 Alarm::~Alarm() { 485 Alarm::~Alarm() {
488 } 486 }
489 487
490 } // namespace extensions 488 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/browser/api/alarms/alarm_manager.h ('k') | extensions/browser/api/alarms/alarms_api.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698