blob: f469d8d54129fe456b82605a3b10624c6d213e1f [file]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
var propName = "d";
var propValue = "dvalue";
function CreateSimpleTypeHandlerObject()
{
var obj = Object.create(null);
obj[propName] = propValue;
return obj;
}
function CreateSimpleDictionaryTypeHandlerObject()
{
var obj = {};
obj[propName] = propValue;
return obj;
}
function CreateDictionaryTypeHandlerObject()
{
var obj = {};
Object.defineProperty(obj, propName,
{
get : function() {},
configurable : true,
enumerable : true
});
delete obj[propName];
obj[propName] = propValue;
return obj;
}
function TestNonWritable(o)
{
var beforeTestValue = null;
var value = 1;
value = TestEnumerations(o, beforeTestValue, value);
SetWritable(o, propName, false);
value = TestEnumerations(o, beforeTestValue, value);
SetWritable(o, propName, true);
value = TestEnumerations(o, beforeTestValue, value);
telemetryLog("Changing writability during enumeration...", true);
beforeTestValue = function(o, i, value)
{
SetWritable(o, propName, false);
return value;
};
value = TestEnumerations(o, beforeTestValue, value);
beforeTestValue = function(o, i, value)
{
SetWritable(o, propName, true);
return value;
};
value = TestEnumerations(o, beforeTestValue, value);
telemetryLog("Freezing object", true);
Object.freeze(o);
beforeTestValue = null;
value = TestEnumerations(o, beforeTestValue, value);
}
function TestAccessors()
{
var o = { a:"aValue" };
DefineAccessor(o, 'b',
function() { return "GETTER FOR b"; },
function(v) { telemetryLog("SETTER FOR b", true); }
);
o.c = "cValue"; // to be deleted
o.d = "dValue";
// Throw in a non-enumerable property
Object.defineProperty(o, 'e',
{
value : "eValue",
configurable : true,
writable : true,
enumerable : false
});
DefineAccessor(o, 'f',
function() { return "GETTER FOR f"; },
function(v) { telemetryLog("SETTER FOR f", true); }
);
o.g = "gValue";
delete o.c;
var value = 1;
var beforeTestValue = null;
value = TestEnumerations(o, beforeTestValue, value);
DefineAccessor(o, propName);
value = TestEnumerations(o, beforeTestValue, value);
DefineDataProperty(o, propName, value++);
value = TestEnumerations(o, beforeTestValue, value);
telemetryLog("Defining accessor property during enumeration...", true);
beforeTestValue = function(o, i, value)
{
if (i === propName) DefineAccessor(o, propName);
return value;
};
value = TestEnumerations(o, beforeTestValue, value);
telemetryLog("Defining data property during enumeration...", true);
beforeTestValue = function(o, i, value)
{
if (i === propName) DefineDataProperty(o, propName, value);
return value + 1;
};
value = TestEnumerations(o, beforeTestValue, value);
}
function SetWritable(o, p, v)
{
telemetryLog("Setting writability of " + p + " to " + v, true);
Object.defineProperty(o, p, { writable : v });
}
function DefineAccessor(o, p, getter, setter)
{
if (!getter) getter = function() { return "GETTER"; };
if (!setter) setter = function(v) { telemetryLog("SETTER", true); }
telemetryLog("Defining accessors for " + p, true);
Object.defineProperty(o, p,
{
get : getter,
set : setter,
configurable : true,
enumerable : true
});
}
function DefineDataProperty(o, p, v)
{
telemetryLog("Defining data property " + p + " with value " + v, true);
Object.defineProperty(o, p,
{
value : v,
writable : true,
configurable : true,
enumerable : true
});
}
function TestEnumerations(o, beforeTestValue, value)
{
telemetryLog("Testing for-in enumeration", true);
for (var i in o)
{
if (beforeTestValue) value = beforeTestValue(o, i, value);
TestValue(o, i, value++);
}
telemetryLog("Testing getOwnPropertyNames enumeration", true);
var names = Object.getOwnPropertyNames(o);
for (var i = 0; i < names.length; i++)
{
if (beforeTestValue) value = beforeTestValue(o, i, value);
TestValue(o, names[i], value++);
}
return value;
}
function TestValue(o, i, value)
{
telemetryLog(i + ": " + o[i], true);
telemetryLog("Setting value to " + value, true);
o[i] = value;
telemetryLog(i + ": " + o[i], true);
}
var th1 = CreateSimpleTypeHandlerObject();
var th2 = CreateSimpleDictionaryTypeHandlerObject();
var th3 = CreateDictionaryTypeHandlerObject();
WScript.SetTimeout(testFunction, 50);
/////////////////
function testFunction()
{
telemetryLog("Test 1: Non-writable, simple type handler", true);
TestNonWritable(th1);
telemetryLog("Test 2: Non-writable, simple dictionary type handler", true);
TestNonWritable(th2);
telemetryLog("Test 3: Non-writable, dictionary type handler", true);
TestNonWritable(th3);
telemetryLog("Test 4: Accessors", true);
TestAccessors();
emitTTDLog(ttdLogURI);
}