Mercurial > nightly_tester_tools
diff components/nttBreakpadService.js @ 0:dada0ac40a8f
initial import
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Tue, 02 Dec 2008 20:31:01 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/nttBreakpadService.js Tue Dec 02 20:31:01 2008 +0900 @@ -0,0 +1,265 @@ +const Cc = Components.classes; +const Ci = Components.interfaces; +const Cr = Components.results; + +Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); + +const LOAD_DELAY = 50; + +Cc["@mozilla.org/moz/jssubscript-loader;1"] + .getService(Ci.mozIJSSubScriptLoader) + .loadSubScript("chrome://nightly/content/includes/tree-utils.js", null); + +function BP_CreateArray(source) +{ + var result = Cc["@mozilla.org/array;1"] + .createInstance(Ci.nsIMutableArray); + + for (var key in source) + result.appendElement(source[key], false); + + return result; +} + +function nttBreakpadIncident(file) +{ + this.id = file.leafName; + this.id = this.id.substring(0, this.id.length - 4); + this.date = file.lastModifiedTime; + this.file = file; +} + +nttBreakpadIncident.prototype = { +date: null, +id: null, +file: null, + +QueryInterface: XPCOMUtils.generateQI([Ci.nttIBreakpadIncident]) +} + +function nttBreakpadService() { + var obs = Cc["@mozilla.org/observer-service;1"] + .getService(Ci.nsIObserverService); + obs.addObserver(this, "quit-application", false); + + this._dirs = []; + this._databases = []; + this._listeners = []; + this._incidents = []; + this._orderedIncidents = []; + + this._findBreakpad(); + if (this.reportdir) + this._dirs.push(this.reportdir); + else + { + this.loaded = true; + this._loading = true; + } +} + +nttBreakpadService.prototype = { + +reportdir: null, + +loaded: false, +_loading: false, +_dirs: null, +_databases: null, +_loadTimer: null, +_listeners: null, + +incidents: null, +orderedIncidents: null, + +addProgressListener: function(listener) +{ + if (!this.loaded) + this._listeners.push(listener); + else + listener.onDatabaseLoaded(); +}, + +loadDatabase: function() +{ + if (this._loading) + return; + + this._loading = true; + + if (this.reportdir && this.reportdir.exists()) + { + this.incidents = []; + this.orderedIncidents = []; + + this._loadTimer = Cc["@mozilla.org/timer;1"] + .createInstance(Ci.nsITimer); + this._loadTimer.init(this, LOAD_DELAY, Components.interfaces.nsITimer.TYPE_ONE_SHOT); + } + else + this.loaded = true; +}, + +observe: function(subject, topic, data) +{ + switch (topic) + { + case "quit-application": + if (this._loadTimer) + { + // Shutdown during load, clear references + this._loadTimer.cancel(); + this._loadTimer = null; + this._databases = []; + this._dirs = []; + this._listeners = []; + } + var obs = Cc["@mozilla.org/observer-service;1"] + .getService(Ci.nsIObserverService); + obs.removeObserver(this, "quit-application"); + break; + case "timer-callback": + this.run(); + break; + } +}, + +run: function() +{ + if (this._dirs.length>0) + this._scanDir(this._dirs.pop()); + else if (this._databases.length>0) + this._loadDatabase(this._databases.pop()); + else + { + this.loaded = true; + if (this._listeners.length == 0) { + this._loadTimer = null; + return; + } + var listener = this._listeners.pop(); + listener.onDatabaseLoaded(); + if (this._listeners.length == 0) { + this._loadTimer = null; + return; + } + } + this._loadTimer.init(this, LOAD_DELAY, Components.interfaces.nsITimer.TYPE_ONE_SHOT); +}, + +_scanDir: function(dir) +{ + var entries = dir.directoryEntries; + while (entries.hasMoreElements()) + { + var ndir = entries.getNext().QueryInterface(Ci.nsIFile); + if (ndir.isDirectory()) + this._dirs.push(ndir); + else + { + var ext = ndir.leafName; + ext = ext.substring(ext.length - 4); + if (ext == ".txt") + this._databases.push(ndir); + } + } +}, + +_loadDatabase: function(database) +{ + var incident = new nttBreakpadIncident(database); + this._addIncident(incident); +}, + +_findBreakpad: function() +{ + var directoryService = Cc["@mozilla.org/file/directory_service;1"] + .getService(Ci.nsIProperties); + var dir = directoryService.get("DefProfRt", Ci.nsIFile); + if (dir.leafName.toLowerCase() == "profiles") + dir = dir.parent; + dir.append("Crash Reports"); + if (dir.exists() && dir.isDirectory()) + this.reportdir = dir; +}, + +_addIncident: function(incident) +{ + var pos = 0; + while ((pos < this.orderedIncidents.length) && (this.orderedIncidents[pos].date > incident.date)) + pos++; + + this.orderedIncidents.splice(pos, 0, incident); + this.incidents[incident.id]=incident; +}, + +getRecentIncidents: function(date) +{ + var result = Cc["@mozilla.org/array;1"] + .createInstance(Ci.nsIMutableArray); + + for (var i = 0; i < this.orderedIncidents.length; i++) + { + if (this.orderedIncidents[i].date<date) + break; + + result.appendElement(this.orderedIncidents[i], false); + } + + return result; +}, + +getPreviousIncidents: function(count) +{ + var result = Cc["@mozilla.org/array;1"] + .createInstance(Ci.nsIMutableArray); + + count=Math.min(count, this.orderedIncidents.length); + + for (var i = 0; i < count; i++) + result.appendElement(this.orderedIncidents[i], false); + + return result; +}, + +getIncident: function(id) +{ + return this.incidents[id]; +}, + +getIncidents: function() +{ + return TB_CreateArray(this.orderedIncidents); +}, + +getTreeView: function() +{ + var share = {}; + var tv = new XULTreeView(share); + tv.childData.reserveChildren(true); + + var vparent = tv.childData; + + for (var i = 0; i < this.orderedIncidents.length; i++) + { + var incident = this.orderedIncidents[i]; + record = new XULTreeViewRecord(share); + record.setColumnPropertyName("incidentID", "id"); + record.setColumnPropertyName("incidentDate", "date"); + record.setColumnProperties("incidentID", "name incident"); + record.id = incident.id; + record.date = (new Date(incident.date)).toLocaleString(); + tv.childData.appendChild(record); + } + + return tv; +}, + +classDescription: "Nightly Tester Breakpad Service", +contractID: "@blueprintit.co.uk/breakpad;1", +classID: Components.ID("{b33388ca-71b4-4194-b822-2cbd0e89ffc0}"), +QueryInterface: XPCOMUtils.generateQI([Ci.nttIBreakpadService, Ci.nsIObserver]) +} + +function NSGetModule(compMgr, fileSpec) + XPCOMUtils.generateModule([nttBreakpadService]);