Index: test/cctest/test-api-interceptors.cc |
diff --git a/test/cctest/test-api-interceptors.cc b/test/cctest/test-api-interceptors.cc |
index 4416fd6b530b3dc2fe21d9206bcf8e03e76c545e..1da89bde7b7924f29b25b4137a62bf26fa00305c 100644 |
--- a/test/cctest/test-api-interceptors.cc |
+++ b/test/cctest/test-api-interceptors.cc |
@@ -1573,9 +1573,12 @@ THREADED_TEST(NamedPropertyHandlerGetter) { |
} |
namespace { |
+int definer_was_called; |
+ |
void NotInterceptingPropertyDefineCallback( |
Local<Name> name, const v8::PropertyDescriptor& desc, |
const v8::PropertyCallbackInfo<v8::Value>& info) { |
+ definer_was_called++; |
// Do not intercept by not calling info.GetReturnValue().Set(). |
} |
@@ -1583,6 +1586,7 @@ void InterceptingPropertyDefineCallback( |
Local<Name> name, const v8::PropertyDescriptor& desc, |
const v8::PropertyCallbackInfo<v8::Value>& info) { |
// Intercept the callback by setting a non-empty handle |
+ definer_was_called++; |
info.GetReturnValue().Set(name); |
} |
@@ -1816,6 +1820,44 @@ THREADED_TEST(PropertyDefinerCallbackForFreeze) { |
.FromJust()); |
} |
+// Check that the define interceptor is not triggered for DefineProperty |
+// with the SKIP_INTERCEPTORS flag. |
+THREADED_TEST(DefinePropertyWithoutInterceptors) { |
+ v8::Isolate* isolate = CcTest::isolate(); |
+ v8::HandleScope scope(isolate); |
+ v8::Local<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate); |
+ |
+ templ->SetHandler(v8::NamedPropertyHandlerConfiguration( |
+ nullptr, nullptr, nullptr, nullptr, nullptr, |
+ InterceptingPropertyDefineCallback)); |
+ |
+ LocalContext context; |
+ v8::Local<v8::Name> p; |
+ |
+ v8::Local<v8::Object> obj = |
+ templ->NewInstance(context.local()).ToLocalChecked(); |
+ |
+ definer_was_called = 0; |
+ |
+ // Use a generic descriptor. |
+ v8::PropertyDescriptor desc_generic; |
+ |
+ p = v8_str("foo"); |
+ |
+ // DONT_SKIP_INTERCEPTORS (default) triggers the interceptors when setting |
+ // own property of an object. |
+ CHECK(obj->DefineProperty(context.local(), p, desc_generic).FromJust()); |
+ CHECK_EQ(1, definer_was_called); |
+ |
+ definer_was_called = 0; |
+ |
+ // SKIP_INTERCEPTORS does not trigger the interceptors. |
+ CHECK(obj->DefineProperty(context.local(), p, desc_generic, |
+ v8::SKIP_INTERCEPTORS) |
+ .FromJust()); |
+ CHECK_EQ(0, definer_was_called); |
+} |
+ |
// Check that the descriptor passed to the callback is enumerable. |
namespace { |
void CheckEnumerablePropertyDefineCallback( |