Index: test/cctest/test-api-interceptors.cc |
diff --git a/test/cctest/test-api-interceptors.cc b/test/cctest/test-api-interceptors.cc |
index d6a827c7f43193378f34fe0bf0cb80162dabeb0b..955b8f4df5b700ee59bf29eb59c5f4cb68b304d8 100644 |
--- a/test/cctest/test-api-interceptors.cc |
+++ b/test/cctest/test-api-interceptors.cc |
@@ -576,6 +576,51 @@ THREADED_TEST(SetterCallbackFunctionDeclarationInterceptor) { |
} |
namespace { |
+int descriptor_was_called; |
+ |
+void PropertyDescriptorCallback( |
+ Local<Name> name, const v8::PropertyCallbackInfo<v8::Value>& info) { |
+ // Intercept the callback by setting a different descriptor. |
+ descriptor_was_called++; |
+ const char* code = |
+ "var desc = {value: 5};" |
+ "desc;"; |
+ Local<Value> descriptor = v8_compile(code) |
+ ->Run(info.GetIsolate()->GetCurrentContext()) |
+ .ToLocalChecked(); |
+ info.GetReturnValue().Set(descriptor); |
+} |
+} // namespace |
+ |
+// Check that the descriptor callback is called on the global object. |
+THREADED_TEST(DescriptorCallbackOnGlobalObject) { |
+ v8::HandleScope scope(CcTest::isolate()); |
+ LocalContext env; |
+ v8::Local<v8::FunctionTemplate> templ = |
+ v8::FunctionTemplate::New(CcTest::isolate()); |
+ |
+ v8::Local<ObjectTemplate> object_template = templ->InstanceTemplate(); |
+ object_template->SetHandler(v8::NamedPropertyHandlerConfiguration( |
+ nullptr, nullptr, PropertyDescriptorCallback, nullptr, nullptr, nullptr)); |
+ v8::Local<v8::Context> ctx = |
+ v8::Context::New(CcTest::isolate(), nullptr, object_template); |
+ |
+ descriptor_was_called = 0; |
+ |
+ // Declare function. |
+ v8::Local<v8::String> code = v8_str( |
+ "var x = 42; var desc = Object.getOwnPropertyDescriptor(this, 'x'); " |
+ "desc.value;"); |
+ CHECK_EQ(5, v8::Script::Compile(ctx, code) |
+ .ToLocalChecked() |
+ ->Run(ctx) |
+ .ToLocalChecked() |
+ ->Int32Value(ctx) |
+ .FromJust()); |
+ CHECK_EQ(1, descriptor_was_called); |
+} |
+ |
+namespace { |
void QueryCallbackSetDontDelete( |
Local<Name> property, const v8::PropertyCallbackInfo<v8::Integer>& info) { |
info.GetReturnValue().Set(v8::PropertyAttribute::DontDelete); |
@@ -4636,7 +4681,7 @@ TEST(NamedAllCanReadInterceptor) { |
ExpectInt32("checked.whatever", 17); |
CHECK(!CompileRun("Object.getOwnPropertyDescriptor(checked, 'whatever')") |
->IsUndefined()); |
- CHECK_EQ(5, access_check_data.count); |
+ CHECK_EQ(6, access_check_data.count); |
access_check_data.result = false; |
ExpectInt32("checked.whatever", intercept_data_0.value); |
@@ -4645,7 +4690,7 @@ TEST(NamedAllCanReadInterceptor) { |
CompileRun("Object.getOwnPropertyDescriptor(checked, 'whatever')"); |
CHECK(try_catch.HasCaught()); |
} |
- CHECK_EQ(7, access_check_data.count); |
+ CHECK_EQ(9, access_check_data.count); |
intercept_data_1.should_intercept = true; |
ExpectInt32("checked.whatever", intercept_data_1.value); |
@@ -4654,7 +4699,7 @@ TEST(NamedAllCanReadInterceptor) { |
CompileRun("Object.getOwnPropertyDescriptor(checked, 'whatever')"); |
CHECK(try_catch.HasCaught()); |
} |
- CHECK_EQ(9, access_check_data.count); |
+ CHECK_EQ(12, access_check_data.count); |
g_access_check_data = nullptr; |
} |
@@ -4723,7 +4768,7 @@ TEST(IndexedAllCanReadInterceptor) { |
ExpectInt32("checked[15]", 17); |
CHECK(!CompileRun("Object.getOwnPropertyDescriptor(checked, '15')") |
->IsUndefined()); |
- CHECK_EQ(5, access_check_data.count); |
+ CHECK_EQ(6, access_check_data.count); |
access_check_data.result = false; |
ExpectInt32("checked[15]", intercept_data_0.value); |
@@ -4732,7 +4777,7 @@ TEST(IndexedAllCanReadInterceptor) { |
CompileRun("Object.getOwnPropertyDescriptor(checked, '15')"); |
CHECK(try_catch.HasCaught()); |
} |
- CHECK_EQ(7, access_check_data.count); |
+ CHECK_EQ(9, access_check_data.count); |
intercept_data_1.should_intercept = true; |
ExpectInt32("checked[15]", intercept_data_1.value); |
@@ -4741,7 +4786,7 @@ TEST(IndexedAllCanReadInterceptor) { |
CompileRun("Object.getOwnPropertyDescriptor(checked, '15')"); |
CHECK(try_catch.HasCaught()); |
} |
- CHECK_EQ(9, access_check_data.count); |
+ CHECK_EQ(12, access_check_data.count); |
g_access_check_data = nullptr; |
} |