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