| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- WScript.LoadScriptFile("..\\UnitTestFramework\\UnitTestFramework.js");
- var tests = [
- {
- name: "Setting proxy object on Map and WeakMap",
- body() {
- [WeakMap, Map].forEach(function(ctor) {
- var target = {};
- let p = new Proxy(target, {});
- let map = new ctor();
- map.set(p, 101);
- assert.areEqual(map.get(p), 101, ctor.name + " map should be able to set and get the proxy object");
- p.x = 20;
- assert.areEqual(target.x, 20, "target object should work as expected even after proxy object is added to map");
- });
- }
- },
- {
- name: "Setting proxy object on Map and WeakMap - multiple sets and delete",
- body() {
- [WeakMap, Map].forEach(function(ctor) {
- var target = {};
- let p = new Proxy(target, {});
- let map = new ctor();
- map.set(p, 101);
- assert.areEqual(map.get(p), 101);
- map.delete(p);
- assert.areEqual(map.get(p), undefined, ctor.name + " map can remove the proxy object properly");
- map.set(p, 102);
- assert.areEqual(map.get(p), 102, ctor.name + " proxy object can be set again and it returns 102");
- p.x = 20;
- assert.areEqual(target.x, 20, "target object should work as expected even after proxy object is added to map");
- });
- }
- },
- {
- name: "Assertion validation : returning descriptor during getOwnPropertyDescriptor should not pollute the descriptor",
- body() {
- var target = {};
- var handler = {};
- var getOwnPropertyDescriptorCalled = false;
- handler['defineProperty'] = function () {
- assert.fail("This function will not be called as 'getOwnPropertyDescriptor' will add accessor");
- };
-
- handler['getOwnPropertyDescriptor'] = function (t, property) {
- getOwnPropertyDescriptorCalled = true;
- Object.defineProperty(t, 'abc', { set: function () { } });
- return Reflect.getOwnPropertyDescriptor(t, property);
- };
-
- var proxy = new Proxy(target, handler);
- proxy.abc = undefined;
- assert.isTrue(getOwnPropertyDescriptorCalled);
- }
- },
- {
- name: "Assertion validation : returning descriptor with writable false should not defineProperty again.",
- body() {
- var target = {};
- var handler = {};
- var getOwnPropertyDescriptorCalled = false;
- handler['defineProperty'] = function () {
- assert.fail("This function will not be called as 'getOwnPropertyDescriptor' will add property with writable false");
- };
-
- handler['getOwnPropertyDescriptor'] = function (t, property) {
- getOwnPropertyDescriptorCalled = true;
- Object.defineProperty(t, 'abc', { value : 1, writable : false });
- return Reflect.getOwnPropertyDescriptor(t, property);
- };
-
- var proxy = new Proxy(target, handler);
- proxy.abc = undefined;
- assert.isTrue(getOwnPropertyDescriptorCalled);
- }
- },
- {
- name: "No property found at getOwnPropertyDescriptor will call defineProperty",
- body() {
- var target = {};
- var handler = {};
- var definePropertyCalled = false;
- var getOwnPropertyDescriptorCalled = false;
- handler['defineProperty'] = function () {
- definePropertyCalled = true;
- };
-
- handler['getOwnPropertyDescriptor'] = function (t, property) {
- getOwnPropertyDescriptorCalled = true;
- return Reflect.getOwnPropertyDescriptor(t, property);
- };
-
- var proxy = new Proxy(target, handler);
- proxy.abc = undefined;
- assert.isTrue(definePropertyCalled);
- assert.isTrue(getOwnPropertyDescriptorCalled);
- }
- },
- {
- name: "Cross-site on proxy exercising function trap - no function handler provided",
- body() {
- var targetCalled = false;
- var func4 = function () { targetCalled = true; };
- var v0 = new Proxy(func4, {});
-
- var anotherScript = `function foo() {
- var a = undefined;
- v0(a) > 1;
- }`;
- var sc0 = WScript.LoadScript(anotherScript, 'samethread');
- sc0.v0 = v0;
- sc0.foo();
- assert.isTrue(targetCalled);
- }
- },
- {
- name: "Type confusion in JavascriptProxy::SetPropertyTrap when using a Symbol",
- body: function () {
- try{ Reflect.set((new Proxy({}, {has: function(){ return true; }})), 'abc', 0x44444444, new Uint32Array); } catch(e){}
- try{ Reflect.set((new Proxy({}, {has: function(){ return true; }})), 'abc', 0x44444444, new Uint32Array); } catch(e){}
- var obj1 = Object.create(new Proxy({}, {}));
- obj1[Symbol.species] = 0;
- }
- },
- {
- name: "Cross-site on proxy exercising function trap - with 'apply' function trap",
- body() {
- var trapCalled = false;
- var func4 = function () {};
- var handler = {
- apply : function(a, b, c) {
- trapCalled = true;
- }
- };
- var v0 = new Proxy(func4, handler);
-
- var anotherScript = `function foo() {
- var a = undefined;
- v0(a) > 1;
- }`;
- var sc0 = WScript.LoadScript(anotherScript, 'samethread');
- sc0.v0 = v0;
- sc0.foo();
- assert.isTrue(trapCalled);
- }
- },
- ];
- testRunner.runTests(tests, { verbose: WScript.Arguments[0] != "summary" });
|