| Index: test/cctest/test-api-interceptors.cc
|
| diff --git a/test/cctest/test-api-interceptors.cc b/test/cctest/test-api-interceptors.cc
|
| index fc5e4cc0fdb45e92c9000272a66cf3bc0928b995..6e4c6028e90eb78990cdfdd42391b90ccd7346d7 100644
|
| --- a/test/cctest/test-api-interceptors.cc
|
| +++ b/test/cctest/test-api-interceptors.cc
|
| @@ -239,26 +239,6 @@
|
| .FromJust());
|
| }
|
|
|
| -void CheckThisIndexedPropertyDefiner(
|
| - uint32_t index, const v8::PropertyDescriptor& desc,
|
| - const v8::PropertyCallbackInfo<v8::Value>& info) {
|
| - CheckReturnValue(info, FUNCTION_ADDR(CheckThisIndexedPropertyDefiner));
|
| - ApiTestFuzzer::Fuzz();
|
| - CHECK(info.This()
|
| - ->Equals(info.GetIsolate()->GetCurrentContext(), bottom)
|
| - .FromJust());
|
| -}
|
| -
|
| -void CheckThisNamedPropertyDefiner(
|
| - Local<Name> property, const v8::PropertyDescriptor& desc,
|
| - const v8::PropertyCallbackInfo<v8::Value>& info) {
|
| - CheckReturnValue(info, FUNCTION_ADDR(CheckThisNamedPropertyDefiner));
|
| - ApiTestFuzzer::Fuzz();
|
| - CHECK(info.This()
|
| - ->Equals(info.GetIsolate()->GetCurrentContext(), bottom)
|
| - .FromJust());
|
| -}
|
| -
|
| void CheckThisIndexedPropertySetter(
|
| uint32_t index, Local<Value> value,
|
| const v8::PropertyCallbackInfo<v8::Value>& info) {
|
| @@ -1123,435 +1103,6 @@
|
| .FromJust());
|
| }
|
|
|
| -namespace {
|
| -void NotInterceptingPropertyDefineCallback(
|
| - Local<Name> name, const v8::PropertyDescriptor& desc,
|
| - const v8::PropertyCallbackInfo<v8::Value>& info) {
|
| - // Do not intercept by not calling info.GetReturnValue().Set()
|
| -}
|
| -
|
| -void InterceptingPropertyDefineCallback(
|
| - Local<Name> name, const v8::PropertyDescriptor& desc,
|
| - const v8::PropertyCallbackInfo<v8::Value>& info) {
|
| - // intercept the callback by setting a non-empty handle
|
| - info.GetReturnValue().Set(name);
|
| -}
|
| -
|
| -void CheckDescriptorInDefineCallback(
|
| - Local<Name> name, const v8::PropertyDescriptor& desc,
|
| - const v8::PropertyCallbackInfo<v8::Value>& info) {
|
| - CHECK(!desc.has_writable());
|
| - CHECK(!desc.has_value());
|
| - CHECK(!desc.has_enumerable());
|
| - CHECK(desc.has_configurable());
|
| - CHECK(!desc.configurable());
|
| - CHECK(desc.has_get());
|
| - CHECK(desc.get()->IsFunction());
|
| - CHECK(desc.has_set());
|
| - CHECK(desc.set()->IsUndefined());
|
| - // intercept the callback by setting a non-empty handle
|
| - info.GetReturnValue().Set(name);
|
| -}
|
| -} // namespace
|
| -
|
| -THREADED_TEST(PropertyDefinerCallback) {
|
| - v8::HandleScope scope(CcTest::isolate());
|
| - LocalContext env;
|
| -
|
| - { // Intercept defineProperty()
|
| - v8::Local<v8::FunctionTemplate> templ =
|
| - v8::FunctionTemplate::New(CcTest::isolate());
|
| - templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration(
|
| - 0, 0, 0, 0, 0, NotInterceptingPropertyDefineCallback));
|
| - env->Global()
|
| - ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local())
|
| - .ToLocalChecked()
|
| - ->NewInstance(env.local())
|
| - .ToLocalChecked())
|
| - .FromJust();
|
| - const char* code =
|
| - "obj.x = 17; "
|
| - "Object.defineProperty(obj, 'x', {value: 42});"
|
| - "obj.x;";
|
| - CHECK_EQ(42, v8_compile(code)
|
| - ->Run(env.local())
|
| - .ToLocalChecked()
|
| - ->Int32Value(env.local())
|
| - .FromJust());
|
| - }
|
| -
|
| - { // Intercept defineProperty() for correct accessor descriptor
|
| - v8::Local<v8::FunctionTemplate> templ =
|
| - v8::FunctionTemplate::New(CcTest::isolate());
|
| - templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration(
|
| - 0, 0, 0, 0, 0, CheckDescriptorInDefineCallback));
|
| - env->Global()
|
| - ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local())
|
| - .ToLocalChecked()
|
| - ->NewInstance(env.local())
|
| - .ToLocalChecked())
|
| - .FromJust();
|
| - const char* code =
|
| - "obj.x = 17; "
|
| - "Object.defineProperty(obj, 'x', {"
|
| - "get: function(){ return 42; }, "
|
| - "set: undefined,"
|
| - "configurable: 0"
|
| - "});"
|
| - "obj.x;";
|
| - CHECK_EQ(17, v8_compile(code)
|
| - ->Run(env.local())
|
| - .ToLocalChecked()
|
| - ->Int32Value(env.local())
|
| - .FromJust());
|
| - }
|
| -
|
| - { // Do not intercept defineProperty()
|
| - v8::Local<v8::FunctionTemplate> templ2 =
|
| - v8::FunctionTemplate::New(CcTest::isolate());
|
| - templ2->InstanceTemplate()->SetHandler(
|
| - v8::NamedPropertyHandlerConfiguration(
|
| - 0, 0, 0, 0, 0, InterceptingPropertyDefineCallback));
|
| - env->Global()
|
| - ->Set(env.local(), v8_str("obj"), templ2->GetFunction(env.local())
|
| - .ToLocalChecked()
|
| - ->NewInstance(env.local())
|
| - .ToLocalChecked())
|
| - .FromJust();
|
| -
|
| - const char* code =
|
| - "obj.x = 17; "
|
| - "Object.defineProperty(obj, 'x', {value: 42});"
|
| - "obj.x;";
|
| - CHECK_EQ(17, v8_compile(code)
|
| - ->Run(env.local())
|
| - .ToLocalChecked()
|
| - ->Int32Value(env.local())
|
| - .FromJust());
|
| - }
|
| -}
|
| -
|
| -namespace {
|
| -void NotInterceptingPropertyDefineCallbackIndexed(
|
| - uint32_t index, const v8::PropertyDescriptor& desc,
|
| - const v8::PropertyCallbackInfo<v8::Value>& info) {
|
| - // Do not intercept by not calling info.GetReturnValue().Set()
|
| -}
|
| -
|
| -void InterceptingPropertyDefineCallbackIndexed(
|
| - uint32_t index, const v8::PropertyDescriptor& desc,
|
| - const v8::PropertyCallbackInfo<v8::Value>& info) {
|
| - // intercept the callback by setting a non-empty handle
|
| - info.GetReturnValue().Set(index);
|
| -}
|
| -
|
| -void CheckDescriptorInDefineCallbackIndexed(
|
| - uint32_t index, const v8::PropertyDescriptor& desc,
|
| - const v8::PropertyCallbackInfo<v8::Value>& info) {
|
| - CHECK(!desc.has_writable());
|
| - CHECK(!desc.has_value());
|
| - CHECK(desc.has_enumerable());
|
| - CHECK(desc.enumerable());
|
| - CHECK(!desc.has_configurable());
|
| - CHECK(desc.has_get());
|
| - CHECK(desc.get()->IsFunction());
|
| - CHECK(desc.has_set());
|
| - CHECK(desc.set()->IsUndefined());
|
| - // intercept the callback by setting a non-empty handle
|
| - info.GetReturnValue().Set(index);
|
| -}
|
| -} // namespace
|
| -
|
| -THREADED_TEST(PropertyDefinerCallbackIndexed) {
|
| - v8::HandleScope scope(CcTest::isolate());
|
| - LocalContext env;
|
| -
|
| - { // Intercept defineProperty()
|
| - v8::Local<v8::FunctionTemplate> templ =
|
| - v8::FunctionTemplate::New(CcTest::isolate());
|
| - templ->InstanceTemplate()->SetHandler(
|
| - v8::IndexedPropertyHandlerConfiguration(
|
| - 0, 0, 0, 0, 0, NotInterceptingPropertyDefineCallbackIndexed));
|
| - env->Global()
|
| - ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local())
|
| - .ToLocalChecked()
|
| - ->NewInstance(env.local())
|
| - .ToLocalChecked())
|
| - .FromJust();
|
| - const char* code =
|
| - "obj[2] = 17; "
|
| - "Object.defineProperty(obj, 2, {value: 42});"
|
| - "obj[2];";
|
| - CHECK_EQ(42, v8_compile(code)
|
| - ->Run(env.local())
|
| - .ToLocalChecked()
|
| - ->Int32Value(env.local())
|
| - .FromJust());
|
| - }
|
| -
|
| - { // Intercept defineProperty() for correct accessor descriptor
|
| - v8::Local<v8::FunctionTemplate> templ =
|
| - v8::FunctionTemplate::New(CcTest::isolate());
|
| - templ->InstanceTemplate()->SetHandler(
|
| - v8::IndexedPropertyHandlerConfiguration(
|
| - 0, 0, 0, 0, 0, CheckDescriptorInDefineCallbackIndexed));
|
| - env->Global()
|
| - ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local())
|
| - .ToLocalChecked()
|
| - ->NewInstance(env.local())
|
| - .ToLocalChecked())
|
| - .FromJust();
|
| - const char* code =
|
| - "obj[2] = 17; "
|
| - "Object.defineProperty(obj, 2, {"
|
| - "get: function(){ return 42; }, "
|
| - "set: undefined,"
|
| - "enumerable: true"
|
| - "});"
|
| - "obj[2];";
|
| - CHECK_EQ(17, v8_compile(code)
|
| - ->Run(env.local())
|
| - .ToLocalChecked()
|
| - ->Int32Value(env.local())
|
| - .FromJust());
|
| - }
|
| -
|
| - { // Do not intercept defineProperty()
|
| - v8::Local<v8::FunctionTemplate> templ2 =
|
| - v8::FunctionTemplate::New(CcTest::isolate());
|
| - templ2->InstanceTemplate()->SetHandler(
|
| - v8::IndexedPropertyHandlerConfiguration(
|
| - 0, 0, 0, 0, 0, InterceptingPropertyDefineCallbackIndexed));
|
| - env->Global()
|
| - ->Set(env.local(), v8_str("obj"), templ2->GetFunction(env.local())
|
| - .ToLocalChecked()
|
| - ->NewInstance(env.local())
|
| - .ToLocalChecked())
|
| - .FromJust();
|
| -
|
| - const char* code =
|
| - "obj[2] = 17; "
|
| - "Object.defineProperty(obj, 2, {value: 42});"
|
| - "obj[2];";
|
| - CHECK_EQ(17, v8_compile(code)
|
| - ->Run(env.local())
|
| - .ToLocalChecked()
|
| - ->Int32Value(env.local())
|
| - .FromJust());
|
| - }
|
| -}
|
| -
|
| -// Test that freeze() is intercepted.
|
| -THREADED_TEST(PropertyDefinerCallbackForFreeze) {
|
| - v8::HandleScope scope(CcTest::isolate());
|
| - LocalContext env;
|
| - v8::Local<v8::FunctionTemplate> templ =
|
| - v8::FunctionTemplate::New(CcTest::isolate());
|
| - templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration(
|
| - 0, 0, 0, 0, 0, InterceptingPropertyDefineCallback));
|
| - env->Global()
|
| - ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local())
|
| - .ToLocalChecked()
|
| - ->NewInstance(env.local())
|
| - .ToLocalChecked())
|
| - .FromJust();
|
| - const char* code =
|
| - "obj.x = 17; "
|
| - "Object.freeze(obj.x); "
|
| - "Object.isFrozen(obj.x);";
|
| -
|
| - CHECK(v8_compile(code)
|
| - ->Run(env.local())
|
| - .ToLocalChecked()
|
| - ->BooleanValue(env.local())
|
| - .FromJust());
|
| -}
|
| -
|
| -// Check that the descriptor passed to the callback is enumerable.
|
| -namespace {
|
| -void CheckEnumerablePropertyDefineCallback(
|
| - Local<Name> name, const v8::PropertyDescriptor& desc,
|
| - const v8::PropertyCallbackInfo<v8::Value>& info) {
|
| - CHECK(desc.has_value());
|
| - CHECK_EQ(42, desc.value()
|
| - ->Int32Value(info.GetIsolate()->GetCurrentContext())
|
| - .FromJust());
|
| - CHECK(desc.has_enumerable());
|
| - CHECK(desc.enumerable());
|
| - CHECK(!desc.has_writable());
|
| -
|
| - // intercept the callback by setting a non-empty handle
|
| - info.GetReturnValue().Set(name);
|
| -}
|
| -} // namespace
|
| -THREADED_TEST(PropertyDefinerCallbackEnumerable) {
|
| - v8::HandleScope scope(CcTest::isolate());
|
| - LocalContext env;
|
| - v8::Local<v8::FunctionTemplate> templ =
|
| - v8::FunctionTemplate::New(CcTest::isolate());
|
| - templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration(
|
| - 0, 0, 0, 0, 0, CheckEnumerablePropertyDefineCallback));
|
| - env->Global()
|
| - ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local())
|
| - .ToLocalChecked()
|
| - ->NewInstance(env.local())
|
| - .ToLocalChecked())
|
| - .FromJust();
|
| - const char* code =
|
| - "obj.x = 17; "
|
| - "Object.defineProperty(obj, 'x', {value: 42, enumerable: true});"
|
| - "obj.x;";
|
| - CHECK_EQ(17, v8_compile(code)
|
| - ->Run(env.local())
|
| - .ToLocalChecked()
|
| - ->Int32Value(env.local())
|
| - .FromJust());
|
| -}
|
| -
|
| -// Check that the descriptor passed to the callback is configurable.
|
| -namespace {
|
| -void CheckConfigurablePropertyDefineCallback(
|
| - Local<Name> name, const v8::PropertyDescriptor& desc,
|
| - const v8::PropertyCallbackInfo<v8::Value>& info) {
|
| - CHECK(desc.has_value());
|
| - CHECK_EQ(42, desc.value()
|
| - ->Int32Value(info.GetIsolate()->GetCurrentContext())
|
| - .FromJust());
|
| - CHECK(desc.has_configurable());
|
| - CHECK(desc.configurable());
|
| -
|
| - // intercept the callback by setting a non-empty handle
|
| - info.GetReturnValue().Set(name);
|
| -}
|
| -} // namespace
|
| -THREADED_TEST(PropertyDefinerCallbackConfigurable) {
|
| - v8::HandleScope scope(CcTest::isolate());
|
| - LocalContext env;
|
| - v8::Local<v8::FunctionTemplate> templ =
|
| - v8::FunctionTemplate::New(CcTest::isolate());
|
| - templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration(
|
| - 0, 0, 0, 0, 0, CheckConfigurablePropertyDefineCallback));
|
| - env->Global()
|
| - ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local())
|
| - .ToLocalChecked()
|
| - ->NewInstance(env.local())
|
| - .ToLocalChecked())
|
| - .FromJust();
|
| - const char* code =
|
| - "obj.x = 17; "
|
| - "Object.defineProperty(obj, 'x', {value: 42, configurable: true});"
|
| - "obj.x;";
|
| - CHECK_EQ(17, v8_compile(code)
|
| - ->Run(env.local())
|
| - .ToLocalChecked()
|
| - ->Int32Value(env.local())
|
| - .FromJust());
|
| -}
|
| -
|
| -// Check that the descriptor passed to the callback is writable.
|
| -namespace {
|
| -void CheckWritablePropertyDefineCallback(
|
| - Local<Name> name, const v8::PropertyDescriptor& desc,
|
| - const v8::PropertyCallbackInfo<v8::Value>& info) {
|
| - CHECK(desc.has_writable());
|
| - CHECK(desc.writable());
|
| -
|
| - // intercept the callback by setting a non-empty handle
|
| - info.GetReturnValue().Set(name);
|
| -}
|
| -} // namespace
|
| -THREADED_TEST(PropertyDefinerCallbackWritable) {
|
| - v8::HandleScope scope(CcTest::isolate());
|
| - LocalContext env;
|
| - v8::Local<v8::FunctionTemplate> templ =
|
| - v8::FunctionTemplate::New(CcTest::isolate());
|
| - templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration(
|
| - 0, 0, 0, 0, 0, CheckWritablePropertyDefineCallback));
|
| - env->Global()
|
| - ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local())
|
| - .ToLocalChecked()
|
| - ->NewInstance(env.local())
|
| - .ToLocalChecked())
|
| - .FromJust();
|
| - const char* code =
|
| - "obj.x = 17; "
|
| - "Object.defineProperty(obj, 'x', {value: 42, writable: true});"
|
| - "obj.x;";
|
| - CHECK_EQ(17, v8_compile(code)
|
| - ->Run(env.local())
|
| - .ToLocalChecked()
|
| - ->Int32Value(env.local())
|
| - .FromJust());
|
| -}
|
| -
|
| -// Check that the descriptor passed to the callback has a getter.
|
| -namespace {
|
| -void CheckGetterPropertyDefineCallback(
|
| - Local<Name> name, const v8::PropertyDescriptor& desc,
|
| - const v8::PropertyCallbackInfo<v8::Value>& info) {
|
| - CHECK(desc.has_get());
|
| - CHECK(!desc.has_set());
|
| - // intercept the callback by setting a non-empty handle
|
| - info.GetReturnValue().Set(name);
|
| -}
|
| -} // namespace
|
| -THREADED_TEST(PropertyDefinerCallbackWithGetter) {
|
| - v8::HandleScope scope(CcTest::isolate());
|
| - LocalContext env;
|
| - v8::Local<v8::FunctionTemplate> templ =
|
| - v8::FunctionTemplate::New(CcTest::isolate());
|
| - templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration(
|
| - 0, 0, 0, 0, 0, CheckGetterPropertyDefineCallback));
|
| - env->Global()
|
| - ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local())
|
| - .ToLocalChecked()
|
| - ->NewInstance(env.local())
|
| - .ToLocalChecked())
|
| - .FromJust();
|
| - const char* code =
|
| - "obj.x = 17;"
|
| - "Object.defineProperty(obj, 'x', {get: function() {return 42;}});"
|
| - "obj.x;";
|
| - CHECK_EQ(17, v8_compile(code)
|
| - ->Run(env.local())
|
| - .ToLocalChecked()
|
| - ->Int32Value(env.local())
|
| - .FromJust());
|
| -}
|
| -
|
| -// Check that the descriptor passed to the callback has a setter.
|
| -namespace {
|
| -void CheckSetterPropertyDefineCallback(
|
| - Local<Name> name, const v8::PropertyDescriptor& desc,
|
| - const v8::PropertyCallbackInfo<v8::Value>& info) {
|
| - CHECK(desc.has_set());
|
| - CHECK(!desc.has_get());
|
| - // intercept the callback by setting a non-empty handle
|
| - info.GetReturnValue().Set(name);
|
| -}
|
| -} // namespace
|
| -THREADED_TEST(PropertyDefinerCallbackWithSetter) {
|
| - v8::HandleScope scope(CcTest::isolate());
|
| - LocalContext env;
|
| - v8::Local<v8::FunctionTemplate> templ =
|
| - v8::FunctionTemplate::New(CcTest::isolate());
|
| - templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration(
|
| - 0, 0, 0, 0, 0, CheckSetterPropertyDefineCallback));
|
| - env->Global()
|
| - ->Set(env.local(), v8_str("obj"), templ->GetFunction(env.local())
|
| - .ToLocalChecked()
|
| - ->NewInstance(env.local())
|
| - .ToLocalChecked())
|
| - .FromJust();
|
| - const char* code =
|
| - "Object.defineProperty(obj, 'x', {set: function() {return 42;}});"
|
| - "obj.x = 17;";
|
| - CHECK_EQ(17, v8_compile(code)
|
| - ->Run(env.local())
|
| - .ToLocalChecked()
|
| - ->Int32Value(env.local())
|
| - .FromJust());
|
| -}
|
|
|
| int echo_indexed_call_count = 0;
|
|
|
| @@ -1599,12 +1150,12 @@
|
| templ->InstanceTemplate()->SetHandler(v8::IndexedPropertyHandlerConfiguration(
|
| CheckThisIndexedPropertyHandler, CheckThisIndexedPropertySetter,
|
| CheckThisIndexedPropertyQuery, CheckThisIndexedPropertyDeleter,
|
| - CheckThisIndexedPropertyEnumerator, CheckThisIndexedPropertyDefiner));
|
| + CheckThisIndexedPropertyEnumerator));
|
|
|
| templ->InstanceTemplate()->SetHandler(v8::NamedPropertyHandlerConfiguration(
|
| CheckThisNamedPropertyHandler, CheckThisNamedPropertySetter,
|
| CheckThisNamedPropertyQuery, CheckThisNamedPropertyDeleter,
|
| - CheckThisNamedPropertyEnumerator, CheckThisNamedPropertyDefiner));
|
| + CheckThisNamedPropertyEnumerator));
|
|
|
| bottom = templ->GetFunction(env.local())
|
| .ToLocalChecked()
|
| @@ -1641,10 +1192,6 @@
|
|
|
| // Enumerators.
|
| CompileRun("for (var p in obj) ;");
|
| -
|
| - // Indexed and named definer.
|
| - CompileRun("Object.defineProperty(obj, 2, {});");
|
| - CompileRun("Object.defineProperty(obj, 'z', {});");
|
| }
|
|
|
|
|
|
|