| 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 "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 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/json/json_writer.h" | 12 #include "base/json/json_writer.h" |
| 13 #include "base/lazy_instance.h" | 13 #include "base/lazy_instance.h" |
| 14 #include "base/message_loop/message_loop.h" | 14 #include "base/message_loop/message_loop.h" |
| 15 #include "base/time/clock.h" | 15 #include "base/time/clock.h" |
| 16 #include "base/time/default_clock.h" | 16 #include "base/time/default_clock.h" |
| 17 #include "base/time/time.h" | 17 #include "base/time/time.h" |
| 18 #include "base/value_conversions.h" | 18 #include "base/value_conversions.h" |
| 19 #include "base/values.h" | 19 #include "base/values.h" |
| 20 #include "extensions/browser/api/alarms/alarms_api_constants.h" |
| 20 #include "extensions/browser/event_router.h" | 21 #include "extensions/browser/event_router.h" |
| 21 #include "extensions/browser/extension_registry.h" | 22 #include "extensions/browser/extension_registry.h" |
| 22 #include "extensions/browser/extension_system.h" | 23 #include "extensions/browser/extension_system.h" |
| 23 #include "extensions/browser/state_store.h" | 24 #include "extensions/browser/state_store.h" |
| 24 #include "extensions/common/api/alarms.h" | 25 #include "extensions/common/api/alarms.h" |
| 25 | 26 |
| 26 namespace extensions { | 27 namespace extensions { |
| 27 | 28 |
| 28 namespace alarms = api::alarms; | 29 namespace alarms = api::alarms; |
| 29 | 30 |
| 30 namespace { | 31 namespace { |
| 31 | 32 |
| 32 // A list of alarms that this extension has set. | 33 // A list of alarms that this extension has set. |
| 33 const char kRegisteredAlarms[] = "alarms"; | 34 const char kRegisteredAlarms[] = "alarms"; |
| 34 const char kAlarmGranularity[] = "granularity"; | 35 const char kAlarmGranularity[] = "granularity"; |
| 35 | 36 |
| 37 const int kSecondsPerMinute = 60; |
| 38 |
| 36 // The minimum period between polling for alarms to run. | 39 // The minimum period between polling for alarms to run. |
| 37 const base::TimeDelta kDefaultMinPollPeriod() { | 40 const base::TimeDelta kDefaultMinPollPeriod() { |
| 38 return base::TimeDelta::FromDays(1); | 41 return base::TimeDelta::FromDays(1); |
| 39 } | 42 } |
| 40 | 43 |
| 41 class DefaultAlarmDelegate : public AlarmManager::Delegate { | 44 class DefaultAlarmDelegate : public AlarmManager::Delegate { |
| 42 public: | 45 public: |
| 43 explicit DefaultAlarmDelegate(content::BrowserContext* context) | 46 explicit DefaultAlarmDelegate(content::BrowserContext* context) |
| 44 : browser_context_(context) {} | 47 : browser_context_(context) {} |
| 45 ~DefaultAlarmDelegate() override {} | 48 ~DefaultAlarmDelegate() override {} |
| (...skipping 10 matching lines...) Expand all Loading... |
| 56 private: | 59 private: |
| 57 content::BrowserContext* browser_context_; | 60 content::BrowserContext* browser_context_; |
| 58 }; | 61 }; |
| 59 | 62 |
| 60 // Creates a TimeDelta from a delay as specified in the API. | 63 // Creates a TimeDelta from a delay as specified in the API. |
| 61 base::TimeDelta TimeDeltaFromDelay(double delay_in_minutes) { | 64 base::TimeDelta TimeDeltaFromDelay(double delay_in_minutes) { |
| 62 return base::TimeDelta::FromMicroseconds(delay_in_minutes * | 65 return base::TimeDelta::FromMicroseconds(delay_in_minutes * |
| 63 base::Time::kMicrosecondsPerMinute); | 66 base::Time::kMicrosecondsPerMinute); |
| 64 } | 67 } |
| 65 | 68 |
| 66 std::vector<Alarm> AlarmsFromValue(const base::ListValue* list) { | 69 std::vector<Alarm> AlarmsFromValue(const std::string extension_id, |
| 70 bool is_unpacked, |
| 71 const base::ListValue* list) { |
| 67 std::vector<Alarm> alarms; | 72 std::vector<Alarm> alarms; |
| 68 for (size_t i = 0; i < list->GetSize(); ++i) { | 73 for (size_t i = 0; i < list->GetSize(); ++i) { |
| 69 const base::DictionaryValue* alarm_dict = NULL; | 74 const base::DictionaryValue* alarm_dict = nullptr; |
| 70 Alarm alarm; | 75 Alarm alarm; |
| 71 if (list->GetDictionary(i, &alarm_dict) && | 76 if (list->GetDictionary(i, &alarm_dict) && |
| 72 alarms::Alarm::Populate(*alarm_dict, alarm.js_alarm.get())) { | 77 alarms::Alarm::Populate(*alarm_dict, alarm.js_alarm.get())) { |
| 73 const base::Value* time_value = NULL; | 78 const base::Value* time_value = nullptr; |
| 74 if (alarm_dict->Get(kAlarmGranularity, &time_value)) | 79 if (alarm_dict->Get(kAlarmGranularity, &time_value)) |
| 75 base::GetValueAsTimeDelta(*time_value, &alarm.granularity); | 80 base::GetValueAsTimeDelta(*time_value, &alarm.granularity); |
| 81 alarm.minimum_granularity = base::TimeDelta::FromSecondsD( |
| 82 (is_unpacked ? alarms_api_constants::kDevDelayMinimum |
| 83 : alarms_api_constants::kReleaseDelayMinimum) * |
| 84 kSecondsPerMinute); |
| 85 if (alarm.granularity < alarm.minimum_granularity) |
| 86 alarm.granularity = alarm.minimum_granularity; |
| 76 alarms.push_back(alarm); | 87 alarms.push_back(alarm); |
| 77 } | 88 } |
| 78 } | 89 } |
| 79 return alarms; | 90 return alarms; |
| 80 } | 91 } |
| 81 | 92 |
| 82 std::unique_ptr<base::ListValue> AlarmsToValue( | 93 std::unique_ptr<base::ListValue> AlarmsToValue( |
| 83 const std::vector<Alarm>& alarms) { | 94 const std::vector<Alarm>& alarms) { |
| 84 std::unique_ptr<base::ListValue> list(new base::ListValue()); | 95 std::unique_ptr<base::ListValue> list(new base::ListValue()); |
| 85 for (size_t i = 0; i < alarms.size(); ++i) { | 96 for (size_t i = 0; i < alarms.size(); ++i) { |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 AlarmMap::iterator list = alarms_.find(extension_id); | 307 AlarmMap::iterator list = alarms_.find(extension_id); |
| 297 if (list != alarms_.end()) | 308 if (list != alarms_.end()) |
| 298 alarms.reset(AlarmsToValue(list->second).release()); | 309 alarms.reset(AlarmsToValue(list->second).release()); |
| 299 else | 310 else |
| 300 alarms.reset(AlarmsToValue(std::vector<Alarm>()).release()); | 311 alarms.reset(AlarmsToValue(std::vector<Alarm>()).release()); |
| 301 storage->SetExtensionValue(extension_id, kRegisteredAlarms, | 312 storage->SetExtensionValue(extension_id, kRegisteredAlarms, |
| 302 std::move(alarms)); | 313 std::move(alarms)); |
| 303 } | 314 } |
| 304 | 315 |
| 305 void AlarmManager::ReadFromStorage(const std::string& extension_id, | 316 void AlarmManager::ReadFromStorage(const std::string& extension_id, |
| 317 bool is_unpacked, |
| 306 std::unique_ptr<base::Value> value) { | 318 std::unique_ptr<base::Value> value) { |
| 307 base::ListValue* list = NULL; | 319 base::ListValue* list = NULL; |
| 308 if (value.get() && value->GetAsList(&list)) { | 320 if (value.get() && value->GetAsList(&list)) { |
| 309 std::vector<Alarm> alarm_states = AlarmsFromValue(list); | 321 std::vector<Alarm> alarm_states = |
| 322 AlarmsFromValue(extension_id, is_unpacked, list); |
| 310 for (size_t i = 0; i < alarm_states.size(); ++i) | 323 for (size_t i = 0; i < alarm_states.size(); ++i) |
| 311 AddAlarmImpl(extension_id, alarm_states[i]); | 324 AddAlarmImpl(extension_id, alarm_states[i]); |
| 312 } | 325 } |
| 313 | 326 |
| 314 ReadyQueue& extension_ready_queue = ready_actions_[extension_id]; | 327 ReadyQueue& extension_ready_queue = ready_actions_[extension_id]; |
| 315 while (!extension_ready_queue.empty()) { | 328 while (!extension_ready_queue.empty()) { |
| 316 extension_ready_queue.front().Run(extension_id); | 329 extension_ready_queue.front().Run(extension_id); |
| 317 extension_ready_queue.pop(); | 330 extension_ready_queue.pop(); |
| 318 } | 331 } |
| 319 ready_actions_.erase(extension_id); | 332 ready_actions_.erase(extension_id); |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 if (it == ready_actions_.end()) | 419 if (it == ready_actions_.end()) |
| 407 action.Run(extension_id); | 420 action.Run(extension_id); |
| 408 else | 421 else |
| 409 it->second.push(action); | 422 it->second.push(action); |
| 410 } | 423 } |
| 411 | 424 |
| 412 void AlarmManager::OnExtensionLoaded(content::BrowserContext* browser_context, | 425 void AlarmManager::OnExtensionLoaded(content::BrowserContext* browser_context, |
| 413 const Extension* extension) { | 426 const Extension* extension) { |
| 414 StateStore* storage = ExtensionSystem::Get(browser_context_)->state_store(); | 427 StateStore* storage = ExtensionSystem::Get(browser_context_)->state_store(); |
| 415 if (storage) { | 428 if (storage) { |
| 429 bool is_unpacked = Manifest::IsUnpackedLocation(extension->location()); |
| 416 ready_actions_.insert(ReadyMap::value_type(extension->id(), ReadyQueue())); | 430 ready_actions_.insert(ReadyMap::value_type(extension->id(), ReadyQueue())); |
| 417 storage->GetExtensionValue(extension->id(), kRegisteredAlarms, | 431 storage->GetExtensionValue( |
| 418 base::Bind(&AlarmManager::ReadFromStorage, | 432 extension->id(), kRegisteredAlarms, |
| 419 AsWeakPtr(), extension->id())); | 433 base::Bind(&AlarmManager::ReadFromStorage, AsWeakPtr(), extension->id(), |
| 434 is_unpacked)); |
| 420 } | 435 } |
| 421 } | 436 } |
| 422 | 437 |
| 423 void AlarmManager::OnExtensionUninstalled( | 438 void AlarmManager::OnExtensionUninstalled( |
| 424 content::BrowserContext* browser_context, | 439 content::BrowserContext* browser_context, |
| 425 const Extension* extension, | 440 const Extension* extension, |
| 426 extensions::UninstallReason reason) { | 441 extensions::UninstallReason reason) { |
| 427 RemoveAllAlarms(extension->id(), base::Bind(RemoveAllOnUninstallCallback)); | 442 RemoveAllAlarms(extension->id(), base::Bind(RemoveAllOnUninstallCallback)); |
| 428 } | 443 } |
| 429 | 444 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 466 new double(*create_info.period_in_minutes)); | 481 new double(*create_info.period_in_minutes)); |
| 467 } | 482 } |
| 468 } | 483 } |
| 469 | 484 |
| 470 Alarm::Alarm(const Alarm& other) = default; | 485 Alarm::Alarm(const Alarm& other) = default; |
| 471 | 486 |
| 472 Alarm::~Alarm() { | 487 Alarm::~Alarm() { |
| 473 } | 488 } |
| 474 | 489 |
| 475 } // namespace extensions | 490 } // namespace extensions |
| OLD | NEW |