1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/docshell/test/chrome/bug113934_window.xul Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,160 @@ 1.4 +<?xml version="1.0"?> 1.5 +<?xml-stylesheet href="chrome://global/skin" type="text/css"?> 1.6 +<window title="Mozilla Bug 113934" onload="doTheTest()" 1.7 + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 1.8 + 1.9 + <hbox> 1.10 + <vbox id="box1"> 1.11 + </vbox> 1.12 + <vbox id="box2"> 1.13 + </vbox> 1.14 + <spacer flex="1"/> 1.15 + </hbox> 1.16 + 1.17 + <!-- test code goes here --> 1.18 + <script type="application/javascript"><![CDATA[ 1.19 + var imports = [ "SimpleTest", "is", "isnot", "ok", "snapshotWindow", 1.20 + "compareSnapshots", "onerror" ]; 1.21 + for each (var name in imports) { 1.22 + window[name] = window.opener.wrappedJSObject[name]; 1.23 + } 1.24 + 1.25 + function $(id) { 1.26 + return document.getElementById(id); 1.27 + } 1.28 + 1.29 + function addBrowser(parent, id, width, height) { 1.30 + var b = 1.31 + document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "browser"); 1.32 + var type = window.location.search.slice(1); 1.33 + is(type == "chrome" || type == "content", true, "Unexpected type"); 1.34 + b.setAttribute("type", type); 1.35 + b.setAttribute("id", id); 1.36 + b.setAttribute("width", width); 1.37 + b.setAttribute("height", height); 1.38 + $(parent).appendChild(b); 1.39 + } 1.40 + addBrowser("box1", "f1", 300, 200); 1.41 + addBrowser("box1", "f2", 300, 200); 1.42 + addBrowser("box2", "f3", 30, 200); 1.43 + 1.44 + /** Test for Bug 113934 **/ 1.45 + var doc1 = 1.46 + "data:text/html,<html><body onbeforeunload='document.documentElement.textContent = \"\"' onunload='document.documentElement.textContent = \"\"' onpagehide='document.documentElement.textContent = \"\"'>This is a test</body></html>"; 1.47 + var doc2 = "data:text/html,<html><head></head><body>This is a second test</body></html>"; 1.48 + 1.49 + 1.50 + $("f1").setAttribute("src", doc1); 1.51 + $("f2").setAttribute("src", doc2); 1.52 + $("f3").setAttribute("src", doc2); 1.53 + 1.54 + function doTheTest() { 1.55 + var s1 = snapshotWindow($("f1").contentWindow); 1.56 + var s2 = snapshotWindow($("f2").contentWindow); 1.57 + var s3 = snapshotWindow($("f3").contentWindow); 1.58 + 1.59 + ok(!compareSnapshots(s2, s3, true)[0], 1.60 + "Should look different due to different sizing"); 1.61 + 1.62 + function getDOM(id) { 1.63 + return $(id).contentDocument.documentElement.innerHTML; 1.64 + } 1.65 + 1.66 + var dom1 = getDOM("f1"); 1.67 + 1.68 + var dom2 = getDOM("f2"); 1.69 + $("f2").contentDocument.body.textContent = "Modified the text"; 1.70 + var dom2star = getDOM("f2"); 1.71 + isnot(dom2, dom2star, "We changed the DOM!"); 1.72 + 1.73 + $("f1").swapDocShells($("f2")); 1.74 + // now we have doms 2*, 1, 2 in the frames 1.75 + 1.76 + is(getDOM("f1"), dom2star, "Shouldn't have changed the DOM on swap"); 1.77 + is(getDOM("f2"), dom1, "Shouldn't have fired event handlers"); 1.78 + 1.79 + // Test for bug 480149 1.80 + // The DOMLink* events are dispatched asynchronously, thus I cannot 1.81 + // just include the <link> element in the initial DOM and swap the 1.82 + // docshells. Instead, the link element is added now. Then, when the 1.83 + // first DOMLinkAdded event (which is a result of the actual addition) 1.84 + // is dispatched, the docshells are swapped and the pageshow and pagehide 1.85 + // events are tested. Only then, we wait for the DOMLink* events, 1.86 + // which are a result of swapping the docshells. 1.87 + var DOMLinkListener = { 1.88 + _afterFirst: false, 1.89 + _removedDispatched: false, 1.90 + _addedDispatched: false, 1.91 + handleEvent: function(aEvent) { 1.92 + if (!this._afterFirst) { 1.93 + is(aEvent.type, "DOMLinkAdded"); 1.94 + 1.95 + var strs = { "f1": "", "f3" : "" }; 1.96 + function attachListener(node, type) { 1.97 + var listener = function(e) { 1.98 + if (strs[node.id]) strs[node.id] += " "; 1.99 + strs[node.id] += node.id + ".page" + type; 1.100 + } 1.101 + node.addEventListener("page" + type, listener, false); 1.102 + 1.103 + listener.detach = function() { 1.104 + node.removeEventListener("page" + type, listener, false); 1.105 + } 1.106 + return listener; 1.107 + } 1.108 + 1.109 + var l1 = attachListener($("f1"), "show"); 1.110 + var l2 = attachListener($("f1"), "hide"); 1.111 + var l3 = attachListener($("f3"), "show"); 1.112 + var l4 = attachListener($("f3"), "hide"); 1.113 + 1.114 + $("f1").swapDocShells($("f3")); 1.115 + // now we have DOMs 2, 1, 2* in the frames 1.116 + 1.117 + l1.detach(); 1.118 + l2.detach(); 1.119 + l3.detach(); 1.120 + l4.detach(); 1.121 + 1.122 + var s1_new = snapshotWindow($("f1").contentWindow); 1.123 + var [same, first, second] = compareSnapshots(s1_new, s2, true); 1.124 + ok(same, "Should reflow on swap", "Expected " + second + " but got " + first); 1.125 + 1.126 + is(strs["f1"], "f1.pagehide f1.pageshow"); 1.127 + is(strs["f3"], "f3.pagehide f3.pageshow"); 1.128 + this._afterFirst = true; 1.129 + return; 1.130 + } 1.131 + if (aEvent.type == "DOMLinkAdded") { 1.132 + is(this._addedDispatched, false); 1.133 + this._addedDispatched = true; 1.134 + } 1.135 + else { 1.136 + is(this._removedDispatched, false); 1.137 + this._removedDispatched = true; 1.138 + } 1.139 + 1.140 + if (this._addedDispatched && this._removedDispatched) { 1.141 + $("f1").removeEventListener("DOMLinkAdded", this, false); 1.142 + $("f1").removeEventListener("DOMLinkRemoved", this, false); 1.143 + $("f3").removeEventListener("DOMLinkAdded", this, false); 1.144 + $("f3").removeEventListener("DOMLinkRemoved", this, false); 1.145 + window.close(); 1.146 + SimpleTest.finish(); 1.147 + } 1.148 + } 1.149 + }; 1.150 + 1.151 + $("f1").addEventListener("DOMLinkAdded", DOMLinkListener, false); 1.152 + $("f1").addEventListener("DOMLinkRemoved", DOMLinkListener, false); 1.153 + $("f3").addEventListener("DOMLinkAdded", DOMLinkListener, false); 1.154 + $("f3").addEventListener("DOMLinkRemoved", DOMLinkListener, false); 1.155 + 1.156 + var linkElement = $("f1").contentDocument.createElement("link"); 1.157 + linkElement.setAttribute("rel", "alternate"); 1.158 + linkElement.setAttribute("href", "about:blank"); 1.159 + $("f1").contentDocument.documentElement.firstChild.appendChild(linkElement); 1.160 + } 1.161 + 1.162 + ]]></script> 1.163 +</window>