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