//------------------------------------------------------------------------------------------------------- // 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); }