summaryrefslogtreecommitdiffstats
path: root/toolkit/crashreporter/CrashReports.jsm
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/crashreporter/CrashReports.jsm')
-rw-r--r--toolkit/crashreporter/CrashReports.jsm84
1 files changed, 84 insertions, 0 deletions
diff --git a/toolkit/crashreporter/CrashReports.jsm b/toolkit/crashreporter/CrashReports.jsm
new file mode 100644
index 0000000000..e9c5a6956f
--- /dev/null
+++ b/toolkit/crashreporter/CrashReports.jsm
@@ -0,0 +1,84 @@
+/* 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/. */
+
+const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
+
+var EXPORTED_SYMBOLS = ["CrashReports"];
+
+var CrashReports = {
+ pendingDir: null,
+ reportsDir: null,
+ submittedDir: null,
+ getReports: function CrashReports_getReports() {
+ let reports = [];
+
+ try {
+ // Ignore any non http/https urls
+ if (!/^https?:/i.test(Services.prefs.getCharPref("breakpad.reportURL"))) {
+ return reports;
+ }
+ } catch (e) {}
+
+ if (this.submittedDir.exists() && this.submittedDir.isDirectory()) {
+ let entries = this.submittedDir.directoryEntries;
+ while (entries.hasMoreElements()) {
+ let file = entries.nextFile;
+ let leaf = file.leafName;
+ if (leaf.startsWith("bp-") && leaf.endsWith(".txt")) {
+ let entry = {
+ id: leaf.slice(0, -4),
+ date: file.lastModifiedTime,
+ pending: false,
+ };
+ reports.push(entry);
+ }
+ }
+ }
+
+ if (this.pendingDir.exists() && this.pendingDir.isDirectory()) {
+ let uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
+ let entries = this.pendingDir.directoryEntries;
+ while (entries.hasMoreElements()) {
+ let file = entries.nextFile;
+ let leaf = file.leafName;
+ let id = leaf.slice(0, -4);
+ if (leaf.endsWith(".dmp") && uuidRegex.test(id)) {
+ let entry = {
+ id,
+ date: file.lastModifiedTime,
+ pending: true,
+ };
+ reports.push(entry);
+ }
+ }
+ }
+
+ // Sort reports descending by date
+ return reports.sort((a, b) => b.date - a.date);
+ },
+};
+
+function CrashReports_pendingDir() {
+ let pendingDir = Services.dirsvc.get("UAppData", Ci.nsIFile);
+ pendingDir.append("Crash Reports");
+ pendingDir.append("pending");
+ return pendingDir;
+}
+
+function CrashReports_reportsDir() {
+ let reportsDir = Services.dirsvc.get("UAppData", Ci.nsIFile);
+ reportsDir.append("Crash Reports");
+ return reportsDir;
+}
+
+function CrashReports_submittedDir() {
+ let submittedDir = Services.dirsvc.get("UAppData", Ci.nsIFile);
+ submittedDir.append("Crash Reports");
+ submittedDir.append("submitted");
+ return submittedDir;
+}
+
+CrashReports.pendingDir = CrashReports_pendingDir();
+CrashReports.reportsDir = CrashReports_reportsDir();
+CrashReports.submittedDir = CrashReports_submittedDir();