Index: LayoutTests/fast/css/getComputedStyle/getComputedStyle-offsets.html |
diff --git a/LayoutTests/fast/css/getComputedStyle/getComputedStyle-offsets.html b/LayoutTests/fast/css/getComputedStyle/getComputedStyle-offsets.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..dd8803e0d63b815b9c0eb8beff25ea1bce522b5a |
--- /dev/null |
+++ b/LayoutTests/fast/css/getComputedStyle/getComputedStyle-offsets.html |
@@ -0,0 +1,419 @@ |
+<!DOCTYPE html> |
+<html> |
+<head> |
+<meta charset="utf-8"> |
+<script src="../../js/resources/js-test-pre.js"></script> |
+</head> |
+<body> |
+<style> |
+ |
+.relative200x400 { |
+ position: relative; |
+ width: 200px; |
+ height: 400px; |
+ font-size: 10px; |
+} |
+ |
+#test { |
+ position: absolute; |
+} |
+ |
+</style> |
+<div id="tests"> |
+<div class="relative200x400"><div id="test"></div></div> |
+</div> |
+<script> |
+ |
+description("Test to make sure top/bottom/left/right properly returns pixel values for any input.") |
+ |
+var test = document.getElementById('test'); |
+ |
+ |
+//----------------------------------------------------------------------------- |
+debug(''); |
+debug('No offsets (zero width/height)'); |
+debug(''); |
+shouldBe("getComputedStyle(test).top", "'0px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'200px'"); |
+shouldBe("getComputedStyle(test).bottom", "'400px'"); |
+shouldBe("getComputedStyle(test).width", "'0px'"); |
+shouldBe("getComputedStyle(test).height", "'0px'"); |
+ |
+// On padding/border/margin on actual node |
+debug(''); |
+evalAndLog("test.setAttribute('style', 'padding: 5px;')"); |
+shouldBe("getComputedStyle(test).top", "'0px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'190px'"); |
+shouldBe("getComputedStyle(test).bottom", "'390px'"); |
+shouldBe("getComputedStyle(test).width", "'0px'"); |
+shouldBe("getComputedStyle(test).height", "'0px'"); |
+ |
+debug(''); |
+evalAndLog("test.setAttribute('style', 'border: solid 5px;')"); |
+shouldBe("getComputedStyle(test).top", "'0px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'190px'"); |
+shouldBe("getComputedStyle(test).bottom", "'390px'"); |
+shouldBe("getComputedStyle(test).width", "'0px'"); |
+shouldBe("getComputedStyle(test).height", "'0px'"); |
+ |
+debug(''); |
+evalAndLog("test.setAttribute('style', 'margin: 5px;')"); |
+shouldBe("getComputedStyle(test).top", "'0px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'190px'"); |
+shouldBe("getComputedStyle(test).bottom", "'390px'"); |
+shouldBe("getComputedStyle(test).width", "'0px'"); |
+shouldBe("getComputedStyle(test).height", "'0px'"); |
+ |
+evalAndLog("test.setAttribute('style', '')"); |
+ |
+// On padding/border/margin on parent node |
+debug(''); |
+evalAndLog("test.parentNode.setAttribute('style', 'padding: 5px;')"); |
+shouldBe("getComputedStyle(test).top", "'5px'"); |
+shouldBe("getComputedStyle(test).left", "'5px'"); |
+shouldBe("getComputedStyle(test).right", "'205px'"); |
+shouldBe("getComputedStyle(test).bottom", "'405px'"); |
+shouldBe("getComputedStyle(test).width", "'0px'"); |
+shouldBe("getComputedStyle(test).height", "'0px'"); |
+ |
+debug(''); |
+evalAndLog("test.parentNode.setAttribute('style', 'border: solid 5px;')"); |
+shouldBe("getComputedStyle(test).top", "'0px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'200px'"); |
+shouldBe("getComputedStyle(test).bottom", "'400px'"); |
+shouldBe("getComputedStyle(test).width", "'0px'"); |
+shouldBe("getComputedStyle(test).height", "'0px'"); |
+ |
+debug(''); |
+evalAndLog("test.parentNode.setAttribute('style', 'margin: 5px;')"); |
+shouldBe("getComputedStyle(test).top", "'0px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'200px'"); |
+shouldBe("getComputedStyle(test).bottom", "'400px'"); |
+shouldBe("getComputedStyle(test).width", "'0px'"); |
+shouldBe("getComputedStyle(test).height", "'0px'"); |
+ |
+//----------------------------------------------------------------------------- |
+debug(''); |
+debug('No offsets (50px width/height)'); |
+debug(''); |
+var commonStyle = "width: 50px; height: 50px;"; |
+evalAndLog("test.setAttribute('style', '"+commonStyle+"')"); |
+shouldBe("getComputedStyle(test).top", "'0px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'150px'"); |
+shouldBe("getComputedStyle(test).bottom", "'350px'"); |
+shouldBe("getComputedStyle(test).width", "'50px'"); |
+shouldBe("getComputedStyle(test).height", "'50px'"); |
+ |
+// On padding/border/margin on actual node |
+debug(''); |
+evalAndLog("test.setAttribute('style', '"+commonStyle+" padding: 5px;')"); |
+shouldBe("getComputedStyle(test).top", "'0px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'140px'"); |
+shouldBe("getComputedStyle(test).bottom", "'340px'"); |
+shouldBe("getComputedStyle(test).width", "'50px'"); |
+shouldBe("getComputedStyle(test).height", "'50px'"); |
+ |
+debug(''); |
+evalAndLog("test.setAttribute('style', '"+commonStyle+" border: solid 5px;')"); |
+shouldBe("getComputedStyle(test).top", "'0px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'140px'"); |
+shouldBe("getComputedStyle(test).bottom", "'340px'"); |
+shouldBe("getComputedStyle(test).width", "'50px'"); |
+shouldBe("getComputedStyle(test).height", "'50px'"); |
+ |
+debug(''); |
+evalAndLog("test.setAttribute('style', '"+commonStyle+" margin: 5px;')"); |
+shouldBe("getComputedStyle(test).top", "'0px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'140px'"); |
+shouldBe("getComputedStyle(test).bottom", "'340px'"); |
+shouldBe("getComputedStyle(test).width", "'50px'"); |
+shouldBe("getComputedStyle(test).height", "'50px'"); |
+evalAndLog("test.removeAttribute('style', 'margin')"); |
+ |
+// On padding/border/margin on parent node |
+debug(''); |
+evalAndLog("test.setAttribute('style', '"+commonStyle+"')"); |
+debug(''); |
+evalAndLog("test.parentNode.setAttribute('style', 'padding: 5px;')"); |
+shouldBe("getComputedStyle(test).top", "'5px'"); |
+shouldBe("getComputedStyle(test).left", "'5px'"); |
+shouldBe("getComputedStyle(test).right", "'155px'"); |
+shouldBe("getComputedStyle(test).bottom", "'355px'"); |
+shouldBe("getComputedStyle(test).width", "'50px'"); |
+shouldBe("getComputedStyle(test).height", "'50px'"); |
+ |
+debug(''); |
+evalAndLog("test.parentNode.setAttribute('style', 'border: solid 5px;')"); |
+shouldBe("getComputedStyle(test).top", "'0px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'150px'"); |
+shouldBe("getComputedStyle(test).bottom", "'350px'"); |
+shouldBe("getComputedStyle(test).width", "'50px'"); |
+shouldBe("getComputedStyle(test).height", "'50px'"); |
+ |
+debug(''); |
+evalAndLog("test.parentNode.setAttribute('style', 'margin: 5px;')"); |
+shouldBe("getComputedStyle(test).top", "'0px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'150px'"); |
+shouldBe("getComputedStyle(test).bottom", "'350px'"); |
+shouldBe("getComputedStyle(test).width", "'50px'"); |
+shouldBe("getComputedStyle(test).height", "'50px'"); |
+ |
+ |
+//----------------------------------------------------------------------------- |
+debug(''); |
+debug('No offsets (100% width/height)'); |
+debug(''); |
+var commonStyle = "width: 100%; height: 100%;"; |
+evalAndLog("test.setAttribute('style', '"+commonStyle+"')"); |
+shouldBe("getComputedStyle(test).top", "'0px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'0px'"); |
+shouldBe("getComputedStyle(test).bottom", "'0px'"); |
+shouldBe("getComputedStyle(test).width", "'200px'"); |
+shouldBe("getComputedStyle(test).height", "'400px'"); |
+ |
+// On padding/border/margin on actual node |
+debug(''); |
+evalAndLog("test.setAttribute('style', '"+commonStyle+" padding: 5px;')"); |
+shouldBe("getComputedStyle(test).top", "'0px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'-10px'"); |
+shouldBe("getComputedStyle(test).bottom", "'-10px'"); |
+shouldBe("getComputedStyle(test).width", "'200px'"); |
+shouldBe("getComputedStyle(test).height", "'400px'"); |
+evalAndLog("test.removeAttribute('style', 'padding')"); |
+ |
+debug(''); |
+evalAndLog("test.setAttribute('style', '"+commonStyle+" border: solid 5px;')"); |
+shouldBe("getComputedStyle(test).top", "'0px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'-10px'"); |
+shouldBe("getComputedStyle(test).bottom", "'-10px'"); |
+shouldBe("getComputedStyle(test).width", "'200px'"); |
+shouldBe("getComputedStyle(test).height", "'400px'"); |
+evalAndLog("test.removeAttribute('style', 'border')"); |
+ |
+debug(''); |
+evalAndLog("test.setAttribute('style', '"+commonStyle+" margin: 5px;')"); |
+shouldBe("getComputedStyle(test).top", "'0px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'-10px'"); |
+shouldBe("getComputedStyle(test).bottom", "'-10px'"); |
+shouldBe("getComputedStyle(test).width", "'200px'"); |
+shouldBe("getComputedStyle(test).height", "'400px'"); |
+evalAndLog("test.removeAttribute('style', 'margin')"); |
+ |
+// On padding/border/margin on parent node |
+debug(''); |
+evalAndLog("test.setAttribute('style', '"+commonStyle+"')"); |
+debug(''); |
+evalAndLog("test.parentNode.setAttribute('style', 'padding: 5px;')"); |
+shouldBe("getComputedStyle(test).top", "'5px'"); |
+shouldBe("getComputedStyle(test).left", "'5px'"); |
+shouldBe("getComputedStyle(test).right", "'-5px'"); |
+shouldBe("getComputedStyle(test).bottom", "'-5px'"); |
+shouldBe("getComputedStyle(test).width", "'210px'"); |
+shouldBe("getComputedStyle(test).height", "'410px'"); |
+ |
+debug(''); |
+evalAndLog("test.parentNode.setAttribute('style', 'border: solid 5px;')"); |
+shouldBe("getComputedStyle(test).top", "'0px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'0px'"); |
+shouldBe("getComputedStyle(test).bottom", "'0px'"); |
+shouldBe("getComputedStyle(test).width", "'200px'"); |
+shouldBe("getComputedStyle(test).height", "'400px'"); |
+ |
+debug(''); |
+evalAndLog("test.parentNode.setAttribute('style', 'margin: 5px;')"); |
+shouldBe("getComputedStyle(test).top", "'0px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'0px'"); |
+shouldBe("getComputedStyle(test).bottom", "'0px'"); |
+shouldBe("getComputedStyle(test).width", "'200px'"); |
+shouldBe("getComputedStyle(test).height", "'400px'"); |
+ |
+//----------------------------------------------------------------------------- |
+debug(''); |
+debug('% offsets (top/left)'); |
+debug(''); |
+evalAndLog("test.setAttribute('style', 'top: 10%; left: 10%; width: 50%; height: 60%;')"); |
+shouldBe("getComputedStyle(test).top", "'40px'"); |
+shouldBe("getComputedStyle(test).left", "'20px'"); |
+shouldBe("getComputedStyle(test).right", "'80px'"); |
+shouldBe("getComputedStyle(test).bottom", "'120px'"); |
+shouldBe("getComputedStyle(test).width", "'100px'"); |
+shouldBe("getComputedStyle(test).height", "'240px'"); |
+ |
+debug(''); |
+evalAndLog("test.parentNode.setAttribute('style', 'padding: 25px;')"); |
+shouldBe("getComputedStyle(test).top", "'45px'"); |
+shouldBe("getComputedStyle(test).left", "'25px'"); |
+shouldBe("getComputedStyle(test).right", "'100px'"); |
+shouldBe("getComputedStyle(test).bottom", "'135px'"); |
+shouldBe("getComputedStyle(test).width", "'125px'"); |
+shouldBe("getComputedStyle(test).height", "'270px'"); |
+evalAndLog("test.parentNode.removeAttribute('style', 'padding')"); |
+ |
+debug(''); |
+evalAndLog("test.parentNode.setAttribute('style', 'border: solid 25px;')"); |
+shouldBe("getComputedStyle(test).top", "'40px'"); |
+shouldBe("getComputedStyle(test).left", "'20px'"); |
+shouldBe("getComputedStyle(test).right", "'80px'"); |
+shouldBe("getComputedStyle(test).bottom", "'120px'"); |
+shouldBe("getComputedStyle(test).width", "'100px'"); |
+shouldBe("getComputedStyle(test).height", "'240px'"); |
+evalAndLog("test.parentNode.removeAttribute('style', 'border')"); |
+ |
+debug(''); |
+evalAndLog("test.parentNode.setAttribute('style', 'margin: 25px;')"); |
+shouldBe("getComputedStyle(test).top", "'40px'"); |
+shouldBe("getComputedStyle(test).left", "'20px'"); |
+shouldBe("getComputedStyle(test).right", "'80px'"); |
+shouldBe("getComputedStyle(test).bottom", "'120px'"); |
+shouldBe("getComputedStyle(test).width", "'100px'"); |
+shouldBe("getComputedStyle(test).height", "'240px'"); |
+evalAndLog("test.parentNode.removeAttribute('style', 'margin')"); |
+ |
+ |
+//----------------------------------------------------------------------------- |
+debug(''); |
+debug('% offsets (right/bottom)'); |
+debug(''); |
+evalAndLog("test.setAttribute('style', 'right: 10%; bottom: 10%; width: 90%; height: 80%;')"); |
+shouldBe("getComputedStyle(test).top", "'40px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'20px'"); |
+shouldBe("getComputedStyle(test).bottom", "'40px'"); |
+shouldBe("getComputedStyle(test).width", "'180px'"); |
+shouldBe("getComputedStyle(test).height", "'320px'"); |
+ |
+ |
+// On padding/border/margin on parent node |
+debug(''); |
+evalAndLog("test.parentNode.setAttribute('style', 'padding: 25px;')"); |
+shouldBe("getComputedStyle(test).top", "'45px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'25px'"); |
+shouldBe("getComputedStyle(test).bottom", "'45px'"); |
+shouldBe("getComputedStyle(test).width", "'225px'"); |
+shouldBe("getComputedStyle(test).height", "'360px'"); |
+evalAndLog("test.parentNode.removeAttribute('style', 'padding')"); |
+ |
+debug(''); |
+evalAndLog("test.parentNode.setAttribute('style', 'border: solid 25px;')"); |
+shouldBe("getComputedStyle(test).top", "'40px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'20px'"); |
+shouldBe("getComputedStyle(test).bottom", "'40px'"); |
+shouldBe("getComputedStyle(test).width", "'180px'"); |
+shouldBe("getComputedStyle(test).height", "'320px'"); |
+evalAndLog("test.parentNode.removeAttribute('style', 'border')"); |
+ |
+debug(''); |
+evalAndLog("test.parentNode.setAttribute('style', 'margin: 25px;')"); |
+shouldBe("getComputedStyle(test).top", "'40px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'20px'"); |
+shouldBe("getComputedStyle(test).bottom", "'40px'"); |
+shouldBe("getComputedStyle(test).width", "'180px'"); |
+shouldBe("getComputedStyle(test).height", "'320px'"); |
+evalAndLog("test.parentNode.removeAttribute('style', 'margin')"); |
+ |
+ |
+ |
+//----------------------------------------------------------------------------- |
+debug(''); |
+debug('em offsets'); |
+debug(''); |
+evalAndLog("test.setAttribute('style', 'top: 1em; left: 2em; width: 3em; height: 4em;')"); |
+shouldBe("getComputedStyle(test).top", "'10px'"); |
+shouldBe("getComputedStyle(test).left", "'20px'"); |
+shouldBe("getComputedStyle(test).right", "'150px'"); |
+shouldBe("getComputedStyle(test).bottom", "'350px'"); |
+shouldBe("getComputedStyle(test).width", "'30px'"); |
+shouldBe("getComputedStyle(test).height", "'40px'"); |
+ |
+// On padding/border/margin on parent node |
+debug(''); |
+evalAndLog("test.parentNode.setAttribute('style', 'padding: 25px;')"); |
+shouldBe("getComputedStyle(test).top", "'10px'"); |
+shouldBe("getComputedStyle(test).left", "'20px'"); |
+shouldBe("getComputedStyle(test).right", "'200px'"); |
+shouldBe("getComputedStyle(test).bottom", "'400px'"); |
+shouldBe("getComputedStyle(test).width", "'30px'"); |
+shouldBe("getComputedStyle(test).height", "'40px'"); |
+ |
+debug(''); |
+evalAndLog("test.parentNode.setAttribute('style', 'border: solid 25px;')"); |
+shouldBe("getComputedStyle(test).top", "'10px'"); |
+shouldBe("getComputedStyle(test).left", "'20px'"); |
+shouldBe("getComputedStyle(test).right", "'150px'"); |
+shouldBe("getComputedStyle(test).bottom", "'350px'"); |
+shouldBe("getComputedStyle(test).width", "'30px'"); |
+shouldBe("getComputedStyle(test).height", "'40px'"); |
+ |
+debug(''); |
+evalAndLog("test.parentNode.setAttribute('style', 'margin: 25px;')"); |
+shouldBe("getComputedStyle(test).top", "'10px'"); |
+shouldBe("getComputedStyle(test).left", "'20px'"); |
+shouldBe("getComputedStyle(test).right", "'150px'"); |
+shouldBe("getComputedStyle(test).bottom", "'350px'"); |
+shouldBe("getComputedStyle(test).width", "'30px'"); |
+shouldBe("getComputedStyle(test).height", "'40px'"); |
+ |
+//----------------------------------------------------------------------------- |
+debug(''); |
+debug('Absolute Offsets'); |
+debug(''); |
+evalAndLog("test.setAttribute('style', 'position: absolute; top: 30px; height: 300px;')"); |
+shouldBe("getComputedStyle(test).top", "'30px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'200px'"); |
+shouldBe("getComputedStyle(test).bottom", "'70px'"); |
+shouldBe("getComputedStyle(test).width", "'0px'"); |
+shouldBe("getComputedStyle(test).height", "'300px'"); |
+ |
+debug(''); |
+evalAndLog("test.parentNode.setAttribute('style', 'padding: 25px;')"); |
+shouldBe("getComputedStyle(test).top", "'30px'"); |
+shouldBe("getComputedStyle(test).left", "'25px'"); |
+shouldBe("getComputedStyle(test).right", "'225px'"); |
+shouldBe("getComputedStyle(test).bottom", "'120px'"); |
+shouldBe("getComputedStyle(test).width", "'0px'"); |
+shouldBe("getComputedStyle(test).height", "'300px'"); |
+ |
+debug(''); |
+evalAndLog("test.parentNode.setAttribute('style', 'border: solid 25px;')"); |
+shouldBe("getComputedStyle(test).top", "'30px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'200px'"); |
+shouldBe("getComputedStyle(test).bottom", "'70px'"); |
+shouldBe("getComputedStyle(test).width", "'0px'"); |
+shouldBe("getComputedStyle(test).height", "'300px'"); |
+ |
+debug(''); |
+evalAndLog("test.parentNode.setAttribute('style', 'margin: 25px;')"); |
+shouldBe("getComputedStyle(test).top", "'30px'"); |
+shouldBe("getComputedStyle(test).left", "'0px'"); |
+shouldBe("getComputedStyle(test).right", "'200px'"); |
+shouldBe("getComputedStyle(test).bottom", "'70px'"); |
+shouldBe("getComputedStyle(test).width", "'0px'"); |
+shouldBe("getComputedStyle(test).height", "'300px'"); |
+ |
+</script> |
+<script src="../../js/resources/js-test-post.js"></script> |
+</body> |
+</html> |