diff --git a/browser/base/content/browser-sync.js b/browser/base/content/browser-sync.js index 8bd7e0e21d2d..b9fd526aa4b5 100644 --- a/browser/base/content/browser-sync.js +++ b/browser/base/content/browser-sync.js @@ -255,8 +255,8 @@ this.SyncedTabsPanelList = class SyncedTabsPanelList { if (hasNextPage) { client.tabs = client.tabs.slice(0, maxTabs); } - for (let tab of client.tabs) { - let tabEnt = this._createSyncedTabElement(tab); + for (let [index, tab] of client.tabs.entries()) { + let tabEnt = this._createSyncedTabElement(tab, index); container.appendChild(tabEnt); } if (hasNextPage) { @@ -266,7 +266,7 @@ this.SyncedTabsPanelList = class SyncedTabsPanelList { } } - _createSyncedTabElement(tabInfo) { + _createSyncedTabElement(tabInfo, index) { let item = document.createXULElement("toolbarbutton"); let tooltipText = (tabInfo.title ? tabInfo.title + "\n" : "") + tabInfo.url; item.setAttribute("itemtype", "tab"); @@ -283,6 +283,15 @@ this.SyncedTabsPanelList = class SyncedTabsPanelList { // We need to use "click" instead of "command" here so openUILink // respects different buttons (eg, to open in a new tab). item.addEventListener("click", e => { + // We want to differentiate between when the fxa panel is within the app menu/hamburger bar + let object = "fxa_avatar_menu"; + const appMenuPanel = document.getElementById("appMenu-popup"); + if (appMenuPanel.contains(e.currentTarget)) { + object = "fxa_app_menu"; + } + SyncedTabs.recordSyncedTabsTelemetry(object, "click", { + tab_pos: index.toString(), + }); document.defaultView.openUILink(tabInfo.url, e, { triggeringPrincipal: Services.scriptSecurityManager.createNullPrincipal( {} diff --git a/browser/components/syncedtabs/SyncedTabsListStore.js b/browser/components/syncedtabs/SyncedTabsListStore.js index 68cac8da0152..a1f157dcddab 100644 --- a/browser/components/syncedtabs/SyncedTabsListStore.js +++ b/browser/components/syncedtabs/SyncedTabsListStore.js @@ -180,6 +180,16 @@ Object.assign(SyncedTabsListStore.prototype, EventEmitter.prototype, { this._selectedRow = [parentRow, childRow]; this.inputFocused = false; this._change("all"); + // Record the telemetry event + let extraOptions = { + tab_pos: this._selectedRow[1].toString(), + filter: this.filter, + }; + this._SyncedTabs.recordSyncedTabsTelemetry( + "synced_tabs_sidebar", + "click", + extraOptions + ); }, _tabCount() { diff --git a/services/sync/modules/SyncedTabs.jsm b/services/sync/modules/SyncedTabs.jsm index 5725b60f1833..aec6bb3699f7 100644 --- a/services/sync/modules/SyncedTabs.jsm +++ b/services/sync/modules/SyncedTabs.jsm @@ -273,4 +273,15 @@ var SyncedTabs = { return b.tabs[0].lastUsed - a.tabs[0].lastUsed; }); }, + + recordSyncedTabsTelemetry(object, tabEvent, extraOptions) { + Services.telemetry.setEventRecordingEnabled("synced_tabs", true); + Services.telemetry.recordEvent( + "synced_tabs", + tabEvent, + object, + null, + extraOptions + ); + }, }; diff --git a/toolkit/components/telemetry/Events.yaml b/toolkit/components/telemetry/Events.yaml index cb2242ef8bc7..02e42b8a3e6f 100644 --- a/toolkit/components/telemetry/Events.yaml +++ b/toolkit/components/telemetry/Events.yaml @@ -3160,3 +3160,23 @@ privacy_segmentation: - rtestard@mozilla.com expiry_version: "106" products: ["firefox"] + +synced_tabs: + click: + objects: [ + "fxa_avatar_menu", + "fxa_app_menu", + "synced_tabs_sidebar", + ] + methods: ["click"] + release_channel_collection: opt-out + products: + - "firefox" + record_in_processes: ["main"] + description: Record how users access and use synced tabs component + bug_numbers: [1756252] + notification_emails: ["sync-dev@mozilla.org"] + expiry_version: "never" + extra_keys: + tab_pos: position of the tab clicked + filter: was there a filter enabled