Bug 1276738 - Test that new windows opened from remote content get the right flags. r?gabor draft
authorMike Conley <mconley@mozilla.com>
Fri, 29 Apr 2016 15:28:29 -0400
changeset 374028 677e38e8f04be88fcb377409777e113dac44bd8b
parent 373519 d7d7e79d38d5d03e91ff3463a1f65009f99d59e0
child 374029 cf0dc1575e77b4e792e99cc7ec10e089900950c9
push id19904
push usermconley@mozilla.com
push dateWed, 01 Jun 2016 17:55:36 +0000
reviewersgabor
bugs1276738
milestone49.0a1
Bug 1276738 - Test that new windows opened from remote content get the right flags. r?gabor MozReview-Commit-ID: 3zgJrU0LeUV
embedding/components/windowwatcher/moz.build
embedding/components/windowwatcher/test/browser.ini
embedding/components/windowwatcher/test/browser_new_remote_window_flags.js
embedding/components/windowwatcher/test/moz.build
--- a/embedding/components/windowwatcher/moz.build
+++ b/embedding/components/windowwatcher/moz.build
@@ -1,14 +1,16 @@
 # -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
+TEST_DIRS += ['test']
+
 XPIDL_SOURCES += [
     'nsIDialogParamBlock.idl',
     'nsIPromptFactory.idl',
     'nsIPromptService.idl',
     'nsIPromptService2.idl',
     'nsIWindowWatcher.idl',
     'nsPIPromptService.idl',
     'nsPIWindowWatcher.idl',
new file mode 100644
--- /dev/null
+++ b/embedding/components/windowwatcher/test/browser.ini
@@ -0,0 +1,5 @@
+[DEFAULT]
+tags = openwindow
+
+[browser_new_remote_window_flags.js]
+run-if = e10s
new file mode 100644
--- /dev/null
+++ b/embedding/components/windowwatcher/test/browser_new_remote_window_flags.js
@@ -0,0 +1,78 @@
+/**
+ * Tests that when a remote browser opens a new window that the
+ * newly opened window is also remote.
+ */
+
+const ANCHOR_PAGE = `data:text/html,<a href="about:blank" target="_blank">Click me!</a>`;
+const SCRIPT_PAGE = `data:text/html,<script>window.open("about:blank", "_blank");</script>`;
+
+// This magic value of 2 means that by default, when content tries
+// to open a new window, it'll actually open in a new window instead
+// of a new tab.
+add_task(function* setup() {
+  yield SpecialPowers.pushPrefEnv({"set": [
+    ["browser.link.open_newwindow", 2],
+  ]});
+});
+
+function assertFlags(win) {
+  let webNav = win.QueryInterface(Ci.nsIInterfaceRequestor)
+                  .getInterface(Ci.nsIWebNavigation);
+  let loadContext = webNav.QueryInterface(Ci.nsILoadContext);
+  let chromeFlags = webNav.QueryInterface(Ci.nsIDocShellTreeItem)
+                          .treeOwner
+                          .QueryInterface(Ci.nsIInterfaceRequestor)
+                          .getInterface(Ci.nsIXULWindow)
+                          .chromeFlags;
+  Assert.ok(loadContext.useRemoteTabs,
+            "Should be using remote tabs on the load context");
+  Assert.ok(chromeFlags & Ci.nsIWebBrowserChrome.CHROME_REMOTE_WINDOW,
+            "Should have the remoteness chrome flag on the window");
+}
+
+/**
+ * Content can open a window using a target="_blank" link
+ */
+add_task(function* test_new_remote_window_flags_target_blank() {
+  yield BrowserTestUtils.withNewTab({
+    gBrowser,
+    url: ANCHOR_PAGE,
+  }, function*(browser) {
+    let newWinPromise = BrowserTestUtils.waitForNewWindow();
+    yield BrowserTestUtils.synthesizeMouseAtCenter("a", {}, browser);
+    let win = yield newWinPromise;
+    assertFlags(win);
+    yield BrowserTestUtils.closeWindow(win);
+  });
+});
+
+/**
+ * Content can open a window using window.open
+ */
+add_task(function* test_new_remote_window_flags_window_open() {
+  let newWinPromise = BrowserTestUtils.waitForNewWindow();
+
+  yield BrowserTestUtils.withNewTab({
+    gBrowser,
+    url: SCRIPT_PAGE,
+  }, function*(browser) {
+    let win = yield newWinPromise;
+    assertFlags(win);
+    yield BrowserTestUtils.closeWindow(win);
+  });
+});
+
+/**
+ * Privileged content scripts can also open new windows
+ * using content.open.
+ */
+add_task(function* test_new_remote_window_flags_content_open() {
+  let newWinPromise = BrowserTestUtils.waitForNewWindow();
+  yield ContentTask.spawn(gBrowser.selectedBrowser, null, function*() {
+    content.open("about:blank", "_blank");
+  });
+
+  let win = yield newWinPromise;
+  assertFlags(win);
+  yield BrowserTestUtils.closeWindow(win);
+});
new file mode 100644
--- /dev/null
+++ b/embedding/components/windowwatcher/test/moz.build
@@ -0,0 +1,10 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+BROWSER_CHROME_MANIFESTS += [
+    'browser.ini',
+]
+