Backed out changeset 68d101b370d8 (bug 1938430) for permafailures on browser_tab_manager_groups.js (Bug 1938697).

This commit is contained in:
Cosmin Sabou
2025-03-27 00:21:30 +02:00
parent 2a6e708bb1
commit ced1f3c105
8 changed files with 7 additions and 299 deletions

View File

@@ -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;

View File

@@ -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,
};

View File

@@ -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,
},
})
);

View File

@@ -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);

View File

@@ -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: >

View File

@@ -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",
]

View File

@@ -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<MozPanel>}
* 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<PanelView>}
*/
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<void>}
*/
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<XULMenuElement|XULPopupElement>}
*/
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<void>}
*/
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<MozTabbrowserTabGroup>}
*/
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();
});

View File

@@ -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.