Bug 1150529 - Remove code for expired telemetry histograms r=Yoric

This commit is contained in:
Tim Taubert 2015-05-02 09:56:39 +02:00
parent cab9a98e5b
commit 0604dd048f
7 changed files with 5 additions and 625 deletions

View File

@ -71,22 +71,6 @@ this.SessionFile = {
write: function (aData) {
return SessionFileInternal.write(aData);
},
/**
* Gather telemetry statistics.
*
*
* Most of the work is done off the main thread but there is a main
* thread cost involved to send data to the worker thread. This method
* should therefore be called only when we know that it will not disrupt
* the user's experience, e.g. on idle-daily.
*
* @return {Promise}
* @promise {object} An object holding all the information to be submitted
* to Telemetry.
*/
gatherTelemetry: function(aData) {
return SessionFileInternal.gatherTelemetry(aData);
},
/**
* Wipe the contents of the session file, asynchronously.
*/
@ -268,14 +252,6 @@ let SessionFileInternal = {
return result;
}),
gatherTelemetry: function(aStateString) {
return Task.spawn(function() {
let msg = yield SessionWorker.post("gatherTelemetry", [aStateString]);
this._recordTelemetry(msg.telemetry);
throw new Task.Result(msg.telemetry);
}.bind(this));
},
write: function (aData) {
if (RunState.isClosed) {
return Promise.reject(new Error("SessionFile is closed"));
@ -289,25 +265,11 @@ let SessionFileInternal = {
RunState.setClosed();
}
let refObj = {};
let name = "FX_SESSION_RESTORE_WRITE_FILE_LONGEST_OP_MS";
let performShutdownCleanup = isFinalWrite &&
!sessionStartup.isAutomaticRestoreEnabled();
let promise = new Promise(resolve => {
// Start measuring main thread impact.
TelemetryStopwatch.start(name, refObj);
let performShutdownCleanup = isFinalWrite &&
!sessionStartup.isAutomaticRestoreEnabled();
let options = {isFinalWrite, performShutdownCleanup};
try {
resolve(SessionWorker.post("write", [aData, options]));
} finally {
// Record how long we stopped the main thread.
TelemetryStopwatch.finish(name, refObj);
}
});
let options = {isFinalWrite, performShutdownCleanup};
let promise = SessionWorker.post("write", [aData, options]);
// Wait until the write is done.
promise = promise.then(msg => {
@ -322,7 +284,6 @@ let SessionFileInternal = {
}
}, err => {
// Catch and report any errors.
TelemetryStopwatch.cancel(name, refObj);
console.error("Could not write session state file ", err, err.stack);
// By not doing anything special here we ensure that |promise| cannot
// be rejected anymore. The shutdown/cleanup code at the end of the

View File

@ -246,8 +246,6 @@ let SessionSaverInternal = {
* Write the given state object to disk.
*/
_writeState: function (state) {
stopWatchStart("WRITE_STATE_LONGEST_OP_MS");
// We update the time stamp before writing so that we don't write again
// too soon, if saving is requested before the write completes. Without
// this update we may save repeatedly if actions cause a runDelayed
@ -257,14 +255,9 @@ let SessionSaverInternal = {
// Write (atomically) to a session file, using a tmp file. Once the session
// file is successfully updated, save the time stamp of the last save and
// notify the observers.
let promise = SessionFile.write(state);
stopWatchFinish("WRITE_STATE_LONGEST_OP_MS");
promise = promise.then(() => {
return SessionFile.write(state).then(() => {
this.updateLastSaveTime();
notify(null, "sessionstore-state-write-complete");
}, console.error);
return promise;
},
};

View File

@ -30,7 +30,6 @@ const OBSERVING = [
"quit-application-requested", "browser-lastwindow-close-granted",
"quit-application", "browser:purge-session-history",
"browser:purge-domain-data",
"gather-telemetry",
"idle-daily",
];
@ -103,9 +102,6 @@ const TAB_EVENTS = [
"TabUnpinned"
];
// The number of milliseconds in a day
const MS_PER_DAY = 1000.0 * 60.0 * 60.0 * 24.0;
Cu.import("resource://gre/modules/Services.jsm", this);
Cu.import("resource://gre/modules/XPCOMUtils.jsm", this);
Cu.import("resource://gre/modules/TelemetryTimestamps.jsm", this);
@ -591,9 +587,6 @@ let SessionStoreInternal = {
case "nsPref:changed": // catch pref changes
this.onPrefChange(aData);
break;
case "gather-telemetry":
this.onGatherTelemetry();
break;
case "idle-daily":
this.onIdleDaily();
break;
@ -1616,14 +1609,6 @@ let SessionStoreInternal = {
this._resetLocalTabRestoringState(tab);
},
onGatherTelemetry: function() {
// On the first gather-telemetry notification of the session,
// gather telemetry data.
Services.obs.removeObserver(this, "gather-telemetry");
let stateString = SessionStore.getBrowserState();
return SessionFile.gatherTelemetry(stateString);
},
// Clean up data that has been closed a long time ago.
// Do not reschedule a save. This will wait for the next regular
// save.
@ -2405,7 +2390,6 @@ let SessionStoreInternal = {
_collectWindowData: function ssi_collectWindowData(aWindow) {
if (!this._isWindowLoaded(aWindow))
return;
TelemetryStopwatch.start("FX_SESSION_RESTORE_COLLECT_SINGLE_WINDOW_DATA_MS");
let tabbrowser = aWindow.gBrowser;
let tabs = tabbrowser.tabs;
@ -2427,7 +2411,6 @@ let SessionStoreInternal = {
aWindow.__SS_lastSessionWindowID;
DirtyWindows.remove(aWindow);
TelemetryStopwatch.finish("FX_SESSION_RESTORE_COLLECT_SINGLE_WINDOW_DATA_MS");
},
/* ........ Restoring Functionality .............. */
@ -3077,14 +3060,6 @@ let SessionStoreInternal = {
// Attempt to load the session start time from the session state
if (state.session && state.session.startTime) {
this._sessionStartTime = state.session.startTime;
// ms to days
let sessionLength = (Date.now() - this._sessionStartTime) / MS_PER_DAY;
if (sessionLength > 0) {
// Submit the session length telemetry measurement
Services.telemetry.getHistogramById("FX_SESSION_RESTORE_SESSION_LENGTH").add(sessionLength);
}
}
},

View File

@ -283,16 +283,6 @@ let Agent = {
};
},
/**
* Extract all sorts of useful statistics from a state string,
* for use with Telemetry.
*
* @return {object}
*/
gatherTelemetry: function (stateString) {
return Statistics.collect(stateString);
},
/**
* Wipes all files holding session data from disk.
*/
@ -388,131 +378,3 @@ function isNoSuchFileEx(aReason) {
function getByteLength(str) {
return Encoder.encode(JSON.stringify(str)).byteLength;
}
/**
* Tools for gathering statistics on a state string.
*/
let Statistics = {
collect: function(stateString) {
let start = Date.now();
let TOTAL_PREFIX = "FX_SESSION_RESTORE_TOTAL_";
let INDIVIDUAL_PREFIX = "FX_SESSION_RESTORE_INDIVIDUAL_";
let SIZE_SUFFIX = "_SIZE_BYTES";
let state = JSON.parse(stateString);
// Gather all data
let subsets = {};
this.gatherSimpleData(state, subsets);
this.gatherComplexData(state, subsets);
// Extract telemetry
let telemetry = {};
for (let k of Object.keys(subsets)) {
let obj = subsets[k];
telemetry[TOTAL_PREFIX + k + SIZE_SUFFIX] = getByteLength(obj);
if (Array.isArray(obj)) {
let size = obj.map(getByteLength);
telemetry[INDIVIDUAL_PREFIX + k + SIZE_SUFFIX] = size;
}
}
let stop = Date.now();
telemetry["FX_SESSION_RESTORE_EXTRACTING_STATISTICS_DURATION_MS"] = stop - start;
return {
telemetry: telemetry
};
},
/**
* Collect data that doesn't require a recursive walk through the
* data structure.
*/
gatherSimpleData: function(state, subsets) {
// The subset of sessionstore.js dealing with open windows
subsets.OPEN_WINDOWS = state.windows;
// The subset of sessionstore.js dealing with closed windows
subsets.CLOSED_WINDOWS = state._closedWindows;
// The subset of sessionstore.js dealing with closed tabs
// in open windows
subsets.CLOSED_TABS_IN_OPEN_WINDOWS = [];
// The subset of sessionstore.js dealing with cookies
// in both open and closed windows
subsets.COOKIES = [];
for (let winData of state.windows) {
let closedTabs = winData._closedTabs || [];
subsets.CLOSED_TABS_IN_OPEN_WINDOWS.push(...closedTabs);
let cookies = winData.cookies || [];
subsets.COOKIES.push(...cookies);
}
for (let winData of state._closedWindows) {
let cookies = winData.cookies || [];
subsets.COOKIES.push(...cookies);
}
},
/**
* Walk through a data structure, recursively.
*
* @param {object} root The object from which to start walking.
* @param {function(key, value)} cb Callback, called for each
* item except the root. Returns |true| to walk the subtree rooted
* at |value|, |false| otherwise */
walk: function(root, cb) {
if (!root || typeof root !== "object") {
return;
}
for (let k of Object.keys(root)) {
let obj = root[k];
let stepIn = cb(k, obj);
if (stepIn) {
this.walk(obj, cb);
}
}
},
/**
* Collect data that requires walking through the data structure
*/
gatherComplexData: function(state, subsets) {
// The subset of sessionstore.js dealing with DOM storage
subsets.DOM_STORAGE = [];
// The subset of sessionstore.js storing form data
subsets.FORMDATA = [];
// The subset of sessionstore.js storing history
subsets.HISTORY = [];
this.walk(state, function(k, value) {
let dest;
switch (k) {
case "entries":
subsets.HISTORY.push(value);
return true;
case "storage":
subsets.DOM_STORAGE.push(value);
// Never visit storage, it's full of weird stuff
return false;
case "formdata":
subsets.FORMDATA.push(value);
// Never visit formdata, it's full of weird stuff
return false;
case "cookies": // Don't visit these places, they are full of weird stuff
case "extData":
return false;
default:
return true;
}
});
return subsets;
},
};

View File

@ -101,7 +101,6 @@ skip-if = e10s
skip-if = e10s # See bug 918634
[browser_switch_remoteness.js]
run-if = e10s
[browser_telemetry.js]
[browser_upgrade_backup.js]
[browser_windowRestore_perwindowpb.js]
[browser_248970_b_perwindowpb.js]

View File

@ -1,270 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
let tmp = {};
Cu.import("resource:///modules/sessionstore/SessionFile.jsm", tmp);
let {SessionFile} = tmp;
// Shortcuts for histogram names
let Keys = {};
for (let k of ["HISTORY", "FORMDATA", "OPEN_WINDOWS", "CLOSED_WINDOWS", "CLOSED_TABS_IN_OPEN_WINDOWS", "DOM_STORAGE"]) {
Keys[k] = "FX_SESSION_RESTORE_TOTAL_" + k + "_SIZE_BYTES";
}
function lt(a, b, message) {
isnot(a, undefined, message + " (sanity check)");
isnot(b, undefined, message + " (sanity check)");
ok(a < b, message + " ( " + a + " < " + b + ")");
}
function gt(a, b, message) {
isnot(a, undefined, message + " (sanity check)");
isnot(b, undefined, message + " (sanity check)");
ok(a > b, message + " ( " + a + " > " + b + ")");
}
add_task(function init() {
forgetClosedWindows();
for (let i = ss.getClosedTabCount(window) - 1; i >= 0; --i) {
ss.forgetClosedTab(window, i);
}
});
/**
* Test that Telemetry collection doesn't cause any error.
*/
add_task(function() {
info("Checking a little bit of consistency");
let statistics = yield promiseStats();
for (let k of Object.keys(statistics)) {
let data = statistics[k];
info("Data for " + k + ": " + data);
if (Array.isArray(data)) {
ok(data.every(x => x >= 0), "Data for " + k + " is >= 0");
} else {
ok(data >= 0, "Data for " + k + " is >= 0");
}
}
});
/**
* Test HISTORY key.
*/
add_task(function history() {
let KEY = Keys.HISTORY;
let tab = gBrowser.addTab("http://example.org:80/?");
yield promiseBrowserLoaded(tab.linkedBrowser);
try {
TabState.flush(tab.linkedBrowser);
let statistics = yield promiseStats();
info("Now changing history");
tab.linkedBrowser.loadURI("http://example.org:80/1");
yield promiseBrowserLoaded(tab.linkedBrowser);
TabState.flush(tab.linkedBrowser);
let statistics2 = yield promiseStats();
// We have changed history, so it must have increased
isnot(statistics[KEY], undefined, "Key was defined");
isnot(statistics2[KEY], undefined, "Key is still defined");
gt(statistics2[KEY], statistics[KEY], "The total size of HISTORY has increased");
// Almost nothing else should
for (let k of ["FORMDATA", "DOM_STORAGE", "CLOSED_WINDOWS", "CLOSED_TABS_IN_OPEN_WINDOWS"]) {
is(statistics2[Keys[k]], statistics[Keys[k]], "The total size of " + k + " has not increased");
}
} finally {
if (tab) {
yield promiseRemoveTab(tab);
}
}
});
/**
* Test CLOSED_TABS_IN_OPEN_WINDOWS key.
*/
add_task(function close_tab() {
let KEY = Keys.CLOSED_TABS_IN_OPEN_WINDOWS;
let tab = gBrowser.addTab("http://example.org:80/?close_tab");
yield promiseBrowserLoaded(tab.linkedBrowser);
try {
TabState.flush(tab.linkedBrowser);
let statistics = yield promiseStats();
info("Now closing a tab");
yield promiseRemoveTab(tab);
tab = null;
let statistics2 = yield promiseStats();
isnot(statistics[KEY], undefined, "Key was defined");
isnot(statistics2[KEY], undefined, "Key is still defined");
gt(statistics2[KEY], statistics[KEY], "The total size of CLOSED_TABS_IN_OPEN_WINDOWS has increased");
// Almost nothing else should change
for (let k of ["FORMDATA", "DOM_STORAGE", "CLOSED_WINDOWS"]) {
is(statistics2[Keys[k]], statistics[Keys[k]], "The total size of " + k + " has not increased");
}
} finally {
if (tab) {
yield promiseRemoveTab(tab);
}
}
});
/**
* Test OPEN_WINDOWS key.
*/
add_task(function open_window() {
let KEY = Keys.OPEN_WINDOWS;
let win;
try {
let statistics = yield promiseStats();
win = yield promiseNewWindowLoaded("http://example.org:80/?open_window");
let statistics2 = yield promiseStats();
isnot(statistics[KEY], undefined, "Key was defined");
isnot(statistics2[KEY], undefined, "Key is still defined");
gt(statistics2[KEY], statistics[KEY], "The total size of OPEN_WINDOWS has increased");
// Almost nothing else should change
for (let k of ["FORMDATA", "DOM_STORAGE", "CLOSED_WINDOWS", "CLOSED_TABS_IN_OPEN_WINDOWS"]) {
is(statistics2[Keys[k]], statistics[Keys[k]], "The total size of " + k + " has not increased");
}
} finally {
if (win) {
yield promiseWindowClosed(win);
}
}
});
/**
* Test CLOSED_WINDOWS key.
*/
add_task(function close_window() {
let KEY = Keys.CLOSED_WINDOWS;
let win = yield promiseNewWindowLoaded("http://example.org:80/?close_window");
// We need to add something to the window, otherwise it won't be saved
let tab = win.gBrowser.addTab("http://example.org:80/?close_tab");
yield promiseBrowserLoaded(tab.linkedBrowser);
try {
let statistics = yield promiseStats();
yield promiseWindowClosed(win);
win = null;
let statistics2 = yield promiseStats();
isnot(statistics[KEY], undefined, "Key was defined");
isnot(statistics2[KEY], undefined, "Key is still defined");
gt(statistics2[KEY], statistics[KEY], "The total size of CLOSED_WINDOWS has increased");
lt(statistics2[Keys.OPEN_WINDOWS], statistics[Keys.OPEN_WINDOWS], "The total size of OPEN_WINDOWS has decreased");
// Almost nothing else should change
for (let k of ["FORMDATA", "DOM_STORAGE", "CLOSED_TABS_IN_OPEN_WINDOWS"]) {
is(statistics2[Keys[k]], statistics[Keys[k]], "The total size of " + k + " has not increased");
}
} finally {
if (win) {
yield promiseWindowClosed(win);
}
}
});
/**
* Test DOM_STORAGE key.
*/
add_task(function dom_storage() {
let KEY = Keys.DOM_STORAGE;
let tab = gBrowser.addTab("http://example.org:80/?dom_storage");
yield promiseBrowserLoaded(tab.linkedBrowser);
try {
TabState.flush(tab.linkedBrowser);
let statistics = yield promiseStats();
info("Now adding some storage");
yield modifySessionStorage(tab.linkedBrowser, {foo: "bar"});
TabState.flush(tab.linkedBrowser);
let statistics2 = yield promiseStats();
isnot(statistics[KEY], undefined, "Key was defined");
isnot(statistics2[KEY], undefined, "Key is still defined");
gt(statistics2[KEY], statistics[KEY], "The total size of DOM_STORAGE has increased");
// Almost nothing else should change
for (let k of ["CLOSED_TABS_IN_OPEN_WINDOWS", "FORMDATA", "CLOSED_WINDOWS"]) {
is(statistics2[Keys[k]], statistics[Keys[k]], "The total size of " + k + " has not increased");
}
} finally {
if (tab) {
yield promiseRemoveTab(tab);
}
}
});
/**
* Test FORMDATA key.
*/
add_task(function formdata() {
let KEY = Keys.FORMDATA;
let tab = gBrowser.addTab("data:text/html;charset=utf-8,<input%20id='input'>");
yield promiseBrowserLoaded(tab.linkedBrowser);
try {
TabState.flush(tab.linkedBrowser);
let statistics = yield promiseStats();
info("Now changing form data");
yield setInputValue(tab.linkedBrowser, {id: "input", value: "This is some form data"});
TabState.flush(tab.linkedBrowser);
let statistics2 = yield promiseStats();
isnot(statistics[KEY], undefined, "Key was defined");
isnot(statistics2[KEY], undefined, "Key is still defined");
gt(statistics2[KEY], statistics[KEY], "The total size of FORMDATA has increased");
// Almost nothing else should
for (let k of ["DOM_STORAGE", "CLOSED_WINDOWS", "CLOSED_TABS_IN_OPEN_WINDOWS"]) {
is(statistics2[Keys[k]], statistics[Keys[k]], "The total size of " + k + " has not increased");
}
} finally {
if (tab) {
yield promiseRemoveTab(tab);
}
}
});
add_task(function* test_sessionRestoreInit() {
let info = Cc["@mozilla.org/toolkit/app-startup;1"].
getService(Ci.nsIAppStartup).
getStartupInfo();
ok(info.sessionRestoreInit > info.process, "sessionRestoreInit is after process creation");
ok(info.sessionRestoreInit <
Date.now() + 10000 /* Date.now() is non-monotonic, let's play it paranoid*/,
"sessionRestoreInit is before now");
});
/**
* Get the latest statistics.
*/
function promiseStats() {
let state = ss.getBrowserState();
info("Stats: " + state);
return SessionFile.gatherTelemetry(state);
}
function modifySessionStorage(browser, data) {
browser.messageManager.sendAsyncMessage("ss-test:modifySessionStorage", data);
return promiseContentMessage(browser, "ss-test:MozStorageChanged");
}
function setInputValue(browser, data) {
return sendMessage(browser, "ss-test:setInputValue", data);
}

View File

@ -3953,14 +3953,6 @@
"extended_statistics_ok": true,
"description": "Session restore: Time to collect all window data (ms)"
},
"FX_SESSION_RESTORE_COLLECT_SINGLE_WINDOW_DATA_MS": {
"expires_in_version": "40",
"kind": "exponential",
"high": "30000",
"n_buckets": 10,
"extended_statistics_ok": true,
"description": "Session restore: Time to collect the data of a single window (ms) *** No longer needed (bug 1156565). Delete histogram and accumulation code! ***"
},
"FX_SESSION_RESTORE_COLLECT_COOKIES_MS": {
"alert_emails": ["session-restore-telemetry-alerts@mozilla.com"],
"expires_in_version": "never",
@ -4015,14 +4007,6 @@
"extended_statistics_ok": true,
"description": "Session restore: Time to read the session data from the file on disk (ms)"
},
"FX_SESSION_RESTORE_WRITE_STATE_LONGEST_OP_MS": {
"expires_in_version": "40",
"kind": "exponential",
"high": "3000",
"n_buckets": 10,
"extended_statistics_ok": true,
"description": "Session restore: Time spent on the main thread serializing, broadcasting and sending the session data for writing (ms) *** No longer needed (bug 1156565). Delete histogram and accumulation code! ***"
},
"FX_SESSION_RESTORE_WRITE_FILE_MS": {
"alert_emails": ["session-restore-telemetry-alerts@mozilla.com"],
"expires_in_version": "default",
@ -4032,14 +4016,6 @@
"extended_statistics_ok": true,
"description": "Session restore: Time to write the session data to the file on disk (ms)"
},
"FX_SESSION_RESTORE_WRITE_FILE_LONGEST_OP_MS": {
"expires_in_version": "40",
"kind": "exponential",
"high": "3000",
"n_buckets": 10,
"extended_statistics_ok": true,
"description": "Session restore: Duration of the longest uninterruptible operation while writing session data (ms) *** No longer needed (bug 1156565). Delete histogram and accumulation code! ***"
},
"FX_SESSION_RESTORE_FILE_SIZE_BYTES": {
"alert_emails": ["session-restore-telemetry-alerts@mozilla.com"],
"expires_in_version": "default",
@ -4070,122 +4046,6 @@
"extended_statistics_ok": true,
"description": "Session restore: Time spent blocking the main thread while restoring a window state (ms)"
},
"FX_SESSION_RESTORE_SESSION_LENGTH": {
"expires_in_version": "40",
"kind": "exponential",
"high": "365",
"n_buckets": 15,
"description": "Session restore: Days elapsed since the session was first started *** No longer needed (bug 1156565). Delete histogram and accumulation code! ***"
},
"FX_SESSION_RESTORE_EXTRACTING_STATISTICS_DURATION_MS": {
"expires_in_version": "40",
"kind": "exponential",
"high": "3000",
"n_buckets": 10,
"extended_statistics_ok": true,
"description": "Session restore: Duration of the off main thread statistics extraction mechanism (ms) *** No longer needed (bug 1156565). Delete histogram and accumulation code! ***"
},
"FX_SESSION_RESTORE_TOTAL_OPEN_WINDOWS_SIZE_BYTES": {
"alert_emails": ["session-restore-telemetry-alerts@mozilla.com"],
"expires_in_version": "default",
"kind": "exponential",
"high": "50000000",
"n_buckets": 30,
"description": "Session restore: The subset of sessionrestore.js representing open windows (total size, in bytes)"
},
"FX_SESSION_RESTORE_TOTAL_CLOSED_WINDOWS_SIZE_BYTES": {
"expires_in_version": "40",
"kind": "exponential",
"high": "50000000",
"n_buckets": 30,
"description": "Session restore: The subset of sessionrestore.js representing closed windows (total size, in bytes) *** No longer needed (bug 1156565). Delete histogram and accumulation code! ***"
},
"FX_SESSION_RESTORE_TOTAL_CLOSED_TABS_IN_OPEN_WINDOWS_SIZE_BYTES": {
"expires_in_version": "40",
"kind": "exponential",
"high": "50000000",
"n_buckets": 30,
"description": "Sessionrestore: The subset of sesionstore.js representing closed tabs in open windows (total size, in bytes) *** No longer needed (bug 1156565). Delete histogram and accumulation code! ***"
},
"FX_SESSION_RESTORE_TOTAL_COOKIES_SIZE_BYTES": {
"expires_in_version": "40",
"kind": "exponential",
"high": "50000000",
"n_buckets": 30,
"description": "The subset of sessionstore.js dealing with cookies (total size, in bytes) *** No longer needed (bug 1156565). Delete histogram and accumulation code! ***"
},
"FX_SESSION_RESTORE_TOTAL_DOM_STORAGE_SIZE_BYTES": {
"expires_in_version": "40",
"kind": "exponential",
"high": "50000000",
"n_buckets": 30,
"description": "The subset of sessionstore.js dealing with DOM storage (total size, in bytes) *** No longer needed (bug 1156565). Delete histogram and accumulation code! ***"
},
"FX_SESSION_RESTORE_TOTAL_FORMDATA_SIZE_BYTES": {
"expires_in_version": "40",
"kind": "exponential",
"high": "50000000",
"n_buckets": 30,
"description": "The subset of sessionstore.js dealing with storing form data (total size, in bytes) *** No longer needed (bug 1156565). Delete histogram and accumulation code! ***"
},
"FX_SESSION_RESTORE_TOTAL_HISTORY_SIZE_BYTES": {
"alert_emails": ["session-restore-telemetry-alerts@mozilla.com"],
"expires_in_version": "default",
"kind": "exponential",
"high": "50000000",
"n_buckets": 30,
"description": "The subset of sessionstore.js dealing with storing history (total size, in bytes)"
},
"FX_SESSION_RESTORE_INDIVIDUAL_OPEN_WINDOWS_SIZE_BYTES": {
"expires_in_version": "40",
"kind": "exponential",
"high": "5000000",
"n_buckets": 30,
"description": "Session restore: The subset of sessionrestore.js representing open windows (item size, in bytes) *** No longer needed (bug 1156565). Delete histogram and accumulation code! ***"
},
"FX_SESSION_RESTORE_INDIVIDUAL_CLOSED_WINDOWS_SIZE_BYTES": {
"expires_in_version": "40",
"kind": "exponential",
"high": "5000000",
"n_buckets": 30,
"description": "Session restore: The subset of sessionrestore.js representing closed windows (item size, in bytes) *** No longer needed (bug 1156565). Delete histogram and accumulation code! ***"
},
"FX_SESSION_RESTORE_INDIVIDUAL_CLOSED_TABS_IN_OPEN_WINDOWS_SIZE_BYTES": {
"expires_in_version": "40",
"kind": "exponential",
"high": "5000000",
"n_buckets": 30,
"description": "Sessionrestore: The subset of sesionstore.js representing closed tabs in open windows (item size, in bytes) *** No longer needed (bug 1156565). Delete histogram and accumulation code! ***"
},
"FX_SESSION_RESTORE_INDIVIDUAL_COOKIES_SIZE_BYTES": {
"expires_in_version": "40",
"kind": "exponential",
"high": "50000000",
"n_buckets": 30,
"description": "The subset of sessionstore.js dealing with cookies (item size, in bytes) *** No longer needed (bug 1156565). Delete histogram and accumulation code! ***"
},
"FX_SESSION_RESTORE_INDIVIDUAL_DOM_STORAGE_SIZE_BYTES": {
"alert_emails": ["session-restore-telemetry-alerts@mozilla.com"],
"expires_in_version": "default",
"kind": "exponential",
"high": "5000000",
"n_buckets": 30,
"description": "The subset of sessionstore.js dealing with DOM storage (item size, in bytes)"
},
"FX_SESSION_RESTORE_INDIVIDUAL_FORMDATA_SIZE_BYTES": {
"expires_in_version": "40",
"kind": "exponential",
"high": "5000000",
"n_buckets": 30,
"description": "The subset of sessionstore.js dealing with storing form data (item size, in bytes) *** No longer needed (bug 1156565). Delete histogram and accumulation code! ***"
},
"FX_SESSION_RESTORE_INDIVIDUAL_HISTORY_SIZE_BYTES": {
"expires_in_version": "40",
"kind": "exponential",
"high": "5000000",
"n_buckets": 30,
"description": "The subset of sessionstore.js dealing with storing history (item size, in bytes) *** No longer needed (bug 1156565). Delete histogram and accumulation code! ***"
},
"INNERWINDOWS_WITH_MUTATION_LISTENERS": {
"expires_in_version": "never",
"kind": "boolean",