Backed out changeset 37ef0aa2d2b5 (bug 1857298) for causing bc failures on browser_recentlyclosed_firefoxview.js.

This commit is contained in:
Iulian Moraru 2024-02-20 18:06:25 +02:00
parent 08b0885295
commit 08629b9d2c
15 changed files with 148 additions and 426 deletions

View File

@ -108,6 +108,14 @@ fxview-category-button[name="history"]::part(icon) {
background-image: url("chrome://browser/content/firefoxview/category-history.svg");
}
fxview-tab-list.with-dismiss-button::part(secondary-button) {
background-image: url("chrome://global/skin/icons/close.svg");
}
fxview-tab-list.with-context-menu::part(secondary-button) {
background-image: url("chrome://global/skin/icons/more.svg");
}
.sticky-container {
position: sticky;
top: 0;

View File

@ -47,8 +47,6 @@ if (!window.IS_STORYBOOK) {
* @property {number} maxTabsLength - The max number of tabs for the list
* @property {Array} tabItems - Items to show in the tab list
* @property {string} searchQuery - The query string to highlight, if provided.
* @property {string} secondaryActionClass - The class used to style the secondary action element
* @property {string} tertiaryActionClass - The class used to style the tertiary action element
*/
export default class FxviewTabList extends MozLitElement {
constructor() {
@ -76,8 +74,6 @@ export default class FxviewTabList extends MozLitElement {
tabItems: { type: Array },
updatesPaused: { type: Boolean },
searchQuery: { type: String },
secondaryActionClass: { type: String },
tertiaryActionClass: { type: String },
};
static queries = {
@ -171,38 +167,6 @@ export default class FxviewTabList extends MozLitElement {
);
}
navigateRight(fxviewTabRow) {
if (
(fxviewTabRow.soundPlaying || fxviewTabRow.muted) &&
this.currentActiveElementId === "fxview-tab-row-main"
) {
this.currentActiveElementId = fxviewTabRow.focusMediaButton();
} else if (
this.currentActiveElementId === "fxview-tab-row-media-button" ||
this.currentActiveElementId === "fxview-tab-row-main"
) {
this.currentActiveElementId = fxviewTabRow.focusSecondaryButton();
} else if (
fxviewTabRow.tertiaryButtonEl &&
this.currentActiveElementId === "fxview-tab-row-secondary-button"
) {
this.currentActiveElementId = fxviewTabRow.focusTertiaryButton();
}
}
navigateLeft(fxviewTabRow) {
if (this.currentActiveElementId === "fxview-tab-row-tertiary-button") {
this.currentActiveElementId = fxviewTabRow.focusSecondaryButton();
} else if (
(fxviewTabRow.soundPlaying || fxviewTabRow.muted) &&
this.currentActiveElementId === "fxview-tab-row-secondary-button"
) {
this.currentActiveElementId = fxviewTabRow.focusMediaButton();
} else {
this.currentActiveElementId = fxviewTabRow.focusLink();
}
}
/**
* Focuses the expected element (either the link or button) within fxview-tab-row
* The currently focused/active element ID within a row is stored in this.currentActiveElementId
@ -222,18 +186,42 @@ export default class FxviewTabList extends MozLitElement {
// set this.currentActiveElementId to that element's ID
e.preventDefault();
if (document.dir == "rtl") {
this.navigateLeft(fxviewTabRow);
if (
(fxviewTabRow.soundPlaying || fxviewTabRow.muted) &&
this.currentActiveElementId === "fxview-tab-row-secondary-button"
) {
this.currentActiveElementId = fxviewTabRow.focusMediaButton();
} else {
this.currentActiveElementId = fxviewTabRow.focusLink();
}
} else if (
(fxviewTabRow.soundPlaying || fxviewTabRow.muted) &&
this.currentActiveElementId === "fxview-tab-row-main"
) {
this.currentActiveElementId = fxviewTabRow.focusMediaButton();
} else {
this.navigateRight(fxviewTabRow);
this.currentActiveElementId = fxviewTabRow.focusButton();
}
} else if (e.code == "ArrowLeft") {
// Focus either the link or the button in the current row and
// set this.currentActiveElementId to that element's ID
e.preventDefault();
if (document.dir == "rtl") {
this.navigateRight(fxviewTabRow);
if (
(fxviewTabRow.soundPlaying || fxviewTabRow.muted) &&
this.currentActiveElementId === "fxview-tab-row-main"
) {
this.currentActiveElementId = fxviewTabRow.focusMediaButton();
} else {
this.currentActiveElementId = fxviewTabRow.focusButton();
}
} else if (
(fxviewTabRow.soundPlaying || fxviewTabRow.muted) &&
this.currentActiveElementId === "fxview-tab-row-secondary-button"
) {
this.currentActiveElementId = fxviewTabRow.focusMediaButton();
} else {
this.navigateLeft(fxviewTabRow);
this.currentActiveElementId = fxviewTabRow.focusLink();
}
}
}
@ -313,10 +301,6 @@ export default class FxviewTabList extends MozLitElement {
role="listitem"
.secondaryL10nId=${tabItem.secondaryL10nId}
.secondaryL10nArgs=${ifDefined(tabItem.secondaryL10nArgs)}
.tertiaryL10nId=${ifDefined(tabItem.tertiaryL10nId)}
.tertiaryL10nArgs=${ifDefined(tabItem.tertiaryL10nArgs)}
.secondaryActionClass=${this.secondaryActionClass}
.tertiaryActionClass=${ifDefined(this.tertiaryActionClass)}
.attention=${ifDefined(tabItem.attention)}
.soundPlaying=${ifDefined(tabItem.soundPlaying)}
.sourceClosedId=${ifDefined(tabItem.sourceClosedId)}
@ -389,7 +373,7 @@ customElements.define("fxview-tab-list", FxviewTabList);
* @property {object} containerObj - Info about an open tab's container if within one
* @property {string} currentActiveElementId - ID of currently focused element within each tab item
* @property {string} dateTimeFormat - Expected format for date and/or time
* @property {string} hasPopup - The aria-haspopup attribute for the secondary or tertiary action, if required
* @property {string} hasPopup - The aria-haspopup attribute for the secondary action, if required
* @property {boolean} isBookmark - Whether an open tab is bookmarked
* @property {number} closedId - The tab ID for when the tab item was closed.
* @property {number} sourceClosedId - The closedId of the closed window its from if applicable
@ -401,10 +385,6 @@ customElements.define("fxview-tab-list", FxviewTabList);
* @property {string} primaryL10nArgs - The l10n args used for the primary action element
* @property {string} secondaryL10nId - The l10n id used for the secondary action button
* @property {string} secondaryL10nArgs - The l10n args used for the secondary action element
* @property {string} secondaryActionClass - The class used to style the secondary action element
* @property {string} tertiaryL10nId - The l10n id used for the tertiary action button
* @property {string} tertiaryL10nArgs - The l10n args used for the tertiary action element
* @property {string} tertiaryActionClass - The class used to style the tertiary action element
* @property {boolean} attention - Whether to show a notification dot
* @property {boolean} soundPlaying - Whether an open tab has soundPlaying
* @property {object} tabElement - The MozTabbrowserTab element for the tab item.
@ -437,10 +417,6 @@ export class FxviewTabRow extends MozLitElement {
primaryL10nArgs: { type: String },
secondaryL10nId: { type: String },
secondaryL10nArgs: { type: String },
secondaryActionClass: { type: String },
tertiaryL10nId: { type: String },
tertiaryL10nArgs: { type: String },
tertiaryActionClass: { type: String },
soundPlaying: { type: Boolean },
closedId: { type: Number },
sourceClosedId: { type: Number },
@ -457,8 +433,7 @@ export class FxviewTabRow extends MozLitElement {
static queries = {
mainEl: ".fxview-tab-row-main",
secondaryButtonEl: "#fxview-tab-row-secondary-button",
tertiaryButtonEl: "#fxview-tab-row-tertiary-button",
buttonEl: "#fxview-tab-row-secondary-button:not([hidden])",
mediaButtonEl: "#fxview-tab-row-media-button",
};
@ -474,14 +449,9 @@ export class FxviewTabRow extends MozLitElement {
this.currentFocusable.focus();
}
focusSecondaryButton() {
this.secondaryButtonEl.focus();
return this.secondaryButtonEl.id;
}
focusTertiaryButton() {
this.tertiaryButtonEl.focus();
return this.tertiaryButtonEl.id;
focusButton() {
this.buttonEl.focus();
return this.buttonEl.id;
}
focusMediaButton() {
@ -607,23 +577,6 @@ export class FxviewTabRow extends MozLitElement {
}
}
tertiaryActionHandler(event) {
if (
(event.type == "click" && event.detail && !event.altKey) ||
// detail=0 is from keyboard
(event.type == "click" && !event.detail)
) {
event.preventDefault();
this.dispatchEvent(
new CustomEvent("fxview-tab-list-tertiary-action", {
bubbles: true,
composed: true,
detail: { originalEvent: event, item: this },
})
);
}
}
muteOrUnmuteTab() {
this.tabElement.toggleMuteAudio();
this.muted = !this.muted;
@ -645,7 +598,6 @@ export class FxviewTabRow extends MozLitElement {
const timeString = this.timeFluentId(this.dateTimeFormat);
const time = this.time;
const timeArgs = JSON.stringify({ time });
return html`
${when(
this.containerObj,
@ -774,14 +726,9 @@ export class FxviewTabRow extends MozLitElement {
${when(
this.secondaryL10nId && this.secondaryActionHandler,
() => html`<button
class=${classMap({
"fxview-tab-row-button": true,
"ghost-button": true,
"icon-button": true,
"semi-transparent": true,
[this.secondaryActionClass]: this.secondaryActionClass,
})}
class="fxview-tab-row-button ghost-button icon-button semi-transparent"
id="fxview-tab-row-secondary-button"
part="secondary-button"
data-l10n-id=${this.secondaryL10nId}
data-l10n-args=${ifDefined(this.secondaryL10nArgs)}
aria-haspopup=${ifDefined(this.hasPopup)}
@ -792,27 +739,6 @@ export class FxviewTabRow extends MozLitElement {
: "-1"}"
></button>`
)}
${when(
this.tertiaryL10nId && this.tertiaryActionHandler,
() => html`<button
class=${classMap({
"fxview-tab-row-button": true,
"ghost-button": true,
"icon-button": true,
"semi-transparent": true,
[this.tertiaryActionClass]: this.tertiaryActionClass,
})}
id="fxview-tab-row-tertiary-button"
data-l10n-id=${this.tertiaryL10nId}
data-l10n-args=${ifDefined(this.tertiaryL10nArgs)}
aria-haspopup=${ifDefined(this.hasPopup)}
@click=${this.tertiaryActionHandler}
tabindex="${this.active &&
this.currentActiveElementId === "fxview-tab-row-tertiary-button"
? "0"
: "-1"}"
></button>`
)}
`;
}

View File

@ -179,14 +179,6 @@
&[soundplaying="true"] {
background-image: url("chrome://global/skin/media/audio.svg");
}
&.dismiss-button {
background-image: url("chrome://global/skin/icons/close.svg");
}
&.options-button {
background-image: url("chrome://global/skin/icons/more.svg");
}
}
@media (prefers-contrast) {

View File

@ -418,7 +418,7 @@ class HistoryInView extends ViewPage {
></h3>
<fxview-tab-list
slot="main"
secondaryActionClass="options-button"
class="with-context-menu"
dateTimeFormat=${historyItem.l10nId.includes("prev-month")
? "dateTime"
: "time"}

View File

@ -497,18 +497,6 @@ class OpenTabsInViewCard extends ViewPageContent {
}
}
closeTab(event) {
const tab = event.originalTarget.tabElement;
tab?.ownerGlobal.gBrowser.removeTab(tab);
Services.telemetry.recordEvent(
"firefoxview_next",
"close_open_tab",
"tabs",
null
);
}
viewVisibleCallback() {
this.getRootNode().host.toggleVisibilityInCardContainer(true);
}
@ -543,13 +531,11 @@ class OpenTabsInViewCard extends ViewPageContent {
)}
<div class="fxview-tab-list-container" slot="main">
<fxview-tab-list
class="with-context-menu"
.hasPopup=${"menu"}
?compactRows=${this.classList.contains("width-limited")}
@fxview-tab-list-primary-action=${this.onTabListRowClick}
@fxview-tab-list-secondary-action=${this.openContextMenu}
@fxview-tab-list-tertiary-action=${this.closeTab}
secondaryActionClass="options-button"
tertiaryActionClass="dismiss-button"
.maxTabsLength=${this.getMaxTabsLength()}
.tabItems=${this.searchResults || getTabListItems(this.tabs)}
.searchQuery=${this.searchQuery}
@ -663,6 +649,12 @@ class OpenTabsContextMenu extends MozLitElement {
this.ownerViewPage.recordContextMenuTelemetry("copy-link", e);
}
closeTab(e) {
const tab = this.triggerNode.tabElement;
tab?.ownerGlobal.gBrowser.removeTab(tab);
this.ownerViewPage.recordContextMenuTelemetry("close-tab", e);
}
moveTabsToStart(e) {
const tab = this.triggerNode.tabElement;
tab?.ownerGlobal.gBrowser.moveTabsToStart(tab);
@ -756,6 +748,11 @@ class OpenTabsContextMenu extends MozLitElement {
href="chrome://browser/content/firefoxview/firefoxview.css"
/>
<panel-list data-tab-type="opentabs">
<panel-item
data-l10n-id="fxviewtabrow-close-tab"
data-l10n-attrs="accesskey"
@click=${this.closeTab}
></panel-item>
<panel-item
data-l10n-id="fxviewtabrow-move-tab"
data-l10n-attrs="accesskey"
@ -826,8 +823,6 @@ function getTabListItems(tabs) {
primaryL10nArgs: JSON.stringify({ url }),
secondaryL10nId: "fxviewtabrow-options-menu-button",
secondaryL10nArgs: JSON.stringify({ tabTitle: tab.label }),
tertiaryL10nId: "fxviewtabrow-close-tab-button",
tertiaryL10nArgs: JSON.stringify({ tabTitle: tab.label }),
soundPlaying: tab.hasAttribute("soundplaying"),
tabElement: tab,
time: tab.lastAccessed,

View File

@ -399,8 +399,6 @@ class RecentlyClosedTabsInView extends ViewPage {
.tabItems=${this.searchResults || this.recentlyClosedTabs}
@fxview-tab-list-secondary-action=${this.onDismissTab}
@fxview-tab-list-primary-action=${this.onReopenTab}
secondaryActionClass="dismiss-button"
;
></fxview-tab-list>
`
)}

View File

@ -426,8 +426,6 @@ class SyncedTabsInView extends ViewPage {
maxTabsLength=${this.showAll ? -1 : this.maxTabsLength}
@fxview-tab-list-primary-action=${this.onOpenLink}
@fxview-tab-list-secondary-action=${this.onContextMenu}
secondaryActionClass="options-button"
,
>
${this.panelListTemplate()}
</fxview-tab-list>`;

View File

@ -27,31 +27,37 @@ skip-if = ["true"] # Bug 1869605 and # Bug 1870296
["browser_firefoxview.js"]
["browser_firefoxview_tab.js"]
["browser_notification_dot.js"]
skip-if = ["true"] # Bug 1851453
["browser_opentabs_changes.js"]
["browser_reload_firefoxview.js"]
["browser_tab_close_last_tab.js"]
["browser_tab_on_close_warning.js"]
["browser_firefoxview_paused.js"]
["browser_firefoxview_general_telemetry.js"]
["browser_firefoxview_navigation.js"]
["browser_firefoxview_paused.js"]
["browser_firefoxview_search_telemetry.js"]
["browser_firefoxview_tab.js"]
["browser_firefoxview_virtual_list.js"]
["browser_history_firefoxview.js"]
skip-if = ["true"] # Bug 1877594
["browser_notification_dot.js"]
skip-if = ["true"] # Bug 1851453
["browser_opentabs_firefoxview.js"]
["browser_opentabs_cards.js"]
fail-if = ["a11y_checks"] # Bugs 1858041, 1854625, and 1872174 clicked Show all link is not accessible because it is "hidden" when clicked
["browser_opentabs_changes.js"]
["browser_opentabs_firefoxview.js"]
["browser_opentabs_recency.js"]
skip-if = [
"os == 'win'",
@ -63,14 +69,6 @@ skip-if = [
["browser_recentlyclosed_firefoxview.js"]
["browser_reload_firefoxview.js"]
["browser_syncedtabs_errors_firefoxview.js"]
["browser_syncedtabs_firefoxview.js"]
["browser_tab_close_last_tab.js"]
["browser_tab_list_keyboard_navigation.js"]
["browser_tab_on_close_warning.js"]

View File

@ -198,11 +198,7 @@ add_task(async function test_context_menu_new_window_telemetry() {
let firstTabList = historyComponent.lists[0];
let firstItem = firstTabList.rowEls[0];
let panelList = historyComponent.panelList;
EventUtils.synthesizeMouseAtCenter(
firstItem.secondaryButtonEl,
{},
content
);
EventUtils.synthesizeMouseAtCenter(firstItem.buttonEl, {}, content);
await BrowserTestUtils.waitForEvent(panelList, "shown");
await clearAllParentTelemetryEvents();
let panelItems = Array.from(panelList.children).filter(
@ -258,22 +254,14 @@ add_task(async function test_context_menu_private_window_telemetry() {
let firstTabList = historyComponent.lists[0];
let firstItem = firstTabList.rowEls[0];
let panelList = historyComponent.panelList;
EventUtils.synthesizeMouseAtCenter(
firstItem.secondaryButtonEl,
{},
content
);
EventUtils.synthesizeMouseAtCenter(firstItem.buttonEl, {}, content);
await BrowserTestUtils.waitForEvent(panelList, "shown");
await clearAllParentTelemetryEvents();
let panelItems = Array.from(panelList.children).filter(
panelItem => panelItem.nodeName === "PANEL-ITEM"
);
EventUtils.synthesizeMouseAtCenter(
firstItem.secondaryButtonEl,
{},
content
);
EventUtils.synthesizeMouseAtCenter(firstItem.buttonEl, {}, content);
info("Context menu button clicked.");
await BrowserTestUtils.waitForEvent(panelList, "shown");
info("Context menu shown.");
@ -335,22 +323,14 @@ add_task(async function test_context_menu_delete_from_history_telemetry() {
let firstTabList = historyComponent.lists[0];
let firstItem = firstTabList.rowEls[0];
let panelList = historyComponent.panelList;
EventUtils.synthesizeMouseAtCenter(
firstItem.secondaryButtonEl,
{},
content
);
EventUtils.synthesizeMouseAtCenter(firstItem.buttonEl, {}, content);
await BrowserTestUtils.waitForEvent(panelList, "shown");
await clearAllParentTelemetryEvents();
let panelItems = Array.from(panelList.children).filter(
panelItem => panelItem.nodeName === "PANEL-ITEM"
);
EventUtils.synthesizeMouseAtCenter(
firstItem.secondaryButtonEl,
{},
content
);
EventUtils.synthesizeMouseAtCenter(firstItem.buttonEl, {}, content);
info("Context menu button clicked.");
await BrowserTestUtils.waitForEvent(panelList, "shown");
info("Context menu shown.");

View File

@ -106,7 +106,7 @@ async function getContextMenuPanelListForCard(card) {
async function openContextMenuForItem(tabItem, card) {
// click on the item's button element (more menu)
// and wait for the panel list to be shown
tabItem.secondaryButtonEl.click();
tabItem.buttonEl.click();
// NOTE: menu must populate with devices data before it can be rendered
// so the creation of the panel-list can be async
let panelList = await getContextMenuPanelListForCard(card);
@ -148,44 +148,6 @@ async function moreMenuSetup() {
return [cards, rows];
}
add_task(async function test_close_open_tab() {
await withFirefoxView({}, async browser => {
const [cards, rows] = await moreMenuSetup();
const firstTab = rows[0];
const tertiaryButtonEl = firstTab.tertiaryButtonEl;
ok(tertiaryButtonEl, "Dismiss button exists");
await clearAllParentTelemetryEvents();
let closeTabEvent = [
["firefoxview_next", "close_open_tab", "tabs", undefined],
];
let tabsUpdated = BrowserTestUtils.waitForEvent(
NonPrivateTabs,
"TabChange"
);
EventUtils.synthesizeMouseAtCenter(tertiaryButtonEl, {}, content);
await tabsUpdated;
Assert.deepEqual(
getVisibleTabURLs(),
[TEST_URL2, TEST_URL3],
"First tab successfully removed"
);
await telemetryEvent(closeTabEvent);
const openTabs = cards[0].ownerDocument.querySelector(
"view-opentabs[name=opentabs]"
);
await waitUntilRowsMatch(openTabs, 0, [TEST_URL2, TEST_URL3]);
while (gBrowser.tabs.length > 1) {
BrowserTestUtils.removeTab(gBrowser.tabs[0]);
}
});
});
add_task(async function test_more_menus() {
await withFirefoxView({}, async browser => {
let win = browser.ownerGlobal;
@ -194,11 +156,11 @@ add_task(async function test_more_menus() {
gBrowser.selectedTab = gBrowser.visibleTabs[0];
Assert.equal(
gBrowser.selectedTab.linkedBrowser.currentURI.spec,
"about:mozilla",
"Selected tab is about:mozilla"
"about:blank",
"Selected tab is about:blank"
);
info(`Loading ${TEST_URL1} into the selected about:mozilla tab`);
info(`Loading ${TEST_URL1} into the selected about:blank tab`);
let tabLoaded = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
win.gURLBar.focus();
@ -214,18 +176,64 @@ add_task(async function test_more_menus() {
"Prepared 3 open tabs"
);
// Move Tab submenu item
let firstTab = rows[0];
// Open the panel list (more menu) from the first list item
let panelList = await openContextMenuForItem(firstTab, cards[0]);
// Close Tab menu item
info("Panel list shown. Clicking on panel-item");
let panelItem = panelList.querySelector(
"panel-item[data-l10n-id=fxviewtabrow-close-tab]"
);
let panelItemButton = panelItem.shadowRoot.querySelector(
"button[role=menuitem]"
);
ok(panelItem, "Close Tab panel item exists");
ok(
panelItemButton,
"Close Tab panel item button with role=menuitem exists"
);
await clearAllParentTelemetryEvents();
let contextMenuEvent = [
[
"firefoxview_next",
"context_menu",
"tabs",
undefined,
{ menu_action: "close-tab", data_type: "opentabs" },
],
];
// close a tab via the menu
let tabChangeRaised = BrowserTestUtils.waitForEvent(
NonPrivateTabs,
"TabChange"
);
menuHidden = BrowserTestUtils.waitForEvent(panelList, "hidden");
panelItemButton.click();
info("Waiting for result of closing a tab via the menu");
await tabChangeRaised;
await cards[0].getUpdateComplete();
await menuHidden;
await telemetryEvent(contextMenuEvent);
Assert.deepEqual(
getVisibleTabURLs(),
[TEST_URL2, TEST_URL3],
"Got the expected 2 open tabs"
);
let openTabs = cards[0].ownerDocument.querySelector(
"view-opentabs[name=opentabs]"
);
await waitUntilRowsMatch(openTabs, 0, [TEST_URL1, TEST_URL2, TEST_URL3]);
await waitUntilRowsMatch(openTabs, 0, [TEST_URL2, TEST_URL3]);
is(firstTab.url, TEST_URL1, `First tab list item is ${TEST_URL1}`);
// Move Tab submenu item
firstTab = rows[0];
is(firstTab.url, TEST_URL2, `First tab list item is ${TEST_URL2}`);
panelList = await openContextMenuForItem(firstTab, cards[0]);
let moveTabsPanelItem = panelList.querySelector(
"panel-item[data-l10n-id=fxviewtabrow-move-tab]"
);
@ -235,14 +243,15 @@ add_task(async function test_more_menus() {
);
ok(moveTabsSubmenuList, "Move tabs submenu panel list exists");
// navigate to the "Move tabs" submenu option, and
// navigate down to the "Move tabs" submenu option, and
// open it with the right arrow key
EventUtils.synthesizeKey("KEY_ArrowDown", {});
shown = BrowserTestUtils.waitForEvent(moveTabsSubmenuList, "shown");
EventUtils.synthesizeKey("KEY_ArrowRight", {});
await shown;
await clearAllParentTelemetryEvents();
let contextMenuEvent = [
contextMenuEvent = [
[
"firefoxview_next",
"context_menu",
@ -255,7 +264,7 @@ add_task(async function test_more_menus() {
// click on the first option, which should be "Move to the end" since
// this is the first tab
menuHidden = BrowserTestUtils.waitForEvent(panelList, "hidden");
let tabChangeRaised = BrowserTestUtils.waitForEvent(
tabChangeRaised = BrowserTestUtils.waitForEvent(
NonPrivateTabs,
"TabChange"
);
@ -267,7 +276,7 @@ add_task(async function test_more_menus() {
Assert.deepEqual(
getVisibleTabURLs(),
[TEST_URL2, TEST_URL3, TEST_URL1],
[TEST_URL3, TEST_URL2],
"The last tab became the first tab"
);
@ -275,15 +284,15 @@ add_task(async function test_more_menus() {
// closing a tab since it very clearly reveals the issues
// outlined in bug 1852622 when there are 3 or more tabs open
// and one is moved via the more menus.
await waitUntilRowsMatch(openTabs, 0, [TEST_URL2, TEST_URL3, TEST_URL1]);
await waitUntilRowsMatch(openTabs, 0, [TEST_URL3, TEST_URL2]);
// Copy Link menu item (copyLink function that's called is a member of Viewpage.mjs)
panelList = await openContextMenuForItem(firstTab, cards[0]);
firstTab = rows[0];
let panelItem = panelList.querySelector(
panelItem = panelList.querySelector(
"panel-item[data-l10n-id=fxviewtabrow-copy-link]"
);
let panelItemButton = panelItem.shadowRoot.querySelector(
panelItemButton = panelItem.shadowRoot.querySelector(
"button[role=menuitem]"
);
ok(panelItem, "Copy link panel item exists");
@ -314,7 +323,7 @@ add_task(async function test_more_menus() {
"text/plain",
Ci.nsIClipboard.kGlobalClipboard
);
is(copiedText, TEST_URL2, "The correct url has been copied and pasted");
is(copiedText, TEST_URL3, "The correct url has been copied and pasted");
while (gBrowser.tabs.length > 1) {
BrowserTestUtils.removeTab(gBrowser.tabs[0]);
@ -340,11 +349,11 @@ add_task(async function test_send_device_submenu() {
.callsFake(() => fxaDevicesWithCommands);
await withFirefoxView({}, async browser => {
// TEST_URL1 is our only tab, left over from previous test
// TEST_URL2 is our only tab, left over from previous test
Assert.deepEqual(
getVisibleTabURLs(),
[TEST_URL1],
`We initially have a single ${TEST_URL1} tab`
[TEST_URL2],
`We initially have a single ${TEST_URL2} tab`
);
let shown;
@ -369,6 +378,8 @@ add_task(async function test_send_device_submenu() {
// open it with the right arrow key
EventUtils.synthesizeKey("KEY_ArrowDown", {});
EventUtils.synthesizeKey("KEY_ArrowDown", {});
EventUtils.synthesizeKey("KEY_ArrowDown", {});
shown = BrowserTestUtils.waitForEvent(sendTabSubmenuList, "shown");
EventUtils.synthesizeKey("KEY_ArrowRight", {});
await shown;
@ -378,9 +389,9 @@ add_task(async function test_send_device_submenu() {
.expects("sendTabToDevice")
.once()
.withExactArgs(
TEST_URL1,
TEST_URL2,
[fxaDevicesWithCommands[0]],
"Gort! Klaatu barada nikto!"
"mochitest index /"
)
.returns(true);

View File

@ -1,161 +0,0 @@
const { NonPrivateTabs } = ChromeUtils.importESModule(
"resource:///modules/OpenTabs.sys.mjs"
);
add_task(async function test_open_tab_row_navigation() {
await withFirefoxView({}, async browser => {
const { document } = browser.contentWindow;
let win = browser.ownerGlobal;
await navigateToCategoryAndWait(document, "opentabs");
const openTabs = document.querySelector("view-opentabs[name=opentabs]");
await TestUtils.waitForCondition(
() => openTabs.viewCards[0].tabList?.rowEls.length === 1,
"The tab list hasn't rendered"
);
// Focus tab row
let tabRow = openTabs.viewCards[0].tabList.rowEls[0];
let tabRowFocused = BrowserTestUtils.waitForEvent(tabRow, "focus", win);
tabRow.focus();
await tabRowFocused;
info("The tab row main element has focus.");
// Navigate right to context menu button
let secondaryButtonFocused = BrowserTestUtils.waitForEvent(
tabRow.secondaryButtonEl,
"focus",
win
);
EventUtils.synthesizeKey("KEY_ArrowRight", {}, win);
await secondaryButtonFocused;
info("The context menu button has focus.");
// Navigate right to close button
let tertiaryButtonFocused = BrowserTestUtils.waitForEvent(
tabRow.tertiaryButtonEl,
"focus",
win
);
EventUtils.synthesizeKey("KEY_ArrowRight", {}, win);
await tertiaryButtonFocused;
info("The close button has focus");
// Navigate left to context menu button
secondaryButtonFocused = BrowserTestUtils.waitForEvent(
tabRow.secondaryButtonEl,
"focus",
win
);
EventUtils.synthesizeKey("KEY_ArrowLeft", {}, win);
await secondaryButtonFocused;
info("The context menu button has focus.");
// Navigate left to tab row main element
tabRowFocused = BrowserTestUtils.waitForEvent(tabRow.mainEl, "focus", win);
EventUtils.synthesizeKey("KEY_ArrowLeft", {}, win);
await tabRowFocused;
info("The tab row main element has focus.");
});
while (gBrowser.tabs.length > 1) {
BrowserTestUtils.removeTab(gBrowser.tabs[0]);
}
});
add_task(async function test_open_tab_row_with_sound_navigation() {
const tabWithSound = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
"http://mochi.test:8888/browser/dom/base/test/file_audioLoop.html",
true
);
const tabsUpdated = await BrowserTestUtils.waitForEvent(
NonPrivateTabs,
"TabChange"
);
await withFirefoxView({}, async browser => {
const { document } = browser.contentWindow;
let win = browser.ownerGlobal;
await navigateToCategoryAndWait(document, "opentabs");
const openTabs = document.querySelector("view-opentabs[name=opentabs]");
await TestUtils.waitForCondition(() =>
tabWithSound.hasAttribute("soundplaying")
);
await tabsUpdated;
await openTabs.updateComplete;
await TestUtils.waitForCondition(
() => openTabs.viewCards[0].tabList?.rowEls.length === 2,
"The tab list hasn't rendered"
);
// Focus tab row
let tabRow = openTabs.viewCards[0].tabList.rowEls[1];
let tabRowFocused = BrowserTestUtils.waitForEvent(tabRow, "focus", win);
tabRow.focus();
await tabRowFocused;
info("The tab row main element has focus.");
// Navigate right to media button
let mediaButtonFocused = BrowserTestUtils.waitForEvent(
tabRow.mediaButtonEl,
"focus",
win
);
EventUtils.synthesizeKey("KEY_ArrowRight", {}, win);
await mediaButtonFocused;
info("The media button has focus.");
// Navigate right to context menu button
let secondaryButtonFocused = BrowserTestUtils.waitForEvent(
tabRow.secondaryButtonEl,
"focus",
win
);
EventUtils.synthesizeKey("KEY_ArrowRight", {}, win);
await secondaryButtonFocused;
info("The context menu button has focus.");
// Navigate right to close button
let tertiaryButtonFocused = BrowserTestUtils.waitForEvent(
tabRow.tertiaryButtonEl,
"focus",
win
);
EventUtils.synthesizeKey("KEY_ArrowRight", {}, win);
await tertiaryButtonFocused;
info("The close button has focus");
// Navigate left to context menuo button
secondaryButtonFocused = BrowserTestUtils.waitForEvent(
tabRow.secondaryButtonEl,
"focus",
win
);
EventUtils.synthesizeKey("KEY_ArrowLeft", {}, win);
await secondaryButtonFocused;
info("The context menu button has focus.");
// Navigate left to media button
mediaButtonFocused = BrowserTestUtils.waitForEvent(
tabRow.mediaButtonEl,
"focus",
win
);
EventUtils.synthesizeKey("KEY_ArrowLeft", {}, win);
await mediaButtonFocused;
info("The media button has focus.");
// Navigate left to main element of tab row
tabRowFocused = BrowserTestUtils.waitForEvent(tabRow.mainEl, "focus", win);
EventUtils.synthesizeKey("KEY_ArrowLeft", {}, win);
await tabRowFocused;
info("The tab row main element has focus.");
});
while (gBrowser.tabs.length > 1) {
BrowserTestUtils.removeTab(gBrowser.tabs[0]);
}
});

View File

@ -308,12 +308,12 @@
);
await arrowRight();
ok(
isActiveElement(tabItems[0].secondaryButtonEl),
isActiveElement(tabItems[0].buttonEl),
"Focus should be on the first row's context menu button element of the list"
);
await arrowDown();
ok(
isActiveElement(tabItems[1].secondaryButtonEl),
isActiveElement(tabItems[1].buttonEl),
"Focus should be on the second row's context menu button element of the list"
);
await arrowLeft();

View File

@ -80,11 +80,7 @@ You'll need to pass along some of the following properties:
* `primaryL10nId` (**Optional**) - The l10n id to be used for the primary action element. This fluent string should ONLY define a `.title` attribute to describe the link element in each row.
* `primaryL10nArgs` (**Optional**) - The l10n args you can optionally pass for the primary action element
* `secondaryL10nId` (**Optional**) - The l10n id to be used for the secondary action button. This fluent string should ONLY define a `.title` attribute to describe the secondary button in each row.
* `tertiaryL10nId` (**Optional**) - The l10n id to be used for the tertiary action button. This fluent string should ONLY define a `.title` attribute to describe the secondary button in each row.
* `secondaryL10nArgs` (**Optional**) - The l10n args you can optionally pass for the secondary action button
* `tertiaryL10nArgs` (**Optional**) - The l10n args you can optionally pass for the tertiary action button
* `secondaryActionClass` (**Optional**) - The class used to style the secondary action button. `options-button` or `dismiss-button`
* `tertiaryActionClass` (**Optional**) - The class used to style the tertiary action button. `options-button` or `dismiss-button`
* `tabElement` (**Optional**) - The MozTabbrowserTab element for the tab item.
* `sourceClosedId` (**Optional**) - The closedId of the closed window the tab is from if applicable.
* `sourceWindowId` (**Optional**) - The SessionStore id of the window the tab is from if applicable.

View File

@ -15,11 +15,6 @@ fxviewtabrow-time = { DATETIME($time, timeStyle: "short") }
fxviewtabrow-tabs-list-tab =
.title = Open { $targetURI } in a new tab
# Variables:
# $tabTitle (string) - Title of tab being closed
fxviewtabrow-close-tab-button =
.title = Close { $tabTitle }
# Variables:
# $tabTitle (string) - Title of tab being dismissed
fxviewtabrow-dismiss-tab-button =

View File

@ -3893,20 +3893,6 @@ firefoxview_next:
- 1842616
expiry_version: "never"
release_channel_collection: opt-out
close_open_tab:
objects: ["tabs"]
description: >
Recorded when a tab is closed via the close button on an open tab row.
notification_emails:
- firefoxview@mozilla.com
products:
- "firefox"
record_in_processes:
- main
bug_numbers:
- 1857298
expiry_version: "never"
release_channel_collection: opt-out
browser_context_menu:
objects: ["tabs"]
description: >