diff --git a/browser/base/content/main-popupset.js b/browser/base/content/main-popupset.js index 22449793cf1f..b9f3e4118fa8 100644 --- a/browser/base/content/main-popupset.js +++ b/browser/base/content/main-popupset.js @@ -8,12 +8,6 @@ document.addEventListener( "DOMContentLoaded", () => { - const lazy = {}; - ChromeUtils.defineESModuleGetters(lazy, { - TabGroupMetrics: - "moz-src:///browser/components/tabbrowser/TabGroupMetrics.sys.mjs", - }); - let mainPopupSet = document.getElementById("mainPopupSet"); // eslint-disable-next-line complexity mainPopupSet.addEventListener("command", event => { @@ -136,11 +130,7 @@ document.addEventListener( let tabGroup = gBrowser.getTabGroupById(tabGroupId); // Tabs need to be removed by their owning `Tabbrowser` or else // there are errors. - tabGroup.ownerGlobal.gBrowser.removeTabGroup(tabGroup, { - isUserTriggered: true, - telemetrySource: - lazy.TabGroupMetrics.METRIC_SOURCE.TAB_OVERFLOW_MENU, - }); + tabGroup.ownerGlobal.gBrowser.removeTabGroup(tabGroup); } break; diff --git a/browser/components/tabbrowser/TabGroupMetrics.sys.mjs b/browser/components/tabbrowser/TabGroupMetrics.sys.mjs deleted file mode 100644 index a07c2fdaab28..000000000000 --- a/browser/components/tabbrowser/TabGroupMetrics.sys.mjs +++ /dev/null @@ -1,18 +0,0 @@ -/* 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/. */ - -/** - * A common list of systems, surfaces, controls, etc. from which user - * interactions with tab groups could originate. These "source" values - * should be sent as extra data with tab group-related metrics events. - */ -const METRIC_SOURCE = Object.freeze({ - TAB_OVERFLOW_MENU: "tab_overflow", - TAB_GROUP_MENU: "tab_group", - UNKNOWN: "unknown", -}); - -export const TabGroupMetrics = { - METRIC_SOURCE, -}; diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js index 515dce3cd2dc..a0689b555b2c 100644 --- a/browser/components/tabbrowser/content/tabbrowser.js +++ b/browser/components/tabbrowser/content/tabbrowser.js @@ -110,8 +110,6 @@ PictureInPicture: "resource://gre/modules/PictureInPicture.sys.mjs", SmartTabGroupingManager: "moz-src:///browser/components/tabbrowser/SmartTabGrouping.sys.mjs", - TabGroupMetrics: - "moz-src:///browser/components/tabbrowser/TabGroupMetrics.sys.mjs", UrlbarProviderOpenTabs: "resource:///modules/UrlbarProviderOpenTabs.sys.mjs", }); @@ -2967,9 +2965,7 @@ * switches windows). * Causes the group create UI to be displayed and telemetry events to be fired. * @param {string} [options.telemetryUserCreateSource] - * The means by which the tab group was created. - * @see TabGroupMetrics.METRIC_SOURCE for possible values. - * Defaults to "unknown". + * The means by which the tab group was created. Defaults to "unknown". */ addTabGroup( tabs, @@ -3028,23 +3024,8 @@ * The tab group to remove. * @param {object} [options] * Options to use when removing tabs. @see removeTabs for more info. - * @param {boolean} [options.isUserTriggered=false] - * Should be true if this group is being removed by an explicit - * request from the user (as opposed to a group being removed - * for technical reasons, such as when an already existing group - * switches windows). This causes telemetry events to fire. - * @param {string} [options.telemetrySource="unknown"] - * The means by which the tab group was removed. - * @see TabGroupMetrics.METRIC_SOURCE for possible values. - * Defaults to "unknown". */ - async removeTabGroup( - group, - options = { - isUserTriggered: false, - telemetrySource: this.TabGroupMetrics.METRIC_SOURCE.UNKNOWN, - } - ) { + async removeTabGroup(group, options = {}) { if (this.tabGroupMenu.panel.state != "closed") { this.tabGroupMenu.panel.hidePopup(options.animate); } @@ -3078,8 +3059,6 @@ bubbles: true, detail: { skipSessionStore: options.skipSessionStore, - isUserTriggered: options.isUserTriggered, - telemetrySource: options.telemetrySource, }, }) ); diff --git a/browser/components/tabbrowser/content/tabgroup-menu.js b/browser/components/tabbrowser/content/tabgroup-menu.js index 0835e347ce01..9ffcf54affda 100644 --- a/browser/components/tabbrowser/content/tabgroup-menu.js +++ b/browser/components/tabbrowser/content/tabgroup-menu.js @@ -18,10 +18,6 @@ } ); - const { TabGroupMetrics } = ChromeUtils.importESModule( - "moz-src:///browser/components/tabbrowser/TabGroupMetrics.sys.mjs" - ); - class MozTabbrowserTabGroupMenu extends MozXULElement { static COLORS = [ "blue", @@ -445,10 +441,7 @@ document .getElementById("tabGroupEditor_deleteGroup") .addEventListener("command", () => { - gBrowser.removeTabGroup(this.activeGroup, { - isUserTriggered: true, - telemetrySource: TabGroupMetrics.METRIC_SOURCE.TAB_GROUP_MENU, - }); + gBrowser.removeTabGroup(this.activeGroup); }); this.panel.addEventListener("popupshown", this); diff --git a/browser/components/tabbrowser/metrics.yaml b/browser/components/tabbrowser/metrics.yaml index e46e70df0c7b..e73dbf383be9 100644 --- a/browser/components/tabbrowser/metrics.yaml +++ b/browser/components/tabbrowser/metrics.yaml @@ -151,29 +151,6 @@ tabgroup: type: string expires: never - delete: - type: event - description: > - Recorded when the user deletes a tab group - notification_emails: - - dao@mozilla.com - - jswinarton@mozilla.com - - sthompson@mozilla.com - bugs: - - https://bugzil.la/1938430 - data_reviews: - - https://bugzil.la/1938430 - data_sensitivity: - - interaction - extra_keys: - source: - description: The system, surface, or control the user used to delete the tab group - type: string - id: - description: Tab group ID of the tab group being deleted. Tab group IDs are derived from their creation timestamps and have no other relationship to any tab group metadata. - type: string - expires: never - active_groups: type: labeled_quantity description: > diff --git a/browser/components/tabbrowser/moz.build b/browser/components/tabbrowser/moz.build index ff81a8eb7a4a..7a84ed8be976 100644 --- a/browser/components/tabbrowser/moz.build +++ b/browser/components/tabbrowser/moz.build @@ -13,7 +13,6 @@ MOZ_SRC_FILES += [ "NewTabPagePreloading.sys.mjs", "OpenInTabsUtils.sys.mjs", "SmartTabGrouping.sys.mjs", - "TabGroupMetrics.sys.mjs", "TabsList.sys.mjs", "TabUnloader.sys.mjs", ] diff --git a/browser/components/tabbrowser/test/browser/tabs/browser_tab_groups_telemetry.js b/browser/components/tabbrowser/test/browser/tabs/browser_tab_groups_telemetry.js index d77a47a7b76a..76e8196721eb 100644 --- a/browser/components/tabbrowser/test/browser/tabs/browser_tab_groups_telemetry.js +++ b/browser/components/tabbrowser/test/browser/tabs/browser_tab_groups_telemetry.js @@ -2,17 +2,11 @@ * 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 { TabStateFlusher } = ChromeUtils.importESModule( - "resource:///modules/sessionstore/TabStateFlusher.sys.mjs" -); - let resetTelemetry = async () => { await Services.fog.testFlushAllChildren(); Services.fog.testResetFOG(); }; -window.gTabsPanel.init(); - add_task(async function test_tabGroupTelemetry() { await resetTelemetry(); @@ -202,188 +196,3 @@ add_task(async function test_tabGroupTelemetry() { await removeTabGroup(group1); await removeTabGroup(group2); }); - -/** - * @param {MozTabbrowserTabGroup} tabGroup - * @returns {Promise} - * Panel holding the tab group context menu for the requested tab group. - */ -async function openTabGroupContextMenu(tabGroup) { - let tabgroupEditor = document.getElementById("tab-group-editor"); - let tabgroupPanel = tabgroupEditor.panel; - - let panelShown = BrowserTestUtils.waitForPopupEvent(tabgroupPanel, "shown"); - EventUtils.synthesizeMouseAtCenter( - tabGroup.querySelector(".tab-group-label"), - { type: "contextmenu", button: 2 }, - window - ); - await panelShown; - - return tabgroupPanel; -} - -add_task(async function test_tabGroupContextMenu_deleteTabGroup() { - await resetTelemetry(); - - let tab = BrowserTestUtils.addTab(gBrowser, "https://example.com"); - await BrowserTestUtils.browserLoaded(tab.linkedBrowser); - - let group = gBrowser.addTabGroup([tab]); - // Close the automatically-opened "create tab group" menu. - gBrowser.tabGroupMenu.close(); - let groupId = group.id; - - let menu = await openTabGroupContextMenu(group); - let deleteTabGroupButton = menu.querySelector("#tabGroupEditor_deleteGroup"); - deleteTabGroupButton.click(); - - await TestUtils.waitForCondition( - () => !gBrowser.tabGroups.includes(group), - "wait for group to be deleted" - ); - - let tabGroupDeleteEvents = Glean.tabgroup.delete.testGetValue(); - Assert.equal( - tabGroupDeleteEvents.length, - 1, - "should have recorded a tabgroup.delete event" - ); - - let [tabGroupDeleteEvent] = tabGroupDeleteEvents; - Assert.deepEqual( - tabGroupDeleteEvent.extra, - { - source: "tab_group", - id: groupId, - }, - "should have recorded the correct source and ID" - ); - - await resetTelemetry(); -}); - -/** - * @returns {Promise} - */ -async function openTabsMenu() { - let viewShown = BrowserTestUtils.waitForEvent( - window.document.getElementById("allTabsMenu-allTabsView"), - "ViewShown" - ); - window.document.getElementById("alltabs-button").click(); - return (await viewShown).target; -} - -/** - * @returns {Promise} - */ -async function closeTabsMenu() { - let panel = window.document - .getElementById("allTabsMenu-allTabsView") - .closest("panel"); - if (!panel) { - return; - } - let hidden = BrowserTestUtils.waitForPopupEvent(panel, "hidden"); - panel.hidePopup(); - await hidden; -} - -/** - * @param {XULToolbarButton} triggerNode - * @param {string} contextMenuId - * @returns {Promise} - */ -async function getContextMenu(triggerNode, contextMenuId) { - let win = triggerNode.ownerGlobal; - triggerNode.scrollIntoView(); - const contextMenu = win.document.getElementById(contextMenuId); - const contextMenuShown = BrowserTestUtils.waitForPopupEvent( - contextMenu, - "shown" - ); - - EventUtils.synthesizeMouseAtCenter( - triggerNode, - { type: "contextmenu", button: 2 }, - win - ); - await contextMenuShown; - return contextMenu; -} - -/** - * @param {XULMenuElement|XULPopupElement} contextMenu - * @returns {Promise} - */ -async function closeContextMenu(contextMenu) { - let menuHidden = BrowserTestUtils.waitForPopupEvent(contextMenu, "hidden"); - contextMenu.hidePopup(); - await menuHidden; -} - -/** - * Returns a new basic, unnamed tab group that is fully loaded in the browser - * and in session state. - * - * @returns {Promise} - */ -async function makeTabGroup() { - let tab = BrowserTestUtils.addTab(gBrowser, "https://example.com"); - await BrowserTestUtils.browserLoaded(tab.linkedBrowser); - await TabStateFlusher.flush(tab.linkedBrowser); - - let group = gBrowser.addTabGroup([tab]); - // Close the automatically-opened "create tab group" menu. - gBrowser.tabGroupMenu.close(); - return group; -} - -add_task(async function test_tabOverflowContextMenu_deleteOpenTabGroup() { - await resetTelemetry(); - - info("set up an open tab group to be deleted"); - let openGroup = await makeTabGroup(); - let openGroupId = openGroup.id; - - info("delete the open tab group"); - let allTabsMenu = await openTabsMenu(); - let tabGroupButton = allTabsMenu.querySelector( - `#allTabsMenu-groupsView [data-tab-group-id="${openGroupId}"]` - ); - - let menu = await getContextMenu( - tabGroupButton, - "open-tab-group-context-menu" - ); - - menu.querySelector("#open-tab-group-context-menu_delete").click(); - await closeContextMenu(menu); - await closeTabsMenu(); - - await TestUtils.waitForCondition( - () => !gBrowser.tabGroups.includes(openGroup), - "wait for group to be deleted" - ); - - let tabGroupDeleteEvents = Glean.tabgroup.delete.testGetValue(); - Assert.equal( - tabGroupDeleteEvents.length, - 1, - "should have recorded one tabgroup.delete event" - ); - - let [openTabGroupDeleteEvent] = tabGroupDeleteEvents; - - Assert.deepEqual( - openTabGroupDeleteEvent.extra, - { - source: "tab_overflow", - id: openGroupId, - }, - "should have recorded the correct source and ID for the open tab group" - ); - - await resetTelemetry(); -}); diff --git a/browser/modules/BrowserUsageTelemetry.sys.mjs b/browser/modules/BrowserUsageTelemetry.sys.mjs index 6fd4ecbce8f7..64207a122e72 100644 --- a/browser/modules/BrowserUsageTelemetry.sys.mjs +++ b/browser/modules/BrowserUsageTelemetry.sys.mjs @@ -18,8 +18,7 @@ ChromeUtils.defineESModuleGetters(lazy, { "moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs", SearchSERPTelemetryUtils: "moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs", - TabGroupMetrics: - "moz-src:///browser/components/tabbrowser/TabGroupMetrics.sys.mjs", + WindowsInstallsInfo: "resource://gre/modules/components-utils/WindowsInstallsInfo.sys.mjs", @@ -598,9 +597,6 @@ export let BrowserUsageTelemetry = { case "TabGroupExpand": this._onTabGroupExpandOrCollapse(); break; - case "TabGroupRemoveRequested": - this._onTabGroupRemoveRequested(event); - break; case "unload": this._unregisterWindow(event.target); break; @@ -1148,7 +1144,7 @@ export let BrowserUsageTelemetry = { win.addEventListener("TabOpen", this, true); win.addEventListener("TabPinned", this, true); win.addEventListener("TabGroupCreate", this); - win.addEventListener("TabGroupRemoveRequested", this); + win.addEventListener("TabGroupRemoved", this); win.addEventListener("TabGrouped", this); win.addEventListener("TabUngrouped", this); win.addEventListener("TabGroupCollapse", this); @@ -1166,7 +1162,7 @@ export let BrowserUsageTelemetry = { win.removeEventListener("TabOpen", this, true); win.removeEventListener("TabPinned", this, true); win.removeEventListener("TabGroupCreate", this); - win.removeEventListener("TabGroupRemoveRequested", this); + win.removeEventListener("TabGroupRemoved", this); win.removeEventListener("TabGrouped", this); win.removeEventListener("TabUngrouped", this); win.removeEventListener("TabGroupCollapse", this); @@ -1306,23 +1302,6 @@ export let BrowserUsageTelemetry = { Glean.tabgroup.activeGroups.expanded.set(expanded); }, - /** - * @param {CustomEvent} event - */ - _onTabGroupRemoveRequested(event) { - let { - isUserTriggered = false, - telemetrySource = lazy.TabGroupMetrics.METRIC_SOURCE.UNKNOWN, - } = event.detail; - - if (isUserTriggered) { - Glean.tabgroup.delete.record({ - id: event.target.id, - source: telemetrySource, - }); - } - }, - /** * Tracks the window count and registers the listeners for the tab count. * @param{Object} win The window object.