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

Unified Diff: extensions/renderer/api_signature_unittest.cc

Issue 2915813003: [Extensions Bindings] Accept null callbacks while ignoring schema (Closed)
Patch Set: jbroman's Created 3 years, 6 months 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 | « extensions/renderer/api_signature.cc ('k') | extensions/renderer/resources/context_menus_handlers.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: extensions/renderer/api_signature_unittest.cc
diff --git a/extensions/renderer/api_signature_unittest.cc b/extensions/renderer/api_signature_unittest.cc
index e62cfaa4da68fa43c841cd9b60731e61cbbe0446..34ac719d3d16f851f1293ef545708f021c28243d 100644
--- a/extensions/renderer/api_signature_unittest.cc
+++ b/extensions/renderer/api_signature_unittest.cc
@@ -66,6 +66,15 @@ std::unique_ptr<APISignature> IntAndCallback() {
return base::MakeUnique<APISignature>(std::move(specs));
}
+std::unique_ptr<APISignature> IntAndOptionalCallback() {
+ SpecVector specs;
+ specs.push_back(ArgumentSpecBuilder(ArgumentType::INTEGER, "int").Build());
+ specs.push_back(ArgumentSpecBuilder(ArgumentType::FUNCTION, "callback")
+ .MakeOptional()
+ .Build());
+ return base::MakeUnique<APISignature>(std::move(specs));
+}
+
std::unique_ptr<APISignature> OptionalIntAndCallback() {
SpecVector specs;
specs.push_back(
@@ -341,4 +350,62 @@ TEST_F(APISignatureTest, ExpectedSignature) {
EXPECT_EQ("refEnum enum", RefEnum()->GetExpectedSignature());
}
+TEST_F(APISignatureTest, ParseIgnoringSchema) {
+ v8::HandleScope handle_scope(isolate());
+ v8::Local<v8::Context> context = MainContext();
+
+ auto string_to_v8_vector = [context](base::StringPiece args) {
+ v8::Local<v8::Value> v8_args = V8ValueFromScriptSource(context, args);
+ EXPECT_FALSE(v8_args.IsEmpty());
+ EXPECT_TRUE(v8_args->IsArray());
+ std::vector<v8::Local<v8::Value>> vector_args;
+ EXPECT_TRUE(
+ gin::ConvertFromV8(context->GetIsolate(), v8_args, &vector_args));
+ return vector_args;
+ };
+
+ {
+ // Test with providing an optional callback.
+ auto signature = IntAndOptionalCallback();
+ std::vector<v8::Local<v8::Value>> v8_args =
+ string_to_v8_vector("[1, function() {}]");
+ v8::Local<v8::Function> callback;
+ std::unique_ptr<base::ListValue> parsed;
+ EXPECT_TRUE(signature->ConvertArgumentsIgnoringSchema(context, v8_args,
+ &parsed, &callback));
+ ASSERT_TRUE(parsed);
+ EXPECT_EQ("[1]", ValueToString(*parsed));
+ EXPECT_FALSE(callback.IsEmpty());
+ }
+
+ {
+ // Test with omitting the optional callback.
+ auto signature = IntAndOptionalCallback();
+ std::vector<v8::Local<v8::Value>> v8_args =
+ string_to_v8_vector("[1, null]");
+ v8::Local<v8::Function> callback;
+ std::unique_ptr<base::ListValue> parsed;
+ EXPECT_TRUE(signature->ConvertArgumentsIgnoringSchema(context, v8_args,
+ &parsed, &callback));
+ ASSERT_TRUE(parsed);
+ EXPECT_EQ("[1]", ValueToString(*parsed));
+ EXPECT_TRUE(callback.IsEmpty());
+ }
+
+ {
+ // Test with providing something completely different than the spec, which
+ // is (unfortunately) allowed and used.
+ auto signature = OneString();
+ std::vector<v8::Local<v8::Value>> v8_args =
+ string_to_v8_vector("[{not: 'a string'}]");
+ v8::Local<v8::Function> callback;
+ std::unique_ptr<base::ListValue> parsed;
+ EXPECT_TRUE(signature->ConvertArgumentsIgnoringSchema(context, v8_args,
+ &parsed, &callback));
+ ASSERT_TRUE(parsed);
+ EXPECT_EQ(R"([{"not":"a string"}])", ValueToString(*parsed));
+ EXPECT_TRUE(callback.IsEmpty());
+ }
+}
+
} // namespace extensions
« no previous file with comments | « extensions/renderer/api_signature.cc ('k') | extensions/renderer/resources/context_menus_handlers.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698