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

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

Issue 2051573003: Perform alarm's period limit check while reading alarm info from StateStore. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase @tott 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
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
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
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
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
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
OLDNEW
« no previous file with comments | « extensions/browser/api/alarms/alarm_manager.h ('k') | extensions/browser/api/alarms/alarms_api.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698