diff options
Diffstat (limited to 'toolkit/mozapps/extensions/test/browser/browser_html_abuse_report.js')
-rw-r--r-- | toolkit/mozapps/extensions/test/browser/browser_html_abuse_report.js | 1091 |
1 files changed, 0 insertions, 1091 deletions
diff --git a/toolkit/mozapps/extensions/test/browser/browser_html_abuse_report.js b/toolkit/mozapps/extensions/test/browser/browser_html_abuse_report.js deleted file mode 100644 index f20e5b357b..0000000000 --- a/toolkit/mozapps/extensions/test/browser/browser_html_abuse_report.js +++ /dev/null @@ -1,1091 +0,0 @@ -/* 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/. */ -/* eslint max-len: ["error", 80] */ - -loadTestSubscript("head_abuse_report.js"); - -add_setup(async function () { - // Make sure the integrated abuse report panel is the one enabled - // while this test file runs (instead of the AMO hosted form). - // NOTE: behaviors expected when amoFormEnabled is true are tested - // in the separate browser_amo_abuse_report.js test file. - await SpecialPowers.pushPrefEnv({ - set: [["extensions.abuseReport.amoFormEnabled", false]], - }); - await AbuseReportTestUtils.setup(); -}); - -/** - * Base tests on abuse report panel webcomponents. - */ - -// This test case verified that the abuse report panels contains a radio -// button for all the expected "abuse report reasons", they are grouped -// together under the same form field named "reason". -add_task(async function test_abusereport_issuelist() { - const extension = await installTestExtension(); - - const abuseReportEl = await AbuseReportTestUtils.openReport(extension.id); - - const reasonsPanel = abuseReportEl._reasonsPanel; - const radioButtons = reasonsPanel.querySelectorAll("[type=radio]"); - const selectedRadios = reasonsPanel.querySelectorAll("[type=radio]:checked"); - - is(selectedRadios.length, 1, "Expect only one radio button selected"); - is( - selectedRadios[0], - radioButtons[0], - "Expect the first radio button to be selected" - ); - - is( - abuseReportEl.reason, - radioButtons[0].value, - `The reason property has the expected value: ${radioButtons[0].value}` - ); - - const reasons = Array.from(radioButtons).map(el => el.value); - Assert.deepEqual( - reasons.sort(), - AbuseReportTestUtils.getReasons(abuseReportEl).sort(), - `Got a radio button for the expected reasons` - ); - - for (const radio of radioButtons) { - const reasonInfo = AbuseReportTestUtils.getReasonInfo( - abuseReportEl, - radio.value - ); - const expectExampleHidden = - reasonInfo && reasonInfo.isExampleHidden("extension"); - is( - radio.parentNode.querySelector(".reason-example").hidden, - expectExampleHidden, - `Got expected visibility on the example for reason "${radio.value}"` - ); - } - - info("Change the selected reason to " + radioButtons[3].value); - radioButtons[3].checked = true; - is( - abuseReportEl.reason, - radioButtons[3].value, - "The reason property has the expected value" - ); - - await extension.unload(); - await closeAboutAddons(); -}); - -// This test case verifies that the abuse report panel: -// - switches from its "reasons list" mode to its "submit report" mode when the -// "next" button is clicked -// - goes back to the "reasons list" mode when the "go back" button is clicked -// - the abuse report panel is closed when the "close" icon is clicked -add_task(async function test_abusereport_submitpanel() { - const extension = await installTestExtension(); - - const abuseReportEl = await AbuseReportTestUtils.openReport(extension.id); - - ok( - !abuseReportEl._reasonsPanel.hidden, - "The list of abuse reasons is the currently visible" - ); - ok( - abuseReportEl._submitPanel.hidden, - "The submit panel is the currently hidden" - ); - - let onceUpdated = AbuseReportTestUtils.promiseReportUpdated( - abuseReportEl, - "submit" - ); - const MozButtonGroup = - abuseReportEl.ownerGlobal.customElements.get("moz-button-group"); - - ok(MozButtonGroup, "Expect MozButtonGroup custom element to be defined"); - - const assertButtonInMozButtonGroup = ( - btnEl, - { expectPrimary = false } = {} - ) => { - // Let's include the l10n id into the assertion messages, - // to make it more likely to be immediately clear which - // button hit a failure if any of the following assertion - // fails. - let l10nId = btnEl.getAttribute("data-l10n-id"); - is( - btnEl.classList.contains("primary"), - expectPrimary, - `Expect button ${l10nId} to have${ - expectPrimary ? "" : " NOT" - } the primary class set` - ); - - ok( - btnEl.parentElement instanceof MozButtonGroup, - `Expect button ${l10nId} to be slotted inside the expected custom element` - ); - - is( - btnEl.getAttribute("slot"), - expectPrimary ? "primary" : null, - `Expect button ${l10nId} slot to ${ - expectPrimary ? "" : "NOT " - } be set to primary` - ); - }; - - // Verify button group from the initial panel. - assertButtonInMozButtonGroup(abuseReportEl._btnNext, { expectPrimary: true }); - assertButtonInMozButtonGroup(abuseReportEl._btnCancel, { - expectPrimary: false, - }); - await AbuseReportTestUtils.clickPanelButton(abuseReportEl._btnNext); - await onceUpdated; - // Verify button group from the submit panel mode. - assertButtonInMozButtonGroup(abuseReportEl._btnSubmit, { - expectPrimary: true, - }); - assertButtonInMozButtonGroup(abuseReportEl._btnGoBack, { - expectPrimary: false, - }); - onceUpdated = AbuseReportTestUtils.promiseReportUpdated( - abuseReportEl, - "reasons" - ); - await AbuseReportTestUtils.clickPanelButton(abuseReportEl._btnGoBack); - await onceUpdated; - - const onceReportClosed = - AbuseReportTestUtils.promiseReportClosed(abuseReportEl); - await AbuseReportTestUtils.clickPanelButton(abuseReportEl._btnCancel); - await onceReportClosed; - - await extension.unload(); - await closeAboutAddons(); -}); - -// This test case verifies that the abuse report panel sends the expected data -// in the "abuse-report:submit" event detail. -add_task(async function test_abusereport_submit() { - // Reset the timestamp of the last report between tests. - AbuseReporter._lastReportTimestamp = null; - const extension = await installTestExtension(); - - const abuseReportEl = await AbuseReportTestUtils.openReport(extension.id); - - ok( - !abuseReportEl._reasonsPanel.hidden, - "The list of abuse reasons is the currently visible" - ); - - let onceUpdated = AbuseReportTestUtils.promiseReportUpdated( - abuseReportEl, - "submit" - ); - await AbuseReportTestUtils.clickPanelButton(abuseReportEl._btnNext); - await onceUpdated; - - is(abuseReportEl.message, "", "The abuse report message is initially empty"); - - info("Test typing a message in the abuse report submit panel textarea"); - const typedMessage = "Description of the extension abuse report"; - - EventUtils.synthesizeComposition( - { - data: typedMessage, - type: "compositioncommit", - }, - abuseReportEl.ownerGlobal - ); - - is( - abuseReportEl.message, - typedMessage, - "Got the expected typed message in the abuse report" - ); - - const expectedDetail = { - addonId: extension.id, - }; - - const expectedReason = abuseReportEl.reason; - const expectedMessage = abuseReportEl.message; - - function handleSubmitRequest({ request, response }) { - response.setStatusLine(request.httpVersion, 200, "OK"); - response.setHeader("Content-Type", "application/json", false); - response.write("{}"); - } - - let reportSubmitted; - const onReportSubmitted = AbuseReportTestUtils.promiseReportSubmitHandled( - ({ data, request, response }) => { - reportSubmitted = JSON.parse(data); - handleSubmitRequest({ request, response }); - } - ); - - const onceReportClosed = - AbuseReportTestUtils.promiseReportClosed(abuseReportEl); - - const onMessageBarsCreated = AbuseReportTestUtils.promiseMessageBars(2); - - const onceSubmitEvent = BrowserTestUtils.waitForEvent( - abuseReportEl, - "abuse-report:submit" - ); - await AbuseReportTestUtils.clickPanelButton(abuseReportEl._btnSubmit); - const submitEvent = await onceSubmitEvent; - - const actualDetail = { - addonId: submitEvent.detail.addonId, - }; - Assert.deepEqual( - actualDetail, - expectedDetail, - "Got the expected detail in the abuse-report:submit event" - ); - - ok( - submitEvent.detail.report, - "Got a report object in the abuse-report:submit event detail" - ); - - // Verify that, when the "abuse-report:submit" has been sent, - // the abuse report panel has been hidden, the report has been - // submitted and the expected message bar is created in the - // HTML about:addons page. - info("Wait the report to be submitted to the api server"); - await onReportSubmitted; - info("Wait the report panel to be closed"); - await onceReportClosed; - - is( - reportSubmitted.addon, - ADDON_ID, - "Got the expected addon in the submitted report" - ); - is( - reportSubmitted.reason, - expectedReason, - "Got the expected reason in the submitted report" - ); - is( - reportSubmitted.message, - expectedMessage, - "Got the expected message in the submitted report" - ); - is( - reportSubmitted.report_entry_point, - REPORT_ENTRY_POINT, - "Got the expected report_entry_point in the submitted report" - ); - - info("Waiting the expected message bars to be created"); - const barDetails = await onMessageBarsCreated; - is(barDetails.length, 2, "Expect two message bars to have been created"); - is( - barDetails[0].definitionId, - "submitting", - "Got a submitting message bar as expected" - ); - is( - barDetails[1].definitionId, - "submitted", - "Got a submitted message bar as expected" - ); - - await extension.unload(); - await closeAboutAddons(); -}); - -// This helper does verify that the abuse report panel contains the expected -// suggestions when the selected reason requires it (and urls are being set -// on the links elements included in the suggestions when expected). -async function test_abusereport_suggestions(addonId) { - const addon = await AddonManager.getAddonByID(addonId); - - const abuseReportEl = await AbuseReportTestUtils.openReport(addonId); - - const { - _btnNext, - _btnGoBack, - _reasonsPanel, - _submitPanel, - _submitPanel: { _suggestions }, - } = abuseReportEl; - - for (const reason of AbuseReportTestUtils.getReasons(abuseReportEl)) { - const reasonInfo = AbuseReportTestUtils.getReasonInfo( - abuseReportEl, - reason - ); - - // TODO(Bug 1789718): Remove after the deprecated XPIProvider-based - // implementation is also removed. - const addonType = - addon.type === "sitepermission-deprecated" - ? "sitepermission" - : addon.type; - - if (reasonInfo.isReasonHidden(addonType)) { - continue; - } - - info(`Test suggestions for abuse reason "${reason}"`); - - // Select a reason with suggestions. - let radioEl = abuseReportEl.querySelector(`#abuse-reason-${reason}`); - ok(radioEl, `Found radio button for "${reason}"`); - radioEl.checked = true; - - // Make sure the element localization is completed before - // checking the content isn't empty. - await document.l10n.translateFragment(radioEl); - - // Verify each radio button has a non-empty localized string. - const localizedRadioContent = Array.from( - radioEl.closest("label").querySelectorAll("[data-l10n-id]") - ).filter(el => !el.hidden); - - for (let el of localizedRadioContent) { - isnot( - el.textContent, - "", - `Fluent string id '${el.getAttribute("data-l10n-id")}' missing` - ); - } - - // Switch to the submit form with the current reason radio selected. - let oncePanelUpdated = AbuseReportTestUtils.promiseReportUpdated( - abuseReportEl, - "submit" - ); - await AbuseReportTestUtils.clickPanelButton(_btnNext); - await oncePanelUpdated; - - const localizedSuggestionsContent = Array.from( - _suggestions.querySelectorAll("[data-l10n-id]") - ).filter(el => !el.hidden); - - is( - !_suggestions.hidden, - !!reasonInfo.hasSuggestions, - `Suggestions block has the expected visibility for "${reason}"` - ); - if (reasonInfo.hasSuggestions) { - ok( - !!localizedSuggestionsContent.length, - `Category suggestions should not be empty for "${reason}"` - ); - } else { - Assert.strictEqual( - localizedSuggestionsContent.length, - 0, - `Category suggestions should be empty for "${reason}"` - ); - } - - const extSupportLink = _suggestions.querySelector( - ".extension-support-link" - ); - if (extSupportLink) { - is( - extSupportLink.getAttribute("href"), - BASE_TEST_MANIFEST.homepage_url, - "Got the expected extension-support-url" - ); - } - - const learnMoreLinks = []; - learnMoreLinks.push( - ..._suggestions.querySelectorAll( - 'a[is="moz-support-link"], .abuse-policy-learnmore' - ) - ); - - if (learnMoreLinks.length) { - is( - _suggestions.querySelectorAll( - 'a[is="moz-support-link"]:not([support-page])' - ).length, - 0, - "Every SUMO link should point to a specific page" - ); - ok( - learnMoreLinks.every(el => el.getAttribute("target") === "_blank"), - "All the learn more links have target _blank" - ); - ok( - learnMoreLinks.every(el => el.hasAttribute("href")), - "All the learn more links have a url set" - ); - } - - oncePanelUpdated = AbuseReportTestUtils.promiseReportUpdated( - abuseReportEl, - "reasons" - ); - await AbuseReportTestUtils.clickPanelButton(_btnGoBack); - await oncePanelUpdated; - ok(!_reasonsPanel.hidden, "Reasons panel should be visible"); - ok(_submitPanel.hidden, "Submit panel should be hidden"); - } - - await closeAboutAddons(); -} - -add_task(async function test_abusereport_suggestions_extension() { - const EXT_ID = "test-extension-suggestions@mochi.test"; - const extension = await installTestExtension(EXT_ID); - await test_abusereport_suggestions(EXT_ID); - await extension.unload(); -}); - -add_task(async function test_abusereport_suggestions_theme() { - const THEME_ID = "theme@mochi.test"; - const theme = await installTestExtension(THEME_ID, "theme"); - await test_abusereport_suggestions(THEME_ID); - await theme.unload(); -}); - -// TODO(Bug 1789718): adapt to SitePermAddonProvider implementation. -add_task(async function test_abusereport_suggestions_sitepermission() { - const SITEPERM_ADDON_ID = "webmidi@mochi.test"; - const sitePermAddon = await installTestExtension( - SITEPERM_ADDON_ID, - "sitepermission-deprecated" - ); - await test_abusereport_suggestions(SITEPERM_ADDON_ID); - await sitePermAddon.unload(); -}); - -// This test case verifies the message bars created on other -// scenarios (e.g. report creation and submissions errors). -// -// TODO(Bug 1789718): adapt to SitePermAddonProvider implementation. -add_task(async function test_abusereport_messagebars() { - const EXT_ID = "test-extension-report@mochi.test"; - const EXT_ID2 = "test-extension-report-2@mochi.test"; - const THEME_ID = "test-theme-report@mochi.test"; - const SITEPERM_ADDON_ID = "webmidi-report@mochi.test"; - const extension = await installTestExtension(EXT_ID); - const extension2 = await installTestExtension(EXT_ID2); - const theme = await installTestExtension(THEME_ID, "theme"); - const sitePermAddon = await installTestExtension( - SITEPERM_ADDON_ID, - "sitepermission-deprecated" - ); - - async function assertMessageBars( - expectedMessageBarIds, - testSetup, - testMessageBarDetails - ) { - await openAboutAddons(); - const expectedLength = expectedMessageBarIds.length; - const onMessageBarsCreated = - AbuseReportTestUtils.promiseMessageBars(expectedLength); - // Reset the timestamp of the last report between tests. - AbuseReporter._lastReportTimestamp = null; - await testSetup(); - info(`Waiting for ${expectedLength} message-bars to be created`); - const barDetails = await onMessageBarsCreated; - Assert.deepEqual( - barDetails.map(d => d.definitionId), - expectedMessageBarIds, - "Got the expected message bars" - ); - if (testMessageBarDetails) { - await testMessageBarDetails(barDetails); - } - await closeAboutAddons(); - } - - function setTestRequestHandler(responseStatus, responseData) { - AbuseReportTestUtils.promiseReportSubmitHandled(({ request, response }) => { - response.setStatusLine(request.httpVersion, responseStatus, "Error"); - response.write(responseData); - }); - } - - await assertMessageBars(["ERROR_ADDON_NOTFOUND"], async () => { - info("Test message bars on addon not found"); - AbuseReportTestUtils.triggerNewReport( - "non-existend-addon-id@mochi.test", - REPORT_ENTRY_POINT - ); - }); - - await assertMessageBars(["submitting", "ERROR_RECENT_SUBMIT"], async () => { - info("Test message bars on recent submission"); - const promiseRendered = AbuseReportTestUtils.promiseReportRendered(); - AbuseReportTestUtils.triggerNewReport(EXT_ID, REPORT_ENTRY_POINT); - await promiseRendered; - AbuseReporter.updateLastReportTimestamp(); - AbuseReportTestUtils.triggerSubmit("fake-reason", "fake-message"); - }); - - await assertMessageBars(["submitting", "ERROR_ABORTED_SUBMIT"], async () => { - info("Test message bars on aborted submission"); - AbuseReportTestUtils.triggerNewReport(EXT_ID, REPORT_ENTRY_POINT); - await AbuseReportTestUtils.promiseReportRendered(); - const { _report } = AbuseReportTestUtils.getReportPanel(); - _report.abort(); - AbuseReportTestUtils.triggerSubmit("fake-reason", "fake-message"); - }); - - await assertMessageBars(["submitting", "ERROR_SERVER"], async () => { - info("Test message bars on server error"); - setTestRequestHandler(500); - AbuseReportTestUtils.triggerNewReport(EXT_ID, REPORT_ENTRY_POINT); - await AbuseReportTestUtils.promiseReportRendered(); - AbuseReportTestUtils.triggerSubmit("fake-reason", "fake-message"); - }); - - await assertMessageBars(["submitting", "ERROR_CLIENT"], async () => { - info("Test message bars on client error"); - setTestRequestHandler(400); - AbuseReportTestUtils.triggerNewReport(EXT_ID, REPORT_ENTRY_POINT); - await AbuseReportTestUtils.promiseReportRendered(); - AbuseReportTestUtils.triggerSubmit("fake-reason", "fake-message"); - }); - - await assertMessageBars(["submitting", "ERROR_UNKNOWN"], async () => { - info("Test message bars on unexpected status code"); - setTestRequestHandler(604); - AbuseReportTestUtils.triggerNewReport(EXT_ID, REPORT_ENTRY_POINT); - await AbuseReportTestUtils.promiseReportRendered(); - AbuseReportTestUtils.triggerSubmit("fake-reason", "fake-message"); - }); - - await assertMessageBars(["submitting", "ERROR_UNKNOWN"], async () => { - info("Test message bars on invalid json in the response data"); - setTestRequestHandler(200, ""); - AbuseReportTestUtils.triggerNewReport(EXT_ID, REPORT_ENTRY_POINT); - await AbuseReportTestUtils.promiseReportRendered(); - AbuseReportTestUtils.triggerSubmit("fake-reason", "fake-message"); - }); - - // Verify message bar on add-on without perm_can_uninstall. - await assertMessageBars( - ["submitting", "submitted-no-remove-action"], - async () => { - info("Test message bars on report submitted on an addon without remove"); - setTestRequestHandler(200, "{}"); - AbuseReportTestUtils.triggerNewReport(THEME_NO_UNINSTALL_ID, "menu"); - await AbuseReportTestUtils.promiseReportRendered(); - AbuseReportTestUtils.triggerSubmit("fake-reason", "fake-message"); - } - ); - - // Verify the 3 expected entry points: - // menu, toolbar_context_menu and uninstall - // (See https://addons-server.readthedocs.io/en/latest/topics/api/abuse.html). - await assertMessageBars(["submitting", "submitted"], async () => { - info("Test message bars on report opened from addon options menu"); - setTestRequestHandler(200, "{}"); - AbuseReportTestUtils.triggerNewReport(EXT_ID, "menu"); - await AbuseReportTestUtils.promiseReportRendered(); - AbuseReportTestUtils.triggerSubmit("fake-reason", "fake-message"); - }); - - for (const extId of [EXT_ID, THEME_ID]) { - await assertMessageBars( - ["submitting", "submitted"], - async () => { - info(`Test message bars on ${extId} reported from toolbar contextmenu`); - setTestRequestHandler(200, "{}"); - AbuseReportTestUtils.triggerNewReport(extId, "toolbar_context_menu"); - await AbuseReportTestUtils.promiseReportRendered(); - AbuseReportTestUtils.triggerSubmit("fake-reason", "fake-message"); - }, - ([, submittedDetails]) => { - const buttonsL10nId = Array.from( - submittedDetails.messagebar.querySelectorAll("button") - ).map(el => el.getAttribute("data-l10n-id")); - if (extId === THEME_ID) { - ok( - buttonsL10nId.every(id => id.endsWith("-theme")), - "submitted bar actions should use the Fluent id for themes" - ); - } else { - ok( - buttonsL10nId.every(id => id.endsWith("-extension")), - "submitted bar actions should use the Fluent id for extensions" - ); - } - } - ); - } - - for (const extId of [EXT_ID2, THEME_ID, SITEPERM_ADDON_ID]) { - const testFn = async () => { - info(`Test message bars on ${extId} reported opened from addon removal`); - setTestRequestHandler(200, "{}"); - AbuseReportTestUtils.triggerNewReport(extId, "uninstall"); - await AbuseReportTestUtils.promiseReportRendered(); - const addon = await AddonManager.getAddonByID(extId); - // Ensure that the test extension is pending uninstall as it would be - // when a user trigger this scenario on an actual addon uninstall. - await addon.uninstall(true); - AbuseReportTestUtils.triggerSubmit("fake-reason", "fake-message"); - }; - const assertMessageBarDetails = async ([, submittedDetails]) => - AbuseReportTestUtils.assertFluentStrings(submittedDetails.messagebar); - await assertMessageBars( - ["submitting", "submitted-and-removed"], - testFn, - assertMessageBarDetails - ); - } - - // Verify message bar on sitepermission add-on type. - await assertMessageBars( - ["submitting", "submitted"], - async () => { - info( - "Test message bars for report submitted on an sitepermission addon type" - ); - setTestRequestHandler(200, "{}"); - AbuseReportTestUtils.triggerNewReport(SITEPERM_ADDON_ID, "menu"); - await AbuseReportTestUtils.promiseReportRendered(); - AbuseReportTestUtils.triggerSubmit("fake-reason", "fake-message"); - }, - ([, submittedDetails]) => - AbuseReportTestUtils.assertFluentStrings(submittedDetails.messagebar) - ); - - await extension.unload(); - await extension2.unload(); - await theme.unload(); - await sitePermAddon.unload(); -}); - -add_task(async function test_abusereport_from_aboutaddons_menu() { - const EXT_ID = "test-report-from-aboutaddons-menu@mochi.test"; - const extension = await installTestExtension(EXT_ID); - - await openAboutAddons(); - - AbuseReportTestUtils.assertReportPanelHidden(); - - const addonCard = gManagerWindow.document.querySelector( - `addon-list addon-card[addon-id="${extension.id}"]` - ); - ok(addonCard, "Got the addon-card for the test extension"); - - const reportButton = addonCard.querySelector("[action=report]"); - ok(reportButton, "Got the report action for the test extension"); - - info("Click the report action and wait for the 'abuse-report:new' event"); - - let onceReportOpened = AbuseReportTestUtils.promiseReportOpened({ - addonId: extension.id, - reportEntryPoint: "menu", - }); - reportButton.click(); - const panelEl = await onceReportOpened; - - await AbuseReportTestUtils.closeReportPanel(panelEl); - - await closeAboutAddons(); - await extension.unload(); -}); - -add_task(async function test_abusereport_from_aboutaddons_remove() { - const EXT_ID = "test-report-from-aboutaddons-remove@mochi.test"; - - // Test on a theme addon to cover the report checkbox included in the - // uninstall dialog also on a theme. - const extension = await installTestExtension(EXT_ID, "theme"); - - await openAboutAddons("theme"); - - AbuseReportTestUtils.assertReportPanelHidden(); - - const addonCard = gManagerWindow.document.querySelector( - `addon-list addon-card[addon-id="${extension.id}"]` - ); - ok(addonCard, "Got the addon-card for the test theme extension"); - - const removeButton = addonCard.querySelector("[action=remove]"); - ok(removeButton, "Got the remove action for the test theme extension"); - - // Prepare the mocked prompt service. - const promptService = mockPromptService(); - promptService.confirmEx = createPromptConfirmEx({ - remove: true, - report: true, - }); - - info("Click the report action and wait for the 'abuse-report:new' event"); - - const onceReportOpened = AbuseReportTestUtils.promiseReportOpened({ - addonId: extension.id, - reportEntryPoint: "uninstall", - }); - removeButton.click(); - const panelEl = await onceReportOpened; - - await AbuseReportTestUtils.closeReportPanel(panelEl); - - await closeAboutAddons(); - await extension.unload(); -}); - -add_task(async function test_abusereport_from_browserAction_remove() { - const EXT_ID = "test-report-from-browseraction-remove@mochi.test"; - const xpiFile = AddonTestUtils.createTempWebExtensionFile({ - manifest: { - ...BASE_TEST_MANIFEST, - browser_action: { - default_area: "navbar", - }, - browser_specific_settings: { gecko: { id: EXT_ID } }, - }, - }); - const addon = await AddonManager.installTemporaryAddon(xpiFile); - - const buttonId = `${makeWidgetId(EXT_ID)}-browser-action`; - - async function promiseAnimationFrame() { - await new Promise(resolve => window.requestAnimationFrame(resolve)); - - let { tm } = Services; - return new Promise(resolve => tm.dispatchToMainThread(resolve)); - } - - async function reportFromContextMenuRemove() { - const menu = document.getElementById("toolbar-context-menu"); - const node = document.getElementById(CSS.escape(buttonId)); - const shown = BrowserTestUtils.waitForEvent( - menu, - "popupshown", - "Wair for contextmenu popup" - ); - - // Wait for an animation frame as we do for the other mochitest-browser - // tests related to the browserActions. - await promiseAnimationFrame(); - EventUtils.synthesizeMouseAtCenter(node, { type: "contextmenu" }); - await shown; - - info(`Clicking on "Remove Extension" context menu item`); - let removeExtension = menu.querySelector( - ".customize-context-removeExtension" - ); - removeExtension.click(); - - return menu; - } - - // Prepare the mocked prompt service. - const promptService = mockPromptService(); - promptService.confirmEx = createPromptConfirmEx({ - remove: true, - report: true, - }); - - await BrowserTestUtils.withNewTab("about:blank", async function () { - info(`Open browserAction context menu in toolbar context menu`); - let promiseMenu = reportFromContextMenuRemove(); - - // Wait about:addons to be loaded. - let browser = gBrowser.selectedBrowser; - await BrowserTestUtils.browserLoaded(browser); - - let onceReportOpened = AbuseReportTestUtils.promiseReportOpened({ - addonId: EXT_ID, - reportEntryPoint: "uninstall", - managerWindow: browser.contentWindow, - }); - - is( - browser.currentURI.spec, - "about:addons", - "about:addons tab currently selected" - ); - - let menu = await promiseMenu; - menu.hidePopup(); - - let panelEl = await onceReportOpened; - - await AbuseReportTestUtils.closeReportPanel(panelEl); - - let onceExtStarted = AddonTestUtils.promiseWebExtensionStartup(EXT_ID); - addon.cancelUninstall(); - await onceExtStarted; - - // Reload the tab to verify Bug 1559124 didn't regressed. - browser.contentWindow.location.reload(); - await BrowserTestUtils.browserLoaded(browser); - is( - browser.currentURI.spec, - "about:addons", - "about:addons tab currently selected" - ); - - onceReportOpened = AbuseReportTestUtils.promiseReportOpened({ - addonId: EXT_ID, - reportEntryPoint: "uninstall", - managerWindow: browser.contentWindow, - }); - - menu = await reportFromContextMenuRemove(); - info("Wait for the report panel"); - panelEl = await onceReportOpened; - - info("Wait for the report panel to be closed"); - await AbuseReportTestUtils.closeReportPanel(panelEl); - - menu.hidePopup(); - - onceExtStarted = AddonTestUtils.promiseWebExtensionStartup(EXT_ID); - addon.cancelUninstall(); - await onceExtStarted; - }); - - await addon.uninstall(); -}); - -/* - * Test report action hidden on non-supported extension types. - */ -add_task(async function test_report_action_hidden_on_builtin_addons() { - await openAboutAddons("theme"); - await AbuseReportTestUtils.assertReportActionHidden( - gManagerWindow, - DEFAULT_BUILTIN_THEME_ID - ); - await closeAboutAddons(); -}); - -add_task(async function test_report_action_hidden_on_system_addons() { - await openAboutAddons("extension"); - await AbuseReportTestUtils.assertReportActionHidden( - gManagerWindow, - EXT_SYSTEM_ADDON_ID - ); - await closeAboutAddons(); -}); - -add_task(async function test_report_action_hidden_on_dictionary_addons() { - await openAboutAddons("dictionary"); - await AbuseReportTestUtils.assertReportActionHidden( - gManagerWindow, - EXT_DICTIONARY_ADDON_ID - ); - await closeAboutAddons(); -}); - -add_task(async function test_report_action_hidden_on_langpack_addons() { - await openAboutAddons("locale"); - await AbuseReportTestUtils.assertReportActionHidden( - gManagerWindow, - EXT_LANGPACK_ADDON_ID - ); - await closeAboutAddons(); -}); - -// This test verifies that triggering a report that would be immediately -// cancelled (e.g. because abuse reports for that extension type are not -// supported) the abuse report is being hidden as expected. -add_task(async function test_report_hidden_on_report_unsupported_addontype() { - await openAboutAddons(); - - let onceCreateReportFailed = AbuseReportTestUtils.promiseMessageBars(1); - - AbuseReportTestUtils.triggerNewReport(EXT_UNSUPPORTED_TYPE_ADDON_ID, "menu"); - - await onceCreateReportFailed; - - ok(!AbuseReporter.getOpenDialog(), "report dialog should not be open"); - - await closeAboutAddons(); -}); - -/* - * Test regression fixes. - */ - -add_task(async function test_no_broken_suggestion_on_missing_supportURL() { - const EXT_ID = "test-no-author@mochi.test"; - const extension = await installTestExtension(EXT_ID, "extension", { - homepage_url: undefined, - }); - - const abuseReportEl = await AbuseReportTestUtils.openReport(EXT_ID); - - info("Select broken as the abuse reason"); - abuseReportEl.querySelector("#abuse-reason-broken").checked = true; - - let oncePanelUpdated = AbuseReportTestUtils.promiseReportUpdated( - abuseReportEl, - "submit" - ); - await AbuseReportTestUtils.clickPanelButton(abuseReportEl._btnNext); - await oncePanelUpdated; - - const suggestionEl = abuseReportEl.querySelector( - "abuse-report-reason-suggestions" - ); - is(suggestionEl.reason, "broken", "Got the expected suggestion element"); - ok(suggestionEl.hidden, "suggestion element should be empty"); - - await closeAboutAddons(); - await extension.unload(); -}); - -// This test verify that the abuse report panel is opening the -// author link using a null triggeringPrincipal. -add_task(async function test_abusereport_open_author_url() { - const abuseReportEl = await AbuseReportTestUtils.openReport( - EXT_WITH_PRIVILEGED_URL_ID - ); - - const authorLink = abuseReportEl._linkAddonAuthor; - ok(authorLink, "Got the author link element"); - is( - authorLink.href, - "about:config", - "Got a privileged url in the link element" - ); - - SimpleTest.waitForExplicitFinish(); - let waitForConsole = new Promise(resolve => { - SimpleTest.monitorConsole(resolve, [ - { - message: - // eslint-disable-next-line max-len - /Security Error: Content at moz-nullprincipal:{.*} may not load or link to about:config/, - }, - ]); - }); - - let tabSwitched = BrowserTestUtils.waitForEvent(gBrowser, "TabSwitchDone"); - authorLink.click(); - await tabSwitched; - - is( - gBrowser.selectedBrowser.currentURI.spec, - "about:blank", - "Got about:blank loaded in the new tab" - ); - - SimpleTest.endMonitorConsole(); - await waitForConsole; - - BrowserTestUtils.removeTab(gBrowser.selectedTab); - await closeAboutAddons(); -}); - -add_task(async function test_no_report_checkbox_for_unsupported_addon_types() { - async function test_report_checkbox_hidden(addon) { - await openAboutAddons(addon.type); - - const addonCard = gManagerWindow.document.querySelector( - `addon-list addon-card[addon-id="${addon.id}"]` - ); - ok(addonCard, "Got the addon-card for the test extension"); - - const removeButton = addonCard.querySelector("[action=remove]"); - ok(removeButton, "Got the remove action for the test extension"); - - // Prepare the mocked prompt service. - const promptService = mockPromptService(); - promptService.confirmEx = createPromptConfirmEx({ - remove: true, - report: false, - expectCheckboxHidden: true, - }); - - info("Click the report action and wait for the addon to be removed"); - const promiseCardRemoved = BrowserTestUtils.waitForEvent( - addonCard.closest("addon-list"), - "remove" - ); - removeButton.click(); - await promiseCardRemoved; - - await closeAboutAddons(); - } - - const reportNotSupportedAddons = [ - { - id: "fake-langpack-to-remove@mochi.test", - name: "This is a fake langpack", - version: "1.1", - type: "locale", - }, - { - id: "fake-dictionary-to-remove@mochi.test", - name: "This is a fake dictionary", - version: "1.1", - type: "dictionary", - }, - ]; - - AbuseReportTestUtils.createMockAddons(reportNotSupportedAddons); - - for (const { id } of reportNotSupportedAddons) { - const addon = await AddonManager.getAddonByID(id); - await test_report_checkbox_hidden(addon); - } -}); - -add_task(async function test_author_hidden_when_missing() { - const EXT_ID = "test-no-author@mochi.test"; - const extension = await installTestExtension(EXT_ID, "extension", { - author: undefined, - }); - - const abuseReportEl = await AbuseReportTestUtils.openReport(EXT_ID); - - const addon = await AddonManager.getAddonByID(EXT_ID); - - ok(!addon.creator, "addon.creator should not be undefined"); - ok( - abuseReportEl._addonAuthorContainer.hidden, - "author container should be hidden" - ); - - await closeAboutAddons(); - await extension.unload(); -}); - -// Verify addon.siteOrigin is used as a fallback when homepage_url/developer.url -// or support url are missing. -// -// TODO(Bug 1789718): adapt to SitePermAddonProvider implementation. -add_task(async function test_siteperm_siteorigin_fallback() { - const SITEPERM_ADDON_ID = "webmidi-site-origin@mochi.test"; - const sitePermAddon = await installTestExtension( - SITEPERM_ADDON_ID, - "sitepermission-deprecated", - { - homepage_url: undefined, - } - ); - - const abuseReportEl = await AbuseReportTestUtils.openReport( - SITEPERM_ADDON_ID - ); - const addon = await AddonManager.getAddonByID(SITEPERM_ADDON_ID); - - ok(addon.siteOrigin, "addon.siteOrigin should not be undefined"); - ok(!addon.supportURL, "addon.supportURL should not be set"); - ok(!addon.homepageURL, "addon.homepageURL should not be set"); - is( - abuseReportEl.supportURL, - addon.siteOrigin, - "Got the expected support_url" - ); - - await closeAboutAddons(); - await sitePermAddon.unload(); -}); |