diff options
Diffstat (limited to 'browser/components/pocket/content/pktTelemetry.sys.mjs')
-rw-r--r-- | browser/components/pocket/content/pktTelemetry.sys.mjs | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/browser/components/pocket/content/pktTelemetry.sys.mjs b/browser/components/pocket/content/pktTelemetry.sys.mjs new file mode 100644 index 0000000000..1591e828a2 --- /dev/null +++ b/browser/components/pocket/content/pktTelemetry.sys.mjs @@ -0,0 +1,74 @@ +/* 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/. */ + +const lazy = {}; +ChromeUtils.defineESModuleGetters(lazy, { + TelemetryEnvironment: "resource://gre/modules/TelemetryEnvironment.sys.mjs", + pktApi: "chrome://pocket/content/pktApi.sys.mjs", +}); + +const PREF_IMPRESSION_ID = "browser.newtabpage.activity-stream.impressionId"; + +export var pktTelemetry = { + get impressionId() { + if (!this._impressionId) { + this._impressionId = this.getOrCreateImpressionId(); + } + return this._impressionId; + }, + + // Sets or gets the impression id that's use for Pocket impressions. + // The impression id cannot be tied to a client id. + // This is the same impression id used in newtab pocket impressions. + getOrCreateImpressionId() { + let impressionId = Services.prefs.getStringPref(PREF_IMPRESSION_ID, ""); + + if (!impressionId) { + impressionId = String(Services.uuid.generateUUID()); + Services.prefs.setStringPref(PREF_IMPRESSION_ID, impressionId); + } + return impressionId; + }, + + _profileCreationDate() { + return ( + lazy.TelemetryEnvironment.currentEnvironment.profile.resetDate || + lazy.TelemetryEnvironment.currentEnvironment.profile.creationDate + ); + }, + + /** + * Records the provided data and common pocket-button data to Glean, + * then submits it all in a pocket-button ping. + * + * @param eventAction - A string like "click" + * @param eventSource - A string like "save_button" + * @param eventPosition - (optional) A 0-based index. + * If falsey and not 0, is coalesced to undefined. + * @param model - (optional) An identifier for the machine learning model + * used to generate the recommendations like "vec-bestarticle" + */ + submitPocketButtonPing( + eventAction, + eventSource, + eventPosition = undefined, + model = undefined + ) { + eventPosition = eventPosition || eventPosition === 0 ? 0 : undefined; + Glean.pocketButton.impressionId.set(this.impressionId); + Glean.pocketButton.pocketLoggedInStatus.set(lazy.pktApi.isUserLoggedIn()); + Glean.pocketButton.profileCreationDate.set(this._profileCreationDate()); + + Glean.pocketButton.eventAction.set(eventAction); + Glean.pocketButton.eventSource.set(eventSource); + if (eventPosition !== undefined) { + Glean.pocketButton.eventPosition.set(eventPosition); + } + if (model !== undefined) { + Glean.pocketButton.model.set(model); + } + + GleanPings.pocketButton.submit(); + }, +}; |