forked from mirrors/gecko-dev
In an effort to understand if data collected via the Geckoview Streaming API differs materially from that collected in Glean, we will implement some temporary data collections that cover the existing use cases of the former. Differential Revision: https://phabricator.services.mozilla.com/D191119
76 lines
2.4 KiB
JavaScript
76 lines
2.4 KiB
JavaScript
/* -*- mode: js; indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
|
/* 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/. */
|
|
|
|
export var BrowserTelemetryUtils = {
|
|
recordSiteOriginTelemetry(aWindows, aIsGeckoView) {
|
|
Services.tm.idleDispatchToMainThread(() => {
|
|
this._recordSiteOriginTelemetry(aWindows, aIsGeckoView);
|
|
});
|
|
},
|
|
|
|
computeSiteOriginCount(aWindows, aIsGeckoView) {
|
|
// Geckoview and Desktop work differently. On desktop, aBrowser objects
|
|
// holds an array of tabs which we can use to get the <browser> objects.
|
|
// In Geckoview, it is apps' responsibility to keep track of the tabs, so
|
|
// there isn't an easy way for us to get the tabs.
|
|
let tabs = [];
|
|
if (aIsGeckoView) {
|
|
// To get all active windows; Each tab has its own window
|
|
tabs = aWindows;
|
|
} else {
|
|
for (const win of aWindows) {
|
|
tabs = tabs.concat(win.gBrowser.tabs);
|
|
}
|
|
}
|
|
|
|
let topLevelBCs = [];
|
|
|
|
for (const tab of tabs) {
|
|
let browser;
|
|
if (aIsGeckoView) {
|
|
browser = tab.browser;
|
|
} else {
|
|
browser = tab.linkedBrowser;
|
|
}
|
|
|
|
if (browser.browsingContext) {
|
|
// This is the top level browsingContext
|
|
topLevelBCs.push(browser.browsingContext);
|
|
}
|
|
}
|
|
|
|
return CanonicalBrowsingContext.countSiteOrigins(topLevelBCs);
|
|
},
|
|
|
|
_recordSiteOriginTelemetry(aWindows, aIsGeckoView) {
|
|
let currentTime = Date.now();
|
|
|
|
// default is 5 minutes
|
|
if (!this.min_interval) {
|
|
this.min_interval = Services.prefs.getIntPref(
|
|
"telemetry.number_of_site_origin.min_interval",
|
|
300000
|
|
);
|
|
}
|
|
|
|
let originCount = this.computeSiteOriginCount(aWindows, aIsGeckoView);
|
|
let histogram = Services.telemetry.getHistogramById(
|
|
"FX_NUMBER_OF_UNIQUE_SITE_ORIGINS_ALL_TABS"
|
|
);
|
|
|
|
// Discard the first load because most of the time the first load only has 1
|
|
// tab and 1 window open, so it is useless to report it.
|
|
if (!this._lastRecordSiteOrigin) {
|
|
this._lastRecordSiteOrigin = currentTime;
|
|
} else if (currentTime >= this._lastRecordSiteOrigin + this.min_interval) {
|
|
this._lastRecordSiteOrigin = currentTime;
|
|
|
|
histogram.add(originCount);
|
|
Glean.fogValidation.gvsvNumberOfUniqueSiteOriginsAllTabs.accumulateSamples(
|
|
[originCount]
|
|
);
|
|
}
|
|
},
|
|
};
|