Index: extensions/renderer/api_binding_hooks.cc |
diff --git a/extensions/renderer/api_binding_hooks.cc b/extensions/renderer/api_binding_hooks.cc |
index 9d479b431636e99c2b8fc65274cbc2fd4076ba42..b4c93ab9eb42654c3cfc4f8f5cd22c0bcba54dcc 100644 |
--- a/extensions/renderer/api_binding_hooks.cc |
+++ b/extensions/renderer/api_binding_hooks.cc |
@@ -187,13 +187,14 @@ APIBindingHooks::RequestResult APIBindingHooks::HandleRequest( |
v8::Local<v8::Context> context, |
const APISignature* signature, |
std::vector<v8::Local<v8::Value>>* arguments, |
- const ArgumentSpec::RefMap& type_refs) { |
+ const ArgumentSpec::RefMap& type_refs, |
+ v8::Local<v8::Value>* return_value) { |
// Easy case: a native custom hook. |
auto request_hooks_iter = request_hooks_.find(method_name); |
if (request_hooks_iter != request_hooks_.end()) { |
RequestResult result = |
request_hooks_iter->second.Run( |
- signature, context, arguments, type_refs); |
+ signature, context, arguments, type_refs, return_value); |
// Right now, it doesn't make sense to register a request handler that |
// doesn't handle the request. |
DCHECK_NE(RequestResult::NOT_HANDLED, result); |
@@ -244,8 +245,15 @@ APIBindingHooks::RequestResult APIBindingHooks::HandleRequest( |
if (!success) |
return RequestResult::INVALID_INVOCATION; |
- run_js_.Run(handle_request, context, parsed_v8_args.size(), |
- parsed_v8_args.data()); |
+ v8::Global<v8::Value> global_result = |
+ run_js_.Run(handle_request, context, parsed_v8_args.size(), |
+ parsed_v8_args.data()); |
+ if (try_catch.HasCaught()) { |
+ try_catch.ReThrow(); |
+ return RequestResult::THROWN; |
+ } |
+ if (!global_result.IsEmpty()) |
+ *return_value = global_result.Get(isolate); |
return RequestResult::HANDLED; |
} |