Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1508)

Unified Diff: move_attributes.html

Issue 23797002: Hack to add accessors for WebIDL attributes. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/html/HTMLElement.idl ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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>
« no previous file with comments | « Source/core/html/HTMLElement.idl ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698