Index: extensions/renderer/api_request_handler.cc |
diff --git a/extensions/renderer/api_request_handler.cc b/extensions/renderer/api_request_handler.cc |
index 5319aa00df2a951af99ae4afefbd015e11302d69..e30eaba15ac426488c707e0431c8e1faf7ab1bd5 100644 |
--- a/extensions/renderer/api_request_handler.cc |
+++ b/extensions/renderer/api_request_handler.cc |
@@ -30,8 +30,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() {} |
@@ -51,7 +52,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. |
@@ -64,6 +66,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; |
@@ -74,10 +77,16 @@ void APIRequestHandler::CompleteRequest(int request_id, |
for (const auto& arg : response_args) |
args.push_back(converter->ToV8Value(arg.get(), context)); |
+ 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) { |