blob: 158a9934f996d9409e9189c3a099a1624ac5ecfe [file] [log] [blame]
// 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