Index: extensions/browser/extension_function.cc |
diff --git a/extensions/browser/extension_function.cc b/extensions/browser/extension_function.cc |
index 7216a9ef0c79b38a2212baca7809bc95ba653c1e..d47493e814ff5dbe8000bea2ff868bc5a2ddc1eb 100644 |
--- a/extensions/browser/extension_function.cc |
+++ b/extensions/browser/extension_function.cc |
@@ -79,21 +79,9 @@ void LogUma(bool success, |
class ArgumentListResponseValue |
: public ExtensionFunction::ResponseValueObject { |
public: |
- ArgumentListResponseValue(const std::string& function_name, |
- const char* title, |
- ExtensionFunction* function, |
- std::unique_ptr<base::ListValue> result) |
- : function_name_(function_name), title_(title) { |
- if (function->GetResultList()) { |
- DCHECK_EQ(function->GetResultList(), result.get()) |
- << "The result set on this function (" << function_name_ << ") " |
- << "either by calling SetResult() or directly modifying |result_| is " |
- << "different to the one passed to " << title_ << "(). " |
- << "The best way to fix this problem is to exclusively use " << title_ |
- << "(). SetResult() and |result_| are deprecated."; |
- } else { |
- function->SetResultList(std::move(result)); |
- } |
+ ArgumentListResponseValue(ExtensionFunction* function, |
+ std::unique_ptr<base::ListValue> result) { |
+ SetFunctionResults(function, std::move(result)); |
// It would be nice to DCHECK(error.empty()) but some legacy extension |
// function implementations... I'm looking at chrome.input.ime... do this |
// for some reason. |
@@ -102,24 +90,15 @@ class ArgumentListResponseValue |
~ArgumentListResponseValue() override {} |
bool Apply() override { return true; } |
- |
- private: |
- std::string function_name_; |
- const char* title_; |
}; |
class ErrorWithArgumentsResponseValue : public ArgumentListResponseValue { |
public: |
- ErrorWithArgumentsResponseValue(const std::string& function_name, |
- const char* title, |
- ExtensionFunction* function, |
+ ErrorWithArgumentsResponseValue(ExtensionFunction* function, |
std::unique_ptr<base::ListValue> result, |
const std::string& error) |
- : ArgumentListResponseValue(function_name, |
- title, |
- function, |
- std::move(result)) { |
- function->SetError(error); |
+ : ArgumentListResponseValue(function, std::move(result)) { |
+ SetFunctionError(function, error); |
} |
~ErrorWithArgumentsResponseValue() override {} |
@@ -132,7 +111,7 @@ class ErrorResponseValue : public ExtensionFunction::ResponseValueObject { |
ErrorResponseValue(ExtensionFunction* function, const std::string& error) { |
// It would be nice to DCHECK(!error.empty()) but too many legacy extension |
// function implementations don't set error but signal failure. |
- function->SetError(error); |
+ SetFunctionError(function, error); |
} |
~ErrorResponseValue() override {} |
@@ -221,6 +200,22 @@ void UserGestureForTests::DecrementCount() { |
} // namespace |
+void ExtensionFunction::ResponseValueObject::SetFunctionResults( |
+ ExtensionFunction* function, |
+ std::unique_ptr<base::ListValue> results) { |
+ DCHECK(!function->results_) << "Function " << function->name_ |
+ << "already has results set."; |
+ function->results_ = std::move(results); |
+} |
+ |
+void ExtensionFunction::ResponseValueObject::SetFunctionError( |
+ ExtensionFunction* function, |
+ const std::string& error) { |
+ DCHECK(function->error_.empty()) << "Function " << function->name_ |
+ << "already has an error."; |
+ function->error_ = error; |
+} |
+ |
// static |
bool ExtensionFunction::ignore_all_did_respond_for_testing_do_not_use = false; |
@@ -309,21 +304,11 @@ void ExtensionFunction::SetArgs(const base::ListValue* args) { |
args_ = args->CreateDeepCopy(); |
} |
-void ExtensionFunction::SetResult(std::unique_ptr<base::Value> result) { |
- results_.reset(new base::ListValue()); |
- results_->Append(std::move(result)); |
-} |
- |
-void ExtensionFunction::SetResultList( |
- std::unique_ptr<base::ListValue> results) { |
- results_ = std::move(results); |
-} |
- |
const base::ListValue* ExtensionFunction::GetResultList() const { |
return results_.get(); |
} |
-std::string ExtensionFunction::GetError() const { |
+const std::string& ExtensionFunction::GetError() const { |
return error_; |
} |
@@ -336,16 +321,15 @@ bool ExtensionFunction::user_gesture() const { |
} |
ExtensionFunction::ResponseValue ExtensionFunction::NoArguments() { |
- return ResponseValue(new ArgumentListResponseValue( |
- name(), "NoArguments", this, base::MakeUnique<base::ListValue>())); |
+ return ResponseValue( |
+ new ArgumentListResponseValue(this, base::MakeUnique<base::ListValue>())); |
} |
ExtensionFunction::ResponseValue ExtensionFunction::OneArgument( |
std::unique_ptr<base::Value> arg) { |
std::unique_ptr<base::ListValue> args(new base::ListValue()); |
args->Append(std::move(arg)); |
- return ResponseValue(new ArgumentListResponseValue(name(), "OneArgument", |
- this, std::move(args))); |
+ return ResponseValue(new ArgumentListResponseValue(this, std::move(args))); |
} |
ExtensionFunction::ResponseValue ExtensionFunction::TwoArguments( |
@@ -354,14 +338,12 @@ ExtensionFunction::ResponseValue ExtensionFunction::TwoArguments( |
std::unique_ptr<base::ListValue> args(new base::ListValue()); |
args->Append(std::move(arg1)); |
args->Append(std::move(arg2)); |
- return ResponseValue(new ArgumentListResponseValue(name(), "TwoArguments", |
- this, std::move(args))); |
+ return ResponseValue(new ArgumentListResponseValue(this, std::move(args))); |
} |
ExtensionFunction::ResponseValue ExtensionFunction::ArgumentList( |
std::unique_ptr<base::ListValue> args) { |
- return ResponseValue(new ArgumentListResponseValue(name(), "ArgumentList", |
- this, std::move(args))); |
+ return ResponseValue(new ArgumentListResponseValue(this, std::move(args))); |
} |
ExtensionFunction::ResponseValue ExtensionFunction::Error( |
@@ -396,8 +378,8 @@ ExtensionFunction::ResponseValue ExtensionFunction::Error( |
ExtensionFunction::ResponseValue ExtensionFunction::ErrorWithArguments( |
std::unique_ptr<base::ListValue> args, |
const std::string& error) { |
- return ResponseValue(new ErrorWithArgumentsResponseValue( |
- name(), "ErrorWithArguments", this, std::move(args), error)); |
+ return ResponseValue( |
+ new ErrorWithArgumentsResponseValue(this, std::move(args), error)); |
} |
ExtensionFunction::ResponseValue ExtensionFunction::BadMessage() { |
@@ -484,9 +466,9 @@ UIThreadExtensionFunction::~UIThreadExtensionFunction() { |
// tricky because checking IsShuttingDown has to be called from the UI thread. |
extensions::ExtensionsBrowserClient* browser_client = |
extensions::ExtensionsBrowserClient::Get(); |
- DCHECK(!browser_client || browser_client->IsShuttingDown() || did_respond_ || |
+ DCHECK(!browser_client || browser_client->IsShuttingDown() || did_respond() || |
ignore_all_did_respond_for_testing_do_not_use) |
- << name_; |
+ << name(); |
} |
UIThreadExtensionFunction* |
@@ -590,9 +572,27 @@ void IOThreadExtensionFunction::Destruct() const { |
AsyncExtensionFunction::AsyncExtensionFunction() { |
} |
+void AsyncExtensionFunction::SetError(const std::string& error) { |
+ error_ = error; |
+} |
+ |
+const std::string& AsyncExtensionFunction::GetError() const { |
+ return error_.empty() ? UIThreadExtensionFunction::GetError() : error_; |
+} |
+ |
AsyncExtensionFunction::~AsyncExtensionFunction() { |
} |
+void AsyncExtensionFunction::SetResult(std::unique_ptr<base::Value> result) { |
+ results_.reset(new base::ListValue()); |
+ results_->Append(std::move(result)); |
+} |
+ |
+void AsyncExtensionFunction::SetResultList( |
+ std::unique_ptr<base::ListValue> results) { |
+ results_ = std::move(results); |
+} |
+ |
ExtensionFunction::ScopedUserGestureForTests::ScopedUserGestureForTests() { |
UserGestureForTests::GetInstance()->IncrementCount(); |
} |
@@ -602,7 +602,10 @@ ExtensionFunction::ScopedUserGestureForTests::~ScopedUserGestureForTests() { |
} |
ExtensionFunction::ResponseAction AsyncExtensionFunction::Run() { |
- return RunAsync() ? RespondLater() : RespondNow(Error(error_)); |
+ if (RunAsync()) |
+ return RespondLater(); |
+ DCHECK(!results_); |
+ return RespondNow(Error(error_)); |
} |
// static |
@@ -612,5 +615,12 @@ bool AsyncExtensionFunction::ValidationFailure( |
} |
void AsyncExtensionFunction::SendResponse(bool success) { |
- Respond(success ? ArgumentList(std::move(results_)) : Error(error_)); |
+ ResponseValue response; |
+ if (success) { |
+ response = ArgumentList(std::move(results_)); |
+ } else { |
+ response = results_ ? ErrorWithArguments(std::move(results_), error_) |
+ : Error(error_); |
+ } |
+ Respond(std::move(response)); |
} |