// Copyright 2021 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "include/v8-exception.h" #include "include/v8-local-handle.h" #include "include/v8-object.h" #include "include/v8-template.h" #include "src/api/api.h" #include "src/objects/objects-inl.h" #include "src/runtime/runtime.h" #include "test/unittests/test-utils.h" #include "testing/gtest/include/gtest/gtest.h" namespace v8 { namespace internal { namespace { using RuntimeTest = TestWithContext; TEST_F(RuntimeTest, ReturnsPrototype) { TryCatch try_catch(isolate()); Local object = v8::Object::New(isolate()); Handle i_result = Runtime::GetInternalProperties(i_isolate(), Utils::OpenHandle(*object)) .ToHandleChecked(); Local result = Utils::ToLocal(i_result); EXPECT_GE(result->Length(), 1u); char name_buffer[100]; result->Get(context(), 0) .ToLocalChecked() .As() ->WriteUtf8(isolate(), name_buffer); EXPECT_EQ("[[Prototype]]", std::string(name_buffer)); } bool AccessCheck(Local accessing_context, Local accessed_object, Local data) { return false; } TEST_F(RuntimeTest, DoesNotReturnPrototypeWhenInacessible) { TryCatch try_catch(isolate()); Local object_template = ObjectTemplate::New(isolate()); object_template->SetAccessCheckCallback(AccessCheck); Local object = object_template->NewInstance(context()).ToLocalChecked(); Handle i_result = Runtime::GetInternalProperties(i_isolate(), Utils::OpenHandle(*object)) .ToHandleChecked(); Local result = Utils::ToLocal(i_result); EXPECT_EQ(0u, result->Length()); } } // namespace } // namespace internal } // namespace v8