toolkit/crashreporter/CrashReports.jsm
author Wes Kocher <wkocher@mozilla.com>
Tue, 01 Mar 2016 11:36:35 -0800
changeset 324540 71fabdbb3567e3d16836fac9daf84f9e6eaf5543
parent 167135 f78e6b91ad8d5fe20eac78651f29c109aa14e7fe
child 374828 cd10db6087ddd3a8e872c0de6ef35a886250173e
permissions -rw-r--r--
Backed out 2 changesets (bug 1251714, bug 1251715) for gtest failures in media code a=backout Backed out changeset 1bbd0cd10f76 (bug 1251714) Backed out changeset 80b197c5608f (bug 1251715) MozReview-Commit-ID: EHOtiKLS4Xr

/* 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/. */

Components.utils.import("resource://gre/modules/Services.jsm");

this.EXPORTED_SYMBOLS = [
  "CrashReports"
];

this.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.getNext().QueryInterface(Components.interfaces.nsIFile);
        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.getNext().QueryInterface(Components.interfaces.nsIFile);
        let leaf = file.leafName;
        let id = leaf.slice(0, -4);
        if (leaf.endsWith(".dmp") && uuidRegex.test(id)) {
          let entry = {
            id: 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", Components.interfaces.nsIFile);
  pendingDir.append("Crash Reports");
  pendingDir.append("pending");
  return pendingDir;
}

function CrashReports_reportsDir()
{
  let reportsDir = Services.dirsvc.get("UAppData", Components.interfaces.nsIFile);
  reportsDir.append("Crash Reports");
  return reportsDir;
}

function CrashReports_submittedDir()
{
  let submittedDir = Services.dirsvc.get("UAppData", Components.interfaces.nsIFile);
  submittedDir.append("Crash Reports");
  submittedDir.append("submitted");
  return submittedDir;
}

this.CrashReports.pendingDir = CrashReports_pendingDir();
this.CrashReports.reportsDir = CrashReports_reportsDir();
this.CrashReports.submittedDir = CrashReports_submittedDir();