Index: move_attributes.html |
diff --git a/move_attributes.html b/move_attributes.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..35f855be2f564ff3e830356717bfe4ef8b9194ca |
--- /dev/null |
+++ b/move_attributes.html |
@@ -0,0 +1,298 @@ |
+<html> |
+<head> |
+<script> |
+function shouldBe(str1, str2) { |
+ var result1; |
+ try { |
+ result1 = eval(str1); |
+ } catch (e) { |
+ result1 = e; |
+ } |
+ try { |
+ result2 = eval(str2); |
+ } catch (e) { |
+ result2 = e; |
+ } |
+ if (result1 === result2) |
+ document.body.innerHTML += str1 + " === " + str2 + " <span style='color:green; font-weight:bold'>PASS</span><br>"; |
+ else |
+ document.body.innerHTML += str1 + " was not " + str2 + ". The left hand side was [" + result1 + "] and the right hand side was [" + result2 + "]. <span style='color:red; font-weight:bold'>FAIL</span><br>"; |
+} |
+ |
+function shouldThrow(str) { |
+ var result; |
+ var thrown = false; |
+ try { |
+ result = eval(str); |
+ } catch (e) { |
+ thrown = true; |
+ result = e; |
+ } |
+ if (thrown === true) |
+ document.body.innerHTML += str + " threw [" + result + "]. <span style='color:green; font-weight:bold'>PASS</span><br>"; |
+ else |
+ document.body.innerHTML += str + " did not throw. The result was [" + result + "]. <span style='color:red; font-weight:bold'>FAIL</span><br>"; |
+} |
+ |
+function log(str) { |
+ document.body.innerHTML += str + "<br>"; |
+} |
+ |
+function run(title, repeatNum, func, rounds) { |
+ var result = document.getElementById("result"); |
+ if (!result) { |
+ var result = document.createElement("div"); |
+ document.body.appendChild(result); |
+ } |
+ |
+ var rounds = rounds || 5; |
+ var times = []; |
+ for (var r = 0; r < rounds; r++) { |
+ var start = Date.now(); |
+ func(repeatNum); |
+ var time = Date.now() - start; |
+ times.push(time * 1e6 / repeatNum); |
+ //result.appendChild(document.createTextNode(time)); |
+ //result.appendChild(document.createElement("br")); |
+ } |
+ |
+ times.sort(function (a, b) { return a - b; }); |
+ var median = times[Math.floor(times.length / 2)]; |
+ var min = times[0]; |
+ var max = times[times.length - 1]; |
+ var sum = 0; |
+ var sum2 = 0; |
+ for (var i = 0; i < times.length; i++) { |
+ sum += times[i]; |
+ sum2 += times[i] * times[i]; |
+ } |
+ var avg = sum / rounds; |
+ var avgTotal = avg * repeatNum / 1e6; |
+ var stdev = Math.sqrt(sum2 / rounds - avg * avg); |
+ |
+ result.appendChild(document.createTextNode(title + " : mean=" + avg.toFixed(2) + "ns, min=" + min + "ns, median=" + median + "ns, max=" + max + "ns, stdev=" + stdev.toFixed(2) + "ns, total=" + avgTotal.toFixed(2) + "ms")); |
+ result.appendChild(document.createElement("br")); |
+} |
+</script> |
+</head> |
+<body> |
+<script> |
+function checkCorrectness() { |
+ div = document.createElement("div"); |
+ shouldBe('div.hasOwnProperty("testAttrOnHTMLDivElement")', "true"); |
+ shouldBe('div.hasOwnProperty("testAttrOnHTMLElement")', "true"); |
+ shouldBe('div.hasOwnProperty("testAttrOnElement")', "true"); |
+ shouldBe('div.hasOwnProperty("testAttrOnNode")', "true"); |
+ shouldBe('div.__proto__.hasOwnProperty("testAttrOnHTMLDivElementWithGetterAndSetter")', "true"); |
+ shouldBe('div.__proto__.__proto__.hasOwnProperty("testAttrOnHTMLElementWithGetterAndSetter")', "true"); |
+ shouldBe('div.__proto__.__proto__.__proto__.hasOwnProperty("testAttrOnElementWithGetterAndSetter")', "true"); |
+ shouldBe('div.__proto__.__proto__.__proto__.__proto__.hasOwnProperty("testAttrOnNodeWithGetterAndSetter")', "true"); |
+ shouldBe('div.__proto__.hasOwnProperty("testAttrOnHTMLDivElementWithGetterAndSetterExpected")', "true"); |
+ shouldBe('div.__proto__.__proto__.hasOwnProperty("testAttrOnHTMLElementWithGetterAndSetterExpected")', "true"); |
+ shouldBe('div.__proto__.__proto__.__proto__.hasOwnProperty("testAttrOnElementWithGetterAndSetterExpected")', "true"); |
+ shouldBe('div.__proto__.__proto__.__proto__.__proto__.hasOwnProperty("testAttrOnNodeWithGetterAndSetterExpected")', "true"); |
+ shouldBe('xhr = new XMLHttpRequest(); xhr.__proto__ = HTMLDivElement.prototype; xhr.testAttrOnHTMLDivElement', "undefined"); |
+/* |
+ shouldThrow('xhr = new XMLHttpRequest(); xhr.__proto__ = HTMLDivElement.prototype; xhr.testAttrOnHTMLDivElementWithGetterAndSetter'); |
+ shouldThrow('obj = Object.create(div); obj.testAttrOnHTMLDivElement'); |
+ shouldThrow('obj = Object.create(div); obj.testAttrOnHTMLDivElementWithGetterAndSetter'); |
+*/ |
+} |
+ |
+checkCorrectness(); |
+ |
+Object.defineProperty(HTMLDivElement.prototype, "testAttrOnHTMLDivElementWithGetterAndSetterExpected", { |
+ get: function() { return this.testAttrOnHTMLDivElement; }, |
+ set: function(v) { this.testAttrOnHTMLDivElement = v; } }); |
+Object.defineProperty(HTMLElement.prototype, "testAttrOnHTMLElementWithGetterAndSetterExpected", { |
+ get: function() { return this.testAttrOnHTMLElement; }, |
+ set: function(v) { this.testAttrOnHTMLElement = v; } }); |
+Object.defineProperty(Element.prototype, "testAttrOnElementWithGetterAndSetterExpected", { |
+ get: function() { return this.testAttrOnElement; }, |
+ set: function(v) { this.testAttrOnElement = v; } }); |
+Object.defineProperty(Node.prototype, "testAttrOnNodeWithGetterAndSetterExpected", { |
+ get: function() { return this.testAttrOnNode; }, |
+ set: function(v) { this.testAttrOnNode = v; } }); |
+ |
+var repeatNum1 = 20000000; |
+var repeatNum2 = 10000000; |
+var rounds = 10; |
+ |
+var div = document.createElement("div"); |
+ |
+log(""); |
+ |
+run("div.testAttrOnHTMLDivElement getter", repeatNum1, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnHTMLDivElement; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnHTMLElement getter", repeatNum1, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnHTMLElement; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnElement getter", repeatNum1, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnElement; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnNode getter", repeatNum1, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnNode; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnHTMLDivElementWithGetterAndSetter getter", repeatNum1, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnHTMLDivElementWithGetterAndSetter; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnHTMLElementWithGetterAndSetter getter", repeatNum1, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnHTMLElementWithGetterAndSetter; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnElementWithGetterAndSetter getter", repeatNum1, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnElementWithGetterAndSetter; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnNodeWithGetterAndSetter getter", repeatNum1, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnNodeWithGetterAndSetter; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnHTMLDivElementWithGetterAndSetterExpected getter", repeatNum1, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnHTMLDivElementWithGetterAndSetterExpected; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnHTMLElementWithGetterAndSetterExpected getter", repeatNum1, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnHTMLElementWithGetterAndSetterExpected; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnElementWithGetterAndSetterExpected getter", repeatNum1, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnElementWithGetterAndSetterExpected; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnNodeWithGetterAndSetterExpected getter", repeatNum1, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnNodeWithGetterAndSetterExpected; |
+ } |
+}, rounds); |
+ |
+log(""); |
+ |
+run("div.testAttrOnHTMLDivElement setter", repeatNum2, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnHTMLDivElement = ""; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnHTMLElement setter", repeatNum2, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnHTMLElement = ""; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnElement setter", repeatNum2, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnElement = ""; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnNode setter", repeatNum2, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnNode = ""; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnHTMLDivElementWithGetterAndSetter setter", repeatNum2, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnHTMLDivElementWithGetterAndSetter = ""; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnHTMLElementWithGetterAndSetter setter", repeatNum2, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnHTMLElementWithGetterAndSetter = ""; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnElementWithGetterAndSetter setter", repeatNum2, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnElementWithGetterAndSetter = ""; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnNodeWithGetterAndSetter setter", repeatNum2, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnNodeWithGetterAndSetter = ""; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnHTMLDivElementWithGetterAndSetterExpected setter", repeatNum2, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnHTMLDivElementWithGetterAndSetterExpected = ""; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnHTMLElementWithGetterAndSetterExpected setter", repeatNum2, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnHTMLElementWithGetterAndSetterExpected = ""; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnElementWithGetterAndSetterExpected setter", repeatNum2, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnElementWithGetterAndSetterExpected = ""; |
+ } |
+}, rounds); |
+ |
+run("div.testAttrOnNodeWithGetterAndSetterExpected setter", repeatNum2, function(repeatNum) { |
+ var div = document.createElement("div"); |
+ for (var j = 0; j < repeatNum; j++) { |
+ div.testAttrOnNodeWithGetterAndSetterExpected = ""; |
+ } |
+}, rounds); |
+ |
+log(""); |
+</script> |
+</body> |
+</html> |