summaryrefslogtreecommitdiffstats
path: root/browser/components/pocket/content/pktTelemetry.sys.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/pocket/content/pktTelemetry.sys.mjs')
-rw-r--r--browser/components/pocket/content/pktTelemetry.sys.mjs74
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();
+ },
+};