binding_access_checker_unittest.cc 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "extensions/renderer/bindings/binding_access_checker.h"
  5. #include "base/bind.h"
  6. #include "extensions/renderer/bindings/api_binding_test.h"
  7. #include "gin/converter.h"
  8. namespace extensions {
  9. namespace {
  10. bool APIIsAvailable(v8::Local<v8::Context> context,
  11. const std::string& full_name) {
  12. EXPECT_TRUE(full_name == "available" || full_name == "unavailable")
  13. << full_name;
  14. return full_name == "available";
  15. }
  16. bool PromisesAvailable(v8::Local<v8::Context> context) {
  17. return true;
  18. }
  19. } // namespace
  20. using BindingAccessCheckerTest = APIBindingTest;
  21. TEST_F(BindingAccessCheckerTest, TestHasAccess) {
  22. v8::HandleScope handle_scope(isolate());
  23. BindingAccessChecker checker(base::BindRepeating(&APIIsAvailable),
  24. base::BindRepeating(&PromisesAvailable));
  25. v8::Local<v8::Context> context = MainContext();
  26. EXPECT_TRUE(checker.HasAccess(context, "available"));
  27. EXPECT_FALSE(checker.HasAccess(context, "unavailable"));
  28. }
  29. TEST_F(BindingAccessCheckerTest, TestHasAccessOrThrowError) {
  30. v8::HandleScope handle_scope(isolate());
  31. BindingAccessChecker checker(base::BindRepeating(&APIIsAvailable),
  32. base::BindRepeating(&PromisesAvailable));
  33. v8::Local<v8::Context> context = MainContext();
  34. {
  35. v8::TryCatch try_catch(isolate());
  36. EXPECT_TRUE(checker.HasAccessOrThrowError(context, "available"));
  37. EXPECT_FALSE(try_catch.HasCaught());
  38. }
  39. {
  40. v8::TryCatch try_catch(isolate());
  41. EXPECT_FALSE(checker.HasAccessOrThrowError(context, "unavailable"));
  42. ASSERT_TRUE(try_catch.HasCaught());
  43. EXPECT_EQ("Uncaught Error: 'unavailable' is not available in this context.",
  44. gin::V8ToString(isolate(), try_catch.Message()->Get()));
  45. }
  46. }
  47. TEST_F(BindingAccessCheckerTest, TestHasPromiseAccess) {
  48. bool context_allows_promises = true;
  49. auto promises_available = base::BindRepeating(
  50. [](bool* flag, v8::Local<v8::Context> context) { return *flag; },
  51. &context_allows_promises);
  52. v8::HandleScope handle_scope(isolate());
  53. BindingAccessChecker checker(base::BindRepeating(&APIIsAvailable),
  54. promises_available);
  55. v8::Local<v8::Context> context = MainContext();
  56. EXPECT_TRUE(checker.HasPromiseAccess(context));
  57. context_allows_promises = false;
  58. EXPECT_FALSE(checker.HasPromiseAccess(context));
  59. }
  60. } // namespace extensions