enumeratingWithES5.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. var propName = "d";
  6. var propValue = "dvalue";
  7. function CreateSimpleTypeHandlerObject()
  8. {
  9. var obj = Object.create(null);
  10. obj[propName] = propValue;
  11. return obj;
  12. }
  13. function CreateSimpleDictionaryTypeHandlerObject()
  14. {
  15. var obj = {};
  16. obj[propName] = propValue;
  17. return obj;
  18. }
  19. function CreateDictionaryTypeHandlerObject()
  20. {
  21. var obj = {};
  22. Object.defineProperty(obj, propName,
  23. {
  24. get : function() {},
  25. configurable : true,
  26. enumerable : true
  27. });
  28. delete obj[propName];
  29. obj[propName] = propValue;
  30. return obj;
  31. }
  32. function TestNonWritable(o)
  33. {
  34. var beforeTestValue = null;
  35. var value = 1;
  36. value = TestEnumerations(o, beforeTestValue, value);
  37. SetWritable(o, propName, false);
  38. value = TestEnumerations(o, beforeTestValue, value);
  39. SetWritable(o, propName, true);
  40. value = TestEnumerations(o, beforeTestValue, value);
  41. telemetryLog("Changing writability during enumeration...", true);
  42. beforeTestValue = function(o, i, value)
  43. {
  44. SetWritable(o, propName, false);
  45. return value;
  46. };
  47. value = TestEnumerations(o, beforeTestValue, value);
  48. beforeTestValue = function(o, i, value)
  49. {
  50. SetWritable(o, propName, true);
  51. return value;
  52. };
  53. value = TestEnumerations(o, beforeTestValue, value);
  54. telemetryLog("Freezing object", true);
  55. Object.freeze(o);
  56. beforeTestValue = null;
  57. value = TestEnumerations(o, beforeTestValue, value);
  58. }
  59. function TestAccessors()
  60. {
  61. var o = { a:"aValue" };
  62. DefineAccessor(o, 'b',
  63. function() { return "GETTER FOR b"; },
  64. function(v) { telemetryLog("SETTER FOR b", true); }
  65. );
  66. o.c = "cValue"; // to be deleted
  67. o.d = "dValue";
  68. // Throw in a non-enumerable property
  69. Object.defineProperty(o, 'e',
  70. {
  71. value : "eValue",
  72. configurable : true,
  73. writable : true,
  74. enumerable : false
  75. });
  76. DefineAccessor(o, 'f',
  77. function() { return "GETTER FOR f"; },
  78. function(v) { telemetryLog("SETTER FOR f", true); }
  79. );
  80. o.g = "gValue";
  81. delete o.c;
  82. var value = 1;
  83. var beforeTestValue = null;
  84. value = TestEnumerations(o, beforeTestValue, value);
  85. DefineAccessor(o, propName);
  86. value = TestEnumerations(o, beforeTestValue, value);
  87. DefineDataProperty(o, propName, value++);
  88. value = TestEnumerations(o, beforeTestValue, value);
  89. telemetryLog("Defining accessor property during enumeration...", true);
  90. beforeTestValue = function(o, i, value)
  91. {
  92. if (i === propName) DefineAccessor(o, propName);
  93. return value;
  94. };
  95. value = TestEnumerations(o, beforeTestValue, value);
  96. telemetryLog("Defining data property during enumeration...", true);
  97. beforeTestValue = function(o, i, value)
  98. {
  99. if (i === propName) DefineDataProperty(o, propName, value);
  100. return value + 1;
  101. };
  102. value = TestEnumerations(o, beforeTestValue, value);
  103. }
  104. function SetWritable(o, p, v)
  105. {
  106. telemetryLog("Setting writability of " + p + " to " + v, true);
  107. Object.defineProperty(o, p, { writable : v });
  108. }
  109. function DefineAccessor(o, p, getter, setter)
  110. {
  111. if (!getter) getter = function() { return "GETTER"; };
  112. if (!setter) setter = function(v) { telemetryLog("SETTER", true); }
  113. telemetryLog("Defining accessors for " + p, true);
  114. Object.defineProperty(o, p,
  115. {
  116. get : getter,
  117. set : setter,
  118. configurable : true,
  119. enumerable : true
  120. });
  121. }
  122. function DefineDataProperty(o, p, v)
  123. {
  124. telemetryLog("Defining data property " + p + " with value " + v, true);
  125. Object.defineProperty(o, p,
  126. {
  127. value : v,
  128. writable : true,
  129. configurable : true,
  130. enumerable : true
  131. });
  132. }
  133. function TestEnumerations(o, beforeTestValue, value)
  134. {
  135. telemetryLog("Testing for-in enumeration", true);
  136. for (var i in o)
  137. {
  138. if (beforeTestValue) value = beforeTestValue(o, i, value);
  139. TestValue(o, i, value++);
  140. }
  141. telemetryLog("Testing getOwnPropertyNames enumeration", true);
  142. var names = Object.getOwnPropertyNames(o);
  143. for (var i = 0; i < names.length; i++)
  144. {
  145. if (beforeTestValue) value = beforeTestValue(o, i, value);
  146. TestValue(o, names[i], value++);
  147. }
  148. return value;
  149. }
  150. function TestValue(o, i, value)
  151. {
  152. telemetryLog(i + ": " + o[i], true);
  153. telemetryLog("Setting value to " + value, true);
  154. o[i] = value;
  155. telemetryLog(i + ": " + o[i], true);
  156. }
  157. var th1 = CreateSimpleTypeHandlerObject();
  158. var th2 = CreateSimpleDictionaryTypeHandlerObject();
  159. var th3 = CreateDictionaryTypeHandlerObject();
  160. WScript.SetTimeout(testFunction, 50);
  161. /////////////////
  162. function testFunction()
  163. {
  164. telemetryLog("Test 1: Non-writable, simple type handler", true);
  165. TestNonWritable(th1);
  166. telemetryLog("Test 2: Non-writable, simple dictionary type handler", true);
  167. TestNonWritable(th2);
  168. telemetryLog("Test 3: Non-writable, dictionary type handler", true);
  169. TestNonWritable(th3);
  170. telemetryLog("Test 4: Accessors", true);
  171. TestAccessors();
  172. emitTTDLog(ttdLogURI);
  173. }