| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stdlib.h> | 5 #include <stdlib.h> |
| 6 | 6 |
| 7 #include "test/cctest/test-api.h" | 7 #include "test/cctest/test-api.h" |
| 8 | 8 |
| 9 #include "include/v8-util.h" | 9 #include "include/v8-util.h" |
| 10 #include "src/api.h" | 10 #include "src/api.h" |
| (...skipping 1555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1566 ->BooleanValue(env.local()) | 1566 ->BooleanValue(env.local()) |
| 1567 .FromJust()); | 1567 .FromJust()); |
| 1568 CHECK(v8_compile("delete obj.myProperty") | 1568 CHECK(v8_compile("delete obj.myProperty") |
| 1569 ->Run(env.local()) | 1569 ->Run(env.local()) |
| 1570 .ToLocalChecked() | 1570 .ToLocalChecked() |
| 1571 ->BooleanValue(env.local()) | 1571 ->BooleanValue(env.local()) |
| 1572 .FromJust()); | 1572 .FromJust()); |
| 1573 } | 1573 } |
| 1574 | 1574 |
| 1575 namespace { | 1575 namespace { |
| 1576 int definer_was_called; |
| 1577 |
| 1576 void NotInterceptingPropertyDefineCallback( | 1578 void NotInterceptingPropertyDefineCallback( |
| 1577 Local<Name> name, const v8::PropertyDescriptor& desc, | 1579 Local<Name> name, const v8::PropertyDescriptor& desc, |
| 1578 const v8::PropertyCallbackInfo<v8::Value>& info) { | 1580 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 1581 definer_was_called++; |
| 1579 // Do not intercept by not calling info.GetReturnValue().Set(). | 1582 // Do not intercept by not calling info.GetReturnValue().Set(). |
| 1580 } | 1583 } |
| 1581 | 1584 |
| 1582 void InterceptingPropertyDefineCallback( | 1585 void InterceptingPropertyDefineCallback( |
| 1583 Local<Name> name, const v8::PropertyDescriptor& desc, | 1586 Local<Name> name, const v8::PropertyDescriptor& desc, |
| 1584 const v8::PropertyCallbackInfo<v8::Value>& info) { | 1587 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 1585 // Intercept the callback by setting a non-empty handle | 1588 // Intercept the callback by setting a non-empty handle |
| 1589 definer_was_called++; |
| 1586 info.GetReturnValue().Set(name); | 1590 info.GetReturnValue().Set(name); |
| 1587 } | 1591 } |
| 1588 | 1592 |
| 1589 void CheckDescriptorInDefineCallback( | 1593 void CheckDescriptorInDefineCallback( |
| 1590 Local<Name> name, const v8::PropertyDescriptor& desc, | 1594 Local<Name> name, const v8::PropertyDescriptor& desc, |
| 1591 const v8::PropertyCallbackInfo<v8::Value>& info) { | 1595 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 1592 CHECK(!desc.has_writable()); | 1596 CHECK(!desc.has_writable()); |
| 1593 CHECK(!desc.has_value()); | 1597 CHECK(!desc.has_value()); |
| 1594 CHECK(!desc.has_enumerable()); | 1598 CHECK(!desc.has_enumerable()); |
| 1595 CHECK(desc.has_configurable()); | 1599 CHECK(desc.has_configurable()); |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1809 "Object.freeze(obj.x); " | 1813 "Object.freeze(obj.x); " |
| 1810 "Object.isFrozen(obj.x);"; | 1814 "Object.isFrozen(obj.x);"; |
| 1811 | 1815 |
| 1812 CHECK(v8_compile(code) | 1816 CHECK(v8_compile(code) |
| 1813 ->Run(env.local()) | 1817 ->Run(env.local()) |
| 1814 .ToLocalChecked() | 1818 .ToLocalChecked() |
| 1815 ->BooleanValue(env.local()) | 1819 ->BooleanValue(env.local()) |
| 1816 .FromJust()); | 1820 .FromJust()); |
| 1817 } | 1821 } |
| 1818 | 1822 |
| 1823 // Check that the define interceptor is not triggered for DefineProperty |
| 1824 // with the kSkip flag. |
| 1825 THREADED_TEST(DefinePropertyWithoutInterceptors) { |
| 1826 v8::Isolate* isolate = CcTest::isolate(); |
| 1827 v8::HandleScope scope(isolate); |
| 1828 v8::Local<v8::ObjectTemplate> templ = ObjectTemplate::New(isolate); |
| 1829 |
| 1830 templ->SetHandler(v8::NamedPropertyHandlerConfiguration( |
| 1831 nullptr, nullptr, nullptr, nullptr, nullptr, |
| 1832 InterceptingPropertyDefineCallback)); |
| 1833 |
| 1834 LocalContext context; |
| 1835 v8::Local<v8::Name> p; |
| 1836 |
| 1837 v8::Local<v8::Object> obj = |
| 1838 templ->NewInstance(context.local()).ToLocalChecked(); |
| 1839 |
| 1840 definer_was_called = 0; |
| 1841 |
| 1842 // Use a generic descriptor. |
| 1843 v8::PropertyDescriptor desc_generic; |
| 1844 |
| 1845 p = v8_str("foo"); |
| 1846 |
| 1847 // kDontSkip (default) triggers the interceptors when setting |
| 1848 // own property of an object. |
| 1849 CHECK(obj->DefineProperty(context.local(), p, desc_generic).FromJust()); |
| 1850 CHECK_EQ(1, definer_was_called); |
| 1851 |
| 1852 definer_was_called = 0; |
| 1853 |
| 1854 // kSkip does not trigger the interceptors. |
| 1855 CHECK(obj->DefineProperty(context.local(), p, desc_generic, |
| 1856 v8::CallInterceptors::kSkip) |
| 1857 .FromJust()); |
| 1858 CHECK_EQ(0, definer_was_called); |
| 1859 } |
| 1860 |
| 1819 // Check that the descriptor passed to the callback is enumerable. | 1861 // Check that the descriptor passed to the callback is enumerable. |
| 1820 namespace { | 1862 namespace { |
| 1821 void CheckEnumerablePropertyDefineCallback( | 1863 void CheckEnumerablePropertyDefineCallback( |
| 1822 Local<Name> name, const v8::PropertyDescriptor& desc, | 1864 Local<Name> name, const v8::PropertyDescriptor& desc, |
| 1823 const v8::PropertyCallbackInfo<v8::Value>& info) { | 1865 const v8::PropertyCallbackInfo<v8::Value>& info) { |
| 1824 CHECK(desc.has_value()); | 1866 CHECK(desc.has_value()); |
| 1825 CHECK_EQ(42, desc.value() | 1867 CHECK_EQ(42, desc.value() |
| 1826 ->Int32Value(info.GetIsolate()->GetCurrentContext()) | 1868 ->Int32Value(info.GetIsolate()->GetCurrentContext()) |
| 1827 .FromJust()); | 1869 .FromJust()); |
| 1828 CHECK(desc.has_enumerable()); | 1870 CHECK(desc.has_enumerable()); |
| (...skipping 3185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5014 ->Set(env.local(), v8_str("Fun"), | 5056 ->Set(env.local(), v8_str("Fun"), |
| 5015 fun_templ->GetFunction(env.local()).ToLocalChecked()) | 5057 fun_templ->GetFunction(env.local()).ToLocalChecked()) |
| 5016 .FromJust()); | 5058 .FromJust()); |
| 5017 | 5059 |
| 5018 CompileRun( | 5060 CompileRun( |
| 5019 "var f = new Fun();" | 5061 "var f = new Fun();" |
| 5020 "Number.prototype.__proto__ = f;" | 5062 "Number.prototype.__proto__ = f;" |
| 5021 "var a = 42;" | 5063 "var a = 42;" |
| 5022 "for (var i = 0; i<3; i++) { a.foo; }"); | 5064 "for (var i = 0; i<3; i++) { a.foo; }"); |
| 5023 } | 5065 } |
| OLD | NEW |