Skip to content

Commit 0a51eb3

Browse files
Bug 1850591 - Convert Firefox View's domain-specific navigation component to a global component r=desktop-theme-reviewers,fxview-reviewers,reusable-components-reviewers,sclements,jules,hjones,fluent-reviewers,flod
Differential Revision: https://phabricator.services.mozilla.com/D193593
1 parent d621757 commit 0a51eb3

38 files changed

+869
-899
lines changed

browser/components/customizableui/test/browser_1856572_ensure_Fluent_works_in_customizeMode.js

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,52 +10,69 @@ const {
1010
"resource://testing-common/FirefoxViewTestUtils.sys.mjs"
1111
);
1212

13+
/**
14+
* Bug 1856572 - This test is to ensure that fluent strings in Firefox View
15+
* can be updated after opening Customize Mode
16+
* **/
1317
add_task(async function test_data_l10n_customize_mode() {
1418
FirefoxViewTestUtilsInit(this);
1519
await withFirefoxView({ win: window }, async function (browser) {
1620
/**
1721
* Bug 1856572, Bug 1857622: Without requesting two animation frames
1822
* the "missing Fluent strings" issue will not reproduce.
23+
*
24+
* Given the precondition that we open Firefox View, then open Customize Mode, then
25+
* navigate back to Firefox View in a quick succession, as long as Fluent
26+
* controlled strings can be updated by changing their Fluent IDs then this
27+
* test is valid.
1928
*/
2029
await new Promise(r =>
2130
requestAnimationFrame(() => requestAnimationFrame(r))
2231
);
2332
await startCustomizing();
2433
await endCustomizing();
2534
await openFirefoxViewTab(window);
26-
2735
const { document } = browser.contentWindow;
28-
let header = document.querySelector("h1");
29-
document.l10n.setAttributes(header, "firefoxview-overview-header");
36+
let secondPageNavButton = document.querySelectorAll(
37+
"moz-page-nav-button"
38+
)[0];
39+
document.l10n.setAttributes(
40+
secondPageNavButton,
41+
"firefoxview-overview-header"
42+
);
3043
let previousText = await document.l10n.formatValue(
31-
"firefoxview-page-title"
44+
"firefoxview-opentabs-nav"
45+
);
46+
let translatedText = await window.content.document.l10n.formatValue(
47+
"firefoxview-overview-header"
3248
);
3349
/**
3450
* This should be replaced with
35-
* BrowserTestUtils.waitForMutationCondition(header, {characterData: true}, ...)
51+
* BrowserTestUtils.waitForMutationCondition(secondPageNavButton, {characterData: true}, ...)
3652
* but apparently Fluent manipulation of textContent doesn't result
3753
* in a characterData mutation occurring.
3854
*/
3955
await BrowserTestUtils.waitForCondition(() => {
40-
return header.textContent != previousText;
56+
return (
57+
secondPageNavButton.textContent !== previousText &&
58+
secondPageNavButton.textContent === translatedText
59+
);
4160
}, "waiting for text content to change");
4261

4362
Assert.equal(
44-
header.getAttribute("data-l10n-id"),
63+
secondPageNavButton.getAttribute("data-l10n-id"),
4564
"firefoxview-overview-header",
4665
"data-l10n-id should be updated"
4766
);
4867
Assert.notEqual(
4968
previousText,
50-
header.textContent,
51-
"The header's text content should be updated"
52-
);
53-
let translatedText = await window.content.document.l10n.formatValue(
54-
"firefoxview-overview-header"
69+
secondPageNavButton.textContent,
70+
"The second page-nav button text content should be updated"
5571
);
72+
5673
Assert.equal(
5774
translatedText,
58-
header.textContent,
75+
secondPageNavButton.textContent,
5976
"The changed text should be the translated value of 'firefoxview-overview-header"
6077
);
6178
});

browser/components/firefoxview/firefoxview.css

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ body {
6969
grid-template-columns: var(--fxview-sidebar-width) 1fr;
7070
background-color: var(--fxview-background-color);
7171
color: var(--fxview-text-primary-color);
72+
73+
@media (max-width: 52rem) {
74+
display: flex;
75+
}
7276
}
7377

7478
.main-container {
@@ -88,26 +92,6 @@ body {
8892
margin: 0;
8993
}
9094

91-
fxview-category-button:focus-visible {
92-
outline-offset: var(--in-content-focus-outline-inset);
93-
}
94-
95-
fxview-category-button[name="recentbrowsing"]::part(icon) {
96-
background-image: url("chrome://browser/content/firefoxview/category-recentbrowsing.svg");
97-
}
98-
fxview-category-button[name="opentabs"]::part(icon) {
99-
background-image: url("chrome://browser/content/firefoxview/category-opentabs.svg");
100-
}
101-
fxview-category-button[name="recentlyclosed"]::part(icon) {
102-
background-image: url("chrome://browser/content/firefoxview/category-recentlyclosed.svg");
103-
}
104-
fxview-category-button[name="syncedtabs"]::part(icon) {
105-
background-image: url("chrome://browser/content/firefoxview/category-syncedtabs.svg");
106-
}
107-
fxview-category-button[name="history"]::part(icon) {
108-
background-image: url("chrome://browser/content/firefoxview/category-history.svg");
109-
}
110-
11195
fxview-tab-list.with-dismiss-button::part(secondary-button) {
11296
background-image: url("chrome://global/skin/icons/close.svg");
11397
}
@@ -174,14 +158,6 @@ panel-list {
174158
overflow-y: visible;
175159
}
176160

177-
fxview-category-navigation {
178-
overflow-y: auto;
179-
}
180-
181-
fxview-category-navigation h1 {
182-
margin-block: 0;
183-
}
184-
185161
fxview-empty-state:not([isSelectedTab]) button[slot="primary-action"] {
186162
margin-inline-start: 0;
187163
}

browser/components/firefoxview/firefoxview.html

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -41,54 +41,51 @@
4141
></script>
4242
<script
4343
type="module"
44-
src="chrome://browser/content/firefoxview/fxview-category-navigation.mjs"
44+
src="chrome://browser/content/firefoxview/syncedtabs.mjs"
4545
></script>
4646
<script
4747
type="module"
48-
src="chrome://browser/content/firefoxview/syncedtabs.mjs"
48+
src="chrome://global/content/elements/moz-page-nav.mjs"
4949
></script>
5050
<script src="chrome://browser/content/contentTheme.js"></script>
5151
</head>
5252

5353
<body>
54-
<fxview-category-navigation>
55-
<h1 slot="category-nav-header" data-l10n-id="firefoxview-page-title"></h1>
56-
<fxview-category-button
57-
class="category"
58-
slot="category-button"
59-
name="recentbrowsing"
54+
<moz-page-nav
55+
data-l10n-id="firefoxview-page-heading"
56+
data-l10n-attrs="heading"
57+
>
58+
<moz-page-nav-button
59+
view="recentbrowsing"
6060
data-l10n-id="firefoxview-overview-nav"
61+
iconSrc="chrome://browser/content/firefoxview/view-recentbrowsing.svg"
6162
>
62-
</fxview-category-button>
63-
<fxview-category-button
64-
class="category"
65-
slot="category-button"
66-
name="opentabs"
63+
</moz-page-nav-button>
64+
<moz-page-nav-button
65+
view="opentabs"
6766
data-l10n-id="firefoxview-opentabs-nav"
67+
iconSrc="chrome://browser/content/firefoxview/view-opentabs.svg"
6868
>
69-
</fxview-category-button>
70-
<fxview-category-button
71-
class="category"
72-
slot="category-button"
73-
name="recentlyclosed"
69+
</moz-page-nav-button>
70+
<moz-page-nav-button
71+
view="recentlyclosed"
7472
data-l10n-id="firefoxview-recently-closed-nav"
73+
iconSrc="chrome://browser/content/firefoxview/view-recentlyclosed.svg"
7574
>
76-
</fxview-category-button>
77-
<fxview-category-button
78-
class="category"
79-
slot="category-button"
80-
name="syncedtabs"
75+
</moz-page-nav-button>
76+
<moz-page-nav-button
77+
view="syncedtabs"
8178
data-l10n-id="firefoxview-synced-tabs-nav"
79+
iconSrc="chrome://browser/content/firefoxview/view-syncedtabs.svg"
8280
>
83-
</fxview-category-button>
84-
<fxview-category-button
85-
class="category"
86-
slot="category-button"
87-
name="history"
81+
</moz-page-nav-button>
82+
<moz-page-nav-button
83+
view="history"
8884
data-l10n-id="firefoxview-history-nav"
85+
iconSrc="chrome://browser/content/firefoxview/view-history.svg"
8986
>
90-
</fxview-category-button>
91-
</fxview-category-navigation>
87+
</moz-page-nav-button>
88+
</moz-page-nav>
9289
<main id="pages" role="application" data-l10n-id="firefoxview-page-label">
9390
<div class="main-container">
9491
<named-deck>

browser/components/firefoxview/firefoxview.mjs

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,35 @@
33
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
44

55
let pageList = [];
6-
let categoryPagesDeck = null;
7-
let categoryNavigation = null;
6+
let viewsDeck = null;
7+
let pageNav = null;
88
let activeComponent = null;
99
let searchKeyboardShortcut = null;
1010

1111
const { topChromeWindow } = window.browsingContext;
1212

1313
function onHashChange() {
14-
let page = document.location?.hash.substring(1);
15-
if (!page || !pageList.includes(page)) {
16-
page = "recentbrowsing";
14+
let view = document.location?.hash.substring(1);
15+
if (!view || !pageList.includes(view)) {
16+
view = "recentbrowsing";
1717
}
18-
changePage(page);
18+
changeView(view);
1919
}
2020

21-
function changePage(page) {
22-
categoryPagesDeck.selectedViewName = page;
23-
categoryNavigation.currentCategory = page;
24-
if (categoryNavigation.categoryButtons.includes(document.activeElement)) {
25-
let currentCategoryButton = categoryNavigation.categoryButtons.find(
26-
categoryButton => categoryButton.name === page
21+
function changeView(view) {
22+
viewsDeck.selectedViewName = view;
23+
pageNav.currentPage = view;
24+
if (pageNav.pageNavButtons.includes(document.activeElement)) {
25+
let currentPageButton = pageNav.pageNavButtons.find(
26+
pageButton => pageButton.view === view
2727
);
28-
(currentCategoryButton || categoryNavigation.categoryButtons[0]).focus();
28+
(currentPageButton || pageNav.pageNavButtons[0]).focus();
2929
}
3030
}
3131

32-
function onPagesDeckViewChange() {
33-
for (const child of categoryPagesDeck.children) {
34-
if (child.getAttribute("name") == categoryPagesDeck.selectedViewName) {
32+
function onViewsDeckViewChange() {
33+
for (const child of viewsDeck.children) {
34+
if (child.getAttribute("name") == viewsDeck.selectedViewName) {
3535
child.enter();
3636
activeComponent = child;
3737
} else {
@@ -41,11 +41,11 @@ function onPagesDeckViewChange() {
4141
}
4242

4343
function recordNavigationTelemetry(source, eventTarget) {
44-
let page = "recentbrowsing";
44+
let view = "recentbrowsing";
4545
if (source === "category-navigation") {
46-
page = eventTarget.parentNode.currentCategory;
46+
view = eventTarget.parentNode.currentView;
4747
} else if (source === "view-all") {
48-
page = eventTarget.shortPageName;
48+
view = eventTarget.shortPageName;
4949
}
5050
// Record telemetry
5151
Services.telemetry.recordEvent(
@@ -54,7 +54,7 @@ function recordNavigationTelemetry(source, eventTarget) {
5454
"navigation",
5555
null,
5656
{
57-
page,
57+
page: view,
5858
source,
5959
}
6060
);
@@ -73,7 +73,7 @@ async function updateSearchTextboxSize() {
7373
const placeholder = msg.attributes[0].value;
7474
maxLength = Math.max(maxLength, placeholder.length);
7575
}
76-
for (const child of categoryPagesDeck.children) {
76+
for (const child of viewsDeck.children) {
7777
child.searchTextboxSize = maxLength;
7878
}
7979
}
@@ -89,27 +89,27 @@ async function updateSearchKeyboardShortcut() {
8989
window.addEventListener("DOMContentLoaded", async () => {
9090
recordEnteredTelemetry();
9191

92-
categoryNavigation = document.querySelector("fxview-category-navigation");
93-
categoryPagesDeck = document.querySelector("named-deck");
92+
pageNav = document.querySelector("moz-page-nav");
93+
viewsDeck = document.querySelector("named-deck");
9494

95-
for (const item of categoryNavigation.categoryButtons) {
96-
pageList.push(item.getAttribute("name"));
95+
for (const item of pageNav.pageNavButtons) {
96+
pageList.push(item.getAttribute("view"));
9797
}
9898
window.addEventListener("hashchange", onHashChange);
99-
window.addEventListener("change-category", function (event) {
100-
location.hash = event.target.getAttribute("name");
99+
window.addEventListener("change-view", function (event) {
100+
location.hash = event.target.getAttribute("view");
101101
window.scrollTo(0, 0);
102102
recordNavigationTelemetry("category-navigation", event.target);
103103
});
104104
window.addEventListener("card-container-view-all", function (event) {
105105
recordNavigationTelemetry("view-all", event.originalTarget);
106106
});
107107

108-
categoryPagesDeck.addEventListener("view-changed", onPagesDeckViewChange);
108+
viewsDeck.addEventListener("view-changed", onViewsDeckViewChange);
109109

110110
// set the initial state
111111
onHashChange();
112-
onPagesDeckViewChange();
112+
onViewsDeckViewChange();
113113
await updateSearchTextboxSize();
114114
await updateSearchKeyboardShortcut();
115115

browser/components/firefoxview/fxview-category-navigation.css

Lines changed: 0 additions & 60 deletions
This file was deleted.

0 commit comments

Comments
 (0)