diff options
Diffstat (limited to 'layout/base/tests/chrome/printpreview_helper.xul')
-rw-r--r-- | layout/base/tests/chrome/printpreview_helper.xul | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/layout/base/tests/chrome/printpreview_helper.xul b/layout/base/tests/chrome/printpreview_helper.xul new file mode 100644 index 000000000..96d835b9a --- /dev/null +++ b/layout/base/tests/chrome/printpreview_helper.xul @@ -0,0 +1,274 @@ +<?xml version="1.0"?> +<?xml-stylesheet type="text/css" href="chrome://global/skin"?> +<?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" + type="text/css"?> +<window onload="runTests()" + xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> +<iframe height="200" width="600" type="content"></iframe> +<iframe height="200" width="600" type="content"></iframe> +<script type="application/javascript"> +<![CDATA[ +var is = window.opener.wrappedJSObject.is; +var isnot = window.opener.wrappedJSObject.isnot; +var ok = window.opener.wrappedJSObject.ok; +var todo = window.opener.wrappedJSObject.todo; +var SimpleTest = window.opener.wrappedJSObject.SimpleTest; +var gWbp; +var ctx1; +var ctx2; +var counter = 0; + +var file = Components.classes["@mozilla.org/file/directory_service;1"] + .getService(Components.interfaces.nsIProperties) + .get("TmpD", Components.interfaces.nsILocalFile); +filePath = file.path; + +function printpreview() { + gWbp = window.frames[1].QueryInterface(Components.interfaces.nsIInterfaceRequestor) + .getInterface(Components.interfaces.nsIWebBrowserPrint); + var listener = { + onLocationChange: function(webProgress, request, location, flags) { }, + onProgressChange: function(webProgress, request, curSelfProgress, + maxSelfProgress, curTotalProgress, + maxTotalProgress) { }, + onSecurityChange: function(webProgress, request, state) { }, + onStateChange: function(webProgress, request, stateFlags, status) { }, + onStatusChange: function(webProgress, request, status, message) { }, + QueryInterface: function(iid) { + if (iid.equals(Components.interfaces.nsIWebProgressListener) || + iid.equals(Components.interfaces.nsISupportsWeakReference)) + return this; + throw Components.results.NS_NOINTERFACE; + } + } + var prefs = Components.classes["@mozilla.org/preferences-service;1"] + .getService(Components.interfaces.nsIPrefBranch); + prefs.setBoolPref('print.show_print_progress', false); + //XXX I would have thought this would work, instead I'm forced to use prefs service + gWbp.globalPrintSettings.showPrintProgress = false; + var before = 0; + var after = 0; + function beforeprint() { ++before; } + function afterprint() { ++after; } + window.frames[0].addEventListener("beforeprint", beforeprint, true); + window.frames[0].addEventListener("afterprint", afterprint, true); + gWbp.printPreview(gWbp.globalPrintSettings, window.frames[0], listener); + is(before, 1, "Should have called beforeprint listener!"); + is(after, 1, "Should have called afterprint listener!"); + window.frames[0].removeEventListener("beforeprint", beforeprint, true); + window.frames[0].removeEventListener("afterprint", afterprint, true); + prefs.clearUserPref('print.show_print_progress'); +} + +function exitprintpreview() { + window.frames[1].QueryInterface(Components.interfaces.nsIInterfaceRequestor) + .getInterface(Components.interfaces.nsIWebBrowserPrint).exitPrintPreview(); +} + +function finish() { + SimpleTest.finish(); + window.close(); +} + +function runTests() +{ + var printService = Components.classes["@mozilla.org/gfx/printsettings-service;1"] + .getService(Components.interfaces.nsIPrintSettingsService); + + try { + Components.classes["@mozilla.org/gfx/printerenumerator;1"] + .getService(Components.interfaces.nsIPrinterEnumerator); + } catch(e) { + todo(false, "Test skipped on MacOSX, as the print preview code doesn't work there"); + finish(); + return; + } + + if (printService.defaultPrinterName != '') { + startTest1(); + } else { + todo(false, "No printer seems installed on this machine, that is necessary for this test"); + finish(); + } +} + +function compareCanvases() { + return window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) + .getInterface(Components.interfaces.nsIDOMWindowUtils) + .compareCanvases(document.getElementsByTagName("canvas")[0], + document.getElementsByTagName("canvas")[1], + {}) == 0; +} + +function addHTMLContent(parent) { + var n = parent.ownerDocument.createElement("div"); + parent.appendChild(n); + var s = "<iframe width='500' height='40' src='data:text/plain,ThisIsAnIframeCreatedDuringPrintPreview'></iframe>"; + s += "<table>"; + for (var i = 1; i < 501; ++i) { + s += "<tr><td>Cell A" + i + "</td><td>Cell B" + i + "</td><td>Cell C" + i + "</td></tr>"; + } + s += "</table>"; + n.innerHTML = s; +} + +function startTest1() { + ctx1 = document.getElementsByTagName("canvas")[0].getContext("2d"); + ctx2 = document.getElementsByTagName("canvas")[1].getContext("2d"); + window.frames[0].document.body.innerHTML = "<div> </div><div>" + counter + " timers</div><div> </div>"; + + // Note this timeout is needed so that we can check that timers run + // after print preview, but not during it. + window.frames[0].wrappedJSObject.counter = counter; + window.frames[0].counterTimeout = "document.body.firstChild.nextSibling.innerHTML = ++counter + ' timers';" + + "window.setTimeout(counterTimeout, 0);"; + window.frames[0].setTimeout(window.frames[0].counterTimeout, 0); + window.frames[0].document.body.firstChild.innerHTML = "Print preview"; + + printpreview(); + ctx1.drawWindow(window.frames[1], 0, 0, 400, 400, "rgb(256,256,256)"); + window.frames[0].document.body.firstChild.innerHTML = "Galley presentation"; + + // Add some elements. + addHTMLContent(window.frames[0].document.body.lastChild); + // Delete them. + window.frames[0].document.body.lastChild.innerHTML = ""; + // And readd. + addHTMLContent(window.frames[0].document.body.lastChild); + + setTimeout(finalizeTest1, 1000); +} + +function finalizeTest1() { + ctx2.drawWindow(window.frames[1], 0, 0, 400, 400, "rgb(256,256,256)"); + exitprintpreview(); + ok(compareCanvases(), "Canvas should be the same!"); + counter = window.frames[0].counter; + // This timeout is needed so that we can check that timers do run after + // print preview. + setTimeout(runTest2, 1000); +} + +function runTest2() { + isnot(window.frames[0].document.body.firstChild.nextSibling.textContent, "0 timers", "Timers should have run!"); + isnot(window.frames[0].counter, 0, "Timers should have run!"); + counter = window.frames[0].counter; + window.frames[0].counterTimeout = ""; + setTimeout(runTest3, 0); +} + +var elementIndex = 0; +var compareEmptyElement = true; +var emptyFormElements = + ["<input type='text'>", + "<input type='password'>", + "<input type='file'>", + "<input type='button'>", + "<input type='submit'>", + "<input type='reset'>", + "<input type='checkbox'>", + "<input type='radio'>", + "<select></select>", + "<select size='5'></select>", + "<textarea></textarea>"]; + +var formElements = + ["<input type='text' value='text'>", + "<input type='password' value='password'>", + "<input type='file' value='" + filePath + "'>", + "<input type='button' value='button'>", + "<input type='submit' value='submit button'>", + "<input type='reset' value='reset button'>", + "<input type='checkbox' checked>", + "<input type='radio' checked>", + "<select><option>option1</option></select>", + "<select size='5'><option>1</option><option>2</option><option>3</option></select>", + "<textarea value='textarea'>textarea</textarea>"]; + +function runTest3() { + if (compareEmptyElement) { + var currentIndex = elementIndex; + ++elementIndex; + if (elementIndex >= emptyFormElements.length) { + elementIndex = 0; + compareEmptyElement = false; + } + compareFormElementPrint(emptyFormElements[currentIndex], emptyFormElements[currentIndex], true); + return; + } else if (elementIndex < emptyFormElements.length) { + var currentIndex = elementIndex; + ++elementIndex; + compareFormElementPrint(emptyFormElements[currentIndex], formElements[currentIndex], false); + return; + } + + setTimeout(runTest4, 0) +} + +function compareFormElementPrint(el1, el2, equals) { + window.frames[0].document.body.innerHTML = el1; + window.frames[0].document.body.firstChild.value = + window.frames[0].document.body.firstChild.getAttribute('value'); + printpreview(); + ctx1.drawWindow(window.frames[1], 0, 0, 400, 400, "rgb(256,256,256)"); + exitprintpreview(); + window.frames[0].document.body.innerHTML = el2; + window.frames[0].document.body.firstChild.value = + window.frames[0].document.body.firstChild.getAttribute('value'); + printpreview(); + ctx2.drawWindow(window.frames[1], 0, 0, 400, 400, "rgb(256,256,256)"); + exitprintpreview(); + is(compareCanvases(), equals, + "Comparing print preview didn't succeed [" + el1 + " : " + el2 + "]"); + setTimeout(runTest3, 100); +} + +// This is a crash test for bug 539060. +function runTest4() { + window.frames[0].document.body.innerHTML = + "<iframe style='display: none;' src='data:text/html,<iframe>'></iframe>"; + setTimeout(runTest4end, 500); +} + +function runTest4end() { + printpreview(); + exitprintpreview(); + + runTest5(); +} + +// This is a crash test for bug 595337 +function runTest5() { + window.frames[0].document.body.innerHTML = + '<iframe style="position: fixed; visibility: hidden; bottom: 10em;"></iframe>' + + '<input contenteditable="true" style="display: table; page-break-before: left; width: 10000px;">'; + printpreview(); + exitprintpreview(); + + setTimeout(runTest6, 0); +} + +// Crash test for bug 878037 +function runTest6() { + window.frames[0].document.body.innerHTML = + '<style> li { list-style-image: url("animated.gif"); } </style>' + + '<li>Firefox will crash if you try and print this page</li>'; + + setTimeout(runTest6end, 500); +} + +function runTest6end() { + printpreview(); + exitprintpreview(); + + finish(); +} + +]]></script> +<table style="border: 1px solid black;" xmlns="http://www.w3.org/1999/xhtml"> +<tr><th>Print preview canvas 1</th><th>Print preview canvas 2</th></tr> +<tr> +<td><canvas height="400" width="400"></canvas></td> +<td><canvas height="400" width="400"></canvas></td> +</tr></table> +</window> |