blob: 967019d98dbcbc9ceb797e31ec79718ea93d3ef7 [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// 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);
}