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