Bug 1069772 - Part 2: Add test case. r=smaug
authorSamael Wang <freesamael@gmail.com>
Wed, 25 May 2016 16:51:24 +0800
changeset 338011 7909d0735869e171d3daef18be07afef8abb2add
parent 338010 d9b584a14402209fb9c714b193702aaba53800c8
child 338012 a4d93c6954d1e05478eb434072ab35de8577905e
push id6249
push userjlund@mozilla.com
push dateMon, 01 Aug 2016 13:59:36 +0000
treeherdermozilla-beta@bad9d4f5bf7e [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerssmaug
bugs1069772
milestone49.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1069772 - Part 2: Add test case. r=smaug
dom/xul/test/chrome.ini
dom/xul/test/file_bug1069772_local.xul
dom/xul/test/file_bug1069772_remote.xul
dom/xul/test/test_bug1069772_local.xul
dom/xul/test/test_bug1069772_remote.xul
--- a/dom/xul/test/chrome.ini
+++ b/dom/xul/test/chrome.ini
@@ -6,16 +6,18 @@ support-files =
   file_bug236853.rdf
   overlay1_bug335375.xul
   overlay2_bug335375.xul
   window_bug583948.xul
   window_bug757137.xul
   1061864.html
   file_bug1271240_local.xul
   file_bug1271240_remote.xul
+  file_bug1069772_local.xul
+  file_bug1069772_remote.xul
 
 [test_bug199692.xul]
 [test_bug233643.xul]
 [test_bug236853.xul]
 [test_bug311681.xul]
 [test_bug335375.xul]
 [test_bug391002.xul]
 [test_bug398289.html]
@@ -32,8 +34,11 @@ support-files =
 [test_bug775972.xul]
 [test_bug1061864_1.xul]
 [test_bug1061864_2.xul]
 [test_bug1070049_throw_from_script.xul]
 [test_import_xul_to_content.xul]
 [test_bug1271240_local.xul]
 [test_bug1271240_remote.xul]
 skip-if = !e10s
+[test_bug1069772_local.xul]
+[test_bug1069772_remote.xul]
+skip-if = !e10s
new file mode 100644
--- /dev/null
+++ b/dom/xul/test/file_bug1069772_local.xul
@@ -0,0 +1,127 @@
+<?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'))
+
+    // 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>
new file mode 100644
--- /dev/null
+++ b/dom/xul/test/file_bug1069772_remote.xul
@@ -0,0 +1,127 @@
+<?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 remote browser
+    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>
new file mode 100644
--- /dev/null
+++ b/dom/xul/test/test_bug1069772_local.xul
@@ -0,0 +1,32 @@
+<?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="loadTest();">
+  <script type="application/javascript"
+          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
+
+  <!-- test results are displayed in the html:body -->
+  <body xmlns="http://www.w3.org/1999/xhtml">
+  <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1069772"
+     target="_blank">Mozilla Bug 1069772</a>
+  </body>
+
+  <!-- test code goes here -->
+  <script type="application/javascript">
+  <![CDATA[
+
+  /** Test for Bug 1069772 **/
+  SimpleTest.waitForExplicitFinish();
+  function loadTest() {
+    window.open("file_bug1069772_local.xul", "", "width=360,height=240,chrome");
+  }
+
+  ]]>
+  </script>
+</window>
new file mode 100644
--- /dev/null
+++ b/dom/xul/test/test_bug1069772_remote.xul
@@ -0,0 +1,32 @@
+<?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="loadTest();">
+  <script type="application/javascript"
+          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
+
+  <!-- test results are displayed in the html:body -->
+  <body xmlns="http://www.w3.org/1999/xhtml">
+  <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1069772"
+     target="_blank">Mozilla Bug 1069772</a>
+  </body>
+
+  <!-- test code goes here -->
+  <script type="application/javascript">
+  <![CDATA[
+
+  /** Test for Bug 1069772 **/
+  SimpleTest.waitForExplicitFinish();
+  function loadTest() {
+    window.open("file_bug1069772_remote.xul", "", "width=360,height=240,chrome");
+  }
+
+  ]]>
+  </script>
+</window>