Skip to content

Commit f078c3f

Browse files
committed
Bug 1948415 - Create a moz-page-header component r=fluent-reviewers,desktop-theme-reviewers,mstriemer,bolsson,dao
Differential Revision: https://phabricator.services.mozilla.com/D266476
1 parent f5ade40 commit f078c3f

File tree

14 files changed

+486
-39
lines changed

14 files changed

+486
-39
lines changed

browser/components/preferences/preferences.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ function srdSectionEnabled(section) {
168168
const CONFIG_PANES = {
169169
containers2: {
170170
parent: "general",
171-
l10nId: "containers-header",
171+
l10nId: "containers-section-header",
172172
groupIds: ["containers"],
173173
},
174174
};

browser/components/preferences/widgets/setting-pane/setting-pane.mjs

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,6 @@ export class SettingPane extends MozLitElement {
2020
window.gotoPref(this.config.parent);
2121
}
2222

23-
backButtonTemplate() {
24-
if (!this.isSubPane) {
25-
return "";
26-
}
27-
return html`<moz-button
28-
type="icon"
29-
title="Go back"
30-
iconsrc="chrome://global/skin/icons/arrow-left.svg"
31-
@click=${this.goBack}
32-
></moz-button>`;
33-
}
34-
3523
connectedCallback() {
3624
super.connectedCallback();
3725
this.setAttribute("data-category", this.name);
@@ -68,10 +56,11 @@ export class SettingPane extends MozLitElement {
6856

6957
render() {
7058
return html`
71-
<div class="page-header">
72-
${this.backButtonTemplate()}
73-
<h2 data-l10n-id=${this.config.l10nId}></h2>
74-
</div>
59+
<moz-page-header
60+
data-l10n-id=${this.config.l10nId}
61+
.backButton=${this.isSubPane}
62+
@navigate-back=${this.goBack}
63+
></moz-page-header>
7564
${this.config.groupIds.map(groupId => this.groupTemplate(groupId))}
7665
`;
7766
}

browser/locales/en-US/browser/preferences/preferences.ftl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -896,6 +896,8 @@ remove-addon-engine-alert = To remove this search engine, remove the associated
896896
containers-back-button2 =
897897
.aria-label = Back to Settings
898898
containers-header = Container Tabs
899+
containers-section-header =
900+
.heading = Container Tabs
899901
containers-add-button =
900902
.label = Add New Container
901903
.accesskey = A

browser/themes/shared/preferences/preferences.css

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,22 +1479,3 @@ richlistitem .text-link:hover {
14791479
font-size: var(--font-size-small);
14801480
}
14811481
}
1482-
1483-
/* START SRD temp page header styles (bug 1948415) */
1484-
.page-header {
1485-
gap: var(--space-small);
1486-
align-items: center;
1487-
1488-
&:not([hidden]) {
1489-
display: flex;
1490-
}
1491-
1492-
> h2 {
1493-
margin: 0;
1494-
}
1495-
1496-
> moz-button:first-of-type:dir(rtl) {
1497-
scale: -1 1;
1498-
}
1499-
}
1500-
/* END SRD temp page header styles (bug 1948415) */
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Any copyright is dedicated to the Public Domain.
2+
# http://creativecommons.org/publicdomain/zero/1.0/
3+
4+
import fluent.syntax.ast as FTL
5+
from fluent.migrate.helpers import transforms_from
6+
7+
8+
def migrate(ctx):
9+
"""Bug 1948415 - Migrate containers-header to containers-section-header with .heading attribute, part {index}"""
10+
source = "browser/browser/preferences/preferences.ftl"
11+
target = source
12+
13+
ctx.add_transforms(
14+
target,
15+
source,
16+
transforms_from(
17+
"""
18+
containers-section-header =
19+
.heading = {COPY_PATTERN(from_path, "containers-header")}
20+
""",
21+
from_path=source,
22+
),
23+
)

toolkit/content/customElements.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -851,9 +851,13 @@
851851
"moz-message-bar",
852852
"chrome://global/content/elements/moz-message-bar.mjs",
853853
],
854-
["moz-promo", "chrome://global/content/elements/moz-promo.mjs"],
855854
["moz-option", "chrome://global/content/elements/moz-select.mjs"],
855+
[
856+
"moz-page-header",
857+
"chrome://global/content/elements/moz-page-header.mjs",
858+
],
856859
["moz-page-nav", "chrome://global/content/elements/moz-page-nav.mjs"],
860+
["moz-promo", "chrome://global/content/elements/moz-promo.mjs"],
857861
["moz-radio", "chrome://global/content/elements/moz-radio-group.mjs"],
858862
[
859863
"moz-radio-group",

toolkit/content/jar.mn

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ toolkit.jar:
129129
content/global/elements/moz-input-search.mjs (widgets/moz-input-search/moz-input-search.mjs)
130130
content/global/elements/moz-input-text.css (widgets/moz-input-text/moz-input-text.css)
131131
content/global/elements/moz-input-text.mjs (widgets/moz-input-text/moz-input-text.mjs)
132+
content/global/elements/moz-page-header.css (widgets/moz-page-header/moz-page-header.css)
133+
content/global/elements/moz-page-header.mjs (widgets/moz-page-header/moz-page-header.mjs)
132134
content/global/elements/moz-page-nav.css (widgets/moz-page-nav/moz-page-nav.css)
133135
content/global/elements/moz-page-nav-button.css (widgets/moz-page-nav/moz-page-nav-button.css)
134136
content/global/elements/moz-page-nav.mjs (widgets/moz-page-nav/moz-page-nav.mjs)

toolkit/content/tests/widgets/chrome.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ skip-if = ["os == 'mac' && os_version == '14.70' && processor == 'x86_64'"] # Bu
6464

6565
["test_moz_message_bar.html"]
6666

67+
["test_moz_page_header.html"]
68+
6769
["test_moz_page_nav.html"]
6870

6971
["test_moz_promo.html"]
Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
<!doctype html>
2+
<html>
3+
<head>
4+
<meta charset="utf-8" />
5+
<title>MozPageHeader Tests</title>
6+
<script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
7+
<link
8+
rel="stylesheet"
9+
href="chrome://mochikit/content/tests/SimpleTest/test.css"
10+
/>
11+
<link rel="stylesheet" href="chrome://global/skin/in-content/common.css" />
12+
<script src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"></script>
13+
<script
14+
type="module"
15+
src="chrome://global/content/elements/moz-page-header.mjs"
16+
></script>
17+
<script src="lit-test-helpers.js"></script>
18+
<script>
19+
let html;
20+
let testHelpers = new LitTestHelpers();
21+
22+
add_setup(async function setup() {
23+
({ html } = await testHelpers.setupLit());
24+
const templateFn = attrs => html`
25+
<moz-page-header ${attrs}></moz-page-header>
26+
`;
27+
testHelpers.setupTests({ templateFn });
28+
});
29+
30+
add_task(async function testMozPageHeaderProperties() {
31+
const HEADING = "Page Heading";
32+
const DESCRIPTION = "Some description of this page.";
33+
const ICON_SRC = "chrome://global/skin/icons/info.svg";
34+
35+
let template = testHelpers.templateFn({
36+
heading: HEADING,
37+
description: DESCRIPTION,
38+
iconsrc: ICON_SRC,
39+
});
40+
let renderTarget = await testHelpers.renderTemplate(template);
41+
let header = renderTarget.firstElementChild;
42+
43+
ok(header, "The page header renders.");
44+
45+
let headingEl = header.shadowRoot.querySelector("h1");
46+
is(
47+
headingEl?.textContent.trim(),
48+
HEADING,
49+
"Heading element renders with the expected text."
50+
);
51+
52+
let descriptionEl = header.shadowRoot.querySelector(".description");
53+
is(
54+
descriptionEl?.textContent.trim(),
55+
DESCRIPTION,
56+
"Description element renders with the expected text."
57+
);
58+
59+
let iconEl = header.shadowRoot.querySelector(".icon");
60+
ok(iconEl, "Icon element is rendered when iconSrc is set.");
61+
is(iconEl.getAttribute("src"), ICON_SRC, "Icon has the expected src.");
62+
63+
let backButton = header.shadowRoot.querySelector(".back-button");
64+
ok(!backButton, "Back button is not rendered by default.");
65+
66+
header.backButton = true;
67+
await header.updateComplete;
68+
69+
backButton = header.shadowRoot.querySelector(".back-button");
70+
ok(backButton, "Back button appears when backButton is true.");
71+
72+
header.backButton = false;
73+
await header.updateComplete;
74+
75+
backButton = header.shadowRoot.querySelector(".back-button");
76+
ok(
77+
!backButton,
78+
"Back button is removed when backButton is set back to false."
79+
);
80+
});
81+
82+
add_task(async function testMozPageHeaderBackButtonEvent() {
83+
let template = testHelpers.templateFn({
84+
heading: "With back button",
85+
backbutton: "",
86+
});
87+
let renderTarget = await testHelpers.renderTemplate(template);
88+
let header = renderTarget.firstElementChild;
89+
90+
let backButton = header.shadowRoot.querySelector(".back-button");
91+
ok(backButton, "Back button is present for click test.");
92+
93+
let eventPromise = new Promise(resolve => {
94+
header.addEventListener("navigate-back", resolve, { once: true });
95+
});
96+
97+
backButton.click();
98+
let event = await eventPromise;
99+
100+
ok(event instanceof Event, "Clicking back button dispatches an Event.");
101+
is(
102+
event.type,
103+
"navigate-back",
104+
"The event type is a 'navigate-back' event."
105+
);
106+
});
107+
108+
add_task(async function testMozPageHeaderBreadcrumbSlot() {
109+
const template = html`
110+
<moz-page-header
111+
heading="With Breadcrumbs"
112+
icon-src="chrome://global/skin/icons/info.svg"
113+
>
114+
<moz-breadcrumb-group slot="breadcrumbs">
115+
<moz-breadcrumb href="about#first" label="First"></moz-breadcrumb>
116+
<moz-breadcrumb
117+
href="about#current"
118+
label="Current"
119+
></moz-breadcrumb>
120+
</moz-breadcrumb-group>
121+
</moz-page-header>
122+
`;
123+
const renderTarget = await testHelpers.renderTemplate(template);
124+
const header = renderTarget.firstElementChild;
125+
126+
const slot = header.shadowRoot.querySelector(
127+
'slot[name="breadcrumbs"]'
128+
);
129+
ok(slot, "Page header renders a slot for breadcrumbs.");
130+
131+
const assigned = slot.assignedElements();
132+
is(
133+
assigned.length,
134+
1,
135+
"One element is assigned into the breadcrumbs slot."
136+
);
137+
const group = assigned[0];
138+
is(
139+
group.localName,
140+
"moz-breadcrumb-group",
141+
"moz-breadcrumb-group is slotted in the breadcrumbs slot."
142+
);
143+
});
144+
145+
add_task(async function testMozPageHeaderSupportPage() {
146+
let supportPageTemplate = testHelpers.templateFn({
147+
label: "Testing support-page",
148+
"support-page": "test",
149+
});
150+
let renderTarget =
151+
await testHelpers.renderTemplate(supportPageTemplate);
152+
let header = renderTarget.firstElementChild;
153+
154+
let supportLink = header.shadowRoot.querySelector(".support-link");
155+
ok(
156+
supportLink,
157+
"moz-page-header renders a support link when supportPage is provided."
158+
);
159+
160+
let adjacentEl = supportLink.previousElementSibling;
161+
is(
162+
adjacentEl.id,
163+
"heading",
164+
"support link is placed next to the heading when no description is provided."
165+
);
166+
167+
header.description = "now we have a description.";
168+
await header.updateComplete;
169+
170+
supportLink = header.shadowRoot.querySelector(".support-link");
171+
adjacentEl = supportLink.previousElementSibling;
172+
is(
173+
adjacentEl.id,
174+
"description",
175+
"support link is placed next to the description when provided."
176+
);
177+
});
178+
</script>
179+
</head>
180+
<body>
181+
<p id="display"></p>
182+
<div id="content" style="display: none"></div>
183+
<pre id="test"></pre>
184+
</body>
185+
</html>

toolkit/content/widgets/moz-breadcrumb-group/moz-breadcrumb-group.stories.mjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ moz-breadcrumb-third =
2121
},
2222
};
2323

24-
const Template = ({ l10nId, width }) => {
24+
const Template = ({ l10nId, width, slot }) => {
2525
return html`
2626
<style>
2727
${width
@@ -31,7 +31,7 @@ const Template = ({ l10nId, width }) => {
3131
}`
3232
: ""}
3333
</style>
34-
<moz-breadcrumb-group>
34+
<moz-breadcrumb-group slot=${ifDefined(slot)}>
3535
<moz-breadcrumb
3636
href="about#firstpage"
3737
data-l10n-id=${ifDefined(l10nId + "-first")}

0 commit comments

Comments
 (0)