diff options
Diffstat (limited to 'toolkit/mozapps/extensions/content/abuse-reports.js')
-rw-r--r-- | toolkit/mozapps/extensions/content/abuse-reports.js | 357 |
1 files changed, 6 insertions, 351 deletions
diff --git a/toolkit/mozapps/extensions/content/abuse-reports.js b/toolkit/mozapps/extensions/content/abuse-reports.js index 38fa0f9f46..d978aa1293 100644 --- a/toolkit/mozapps/extensions/content/abuse-reports.js +++ b/toolkit/mozapps/extensions/content/abuse-reports.js @@ -4,188 +4,22 @@ /* eslint max-len: ["error", 80] */ /* import-globals-from aboutaddonsCommon.js */ -/* exported openAbuseReport */ +/* exported AbuseReporter, openAbuseReport */ /* global windowRoot */ /** * This script is part of the HTML about:addons page and it provides some - * helpers used for the Abuse Reporting submission (and related message bars). + * helpers used for abuse reports. */ const { AbuseReporter } = ChromeUtils.importESModule( "resource://gre/modules/AbuseReporter.sys.mjs" ); -// Message Bars definitions. -const ABUSE_REPORT_MESSAGE_BARS = { - // Idle message-bar (used while the submission is still ongoing). - submitting: { - actions: ["cancel"], - l10n: { - id: "abuse-report-messagebar-submitting2", - actionIds: { - cancel: "abuse-report-messagebar-action-cancel", - }, - }, - }, - // Submitted report message-bar. - submitted: { - actions: ["remove", "keep"], - dismissable: true, - l10n: { - id: "abuse-report-messagebar-submitted2", - actionIdsPerAddonType: { - extension: { - remove: "abuse-report-messagebar-action-remove-extension", - keep: "abuse-report-messagebar-action-keep-extension", - }, - sitepermission: { - remove: "abuse-report-messagebar-action-remove-sitepermission", - keep: "abuse-report-messagebar-action-keep-sitepermission", - }, - theme: { - remove: "abuse-report-messagebar-action-remove-theme", - keep: "abuse-report-messagebar-action-keep-theme", - }, - }, - }, - }, - // Submitted report message-bar (with no remove actions). - "submitted-no-remove-action": { - dismissable: true, - l10n: { id: "abuse-report-messagebar-submitted-noremove2" }, - }, - // Submitted report and remove addon message-bar. - "submitted-and-removed": { - dismissable: true, - l10n: { - idsPerAddonType: { - extension: "abuse-report-messagebar-removed-extension2", - sitepermission: "abuse-report-messagebar-removed-sitepermission2", - theme: "abuse-report-messagebar-removed-theme2", - }, - }, - }, - // The "aborted report" message bar is rendered as a generic informative one, - // because aborting a report is triggered by a user choice. - ERROR_ABORTED_SUBMIT: { - type: "info", - dismissable: true, - l10n: { id: "abuse-report-messagebar-aborted2" }, - }, - // Errors message bars. - ERROR_ADDON_NOTFOUND: { - type: "error", - dismissable: true, - l10n: { id: "abuse-report-messagebar-error2" }, - }, - ERROR_CLIENT: { - type: "error", - dismissable: true, - l10n: { id: "abuse-report-messagebar-error2" }, - }, - ERROR_NETWORK: { - actions: ["retry", "cancel"], - type: "error", - l10n: { - id: "abuse-report-messagebar-error2", - actionIds: { - retry: "abuse-report-messagebar-action-retry", - cancel: "abuse-report-messagebar-action-cancel", - }, - }, - }, - ERROR_RECENT_SUBMIT: { - actions: ["retry", "cancel"], - type: "error", - l10n: { - id: "abuse-report-messagebar-error-recent-submit2", - actionIds: { - retry: "abuse-report-messagebar-action-retry", - cancel: "abuse-report-messagebar-action-cancel", - }, - }, - }, - ERROR_SERVER: { - actions: ["retry", "cancel"], - type: "error", - l10n: { - id: "abuse-report-messagebar-error2", - actionIds: { - retry: "abuse-report-messagebar-action-retry", - cancel: "abuse-report-messagebar-action-cancel", - }, - }, - }, - ERROR_UNKNOWN: { - actions: ["retry", "cancel"], - type: "error", - l10n: { - id: "abuse-report-messagebar-error2", - actionIds: { - retry: "abuse-report-messagebar-action-retry", - cancel: "abuse-report-messagebar-action-cancel", - }, - }, - }, -}; +async function openAbuseReport({ addonId }) { + // TODO: `reportEntryPoint` is also passed to this function but we aren't + // using it currently. Maybe we should? -async function openAbuseReport({ addonId, reportEntryPoint }) { - try { - const reportDialog = await AbuseReporter.openDialog( - addonId, - reportEntryPoint, - window.docShell.chromeEventHandler - ); - - // Warn the user before the about:addons tab while an - // abuse report dialog is still open, and close the - // report dialog if the user choose to close the related - // about:addons tab. - const beforeunloadListener = evt => evt.preventDefault(); - const unloadListener = () => reportDialog.close(); - const clearUnloadListeners = () => { - window.removeEventListener("beforeunload", beforeunloadListener); - window.removeEventListener("unload", unloadListener); - }; - window.addEventListener("beforeunload", beforeunloadListener); - window.addEventListener("unload", unloadListener); - - reportDialog.promiseReport - .then( - report => { - if (report) { - submitReport({ report }); - } - }, - err => { - Cu.reportError( - `Unexpected abuse report panel error: ${err} :: ${err.stack}` - ); - reportDialog.close(); - } - ) - .then(clearUnloadListeners); - } catch (err) { - // Log the detailed error to the browser console. - Cu.reportError(err); - document.dispatchEvent( - new CustomEvent("abuse-report:create-error", { - detail: { - addonId, - addon: err.addon, - errorType: err.errorType, - }, - }) - ); - } -} - -// Unlike the openAbuseReport function, technically this method wouldn't need -// to be async, but it is so that both the implementations will be providing -// the same type signatures (returning a promise) to the callers, independently -// from which abuse reporting feature is enabled. -async function openAbuseReportAMOForm({ addonId }) { const amoUrl = AbuseReporter.getAMOFormURL({ addonId }); windowRoot.ownerGlobal.openTrustedLinkIn(amoUrl, "tab", { // Make sure the newly open tab is going to be focused, independently @@ -194,183 +28,4 @@ async function openAbuseReportAMOForm({ addonId }) { }); } -window.openAbuseReport = AbuseReporter.amoFormEnabled - ? openAbuseReportAMOForm - : openAbuseReport; - -// Helper function used to create abuse report message bars in the -// HTML about:addons page. -function createReportMessageBar( - definitionId, - { addonId, addonName, addonType }, - { onclose, onaction } = {} -) { - const barInfo = ABUSE_REPORT_MESSAGE_BARS[definitionId]; - if (!barInfo) { - throw new Error(`message-bar definition not found: ${definitionId}`); - } - const { dismissable, actions, type, l10n } = barInfo; - - // TODO(Bug 1789718): Remove after the deprecated XPIProvider-based - // implementation is also removed. - const mappingAddonType = - addonType === "sitepermission-deprecated" ? "sitepermission" : addonType; - - const getMessageL10n = () => { - return l10n.idsPerAddonType - ? l10n.idsPerAddonType[mappingAddonType] - : l10n.id; - }; - const getActionL10n = action => { - return l10n.actionIdsPerAddonType - ? l10n.actionIdsPerAddonType[mappingAddonType][action] - : l10n.actionIds[action]; - }; - - const messagebar = document.createElement("moz-message-bar"); - - document.l10n.setAttributes(messagebar, getMessageL10n(), { - "addon-name": addonName || addonId, - }); - messagebar.setAttribute("data-l10n-attrs", "message"); - - actions?.forEach(action => { - const buttonEl = document.createElement("button"); - buttonEl.addEventListener("click", () => onaction && onaction(action)); - document.l10n.setAttributes(buttonEl, getActionL10n(action)); - buttonEl.setAttribute("slot", "actions"); - messagebar.appendChild(buttonEl); - }); - - messagebar.setAttribute("type", type || "info"); - messagebar.dismissable = dismissable; - messagebar.addEventListener("message-bar:close", onclose, { once: true }); - - document.getElementById("abuse-reports-messages").append(messagebar); - - document.dispatchEvent( - new CustomEvent("abuse-report:new-message-bar", { - detail: { definitionId, messagebar }, - }) - ); - return messagebar; -} - -async function submitReport({ report }) { - const { addon } = report; - const addonId = addon.id; - const addonName = addon.name; - const addonType = addon.type; - - // Ensure that the tab that originated the report dialog is selected - // when the user is submitting the report. - const { gBrowser } = window.windowRoot.ownerGlobal; - if (gBrowser && gBrowser.getTabForBrowser) { - let tab = gBrowser.getTabForBrowser(window.docShell.chromeEventHandler); - gBrowser.selectedTab = tab; - } - - // Create a message bar while we are still submitting the report. - const mbSubmitting = createReportMessageBar( - "submitting", - { addonId, addonName, addonType }, - { - onaction: action => { - if (action === "cancel") { - report.abort(); - mbSubmitting.remove(); - } - }, - } - ); - - try { - await report.submit(); - mbSubmitting.remove(); - - // Create a submitted message bar when the submission has been - // successful. - let barId; - if ( - !(addon.permissions & AddonManager.PERM_CAN_UNINSTALL) && - !isPending(addon, "uninstall") - ) { - // Do not offer remove action if the addon can't be uninstalled. - barId = "submitted-no-remove-action"; - } else if (report.reportEntryPoint === "uninstall") { - // With reportEntryPoint "uninstall" a specific message bar - // is going to be used. - barId = "submitted-and-removed"; - } else { - // All the other reportEntryPoint ("menu" and "toolbar_context_menu") - // use the same kind of message bar. - barId = "submitted"; - } - - const mbInfo = createReportMessageBar( - barId, - { - addonId, - addonName, - addonType, - }, - { - onaction: action => { - mbInfo.remove(); - // action "keep" doesn't require any further action, - // just handle "remove". - if (action === "remove") { - report.addon.uninstall(true); - } - }, - } - ); - } catch (err) { - // Log the complete error in the console. - console.error("Error submitting abuse report for", addonId, err); - mbSubmitting.remove(); - // The report has a submission error, create a error message bar which - // may optionally allow the user to retry to submit the same report. - const barId = - err.errorType in ABUSE_REPORT_MESSAGE_BARS - ? err.errorType - : "ERROR_UNKNOWN"; - - const mbError = createReportMessageBar( - barId, - { - addonId, - addonName, - addonType, - }, - { - onaction: action => { - mbError.remove(); - switch (action) { - case "retry": - submitReport({ report }); - break; - case "cancel": - report.abort(); - break; - } - }, - } - ); - } -} - -document.addEventListener("abuse-report:submit", ({ detail }) => { - submitReport(detail); -}); - -document.addEventListener("abuse-report:create-error", ({ detail }) => { - const { addonId, addon, errorType } = detail; - const barId = - errorType in ABUSE_REPORT_MESSAGE_BARS ? errorType : "ERROR_UNKNOWN"; - createReportMessageBar(barId, { - addonId, - addonName: addon && addon.name, - addonType: addon && addon.type, - }); -}); +window.openAbuseReport = openAbuseReport; |