summaryrefslogtreecommitdiffstats
path: root/browser/components/contextualidentity/test/browser/browser_usercontextid_tabdrop.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/contextualidentity/test/browser/browser_usercontextid_tabdrop.js')
-rw-r--r--browser/components/contextualidentity/test/browser/browser_usercontextid_tabdrop.js181
1 files changed, 181 insertions, 0 deletions
diff --git a/browser/components/contextualidentity/test/browser/browser_usercontextid_tabdrop.js b/browser/components/contextualidentity/test/browser/browser_usercontextid_tabdrop.js
new file mode 100644
index 0000000000..bddf39eb87
--- /dev/null
+++ b/browser/components/contextualidentity/test/browser/browser_usercontextid_tabdrop.js
@@ -0,0 +1,181 @@
+"use strict";
+
+let EventUtils = {};
+Services.scriptloader.loadSubScript(
+ "chrome://mochikit/content/tests/SimpleTest/EventUtils.js",
+ EventUtils
+);
+
+/**
+ * Dragging an URL to a tab without userContextId set.
+ */
+add_task(async function () {
+ let tab = BrowserTestUtils.addTab(gBrowser, "http://example.com/");
+ await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
+
+ let awaitDrop = BrowserTestUtils.waitForEvent(gBrowser.tabContainer, "drop");
+ let newTabPromise = BrowserTestUtils.waitForNewTab(
+ gBrowser,
+ "http://test1.example.com/",
+ true
+ );
+
+ // A drop type of "link" onto an existing tab would normally trigger a
+ // load in that same tab, but tabbrowser code in _getDragTargetTab treats
+ // drops on the outer edges of a tab differently (loading a new tab
+ // instead). Make events created by synthesizeDrop have all of their
+ // coordinates set to 0 (screenX/screenY), so they're treated as drops
+ // on the outer edge of the tab, thus they open new tabs.
+ let event = {
+ clientX: 0,
+ clientY: 0,
+ screenX: 0,
+ screenY: 0,
+ };
+ EventUtils.synthesizeDrop(
+ tab,
+ tab,
+ [[{ type: "text/plain", data: "http://test1.example.com/" }]],
+ "link",
+ window,
+ undefined,
+ event
+ );
+
+ await awaitDrop;
+
+ let tab2 = await newTabPromise;
+ Assert.ok(
+ !tab2.hasAttribute("usercontextid"),
+ "Tab shouldn't have usercontextid attribute"
+ );
+
+ await SpecialPowers.spawn(tab2.linkedBrowser, [], async function () {
+ Assert.equal(content.document.documentURI, "http://test1.example.com/");
+ Assert.equal(
+ content.document.nodePrincipal.originAttributes.userContextId,
+ 0
+ );
+
+ // referrer is empty when urls are dragged to new or existing tabs.
+ // If this changes in the future, it would be okay to send the referrer
+ // in this case because we are creating a new tab with the default
+ // usercontextid as the original tab.
+ Assert.equal(content.document.referrer, "", "referrer should be empty");
+ });
+
+ BrowserTestUtils.removeTab(tab);
+ BrowserTestUtils.removeTab(tab2);
+});
+
+/**
+ * When dragging an URL to a new tab, the new tab should have the same
+ * userContextId as the original tab.
+ */
+add_task(async function () {
+ let tab = BrowserTestUtils.addTab(gBrowser, "http://example.com/", {
+ userContextId: 1,
+ });
+ await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
+
+ let awaitDrop = BrowserTestUtils.waitForEvent(gBrowser.tabContainer, "drop");
+ let newTabPromise = BrowserTestUtils.waitForNewTab(
+ gBrowser,
+ "http://test1.example.com/",
+ true
+ );
+
+ // A drop type of "link" onto an existing tab would normally trigger a
+ // load in that same tab, but tabbrowser code in _getDragTargetTab treats
+ // drops on the outer edges of a tab differently (loading a new tab
+ // instead). Make events created by synthesizeDrop have all of their
+ // coordinates set to 0 (screenX/screenY), so they're treated as drops
+ // on the outer edge of the tab, thus they open new tabs.
+ let event = {
+ clientX: 0,
+ clientY: 0,
+ screenX: 0,
+ screenY: 0,
+ };
+ EventUtils.synthesizeDrop(
+ tab,
+ tab,
+ [[{ type: "text/plain", data: "http://test1.example.com/" }]],
+ "link",
+ window,
+ undefined,
+ event
+ );
+
+ await awaitDrop;
+
+ let tab2 = await newTabPromise;
+ Assert.equal(tab2.getAttribute("usercontextid"), 1);
+
+ await SpecialPowers.spawn(tab2.linkedBrowser, [], async function () {
+ Assert.equal(content.document.documentURI, "http://test1.example.com/");
+ Assert.equal(
+ content.document.nodePrincipal.originAttributes.userContextId,
+ 1
+ );
+
+ // referrer is empty when urls are dragged to new or existing tabs.
+ // If this changes in the future, it would be okay to send the referrer
+ // in this case because we are creating a new tab with the same
+ // usercontextid as the original tab.
+ Assert.equal(content.document.referrer, "", "referrer should be empty");
+ });
+
+ BrowserTestUtils.removeTab(tab);
+ BrowserTestUtils.removeTab(tab2);
+});
+
+/**
+ * When dragging a URL from one tab or link on a tab to an existing tab, the
+ * existing tab should not change its userContextId.
+ * Ex: if you drag a link from tab 1 with userContext 1 to tab 2 with
+ * userContext 2, the link will open in tab 2 with userContext 2.
+ */
+add_task(async function () {
+ let tab = BrowserTestUtils.addTab(gBrowser, "http://example.com/", {
+ userContextId: 1,
+ });
+ await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
+
+ let tab2 = BrowserTestUtils.addTab(gBrowser, "http://example.org/", {
+ userContextId: 2,
+ });
+ await BrowserTestUtils.browserLoaded(tab2.linkedBrowser);
+
+ let awaitDrop = BrowserTestUtils.waitForEvent(gBrowser.tabContainer, "drop");
+
+ EventUtils.synthesizeDrop(
+ tab,
+ tab2,
+ [[{ type: "text/plain", data: "http://test1.example.com/" }]],
+ "link",
+ window
+ );
+
+ await awaitDrop;
+ Assert.equal(tab2.getAttribute("usercontextid"), 2);
+
+ await BrowserTestUtils.browserLoaded(tab2.linkedBrowser);
+
+ await SpecialPowers.spawn(tab2.linkedBrowser, [], async function () {
+ Assert.equal(content.document.documentURI, "http://test1.example.com/");
+ Assert.equal(
+ content.document.nodePrincipal.originAttributes.userContextId,
+ 2
+ );
+
+ // referrer is empty when urls are dragged to new or existing tabs.
+ // If this changes in the future, we should ensure that we are not sending
+ // a referrer for this case! When opening links across user contexts, we
+ // don't want the referrer to follow the user from one context to another.
+ Assert.equal(content.document.referrer, "", "referrer should be empty");
+ });
+
+ BrowserTestUtils.removeTab(tab);
+ BrowserTestUtils.removeTab(tab2);
+});