summaryrefslogtreecommitdiffstats
path: root/dom/credentialmanagement/tests/browser
diff options
context:
space:
mode:
Diffstat (limited to 'dom/credentialmanagement/tests/browser')
-rw-r--r--dom/credentialmanagement/tests/browser/browser.ini1
-rw-r--r--dom/credentialmanagement/tests/browser/browser_active_document.js139
2 files changed, 140 insertions, 0 deletions
diff --git a/dom/credentialmanagement/tests/browser/browser.ini b/dom/credentialmanagement/tests/browser/browser.ini
new file mode 100644
index 0000000000..95fedbf3ff
--- /dev/null
+++ b/dom/credentialmanagement/tests/browser/browser.ini
@@ -0,0 +1 @@
+[browser_active_document.js]
diff --git a/dom/credentialmanagement/tests/browser/browser_active_document.js b/dom/credentialmanagement/tests/browser/browser_active_document.js
new file mode 100644
index 0000000000..eced461630
--- /dev/null
+++ b/dom/credentialmanagement/tests/browser/browser_active_document.js
@@ -0,0 +1,139 @@
+/* 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/. */
+
+"use strict";
+
+const TEST_URL = "https://example.com/";
+
+function arrivingHereIsBad(aResult) {
+ ok(false, "Bad result! Received a: " + aResult);
+}
+
+function expectNotAllowedError(aResult) {
+ let expected = "NotAllowedError";
+ is(aResult.slice(0, expected.length), expected, `Expecting a ${expected}`);
+}
+
+function promiseMakeCredential(tab) {
+ return ContentTask.spawn(tab.linkedBrowser, null, async function () {
+ const cose_alg_ECDSA_w_SHA256 = -7;
+
+ let publicKey = {
+ rp: { id: content.document.domain, name: "none", icon: "none" },
+ user: {
+ id: new Uint8Array(),
+ name: "none",
+ icon: "none",
+ displayName: "none",
+ },
+ challenge: content.crypto.getRandomValues(new Uint8Array(16)),
+ timeout: 5000, // the minimum timeout is actually 15 seconds
+ pubKeyCredParams: [{ type: "public-key", alg: cose_alg_ECDSA_w_SHA256 }],
+ };
+
+ return content.navigator.credentials.create({ publicKey });
+ });
+}
+
+function promiseGetAssertion(tab) {
+ return ContentTask.spawn(tab.linkedBrowser, null, async function () {
+ let newCredential = {
+ type: "public-key",
+ id: content.crypto.getRandomValues(new Uint8Array(16)),
+ transports: ["usb"],
+ };
+
+ let publicKey = {
+ challenge: content.crypto.getRandomValues(new Uint8Array(16)),
+ timeout: 5000, // the minimum timeout is actually 15 seconds
+ rpId: content.document.domain,
+ allowCredentials: [newCredential],
+ };
+
+ return content.navigator.credentials.get({ publicKey });
+ });
+}
+
+add_task(async function test_setup() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["security.webauth.webauthn", true],
+ ["security.webauth.webauthn_enable_softtoken", true],
+ ["security.webauth.webauthn_enable_usbtoken", false],
+ ],
+ });
+});
+
+add_task(async function test_background_tab() {
+ // Open two tabs, the last one will selected.
+ let tab_bg = await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL);
+ let tab_fg = await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL);
+
+ // Requests from background tabs must fail.
+ await promiseMakeCredential(tab_bg)
+ .then(arrivingHereIsBad)
+ .catch(expectNotAllowedError);
+
+ // Requests from background tabs must fail.
+ await promiseGetAssertion(tab_bg)
+ .then(arrivingHereIsBad)
+ .catch(expectNotAllowedError);
+
+ // Close tabs.
+ await BrowserTestUtils.removeTab(tab_bg);
+ await BrowserTestUtils.removeTab(tab_fg);
+});
+
+add_task(async function test_background_window() {
+ // Open a tab, then a new window.
+ let tab_bg = await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL);
+ let win = await BrowserTestUtils.openNewBrowserWindow();
+
+ // Wait until the new window is really focused.
+ await new Promise(resolve => SimpleTest.waitForFocus(resolve, win));
+
+ // Requests from selected tabs not in the active window must fail.
+ await promiseMakeCredential(tab_bg)
+ .then(arrivingHereIsBad)
+ .catch(expectNotAllowedError);
+
+ // Requests from selected tabs not in the active window must fail.
+ await promiseGetAssertion(tab_bg)
+ .then(arrivingHereIsBad)
+ .catch(expectNotAllowedError);
+
+ // Close tab and window.
+ await BrowserTestUtils.closeWindow(win);
+ await BrowserTestUtils.removeTab(tab_bg);
+});
+
+add_task(async function test_minimized() {
+ // Minimizing windows doesn't supported in headless mode.
+ if (Services.env.get("MOZ_HEADLESS")) {
+ return;
+ }
+
+ // Open a window with a tab.
+ let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL);
+
+ // Minimize the window.
+ window.minimize();
+ await TestUtils.waitForCondition(() => !tab.linkedBrowser.docShellIsActive);
+
+ // Requests from minimized windows must fail.
+ await promiseMakeCredential(tab)
+ .then(arrivingHereIsBad)
+ .catch(expectNotAllowedError);
+
+ // Requests from minimized windows must fail.
+ await promiseGetAssertion(tab)
+ .then(arrivingHereIsBad)
+ .catch(expectNotAllowedError);
+
+ // Restore the window.
+ await new Promise(resolve => SimpleTest.waitForFocus(resolve, window));
+
+ // Close tab.
+ await BrowserTestUtils.removeTab(tab);
+});