tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 93152f6c191d43beb7aa967448b7b90416bb0f78
parent 186f2503504f83f15d6ed993adf94f09c718384b
Author: Tanvi Manku <tanvi.manku@gmail.com>
Date:   Thu,  8 Jan 2026 00:14:32 +0000

Bug 2001254: Add basic tests for "Manage addresses" dialog and subpage. r=mtigley,credential-management-reviewers

Differential Revision: https://phabricator.services.mozilla.com/D276937

Diffstat:
Mbrowser/extensions/formautofill/test/browser/address/browser.toml | 2++
Abrowser/extensions/formautofill/test/browser/address/browser_manageAddresses.js | 186+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mtoolkit/components/formautofill/FormAutofillPreferences.sys.mjs | 2++
3 files changed, 190 insertions(+), 0 deletions(-)

diff --git a/browser/extensions/formautofill/test/browser/address/browser.toml b/browser/extensions/formautofill/test/browser/address/browser.toml @@ -74,6 +74,8 @@ skip-if = [ ["browser_edit_address_doorhanger_save_edited_fields.js"] +["browser_manageAddresses.js"] + ["browser_phonenumber.js"] ["browser_phonenumber_country.js"] diff --git a/browser/extensions/formautofill/test/browser/address/browser_manageAddresses.js b/browser/extensions/formautofill/test/browser/address/browser_manageAddresses.js @@ -0,0 +1,186 @@ +"use strict"; + +const PAGE_PREFS = "about:preferences"; +const PAGE_PRIVACY = PAGE_PREFS + "#privacy"; + +const DIALOG_SIZE = "width=600,height=400"; + +const SELECTORS_DIALOG = { + records: "#addresses", + add: "#add", + edit: "#edit", + remove: "#remove", +}; + +const SELECTORS_SUBPAGE = { + records: "#address-item", + add: "#add-address-button", + edit: "#edit-address-button", + remove: "#delete-address-button", +}; + +const TEST_ADDRESSES = [ + TEST_ADDRESS_1, + TEST_ADDRESS_2, + TEST_ADDRESS_3, + TEST_ADDRESS_4, + TEST_ADDRESS_5, +]; + +async function clearAddresses() { + await removeAllRecords(); +} + +async function addAddresses(addresses) { + for (let address of addresses) { + await setStorage(address); + } +} + +async function withAddressDialog(taskFn) { + await SpecialPowers.pushPrefEnv({ + set: [["browser.settings-redesign.enabled", false]], + }); + + let win = window.openDialog(MANAGE_ADDRESSES_DIALOG_URL); + await waitForFocusAndFormReady(win); + try { + await taskFn(win); + } finally { + win.close(); + } +} + +async function withAddressSubpage(taskFn) { + await SpecialPowers.pushPrefEnv({ + set: [["browser.settings-redesign.enabled", true]], + }); + + let finalPrefPaneLoaded = TestUtils.topicObserved("sync-pane-loaded"); + + await BrowserTestUtils.withNewTab( + { gBrowser, url: PAGE_PRIVACY }, + async browser => { + await finalPrefPaneLoaded; + + await SpecialPowers.spawn(browser, [], async () => { + info("Opening Saved Addresses subpage"); + + const savedAddressesBtn = content.document.querySelector( + "#savedAddressesButton" + ); + ok(savedAddressesBtn, "Saved Addresses button exists"); + savedAddressesBtn.click(); + + const addressesPage = content.document.querySelector( + '[data-category="paneManageAddresses"]' + ); + ok(addressesPage, "Manage Addresses page exists"); + + await ContentTaskUtils.waitForCondition( + () => !addressesPage.hidden, + "Manage addresses subpage did not become visible" + ); + + ok(true, "Manage addresses subpage is visible"); + }); + + await taskFn(browser); + } + ); +} + +add_task(async function test_dialogInitialState() { + await clearAddresses(); + + await withAddressDialog(async win => { + const doc = win.document; + const records = doc.querySelector(SELECTORS_DIALOG.records); + const btnAdd = doc.querySelector(SELECTORS_DIALOG.add); + const btnEdit = doc.querySelector(SELECTORS_DIALOG.edit); + const btnRemove = doc.querySelector(SELECTORS_DIALOG.remove); + + is(records.length, 0, "No addresses initially"); + ok(!btnAdd.disabled, "Add enabled"); + ok(btnEdit.disabled, "Edit disabled"); + ok(btnRemove.disabled, "Remove disabled"); + }); +}); + +add_task(async function test_dialogStorageObserver() { + await clearAddresses(); + + await withAddressDialog(async win => { + const records = win.document.querySelector(SELECTORS_DIALOG.records); + + await setStorage(TEST_ADDRESS_1); + await BrowserTestUtils.waitForEvent(records, "RecordsLoaded"); + is(records.length, 1, "Address added"); + + await removeAddresses([records.options[0].value]); + await BrowserTestUtils.waitForEvent(records, "RecordsLoaded"); + is(records.length, 0, "Address removed"); + }); +}); + +add_task(async function test_subpageInitialState() { + await clearAddresses(); + await withAddressSubpage(async browser => { + await SpecialPowers.spawn(browser, [SELECTORS_SUBPAGE], selectors => { + const records = content.document.querySelectorAll(selectors.records); + const btnAdd = content.document.querySelector(selectors.add); + const editBtns = content.document.querySelectorAll(selectors.edit); + const deleteBtns = content.document.querySelectorAll(selectors.remove); + + is(records.length, 0, "No addresses initially"); + ok(!btnAdd.disabled, "Add enabled"); + is( + editBtns.length, + 0, + "No edit buttons present since no addresses initially" + ); + is( + deleteBtns.length, + 0, + "No delete buttons present since no addresses initially" + ); + }); + }); +}); + +add_task(async function test_subpageStorageObserver() { + await clearAddresses(); + + await withAddressSubpage(async browser => { + await setStorage(TEST_ADDRESS_1); + + await SpecialPowers.spawn(browser, [SELECTORS_SUBPAGE], async selectors => { + await ContentTaskUtils.waitForCondition( + () => content.document.querySelectorAll(selectors.records).length === 1, + "Address did not appear" + ); + + ok(true, "Address appeared"); + }); + }); +}); + +add_task(async function test_subpageEditButtonOpensEditor() { + await clearAddresses(); + await addAddresses([TEST_ADDRESS_1]); + + await withAddressSubpage(async browser => { + await SpecialPowers.spawn(browser, [SELECTORS_SUBPAGE], async selectors => { + const edit = content.document.querySelector(selectors.edit); + edit.click(); + + const dialog = content.document.querySelector(".dialogBox"); + await ContentTaskUtils.waitForCondition( + () => !dialog.hidden, + "Edit dialog did not open" + ); + + ok(true, "Edit address dialog opened"); + }); + }); +}); diff --git a/toolkit/components/formautofill/FormAutofillPreferences.sys.mjs b/toolkit/components/formautofill/FormAutofillPreferences.sys.mjs @@ -345,6 +345,7 @@ export class FormAutofillPreferences { }, options: [ { + id: "delete-address-button", control: "moz-button", iconSrc: "chrome://global/skin/icons/delete.svg", type: "icon", @@ -356,6 +357,7 @@ export class FormAutofillPreferences { }, }, { + id: "edit-address-button", control: "moz-button", iconSrc: "chrome://global/skin/icons/edit.svg", type: "icon",