Bug 839778 - Use OS.File in about:crashes. r=adw

This commit is contained in:
Marco Castelluccio 2014-04-13 14:28:18 -04:00
parent ced63f557e
commit b8e40d8501
4 changed files with 192 additions and 44 deletions

View File

@ -2,14 +2,18 @@
* 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 Cc = Components.classes;
const Ci = Components.interfaces;
const { classes: Cc, utils: Cu, interfaces: Ci } = Components;
var reportURL;
Components.utils.import("resource://gre/modules/CrashReports.jsm");
Components.utils.import("resource://gre/modules/CrashSubmit.jsm");
Components.utils.import("resource://gre/modules/Services.jsm");
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;
@ -127,46 +131,53 @@ function populateReportList() {
}
}
function clearReports() {
var bundles = Cc["@mozilla.org/intl/stringbundle;1"].
getService(Ci.nsIStringBundleService);
var bundle = bundles.createBundle("chrome://global/locale/crashes.properties");
var prompts = Cc["@mozilla.org/embedcomp/prompt-service;1"].
getService(Ci.nsIPromptService);
if (!prompts.confirm(window,
bundle.GetStringFromName("deleteconfirm.title"),
bundle.GetStringFromName("deleteconfirm.description")))
return;
let clearReports = Task.async(function*() {
let bundle = Services.strings.createBundle("chrome://global/locale/crashes.properties");
var entries = CrashReports.submittedDir.directoryEntries;
while (entries.hasMoreElements()) {
var file = entries.getNext().QueryInterface(Ci.nsIFile);
var leaf = file.leafName;
if (leaf.substr(0, 3) == "bp-" &&
leaf.substr(-4) == ".txt") {
file.remove(false);
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();
}
}
entries = CrashReports.reportsDir.directoryEntries;
var oneYearAgo = Date.now() - 31586000000;
while (entries.hasMoreElements()) {
var file = entries.getNext().QueryInterface(Ci.nsIFile);
var leaf = file.leafName;
if (leaf.substr(0, 11) == "InstallTime" &&
file.lastModifiedTime < oneYearAgo &&
leaf != "InstallTime" + buildID) {
file.remove(false);
});
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;
}
}
entries = CrashReports.pendingDir.directoryEntries;
while (entries.hasMoreElements()) {
entries.getNext().QueryInterface(Ci.nsIFile).remove(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";
}
function init() {
populateReportList();
}
});

View File

@ -66,9 +66,9 @@ td:last-child {
<script type="application/javascript;version=1.8" src="chrome://global/content/crashes.js"/>
<title>&crashes.title;</title>
</head><body onload="init()" dir="&locale.dir;">
</head><body onload="populateReportList()" dir="&locale.dir;">
<button chromedir="&locale.dir;" id="clear-reports"
onclick="clearReports()">&clearAllReports.label;</button>
onclick="clearReports().then(null, Cu.reportError)">&clearAllReports.label;</button>
<h1>&crashes.title;</h1>
<div id="reportList">
<table>

View File

@ -8,3 +8,4 @@ skip-if = e10s # Bug 929045 - [tracking] e10s support for Crash Reporting
[browser_aboutCrashes.js]
[browser_aboutCrashesResubmit.js]
[browser_bug471404.js]
[browser_clearReports.js]

View File

@ -0,0 +1,136 @@
/* 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/. */
function clickClearReports(tab, cb) {
let doc = gBrowser.getBrowserForTab(tab).contentDocument;
let button = doc.getElementById("clear-reports");
if (!button) {
ok(false, "Button not found");
cb();
return;
}
let style = doc.defaultView.getComputedStyle(button, "");
isnot(style.display, "none", "Clear reports button visible");
var observer = new MutationObserver(function(mutations) {
for (let mutation of mutations) {
if (mutation.type == "attributes" &&
mutation.attributeName == "style") {
observer.disconnect();
is(style.display, "none", "Clear reports button hidden");
cb();
}
}
});
observer.observe(button, {
attributes: true,
childList: true,
characterData: true,
attributeFilter: ["style"],
});
button.click();
}
var promptShown = false;
let oldPrompt = Services.prompt;
Services.prompt = {
confirm: function() {
promptShown = true;
return true;
},
};
registerCleanupFunction(function () {
Services.prompt = oldPrompt;
});
function test() {
waitForExplicitFinish();
let appD = make_fake_appdir();
let crD = appD.clone();
crD.append("Crash Reports");
// Add crashes to submitted dir
let submitdir = crD.clone();
submitdir.append("submitted");
let file1 = submitdir.clone();
file1.append("bp-nontxt");
file1.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0666);
let file2 = submitdir.clone();
file2.append("nonbp-file.txt");
file2.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0666);
add_fake_crashes(crD, 5);
// Add crashes to pending dir
let pendingdir = crD.clone();
pendingdir.append("pending");
let crashes = add_fake_crashes(crD, 2);
addPendingCrashreport(crD, crashes[0].date);
addPendingCrashreport(crD, crashes[1].date);
// Add crashes to reports dir
let report1 = crD.clone();
report1.append("NotInstallTime777");
report1.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0666);
let report2 = crD.clone();
report2.append("InstallTime" + Services.appinfo.appBuildID);
report2.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0666);
let report3 = crD.clone();
report3.append("InstallTimeNew");
report3.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0666);
let report4 = crD.clone();
report4.append("InstallTimeOld");
report4.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0666);
report4.lastModifiedTime = Date.now() - 63172000000;
let tab = gBrowser.selectedTab = gBrowser.addTab("about:blank");
registerCleanupFunction(function () {
cleanup_fake_appdir();
gBrowser.removeTab(tab);
});
let browser = gBrowser.getBrowserForTab(tab);
browser.addEventListener("load", function onLoad() {
browser.removeEventListener("load", onLoad, true);
executeSoon(function() {
let dirs = [ submitdir, pendingdir, crD ];
let existing = [ file1.path, file2.path, report1.path, report2.path,
report3.path, submitdir.path, pendingdir.path ];
clickClearReports(tab, function() {
for (let dir of dirs) {
let entries = dir.directoryEntries;
while (entries.hasMoreElements()) {
let file = entries.getNext().QueryInterface(Ci.nsIFile);
let index = existing.indexOf(file.path);
isnot(index, -1, file.leafName + " exists");
if (index != -1) {
existing.splice(index, 1);
}
}
}
is(existing.length, 0, "All the files that should still exist exist");
ok(promptShown, "Prompt shown");
finish();
});
});
}, true);
browser.loadURI("about:crashes", null, null);
}