1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 const { QuickSuggest
} = ChromeUtils
.importESModule(
8 "resource:///modules/QuickSuggest.sys.mjs"
10 const { ONBOARDING_CHOICE
} = QuickSuggest
;
12 const VARIATION_MAP
= {
15 onboardingNext
: "firefox-suggest-onboarding-introduction-next-button-1",
16 "introduction-title": "firefox-suggest-onboarding-introduction-title-1",
17 "main-title": "firefox-suggest-onboarding-main-title-1",
18 "main-description": "firefox-suggest-onboarding-main-description-1",
19 "main-accept-option-label":
20 "firefox-suggest-onboarding-main-accept-option-label",
21 "main-accept-option-description":
22 "firefox-suggest-onboarding-main-accept-option-description-1",
23 "main-reject-option-label":
24 "firefox-suggest-onboarding-main-reject-option-label",
25 "main-reject-option-description":
26 "firefox-suggest-onboarding-main-reject-option-description-1",
31 onboardingNext
: "firefox-suggest-onboarding-introduction-next-button-1",
32 "introduction-title": "firefox-suggest-onboarding-introduction-title-2",
33 "main-title": "firefox-suggest-onboarding-main-title-2",
34 "main-description": "firefox-suggest-onboarding-main-description-2",
35 "main-accept-option-label":
36 "firefox-suggest-onboarding-main-accept-option-label",
37 "main-accept-option-description":
38 "firefox-suggest-onboarding-main-accept-option-description-1",
39 "main-reject-option-label":
40 "firefox-suggest-onboarding-main-reject-option-label",
41 "main-reject-option-description":
42 "firefox-suggest-onboarding-main-reject-option-description-1",
48 onboardingNext
: "firefox-suggest-onboarding-introduction-next-button-1",
49 "introduction-title": "firefox-suggest-onboarding-introduction-title-3",
50 "main-title": "firefox-suggest-onboarding-main-title-3",
51 "main-description": "firefox-suggest-onboarding-main-description-3",
52 "main-accept-option-label":
53 "firefox-suggest-onboarding-main-accept-option-label",
54 "main-accept-option-description":
55 "firefox-suggest-onboarding-main-accept-option-description-1",
56 "main-reject-option-label":
57 "firefox-suggest-onboarding-main-reject-option-label",
58 "main-reject-option-description":
59 "firefox-suggest-onboarding-main-reject-option-description-1",
64 onboardingNext
: "firefox-suggest-onboarding-introduction-next-button-1",
65 "introduction-title": "firefox-suggest-onboarding-introduction-title-4",
66 "main-title": "firefox-suggest-onboarding-main-title-4",
67 "main-description": "firefox-suggest-onboarding-main-description-4",
68 "main-accept-option-label":
69 "firefox-suggest-onboarding-main-accept-option-label",
70 "main-accept-option-description":
71 "firefox-suggest-onboarding-main-accept-option-description-2",
72 "main-reject-option-label":
73 "firefox-suggest-onboarding-main-reject-option-label",
74 "main-reject-option-description":
75 "firefox-suggest-onboarding-main-reject-option-description-2",
81 onboardingNext
: "firefox-suggest-onboarding-introduction-next-button-1",
82 "introduction-title": "firefox-suggest-onboarding-introduction-title-5",
83 "main-title": "firefox-suggest-onboarding-main-title-5",
84 "main-description": "firefox-suggest-onboarding-main-description-5",
85 "main-accept-option-label":
86 "firefox-suggest-onboarding-main-accept-option-label",
87 "main-accept-option-description":
88 "firefox-suggest-onboarding-main-accept-option-description-2",
89 "main-reject-option-label":
90 "firefox-suggest-onboarding-main-reject-option-label",
91 "main-reject-option-description":
92 "firefox-suggest-onboarding-main-reject-option-description-2",
97 onboardingNext
: "firefox-suggest-onboarding-introduction-next-button-2",
98 "introduction-title": "firefox-suggest-onboarding-introduction-title-6",
99 "main-title": "firefox-suggest-onboarding-main-title-6",
100 "main-description": "firefox-suggest-onboarding-main-description-6",
101 "main-accept-option-label":
102 "firefox-suggest-onboarding-main-accept-option-label",
103 "main-accept-option-description":
104 "firefox-suggest-onboarding-main-accept-option-description-2",
105 "main-reject-option-label":
106 "firefox-suggest-onboarding-main-reject-option-label",
107 "main-reject-option-description":
108 "firefox-suggest-onboarding-main-reject-option-description-2",
112 mainPrivacyFirst
: true,
114 onboardingNext
: "firefox-suggest-onboarding-introduction-next-button-1",
115 "introduction-title": "firefox-suggest-onboarding-introduction-title-7",
116 "main-title": "firefox-suggest-onboarding-main-title-7",
117 "main-description": "firefox-suggest-onboarding-main-description-7",
118 "main-accept-option-label":
119 "firefox-suggest-onboarding-main-accept-option-label",
120 "main-accept-option-description":
121 "firefox-suggest-onboarding-main-accept-option-description-2",
122 "main-reject-option-label":
123 "firefox-suggest-onboarding-main-reject-option-label",
124 "main-reject-option-description":
125 "firefox-suggest-onboarding-main-reject-option-description-2",
131 onboardingNext
: "firefox-suggest-onboarding-introduction-next-button-1",
132 "introduction-title": "firefox-suggest-onboarding-introduction-title-2",
133 "main-title": "firefox-suggest-onboarding-main-title-8",
134 "main-description": "firefox-suggest-onboarding-main-description-8",
135 "main-accept-option-label":
136 "firefox-suggest-onboarding-main-accept-option-label",
137 "main-accept-option-description":
138 "firefox-suggest-onboarding-main-accept-option-description-1",
139 "main-reject-option-label":
140 "firefox-suggest-onboarding-main-reject-option-label",
141 "main-reject-option-description":
142 "firefox-suggest-onboarding-main-reject-option-description-1",
146 introductionLayout
: "layout-100",
147 mainPrivacyFirst
: true,
150 onboardingNext
: "firefox-suggest-onboarding-introduction-next-button-3",
151 "introduction-title": "firefox-suggest-onboarding-main-title-9",
152 "main-title": "firefox-suggest-onboarding-main-title-9",
153 "main-description": "firefox-suggest-onboarding-main-description-9",
154 "main-accept-option-label":
155 "firefox-suggest-onboarding-main-accept-option-label-2",
156 "main-accept-option-description":
157 "firefox-suggest-onboarding-main-accept-option-description-3",
158 "main-reject-option-label":
159 "firefox-suggest-onboarding-main-reject-option-label-2",
160 "main-reject-option-description":
161 "firefox-suggest-onboarding-main-reject-option-description-3",
165 mainPrivacyFirst
: true,
168 "main-title": "firefox-suggest-onboarding-main-title-9",
169 "main-description": "firefox-suggest-onboarding-main-description-9",
170 "main-accept-option-label":
171 "firefox-suggest-onboarding-main-accept-option-label-2",
172 "main-accept-option-description":
173 "firefox-suggest-onboarding-main-accept-option-description-3",
174 "main-reject-option-label":
175 "firefox-suggest-onboarding-main-reject-option-label-2",
176 "main-reject-option-description":
177 "firefox-suggest-onboarding-main-reject-option-description-3",
179 skipIntroduction
: true,
183 // If the window height is smaller than this value when the dialog opens, then
184 // the dialog will open in compact mode. The dialog will not change modes while
185 // it's open even if the window height changes.
186 const COMPACT_MODE_HEIGHT
=
187 650 + // section min-height (non-compact mode)
188 2 * 32 + // 2 * --section-vertical-padding (non-compact mode)
189 44; // approximate height of the browser window's tab bar
191 // Used for test only. If links or buttons may be clicked or typed Key_Enter
192 // while translating l10n, cannot capture the events since not register listeners
193 // yet. To avoid the issue, add this flag to know the listeners are ready.
194 let resolveOnboardingReady
;
195 window
._quicksuggestOnboardingReady
= new Promise(r
=> {
196 resolveOnboardingReady
= r
;
199 document
.addEventListener("DOMContentLoaded", async () => {
200 await document
.l10n
.ready
;
203 VARIATION_MAP
[window
.arguments
[0].variationType
] || VARIATION_MAP
.a
;
205 document
.l10n
.pauseObserving();
207 await
applyVariation(variation
);
209 document
.l10n
.resumeObserving();
212 addSubmitListener(document
.getElementById("onboardingClose"), () => {
213 window
.arguments
[0].choice
= ONBOARDING_CHOICE
.CLOSE_1
;
216 addSubmitListener(document
.getElementById("onboardingNext"), () => {
219 addSubmitListener(document
.getElementById("onboardingLearnMore"), () => {
220 window
.arguments
[0].choice
= ONBOARDING_CHOICE
.LEARN_MORE_2
;
224 document
.getElementById("onboardingLearnMoreOnIntroduction"),
226 window
.arguments
[0].choice
= ONBOARDING_CHOICE
.LEARN_MORE_1
;
230 addSubmitListener(document
.getElementById("onboardingSkipLink"), () => {
231 window
.arguments
[0].choice
= ONBOARDING_CHOICE
.NOT_NOW_2
;
235 const onboardingSubmit
= document
.getElementById("onboardingSubmit");
236 const onboardingAccept
= document
.getElementById("onboardingAccept");
237 const onboardingReject
= document
.getElementById("onboardingReject");
238 function optionChangeListener() {
239 onboardingSubmit
.removeAttribute("disabled");
242 .classList
.toggle("selected", onboardingAccept
.checked
);
245 .classList
.toggle("selected", !onboardingAccept
.checked
);
247 onboardingAccept
.addEventListener("change", optionChangeListener
);
248 onboardingReject
.addEventListener("change", optionChangeListener
);
250 function submitListener() {
251 if (!onboardingAccept
.checked
&& !onboardingReject
.checked
) {
255 window
.arguments
[0].choice
= onboardingAccept
.checked
256 ? ONBOARDING_CHOICE
.ACCEPT_2
257 : ONBOARDING_CHOICE
.REJECT_2
;
260 addSubmitListener(onboardingSubmit
, submitListener
);
261 onboardingAccept
.addEventListener("keydown", e
=> {
262 if (e
.keyCode
== e
.DOM_VK_RETURN
) {
266 onboardingReject
.addEventListener("keydown", e
=> {
267 if (e
.keyCode
== e
.DOM_VK_RETURN
) {
272 if (window
.outerHeight
< COMPACT_MODE_HEIGHT
) {
273 document
.body
.classList
.add("compact");
276 resolveOnboardingReady();
279 function gotoMain(variation
) {
280 window
.arguments
[0].visitedMain
= true;
282 document
.getElementById("introduction-section").classList
.add("inactive");
283 document
.getElementById("main-section").classList
.add("active");
285 document
.body
.setAttribute("aria-labelledby", "main-title");
286 let ariaDescribedBy
= "main-description";
287 if (variation
.mainPrivacyFirst
) {
288 ariaDescribedBy
+= " main-privacy-first";
290 document
.body
.setAttribute("aria-describedby", ariaDescribedBy
);
293 async
function applyVariation(variation
) {
294 if (variation
.logoType
) {
295 for (const logo
of document
.querySelectorAll(".logo")) {
296 logo
.classList
.add(variation
.logoType
);
300 if (variation
.mainPrivacyFirst
) {
301 const label
= document
.querySelector("#main-section .privacy-first");
302 label
.classList
.add("active");
305 if (variation
.l10nUpdates
) {
306 const translatedElements
= [];
307 for (const [id
, newL10N
] of Object
.entries(variation
.l10nUpdates
)) {
308 const element
= document
.getElementById(id
);
309 document
.l10n
.setAttributes(element
, newL10N
);
310 translatedElements
.push(element
);
312 await document
.l10n
.translateElements(translatedElements
);
315 if (variation
.skipIntroduction
) {
316 document
.body
.classList
.add("skip-introduction");
320 if (variation
.introductionLayout
) {
322 .getElementById("introduction-section")
323 .classList
.add(variation
.introductionLayout
);
327 function addSubmitListener(element
, listener
) {
329 console
.warn("Element is null on addSubmitListener");
332 element
.addEventListener("click", listener
);
333 element
.addEventListener("keydown", e
=> {
334 if (e
.keyCode
== e
.DOM_VK_RETURN
) {