Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| (...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 294 | 294 |
| 295 bool ExtensionFunction::HasPermission() { | 295 bool ExtensionFunction::HasPermission() { |
| 296 Feature::Availability availability = | 296 Feature::Availability availability = |
| 297 ExtensionAPI::GetSharedInstance()->IsAvailable( | 297 ExtensionAPI::GetSharedInstance()->IsAvailable( |
| 298 name_, extension_.get(), source_context_type_, source_url()); | 298 name_, extension_.get(), source_context_type_, source_url()); |
| 299 return availability.is_available(); | 299 return availability.is_available(); |
| 300 } | 300 } |
| 301 | 301 |
| 302 void ExtensionFunction::OnQuotaExceeded(const std::string& violation_error) { | 302 void ExtensionFunction::OnQuotaExceeded(const std::string& violation_error) { |
| 303 error_ = violation_error; | 303 error_ = violation_error; |
| 304 SendResponse(false); | 304 SendResponseImpl(false); |
| 305 } | 305 } |
| 306 | 306 |
| 307 void ExtensionFunction::SetArgs(const base::ListValue* args) { | 307 void ExtensionFunction::SetArgs(const base::ListValue* args) { |
| 308 DCHECK(!args_.get()); // Should only be called once. | 308 DCHECK(!args_.get()); // Should only be called once. |
| 309 args_ = args->CreateDeepCopy(); | 309 args_ = args->CreateDeepCopy(); |
| 310 } | 310 } |
| 311 | 311 |
| 312 void ExtensionFunction::SetResult(std::unique_ptr<base::Value> result) { | 312 void ExtensionFunction::SetResult(std::unique_ptr<base::Value> result) { |
| 313 results_.reset(new base::ListValue()); | 313 results_.reset(new base::ListValue()); |
| 314 results_->Append(std::move(result)); | 314 results_->Append(std::move(result)); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 400 name(), "ErrorWithArguments", this, std::move(args), error)); | 400 name(), "ErrorWithArguments", this, std::move(args), error)); |
| 401 } | 401 } |
| 402 | 402 |
| 403 ExtensionFunction::ResponseValue ExtensionFunction::BadMessage() { | 403 ExtensionFunction::ResponseValue ExtensionFunction::BadMessage() { |
| 404 return ResponseValue(new BadMessageResponseValue(this)); | 404 return ResponseValue(new BadMessageResponseValue(this)); |
| 405 } | 405 } |
| 406 | 406 |
| 407 ExtensionFunction::ResponseAction ExtensionFunction::RespondNow( | 407 ExtensionFunction::ResponseAction ExtensionFunction::RespondNow( |
| 408 ResponseValue result) { | 408 ResponseValue result) { |
| 409 return ResponseAction(new RespondNowAction( | 409 return ResponseAction(new RespondNowAction( |
| 410 std::move(result), base::Bind(&ExtensionFunction::SendResponse, this))); | 410 std::move(result), |
| 411 base::Bind(&ExtensionFunction::SendResponseImpl, this))); | |
| 411 } | 412 } |
| 412 | 413 |
| 413 ExtensionFunction::ResponseAction ExtensionFunction::RespondLater() { | 414 ExtensionFunction::ResponseAction ExtensionFunction::RespondLater() { |
| 414 return ResponseAction(new RespondLaterAction()); | 415 return ResponseAction(new RespondLaterAction()); |
| 415 } | 416 } |
| 416 | 417 |
| 417 // static | 418 // static |
| 418 ExtensionFunction::ResponseAction ExtensionFunction::ValidationFailure( | 419 ExtensionFunction::ResponseAction ExtensionFunction::ValidationFailure( |
| 419 ExtensionFunction* function) { | 420 ExtensionFunction* function) { |
| 420 return function->RespondNow(function->BadMessage()); | 421 return function->RespondNow(function->BadMessage()); |
| 421 } | 422 } |
| 422 | 423 |
| 423 void ExtensionFunction::Respond(ResponseValue result) { | 424 void ExtensionFunction::Respond(ResponseValue result) { |
| 424 SendResponse(result->Apply()); | 425 SendResponseImpl(result->Apply()); |
| 425 } | 426 } |
| 426 | 427 |
| 427 bool ExtensionFunction::PreRunValidation(std::string* error) { | 428 bool ExtensionFunction::PreRunValidation(std::string* error) { |
| 428 return true; | 429 return true; |
| 429 } | 430 } |
| 430 | 431 |
| 431 ExtensionFunction::ResponseAction ExtensionFunction::RunWithValidation() { | 432 ExtensionFunction::ResponseAction ExtensionFunction::RunWithValidation() { |
| 432 std::string error; | 433 std::string error; |
| 433 if (!PreRunValidation(&error)) { | 434 if (!PreRunValidation(&error)) { |
| 434 DCHECK(!error.empty() || bad_message_); | 435 DCHECK(!error.empty() || bad_message_); |
| 435 return bad_message_ ? ValidationFailure(this) : RespondNow(Error(error)); | 436 return bad_message_ ? ValidationFailure(this) : RespondNow(Error(error)); |
| 436 } | 437 } |
| 437 return Run(); | 438 return Run(); |
| 438 } | 439 } |
| 439 | 440 |
| 440 bool ExtensionFunction::ShouldSkipQuotaLimiting() const { | 441 bool ExtensionFunction::ShouldSkipQuotaLimiting() const { |
| 441 return false; | 442 return false; |
| 442 } | 443 } |
| 443 | 444 |
| 444 bool ExtensionFunction::HasOptionalArgument(size_t index) { | 445 bool ExtensionFunction::HasOptionalArgument(size_t index) { |
| 445 base::Value* value; | 446 base::Value* value; |
| 446 return args_->Get(index, &value) && !value->IsType(base::Value::TYPE_NULL); | 447 return args_->Get(index, &value) && !value->IsType(base::Value::TYPE_NULL); |
| 447 } | 448 } |
| 448 | 449 |
| 449 void ExtensionFunction::SendResponseImpl(bool success) { | 450 void ExtensionFunction::SendResponseImpl(bool success) { |
| 450 DCHECK(!response_callback_.is_null()); | 451 DCHECK(!response_callback_.is_null()); |
| 452 DCHECK(!did_respond_) << name_; | |
| 453 did_respond_ = true; | |
| 451 | 454 |
| 452 ResponseType response = success ? SUCCEEDED : FAILED; | 455 ResponseType response = success ? SUCCEEDED : FAILED; |
| 453 if (bad_message_) { | 456 if (bad_message_) { |
| 454 response = BAD_MESSAGE; | 457 response = BAD_MESSAGE; |
| 455 LOG(ERROR) << "Bad extension message " << name_; | 458 LOG(ERROR) << "Bad extension message " << name_; |
| 456 } | 459 } |
| 457 response_type_ = base::MakeUnique<ResponseType>(response); | 460 response_type_ = base::MakeUnique<ResponseType>(response); |
| 458 | 461 |
| 459 // If results were never set, we send an empty argument list. | 462 // If results were never set, we send an empty argument list. |
| 460 if (!results_) | 463 if (!results_) |
| 461 results_.reset(new base::ListValue()); | 464 results_.reset(new base::ListValue()); |
| 462 | 465 |
| 463 response_callback_.Run(response, *results_, GetError(), histogram_value()); | 466 response_callback_.Run(response, *results_, GetError(), histogram_value()); |
| 464 LogUma(success, timer_.Elapsed(), histogram_value_); | 467 LogUma(success, timer_.Elapsed(), histogram_value_); |
| 468 | |
| 469 OnResponded(); | |
| 465 } | 470 } |
| 466 | 471 |
| 467 void ExtensionFunction::OnRespondingLater(ResponseValue value) { | 472 void ExtensionFunction::OnRespondingLater(ResponseValue value) { |
|
lazyboy
2016/09/20 20:21:33
Is OnRespondingLater used still? (I can't find any
Devlin
2016/09/20 21:51:04
Looks like no - good catch!
| |
| 468 SendResponse(value->Apply()); | 473 SendResponseImpl(value->Apply()); |
| 469 } | 474 } |
| 470 | 475 |
| 471 UIThreadExtensionFunction::UIThreadExtensionFunction() | 476 UIThreadExtensionFunction::UIThreadExtensionFunction() |
| 472 : context_(nullptr), | 477 : context_(nullptr), |
| 473 render_frame_host_(nullptr), | 478 render_frame_host_(nullptr), |
| 474 is_from_service_worker_(false) {} | 479 is_from_service_worker_(false) {} |
| 475 | 480 |
| 476 UIThreadExtensionFunction::~UIThreadExtensionFunction() { | 481 UIThreadExtensionFunction::~UIThreadExtensionFunction() { |
| 477 if (dispatcher() && render_frame_host()) | 482 if (dispatcher() && render_frame_host()) |
| 478 dispatcher()->OnExtensionFunctionCompleted(extension()); | 483 dispatcher()->OnExtensionFunctionCompleted(extension()); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 541 web_contents = dispatcher()->GetAssociatedWebContents(); | 546 web_contents = dispatcher()->GetAssociatedWebContents(); |
| 542 | 547 |
| 543 return web_contents; | 548 return web_contents; |
| 544 } | 549 } |
| 545 | 550 |
| 546 content::WebContents* UIThreadExtensionFunction::GetSenderWebContents() { | 551 content::WebContents* UIThreadExtensionFunction::GetSenderWebContents() { |
| 547 return render_frame_host_ ? | 552 return render_frame_host_ ? |
| 548 content::WebContents::FromRenderFrameHost(render_frame_host_) : nullptr; | 553 content::WebContents::FromRenderFrameHost(render_frame_host_) : nullptr; |
| 549 } | 554 } |
| 550 | 555 |
| 551 void UIThreadExtensionFunction::SendResponse(bool success) { | 556 void UIThreadExtensionFunction::OnResponded() { |
| 552 DCHECK(!did_respond_) << name_; | |
| 553 did_respond_ = true; | |
| 554 SendResponseImpl(success); | |
| 555 | |
| 556 if (!transferred_blob_uuids_.empty()) { | 557 if (!transferred_blob_uuids_.empty()) { |
| 557 render_frame_host_->Send( | 558 render_frame_host_->Send( |
| 558 new ExtensionMsg_TransferBlobs(transferred_blob_uuids_)); | 559 new ExtensionMsg_TransferBlobs(transferred_blob_uuids_)); |
| 559 } | 560 } |
| 560 } | 561 } |
| 561 | 562 |
| 562 void UIThreadExtensionFunction::SetTransferredBlobUUIDs( | 563 void UIThreadExtensionFunction::SetTransferredBlobUUIDs( |
| 563 const std::vector<std::string>& blob_uuids) { | 564 const std::vector<std::string>& blob_uuids) { |
| 564 DCHECK(transferred_blob_uuids_.empty()); // Should only be called once. | 565 DCHECK(transferred_blob_uuids_.empty()); // Should only be called once. |
| 565 transferred_blob_uuids_ = blob_uuids; | 566 transferred_blob_uuids_ = blob_uuids; |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 583 | 584 |
| 584 IOThreadExtensionFunction* | 585 IOThreadExtensionFunction* |
| 585 IOThreadExtensionFunction::AsIOThreadExtensionFunction() { | 586 IOThreadExtensionFunction::AsIOThreadExtensionFunction() { |
| 586 return this; | 587 return this; |
| 587 } | 588 } |
| 588 | 589 |
| 589 void IOThreadExtensionFunction::Destruct() const { | 590 void IOThreadExtensionFunction::Destruct() const { |
| 590 BrowserThread::DeleteOnIOThread::Destruct(this); | 591 BrowserThread::DeleteOnIOThread::Destruct(this); |
| 591 } | 592 } |
| 592 | 593 |
| 593 void IOThreadExtensionFunction::SendResponse(bool success) { | |
| 594 DCHECK(!did_respond_) << name_; | |
| 595 did_respond_ = true; | |
| 596 SendResponseImpl(success); | |
| 597 } | |
| 598 | |
| 599 AsyncExtensionFunction::AsyncExtensionFunction() { | 594 AsyncExtensionFunction::AsyncExtensionFunction() { |
| 600 } | 595 } |
| 601 | 596 |
| 602 AsyncExtensionFunction::~AsyncExtensionFunction() { | 597 AsyncExtensionFunction::~AsyncExtensionFunction() { |
| 603 } | 598 } |
| 604 | 599 |
| 605 ExtensionFunction::ScopedUserGestureForTests::ScopedUserGestureForTests() { | 600 ExtensionFunction::ScopedUserGestureForTests::ScopedUserGestureForTests() { |
| 606 UserGestureForTests::GetInstance()->IncrementCount(); | 601 UserGestureForTests::GetInstance()->IncrementCount(); |
| 607 } | 602 } |
| 608 | 603 |
| 609 ExtensionFunction::ScopedUserGestureForTests::~ScopedUserGestureForTests() { | 604 ExtensionFunction::ScopedUserGestureForTests::~ScopedUserGestureForTests() { |
| 610 UserGestureForTests::GetInstance()->DecrementCount(); | 605 UserGestureForTests::GetInstance()->DecrementCount(); |
| 611 } | 606 } |
| 612 | 607 |
| 613 ExtensionFunction::ResponseAction AsyncExtensionFunction::Run() { | 608 ExtensionFunction::ResponseAction AsyncExtensionFunction::Run() { |
| 614 return RunAsync() ? RespondLater() : RespondNow(Error(error_)); | 609 return RunAsync() ? RespondLater() : RespondNow(Error(error_)); |
| 615 } | 610 } |
| 616 | 611 |
| 617 // static | 612 // static |
| 618 bool AsyncExtensionFunction::ValidationFailure( | 613 bool AsyncExtensionFunction::ValidationFailure( |
| 619 AsyncExtensionFunction* function) { | 614 AsyncExtensionFunction* function) { |
| 620 return false; | 615 return false; |
| 621 } | 616 } |
| 617 | |
| 618 void AsyncExtensionFunction::SendResponse(bool success) { | |
| 619 Respond(success ? ArgumentList(std::move(results_)) : Error(error_)); | |
| 620 } | |
| OLD | NEW |