Backed out changeset 68d101b370d8 (bug 1938430) for permafailures on browser_tab_manager_groups.js (Bug 1938697).
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
@@ -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,
|
||||
},
|
||||
})
|
||||
);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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: >
|
||||
|
||||
@@ -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",
|
||||
]
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user