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

Side by Side Diff: extensions/renderer/api_binding_unittest.cc

Issue 2610743002: [Extensions Bindings] Make function definitions optional for an API. (Closed)
Patch Set: comment fix, unit test for empty API Created 3 years, 11 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 unified diff | Download patch
« no previous file with comments | « extensions/renderer/api_binding.cc ('k') | extensions/renderer/api_bindings_system.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "base/bind.h" 5 #include "base/bind.h"
6 #include "base/memory/ptr_util.h" 6 #include "base/memory/ptr_util.h"
7 #include "base/stl_util.h" 7 #include "base/stl_util.h"
8 #include "base/strings/stringprintf.h" 8 #include "base/strings/stringprintf.h"
9 #include "base/values.h" 9 #include "base/values.h"
10 #include "extensions/renderer/api_binding.h" 10 #include "extensions/renderer/api_binding.h"
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 ASSERT_TRUE(arguments_) << script_source; 182 ASSERT_TRUE(arguments_) << script_source;
183 EXPECT_EQ(expected_json_arguments, ValueToString(*arguments_)); 183 EXPECT_EQ(expected_json_arguments, ValueToString(*arguments_));
184 } else { 184 } else {
185 RunFunctionAndExpectError(func, context, 1, argv, expected_error); 185 RunFunctionAndExpectError(func, context, 1, argv, expected_error);
186 EXPECT_FALSE(arguments_); 186 EXPECT_FALSE(arguments_);
187 } 187 }
188 188
189 arguments_.reset(); 189 arguments_.reset();
190 } 190 }
191 191
192 TEST_F(APIBindingUnittest, TestEmptyAPI) {
193 ArgumentSpec::RefMap refs;
194 APIBinding binding(
195 "empty", nullptr, nullptr, nullptr,
196 base::Bind(&APIBindingUnittest::OnFunctionCall, base::Unretained(this)),
197 base::MakeUnique<APIBindingHooks>(binding::RunJSFunction()), &refs);
198 EXPECT_TRUE(refs.empty());
199
200 v8::HandleScope handle_scope(isolate());
201 v8::Local<v8::Context> context = ContextLocal();
202
203 APIEventHandler event_handler(
204 base::Bind(&RunFunctionOnGlobalAndIgnoreResult));
205 v8::Local<v8::Object> binding_object = binding.CreateInstance(
206 context, isolate(), &event_handler, base::Bind(&AllowAllAPIs));
207 EXPECT_EQ(
208 0u,
209 binding_object->GetOwnPropertyNames(context).ToLocalChecked()->Length());
210 }
211
192 TEST_F(APIBindingUnittest, Test) { 212 TEST_F(APIBindingUnittest, Test) {
193 std::unique_ptr<base::ListValue> functions = ListValueFromString(kFunctions); 213 std::unique_ptr<base::ListValue> functions = ListValueFromString(kFunctions);
194 ASSERT_TRUE(functions); 214 ASSERT_TRUE(functions);
195 ArgumentSpec::RefMap refs; 215 ArgumentSpec::RefMap refs;
196 APIBinding binding( 216 APIBinding binding(
197 "test", *functions, nullptr, nullptr, 217 "test", functions.get(), nullptr, nullptr,
198 base::Bind(&APIBindingUnittest::OnFunctionCall, base::Unretained(this)), 218 base::Bind(&APIBindingUnittest::OnFunctionCall, base::Unretained(this)),
199 base::MakeUnique<APIBindingHooks>(binding::RunJSFunction()), &refs); 219 base::MakeUnique<APIBindingHooks>(binding::RunJSFunction()), &refs);
200 EXPECT_TRUE(refs.empty()); 220 EXPECT_TRUE(refs.empty());
201 221
202 v8::HandleScope handle_scope(isolate()); 222 v8::HandleScope handle_scope(isolate());
203 v8::Local<v8::Context> context = ContextLocal(); 223 v8::Local<v8::Context> context = ContextLocal();
204 224
205 APIEventHandler event_handler( 225 APIEventHandler event_handler(
206 base::Bind(&RunFunctionOnGlobalAndIgnoreResult)); 226 base::Bind(&RunFunctionOnGlobalAndIgnoreResult));
207 v8::Local<v8::Object> binding_object = binding.CreateInstance( 227 v8::Local<v8::Object> binding_object = binding.CreateInstance(
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 " }]" 308 " }]"
289 "}]"; 309 "}]";
290 310
291 std::unique_ptr<base::ListValue> functions = 311 std::unique_ptr<base::ListValue> functions =
292 ListValueFromString(kRefFunctions); 312 ListValueFromString(kRefFunctions);
293 ASSERT_TRUE(functions); 313 ASSERT_TRUE(functions);
294 std::unique_ptr<base::ListValue> types = ListValueFromString(kTypes); 314 std::unique_ptr<base::ListValue> types = ListValueFromString(kTypes);
295 ASSERT_TRUE(types); 315 ASSERT_TRUE(types);
296 ArgumentSpec::RefMap refs; 316 ArgumentSpec::RefMap refs;
297 APIBinding binding( 317 APIBinding binding(
298 "test", *functions, types.get(), nullptr, 318 "test", functions.get(), types.get(), nullptr,
299 base::Bind(&APIBindingUnittest::OnFunctionCall, base::Unretained(this)), 319 base::Bind(&APIBindingUnittest::OnFunctionCall, base::Unretained(this)),
300 base::MakeUnique<APIBindingHooks>(binding::RunJSFunction()), &refs); 320 base::MakeUnique<APIBindingHooks>(binding::RunJSFunction()), &refs);
301 EXPECT_EQ(2u, refs.size()); 321 EXPECT_EQ(2u, refs.size());
302 EXPECT_TRUE(base::ContainsKey(refs, "refObj")); 322 EXPECT_TRUE(base::ContainsKey(refs, "refObj"));
303 EXPECT_TRUE(base::ContainsKey(refs, "refEnum")); 323 EXPECT_TRUE(base::ContainsKey(refs, "refEnum"));
304 324
305 v8::HandleScope handle_scope(isolate()); 325 v8::HandleScope handle_scope(isolate());
306 v8::Local<v8::Context> context = ContextLocal(); 326 v8::Local<v8::Context> context = ContextLocal();
307 327
308 APIEventHandler event_handler( 328 APIEventHandler event_handler(
(...skipping 25 matching lines...) Expand all
334 " 'parameters': []" 354 " 'parameters': []"
335 "}, {" 355 "}, {"
336 " 'name': 'restrictedTwo'," 356 " 'name': 'restrictedTwo',"
337 " 'parameters': []" 357 " 'parameters': []"
338 "}]"; 358 "}]";
339 std::unique_ptr<base::ListValue> functions = 359 std::unique_ptr<base::ListValue> functions =
340 ListValueFromString(kRestrictedFunctions); 360 ListValueFromString(kRestrictedFunctions);
341 ASSERT_TRUE(functions); 361 ASSERT_TRUE(functions);
342 ArgumentSpec::RefMap refs; 362 ArgumentSpec::RefMap refs;
343 APIBinding binding( 363 APIBinding binding(
344 "test", *functions, nullptr, nullptr, 364 "test", functions.get(), nullptr, nullptr,
345 base::Bind(&APIBindingUnittest::OnFunctionCall, base::Unretained(this)), 365 base::Bind(&APIBindingUnittest::OnFunctionCall, base::Unretained(this)),
346 base::MakeUnique<APIBindingHooks>(binding::RunJSFunction()), &refs); 366 base::MakeUnique<APIBindingHooks>(binding::RunJSFunction()), &refs);
347 367
348 v8::HandleScope handle_scope(isolate()); 368 v8::HandleScope handle_scope(isolate());
349 v8::Local<v8::Context> context = ContextLocal(); 369 v8::Local<v8::Context> context = ContextLocal();
350 370
351 auto is_available = [](const std::string& name) { 371 auto is_available = [](const std::string& name) {
352 std::set<std::string> functions = {"test.allowedOne", "test.allowedTwo", 372 std::set<std::string> functions = {"test.allowedOne", "test.allowedTwo",
353 "test.restrictedOne", 373 "test.restrictedOne",
354 "test.restrictedTwo"}; 374 "test.restrictedTwo"};
(...skipping 22 matching lines...) Expand all
377 // Tests that events specified in the API are created as properties of the API 397 // Tests that events specified in the API are created as properties of the API
378 // object. 398 // object.
379 TEST_F(APIBindingUnittest, TestEventCreation) { 399 TEST_F(APIBindingUnittest, TestEventCreation) {
380 const char kEvents[] = "[{'name': 'onFoo'}, {'name': 'onBar'}]"; 400 const char kEvents[] = "[{'name': 'onFoo'}, {'name': 'onBar'}]";
381 std::unique_ptr<base::ListValue> events = ListValueFromString(kEvents); 401 std::unique_ptr<base::ListValue> events = ListValueFromString(kEvents);
382 ASSERT_TRUE(events); 402 ASSERT_TRUE(events);
383 std::unique_ptr<base::ListValue> functions = ListValueFromString(kFunctions); 403 std::unique_ptr<base::ListValue> functions = ListValueFromString(kFunctions);
384 ASSERT_TRUE(functions); 404 ASSERT_TRUE(functions);
385 ArgumentSpec::RefMap refs; 405 ArgumentSpec::RefMap refs;
386 APIBinding binding( 406 APIBinding binding(
387 "test", *functions, nullptr, events.get(), 407 "test", functions.get(), nullptr, events.get(),
388 base::Bind(&APIBindingUnittest::OnFunctionCall, base::Unretained(this)), 408 base::Bind(&APIBindingUnittest::OnFunctionCall, base::Unretained(this)),
389 base::MakeUnique<APIBindingHooks>(binding::RunJSFunction()), &refs); 409 base::MakeUnique<APIBindingHooks>(binding::RunJSFunction()), &refs);
390 410
391 v8::HandleScope handle_scope(isolate()); 411 v8::HandleScope handle_scope(isolate());
392 v8::Local<v8::Context> context = ContextLocal(); 412 v8::Local<v8::Context> context = ContextLocal();
393 413
394 APIEventHandler event_handler( 414 APIEventHandler event_handler(
395 base::Bind(&RunFunctionOnGlobalAndIgnoreResult)); 415 base::Bind(&RunFunctionOnGlobalAndIgnoreResult));
396 v8::Local<v8::Object> binding_object = binding.CreateInstance( 416 v8::Local<v8::Object> binding_object = binding.CreateInstance(
397 context, isolate(), &event_handler, base::Bind(&AllowAllAPIs)); 417 context, isolate(), &event_handler, base::Bind(&AllowAllAPIs));
(...skipping 15 matching lines...) Expand all
413 binding_object->Has(context, gin::StringToV8(isolate(), "onBaz")); 433 binding_object->Has(context, gin::StringToV8(isolate(), "onBaz"));
414 EXPECT_TRUE(has_on_baz.IsJust()); 434 EXPECT_TRUE(has_on_baz.IsJust());
415 EXPECT_FALSE(has_on_baz.FromJust()); 435 EXPECT_FALSE(has_on_baz.FromJust());
416 } 436 }
417 437
418 TEST_F(APIBindingUnittest, TestDisposedContext) { 438 TEST_F(APIBindingUnittest, TestDisposedContext) {
419 std::unique_ptr<base::ListValue> functions = ListValueFromString(kFunctions); 439 std::unique_ptr<base::ListValue> functions = ListValueFromString(kFunctions);
420 ASSERT_TRUE(functions); 440 ASSERT_TRUE(functions);
421 ArgumentSpec::RefMap refs; 441 ArgumentSpec::RefMap refs;
422 APIBinding binding( 442 APIBinding binding(
423 "test", *functions, nullptr, nullptr, 443 "test", functions.get(), nullptr, nullptr,
424 base::Bind(&APIBindingUnittest::OnFunctionCall, base::Unretained(this)), 444 base::Bind(&APIBindingUnittest::OnFunctionCall, base::Unretained(this)),
425 base::MakeUnique<APIBindingHooks>(binding::RunJSFunction()), &refs); 445 base::MakeUnique<APIBindingHooks>(binding::RunJSFunction()), &refs);
426 EXPECT_TRUE(refs.empty()); 446 EXPECT_TRUE(refs.empty());
427 447
428 v8::HandleScope handle_scope(isolate()); 448 v8::HandleScope handle_scope(isolate());
429 v8::Local<v8::Context> context = ContextLocal(); 449 v8::Local<v8::Context> context = ContextLocal();
430 450
431 APIEventHandler event_handler( 451 APIEventHandler event_handler(
432 base::Bind(&RunFunctionOnGlobalAndIgnoreResult)); 452 base::Bind(&RunFunctionOnGlobalAndIgnoreResult));
433 v8::Local<v8::Object> binding_object = binding.CreateInstance( 453 v8::Local<v8::Object> binding_object = binding.CreateInstance(
(...skipping 25 matching lines...) Expand all
459 *did_call = true; 479 *did_call = true;
460 EXPECT_EQ(1, arguments->Length()); 480 EXPECT_EQ(1, arguments->Length());
461 std::string argument; 481 std::string argument;
462 EXPECT_TRUE(arguments->GetNext(&argument)); 482 EXPECT_TRUE(arguments->GetNext(&argument));
463 EXPECT_EQ("foo", argument); 483 EXPECT_EQ("foo", argument);
464 return APIBindingHooks::RequestResult::HANDLED; 484 return APIBindingHooks::RequestResult::HANDLED;
465 }; 485 };
466 hooks->RegisterHandleRequest("test.oneString", base::Bind(hook, &did_call)); 486 hooks->RegisterHandleRequest("test.oneString", base::Bind(hook, &did_call));
467 487
468 APIBinding binding( 488 APIBinding binding(
469 "test", *functions, nullptr, nullptr, 489 "test", functions.get(), nullptr, nullptr,
470 base::Bind(&APIBindingUnittest::OnFunctionCall, base::Unretained(this)), 490 base::Bind(&APIBindingUnittest::OnFunctionCall, base::Unretained(this)),
471 std::move(hooks), &refs); 491 std::move(hooks), &refs);
472 EXPECT_TRUE(refs.empty()); 492 EXPECT_TRUE(refs.empty());
473 493
474 v8::HandleScope handle_scope(isolate()); 494 v8::HandleScope handle_scope(isolate());
475 v8::Local<v8::Context> context = ContextLocal(); 495 v8::Local<v8::Context> context = ContextLocal();
476 496
477 APIEventHandler event_handler( 497 APIEventHandler event_handler(
478 base::Bind(&RunFunctionOnGlobalAndIgnoreResult)); 498 base::Bind(&RunFunctionOnGlobalAndIgnoreResult));
479 v8::Local<v8::Object> binding_object = binding.CreateInstance( 499 v8::Local<v8::Object> binding_object = binding.CreateInstance(
(...skipping 30 matching lines...) Expand all
510 gin::StringToV8(isolate(), "custom_hook"); 530 gin::StringToV8(isolate(), "custom_hook");
511 hooks->RegisterJsSource( 531 hooks->RegisterJsSource(
512 v8::Global<v8::String>(isolate(), source_string), 532 v8::Global<v8::String>(isolate(), source_string),
513 v8::Global<v8::String>(isolate(), source_name)); 533 v8::Global<v8::String>(isolate(), source_name));
514 534
515 std::unique_ptr<base::ListValue> functions = ListValueFromString(kFunctions); 535 std::unique_ptr<base::ListValue> functions = ListValueFromString(kFunctions);
516 ASSERT_TRUE(functions); 536 ASSERT_TRUE(functions);
517 ArgumentSpec::RefMap refs; 537 ArgumentSpec::RefMap refs;
518 538
519 APIBinding binding( 539 APIBinding binding(
520 "test", *functions, nullptr, nullptr, 540 "test", functions.get(), nullptr, nullptr,
521 base::Bind(&APIBindingUnittest::OnFunctionCall, base::Unretained(this)), 541 base::Bind(&APIBindingUnittest::OnFunctionCall, base::Unretained(this)),
522 std::move(hooks), &refs); 542 std::move(hooks), &refs);
523 EXPECT_TRUE(refs.empty()); 543 EXPECT_TRUE(refs.empty());
524 544
525 APIEventHandler event_handler( 545 APIEventHandler event_handler(
526 base::Bind(&RunFunctionOnGlobalAndIgnoreResult)); 546 base::Bind(&RunFunctionOnGlobalAndIgnoreResult));
527 v8::Local<v8::Object> binding_object = binding.CreateInstance( 547 v8::Local<v8::Object> binding_object = binding.CreateInstance(
528 context, isolate(), &event_handler, base::Bind(&AllowAllAPIs)); 548 context, isolate(), &event_handler, base::Bind(&AllowAllAPIs));
529 549
530 // First try calling with an invalid invocation. An error should be raised and 550 // First try calling with an invalid invocation. An error should be raised and
(...skipping 15 matching lines...) Expand all
546 GetBaseValuePropertyFromObject(context->Global(), context, 566 GetBaseValuePropertyFromObject(context->Global(), context,
547 "requestArguments"); 567 "requestArguments");
548 ASSERT_TRUE(response_args); 568 ASSERT_TRUE(response_args);
549 EXPECT_EQ("[\"foo\"]", ValueToString(*response_args)); 569 EXPECT_EQ("[\"foo\"]", ValueToString(*response_args));
550 570
551 // Other methods, like stringAndInt(), should behave normally. 571 // Other methods, like stringAndInt(), should behave normally.
552 ExpectPass(binding_object, "obj.stringAndInt('foo', 42);", "['foo',42]"); 572 ExpectPass(binding_object, "obj.stringAndInt('foo', 42);", "['foo',42]");
553 } 573 }
554 574
555 } // namespace extensions 575 } // namespace extensions
OLDNEW
« no previous file with comments | « extensions/renderer/api_binding.cc ('k') | extensions/renderer/api_bindings_system.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698