diff -r 000000000000 -r 6474c204b198 toolkit/crashreporter/content/crashes.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolkit/crashreporter/content/crashes.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,183 @@ +/* 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 { classes: Cc, utils: Cu, interfaces: Ci } = Components; + +var reportURL; + +Cu.import("resource://gre/modules/CrashReports.jsm"); +Cu.import("resource://gre/modules/Services.jsm"); +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +Cu.import("resource://gre/modules/Task.jsm"); +Cu.import("resource://gre/modules/osfile.jsm"); + +XPCOMUtils.defineLazyModuleGetter(this, "CrashSubmit", + "resource://gre/modules/CrashSubmit.jsm"); + +const buildID = Services.appinfo.appBuildID; + +function submitSuccess(dumpid, ret) { + let link = document.getElementById(dumpid); + if (link) { + link.className = ""; + // reset the link to point at our new crash report. this way, if the + // user clicks "Back", the link will be correct. + let CrashID = ret.CrashID; + link.firstChild.textContent = CrashID; + link.setAttribute("id", CrashID); + link.removeEventListener("click", submitPendingReport, true); + + if (reportURL) { + link.setAttribute("href", reportURL + CrashID); + // redirect the user to their brand new crash report + window.location.href = reportURL + CrashID; + } + } +} + +function submitError(dumpid) { + //XXX: do something more useful here + let link = document.getElementById(dumpid); + if (link) + link.className = ""; + // dispatch an event, useful for testing + let event = document.createEvent("Events"); + event.initEvent("CrashSubmitFailed", true, false); + document.dispatchEvent(event); +} + +function submitPendingReport(event) { + var link = event.target; + var id = link.firstChild.textContent; + if (CrashSubmit.submit(id, { submitSuccess: submitSuccess, + submitError: submitError, + noThrottle: true })) { + link.className = "submitting"; + } + event.preventDefault(); + return false; +} + +function populateReportList() { + var prefService = Cc["@mozilla.org/preferences-service;1"]. + getService(Ci.nsIPrefBranch); + + try { + reportURL = prefService.getCharPref("breakpad.reportURL"); + // Ignore any non http/https urls + if (!/^https?:/i.test(reportURL)) + reportURL = null; + } + catch (e) { } + if (!reportURL) { + document.getElementById("clear-reports").style.display = "none"; + document.getElementById("reportList").style.display = "none"; + document.getElementById("noConfig").style.display = "block"; + return; + } + let reports = CrashReports.getReports(); + + if (reports.length == 0) { + document.getElementById("clear-reports").style.display = "none"; + document.getElementById("reportList").style.display = "none"; + document.getElementById("noReports").style.display = "block"; + return; + } + + var formatter = Cc["@mozilla.org/intl/scriptabledateformat;1"]. + createInstance(Ci.nsIScriptableDateFormat); + var body = document.getElementById("tbody"); + var ios = Cc["@mozilla.org/network/io-service;1"]. + getService(Ci.nsIIOService); + var reportURI = ios.newURI(reportURL, null, null); + // resolving this URI relative to /report/index + var aboutThrottling = ios.newURI("../../about/throttling", null, reportURI); + + for (var i = 0; i < reports.length; i++) { + var row = document.createElement("tr"); + var cell = document.createElement("td"); + row.appendChild(cell); + var link = document.createElement("a"); + if (reports[i].pending) { + link.setAttribute("href", aboutThrottling.spec); + link.addEventListener("click", submitPendingReport, true); + } + else { + link.setAttribute("href", reportURL + reports[i].id); + } + link.setAttribute("id", reports[i].id); + link.appendChild(document.createTextNode(reports[i].id)); + cell.appendChild(link); + + var date = new Date(reports[i].date); + cell = document.createElement("td"); + var datestr = formatter.FormatDate("", + Ci.nsIScriptableDateFormat.dateFormatShort, + date.getFullYear(), + date.getMonth() + 1, + date.getDate()); + cell.appendChild(document.createTextNode(datestr)); + row.appendChild(cell); + cell = document.createElement("td"); + var timestr = formatter.FormatTime("", + Ci.nsIScriptableDateFormat.timeFormatNoSeconds, + date.getHours(), + date.getMinutes(), + date.getSeconds()); + cell.appendChild(document.createTextNode(timestr)); + row.appendChild(cell); + body.appendChild(row); + } +} + +let clearReports = Task.async(function*() { + let bundle = Services.strings.createBundle("chrome://global/locale/crashes.properties"); + + if (!Services. + prompt.confirm(window, + bundle.GetStringFromName("deleteconfirm.title"), + bundle.GetStringFromName("deleteconfirm.description"))) { + return; + } + + let cleanupFolder = Task.async(function*(path, filter) { + let iterator = new OS.File.DirectoryIterator(path); + try { + yield iterator.forEach(Task.async(function*(aEntry) { + if (!filter || (yield filter(aEntry))) { + yield OS.File.remove(aEntry.path); + } + })); + } catch (e if e instanceof OS.File.Error && e.becauseNoSuchFile) { + } finally { + iterator.close(); + } + }); + + yield cleanupFolder(CrashReports.submittedDir.path, function*(aEntry) { + return aEntry.name.startsWith("bp-") && aEntry.name.endsWith(".txt"); + }); + + let oneYearAgo = Date.now() - 31586000000; + yield cleanupFolder(CrashReports.reportsDir.path, function*(aEntry) { + if (!aEntry.name.startsWith("InstallTime") || + aEntry.name == "InstallTime" + buildID) { + return false; + } + + let date = aEntry.winLastWriteDate; + if (!date) { + let stat = yield OS.File.stat(aEntry.path); + date = stat.lastModificationDate; + } + + return (date < oneYearAgo); + }); + + yield cleanupFolder(CrashReports.pendingDir.path); + + document.getElementById("clear-reports").style.display = "none"; + document.getElementById("reportList").style.display = "none"; + document.getElementById("noReports").style.display = "block"; +});