summaryrefslogtreecommitdiffstats
path: root/browser/components/migration/tests/browser/browser_permissions.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/migration/tests/browser/browser_permissions.js')
-rw-r--r--browser/components/migration/tests/browser/browser_permissions.js166
1 files changed, 166 insertions, 0 deletions
diff --git a/browser/components/migration/tests/browser/browser_permissions.js b/browser/components/migration/tests/browser/browser_permissions.js
new file mode 100644
index 0000000000..35d902bb37
--- /dev/null
+++ b/browser/components/migration/tests/browser/browser_permissions.js
@@ -0,0 +1,166 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+add_setup(async function () {
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.migrate.chrome.get_permissions.enabled", true]],
+ });
+});
+
+/**
+ * Tests that the migration wizard can request permission from
+ * the user to read from other browser data directories when
+ * explicit permission needs to be granted.
+ *
+ * This can occur when, for example, Firefox is installed as a
+ * Snap on Ubuntu Linux. In this state, Firefox does not have
+ * direct read access to other browser's data directories (although)
+ * it can tell if they exist. For Chromium-based browsers, this
+ * means we cannot tell what profiles nor resources are available
+ * for Chromium-based browsers without read permissions.
+ *
+ * Note that the Safari migrator is not tested here, as it has
+ * its own special permission flow. This is because we can
+ * determine what resources Safari has before requiring permissions,
+ * and (as of this writing) Safari does not support multiple
+ * user profiles.
+ */
+add_task(async function test_permissions() {
+ Services.telemetry.clearEvents();
+
+ let sandbox = sinon.createSandbox();
+ registerCleanupFunction(() => {
+ sandbox.restore();
+ });
+
+ sandbox
+ .stub(InternalTestingProfileMigrator.prototype, "canGetPermissions")
+ .resolves("/some/path");
+
+ let hasPermissionsStub = sandbox
+ .stub(InternalTestingProfileMigrator.prototype, "hasPermissions")
+ .resolves(false);
+
+ let testingMigrator = await MigrationUtils.getMigrator(
+ InternalTestingProfileMigrator.key
+ );
+ Assert.ok(
+ testingMigrator,
+ "Got migrator, even though we don't yet have permission to read its resources."
+ );
+
+ sandbox.stub(testingMigrator, "getPermissions").callsFake(async () => {
+ testingMigrator.flushResourceCache();
+ hasPermissionsStub.resolves(true);
+ return Promise.resolve(true);
+ });
+
+ let getResourcesStub = sandbox
+ .stub(testingMigrator, "getResources")
+ .resolves([]);
+
+ let migration = waitForTestMigration(
+ [MigrationUtils.resourceTypes.BOOKMARKS],
+ [MigrationUtils.resourceTypes.BOOKMARKS],
+ InternalTestingProfileMigrator.testProfile
+ );
+
+ await withMigrationWizardDialog(async prefsWin => {
+ let dialogBody = prefsWin.document.body;
+ let wizard = dialogBody.querySelector("migration-wizard");
+ let shadow = wizard.openOrClosedShadowRoot;
+
+ // Clear out any pre-existing events events have been logged
+ Services.telemetry.clearEvents();
+ TelemetryTestUtils.assertNumberOfEvents(0);
+
+ let panelItem = shadow.querySelector(
+ `panel-item[key="${InternalTestingProfileMigrator.key}"]`
+ );
+ panelItem.click();
+
+ let resourceList = shadow.querySelector(".resource-selection-details");
+ Assert.ok(
+ BrowserTestUtils.isHidden(resourceList),
+ "Resources list is hidden."
+ );
+ let importButton = shadow.querySelector("#import");
+ Assert.ok(BrowserTestUtils.isHidden(importButton), "Import button hidden.");
+ let noPermissionsMessage = shadow.querySelector(".no-permissions-message");
+ Assert.ok(
+ BrowserTestUtils.isVisible(noPermissionsMessage),
+ "No permissions message shown."
+ );
+ let getPermissionButton = shadow.querySelector("#get-permissions");
+ Assert.ok(
+ BrowserTestUtils.isVisible(getPermissionButton),
+ "Get permissions button shown."
+ );
+
+ // Now put the permissions functions back into their default
+ // state - which is the "permission granted" state.
+ getResourcesStub.restore();
+ hasPermissionsStub.restore();
+
+ let refreshDone = BrowserTestUtils.waitForEvent(
+ wizard,
+ "MigrationWizard:Ready"
+ );
+
+ getPermissionButton.click();
+
+ await refreshDone;
+ Assert.ok(true, "Refreshed migrator list.");
+
+ let wizardDone = BrowserTestUtils.waitForEvent(
+ wizard,
+ "MigrationWizard:DoneMigration"
+ );
+ selectResourceTypesAndStartMigration(wizard, [
+ MigrationWizardConstants.DISPLAYED_RESOURCE_TYPES.BOOKMARKS,
+ ]);
+ await migration;
+ await wizardDone;
+
+ assertQuantitiesShown(wizard, [
+ MigrationWizardConstants.DISPLAYED_RESOURCE_TYPES.BOOKMARKS,
+ ]);
+
+ let dialog = prefsWin.document.querySelector("#migrationWizardDialog");
+ let doneButton = shadow.querySelector(
+ "div[name='page-progress'] .done-button"
+ );
+
+ await new Promise(resolve => prefsWin.requestAnimationFrame(resolve));
+ Assert.equal(
+ shadow.activeElement,
+ doneButton,
+ "Done button should be focused."
+ );
+
+ let dialogClosed = BrowserTestUtils.waitForEvent(dialog, "close");
+ doneButton.click();
+ await dialogClosed;
+ });
+
+ TelemetryTestUtils.assertEvents(
+ [
+ {
+ category: "browser.migration",
+ method: "linux_perms",
+ object: "wizard",
+ value: null,
+ extra: {
+ migrator_key: InternalTestingProfileMigrator.key,
+ },
+ },
+ ],
+ {
+ category: "browser.migration",
+ method: "linux_perms",
+ object: "wizard",
+ }
+ );
+});