diff --git a/harness/proxyTrapsHelper.js b/harness/proxyTrapsHelper.js new file mode 100644 index 0000000000000000000000000000000000000000..62a02b74d07296d60af48b1bff12604259eabbb7 --- /dev/null +++ b/harness/proxyTrapsHelper.js @@ -0,0 +1,22 @@ +function throwTest262Error(msg) { + return function () { throw new Test262Error(msg); }; +} +function allowProxyTraps(overrides) { + if (!overrides) { overrides = {}; } + var traps = { + getPrototypeOf: overrides.getPrototypeOf || throwTest262Error('[[GetPrototypeOf]] trap called'), + setPrototypeOf: overrides.setPrototypeOf || throwTest262Error('[[SetPrototypeOf]] trap called'), + isExtensible: overrides.isExtensible || throwTest262Error('[[IsExtensible]] trap called'), + preventExtensions: overrides.preventExtensions || throwTest262Error('[[PreventExtensions]] trap called'), + getOwnPropertyDescriptor: overrides.getOwnPropertyDescriptor || throwTest262Error('[[GetOwnProperty]] trap called'), + has: overrides.has || throwTest262Error('[[HasProperty]] trap called'), + get: overrides.get || throwTest262Error('[[Get]] trap called'), + set: overrides.set || throwTest262Error('[[Set]] trap called'), + deleteProperty: overrides.deleteProperty || throwTest262Error('[[Delete]] trap called'), + defineProperty: overrides.defineProperty || throwTest262Error('[[DefineOwnProperty]] trap called'), + enumerate: throwTest262Error('[[Enumerate]] trap called: this trap has been removed'), + ownKeys: overrides.ownKeys || throwTest262Error('[[OwnPropertyKeys]] trap called'), + apply: overrides.apply || throwTest262Error('[[Call]] trap called'), + construct: overrides.construct || throwTest262Error('[[Construct]] trap called') + }; +} diff --git a/test/built-ins/Object/entries/observable-operations.js b/test/built-ins/Object/entries/observable-operations.js index f8916c285d591f10e0b50a0ea6ebccb1979222fb..f1c4b41b2e26c9c32d373a576a66ed9f2b8bb230 100644 --- a/test/built-ins/Object/entries/observable-operations.js +++ b/test/built-ins/Object/entries/observable-operations.js @@ -6,11 +6,12 @@ id: sec-object.entries description: Object.entries should perform observable operations in the correct order author: Jordan Harband features: [Proxy] +includes: [proxyTrapsHelper.js] ---*/ var log = ""; var object = { a: 0, b: 0, c: 0 }; -var handler = { +var handler = allowProxyTraps({ get: function (target, propertyKey, receiver) { assert.sameValue(target, object, "get target"); assert.sameValue(receiver, proxy, "get receiver"); @@ -26,23 +27,14 @@ var handler = { assert.sameValue(target, object, "ownKeys"); log += "|ownKeys"; return Object.getOwnPropertyNames(target); - }, - deleteProperty: function (oTarget, sKey) { - throw new Test262Error('properties should not be deleted'); - }, - defineProperty: function (oTarget, sKey, oDesc) { - throw new Test262Error('properties should not be defined'); - }, - set: function (oTarget, sKey, vValue) { - throw new Test262Error('properties should not be assigned'); } -}; -var check = { +}); +var check = allowProxyTraps({ get: function (target, propertyKey, receiver) { assert(propertyKey in target, "handler check: " + propertyKey); return target[propertyKey]; } -}; +}); var proxy = new Proxy(object, new Proxy(handler, check)); var result = Object.entries(proxy); assert.sameValue(log, "|ownKeys|getOwnPropertyDescriptor:a|get:a|getOwnPropertyDescriptor:b|get:b|getOwnPropertyDescriptor:c|get:c", log); diff --git a/test/built-ins/Object/getOwnPropertyDescriptors/observable-operations.js b/test/built-ins/Object/getOwnPropertyDescriptors/observable-operations.js index ffd237338c9b5ab6c67dd4051632b100bfcf2738..c5af08299865fdb2e14278e4c13e12c9c58219c2 100644 --- a/test/built-ins/Object/getOwnPropertyDescriptors/observable-operations.js +++ b/test/built-ins/Object/getOwnPropertyDescriptors/observable-operations.js @@ -6,14 +6,12 @@ description: Object.getOwnPropertyDescriptors should perform observable operatio id: pending author: Jordan Harband features: [Proxy] +includes: [proxyTrapsHelper.js] ---*/ var log = ""; var object = { a: 0, b: 0, c: 0 }; -var handler = { - get: function (target, propertyKey, receiver) { - throw new Test262Error('no values should be retrieved via [[Get]]'); - }, +var handler = allowProxyTraps({ getOwnPropertyDescriptor: function (target, propertyKey) { assert.sameValue(target, object, "getOwnPropertyDescriptor"); log += "|getOwnPropertyDescriptor:" + propertyKey; @@ -23,23 +21,14 @@ var handler = { assert.sameValue(target, object, "ownKeys"); log += "|ownKeys"; return Object.getOwnPropertyNames(target); - }, - deleteProperty: function (oTarget, sKey) { - throw new Test262Error('properties should not be deleted'); - }, - defineProperty: function (oTarget, sKey, oDesc) { - throw new Test262Error('properties should not be defined'); - }, - set: function (oTarget, sKey, vValue) { - throw new Test262Error('properties should not be assigned'); } -}; -var check = { +}); +var check = allowProxyTraps({ get: function (target, propertyKey, receiver) { assert(propertyKey in target, "handler check: " + propertyKey); return target[propertyKey]; } -}; +}); var proxy = new Proxy(object, new Proxy(handler, check)); var result = Object.getOwnPropertyDescriptors(proxy); assert.sameValue(log, "|ownKeys|getOwnPropertyDescriptor:a|getOwnPropertyDescriptor:b|getOwnPropertyDescriptor:c", 'log'); diff --git a/test/built-ins/Object/values/observable-operations.js b/test/built-ins/Object/values/observable-operations.js index c68ca98334f9391cee6102d6fb728629f55bf009..b3f0ab4581bdb07c998a789ea05523128acbef3c 100644 --- a/test/built-ins/Object/values/observable-operations.js +++ b/test/built-ins/Object/values/observable-operations.js @@ -6,11 +6,12 @@ id: sec-object.values description: Object.values should perform observable operations in the correct order author: Jordan Harband features: [Proxy] +includes: [proxyTrapsHelper.js] ---*/ var log = ""; var object = { a: 0, b: 0, c: 0 }; -var handler = { +var handler = allowProxyTraps({ get: function (target, propertyKey, receiver) { assert.sameValue(target, object, "get target"); assert.sameValue(receiver, proxy, "get receiver"); @@ -26,23 +27,14 @@ var handler = { assert.sameValue(target, object, "ownKeys"); log += "|ownKeys"; return Object.getOwnPropertyNames(target); - }, - deleteProperty: function (oTarget, sKey) { - throw new Test262Error('properties should not be deleted'); - }, - defineProperty: function (oTarget, sKey, oDesc) { - throw new Test262Error('properties should not be defined'); - }, - set: function (oTarget, sKey, vValue) { - throw new Test262Error('properties should not be assigned'); } -}; -var check = { +}); +var check = allowProxyTraps({ get: function (target, propertyKey, receiver) { assert(propertyKey in target, "handler check: " + propertyKey); return target[propertyKey]; } -}; +}); var proxy = new Proxy(object, new Proxy(handler, check)); var result = Object.values(proxy); assert.sameValue(log, "|ownKeys|getOwnPropertyDescriptor:a|get:a|getOwnPropertyDescriptor:b|get:b|getOwnPropertyDescriptor:c|get:c", log); diff --git a/test/harness/proxytrapshelper-default.js b/test/harness/proxytrapshelper-default.js new file mode 100644 index 0000000000000000000000000000000000000000..a4613f6824bd1e60d9468a9535d763192a7b29b9 --- /dev/null +++ b/test/harness/proxytrapshelper-default.js @@ -0,0 +1,40 @@ +// Copyright (C) 2016 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: allowProxyTraps helper should default throw on all the proxy trap named methods being invoked +id: pending +author: Jordan Harband +includes: [proxyTrapsHelper.js] +---*/ + +var traps = allowProxyTraps(); + +function assertTrapThrows(trap) { + if (typeof traps[trap] !== 'function') { + throw new Test262Error('trap ' + trap + ' is not a function'); + } + var failedToThrow = false; + try { + traps[trap](); + failedToThrow = true; + } catch (e) {} + if (failedToThrow) { + throw new Test262Error('trap ' + trap + ' did not throw an error'); + } +} + +assertTrapThrows('getPrototypeOf'); +assertTrapThrows('setPrototypeOf'); +assertTrapThrows('isExtensible'); +assertTrapThrows('preventExtensions'); +assertTrapThrows('getOwnPropertyDescriptor'); +assertTrapThrows('has'); +assertTrapThrows('get'); +assertTrapThrows('set'); +assertTrapThrows('deleteProperty'); +assertTrapThrows('defineProperty'); +assertTrapThrows('enumerate'); +assertTrapThrows('ownKeys'); +assertTrapThrows('apply'); +assertTrapThrows('construct'); diff --git a/test/harness/proxytrapshelper-overrides.js b/test/harness/proxytrapshelper-overrides.js new file mode 100644 index 0000000000000000000000000000000000000000..4d10d2a66fb8887d48e4c08a6891a6d4bdee28cd --- /dev/null +++ b/test/harness/proxytrapshelper-overrides.js @@ -0,0 +1,71 @@ +// Copyright (C) 2016 Jordan Harband. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: allowProxyTraps helper should default throw on all the proxy trap named methods being invoked +id: pending +author: Jordan Harband +includes: [proxyTrapsHelper.js] +---*/ + +var traps = allowProxyTraps({ + getPrototypeOf: function () {}, + setPrototypeOf: function () {}, + isExtensible: function () {}, + preventExtensions: function () {}, + getOwnPropertyDescriptor: function () {}, + has: function () {}, + get: function () {}, + set: function () {}, + deleteProperty: function () {}, + defineProperty: function () {}, + enumerate: function () {}, + ownKeys: function () {}, + apply: function () {}, + construct: function () {}, +}); + +function assertTrapSucceeds(trap) { + if (typeof traps[trap] !== 'function') { + throw new Test262Error('trap ' + trap + ' is not a function'); + } + var threw = false; + try { + traps[trap](); + threw = true; + } catch (e) {} + if (threw) { + throw new Test262Error('trap ' + trap + ' threw an error'); + } +} + +function assertTrapThrows(trap) { + if (typeof traps[trap] !== 'function') { + throw new Test262Error('trap ' + trap + ' is not a function'); + } + var failedToThrow = false; + try { + traps[trap](); + failedToThrow = true; + } catch (e) {} + if (failedToThrow) { + throw new Test262Error('trap ' + trap + ' did not throw an error'); + } +} + +assertTrapSucceeds('getPrototypeOf'); +assertTrapSucceeds('setPrototypeOf'); +assertTrapSucceeds('isExtensible'); +assertTrapSucceeds('preventExtensions'); +assertTrapSucceeds('getOwnPropertyDescriptor'); +assertTrapSucceeds('has'); +assertTrapSucceeds('get'); +assertTrapSucceeds('set'); +assertTrapSucceeds('deleteProperty'); +assertTrapSucceeds('defineProperty'); +assertTrapSucceeds('ownKeys'); +assertTrapSucceeds('apply'); +assertTrapSucceeds('construct'); + +// enumerate should always throw because the trap has been removed +assertTrapThrows('enumerate');