Bug 1108547 - Part 3: Automated tests; r=jdm
☠☠ backed out by 6f06c4beef24 ☠ ☠
authorEhsan Akhgari <ehsan@mozilla.com>
Wed, 21 Jan 2015 21:02:13 -0500
changeset 239190 180e7905987ef346842e732fd9307614837b9315
parent 239189 91101cbcc319994d3df4d34e982e239a97a5f075
child 239191 aa85f08f9f76b2637282d32c52ece39b88e4515d
push id489
push usermcmanus@ducksong.com
push dateTue, 27 Jan 2015 01:44:53 +0000
reviewersjdm
bugs1108547
milestone38.0a1
Bug 1108547 - Part 3: Automated tests; r=jdm
dom/html/test/browser.ini
dom/html/test/browser_bug1108547.js
dom/html/test/file_bug1108547-1.html
dom/html/test/file_bug1108547-2.html
dom/html/test/file_bug1108547-3.html
--- a/dom/html/test/browser.ini
+++ b/dom/html/test/browser.ini
@@ -3,8 +3,13 @@ support-files =
   bug592641_img.jpg
   file_bug649778.html
   file_bug649778.html^headers^
 
 [browser_bug592641.js]
 [browser_bug649778.js]
 skip-if = e10s # Bug ?????? - leaked until shutdown [nsGlobalWindow #16 about:blank]
 [browser_bug1081537.js]
+[browser_bug1108547.js]
+support-files =
+  file_bug1108547-1.html
+  file_bug1108547-2.html
+  file_bug1108547-3.html
new file mode 100644
--- /dev/null
+++ b/dom/html/test/browser_bug1108547.js
@@ -0,0 +1,120 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+function test() {
+  waitForExplicitFinish();
+
+  runPass("file_bug1108547-2.html", function() {
+    runPass("file_bug1108547-3.html", function() {
+      finish();
+    });
+  });
+}
+
+function runPass(getterFile, finishedCallback) {
+  var rootDir = "http://mochi.test:8888/browser/dom/html/test/";
+  var testBrowser;
+  var privateWin;
+
+  function whenWindowLoaded(win, callback) {
+    win.addEventListener("load", function onLoad() {
+      win.removeEventListener("load", onLoad, false);
+      executeSoon(callback);
+    }, false);
+  }
+
+  function whenDelayedStartupFinished(win, callback) {
+    let topic = "browser-delayed-startup-finished";
+    Services.obs.addObserver(function onStartup(aSubject) {
+      if (win != aSubject)
+        return;
+
+      Services.obs.removeObserver(onStartup, topic);
+      executeSoon(callback);
+    }, topic, false);
+  }
+
+  // First, set the cookie in a normal window.
+  gBrowser.selectedTab = gBrowser.addTab(rootDir + "file_bug1108547-1.html");
+  gBrowser.selectedBrowser.addEventListener("load", afterOpenCookieSetter, true);
+
+  function afterOpenCookieSetter() {
+    gBrowser.selectedBrowser.removeEventListener("load", afterOpenCookieSetter, true);
+    gBrowser.removeCurrentTab();
+
+    // Now, open a private window.
+    privateWin = OpenBrowserWindow({private: true});
+    whenWindowLoaded(privateWin, function() {
+      whenDelayedStartupFinished(privateWin, afterPrivateWindowOpened);
+    });
+  }
+
+  function afterPrivateWindowOpened() {
+    // In the private window, open the getter file, and wait for a new tab to be opened.
+    privateWin.gBrowser.selectedTab = privateWin.gBrowser.addTab(rootDir + getterFile);
+    testBrowser = privateWin.gBrowser.selectedBrowser;
+    privateWin.gBrowser.tabContainer.addEventListener("TabOpen", onNewTabOpened, true);
+  }
+
+  function onNewTabOpened() {
+    // When the new tab is opened, wait for it to load.
+    privateWin.gBrowser.tabContainer.removeEventListener("TabOpen", onNewTabOpened, true);
+    privateWin.gBrowser.tabs[privateWin.gBrowser.tabs.length - 1].linkedBrowser.addEventListener("load", onNewTabLoaded, true);
+  }
+
+  function onNewTabLoaded() {
+    privateWin.gBrowser.tabs[privateWin.gBrowser.tabs.length - 1].linkedBrowser.removeEventListener("load", onNewTabLoaded, true);
+
+    // Now, ensure that the private tab doesn't have access to the cookie set in normal mode.
+    is(testBrowser.contentDocument.getElementById("result").textContent, "",
+       "Shouldn't have access to the cookies");
+
+    // We're done with the private window, close it.
+    privateWin.close();
+
+    // Clear all cookies.
+    Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager).removeAll();
+
+    // Open a new private window, this time to set a cookie inside it.
+    privateWin = OpenBrowserWindow({private: true});
+    whenWindowLoaded(privateWin, function() {
+      whenDelayedStartupFinished(privateWin, afterPrivateWindowOpened2);
+    });
+  }
+
+  function afterPrivateWindowOpened2() {
+    // In the private window, open the setter file, and wait for it to load.
+    privateWin.gBrowser.selectedTab = privateWin.gBrowser.addTab(rootDir + "file_bug1108547-1.html");
+    privateWin.gBrowser.selectedBrowser.addEventListener("load", afterOpenCookieSetter2, true);
+  }
+
+  function afterOpenCookieSetter2() {
+    // We're done with the private window now, close it.
+    privateWin.close();
+
+    // Now try to read the cookie in a normal window, and wait for a new tab to be opened.
+    gBrowser.selectedTab = gBrowser.addTab(rootDir + getterFile);
+    testBrowser = gBrowser.selectedBrowser;
+    gBrowser.tabContainer.addEventListener("TabOpen", onNewTabOpened2, true);
+  }
+
+  function onNewTabOpened2() {
+    // When the new tab is opened, wait for it to load.
+    gBrowser.tabContainer.removeEventListener("TabOpen", onNewTabOpened2, true);
+    gBrowser.tabs[gBrowser.tabs.length - 1].linkedBrowser.addEventListener("load", onNewTabLoaded2, true);
+  }
+
+  function onNewTabLoaded2() {
+    gBrowser.tabs[gBrowser.tabs.length - 1].linkedBrowser.removeEventListener("load", onNewTabLoaded2, true);
+
+    // Now, ensure that the normal tab doesn't have access to the cookie set in private mode.
+    is(testBrowser.contentDocument.getElementById("result").textContent, "",
+       "Shouldn't have access to the cookies");
+
+    // Remove both of the tabs opened here.
+    gBrowser.removeCurrentTab();
+    gBrowser.removeCurrentTab();
+
+    finishedCallback();
+  }
+}
new file mode 100644
--- /dev/null
+++ b/dom/html/test/file_bug1108547-1.html
@@ -0,0 +1,4 @@
+<!DOCTYPE html>
+<script>
+document.cookie = "foo=bar";
+</script>
new file mode 100644
--- /dev/null
+++ b/dom/html/test/file_bug1108547-2.html
@@ -0,0 +1,6 @@
+<!DOCTYPE html>
+<body onload="document.querySelector('form').submit();">
+<form action="javascript:opener.document.getElementById('result').textContent = document.cookie;" target="_blank">
+</form>
+<div id="result">not tested yet</div>
+</body>
new file mode 100644
--- /dev/null
+++ b/dom/html/test/file_bug1108547-3.html
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<body onload="document.querySelector('a').click();">
+<a href="javascript:opener.document.getElementById('result').textContent = document.cookie;" target="_blank">test</a>
+<div id="result">not tested yet</div>
+</body>