summaryrefslogtreecommitdiffstats
path: root/layout/generic/test/file_bug514732_helper.html
diff options
context:
space:
mode:
Diffstat (limited to 'layout/generic/test/file_bug514732_helper.html')
-rw-r--r--layout/generic/test/file_bug514732_helper.html300
1 files changed, 300 insertions, 0 deletions
diff --git a/layout/generic/test/file_bug514732_helper.html b/layout/generic/test/file_bug514732_helper.html
new file mode 100644
index 000000000..0ef110609
--- /dev/null
+++ b/layout/generic/test/file_bug514732_helper.html
@@ -0,0 +1,300 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=514732
+-->
+<head>
+ <title>Test for Bug 514732</title>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug?id=514732">Mozilla Bug 514732</a>
+
+<div id="imgs" style="whitespace: nowrap; overflow: visible; height: 10px;"></div>
+
+<iframe id="testframe" src="./file_bug514732_1.html"></iframe>
+
+<br/><br/>
+<div id="log">log:<br/></div>
+<br/><br/>
+
+<script class="testbody" style="width: 300; height: 150;" type="text/javascript;version=1.8">
+// Import test API
+var is = window.opener.is;
+var ok = window.opener.ok;
+var todo = window.opener.todo;
+var finish = window.opener.SimpleTest.finish;
+
+function log(msg) {
+ document.getElementById("log").innerHTML += msg;
+}
+
+function logln(msg) {
+ if (arguments.length == 0) msg = "";
+ document.getElementById("log").innerHTML += msg + "<br/>";
+}
+
+function logev(ev) {
+ logln([ev.x, ev.y, ev.width, ev.height].join(' '));
+}
+
+/* Absolutely position a 500x500 div at x, y on doc */
+function phoom(doc, x, y) {
+ var d = doc.createElement('div');
+ d.id = "phoomer";
+ d.style.position = "absolute";
+ d.style.left = x + 'px';
+ d.style.top = y + 'px';
+ d.style.backgroundColor = "#00FFF0";
+ d.style.width = 500 + 'px';
+ d.style.height = 500 + 'px';
+ doc.getElementById('imgs').appendChild(d);
+}
+
+function unphoom(doc) {
+ var phoomer = doc.getElementById('phoomer');
+ if (phoomer)
+ doc.getElementById('imgs').removeChild(phoomer);
+}
+
+function getDocBodyDimensions(doc) {
+ return [doc.documentElement.scrollWidth, doc.documentElement.scrollHeight];
+}
+
+function makeResult() {
+ return {
+ success: false,
+ event: null
+ };
+}
+
+function makeListener(result, eventGen) {
+ return function(ev) {
+ result.success = true;
+ result.event = ev;
+ setTimeout(function() { eventGen.next(); }, 0);
+ };
+}
+
+function waitInterrupt(result, gen) {
+ result.event = null;
+ result.success = false;
+ setTimeout(function() { if (!result.success) gen.next(); }, 3500);
+}
+
+function testPhoom(isCapturing, x, y, expectEvent) {
+
+ var eventGen = (function() {
+ var innerdoc = document.getElementById('testframe').contentDocument;
+
+ for (var doc of [document, innerdoc]) {
+ var inner = (doc == innerdoc);
+ var w, h, result, listener;
+
+ /* --- EXPANSION --- */
+
+ result = makeResult();
+ listener = makeListener(result, eventGen);
+
+ doc.addEventListener("MozScrolledAreaChanged", listener, isCapturing);
+
+ if (!expectEvent) waitInterrupt(result, eventGen);
+ phoom(doc, x, y);
+ yield;
+
+ doc.removeEventListener("MozScrolledAreaChanged", listener, isCapturing);
+
+ /* If we're expecting an event, better check that we got one. If we are not expecting one,
+ one can still arrive, but we don't complain if it did not. In either case, any event
+ that arrives will have its data checked below. */
+ if (expectEvent) {
+ ok(result.success, "Received expected " + (inner ? "inner" : "") + " expansion event");
+ }
+
+ if (result.success) {
+ is(result.event.x, 0, "Expansion event x is 0");
+ is(result.event.y, 0, "Expansion event y is 0");
+ if (inner) {
+ /* In iframe-land, the values of |myiframe.contentDocument.documentElement.scrollWidth| and
+ |.scrollHeight| appear to be not as expected (they stay very small). This is fine, since
+ we know exactly where we're positioning our fixed-dimensions div, and we know our iframe's
+ dimensions, so we can do our own math. NB: The inner iframe is styled at 300x500. */
+ is(Math.round(result.event.width),
+ Math.max(x + 500, 300),
+ "Inner expansion event width matches body width");
+ is(Math.round(result.event.height),
+ Math.max(y + 500, 150),
+ "Inner expansion event height matches body height");
+ } else {
+ [w, h] = getDocBodyDimensions(doc);
+ is(Math.round(result.event.width), w, "Expansion event width matches body width");
+ is(Math.round(result.event.height), h, "Expansion event height matches body height");
+ }
+ }
+
+ /* --- CONTRACTION --- */
+
+ result = makeResult();
+ listener = makeListener(result, eventGen);
+
+ doc.addEventListener("MozScrolledAreaChanged", listener, isCapturing);
+
+ if (!expectEvent) waitInterrupt(result, eventGen);
+ unphoom(doc);
+ yield;
+
+ doc.removeEventListener("MozScrolledAreaChanged", listener, isCapturing);
+
+ if (expectEvent) {
+ ok(result.success, "Received expected " + (inner ? "inner" : "") + " contraction event");
+ }
+
+ if (result.success) {
+ is(result.event.x, 0, "Contraction event x is 0");
+ is(result.event.y, 0, "Contraction event y is 0");
+ if (inner) {
+ is(Math.round(result.event.width), 300, "Inner contraction event width matches body width");
+ is(Math.round(result.event.height), 150, "Inner contraction event height matches body height");
+ } else {
+ [w, h] = getDocBodyDimensions(doc);
+ is(Math.round(result.event.width), w, "Contraction event width matches body width");
+ is(Math.round(result.event.height), h, "Contraction event height matches body height");
+ }
+ }
+ }
+
+ setTimeout(nextTest, 0);
+
+ yield;
+ })();
+
+ setTimeout(function() { eventGen.next(); }, 0);
+}
+
+function testPreliminaries() {
+ /* Do any setup here */
+ nextTest();
+}
+
+function testEventCapturingHorz() {
+ testPhoom(true, 10000, 0, true); // calls nextTest() when finished
+}
+
+function testEventCapturingVert() {
+ testPhoom(true, 0, 10000, true); // calls nextTest() when finished
+}
+
+function testEventCapturingBoth() {
+ testPhoom(true, 10000, 10000, true); // calls nextTest() when finished
+}
+
+function testEventCapturingNegv() {
+ testPhoom(true, -10000, -10000, false); // calls nextTest() when finished
+}
+
+function testEventBubblingHorz() {
+ testPhoom(false, 10000, 0, true); // calls nextTest() when finished
+}
+
+function testEventBubblingVert() {
+ testPhoom(false, 0, 10000, true); // calls nextTest() when finished
+}
+
+function testEventBubblingBoth() {
+ testPhoom(false, 10000, 10000, true); // calls nextTest() when finished
+}
+
+function testEventBubblingNegv() {
+ testPhoom(false, -10000, -10000, false); // calls nextTest() when finished
+}
+
+function testCustomCreationHelper(creatingDoc, listeningDoc, x, y, w, h, expectEvent) {
+ var result = makeResult();
+
+ var listener = function(evt) {
+ result.success = true;
+ result.event = evt;
+ };
+
+ var ev = creatingDoc.createEvent("ScrollAreaEvent");
+ ev.initScrollAreaEvent("MozScrolledAreaChanged",
+ true, true, window, 0,
+ x, y, w, h);
+
+ listeningDoc.addEventListener("MozScrolledAreaChanged", listener, true);
+
+ result.success = false;
+ creatingDoc.dispatchEvent(ev);
+
+ listeningDoc.removeEventListener("MozScrolledAreaChanged", listener, true);
+
+ is(result.success, expectEvent, "Received custom event iff expected");
+ if (result.success) {
+ is(result.event.x, x, "Custom event data matches for x");
+ is(result.event.y, y, "Custom event data matches for y");
+ is(result.event.width, w, "Custom event data matches for width");
+ is(result.event.height, h, "Custom event data matches for height");
+ }
+}
+
+function testCustomCreation() {
+ var innerdoc = document.getElementById('testframe').contentDocument;
+ testCustomCreationHelper(document, document, 2, 7, 1, 8, true); // e = 2.718 ...
+ testCustomCreationHelper(innerdoc, innerdoc, 2, 8, 1, 8, true); // ... 2818 ...
+ testCustomCreationHelper(innerdoc, document, 2, 8, 4, 5, false); // ... 2845 ...
+ nextTest();
+}
+
+var TESTS = [testPreliminaries,
+ testEventCapturingHorz,
+ testEventCapturingVert,
+ testEventCapturingBoth,
+ testEventCapturingNegv,
+ testEventBubblingHorz,
+ testEventBubblingVert,
+ testEventBubblingBoth,
+ testEventBubblingNegv,
+ testCustomCreation,
+ __end];
+
+var PC = 0;
+
+function nextTest() {
+ TESTS[PC++]();
+}
+
+function __end() {
+ log("done!");
+ finish();
+ window.close();
+}
+
+/*
+ * We need both the parent document and all iframe documents to load
+ * before starting anything
+ */
+var loaded = 0;
+
+window
+.addEventListener('load', function(ev) {
+ logln(++loaded);
+ if (loaded >= 2) {
+ logln("go...");
+ nextTest();
+ }
+}, false);
+
+document.getElementById("testframe").contentWindow
+.addEventListener('load', function(ev) {
+ logln(++loaded);
+ if (loaded >= 2) {
+ logln("go...");
+ nextTest();
+ }
+}, false);
+
+// window.opener says: SimpleTest.waitForExplicitFinish();
+
+</script>
+
+</body>
+</html>