mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-31 03:27:31 +09:00
[Basilisk] Remove unsubmitted crash reporter from crash handlers
This commit is contained in:
parent
0be9ef65f6
commit
0ae5036656
2 changed files with 5 additions and 394 deletions
|
|
@ -1308,19 +1308,7 @@ pref("print.use_simplify_page", true);
|
||||||
|
|
||||||
// Space separated list of URLS that are allowed to send objects (instead of
|
// 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
|
// 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");
|
pref("webchannel.allowObject.urlWhitelist", "");
|
||||||
|
|
||||||
// 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);
|
|
||||||
|
|
||||||
// When a user cancels this number of authentication dialogs coming from
|
// When a user cancels this number of authentication dialogs coming from
|
||||||
// a single web page (eTLD+1) in a row, all following authentication dialogs
|
// a single web page (eTLD+1) in a row, all following authentication dialogs
|
||||||
|
|
|
||||||
|
|
@ -10,8 +10,7 @@ var Cu = Components.utils;
|
||||||
var Cr = Components.results;
|
var Cr = Components.results;
|
||||||
|
|
||||||
this.EXPORTED_SYMBOLS = [ "TabCrashHandler",
|
this.EXPORTED_SYMBOLS = [ "TabCrashHandler",
|
||||||
"PluginCrashReporter",
|
"PluginCrashReporter" ];
|
||||||
"UnsubmittedCrashHandler" ];
|
|
||||||
|
|
||||||
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||||
Cu.import("resource://gre/modules/Services.jsm");
|
Cu.import("resource://gre/modules/Services.jsm");
|
||||||
|
|
@ -237,20 +236,9 @@ this.TabCrashHandler = {
|
||||||
// 1) We are aware that this browser crashed
|
// 1) We are aware that this browser crashed
|
||||||
// 2) We know we've never shown the tab crash page for the
|
// 2) We know we've never shown the tab crash page for the
|
||||||
// crash yet
|
// crash yet
|
||||||
// 3) The user is not configured to automatically submit backlogged
|
if (childID && this.unseenCrashedChildIDs.indexOf(childID) != -1) {
|
||||||
// crash reports. If they are, we'll send the crash report
|
this.sendToTabCrashedPage(browser);
|
||||||
// immediately.
|
return true;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
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 <xul:notification> 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<string>)
|
|
||||||
* The Array of report IDs to offer the user to send.
|
|
||||||
* @returns The <xul:notification> 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<string>)
|
|
||||||
* 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 <xul:notification> 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<string>)
|
|
||||||
* The array of reportIDs to submit.
|
|
||||||
*/
|
|
||||||
submitReports(reportIDs) {
|
|
||||||
for (let reportID of reportIDs) {
|
|
||||||
CrashSubmit.submit(reportID, {
|
|
||||||
extraExtraKeyVals: {
|
|
||||||
"SubmittedFromInfobar": true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
this.PluginCrashReporter = {
|
this.PluginCrashReporter = {
|
||||||
/**
|
/**
|
||||||
* Makes the PluginCrashReporter ready to hear about and
|
* Makes the PluginCrashReporter ready to hear about and
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue