Bug 855930 - Add telemetry for max and current number of tabs. r=sfoster

This commit is contained in:
Marina Samuel 2014-02-11 14:00:19 -05:00
parent ea102e2981
commit c9c70d42a6
2 changed files with 76 additions and 0 deletions

View File

@ -26,3 +26,41 @@ gTests.push({
ok(simpleMeasurements.UITelemetry["metro-ui"]["window-height"], "window-height measurement was captured");
}
});
gTests.push({
desc: "Test tab count telemetry",
run: function() {
// Wait for Session Manager to be initialized.
yield waitForCondition(() => window.__SSID);
Services.obs.notifyObservers(null, "reset-telemetry-vars", null);
yield waitForCondition(function () {
let simpleMeasurements = getTelemetryPayload().simpleMeasurements;
return simpleMeasurements.UITelemetry["metro-tabs"]["currTabCount"] == 1;
});
let simpleMeasurements = getTelemetryPayload().simpleMeasurements;
is(simpleMeasurements.UITelemetry["metro-tabs"]["currTabCount"], 1);
is(simpleMeasurements.UITelemetry["metro-tabs"]["maxTabCount"], 1);
let tab2 = Browser.addTab("about:mozilla");
simpleMeasurements = getTelemetryPayload().simpleMeasurements;
is(simpleMeasurements.UITelemetry["metro-tabs"]["currTabCount"], 2);
is(simpleMeasurements.UITelemetry["metro-tabs"]["maxTabCount"], 2);
let tab3 = Browser.addTab("about:config");
simpleMeasurements = getTelemetryPayload().simpleMeasurements;
is(simpleMeasurements.UITelemetry["metro-tabs"]["currTabCount"], 3);
is(simpleMeasurements.UITelemetry["metro-tabs"]["maxTabCount"], 3);
Browser.closeTab(tab2, { forceClose: true } );
simpleMeasurements = getTelemetryPayload().simpleMeasurements;
is(simpleMeasurements.UITelemetry["metro-tabs"]["currTabCount"], 2);
is(simpleMeasurements.UITelemetry["metro-tabs"]["maxTabCount"], 3);
Browser.closeTab(tab3, { forceClose: true } );
simpleMeasurements = getTelemetryPayload().simpleMeasurements;
is(simpleMeasurements.UITelemetry["metro-tabs"]["currTabCount"], 1);
is(simpleMeasurements.UITelemetry["metro-tabs"]["maxTabCount"], 3);
}
});

View File

@ -24,6 +24,9 @@ XPCOMUtils.defineLazyGetter(this, "NetUtil", function() {
return NetUtil;
});
XPCOMUtils.defineLazyModuleGetter(this, "UITelemetry",
"resource://gre/modules/UITelemetry.jsm");
// -----------------------------------------------------------------------
// Session Store
// -----------------------------------------------------------------------
@ -52,6 +55,9 @@ SessionStore.prototype = {
_maxTabsUndo: 1,
_shouldRestore: false,
// Tab telemetry variables
_maxTabsOpen: 1,
init: function ss_init() {
// Get file references
this._sessionFile = Services.dirsvc.get("ProfD", Ci.nsILocalFile);
@ -63,6 +69,13 @@ SessionStore.prototype = {
this._loadState = STATE_STOPPED;
try {
UITelemetry.addSimpleMeasureFunction("metro-tabs",
this._getTabStats.bind(this));
} catch (ex) {
// swallow exception that occurs if metro-tabs measure is already set up
}
try {
let shutdownWasUnclean = false;
@ -184,6 +197,13 @@ SessionStore.prototype = {
})
},
_getTabStats: function() {
return {
currTabCount: this._currTabCount,
maxTabCount: this._maxTabsOpen
};
},
observe: function ss_observe(aSubject, aTopic, aData) {
let self = this;
let observerService = Services.obs;
@ -197,6 +217,7 @@ SessionStore.prototype = {
observerService.addObserver(this, "quit-application-requested", true);
observerService.addObserver(this, "quit-application-granted", true);
observerService.addObserver(this, "quit-application", true);
observerService.addObserver(this, "reset-telemetry-vars", true);
break;
case "final-ui-startup":
observerService.removeObserver(this, "final-ui-startup");
@ -264,6 +285,7 @@ SessionStore.prototype = {
observerService.removeObserver(this, "quit-application-requested");
observerService.removeObserver(this, "quit-application-granted");
observerService.removeObserver(this, "quit-application");
observerService.removeObserver(this, "reset-telemetry-vars");
// If a save has been queued, kill the timer and save state now
if (this._saveTimer) {
@ -295,13 +317,24 @@ SessionStore.prototype = {
this._saveTimer = null;
this.saveState();
break;
case "reset-telemetry-vars":
// Used in mochitests only.
this._maxTabsOpen = 1;
}
},
updateTabTelemetryVars: function(window) {
this._currTabCount = window.Browser.tabs.length;
if (this._currTabCount > this._maxTabsOpen) {
this._maxTabsOpen = this._currTabCount;
}
},
handleEvent: function ss_handleEvent(aEvent) {
let window = aEvent.currentTarget.ownerDocument.defaultView;
switch (aEvent.type) {
case "TabOpen":
this.updateTabTelemetryVars(window);
case "TabClose": {
let browser = aEvent.originalTarget.linkedBrowser;
if (aEvent.type == "TabOpen") {
@ -313,6 +346,9 @@ SessionStore.prototype = {
}
break;
}
case "TabRemove":
this.updateTabTelemetryVars(window);
break;
case "TabSelect": {
let browser = aEvent.originalTarget.linkedBrowser;
this.onTabSelect(window, browser);
@ -361,6 +397,7 @@ SessionStore.prototype = {
let tabContainer = aWindow.document.getElementById("tabs");
tabContainer.addEventListener("TabOpen", this, true);
tabContainer.addEventListener("TabClose", this, true);
tabContainer.addEventListener("TabRemove", this, true);
tabContainer.addEventListener("TabSelect", this, true);
},
@ -372,6 +409,7 @@ SessionStore.prototype = {
let tabContainer = aWindow.document.getElementById("tabs");
tabContainer.removeEventListener("TabOpen", this, true);
tabContainer.removeEventListener("TabClose", this, true);
tabContainer.removeEventListener("TabRemove", this, true);
tabContainer.removeEventListener("TabSelect", this, true);
if (this._loadState == STATE_RUNNING) {