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

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: Merge with r141780 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[] = "* is less than minimum of * minutes.";
23 const char kDelayIsNonInteger[] = "Delay is not an integer value."; 23 const char kDelayIsNonInteger[] = "* is not an integer value.";
24 24 const char kBothRelativeAndAbsoluteTime[] =
25 "Cannot set both when and delayInMinutes.";
26 const char kNoScheduledTime[] =
27 "Must set at least one of when, delayInMinutes, or periodInMinutes.";
25 const int kReleaseDelayMinimum = 5; 28 const int kReleaseDelayMinimum = 5;
26 const int kDevDelayMinimum = 0; 29 const int kDevDelayMinimum = 0;
27 30
28 bool ValidateDelayTime(double delay_in_minutes, 31 bool ValidateDelay(double delay_in_minutes,
29 const Extension* extension, 32 const Extension* extension,
30 std::string* error) { 33 const std::string& delay_or_period,
34 std::string* error) {
31 double delay_minimum = kDevDelayMinimum; 35 double delay_minimum = kDevDelayMinimum;
32 if (extension->location() != Extension::LOAD) { 36 if (extension->location() != Extension::LOAD) {
33 // In release mode we check for integer delay values and a stricter delay 37 // In release mode we check for integer delay values and a stricter delay
34 // minimum. 38 // minimum.
35 if (delay_in_minutes != static_cast<int>(delay_in_minutes)) { 39 if (delay_in_minutes != static_cast<int>(delay_in_minutes)) {
36 *error = kDelayIsNonInteger; 40 *error = ExtensionErrorUtils::FormatErrorMessage(
41 kDelayIsNonInteger,
42 delay_or_period);
37 return false; 43 return false;
38 } 44 }
39 delay_minimum = kReleaseDelayMinimum; 45 delay_minimum = kReleaseDelayMinimum;
40 } 46 }
41 47
42 // Validate against our found delay minimum. 48 // Validate against our found delay minimum.
43 if (delay_in_minutes < delay_minimum) { 49 if (delay_in_minutes < delay_minimum) {
44 *error = ExtensionErrorUtils::FormatErrorMessage(kDelayLessThanMinimum, 50 *error = ExtensionErrorUtils::FormatErrorMessage(
51 kDelayLessThanMinimum,
52 delay_or_period,
45 base::DoubleToString(delay_minimum)); 53 base::DoubleToString(delay_minimum));
46 return false; 54 return false;
47 } 55 }
56
57 return true;
58 }
59
60 bool ValidateAlarmCreateInfo(const alarms::AlarmCreateInfo& create_info,
61 const Extension* extension,
62 std::string* error) {
63 if (create_info.delay_in_minutes.get() &&
64 create_info.when.get()) {
65 *error = kBothRelativeAndAbsoluteTime;
66 return false;
67 }
68 if (create_info.delay_in_minutes == NULL &&
69 create_info.when == NULL &&
70 create_info.period_in_minutes == NULL) {
71 *error = kNoScheduledTime;
72 return false;
73 }
74
75 // Users can always use an absolute timeout to request an arbitrarily-short or
76 // negative delay. We won't honor the short timeout, but we can't check it
77 // and warn the user because it would introduce race conditions (say they
78 // compute a long-enough timeout, but then the call into the alarms interface
79 // gets delayed past the boundary). However, it's still worth warning about
80 // relative delays that are shorter than we'll honor.
81 if (create_info.delay_in_minutes.get()) {
82 if (!ValidateDelay(*create_info.delay_in_minutes,
83 extension, "Delay", error))
84 return false;
85 }
86 if (create_info.period_in_minutes.get()) {
87 if (!ValidateDelay(*create_info.period_in_minutes,
88 extension, "Period", error))
89 return false;
90 }
91
48 return true; 92 return true;
49 } 93 }
50 94
51 } // namespace 95 } // namespace
52 96
97 AlarmsCreateFunction::AlarmsCreateFunction()
98 : now_(&base::Time::Now) {
99 }
100
53 bool AlarmsCreateFunction::RunImpl() { 101 bool AlarmsCreateFunction::RunImpl() {
54 scoped_ptr<alarms::Create::Params> params( 102 scoped_ptr<alarms::Create::Params> params(
55 alarms::Create::Params::Create(*args_)); 103 alarms::Create::Params::Create(*args_));
56 EXTENSION_FUNCTION_VALIDATE(params.get()); 104 EXTENSION_FUNCTION_VALIDATE(params.get());
57 105 if (!ValidateAlarmCreateInfo(
58 double delay_in_minutes = params->alarm_info.delay_in_minutes; 106 params->alarm_info, GetExtension(), &error_))
59 if (!ValidateDelayTime(delay_in_minutes, GetExtension(), &error_))
60 return false; 107 return false;
61 108
62 linked_ptr<AlarmManager::Alarm> alarm(new AlarmManager::Alarm()); 109 Alarm alarm(params->name.get() ? *params->name : kDefaultAlarmName,
63 alarm->name = params->name.get() ? *params->name : kDefaultAlarmName; 110 params->alarm_info,
64 alarm->delay_in_minutes = params->alarm_info.delay_in_minutes; 111 base::TimeDelta::FromMinutes(
65 alarm->repeating = params->alarm_info.repeating.get() ? 112 GetExtension()->location() == Extension::LOAD ?
66 *params->alarm_info.repeating : false; 113 kDevDelayMinimum : kReleaseDelayMinimum),
114 now_);
67 ExtensionSystem::Get(profile())->alarm_manager()->AddAlarm( 115 ExtensionSystem::Get(profile())->alarm_manager()->AddAlarm(
68 extension_id(), alarm); 116 extension_id(), alarm);
69 117
70 return true; 118 return true;
71 } 119 }
72 120
73 bool AlarmsGetFunction::RunImpl() { 121 bool AlarmsGetFunction::RunImpl() {
74 scoped_ptr<alarms::Get::Params> params( 122 scoped_ptr<alarms::Get::Params> params(
75 alarms::Get::Params::Create(*args_)); 123 alarms::Get::Params::Create(*args_));
76 EXTENSION_FUNCTION_VALIDATE(params.get()); 124 EXTENSION_FUNCTION_VALIDATE(params.get());
77 125
78 std::string name = params->name.get() ? *params->name : kDefaultAlarmName; 126 std::string name = params->name.get() ? *params->name : kDefaultAlarmName;
79 const AlarmManager::Alarm* alarm = 127 const Alarm* alarm =
80 ExtensionSystem::Get(profile())->alarm_manager()->GetAlarm( 128 ExtensionSystem::Get(profile())->alarm_manager()->GetAlarm(
81 extension_id(), name); 129 extension_id(), name);
82 130
83 if (!alarm) { 131 if (!alarm) {
84 error_ = ExtensionErrorUtils::FormatErrorMessage(kAlarmNotFound, name); 132 error_ = ExtensionErrorUtils::FormatErrorMessage(kAlarmNotFound, name);
85 return false; 133 return false;
86 } 134 }
87 135
88 result_.reset(alarms::Get::Result::Create(*alarm)); 136 result_.reset(alarms::Get::Result::Create(*alarm->js_alarm));
89 return true; 137 return true;
90 } 138 }
91 139
92 bool AlarmsGetAllFunction::RunImpl() { 140 bool AlarmsGetAllFunction::RunImpl() {
93 const AlarmManager::AlarmList* alarms = 141 const AlarmManager::AlarmList* alarms =
94 ExtensionSystem::Get(profile())->alarm_manager()->GetAllAlarms( 142 ExtensionSystem::Get(profile())->alarm_manager()->GetAllAlarms(
95 extension_id()); 143 extension_id());
96 if (alarms) { 144 if (alarms) {
97 result_.reset(alarms::GetAll::Result::Create(*alarms)); 145 std::vector<linked_ptr<extensions::api::alarms::Alarm> > create_arg;
146 create_arg.reserve(alarms->size());
147 for (size_t i = 0, size = alarms->size(); i < size; ++i) {
148 create_arg.push_back((*alarms)[i].js_alarm);
149 }
150 result_.reset(alarms::GetAll::Result::Create(create_arg));
98 } else { 151 } else {
99 result_.reset(new base::ListValue()); 152 result_.reset(new base::ListValue());
100 } 153 }
101 return true; 154 return true;
102 } 155 }
103 156
104 bool AlarmsClearFunction::RunImpl() { 157 bool AlarmsClearFunction::RunImpl() {
105 scoped_ptr<alarms::Clear::Params> params( 158 scoped_ptr<alarms::Clear::Params> params(
106 alarms::Clear::Params::Create(*args_)); 159 alarms::Clear::Params::Create(*args_));
107 EXTENSION_FUNCTION_VALIDATE(params.get()); 160 EXTENSION_FUNCTION_VALIDATE(params.get());
(...skipping 10 matching lines...) Expand all
118 return true; 171 return true;
119 } 172 }
120 173
121 bool AlarmsClearAllFunction::RunImpl() { 174 bool AlarmsClearAllFunction::RunImpl() {
122 ExtensionSystem::Get(profile())->alarm_manager()->RemoveAllAlarms( 175 ExtensionSystem::Get(profile())->alarm_manager()->RemoveAllAlarms(
123 extension_id()); 176 extension_id());
124 return true; 177 return true;
125 } 178 }
126 179
127 } // namespace extensions 180 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/browser/extensions/api/alarms/alarms_api.h ('k') | chrome/browser/extensions/api/alarms/alarms_api_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698