diff --git a/application/basilisk/app/profile/basilisk.js b/application/basilisk/app/profile/basilisk.js index 2bd41ca8f7..df27da5089 100644 --- a/application/basilisk/app/profile/basilisk.js +++ b/application/basilisk/app/profile/basilisk.js @@ -1308,19 +1308,7 @@ pref("print.use_simplify_page", true); // Space separated list of URLS that are allowed to send objects (instead of // only strings) through webchannels. This list is duplicated in mobile/android/app/mobile.js -pref("webchannel.allowObject.urlWhitelist", "https://accounts.firefox.com https://content.cdn.mozilla.net https://input.mozilla.org https://support.mozilla.org https://install.mozilla.org"); - -// Whether or not the browser should scan for unsubmitted -// crash reports, and then show a notification for submitting -// those reports. -pref("browser.crashReports.unsubmittedCheck.enabled", false); - -// chancesUntilSuppress is how many times we'll show the unsubmitted -// crash report notification across different days and shutdown -// without a user choice before we suppress the notification for -// some number of days. -pref("browser.crashReports.unsubmittedCheck.chancesUntilSuppress", 4); -pref("browser.crashReports.unsubmittedCheck.autoSubmit2", false); +pref("webchannel.allowObject.urlWhitelist", ""); // When a user cancels this number of authentication dialogs coming from // a single web page (eTLD+1) in a row, all following authentication dialogs diff --git a/application/basilisk/modules/ContentCrashHandlers.jsm b/application/basilisk/modules/ContentCrashHandlers.jsm index d1a840b273..69610b697a 100644 --- a/application/basilisk/modules/ContentCrashHandlers.jsm +++ b/application/basilisk/modules/ContentCrashHandlers.jsm @@ -10,8 +10,7 @@ var Cu = Components.utils; var Cr = Components.results; this.EXPORTED_SYMBOLS = [ "TabCrashHandler", - "PluginCrashReporter", - "UnsubmittedCrashHandler" ]; + "PluginCrashReporter" ]; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); @@ -237,20 +236,9 @@ this.TabCrashHandler = { // 1) We are aware that this browser crashed // 2) We know we've never shown the tab crash page for the // crash yet - // 3) The user is not configured to automatically submit backlogged - // crash reports. If they are, we'll send the crash report - // immediately. - if (childID && - this.unseenCrashedChildIDs.indexOf(childID) != -1) { - if (UnsubmittedCrashHandler.autoSubmit) { - let dumpID = this.childMap.get(childID); - if (dumpID) { - UnsubmittedCrashHandler.submitReports([dumpID]); - } - } else { - this.sendToTabCrashedPage(browser); - return true; - } + if (childID && this.unseenCrashedChildIDs.indexOf(childID) != -1) { + this.sendToTabCrashedPage(browser); + return true; } return false; @@ -352,371 +340,6 @@ this.TabCrashHandler = { }, } -/** - * This component is responsible for scanning the pending - * crash report directory for reports, and (if enabled), to - * prompt the user to submit those reports. It might also - * submit those reports automatically without prompting if - * the user has opted in. - */ -this.UnsubmittedCrashHandler = { - get prefs() { - delete this.prefs; - return this.prefs = - Services.prefs.getBranch("browser.crashReports.unsubmittedCheck."); - }, - - get enabled() { - return this.prefs.getBoolPref("enabled"); - }, - - // showingNotification is set to true once a notification - // is successfully shown, and then set back to false if - // the notification is dismissed by an action by the user. - showingNotification: false, - // suppressed is true if we've determined that we've shown - // the notification too many times across too many days without - // user interaction, so we're suppressing the notification for - // some number of days. See the documentation for - // shouldShowPendingSubmissionsNotification(). - suppressed: false, - - init() { - if (this.initialized) { - return; - } - - this.initialized = true; - - // UnsubmittedCrashHandler can be initialized but still be disabled. - // This is intentional, as this makes simulating UnsubmittedCrashHandler's - // reactions to browser startup and shutdown easier in test automation. - // - // UnsubmittedCrashHandler, when initialized but not enabled, is inert. - if (this.enabled) { - if (this.prefs.prefHasUserValue("suppressUntilDate")) { - if (this.prefs.getCharPref("suppressUntilDate") > this.dateString()) { - // We'll be suppressing any notifications until after suppressedDate, - // so there's no need to do anything more. - this.suppressed = true; - return; - } - - // We're done suppressing, so we don't need this pref anymore. - this.prefs.clearUserPref("suppressUntilDate"); - } - - Services.obs.addObserver(this, "browser-delayed-startup-finished", - false); - Services.obs.addObserver(this, "profile-before-change", - false); - } - }, - - uninit() { - if (!this.initialized) { - return; - } - - this.initialized = false; - - if (!this.enabled) { - return; - } - - if (this.suppressed) { - this.suppressed = false; - // No need to do any more clean-up, since we were suppressed. - return; - } - - if (this.showingNotification) { - this.prefs.setBoolPref("shutdownWhileShowing", true); - this.showingNotification = false; - } - - try { - Services.obs.removeObserver(this, "browser-delayed-startup-finished"); - } catch (e) { - // The browser-delayed-startup-finished observer might have already - // fired and removed itself, so if this fails, it's okay. - if (e.result != Cr.NS_ERROR_FAILURE) { - throw e; - } - } - - Services.obs.removeObserver(this, "profile-before-change"); - }, - - observe(subject, topic, data) { - switch (topic) { - case "browser-delayed-startup-finished": { - Services.obs.removeObserver(this, topic); - this.checkForUnsubmittedCrashReports(); - break; - } - case "profile-before-change": { - this.uninit(); - break; - } - } - }, - - /** - * Scans the profile directory for unsubmitted crash reports - * within the past PENDING_CRASH_REPORT_DAYS days. If it - * finds any, it will, if necessary, attempt to open a notification - * bar to prompt the user to submit them. - * - * @returns Promise - * Resolves with the after it tries to - * show a notification on the most recent browser window. - * If a notification cannot be shown, will resolve with null. - */ - checkForUnsubmittedCrashReports: Task.async(function*() { - let dateLimit = new Date(); - dateLimit.setDate(dateLimit.getDate() - PENDING_CRASH_REPORT_DAYS); - - let reportIDs = []; - try { - reportIDs = yield CrashSubmit.pendingIDsAsync(dateLimit); - } catch (e) { - Cu.reportError(e); - return null; - } - - if (reportIDs.length) { - if (this.autoSubmit) { - this.submitReports(reportIDs); - } else if (this.shouldShowPendingSubmissionsNotification()) { - return this.showPendingSubmissionsNotification(reportIDs); - } - } - return null; - }), - - /** - * Returns true if the notification should be shown. - * shouldShowPendingSubmissionsNotification makes this decision - * by looking at whether or not the user has seen the notification - * over several days without ever interacting with it. If this occurs - * too many times, we suppress the notification for DAYS_TO_SUPPRESS - * days. - * - * @returns bool - */ - shouldShowPendingSubmissionsNotification() { - if (!this.prefs.prefHasUserValue("shutdownWhileShowing")) { - return true; - } - - let shutdownWhileShowing = this.prefs.getBoolPref("shutdownWhileShowing"); - this.prefs.clearUserPref("shutdownWhileShowing"); - - if (!this.prefs.prefHasUserValue("lastShownDate")) { - // This isn't expected, but we're being defensive here. We'll - // opt for showing the notification in this case. - return true; - } - - let lastShownDate = this.prefs.getCharPref("lastShownDate"); - if (this.dateString() > lastShownDate && shutdownWhileShowing) { - // We're on a newer day then when we last showed the - // notification without closing it. We don't want to do - // this too many times, so we'll decrement a counter for - // this situation. Too many of these, and we'll assume the - // user doesn't know or care about unsubmitted notifications, - // and we'll suppress the notification for a while. - let chances = this.prefs.getIntPref("chancesUntilSuppress"); - if (--chances < 0) { - // We're out of chances! - this.prefs.clearUserPref("chancesUntilSuppress"); - // We'll suppress for DAYS_TO_SUPPRESS days. - let suppressUntil = - this.dateString(new Date(Date.now() + (DAY * DAYS_TO_SUPPRESS))); - this.prefs.setCharPref("suppressUntilDate", suppressUntil); - return false; - } - this.prefs.setIntPref("chancesUntilSuppress", chances); - } - - return true; - }, - - /** - * Given an array of unsubmitted crash report IDs, try to open - * up a notification asking the user to submit them. - * - * @param reportIDs (Array) - * The Array of report IDs to offer the user to send. - * @returns The if one is shown. null otherwise. - */ - showPendingSubmissionsNotification(reportIDs) { - let count = reportIDs.length; - if (!count) { - return null; - } - - let messageTemplate = - gNavigatorBundle.GetStringFromName("pendingCrashReports2.label"); - - let message = PluralForm.get(count, messageTemplate).replace("#1", count); - - let notification = this.show({ - notificationID: "pending-crash-reports", - message, - reportIDs, - onAction: () => { - this.showingNotification = false; - }, - }); - - if (notification) { - this.showingNotification = true; - this.prefs.setCharPref("lastShownDate", this.dateString()); - } - - return notification; - }, - - /** - * Returns a string representation of a Date in the format - * YYYYMMDD. - * - * @param someDate (Date, optional) - * The Date to convert to the string. If not provided, - * defaults to today's date. - * @returns String - */ - dateString(someDate = new Date()) { - let year = String(someDate.getFullYear()).padStart(4, "0"); - let month = String(someDate.getMonth() + 1).padStart(2, "0"); - let day = String(someDate.getDate()).padStart(2, "0"); - return year + month + day; - }, - - /** - * Attempts to show a notification bar to the user in the most - * recent browser window asking them to submit some crash report - * IDs. If a notification cannot be shown (for example, there - * is no browser window), this method exits silently. - * - * The notification will allow the user to submit their crash - * reports. If the user dismissed the notification, the crash - * reports will be marked to be ignored (though they can - * still be manually submitted via about:crashes). - * - * @param JS Object - * An Object with the following properties: - * - * notificationID (string) - * The ID for the notification to be opened. - * - * message (string) - * The message to be displayed in the notification. - * - * reportIDs (Array) - * The array of report IDs to offer to the user. - * - * onAction (function, optional) - * A callback to fire once the user performs an - * action on the notification bar (this includes - * dismissing the notification). - * - * @returns The if one is shown. null otherwise. - */ - show({ notificationID, message, reportIDs, onAction }) { - let chromeWin = RecentWindow.getMostRecentBrowserWindow(); - if (!chromeWin) { - // Can't show a notification in this case. We'll hopefully - // get another opportunity to have the user submit their - // crash reports later. - return null; - } - - let nb = chromeWin.document.getElementById("global-notificationbox"); - let notification = nb.getNotificationWithValue(notificationID); - if (notification) { - return null; - } - - let buttons = [{ - label: gNavigatorBundle.GetStringFromName("pendingCrashReports.send"), - callback: () => { - this.submitReports(reportIDs); - if (onAction) { - onAction(); - } - }, - }, - { - label: gNavigatorBundle.GetStringFromName("pendingCrashReports.alwaysSend"), - callback: () => { - this.autoSubmit = true; - this.submitReports(reportIDs); - if (onAction) { - onAction(); - } - }, - }, - { - label: gNavigatorBundle.GetStringFromName("pendingCrashReports.viewAll"), - callback: function() { - chromeWin.openUILinkIn("about:crashes", "tab"); - return true; - }, - }]; - - let eventCallback = (eventType) => { - if (eventType == "dismissed") { - // The user intentionally dismissed the notification, - // which we interpret as meaning that they don't care - // to submit the reports. We'll ignore these particular - // reports going forward. - reportIDs.forEach(function(reportID) { - CrashSubmit.ignore(reportID); - }); - if (onAction) { - onAction(); - } - } - }; - - return nb.appendNotification(message, notificationID, - "chrome://browser/skin/tab-crashed.svg", - nb.PRIORITY_INFO_HIGH, buttons, - eventCallback); - }, - - get autoSubmit() { - return Services.prefs - .getBoolPref("browser.crashReports.unsubmittedCheck.autoSubmit2"); - }, - - set autoSubmit(val) { - Services.prefs.setBoolPref("browser.crashReports.unsubmittedCheck.autoSubmit2", - val); - }, - - /** - * Attempt to submit reports to the crash report server. Each - * report will have the "SubmittedFromInfobar" extra key set - * to true. - * - * @param reportIDs (Array) - * The array of reportIDs to submit. - */ - submitReports(reportIDs) { - for (let reportID of reportIDs) { - CrashSubmit.submit(reportID, { - extraExtraKeyVals: { - "SubmittedFromInfobar": true, - }, - }); - } - }, -}; - this.PluginCrashReporter = { /** * Makes the PluginCrashReporter ready to hear about and