diff options
Diffstat (limited to 'browser/base/content/test/tabcrashed/browser_printpreview_crash.js')
-rw-r--r-- | browser/base/content/test/tabcrashed/browser_printpreview_crash.js | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/browser/base/content/test/tabcrashed/browser_printpreview_crash.js b/browser/base/content/test/tabcrashed/browser_printpreview_crash.js new file mode 100644 index 0000000000..74e983d3c3 --- /dev/null +++ b/browser/base/content/test/tabcrashed/browser_printpreview_crash.js @@ -0,0 +1,94 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +const TEST_URL = + "http://example.com/browser/browser/base/content/test/tabcrashed/file_contains_emptyiframe.html"; +const DOMAIN = "example.com"; + +/** + * This is really a crashtest, but because we need PrintUtils this is written as a browser test. + * Test that when we don't crash when trying to print a document in the following scenario - + * A top level document has an iframe of different origin embedded (here example.com has test1.example.com iframe embedded) + * and they both set their document.domain to be "example.com". + */ +add_task(async function test() { + await SpecialPowers.pushPrefEnv({ + set: [["print.tab_modal.enabled", false]], + }); + // 1. Open a new tab and wait for it to load the top level doc + let newTab = await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL); + let browser = newTab.linkedBrowser; + + // 2. Navigate the iframe within the doc and wait for the load to complete + await SpecialPowers.spawn(browser, [], async function() { + const iframe = content.document.querySelector("iframe"); + const loaded = new Promise(resolve => { + iframe.addEventListener( + "load", + () => { + resolve(); + }, + { once: true } + ); + }); + iframe.src = + "http://test1.example.com/browser/browser/base/content/test/tabcrashed/file_iframe.html"; + await loaded; + }); + + // 3. Change the top level document's domain + await SpecialPowers.spawn(browser, [DOMAIN], async function(domain) { + content.document.domain = domain; + }); + + // 4. Get the reference to the iframe and change its domain + const iframe = await SpecialPowers.spawn(browser, [], () => { + return content.document.querySelector("iframe").browsingContext; + }); + + await SpecialPowers.spawn(iframe, [DOMAIN], domain => { + content.document.domain = domain; + }); + + // 5. Try to print things + ok( + !gInPrintPreviewMode, + "Should NOT be in print preview mode at the start of this test." + ); + + // Enter print preview + let ppBrowser = PrintPreviewListener.getPrintPreviewBrowser(); + + const { PrintingParent } = ChromeUtils.import( + "resource://gre/actors/PrintingParent.jsm" + ); + let printPreviewEntered = new Promise(resolve => { + PrintingParent.setTestListener(browserPreviewing => { + if (browserPreviewing == ppBrowser) { + PrintingParent.setTestListener(null); + resolve(); + } + }); + }); + document.getElementById("cmd_printPreview").doCommand(); + await printPreviewEntered; + + // Ensure we are in print preview + await BrowserTestUtils.waitForCondition( + () => gInPrintPreviewMode, + "Should be in print preview mode now." + ); + ok(true, "We did not crash."); + + // We haven't crashed! Exit the print preview. + await BrowserTestUtils.switchTab(gBrowser, () => { + PrintUtils.exitPrintPreview(); + }); + + await BrowserTestUtils.waitForCondition(() => !window.gInPrintPreviewMode); + info("We are not in print preview anymore."); + + BrowserTestUtils.removeTab(newTab); +}); |