123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- <?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"?>
- <!--
- https://bugzilla.mozilla.org/show_bug.cgi?id=1069772
- -->
- <window title="Mozilla Bug 1069772"
- xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" onload="run();">
- <!-- test code goes here -->
- <script type="application/javascript">
- <![CDATA[
- const {interfaces: Ci, classes: Cc, results: Cr, utils: Cu} = Components;
- Cu.import("resource://testing-common/ContentTask.jsm");
- Cu.import("resource://testing-common/BrowserTestUtils.jsm");
- Cu.import("resource://gre/modules/Services.jsm");
- ContentTask.setTestScope(window.opener.wrappedJSObject);
- let imports = ['SimpleTest', 'ok', 'is'];
- for (let name of imports) {
- window[name] = window.opener.wrappedJSObject[name];
- }
- /** Test for Bug 1069772 **/
- function run() {
- // test the transition:
- // prerender => visible => hidden => visible
- // on a non-remote browser
- createPrerenderedBrowser(false)
- .then(browser => verifyBrowser(browser, true, false))
- .then(browser => verifyVisibility(browser, 'prerender'))
- .then(browser => makePrerenderedBrowserActive(browser))
- .then(browser => verifyBrowser(browser, false, false))
- .then(browser => verifyVisibility(browser, 'visible'))
- .then(browser => hideBrowser(browser))
- .then(browser => verifyBrowser(browser, false, false))
- .then(browser => verifyVisibility(browser, 'hidden'))
- .then(browser => showBrowser(browser))
- .then(browser => verifyBrowser(browser, false, false))
- .then(browser => verifyVisibility(browser, 'visible'))
- // test the transition:
- // prerender => visible => hidden => visible
- // on a remote browser
- .then(() => createPrerenderedBrowser(true))
- .then(browser => verifyBrowser(browser, true, true))
- .then(browser => verifyVisibility(browser, 'prerender'))
- .then(browser => makePrerenderedBrowserActive(browser))
- .then(browser => verifyBrowser(browser, false, true))
- .then(browser => verifyVisibility(browser, 'visible'))
- .then(browser => hideBrowser(browser))
- .then(browser => verifyBrowser(browser, false, true))
- .then(browser => verifyVisibility(browser, 'hidden'))
- .then(browser => showBrowser(browser))
- .then(browser => verifyBrowser(browser, false, true))
- .then(browser => verifyVisibility(browser, 'visible'))
- // finish test
- .then(() => {
- window.close();
- SimpleTest.finish();
- });
- }
- function createPrerenderedBrowser(remote) {
- let browser = document.createElement('browser');
- browser.setAttribute('type', 'content');
- browser.setAttribute('prerendered', true);
- browser.setAttribute('remote', remote);
- browser.setAttribute('src', 'data:text/html;charset=UTF-8,<html><body>' +
- '<iframe id="iframe" src="data:text/html;charset=UTF-8,Hello Frame!">' +
- '</iframe></body></html>');
- // wait for 'load' and 'pageshow'
- let promises = [];
- promises.push(BrowserTestUtils.browserLoaded(browser));
- promises.push(new Promise(resolve =>
- Services.mm.addMessageListener('test:pageshow', resolve)));
- Services.mm.loadFrameScript('data:,' +
- 'addEventListener("pageshow", ' +
- '() => sendAsyncMessage("test:pageshow", null), false);',
- true);
- document.getElementById('stack').appendChild(browser);
- return Promise.all(promises).then(() => browser);
- }
- function verifyBrowser(browser, prerendered, remote) {
- let docShellOrTabParent = remote ?
- browser.frameLoader.tabParent : browser.frameLoader.docShell;
- ok(docShellOrTabParent, 'docShellOrTabParent should not be null');
- is(docShellOrTabParent.isPrerendered, prerendered,
- 'isPrerendered should be ' + prerendered);
- return browser;
- }
- function verifyVisibility(browser, visibility) {
- return ContentTask.spawn(browser, visibility, (v) => {
- let iframe = content.document.getElementById('iframe');
- is(content.document.visibilityState, v, 'check doc.visibilityState');
- is(content.document.hidden, v != 'visible', 'check doc.hidden');
- is(iframe.contentDocument.visibilityState, v, 'check iframe doc.visibilityState');
- is(iframe.contentDocument.hidden, v != 'visible', 'check iframe doc.hidden');
- }).then(() => browser);
- }
- function makePrerenderedBrowserActive(browser) {
- let promise = waitForVisibilityChange(browser);
- browser.setAttribute('prerendered', false);
- browser.makePrerenderedBrowserActive();
- return promise.then(() => browser);
- }
- function hideBrowser(browser) {
- let promise = waitForVisibilityChange(browser);
- browser.docShellIsActive = false;
- return promise.then(() => browser);
- }
- function showBrowser(browser) {
- let promise = waitForVisibilityChange(browser);
- browser.docShellIsActive = true;
- return promise.then(() => browser);
- }
- function waitForVisibilityChange(browser) {
- return ContentTask.spawn(browser, null, () => {
- return new Promise(resolve => {
- let iframe = content.document.getElementById('iframe');
- iframe.contentDocument.addEventListener('visibilitychange', function listener() {
- iframe.contentDocument.removeEventListener('visibilitychange', listener);
- resolve();
- });
- });
- });
- }
- ]]>
- </script>
- <stack id="stack" flex="1" />
- </window>
|