Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(52)

Unified Diff: extensions/renderer/api_binding.cc

Issue 2583273002: [Extensions Bindings] Allow for argument validation without conversion (Closed)
Patch Set: lazyboy's Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | extensions/renderer/api_binding_hooks.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: extensions/renderer/api_binding.cc
diff --git a/extensions/renderer/api_binding.cc b/extensions/renderer/api_binding.cc
index bff8eba8c2fa6790dba94cd8400612817fd3d195..163858dbc6503b311b05aaf14e20f6b44b196a14 100644
--- a/extensions/renderer/api_binding.cc
+++ b/extensions/renderer/api_binding.cc
@@ -188,31 +188,43 @@ void APIBinding::HandleCall(const std::string& name,
// GetCurrentContext() should always be correct.
v8::Local<v8::Context> context = isolate->GetCurrentContext();
- // Check for a custom hook to handle the method.
- if (binding_hooks_->HandleRequest(api_name_, name, context,
- signature, arguments)) {
- return; // Handled by a custom hook.
+ APIBindingHooks::RequestResult hooks_result =
+ APIBindingHooks::RequestResult::NOT_HANDLED;
+ hooks_result = binding_hooks_->HandleRequest(api_name_, name, context,
+ signature, arguments,
+ *type_refs_);
+
+ switch (hooks_result) {
+ case APIBindingHooks::RequestResult::INVALID_INVOCATION:
+ arguments->ThrowTypeError("Invalid invocation");
+ return;
+ case APIBindingHooks::RequestResult::HANDLED:
+ return; // Our work here is done.
+ case APIBindingHooks::RequestResult::NOT_HANDLED:
+ break; // Handle in the default manner.
}
- std::unique_ptr<base::ListValue> parsed_arguments;
+ std::unique_ptr<base::ListValue> converted_arguments;
v8::Local<v8::Function> callback;
+ bool conversion_success = false;
{
v8::TryCatch try_catch(isolate);
- parsed_arguments =
- signature->ParseArguments(arguments, *type_refs_, &callback, &error);
+ conversion_success = signature->ParseArgumentsToJSON(
+ arguments, *type_refs_, &converted_arguments, &callback, &error);
if (try_catch.HasCaught()) {
- DCHECK(!parsed_arguments);
+ DCHECK(!converted_arguments);
try_catch.ReThrow();
return;
}
}
- if (!parsed_arguments) {
+ if (!conversion_success) {
arguments->ThrowTypeError("Invalid invocation");
return;
}
- method_callback_.Run(name, std::move(parsed_arguments), isolate,
- context, callback);
+ DCHECK(converted_arguments);
+ method_callback_.Run(name, std::move(converted_arguments), isolate, context,
+ callback);
}
} // namespace extensions
« no previous file with comments | « no previous file | extensions/renderer/api_binding_hooks.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698