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

Side by Side Diff: extensions/browser/extension_function.cc

Issue 257333002: Drive extension functions from ExtensionFunction::Run. The (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix comment Created 6 years, 7 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/extension_function.h" 5 #include "extensions/browser/extension_function.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "content/public/browser/notification_source.h" 8 #include "content/public/browser/notification_source.h"
9 #include "content/public/browser/notification_types.h" 9 #include "content/public/browser/notification_types.h"
10 #include "content/public/browser/render_frame_host.h" 10 #include "content/public/browser/render_frame_host.h"
(...skipping 16 matching lines...) Expand all
27 class MultipleArgumentsResponseValue 27 class MultipleArgumentsResponseValue
28 : public ExtensionFunction::ResponseValueObject { 28 : public ExtensionFunction::ResponseValueObject {
29 public: 29 public:
30 MultipleArgumentsResponseValue(ExtensionFunction* function, 30 MultipleArgumentsResponseValue(ExtensionFunction* function,
31 base::ListValue* result) { 31 base::ListValue* result) {
32 if (function->GetResultList()) { 32 if (function->GetResultList()) {
33 DCHECK_EQ(function->GetResultList(), result); 33 DCHECK_EQ(function->GetResultList(), result);
34 } else { 34 } else {
35 function->SetResultList(make_scoped_ptr(result)); 35 function->SetResultList(make_scoped_ptr(result));
36 } 36 }
37 DCHECK_EQ("", function->GetError()); 37 // It would be nice to DCHECK(error.empty()) but some legacy extension
38 // function implementations... I'm looking at chrome.input.ime... do this
39 // for some reason.
38 } 40 }
39 41
40 virtual ~MultipleArgumentsResponseValue() {} 42 virtual ~MultipleArgumentsResponseValue() {}
41 43
42 virtual bool Apply() OVERRIDE { return true; } 44 virtual bool Apply() OVERRIDE { return true; }
43 }; 45 };
44 46
45 class ErrorResponseValue : public ExtensionFunction::ResponseValueObject { 47 class ErrorResponseValue : public ExtensionFunction::ResponseValueObject {
46 public: 48 public:
47 ErrorResponseValue(ExtensionFunction* function, const std::string& error) { 49 ErrorResponseValue(ExtensionFunction* function, const std::string& error) {
48 DCHECK_NE("", error); 50 // It would be nice to DCHECK(!error.empty()) but too many legacy extension
51 // function implementations don't set error but signal failure.
49 function->SetError(error); 52 function->SetError(error);
50 } 53 }
51 54
52 virtual ~ErrorResponseValue() {} 55 virtual ~ErrorResponseValue() {}
53 56
54 virtual bool Apply() OVERRIDE { return false; } 57 virtual bool Apply() OVERRIDE { return false; }
55 }; 58 };
56 59
57 class BadMessageResponseValue : public ExtensionFunction::ResponseValueObject { 60 class BadMessageResponseValue : public ExtensionFunction::ResponseValueObject {
58 public: 61 public:
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 ExtensionFunction::ResponseAction ExtensionFunction::RespondNow( 228 ExtensionFunction::ResponseAction ExtensionFunction::RespondNow(
226 ResponseValue result) { 229 ResponseValue result) {
227 return scoped_ptr<ResponseActionObject>(new RespondNowAction( 230 return scoped_ptr<ResponseActionObject>(new RespondNowAction(
228 result.Pass(), base::Bind(&ExtensionFunction::SendResponse, this))); 231 result.Pass(), base::Bind(&ExtensionFunction::SendResponse, this)));
229 } 232 }
230 233
231 ExtensionFunction::ResponseAction ExtensionFunction::RespondLater() { 234 ExtensionFunction::ResponseAction ExtensionFunction::RespondLater() {
232 return scoped_ptr<ResponseActionObject>(new RespondLaterAction()); 235 return scoped_ptr<ResponseActionObject>(new RespondLaterAction());
233 } 236 }
234 237
235 void ExtensionFunction::Run() { 238 void ExtensionFunction::Respond(ResponseValue result) {
236 if (!RunImpl()) 239 SendResponse(result->Apply());
237 SendResponse(false);
238 }
239
240 bool ExtensionFunction::RunImpl() {
241 RunImplTypesafe()->Execute();
242 return true;
243 }
244
245 ExtensionFunction::ResponseAction ExtensionFunction::RunImplTypesafe() {
246 NOTREACHED()
247 << "ExtensionFunctions must override either RunImpl or RunImplTypesafe";
248 return RespondNow(NoArguments());
249 }
250
251 void ExtensionFunction::SendResponseTypesafe(ResponseValue response) {
252 SendResponse(response->Apply());
253 } 240 }
254 241
255 bool ExtensionFunction::ShouldSkipQuotaLimiting() const { 242 bool ExtensionFunction::ShouldSkipQuotaLimiting() const {
256 return false; 243 return false;
257 } 244 }
258 245
259 bool ExtensionFunction::HasOptionalArgument(size_t index) { 246 bool ExtensionFunction::HasOptionalArgument(size_t index) {
260 base::Value* value; 247 base::Value* value;
261 return args_->Get(index, &value) && !value->IsType(base::Value::TYPE_NULL); 248 return args_->Get(index, &value) && !value->IsType(base::Value::TYPE_NULL);
262 } 249 }
263 250
264 void ExtensionFunction::SendResponseImpl(bool success) { 251 void ExtensionFunction::SendResponseImpl(bool success) {
265 DCHECK(!response_callback_.is_null()); 252 DCHECK(!response_callback_.is_null());
266 253
267 ResponseType type = success ? SUCCEEDED : FAILED; 254 ResponseType type = success ? SUCCEEDED : FAILED;
268 if (bad_message_) { 255 if (bad_message_) {
269 type = BAD_MESSAGE; 256 type = BAD_MESSAGE;
270 LOG(ERROR) << "Bad extension message " << name_; 257 LOG(ERROR) << "Bad extension message " << name_;
271 } 258 }
272 259
273 // If results were never set, we send an empty argument list. 260 // If results were never set, we send an empty argument list.
274 if (!results_) 261 if (!results_)
275 results_.reset(new base::ListValue()); 262 results_.reset(new base::ListValue());
276 263
277 response_callback_.Run(type, *results_, GetError()); 264 response_callback_.Run(type, *results_, GetError());
278 } 265 }
279 266
267 void ExtensionFunction::OnRespondingLater(ResponseValue value) {
268 SendResponse(value->Apply());
269 }
270
280 UIThreadExtensionFunction::UIThreadExtensionFunction() 271 UIThreadExtensionFunction::UIThreadExtensionFunction()
281 : render_view_host_(NULL), 272 : render_view_host_(NULL),
282 render_frame_host_(NULL), 273 render_frame_host_(NULL),
283 context_(NULL), 274 context_(NULL),
284 delegate_(NULL) { 275 delegate_(NULL) {
285 } 276 }
286 277
287 UIThreadExtensionFunction::~UIThreadExtensionFunction() { 278 UIThreadExtensionFunction::~UIThreadExtensionFunction() {
288 if (dispatcher() && render_view_host()) 279 if (dispatcher() && render_view_host())
289 dispatcher()->OnExtensionFunctionCompleted(GetExtension()); 280 dispatcher()->OnExtensionFunctionCompleted(GetExtension());
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 void IOThreadExtensionFunction::SendResponse(bool success) { 353 void IOThreadExtensionFunction::SendResponse(bool success) {
363 SendResponseImpl(success); 354 SendResponseImpl(success);
364 } 355 }
365 356
366 AsyncExtensionFunction::AsyncExtensionFunction() { 357 AsyncExtensionFunction::AsyncExtensionFunction() {
367 } 358 }
368 359
369 AsyncExtensionFunction::~AsyncExtensionFunction() { 360 AsyncExtensionFunction::~AsyncExtensionFunction() {
370 } 361 }
371 362
363 ExtensionFunction::ResponseAction AsyncExtensionFunction::Run() {
364 return RunAsync() ? RespondLater() : RespondNow(Error(error_));
365 }
366
372 SyncExtensionFunction::SyncExtensionFunction() { 367 SyncExtensionFunction::SyncExtensionFunction() {
373 } 368 }
374 369
375 SyncExtensionFunction::~SyncExtensionFunction() { 370 SyncExtensionFunction::~SyncExtensionFunction() {
376 } 371 }
377 372
378 bool SyncExtensionFunction::RunImpl() { 373 ExtensionFunction::ResponseAction SyncExtensionFunction::Run() {
379 SendResponse(RunSync()); 374 return RespondNow(RunSync() ? MultipleArguments(results_.get())
380 return true; 375 : Error(error_));
381 } 376 }
382 377
383 SyncIOThreadExtensionFunction::SyncIOThreadExtensionFunction() { 378 SyncIOThreadExtensionFunction::SyncIOThreadExtensionFunction() {
384 } 379 }
385 380
386 SyncIOThreadExtensionFunction::~SyncIOThreadExtensionFunction() { 381 SyncIOThreadExtensionFunction::~SyncIOThreadExtensionFunction() {
387 } 382 }
388 383
389 bool SyncIOThreadExtensionFunction::RunImpl() { 384 ExtensionFunction::ResponseAction SyncIOThreadExtensionFunction::Run() {
390 SendResponse(RunSync()); 385 return RespondNow(RunSync() ? MultipleArguments(results_.get())
391 return true; 386 : Error(error_));
392 } 387 }
OLDNEW
« no previous file with comments | « extensions/browser/extension_function.h ('k') | extensions/browser/extension_function_dispatcher.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698