| //------------------------------------------------------------------------------------------------------- | |
| // Copyright (C) Microsoft. All rights reserved. | |
| // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. | |
| //------------------------------------------------------------------------------------------------------- | |
| // dump obj through for-in enumerator | |
| function enumObj(obj, lines) { | |
| for (var p in obj) { | |
| lines.push(" " + p + ": " + obj[p]); | |
| } | |
| } | |
| // dump obj through for-in enumerator + verify | |
| function enumAndVerifyObj(obj, lines) { | |
| var ctr = 0; | |
| for (var p in obj) { | |
| var thisl = " " + p + ": " + obj[p]; | |
| if(lines[ctr] !== thisl) { | |
| telemetryLog(`Failed on ${lines[ctr]} !== ${thisl}`, true); | |
| } | |
| ctr++; | |
| } | |
| } | |
| // add a bunch of data/attribute properties with different attributes | |
| function addProp(o, prefix) { | |
| Object.defineProperty(o, prefix + "10", { | |
| value: "value 10" | |
| }); | |
| Object.defineProperty(o, prefix + "11", { | |
| value: "value 11", | |
| enumerable: true | |
| }); | |
| Object.defineProperty(o, prefix + "12", { | |
| value: "value 12", | |
| enumerable: true, | |
| configurable: true | |
| }); | |
| Object.defineProperty(o, prefix + "13", { | |
| value: "value 13", | |
| enumerable: true, | |
| configurable: true, | |
| writable: true | |
| }); | |
| Object.defineProperty(o, prefix + "20", { | |
| get: function() { return "get 20"; }, | |
| }); | |
| Object.defineProperty(o, prefix + "21", { | |
| get: function () { return "get 21"; }, | |
| enumerable: true, | |
| }); | |
| Object.defineProperty(o, prefix + "22", { | |
| get: function () { return "get 22"; }, | |
| enumerable: true, | |
| configurable: true | |
| }); | |
| Object.defineProperty(o, prefix + "25", { | |
| set: function() { echo("do not call 25"); }, | |
| }); | |
| Object.defineProperty(o, prefix + "26", { | |
| set: function() { echo("do not call 26"); }, | |
| enumerable: true, | |
| }); | |
| Object.defineProperty(o, prefix + "27", { | |
| set: function() { echo("do not call 27"); }, | |
| enumerable: true, | |
| configurable: true | |
| }); | |
| } | |
| function testWithObj(o, lines) { | |
| addProp(o, "xx"); | |
| addProp(o, "1"); | |
| enumObj(o, lines); | |
| } | |
| var s1 = {abc: -12, def: "hello", 1: undefined, 3: null}; | |
| var l1 = []; | |
| testWithObj(s1, l1); | |
| var s2 = [-12, "hello", undefined, null]; | |
| var l2 = []; | |
| testWithObj(s2, l2); | |
| // Test Object.defineProperties, Object.create | |
| function testPrototype(proto) { | |
| Object.defineProperties(proto, { | |
| name: { value: "SHOULD_NOT_enumerate_prototype" }, | |
| 0: { get: function() { return "get 0"; } }, | |
| 3: { value: 3 }, | |
| 1: { get: function() { return "get 1"; }, enumerable: true }, | |
| 5: { value: 5, enumerable: true }, | |
| 2: { get: function() { return this.name; }, enumerable: true }, | |
| }); | |
| return Object.create(proto, { | |
| name: { value: "correct_original_instance" }, | |
| 10: { get: function() { return "get 10"; } }, | |
| 13: { value: 13 }, | |
| 11: { get: function() { return "get 11"; }, enumerable: true }, | |
| 15: { value: 15, enumerable: true }, | |
| 12: { get: function() { return this.name; }, enumerable: true }, | |
| }); | |
| } | |
| var s3 = testPrototype({}); | |
| var l3 = []; | |
| testWithObj(s3, l3); | |
| var s4 = testPrototype([]); | |
| var l4 = []; | |
| testWithObj(s4, l4); | |
| WScript.SetTimeout(testFunction, 50); | |
| ///////////////// | |
| function testFunction() | |
| { | |
| telemetryLog('Testing obj enumeration', true); | |
| enumAndVerifyObj(s1, l1); | |
| telemetryLog('Testing array enumeration', true); | |
| enumAndVerifyObj(s2, l2); | |
| telemetryLog('Testing obj proto enumeration', true); | |
| enumAndVerifyObj(s3, l3); | |
| telemetryLog('Testing array proto enumeration', true); | |
| enumAndVerifyObj(s4, l4); | |
| emitTTDLog(ttdLogURI); | |
| } |