| Index: test/mjsunit/strong/load-proxy.js
|
| diff --git a/test/mjsunit/strong/load-proxy.js b/test/mjsunit/strong/load-proxy.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..72904ceb59d54fafd85539de9dd26bfbd0af4fe1
|
| --- /dev/null
|
| +++ b/test/mjsunit/strong/load-proxy.js
|
| @@ -0,0 +1,96 @@
|
| +// Copyright 2015 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.
|
| +
|
| +// Flags: --harmony-proxies --strong-mode
|
| +
|
| +// Forwarding proxies adapted from proposal definition
|
| +function handlerMaker1(obj) {
|
| + return {
|
| + getPropertyDescriptor: function(name) {
|
| + var desc;
|
| + var searchObj = obj;
|
| + while (desc === undefined && searchObj != null) {
|
| + desc = Object.getOwnPropertyDescriptor(searchObj, name);
|
| + searchObj = searchObj.__proto__;
|
| + }
|
| + // a trapping proxy's properties must always be configurable
|
| + if (desc !== undefined) { desc.configurable = true; }
|
| + return desc;
|
| + },
|
| + fix: function() {
|
| + if (Object.isFrozen(obj)) {
|
| + var result = {};
|
| + Object.getOwnPropertyNames(obj).forEach(function(name) {
|
| + result[name] = Object.getOwnPropertyDescriptor(obj, name);
|
| + });
|
| + return result;
|
| + }
|
| + // As long as obj is not frozen, the proxy won't allow itself to be fixed
|
| + return undefined; // will cause a TypeError to be thrown
|
| + }
|
| + };
|
| +}
|
| +function handlerMaker2(obj) {
|
| + return {
|
| + get: function(receiver, name) {
|
| + return obj[name];
|
| + },
|
| + fix: function() {
|
| + if (Object.isFrozen(obj)) {
|
| + var result = {};
|
| + Object.getOwnPropertyNames(obj).forEach(function(name) {
|
| + result[name] = Object.getOwnPropertyDescriptor(obj, name);
|
| + });
|
| + return result;
|
| + }
|
| + // As long as obj is not frozen, the proxy won't allow itself to be fixed
|
| + return undefined; // will cause a TypeError to be thrown
|
| + }
|
| + };
|
| +}
|
| +var baseObj = {};
|
| +var proxy1 = Proxy.create(handlerMaker1(baseObj));
|
| +var proxy2 = Proxy.create(handlerMaker2(baseObj));
|
| +var childObj1 = { __proto__: proxy1 };
|
| +var childObj2 = { __proto__: proxy2 };
|
| +var childObjAccessor1 = { set foo(_){}, set "1"(_){}, __proto__: proxy1 };
|
| +var childObjAccessor2 = { set foo(_){}, set "1"(_){}, __proto__: proxy2 };
|
| +
|
| +(function() {
|
| + "use strong";
|
| + // TODO(conradw): These asserts are sanity checking V8's proxy implementation.
|
| + // Strong mode semantics for ES6 proxies still need to be explored.
|
| + assertDoesNotThrow(function(){proxy1.foo});
|
| + assertDoesNotThrow(function(){proxy1[1]});
|
| + assertDoesNotThrow(function(){proxy2.foo});
|
| + assertDoesNotThrow(function(){proxy2[1]});
|
| + assertDoesNotThrow(function(){childObj1.foo});
|
| + assertDoesNotThrow(function(){childObj1[1]});
|
| + assertDoesNotThrow(function(){childObj2.foo});
|
| + assertDoesNotThrow(function(){childObj2[1]});
|
| + assertThrows(function(){baseObj.foo}, TypeError);
|
| + assertThrows(function(){baseObj[1]}, TypeError);
|
| + assertThrows(function(){childObjAccessor1.foo}, TypeError);
|
| + assertThrows(function(){childObjAccessor1[1]}, TypeError);
|
| + assertThrows(function(){childObjAccessor2.foo}, TypeError);
|
| + assertThrows(function(){childObjAccessor2[1]}, TypeError);
|
| +
|
| + // Once the proxy is no longer trapping, property access should have strong
|
| + // semantics.
|
| + Object.freeze(baseObj);
|
| + Object.freeze(proxy1);
|
| + Object.freeze(proxy2);
|
| + assertThrows(function(){proxy1.foo}, TypeError);
|
| + assertThrows(function(){proxy1[1]}, TypeError);
|
| + assertThrows(function(){proxy2.foo}, TypeError);
|
| + assertThrows(function(){proxy2[1]}, TypeError);
|
| + assertThrows(function(){childObj1.foo}, TypeError);
|
| + assertThrows(function(){childObj1[1]}, TypeError);
|
| + assertThrows(function(){childObj2.foo}, TypeError);
|
| + assertThrows(function(){childObj2[1]}, TypeError);
|
| + assertThrows(function(){childObjAccessor1.foo}, TypeError);
|
| + assertThrows(function(){childObjAccessor1[1]}, TypeError);
|
| + assertThrows(function(){childObjAccessor2.foo}, TypeError);
|
| + assertThrows(function(){childObjAccessor2[1]}, TypeError);
|
| +})();
|
|
|