| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/renderer/api_binding_hooks.h" | 5 #include "extensions/renderer/api_binding_hooks.h" |
| 6 | 6 |
| 7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
| 8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
| 9 #include "base/supports_user_data.h" | 9 #include "base/supports_user_data.h" |
| 10 #include "extensions/renderer/api_signature.h" | 10 #include "extensions/renderer/api_signature.h" |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 180 js_hooks_source_ = std::move(source); | 180 js_hooks_source_ = std::move(source); |
| 181 js_resource_name_ = std::move(resource_name); | 181 js_resource_name_ = std::move(resource_name); |
| 182 } | 182 } |
| 183 | 183 |
| 184 APIBindingHooks::RequestResult APIBindingHooks::HandleRequest( | 184 APIBindingHooks::RequestResult APIBindingHooks::HandleRequest( |
| 185 const std::string& api_name, | 185 const std::string& api_name, |
| 186 const std::string& method_name, | 186 const std::string& method_name, |
| 187 v8::Local<v8::Context> context, | 187 v8::Local<v8::Context> context, |
| 188 const APISignature* signature, | 188 const APISignature* signature, |
| 189 std::vector<v8::Local<v8::Value>>* arguments, | 189 std::vector<v8::Local<v8::Value>>* arguments, |
| 190 const ArgumentSpec::RefMap& type_refs) { | 190 const ArgumentSpec::RefMap& type_refs, |
| 191 v8::Local<v8::Value>* return_value) { |
| 191 // Easy case: a native custom hook. | 192 // Easy case: a native custom hook. |
| 192 auto request_hooks_iter = request_hooks_.find(method_name); | 193 auto request_hooks_iter = request_hooks_.find(method_name); |
| 193 if (request_hooks_iter != request_hooks_.end()) { | 194 if (request_hooks_iter != request_hooks_.end()) { |
| 194 RequestResult result = | 195 RequestResult result = |
| 195 request_hooks_iter->second.Run( | 196 request_hooks_iter->second.Run( |
| 196 signature, context, arguments, type_refs); | 197 signature, context, arguments, type_refs, return_value); |
| 197 // Right now, it doesn't make sense to register a request handler that | 198 // Right now, it doesn't make sense to register a request handler that |
| 198 // doesn't handle the request. | 199 // doesn't handle the request. |
| 199 DCHECK_NE(RequestResult::NOT_HANDLED, result); | 200 DCHECK_NE(RequestResult::NOT_HANDLED, result); |
| 200 return result; | 201 return result; |
| 201 } | 202 } |
| 202 | 203 |
| 203 // Harder case: looking up a custom hook registered on the context (since | 204 // Harder case: looking up a custom hook registered on the context (since |
| 204 // these are JS, each context has a separate instance). | 205 // these are JS, each context has a separate instance). |
| 205 v8::Local<v8::Object> hook_interface_object = | 206 v8::Local<v8::Object> hook_interface_object = |
| 206 GetJSHookInterfaceObject(api_name, context, false); | 207 GetJSHookInterfaceObject(api_name, context, false); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 237 std::string error; | 238 std::string error; |
| 238 bool success = signature->ParseArgumentsToV8(context, *arguments, type_refs, | 239 bool success = signature->ParseArgumentsToV8(context, *arguments, type_refs, |
| 239 &parsed_v8_args, &error); | 240 &parsed_v8_args, &error); |
| 240 if (try_catch.HasCaught()) { | 241 if (try_catch.HasCaught()) { |
| 241 try_catch.ReThrow(); | 242 try_catch.ReThrow(); |
| 242 return RequestResult::THROWN; | 243 return RequestResult::THROWN; |
| 243 } | 244 } |
| 244 if (!success) | 245 if (!success) |
| 245 return RequestResult::INVALID_INVOCATION; | 246 return RequestResult::INVALID_INVOCATION; |
| 246 | 247 |
| 247 run_js_.Run(handle_request, context, parsed_v8_args.size(), | 248 v8::Global<v8::Value> global_result = |
| 248 parsed_v8_args.data()); | 249 run_js_.Run(handle_request, context, parsed_v8_args.size(), |
| 250 parsed_v8_args.data()); |
| 251 if (try_catch.HasCaught()) { |
| 252 try_catch.ReThrow(); |
| 253 return RequestResult::THROWN; |
| 254 } |
| 255 if (!global_result.IsEmpty()) |
| 256 *return_value = global_result.Get(isolate); |
| 249 return RequestResult::HANDLED; | 257 return RequestResult::HANDLED; |
| 250 } | 258 } |
| 251 | 259 |
| 252 return RequestResult::NOT_HANDLED; | 260 return RequestResult::NOT_HANDLED; |
| 253 } | 261 } |
| 254 | 262 |
| 255 void APIBindingHooks::InitializeInContext( | 263 void APIBindingHooks::InitializeInContext( |
| 256 v8::Local<v8::Context> context, | 264 v8::Local<v8::Context> context, |
| 257 const std::string& api_name) { | 265 const std::string& api_name) { |
| 258 if (js_hooks_source_.IsEmpty()) | 266 if (js_hooks_source_.IsEmpty()) |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 293 if (result.IsEmpty() || | 301 if (result.IsEmpty() || |
| 294 !gin::Converter<std::vector<v8::Local<v8::Value>>>::FromV8( | 302 !gin::Converter<std::vector<v8::Local<v8::Value>>>::FromV8( |
| 295 context->GetIsolate(), result, &new_args)) { | 303 context->GetIsolate(), result, &new_args)) { |
| 296 return false; | 304 return false; |
| 297 } | 305 } |
| 298 arguments->swap(new_args); | 306 arguments->swap(new_args); |
| 299 return true; | 307 return true; |
| 300 } | 308 } |
| 301 | 309 |
| 302 } // namespace extensions | 310 } // namespace extensions |
| OLD | NEW |