| 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>
|
|
|