OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/hotword_private/hotword_private_api.h" | 5 #include "chrome/browser/extensions/api/hotword_private/hotword_private_api.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <string> | 8 #include <string> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 std::unique_ptr<base::ListValue> args) { | 142 std::unique_ptr<base::ListValue> args) { |
143 EventRouter* router = EventRouter::Get(profile_); | 143 EventRouter* router = EventRouter::Get(profile_); |
144 if (!router || !router->HasEventListener(event_name)) | 144 if (!router || !router->HasEventListener(event_name)) |
145 return; | 145 return; |
146 | 146 |
147 std::unique_ptr<Event> event( | 147 std::unique_ptr<Event> event( |
148 new Event(histogram_value, event_name, std::move(args))); | 148 new Event(histogram_value, event_name, std::move(args))); |
149 router->BroadcastEvent(std::move(event)); | 149 router->BroadcastEvent(std::move(event)); |
150 } | 150 } |
151 | 151 |
152 bool HotwordPrivateSetEnabledFunction::RunSync() { | 152 ExtensionFunction::ResponseAction HotwordPrivateSetEnabledFunction::Run() { |
153 std::unique_ptr<api::hotword_private::SetEnabled::Params> params( | 153 std::unique_ptr<api::hotword_private::SetEnabled::Params> params( |
154 api::hotword_private::SetEnabled::Params::Create(*args_)); | 154 api::hotword_private::SetEnabled::Params::Create(*args_)); |
155 EXTENSION_FUNCTION_VALIDATE(params.get()); | 155 EXTENSION_FUNCTION_VALIDATE(params.get()); |
156 | 156 |
157 PrefService* prefs = GetProfile()->GetPrefs(); | 157 PrefService* prefs = |
| 158 Profile::FromBrowserContext(browser_context())->GetPrefs(); |
158 prefs->SetBoolean(prefs::kHotwordSearchEnabled, params->state); | 159 prefs->SetBoolean(prefs::kHotwordSearchEnabled, params->state); |
159 return true; | 160 return RespondNow(NoArguments()); |
160 } | 161 } |
161 | 162 |
162 bool HotwordPrivateSetAudioLoggingEnabledFunction::RunSync() { | 163 ExtensionFunction::ResponseAction |
| 164 HotwordPrivateSetAudioLoggingEnabledFunction::Run() { |
163 std::unique_ptr<api::hotword_private::SetAudioLoggingEnabled::Params> params( | 165 std::unique_ptr<api::hotword_private::SetAudioLoggingEnabled::Params> params( |
164 api::hotword_private::SetAudioLoggingEnabled::Params::Create(*args_)); | 166 api::hotword_private::SetAudioLoggingEnabled::Params::Create(*args_)); |
165 EXTENSION_FUNCTION_VALIDATE(params.get()); | 167 EXTENSION_FUNCTION_VALIDATE(params.get()); |
166 | 168 |
167 // TODO(kcarattini): Sync the chrome pref with the account-level | 169 // TODO(kcarattini): Sync the chrome pref with the account-level |
168 // Audio History setting. | 170 // Audio History setting. |
169 PrefService* prefs = GetProfile()->GetPrefs(); | 171 PrefService* prefs = |
| 172 Profile::FromBrowserContext(browser_context())->GetPrefs(); |
170 prefs->SetBoolean(prefs::kHotwordAudioLoggingEnabled, params->state); | 173 prefs->SetBoolean(prefs::kHotwordAudioLoggingEnabled, params->state); |
171 return true; | 174 return RespondNow(NoArguments()); |
172 } | 175 } |
173 | 176 |
174 bool HotwordPrivateSetHotwordAlwaysOnSearchEnabledFunction::RunSync() { | 177 ExtensionFunction::ResponseAction |
| 178 HotwordPrivateSetHotwordAlwaysOnSearchEnabledFunction::Run() { |
175 std::unique_ptr<api::hotword_private::SetHotwordAlwaysOnSearchEnabled::Params> | 179 std::unique_ptr<api::hotword_private::SetHotwordAlwaysOnSearchEnabled::Params> |
176 params( | 180 params( |
177 api::hotword_private::SetHotwordAlwaysOnSearchEnabled::Params::Create( | 181 api::hotword_private::SetHotwordAlwaysOnSearchEnabled::Params::Create( |
178 *args_)); | 182 *args_)); |
179 EXTENSION_FUNCTION_VALIDATE(params.get()); | 183 EXTENSION_FUNCTION_VALIDATE(params.get()); |
180 | 184 |
181 PrefService* prefs = GetProfile()->GetPrefs(); | 185 PrefService* prefs = |
| 186 Profile::FromBrowserContext(browser_context())->GetPrefs(); |
182 prefs->SetBoolean(prefs::kHotwordAlwaysOnSearchEnabled, params->state); | 187 prefs->SetBoolean(prefs::kHotwordAlwaysOnSearchEnabled, params->state); |
183 return true; | 188 return RespondNow(NoArguments()); |
184 } | 189 } |
185 | 190 |
186 bool HotwordPrivateGetStatusFunction::RunSync() { | 191 ExtensionFunction::ResponseAction HotwordPrivateGetStatusFunction::Run() { |
187 std::unique_ptr<api::hotword_private::GetStatus::Params> params( | 192 std::unique_ptr<api::hotword_private::GetStatus::Params> params( |
188 api::hotword_private::GetStatus::Params::Create(*args_)); | 193 api::hotword_private::GetStatus::Params::Create(*args_)); |
189 EXTENSION_FUNCTION_VALIDATE(params.get()); | 194 EXTENSION_FUNCTION_VALIDATE(params.get()); |
190 | 195 |
191 api::hotword_private::StatusDetails result; | 196 api::hotword_private::StatusDetails result; |
192 | 197 |
| 198 Profile* profile = Profile::FromBrowserContext(browser_context()); |
193 HotwordService* hotword_service = | 199 HotwordService* hotword_service = |
194 HotwordServiceFactory::GetForProfile(GetProfile()); | 200 HotwordServiceFactory::GetForProfile(profile); |
195 if (!hotword_service) { | 201 if (!hotword_service) { |
196 result.available = false; | 202 result.available = false; |
197 result.always_on_available = false; | 203 result.always_on_available = false; |
198 result.enabled = false; | 204 result.enabled = false; |
199 result.audio_logging_enabled = false; | 205 result.audio_logging_enabled = false; |
200 result.always_on_enabled = false; | 206 result.always_on_enabled = false; |
201 result.user_is_active = false; | 207 result.user_is_active = false; |
202 result.hotword_hardware_available = false; | 208 result.hotword_hardware_available = false; |
203 } else { | 209 } else { |
204 result.available = false; | 210 result.available = false; |
205 result.always_on_available = false; | 211 result.always_on_available = false; |
206 if (params->get_optional_fields && *params->get_optional_fields) { | 212 if (params->get_optional_fields && *params->get_optional_fields) { |
207 result.available = hotword_service->IsServiceAvailable(); | 213 result.available = hotword_service->IsServiceAvailable(); |
208 result.always_on_available = | 214 result.always_on_available = |
209 HotwordServiceFactory::IsAlwaysOnAvailable(); | 215 HotwordServiceFactory::IsAlwaysOnAvailable(); |
210 } | 216 } |
211 result.enabled = hotword_service->IsSometimesOnEnabled(); | 217 result.enabled = hotword_service->IsSometimesOnEnabled(); |
212 result.audio_logging_enabled = hotword_service->IsOptedIntoAudioLogging(); | 218 result.audio_logging_enabled = hotword_service->IsOptedIntoAudioLogging(); |
213 result.training_enabled = hotword_service->IsTraining(); | 219 result.training_enabled = hotword_service->IsTraining(); |
214 result.always_on_enabled = hotword_service->IsAlwaysOnEnabled(); | 220 result.always_on_enabled = hotword_service->IsAlwaysOnEnabled(); |
215 result.user_is_active = hotword_service->UserIsActive(); | 221 result.user_is_active = hotword_service->UserIsActive(); |
216 result.hotword_hardware_available = | 222 result.hotword_hardware_available = |
217 HotwordService::IsHotwordHardwareAvailable(); | 223 HotwordService::IsHotwordHardwareAvailable(); |
218 } | 224 } |
219 | 225 |
220 PrefService* prefs = GetProfile()->GetPrefs(); | 226 PrefService* prefs = profile->GetPrefs(); |
221 result.enabled_set = prefs->HasPrefPath(prefs::kHotwordSearchEnabled); | 227 result.enabled_set = prefs->HasPrefPath(prefs::kHotwordSearchEnabled); |
222 | 228 |
223 SetResult(result.ToValue()); | 229 return RespondNow(OneArgument(result.ToValue())); |
224 return true; | |
225 } | 230 } |
226 | 231 |
227 bool HotwordPrivateSetHotwordSessionStateFunction::RunSync() { | 232 ExtensionFunction::ResponseAction |
| 233 HotwordPrivateSetHotwordSessionStateFunction::Run() { |
228 std::unique_ptr<api::hotword_private::SetHotwordSessionState::Params> params( | 234 std::unique_ptr<api::hotword_private::SetHotwordSessionState::Params> params( |
229 api::hotword_private::SetHotwordSessionState::Params::Create(*args_)); | 235 api::hotword_private::SetHotwordSessionState::Params::Create(*args_)); |
230 EXTENSION_FUNCTION_VALIDATE(params.get()); | 236 EXTENSION_FUNCTION_VALIDATE(params.get()); |
231 | 237 |
232 HotwordService* hotword_service = | 238 HotwordService* hotword_service = HotwordServiceFactory::GetForProfile( |
233 HotwordServiceFactory::GetForProfile(GetProfile()); | 239 Profile::FromBrowserContext(browser_context())); |
234 if (hotword_service && | 240 if (hotword_service && |
235 hotword_service->client() && | 241 hotword_service->client() && |
236 !hotword_service->IsTraining()) | 242 !hotword_service->IsTraining()) |
237 hotword_service->client()->OnHotwordStateChanged(params->started); | 243 hotword_service->client()->OnHotwordStateChanged(params->started); |
238 return true; | 244 return RespondNow(NoArguments()); |
239 } | 245 } |
240 | 246 |
241 bool HotwordPrivateNotifyHotwordRecognitionFunction::RunSync() { | 247 ExtensionFunction::ResponseAction |
| 248 HotwordPrivateNotifyHotwordRecognitionFunction::Run() { |
242 std::unique_ptr<api::hotword_private::NotifyHotwordRecognition::Params> | 249 std::unique_ptr<api::hotword_private::NotifyHotwordRecognition::Params> |
243 params(api::hotword_private::NotifyHotwordRecognition::Params::Create( | 250 params(api::hotword_private::NotifyHotwordRecognition::Params::Create( |
244 *args_)); | 251 *args_)); |
245 EXTENSION_FUNCTION_VALIDATE(params.get()); | 252 EXTENSION_FUNCTION_VALIDATE(params.get()); |
246 | 253 |
247 scoped_refptr<content::SpeechRecognitionSessionPreamble> preamble; | 254 scoped_refptr<content::SpeechRecognitionSessionPreamble> preamble; |
248 if (params->log.get() && | 255 if (params->log.get() && |
249 !params->log->buffer.empty() && | 256 !params->log->buffer.empty() && |
250 params->log->channels == 1) { | 257 params->log->channels == 1) { |
251 // TODO(amistry): Convert multi-channel preamble log into mono. | 258 // TODO(amistry): Convert multi-channel preamble log into mono. |
252 preamble = new content::SpeechRecognitionSessionPreamble(); | 259 preamble = new content::SpeechRecognitionSessionPreamble(); |
253 preamble->sample_rate = params->log->sample_rate; | 260 preamble->sample_rate = params->log->sample_rate; |
254 preamble->sample_depth = params->log->bytes_per_sample; | 261 preamble->sample_depth = params->log->bytes_per_sample; |
255 preamble->sample_data.swap(params->log->buffer); | 262 preamble->sample_data.swap(params->log->buffer); |
256 } | 263 } |
257 | 264 |
| 265 Profile* profile = Profile::FromBrowserContext(browser_context()); |
258 HotwordService* hotword_service = | 266 HotwordService* hotword_service = |
259 HotwordServiceFactory::GetForProfile(GetProfile()); | 267 HotwordServiceFactory::GetForProfile(profile); |
260 if (hotword_service) { | 268 if (hotword_service) { |
261 if (hotword_service->IsTraining()) { | 269 if (hotword_service->IsTraining()) { |
262 hotword_service->NotifyHotwordTriggered(); | 270 hotword_service->NotifyHotwordTriggered(); |
263 } else if (hotword_service->client()) { | 271 } else if (hotword_service->client()) { |
264 hotword_service->client()->OnHotwordRecognized(preamble); | 272 hotword_service->client()->OnHotwordRecognized(preamble); |
265 } else if (hotword_service->IsAlwaysOnEnabled()) { | 273 } else if (hotword_service->IsAlwaysOnEnabled()) { |
266 AppListService* app_list_service = AppListService::Get(); | 274 AppListService* app_list_service = AppListService::Get(); |
267 CHECK(app_list_service); | 275 CHECK(app_list_service); |
268 app_list_service->ShowForVoiceSearch(GetProfile(), preamble); | 276 app_list_service->ShowForVoiceSearch(profile, preamble); |
269 } | 277 } |
270 } | 278 } |
271 return true; | 279 |
| 280 return RespondNow(NoArguments()); |
272 } | 281 } |
273 | 282 |
274 bool HotwordPrivateGetLaunchStateFunction::RunSync() { | 283 ExtensionFunction::ResponseAction HotwordPrivateGetLaunchStateFunction::Run() { |
275 HotwordService* hotword_service = | 284 HotwordService* hotword_service = HotwordServiceFactory::GetForProfile( |
276 HotwordServiceFactory::GetForProfile(GetProfile()); | 285 Profile::FromBrowserContext(browser_context())); |
277 if (!hotword_service) { | 286 if (!hotword_service) { |
278 error_ = hotword_private_constants::kHotwordServiceUnavailable; | 287 return RespondNow( |
279 return false; | 288 Error(hotword_private_constants::kHotwordServiceUnavailable)); |
280 } | 289 } |
281 | 290 |
282 api::hotword_private::LaunchState result; | 291 api::hotword_private::LaunchState result; |
283 result.launch_mode = | 292 result.launch_mode = |
284 hotword_service->GetHotwordAudioVerificationLaunchMode(); | 293 hotword_service->GetHotwordAudioVerificationLaunchMode(); |
285 SetResult(result.ToValue()); | 294 return RespondNow(OneArgument(result.ToValue())); |
286 return true; | |
287 } | 295 } |
288 | 296 |
289 bool HotwordPrivateStartTrainingFunction::RunSync() { | 297 ExtensionFunction::ResponseAction HotwordPrivateStartTrainingFunction::Run() { |
290 HotwordService* hotword_service = | 298 HotwordService* hotword_service = HotwordServiceFactory::GetForProfile( |
291 HotwordServiceFactory::GetForProfile(GetProfile()); | 299 Profile::FromBrowserContext(browser_context())); |
292 if (!hotword_service) { | 300 if (!hotword_service) { |
293 error_ = hotword_private_constants::kHotwordServiceUnavailable; | 301 return RespondNow( |
294 return false; | 302 Error(hotword_private_constants::kHotwordServiceUnavailable)); |
295 } | 303 } |
296 | 304 |
297 hotword_service->StartTraining(); | 305 hotword_service->StartTraining(); |
298 return true; | 306 return RespondNow(NoArguments()); |
299 } | 307 } |
300 | 308 |
301 bool HotwordPrivateFinalizeSpeakerModelFunction::RunSync() { | 309 ExtensionFunction::ResponseAction |
302 HotwordService* hotword_service = | 310 HotwordPrivateFinalizeSpeakerModelFunction::Run() { |
303 HotwordServiceFactory::GetForProfile(GetProfile()); | 311 HotwordService* hotword_service = HotwordServiceFactory::GetForProfile( |
| 312 Profile::FromBrowserContext(browser_context())); |
304 if (!hotword_service) { | 313 if (!hotword_service) { |
305 error_ = hotword_private_constants::kHotwordServiceUnavailable; | 314 return RespondNow( |
306 return false; | 315 Error(hotword_private_constants::kHotwordServiceUnavailable)); |
307 } | 316 } |
308 | 317 |
309 hotword_service->FinalizeSpeakerModel(); | 318 hotword_service->FinalizeSpeakerModel(); |
310 return true; | 319 return RespondNow(NoArguments()); |
311 } | 320 } |
312 | 321 |
313 bool HotwordPrivateNotifySpeakerModelSavedFunction::RunSync() { | 322 ExtensionFunction::ResponseAction |
| 323 HotwordPrivateNotifySpeakerModelSavedFunction::Run() { |
314 HotwordPrivateEventService* event_service = | 324 HotwordPrivateEventService* event_service = |
315 BrowserContextKeyedAPIFactory<HotwordPrivateEventService>::Get( | 325 BrowserContextKeyedAPIFactory<HotwordPrivateEventService>::Get( |
316 GetProfile()); | 326 Profile::FromBrowserContext(browser_context())); |
317 if (!event_service) { | 327 if (!event_service) { |
318 error_ = hotword_private_constants::kHotwordEventServiceUnavailable; | 328 return RespondNow( |
319 return false; | 329 Error(hotword_private_constants::kHotwordEventServiceUnavailable)); |
320 } | 330 } |
321 | 331 |
322 event_service->OnSpeakerModelSaved(); | 332 event_service->OnSpeakerModelSaved(); |
323 return true; | 333 return RespondNow(NoArguments()); |
324 } | 334 } |
325 | 335 |
326 bool HotwordPrivateStopTrainingFunction::RunSync() { | 336 ExtensionFunction::ResponseAction HotwordPrivateStopTrainingFunction::Run() { |
327 HotwordService* hotword_service = | 337 HotwordService* hotword_service = HotwordServiceFactory::GetForProfile( |
328 HotwordServiceFactory::GetForProfile(GetProfile()); | 338 Profile::FromBrowserContext(browser_context())); |
329 if (!hotword_service) { | 339 if (!hotword_service) { |
330 error_ = hotword_private_constants::kHotwordServiceUnavailable; | 340 return RespondNow( |
331 return false; | 341 Error(hotword_private_constants::kHotwordServiceUnavailable)); |
332 } | 342 } |
333 | 343 |
334 hotword_service->StopTraining(); | 344 hotword_service->StopTraining(); |
335 return true; | 345 return RespondNow(NoArguments()); |
336 } | 346 } |
337 | 347 |
338 bool HotwordPrivateGetLocalizedStringsFunction::RunSync() { | 348 ExtensionFunction::ResponseAction |
| 349 HotwordPrivateGetLocalizedStringsFunction::Run() { |
339 #if defined(OS_CHROMEOS) | 350 #if defined(OS_CHROMEOS) |
340 base::string16 device_type = ash::GetChromeOSDeviceName(); | 351 base::string16 device_type = ash::GetChromeOSDeviceName(); |
341 #else | 352 #else |
342 base::string16 product_name = | 353 base::string16 product_name = |
343 l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME); | 354 l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME); |
344 base::string16 device_type = | 355 base::string16 device_type = |
345 l10n_util::GetStringFUTF16(IDS_HOTWORD_BROWSER_NAME, product_name); | 356 l10n_util::GetStringFUTF16(IDS_HOTWORD_BROWSER_NAME, product_name); |
346 #endif | 357 #endif |
347 | 358 |
348 std::unique_ptr<base::DictionaryValue> localized_strings( | 359 std::unique_ptr<base::DictionaryValue> localized_strings( |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
447 localized_strings->SetString( | 458 localized_strings->SetString( |
448 "finish", | 459 "finish", |
449 l10n_util::GetStringUTF16(IDS_HOTWORD_OPT_IN_FINISH)); | 460 l10n_util::GetStringUTF16(IDS_HOTWORD_OPT_IN_FINISH)); |
450 localized_strings->SetString( | 461 localized_strings->SetString( |
451 "finishedWait", | 462 "finishedWait", |
452 l10n_util::GetStringUTF16(IDS_HOTWORD_OPT_IN_FINISHED_WAIT)); | 463 l10n_util::GetStringUTF16(IDS_HOTWORD_OPT_IN_FINISHED_WAIT)); |
453 | 464 |
454 const std::string& app_locale = g_browser_process->GetApplicationLocale(); | 465 const std::string& app_locale = g_browser_process->GetApplicationLocale(); |
455 webui::SetLoadTimeDataDefaults(app_locale, localized_strings.get()); | 466 webui::SetLoadTimeDataDefaults(app_locale, localized_strings.get()); |
456 | 467 |
457 SetResult(std::move(localized_strings)); | 468 return RespondNow(OneArgument(std::move(localized_strings))); |
458 return true; | |
459 } | 469 } |
460 | 470 |
461 bool HotwordPrivateSetAudioHistoryEnabledFunction::RunAsync() { | 471 bool HotwordPrivateSetAudioHistoryEnabledFunction::RunAsync() { |
462 std::unique_ptr<api::hotword_private::SetAudioHistoryEnabled::Params> params( | 472 std::unique_ptr<api::hotword_private::SetAudioHistoryEnabled::Params> params( |
463 api::hotword_private::SetAudioHistoryEnabled::Params::Create(*args_)); | 473 api::hotword_private::SetAudioHistoryEnabled::Params::Create(*args_)); |
464 EXTENSION_FUNCTION_VALIDATE(params.get()); | 474 EXTENSION_FUNCTION_VALIDATE(params.get()); |
465 | 475 |
466 HotwordService* hotword_service = | 476 HotwordService* hotword_service = |
467 HotwordServiceFactory::GetForProfile(GetProfile()); | 477 HotwordServiceFactory::GetForProfile(GetProfile()); |
468 if (!hotword_service || !hotword_service->GetAudioHistoryHandler()) { | 478 if (!hotword_service || !hotword_service->GetAudioHistoryHandler()) { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 | 514 |
505 void HotwordPrivateGetAudioHistoryEnabledFunction::SetResultAndSendResponse( | 515 void HotwordPrivateGetAudioHistoryEnabledFunction::SetResultAndSendResponse( |
506 bool success, bool new_enabled_value) { | 516 bool success, bool new_enabled_value) { |
507 api::hotword_private::AudioHistoryState result; | 517 api::hotword_private::AudioHistoryState result; |
508 result.success = success; | 518 result.success = success; |
509 result.enabled = new_enabled_value; | 519 result.enabled = new_enabled_value; |
510 SetResult(result.ToValue()); | 520 SetResult(result.ToValue()); |
511 SendResponse(true); | 521 SendResponse(true); |
512 } | 522 } |
513 | 523 |
514 bool HotwordPrivateSpeakerModelExistsResultFunction::RunSync() { | 524 ExtensionFunction::ResponseAction |
| 525 HotwordPrivateSpeakerModelExistsResultFunction::Run() { |
515 std::unique_ptr<api::hotword_private::SpeakerModelExistsResult::Params> | 526 std::unique_ptr<api::hotword_private::SpeakerModelExistsResult::Params> |
516 params(api::hotword_private::SpeakerModelExistsResult::Params::Create( | 527 params(api::hotword_private::SpeakerModelExistsResult::Params::Create( |
517 *args_)); | 528 *args_)); |
518 EXTENSION_FUNCTION_VALIDATE(params.get()); | 529 EXTENSION_FUNCTION_VALIDATE(params.get()); |
519 | 530 |
520 HotwordService* hotword_service = | 531 HotwordService* hotword_service = HotwordServiceFactory::GetForProfile( |
521 HotwordServiceFactory::GetForProfile(GetProfile()); | 532 Profile::FromBrowserContext(browser_context())); |
522 if (!hotword_service) | 533 if (!hotword_service) |
523 return false; | 534 return RespondNow(Error(kUnknownErrorDoNotUse)); |
524 | 535 |
525 hotword_service->SpeakerModelExistsComplete(params->exists); | 536 hotword_service->SpeakerModelExistsComplete(params->exists); |
526 return true; | 537 return RespondNow(NoArguments()); |
527 } | 538 } |
528 | 539 |
529 } // namespace extensions | 540 } // namespace extensions |
OLD | NEW |