morgan pushed to branch base-browser-140.2.0esr-15.0-1 at The Tor Project / Applications / Tor Browser
Commits:
-
a20941b3
by Henry Wilkes at 2025-08-14T16:05:28+00:00
-
babb3f1f
by Henry Wilkes at 2025-08-14T16:05:28+00:00
-
e094fd1a
by Henry Wilkes at 2025-08-14T16:05:29+00:00
8 changed files:
- browser/components/securitylevel/content/securityLevelDialog.js
- browser/modules/SecurityLevelRestartNotification.sys.mjs
- netwerk/base/nsIPrompt.idl
- toolkit/components/prompts/content/commonDialog.js
- toolkit/components/prompts/src/Prompter.sys.mjs
- toolkit/components/windowwatcher/nsIPromptService.idl
- toolkit/content/widgets/dialog.js
- toolkit/locales/en-US/toolkit/global/base-browser.ftl
Changes:
... | ... | @@ -39,8 +39,8 @@ const gSecurityLevelDialog = { |
39 | 39 | async init() {
|
40 | 40 | const dialog = document.getElementById("security-level-dialog");
|
41 | 41 | dialog.addEventListener("dialogaccept", event => {
|
42 | + event.preventDefault();
|
|
42 | 43 | if (this._acceptButton.disabled) {
|
43 | - event.preventDefault();
|
|
44 | 44 | return;
|
45 | 45 | }
|
46 | 46 | this._commitChange();
|
... | ... | @@ -158,7 +158,41 @@ const gSecurityLevelDialog = { |
158 | 158 | /**
|
159 | 159 | * Commit the change in security level and restart the browser.
|
160 | 160 | */
|
161 | - _commitChange() {
|
|
161 | + async _commitChange() {
|
|
162 | + const doNotWarnPref = "browser.security_level.disable_warn_before_restart";
|
|
163 | + if (!Services.prefs.getBoolPref(doNotWarnPref, false)) {
|
|
164 | + const [titleString, bodyString, checkboxString, restartString] =
|
|
165 | + await document.l10n.formatValues([
|
|
166 | + { id: "security-level-restart-warning-dialog-title" },
|
|
167 | + { id: "security-level-restart-warning-dialog-body" },
|
|
168 | + { id: "restart-warning-dialog-do-not-warn-checkbox" },
|
|
169 | + { id: "restart-warning-dialog-restart-button" },
|
|
170 | + ]);
|
|
171 | + const flags =
|
|
172 | + Services.prompt.BUTTON_POS_0 * Services.prompt.BUTTON_TITLE_IS_STRING +
|
|
173 | + Services.prompt.BUTTON_POS_0_DEFAULT +
|
|
174 | + Services.prompt.BUTTON_DEFAULT_IS_DESTRUCTIVE +
|
|
175 | + Services.prompt.BUTTON_POS_1 * Services.prompt.BUTTON_TITLE_CANCEL;
|
|
176 | + const propBag = await Services.prompt.asyncConfirmEx(
|
|
177 | + window.browsingContext.top,
|
|
178 | + Services.prompt.MODAL_TYPE_CONTENT,
|
|
179 | + titleString,
|
|
180 | + bodyString,
|
|
181 | + flags,
|
|
182 | + restartString,
|
|
183 | + null,
|
|
184 | + null,
|
|
185 | + checkboxString,
|
|
186 | + false,
|
|
187 | + { useTitle: true, noIcon: true }
|
|
188 | + );
|
|
189 | + if (propBag.get("buttonNumClicked") !== 0) {
|
|
190 | + return;
|
|
191 | + }
|
|
192 | + if (propBag.get("checked")) {
|
|
193 | + Services.prefs.setBoolPref(doNotWarnPref, true);
|
|
194 | + }
|
|
195 | + }
|
|
162 | 196 | SecurityLevelPrefs.setSecurityLevelBeforeRestart(this._selectedLevel);
|
163 | 197 | Services.startup.quit(
|
164 | 198 | Services.startup.eAttemptQuit | Services.startup.eRestart
|
... | ... | @@ -42,11 +42,13 @@ export const SecurityLevelRestartNotification = { |
42 | 42 | await lazy.NotificationStrings.formatValues([
|
43 | 43 | { id: "security-level-restart-prompt-title" },
|
44 | 44 | { id: "security-level-restart-prompt-body" },
|
45 | - { id: "security-level-restart-prompt-button-restart" },
|
|
45 | + { id: "restart-warning-dialog-restart-button" },
|
|
46 | 46 | { id: "security-level-restart-prompt-button-ignore" },
|
47 | 47 | ]);
|
48 | 48 | const buttonFlags =
|
49 | 49 | Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_0 +
|
50 | + Services.prompt.BUTTON_POS_0_DEFAULT +
|
|
51 | + Services.prompt.BUTTON_DEFAULT_IS_DESTRUCTIVE +
|
|
50 | 52 | Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_1;
|
51 | 53 | |
52 | 54 | const propBag = await Services.prompt.asyncConfirmEx(
|
... | ... | @@ -67,6 +67,8 @@ interface nsIPrompt : nsISupports |
67 | 67 | |
68 | 68 | const unsigned long BUTTON_POS_1_IS_SECONDARY = 1 << 29;
|
69 | 69 | |
70 | + const unsigned long BUTTON_DEFAULT_IS_DESTRUCTIVE = 1 << 30;
|
|
71 | + |
|
70 | 72 | const unsigned long STD_OK_CANCEL_BUTTONS = (BUTTON_TITLE_OK * BUTTON_POS_0) +
|
71 | 73 | (BUTTON_TITLE_CANCEL * BUTTON_POS_1);
|
72 | 74 | const unsigned long STD_YES_NO_BUTTONS = (BUTTON_TITLE_YES * BUTTON_POS_0) +
|
... | ... | @@ -39,7 +39,7 @@ function commonDialogOnLoad() { |
39 | 39 | ["promptUserAndPass", "promptPassword"].includes(args.promptType) ||
|
40 | 40 | args.headerIconCSSValue;
|
41 | 41 | let root = document.documentElement;
|
42 | - if (needIconifiedHeader) {
|
|
42 | + if (needIconifiedHeader && !args.noIcon) {
|
|
43 | 43 | root.setAttribute("neediconheader", "true");
|
44 | 44 | }
|
45 | 45 | let title = { raw: args.title };
|
... | ... | @@ -107,6 +107,10 @@ function commonDialogOnLoad() { |
107 | 107 | dialog.setAttribute("extra1-is-secondary", true);
|
108 | 108 | }
|
109 | 109 | |
110 | + if (args.isDefaultDestructive) {
|
|
111 | + dialog.setAttribute("default-is-destructive", true);
|
|
112 | + }
|
|
113 | + |
|
110 | 114 | Dialog = new CommonDialog(args, ui);
|
111 | 115 | window.addEventListener("dialogclosing", function (aEvent) {
|
112 | 116 | if (aEvent.detail?.abort) {
|
... | ... | @@ -1507,6 +1507,10 @@ class ModalPrompter { |
1507 | 1507 | args.isExtra1Secondary = true;
|
1508 | 1508 | }
|
1509 | 1509 | |
1510 | + if (flags & Ci.nsIPrompt.BUTTON_DEFAULT_IS_DESTRUCTIVE) {
|
|
1511 | + args.isDefaultDestructive = true;
|
|
1512 | + }
|
|
1513 | + |
|
1510 | 1514 | if (flags & Ci.nsIPrompt.SHOW_SPINNER) {
|
1511 | 1515 | args.headerIconCSSValue = "url('chrome://global/skin/icons/loading.svg')";
|
1512 | 1516 | }
|
... | ... | @@ -287,6 +287,8 @@ interface nsIPromptService : nsISupports |
287 | 287 | */
|
288 | 288 | const unsigned long BUTTON_POS_1_IS_SECONDARY = 1 << 29;
|
289 | 289 | |
290 | + const unsigned long BUTTON_DEFAULT_IS_DESTRUCTIVE = 1 << 30;
|
|
291 | + |
|
290 | 292 | /**
|
291 | 293 | * Selects the standard set of OK/Cancel buttons.
|
292 | 294 | */
|
... | ... | @@ -21,7 +21,8 @@ |
21 | 21 | static get observedAttributes() {
|
22 | 22 | return super.observedAttributes.concat(
|
23 | 23 | "subdialog",
|
24 | - "extra1-is-secondary"
|
|
24 | + "extra1-is-secondary",
|
|
25 | + "default-is-destructive"
|
|
25 | 26 | );
|
26 | 27 | }
|
27 | 28 | |
... | ... | @@ -40,6 +41,12 @@ |
40 | 41 | if (name === "extra1-is-secondary" && AppConstants.XP_UNIX) {
|
41 | 42 | this.getButton("cancel").after(this.getButton("extra1"));
|
42 | 43 | }
|
44 | + if (name === "default-is-destructive") {
|
|
45 | + this.#setButtonIsDestructive(
|
|
46 | + this.getButton(this.defaultButton),
|
|
47 | + this.hasAttribute("default-is-destructive")
|
|
48 | + );
|
|
49 | + }
|
|
43 | 50 | super.attributeChangedCallback(name, oldValue, newValue);
|
44 | 51 | }
|
45 | 52 | |
... | ... | @@ -491,12 +498,17 @@ |
491 | 498 | var oldDefaultButton = this.getButton(this.defaultButton);
|
492 | 499 | if (oldDefaultButton) {
|
493 | 500 | oldDefaultButton.removeAttribute("default");
|
501 | + this.#setButtonIsDestructive(oldDefaultButton, false);
|
|
494 | 502 | }
|
495 | 503 | |
496 | 504 | var newDefaultButton = this.getButton(aNewDefault);
|
497 | 505 | if (newDefaultButton) {
|
498 | 506 | this.setAttribute("defaultButton", aNewDefault);
|
499 | 507 | newDefaultButton.setAttribute("default", "true");
|
508 | + this.#setButtonIsDestructive(
|
|
509 | + newDefaultButton,
|
|
510 | + this.hasAttribute("default-is-destructive")
|
|
511 | + );
|
|
500 | 512 | } else {
|
501 | 513 | this.setAttribute("defaultButton", "none");
|
502 | 514 | if (aNewDefault != "none") {
|
... | ... | @@ -507,6 +519,16 @@ |
507 | 519 | }
|
508 | 520 | }
|
509 | 521 | |
522 | + /**
|
|
523 | + * Mark or un-mark a button as a destructive action.
|
|
524 | + *
|
|
525 | + * @param {?Element} button - The button to mark.
|
|
526 | + * @param {boolean} isDestructive - Whether the button is destructive.
|
|
527 | + */
|
|
528 | + #setButtonIsDestructive(button, isDestructive) {
|
|
529 | + button?.classList.toggle("danger-button", isDestructive);
|
|
530 | + }
|
|
531 | + |
|
510 | 532 | _handleButtonCommand(aEvent) {
|
511 | 533 | return this._doButtonCommand(aEvent.target.getAttribute("dlgtype"));
|
512 | 534 | }
|
... | ... | @@ -177,6 +177,13 @@ security-level-preferences-bullet-limit-media = Audio and video (HTML5 media), a |
177 | 177 | security-level-preferences-bullet-disabled-javascript = JavaScript is disabled by default on all sites.
|
178 | 178 | security-level-preferences-bullet-limit-font-and-symbols-and-images = Some fonts, icons, math symbols, and images are disabled.
|
179 | 179 | |
180 | +## Security level dialog warning the user about a restart.
|
|
181 | + |
|
182 | +# '-brand-short-name' is the localized browser name, like "Tor Browser".
|
|
183 | +security-level-restart-warning-dialog-title = Restart { -brand-short-name } to apply changes?
|
|
184 | +# '-brand-short-name' is the localized browser name, like "Tor Browser".
|
|
185 | +security-level-restart-warning-dialog-body = { -brand-short-name } needs to restart to apply your changes. This will close all your windows and tabs.
|
|
186 | + |
|
180 | 187 | ## Custom security level.
|
181 | 188 | ## Some custom preferences configuration has placed the user outside one of the standard three levels.
|
182 | 189 | |
... | ... | @@ -188,5 +195,12 @@ security-level-summary-custom = Your custom browser preferences have resulted in |
188 | 195 | |
189 | 196 | security-level-restart-prompt-title = Your security level settings require a restart
|
190 | 197 | security-level-restart-prompt-body = You must restart { -brand-short-name } for your security level settings to be applied. This will close all your windows and tabs.
|
191 | -security-level-restart-prompt-button-restart = Restart
|
|
192 | 198 | security-level-restart-prompt-button-ignore = Ignore
|
199 | + |
|
200 | +## Part of the restart dialogs for security level and new identity.
|
|
201 | + |
|
202 | +# Checkbox to never show the restart warning dialog again.
|
|
203 | +restart-warning-dialog-do-not-warn-checkbox = Don’t show this warning again
|
|
204 | +# Button to restart the browser.
|
|
205 | +# '-brand-short-name' is the localized browser name, like "Tor Browser".
|
|
206 | +restart-warning-dialog-restart-button = Restart { -brand-short-name } |