| Index: extensions/renderer/api_request_handler.cc
|
| diff --git a/extensions/renderer/api_request_handler.cc b/extensions/renderer/api_request_handler.cc
|
| index ef360c87cc226488ecb78c6fc4cbb9124fa4994b..a55d71429aad3e7bddbe2d776de5a1a50dca573d 100644
|
| --- a/extensions/renderer/api_request_handler.cc
|
| +++ b/extensions/renderer/api_request_handler.cc
|
| @@ -36,8 +36,9 @@ APIRequestHandler::PendingRequest::PendingRequest(PendingRequest&&) = default;
|
| APIRequestHandler::PendingRequest& APIRequestHandler::PendingRequest::operator=(
|
| PendingRequest&&) = default;
|
|
|
| -APIRequestHandler::APIRequestHandler(const CallJSFunction& call_js)
|
| - : call_js_(call_js) {}
|
| +APIRequestHandler::APIRequestHandler(const CallJSFunction& call_js,
|
| + APILastError last_error)
|
| + : call_js_(call_js), last_error_(std::move(last_error)) {}
|
|
|
| APIRequestHandler::~APIRequestHandler() {}
|
|
|
| @@ -57,7 +58,8 @@ int APIRequestHandler::AddPendingRequest(
|
| }
|
|
|
| void APIRequestHandler::CompleteRequest(int request_id,
|
| - const base::ListValue& response_args) {
|
| + const base::ListValue& response_args,
|
| + const std::string& error) {
|
| auto iter = pending_requests_.find(request_id);
|
| // The request may have been removed if the context was invalidated before a
|
| // response is ready.
|
| @@ -70,6 +72,7 @@ void APIRequestHandler::CompleteRequest(int request_id,
|
| v8::Isolate* isolate = pending_request.isolate;
|
| v8::HandleScope handle_scope(isolate);
|
| v8::Local<v8::Context> context = pending_request.context.Get(isolate);
|
| + v8::Context::Scope context_scope(context);
|
| std::unique_ptr<content::V8ValueConverter> converter(
|
| content::V8ValueConverter::create());
|
| std::vector<v8::Local<v8::Value>> args;
|
| @@ -81,10 +84,16 @@ void APIRequestHandler::CompleteRequest(int request_id,
|
| args.push_back(converter->ToV8Value(arg.get(), context));
|
|
|
| blink::WebScopedUserGesture user_gesture(pending_request.user_gesture_token);
|
| + if (!error.empty())
|
| + last_error_.SetError(context, error);
|
| +
|
| // args.size() is converted to int, but args is controlled by chrome and is
|
| // never close to std::numeric_limits<int>::max.
|
| call_js_.Run(pending_request.callback.Get(isolate), context, args.size(),
|
| args.data());
|
| +
|
| + if (!error.empty())
|
| + last_error_.ClearError(context, true);
|
| }
|
|
|
| void APIRequestHandler::InvalidateContext(v8::Local<v8::Context> context) {
|
|
|