callouts, because
- // callouts display in a popup context that cuts off overflow.
- &[zap-shadow]:where(div) {
- .screen[pos='callout'] .section-main::before {
- content: '';
- position: absolute;
- z-index: -1;
- inset: 7px;
- border-radius: 60px;
- filter: blur(30px);
- box-shadow: -12px -12px 40px 0 light-dark(#E7D9FF, #632FC866),
- 10px 10px 40px 0 light-dark(#FFD3B7, #FF8A5766);
- }
- }
- }
- }
-
.onboardingContainer,
.onboardingContainer .outer-wrapper {
// Override the element transitions from aboutwelcome.scss
diff -urN firefox-157.0-orig/browser/components/asrouter/content-src/styles/_multistage.scss firefox-157.0/browser/components/asrouter/content-src/styles/_multistage.scss
--- firefox-157.0-orig/browser/components/asrouter/content-src/styles/_multistage.scss 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/asrouter/content-src/styles/_multistage.scss 2026-10-05 09:09:22 +0900
@@ -637,7 +637,6 @@
.main-content {
background-color: var(--background-color-canvas);
- // Fallback value can be removed after Nova has reached release
border-radius: var(--border-radius-xlarge, 16px);
box-shadow: 0 2px 14px 0 rgba(0, 0, 0, 20%);
display: flex;
@@ -750,7 +749,6 @@
overflow: hidden;
&.light-text {
- // fallback values can be removed after Nova has reached release
--text-color: var(--color-violet-desaturated-0, rgb(251, 251, 254));
--button-text-color-primary: #252428;
--button-text-color-primary-hover: #252428;
@@ -761,7 +759,6 @@
}
&.dark-text {
- // fallback values can be removed after Nova has reached release
--text-color: var(--color-violet-desaturated-90, rgb(21, 20, 26));
--button-text-color-primary: #FFF;
--button-text-color-primary-hover: #FFF;
@@ -791,30 +788,6 @@
}
}
- @media (not (prefers-contrast)) and (-moz-pref('browser.nova.enabled')) {
- // Nova gradient border
- &.zap-border {
- .main-content {
- background: linear-gradient(96deg, #B89CFF 20.68%, #FF9565 79.34%) border-box border-area, image(var(--background-color-box)) padding-box;
- border: 1px solid transparent;
- }
- }
-
- // Nova gradient shadow
- &.zap-shadow {
- .section-main::before {
- content: '';
- position: absolute;
- z-index: -1;
- inset: 7px;
- border-radius: 60px;
- box-shadow: -12px -12px 70px 0 light-dark(#E7D9FF, rgba(99, 47, 200, 80%)),
- 10px 10px 70px 0 light-dark(#FFD3B7, rgba(255, 138, 87, 80%));
- transition: var(--transition);
- }
- }
- }
-
&.with-video {
justify-content: center;
background: none;
@@ -1081,25 +1054,6 @@
margin: auto;
pointer-events: none;
}
-
- @media (not (prefers-contrast)) and (-moz-pref('browser.nova.enabled')) {
- // Nova gradient border for split layout
- &.zap-border {
- &::before {
- background: linear-gradient(96deg, #B89CFF 20.68%, #FF9565 79.34%) border-box border-area, image(var(--background-color-box)) padding-box;
- border: 1px solid transparent;
- }
- }
-
- // Nova gradient shadow for split layout
- &.zap-shadow {
- &::before {
- box-shadow: -12px -12px 70px 0 light-dark(#E7D9FF, rgba(99, 47, 200, 80%)),
- 10px 10px 70px 0 light-dark(#FFD3B7, rgba(255, 138, 87, 80%));
- transition: var(--transition);
- }
- }
- }
}
#content-tiles-container {
@@ -2452,13 +2406,6 @@
top: -10px;
line-height: 1;
- @media (-moz-pref('browser.nova.enabled')) {
- border-radius: var(--border-radius-xlarge);
- right: 10px;
- top: -12px;
- align-content: center;
- }
-
&.centered {
/* stylelint-disable-next-line */
border-radius: 8px 8px 0 0;
@@ -2471,27 +2418,12 @@
width: 100%;
box-sizing: border-box;
- @media (-moz-pref('browser.nova.enabled')) {
- top: -5px;
- align-content: center;
- }
-
&.backup {
/* stylelint-disable-next-line */
border-radius: 10px 10px 0 0;
background-color: var(--picker-backup-flair-background);
color: var(--picker-backup-flair-color);
- @media (-moz-pref('browser.nova.enabled')) {
- border-radius: var(--border-radius-xlarge);
- background-color: var(--button-background-color-primary);
- color: var(--button-text-color-primary);
- padding-inline: 12px;
- align-content: center;
- top: -9px;
- width: unset;
- }
-
&.spacer {
background-color: transparent;
}
diff -urN firefox-157.0-orig/browser/components/asrouter/modules/OnboardingMessageProvider.sys.mjs firefox-157.0/browser/components/asrouter/modules/OnboardingMessageProvider.sys.mjs
--- firefox-157.0-orig/browser/components/asrouter/modules/OnboardingMessageProvider.sys.mjs 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/asrouter/modules/OnboardingMessageProvider.sys.mjs 2026-10-05 09:07:55 +0900
@@ -179,7 +179,7 @@
},
},
targeting:
- "'browser.nova.enabled'|preferenceValue != true && source == 'app_menu' && os.isWindows && os.windowsVersion >= 10 && !isDefaultBrowser && !hasActiveEnterprisePolicies && 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features' | preferenceValue != false",
+ "false != true && source == 'app_menu' && os.isWindows && os.windowsVersion >= 10 && !isDefaultBrowser && !hasActiveEnterprisePolicies && 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features' | preferenceValue != false",
trigger: {
id: "menuOpened",
},
@@ -232,7 +232,7 @@
},
},
targeting:
- "'browser.nova.enabled'|preferenceValue != true && source == 'app_menu' && os.isMac && !isDefaultBrowser && !hasActiveEnterprisePolicies && 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features' | preferenceValue != false",
+ "false != true && source == 'app_menu' && os.isMac && !isDefaultBrowser && !hasActiveEnterprisePolicies && 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features' | preferenceValue != false",
trigger: {
id: "menuOpened",
},
@@ -285,7 +285,7 @@
},
},
targeting:
- "'browser.nova.enabled'|preferenceValue == true && source == 'app_menu' && os.isWindows && os.windowsVersion >= 10 && !isDefaultBrowser && !hasActiveEnterprisePolicies && 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features'| preferenceValue != false",
+ "'false == true && source == 'app_menu' && os.isWindows && os.windowsVersion >= 10 && !isDefaultBrowser && !hasActiveEnterprisePolicies && 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features'| preferenceValue != false",
trigger: {
id: "menuOpened",
},
@@ -340,7 +340,7 @@
},
},
targeting:
- "'browser.nova.enabled'|preferenceValue == true && source == 'app_menu' && os.isMac && !isDefaultBrowser && !hasActiveEnterprisePolicies && 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features'| preferenceValue != false",
+ "false == true && source == 'app_menu' && os.isMac && !isDefaultBrowser && !hasActiveEnterprisePolicies && 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features'| preferenceValue != false",
trigger: {
id: "menuOpened",
},
diff -urN firefox-157.0-orig/browser/components/asrouter/tests/NimbusRolloutMessageProvider.sys.mjs firefox-157.0/browser/components/asrouter/tests/NimbusRolloutMessageProvider.sys.mjs
--- firefox-157.0-orig/browser/components/asrouter/tests/NimbusRolloutMessageProvider.sys.mjs 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/asrouter/tests/NimbusRolloutMessageProvider.sys.mjs 2026-10-05 09:10:21 +0900
@@ -1298,7 +1298,7 @@
lifetime: 1,
},
targeting:
- "source == 'startup' && firefoxVersion >= 155 && firefoxVersion < 157 && 'browser.nova.enabled'|preferenceValue && !activeNotifications && !'messaging-system-action.novaEarlyAccess.gotIt'|preferenceValue && !'messaging-system-action.novaEarlyAccess.feedback'|preferenceValue",
+ "source == 'startup' && firefoxVersion >= 155 && firefoxVersion < 157 && false && !activeNotifications && !'messaging-system-action.novaEarlyAccess.gotIt'|preferenceValue && !'messaging-system-action.novaEarlyAccess.feedback'|preferenceValue",
},
{
// Nimbus slug: smart-window-whats-new-select-text:control
diff -urN firefox-157.0-orig/browser/components/contextualidentity/content/briefcase.svg firefox-157.0/browser/components/contextualidentity/content/briefcase.svg
--- firefox-157.0-orig/browser/components/contextualidentity/content/briefcase.svg 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/contextualidentity/content/briefcase.svg 2026-10-05 08:45:31 +0900
@@ -5,10 +5,6 @@
.nova { display: none; }
-@media -moz-pref("browser.nova.enabled") {
- .proton { display: none; }
- .nova { display: revert; }
-}
.nova { display: none; }
-@media -moz-pref("browser.nova.enabled") {
- .proton { display: none; }
- .nova { display: revert; }
-}
diff -urN firefox-157.0-orig/browser/components/contextualidentity/content/container-select.css firefox-157.0/browser/components/contextualidentity/content/container-select.css
--- firefox-157.0-orig/browser/components/contextualidentity/content/container-select.css 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/contextualidentity/content/container-select.css 2026-10-05 08:45:40 +0900
@@ -24,10 +24,3 @@
overflow: hidden;
text-overflow: ellipsis;
}
-
-@media -moz-pref("browser.nova.enabled") {
- .select-option-icon,
- panel-item[icon]::part(button) {
- fill: var(--identity-fill-color);
- }
-}
diff -urN firefox-157.0-orig/browser/components/contextualidentity/content/dollar.svg firefox-157.0/browser/components/contextualidentity/content/dollar.svg
--- firefox-157.0-orig/browser/components/contextualidentity/content/dollar.svg 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/contextualidentity/content/dollar.svg 2026-10-05 08:45:29 +0900
@@ -5,10 +5,6 @@
diff -urN firefox-157.0-orig/browser/components/contextualidentity/content/fingerprint.svg firefox-157.0/browser/components/contextualidentity/content/fingerprint.svg
--- firefox-157.0-orig/browser/components/contextualidentity/content/fingerprint.svg 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/contextualidentity/content/fingerprint.svg 2026-10-05 08:45:21 +0900
@@ -5,10 +5,6 @@
diff -urN firefox-157.0-orig/browser/components/contextualidentity/content/food.svg firefox-157.0/browser/components/contextualidentity/content/food.svg
--- firefox-157.0-orig/browser/components/contextualidentity/content/food.svg 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/contextualidentity/content/food.svg 2026-10-05 08:45:19 +0900
@@ -5,10 +5,6 @@
.toolbarbutton-icon {
- box-sizing: content-box;
- padding: var(--identity-icon-inset);
- border-radius: var(--border-radius-circle);
- background-color: var(--identity-fill-tint);
- background-origin: content-box;
- fill: var(--identity-fill-color);
- }
-}
-
.menuitem-iconic[data-usercontextid] {
--menuitem-icon: var(--identity-icon);
--menuitem-icon-fill: var(--identity-icon-color);
-
- /* When nova is enabled the container icon sits inside a round tinted
- background, mirroring the about:preferences#containers list. */
- @media -moz-pref("browser.nova.enabled") {
- --menuitem-icon-fill: var(--identity-fill-color);
-
- > .menu-icon {
- width: var(--icon-size-large);
- height: var(--icon-size-large);
- padding: var(--identity-icon-inset);
- border-radius: var(--border-radius-circle);
- overflow-clip-margin: border-box;
- background-color: var(--identity-fill-tint);
- }
- }
}
diff -urN firefox-157.0-orig/browser/components/contextualidentity/content/vacation.svg firefox-157.0/browser/components/contextualidentity/content/vacation.svg
--- firefox-157.0-orig/browser/components/contextualidentity/content/vacation.svg 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/contextualidentity/content/vacation.svg 2026-10-05 08:45:37 +0900
@@ -5,10 +5,6 @@
-40);
// proton keeps the legacy literal on --identity-icon-color.
const cssVar = novaEnabled
diff -urN firefox-157.0-orig/browser/components/contextualidentity/test/browser/browser_switchTab_across_user_context.js firefox-157.0/browser/components/contextualidentity/test/browser/browser_switchTab_across_user_context.js
--- firefox-157.0-orig/browser/components/contextualidentity/test/browser/browser_switchTab_across_user_context.js 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/contextualidentity/test/browser/browser_switchTab_across_user_context.js 2026-10-05 08:44:27 +0900
@@ -67,7 +67,7 @@
"Urlbar results contain the switch to tab from another container."
);
let element = UrlbarTestUtils.getRowAt(window, resultIndex);
- if (Services.prefs.getBoolPref("browser.nova.enabled", false)) {
+ if (false) {
let chiclet = element.querySelector(".urlbarView-user-context");
Assert.ok(chiclet, "The user-context chiclet should exist");
Assert.ok(
@@ -138,7 +138,7 @@
});
let row = UrlbarTestUtils.getRowAt(window, 1);
- if (Services.prefs.getBoolPref("browser.nova.enabled", false)) {
+ if (false) {
let chiclet = row.querySelector(".urlbarView-user-context");
Assert.ok(chiclet, "The user-context chiclet should exist");
Assert.ok(
diff -urN firefox-157.0-orig/browser/components/controlcenter/content/components/breach-alert-panel.css firefox-157.0/browser/components/controlcenter/content/components/breach-alert-panel.css
--- firefox-157.0-orig/browser/components/controlcenter/content/components/breach-alert-panel.css 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/controlcenter/content/components/breach-alert-panel.css 2026-10-05 08:33:15 +0900
@@ -21,14 +21,6 @@
gap: var(--space-small);
align-self: stretch;
border-radius: var(--border-radius-medium);
-
- @media -moz-pref("browser.nova.enabled") {
- background-color: transparent;
- align-items: flex-start;
- gap: var(--space-medium);
- border: 1px solid var(--border-color);
- border-radius: var(--border-radius-large);
- }
}
.main {
@@ -37,10 +29,6 @@
align-items: center;
gap: var(--space-large);
align-self: stretch;
-
- @media -moz-pref("browser.nova.enabled") {
- align-items: flex-start;
- }
}
.content {
@@ -61,17 +49,6 @@
}
}
-.fox-icon-legacy {
- @media -moz-pref("browser.nova.enabled") {
- display: none;
- }
-}
-
.shield-icon {
display: none;
-
- @media -moz-pref("browser.nova.enabled") {
- width: var(--size-image-medium);
- display: revert;
- }
}
diff -urN firefox-157.0-orig/browser/components/customizableui/CustomizableUI.sys.mjs firefox-157.0/browser/components/customizableui/CustomizableUI.sys.mjs
--- firefox-157.0-orig/browser/components/customizableui/CustomizableUI.sys.mjs 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/customizableui/CustomizableUI.sys.mjs 2026-10-05 08:30:34 +0900
@@ -42,7 +42,6 @@
const kPrefDrawInTitlebar = "browser.tabs.inTitlebar";
const kPrefUIDensity = "browser.uidensity";
const kPrefAutoTouchMode = "browser.touchmode.auto";
-const kPrefNovaEnabled = "browser.nova.enabled";
const kPrefAutoHideDownloadsButton = "browser.download.autohideButton";
const kPrefProtonToolbarVersion = "browser.proton.toolbar.version";
const kPrefHomeButtonUsed = "browser.engagement.home-button.has-used";
@@ -466,7 +465,7 @@
.getDefaultBranch("")
.setBoolPref(
kPrefAutoTouchMode,
- !Services.prefs.getBoolPref(kPrefNovaEnabled, false)
+ !false
);
},
diff -urN firefox-157.0-orig/browser/components/customizableui/content/panelUI.js firefox-157.0/browser/components/customizableui/content/panelUI.js
--- firefox-157.0-orig/browser/components/customizableui/content/panelUI.js 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/customizableui/content/panelUI.js 2026-10-05 08:29:53 +0900
@@ -468,10 +468,6 @@
this.updateNotifications();
break;
case "click": {
- let novaFxaButton = aEvent.target.closest("#appMenu-nova-fxa-label");
- if (novaFxaButton) {
- gSync.toggleAccountPanel(novaFxaButton, aEvent);
- }
break;
}
case "command":
@@ -868,34 +864,6 @@
}
items.appendChild(fragment);
-
- if (Services.prefs.getBoolPref("browser.nova.enabled", false)) {
- let switchDeviceButton = items.querySelector("#appMenu_helpSwitchDevice");
- if (switchDeviceButton) {
- const HTML_NS = "http://www.w3.org/1999/xhtml";
- let novaPromo = document.createElementNS(HTML_NS, "moz-promo");
- novaPromo.id = "appMenu-nova-switch-device-promo";
- novaPromo.setAttribute("type", "vibrant");
- novaPromo.setAttribute(
- "data-l10n-id",
- "appmenu-nova-switch-device-promo"
- );
- novaPromo.setAttribute("data-l10n-attrs", "message");
-
- let link = document.createElementNS(HTML_NS, "a");
- link.id = "appMenu-nova-switch-device-link";
- link.slot = "support-link";
- link.href = "#";
- link.setAttribute("data-l10n-id", "appmenu-nova-switch-device-link");
- link.addEventListener("click", e => {
- e.preventDefault();
- openSwitchingDevicesPage();
- });
- novaPromo.appendChild(link);
-
- switchDeviceButton.replaceWith(novaPromo);
- }
- }
},
_onHelpCommand(aEvent) {
@@ -1310,25 +1278,12 @@
messageIDs[notification.id]
);
- const isNovaUpdateRestart =
- notification.id === "update-restart" &&
- Services.prefs.getBoolPref("browser.nova.enabled", false);
-
// Drop the description in private windows
const noDescription =
- isNovaUpdateRestart && PrivateBrowsingUtils.isWindowPrivate(window);
+ PrivateBrowsingUtils.isWindowPrivate(window);
this._panelBannerItem.toggleAttribute("no-description", noDescription);
- if (isNovaUpdateRestart) {
- this._panelBannerItem.setAttribute(
- "aria-labelledby",
- noDescription
- ? "appMenu-update-banner-title"
- : "appMenu-update-banner-title appMenu-update-banner-description"
- );
- } else {
this._panelBannerItem.removeAttribute("aria-labelledby");
- }
this._panelBannerItem.setAttribute("notificationid", notification.id);
this._panelBannerItem.hidden = false;
diff -urN firefox-157.0-orig/browser/components/customizableui/test/browser.toml firefox-157.0/browser/components/customizableui/test/browser.toml
--- firefox-157.0-orig/browser/components/customizableui/test/browser.toml 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/customizableui/test/browser.toml 2026-10-05 08:26:58 +0900
@@ -339,10 +339,6 @@
["browser_newtab_button_customizemode.js"]
-["browser_novaHelpSwitchDevicePromo.js"]
-
-["browser_novaHelpViewLayout.js"]
-
["browser_open_from_popup.js"]
["browser_open_in_lazy_tab.js"]
@@ -369,8 +365,6 @@
["browser_panelUINotifications_multiWindow.js"]
-["browser_panelUINotifications_novaUpdateBanner.js"]
-
["browser_panel_keyboard_navigation.js"]
skip-if = [
"nova", # Bug 2058027
@@ -461,10 +455,6 @@
"os == 'win'",
]
-["browser_uidensity_auto_compact.js"]
-
-["browser_uidensity_auto_touch.js"]
-
["browser_unified_extensions_reset.js"]
["browser_vertical_tabs_customize_navbar.js"]
diff -urN firefox-157.0-orig/browser/components/customizableui/test/browser_970511_undo_restore_default.js firefox-157.0/browser/components/customizableui/test/browser_970511_undo_restore_default.js
--- firefox-157.0-orig/browser/components/customizableui/test/browser_970511_undo_restore_default.js 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/customizableui/test/browser_970511_undo_restore_default.js 2026-10-05 08:25:41 +0900
@@ -12,8 +12,6 @@
await SpecialPowers.pushPrefEnv({
set: [
["browser.compactmode.show", true],
- // The density dropdown is only shown when Nova is disabled.
- ["browser.nova.enabled", false],
],
});
let stopReloadButtonId = "stop-reload-button";
diff -urN firefox-157.0-orig/browser/components/customizableui/test/browser_customizemode_uidensity.js firefox-157.0/browser/components/customizableui/test/browser_customizemode_uidensity.js
--- firefox-157.0-orig/browser/components/customizableui/test/browser_customizemode_uidensity.js 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/customizableui/test/browser_customizemode_uidensity.js 2026-10-05 08:24:39 +0900
@@ -162,11 +162,6 @@
}
add_task(async function test_touch_mode_menuitem() {
- // The density dropdown is only shown when Nova is disabled.
- await SpecialPowers.pushPrefEnv({
- set: [["browser.nova.enabled", false]],
- });
-
// browser.touchmode.auto's default tracks whether nova is enabled and is set
// once at startup (see CustomizableUI._setAutoTouchModeDefault). Re-derive it
// now that nova is forced off, so the "checked by default" and
@@ -245,42 +240,6 @@
await endCustomizing();
await SpecialPowers.popPrefEnv();
});
-
-// When Nova is enabled, a link to the Window Density section of
-// about:preferences is shown instead of the density dropdown.
-add_task(async function test_uidensity_link() {
- await SpecialPowers.pushPrefEnv({
- set: [["browser.nova.enabled", true]],
- });
-
- await startCustomizing();
-
- let button = document.getElementById("customization-uidensity-button");
- let link = document.getElementById("customization-uidensity-link");
-
- ok(button.hidden, "The density dropdown button is hidden when Nova is on");
- ok(!link.hidden, "The density link is visible when Nova is on");
-
- let waitForNewTab = BrowserTestUtils.waitForNewTab(gBrowser, url =>
- url.startsWith("about:preferences")
- );
- link.click();
- let prefsTab = await waitForNewTab;
-
- ok(
- gBrowser.currentURI.spec.startsWith("about:preferences#appearance"),
- "The link opened about:preferences#appearance"
- );
- BrowserTestUtils.removeTab(prefsTab);
-
- // Wait for customize mode to be re-entered now that the customize tab is
- // active. This is needed for endCustomizing() to work properly.
- await TestUtils.waitForCondition(() =>
- document.documentElement.hasAttribute("customizing")
- );
- await endCustomizing();
- await SpecialPowers.popPrefEnv();
-});
add_task(async function cleanup() {
await endCustomizing();
diff -urN firefox-157.0-orig/browser/components/customizableui/test/browser_help_panel_cloning.js firefox-157.0/browser/components/customizableui/test/browser_help_panel_cloning.js
--- firefox-157.0-orig/browser/components/customizableui/test/browser_help_panel_cloning.js 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/customizableui/test/browser_help_panel_cloning.js 2026-10-05 08:27:26 +0900
@@ -50,7 +50,7 @@
// browser_novaHelpSwitchDevicePromo.js, so skip it here.
if (
helpMenuPopupItem.id == "helpSwitchDevice" &&
- Services.prefs.getBoolPref("browser.nova.enabled", false)
+ false
) {
info(
"Skipping helpSwitchDevice: replaced by Nova promo " +
diff -urN firefox-157.0-orig/browser/components/customizableui/test/browser_novaHelpSwitchDevicePromo.js firefox-157.0/browser/components/customizableui/test/browser_novaHelpSwitchDevicePromo.js
--- firefox-157.0-orig/browser/components/customizableui/test/browser_novaHelpSwitchDevicePromo.js 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/customizableui/test/browser_novaHelpSwitchDevicePromo.js 1970-01-01 09:00:00 +0900
@@ -1,104 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/ */
-
-"use strict";
-
-add_setup(async function () {
- await SpecialPowers.pushPrefEnv({ set: [["browser.nova.enabled", true]] });
-});
-
-registerCleanupFunction(async function () {
- await SpecialPowers.popPrefEnv();
-});
-
-async function openHelpView() {
- await gCUITestUtils.openMainMenu();
- PanelUI.showHelpView(document.getElementById("PanelUI-menu-button"));
- let helpView = document.getElementById("PanelUI-helpView");
- await BrowserTestUtils.waitForEvent(helpView, "ViewShowing");
- return helpView;
-}
-
-add_task(async function testNovaPromoReplacesHelpSwitchDevice() {
- let helpView = await openHelpView();
-
- ok(
- !helpView.querySelector("#appMenu_helpSwitchDevice"),
- "appMenu_helpSwitchDevice should not be present when nova is enabled"
- );
-
- let promo = helpView.querySelector("#appMenu-nova-switch-device-promo");
- ok(promo, "Nova switch device promo should be present when nova is enabled");
-
- await gCUITestUtils.hideMainMenu();
-});
-
-add_task(async function testSwitchDeviceButtonPresentWithoutNova() {
- await SpecialPowers.pushPrefEnv({ set: [["browser.nova.enabled", false]] });
-
- let helpView = await openHelpView();
-
- ok(
- helpView.querySelector("#appMenu_helpSwitchDevice"),
- "appMenu_helpSwitchDevice should be present when nova is disabled"
- );
- ok(
- !helpView.querySelector("#appMenu-nova-switch-device-promo"),
- "Nova switch device promo should not be present when nova is disabled"
- );
-
- await gCUITestUtils.hideMainMenu();
- await SpecialPowers.popPrefEnv();
-});
-
-add_task(
- async function testNovaPromoSupportLinkCallsOpenSwitchingDevicesPage() {
- let switchingDevicesPageOpened = false;
- let originalFn = window.openSwitchingDevicesPage;
- window.openSwitchingDevicesPage = () => {
- switchingDevicesPageOpened = true;
- };
-
- let helpView = await openHelpView();
-
- let link = helpView.querySelector("#appMenu-nova-switch-device-link");
- ok(link, "Nova switch device support link should exist");
- link.click();
-
- ok(
- switchingDevicesPageOpened,
- "openSwitchingDevicesPage should be called when the support link is clicked"
- );
-
- window.openSwitchingDevicesPage = originalFn;
- await gCUITestUtils.hideMainMenu();
- }
-);
-
-add_task(async function testNovaPromoLinkOpensForegroundTab() {
- await SpecialPowers.pushPrefEnv({
- set: [["app.support.baseURL", "https://example.com/support/"]],
- });
-
- let helpView = await openHelpView();
-
- let tabPromise = BrowserTestUtils.waitForNewTab(
- gBrowser,
- url => url.startsWith("https://example.com/support/switching-devices"),
- false
- );
- helpView.querySelector("#appMenu-nova-switch-device-link").click();
- let tab = await tabPromise;
-
- Assert.equal(
- gBrowser.selectedTab,
- tab,
- "The switching devices page should open in a foreground tab"
- );
-
- BrowserTestUtils.removeTab(tab);
- if (PanelUI.panel.state == "open") {
- await gCUITestUtils.hideMainMenu();
- }
- await SpecialPowers.popPrefEnv();
-});
diff -urN firefox-157.0-orig/browser/components/customizableui/test/browser_novaHelpViewLayout.js firefox-157.0/browser/components/customizableui/test/browser_novaHelpViewLayout.js
--- firefox-157.0-orig/browser/components/customizableui/test/browser_novaHelpViewLayout.js 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/customizableui/test/browser_novaHelpViewLayout.js 1970-01-01 09:00:00 +0900
@@ -1,173 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/ */
-
-"use strict";
-
-/* global PanelUI */
-
-add_setup(async function () {
- // menu_referralsPage is hidden by default, but pin it so that a future
- // default flip does not silently change the expected layout below.
- await SpecialPowers.pushPrefEnv({
- set: [["browser.referrals.enabled", false]],
- });
-});
-
-async function openHelpView() {
- await gCUITestUtils.openMainMenu();
- PanelUI.showHelpView(document.getElementById("PanelUI-menu-button"));
- let helpView = document.getElementById("PanelUI-helpView");
- // ViewShown rather than ViewShowing: the tasks below measure geometry, and
- // the view is not laid out yet at ViewShowing.
- await BrowserTestUtils.waitForEvent(helpView, "ViewShown");
- return helpView;
-}
-
-function getLayout(helpView) {
- let items = helpView.querySelector(".panel-subview-body");
- return [...items.children].map(node => node.id || node.localName);
-}
-
-function expectedLayout(lastItem) {
- let expected = [
- "appMenu_menu_openHelp",
- "appMenu_help_reportBrokenSite",
- "appMenu_menu_HelpPopup_reportPhishingtoolmenu",
- "toolbarseparator",
- "appMenu_helpSafeMode",
- "appMenu_troubleShooting",
- "toolbarseparator",
- "appMenu_feedbackPage",
- lastItem,
- ];
- // macOS relocates About into the native application menu, which leaves the
- // last group empty and so drops its separator too.
- if (!document.getElementById("aboutName").hidden) {
- expected.push("toolbarseparator", "appMenu_aboutName");
- }
- return expected;
-}
-
-add_task(async function testHelpViewOrderWithNova() {
- await SpecialPowers.pushPrefEnv({ set: [["browser.nova.enabled", true]] });
-
- let helpView = await openHelpView();
-
- Assert.deepEqual(
- getLayout(helpView),
- expectedLayout("appMenu-nova-switch-device-promo"),
- "The Help and Report subview is grouped and ordered as designed"
- );
-
- await gCUITestUtils.hideMainMenu();
- await SpecialPowers.popPrefEnv();
-});
-
-add_task(async function testHelpViewOrderWithoutNova() {
- await SpecialPowers.pushPrefEnv({ set: [["browser.nova.enabled", false]] });
-
- let helpView = await openHelpView();
-
- // The layout is deliberately not gated on browser.nova.enabled, matching
- // bug 2023762, so the only difference here is the promo not replacing
- // the Switch device item.
- Assert.deepEqual(
- getLayout(helpView),
- expectedLayout("appMenu_helpSwitchDevice"),
- "The same layout applies when the Nova promo is not substituted in"
- );
-
- await gCUITestUtils.hideMainMenu();
- await SpecialPowers.popPrefEnv();
-});
-
-add_task(async function testSeparatorsAreVisible() {
- await SpecialPowers.pushPrefEnv({ set: [["browser.nova.enabled", true]] });
-
- let helpView = await openHelpView();
-
- let separators = helpView.querySelectorAll(
- ".panel-subview-body > toolbarseparator"
- );
- let expectedCount = expectedLayout("appMenu-nova-switch-device-promo").filter(
- id => id == "toolbarseparator"
- ).length;
- Assert.equal(
- separators.length,
- expectedCount,
- `${expectedCount} group separators were inserted`
- );
- for (let separator of separators) {
- Assert.ok(!separator.hidden, "The separator is not hidden");
- Assert.greater(
- separator.getBoundingClientRect().height,
- 0,
- "The separator takes up vertical space"
- );
- }
-
- await gCUITestUtils.hideMainMenu();
- await SpecialPowers.popPrefEnv();
-});
-
-add_task(async function testReportBrokenSiteHasCaret() {
- await SpecialPowers.pushPrefEnv({ set: [["browser.nova.enabled", true]] });
-
- let helpView = await openHelpView();
-
- let button = helpView.querySelector("#appMenu_help_reportBrokenSite");
- let content = getComputedStyle(button, "::after").content;
- let expected = Services.locale.isAppLocaleRTL
- ? "arrow-left.svg"
- : "arrow-right.svg";
- Assert.ok(
- content.includes(expected),
- `Report Broken Site renders a subview caret, got ${content}`
- );
-
- await gCUITestUtils.hideMainMenu();
- await SpecialPowers.popPrefEnv();
-});
-
-add_task(async function testNoSeparatorBeforePromo() {
- await SpecialPowers.pushPrefEnv({ set: [["browser.nova.enabled", true]] });
-
- let helpView = await openHelpView();
-
- let promo = helpView.querySelector("#appMenu-nova-switch-device-promo");
- Assert.ok(promo, "The Nova switch device promo is present");
- Assert.equal(
- promo.previousElementSibling.id,
- "appMenu_feedbackPage",
- "The promo sits directly below Share ideas and feedback"
- );
- Assert.notEqual(
- promo.previousElementSibling.localName,
- "toolbarseparator",
- "There is no divider between the feedback item and the promo"
- );
-
- await gCUITestUtils.hideMainMenu();
- await SpecialPowers.popPrefEnv();
-});
-
-add_task(async function testUngroupedItemsAreAppendedLast() {
- // Nothing lands in the fallback bucket by default, so add an item that no
- // group lists to pin down where a future Help menu addition shows up.
- let extra = document.createXULElement("menuitem");
- extra.id = "helpViewFallbackTestItem";
- extra.setAttribute("label", "Fallback test item");
- document.getElementById("menu_HelpPopup").appendChild(extra);
- registerCleanupFunction(() => extra.remove());
-
- let helpView = await openHelpView();
-
- Assert.equal(
- getLayout(helpView).at(-1),
- "appMenu_helpViewFallbackTestItem",
- "An item that no group lists is appended after the last group"
- );
-
- await gCUITestUtils.hideMainMenu();
- extra.remove();
-});
diff -urN firefox-157.0-orig/browser/components/customizableui/test/browser_panelUINotifications_novaUpdateBanner.js firefox-157.0/browser/components/customizableui/test/browser_panelUINotifications_novaUpdateBanner.js
--- firefox-157.0-orig/browser/components/customizableui/test/browser_panelUINotifications_novaUpdateBanner.js 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/customizableui/test/browser_panelUINotifications_novaUpdateBanner.js 1970-01-01 09:00:00 +0900
@@ -1,121 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/ */
-
-"use strict";
-
-const { AppMenuNotifications } = ChromeUtils.importESModule(
- "resource://gre/modules/AppMenuNotifications.sys.mjs"
-);
-
-add_setup(async function () {
- await SpecialPowers.pushPrefEnv({ set: [["browser.nova.enabled", true]] });
-});
-
-registerCleanupFunction(async function () {
- await SpecialPowers.popPrefEnv();
-});
-
-async function showBannerInNewWindow(notificationId) {
- let win = await BrowserTestUtils.openNewBrowserWindow();
- AppMenuNotifications.showBadgeOnlyNotification(notificationId);
-
- let menuButton = win.document.getElementById("PanelUI-menu-button");
- let shown = BrowserTestUtils.waitForEvent(win.PanelUI.mainView, "ViewShown");
- menuButton.click();
- await shown;
-
- let banner = win.document.getElementById("appMenu-update-banner");
- await BrowserTestUtils.waitForMutationCondition(
- banner,
- { attributes: true, attributeFilter: ["notificationid", "hidden"] },
- () =>
- !banner.hidden && banner.getAttribute("notificationid") === notificationId
- );
-
- return { win, banner };
-}
-
-async function cleanup(win) {
- AppMenuNotifications.removeNotification(/.*/);
- await BrowserTestUtils.closeWindow(win);
-}
-
-add_task(async function testUpdateRestartUsesAriaLabelledby() {
- let { win, banner } = await showBannerInNewWindow("update-restart");
-
- is(
- banner.getAttribute("aria-labelledby"),
- "appMenu-update-banner-title appMenu-update-banner-description",
- "Banner should reference inline title + description via aria-labelledby"
- );
-
- let inner = banner.querySelector(".appMenu-update-banner-text");
- ok(inner, "Two-line text container should exist in markup");
- ok(
- BrowserTestUtils.isVisible(inner),
- "Two-line title/description should be visible for update-restart"
- );
-
- await cleanup(win);
-});
-
-add_task(async function testUpdateRestartClickCallsMainAction() {
- let mainActionCalled = false;
- let mainAction = {
- callback: () => {
- mainActionCalled = true;
- },
- };
-
- let win = await BrowserTestUtils.openNewBrowserWindow();
- AppMenuNotifications.showNotification("update-restart", mainAction, null, {
- dismissed: true,
- });
-
- let menuButton = win.document.getElementById("PanelUI-menu-button");
- let shown = BrowserTestUtils.waitForEvent(win.PanelUI.mainView, "ViewShown");
- menuButton.click();
- await shown;
-
- let banner = win.document.getElementById("appMenu-update-banner");
- await BrowserTestUtils.waitForMutationCondition(
- banner,
- { attributes: true, attributeFilter: ["notificationid", "hidden"] },
- () =>
- !banner.hidden &&
- banner.getAttribute("notificationid") === "update-restart"
- );
-
- banner.click();
- ok(mainActionCalled, "Main action callback fires when the banner is clicked");
-
- await cleanup(win);
-});
-
-add_task(async function testOtherUpdateStatesKeepLabel() {
- for (let id of [
- "update-available",
- "update-downloading",
- "update-manual",
- "update-unsupported",
- ]) {
- let { win, banner } = await showBannerInNewWindow(id);
-
- ok(
- !banner.hasAttribute("aria-labelledby"),
- `Banner should not set aria-labelledby for ${id}`
- );
- ok(
- banner.hasAttribute("data-l10n-id"),
- `Banner should have data-l10n-id for ${id} under nova`
- );
-
- let inner = banner.querySelector(".appMenu-update-banner-text");
- ok(
- !BrowserTestUtils.isVisible(inner),
- `Two-line title/description should be hidden for ${id}`
- );
-
- await cleanup(win);
- }
-});
diff -urN firefox-157.0-orig/browser/components/customizableui/test/browser_uidensity_auto_compact.js firefox-157.0/browser/components/customizableui/test/browser_uidensity_auto_compact.js
--- firefox-157.0-orig/browser/components/customizableui/test/browser_uidensity_auto_compact.js 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/customizableui/test/browser_uidensity_auto_compact.js 1970-01-01 09:00:00 +0900
@@ -1,550 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-"use strict";
-
-// Tests the dynamic auto-compact behavior of gUIDensity, which overrides the
-// uidensity to "compact" in small windows under nova, based on the
-// browser.compactmode.auto.threshold pref (Bug 2044082).
-
-const PREF_UI_DENSITY = "browser.uidensity";
-const PREF_NOVA = "browser.nova.enabled";
-const PREF_THRESHOLD = "browser.compactmode.auto.threshold";
-
-// Returns a threshold string strictly below the given ratio (so the
-// corresponding auto-compact check fires), and one strictly above it (so the
-// check does not fire).
-function below(ratio) {
- return String(ratio / 2);
-}
-function above(ratio) {
- return String(ratio * 2);
-}
-
-// The auto-compact height check is REFERENCE_HEIGHT / innerHeight > threshold.
-// Compute the ratio for the given window so we can pick thresholds that
-// deterministically flip the trigger regardless of the window's real size.
-function heightRatio(win) {
- return (
- win.gUIDensity.AUTO_COMPACT_REFERENCE_TABSTRIP_HEIGHT / win.innerHeight
- );
-}
-
-async function withNewWindow(callback) {
- let win = await BrowserTestUtils.openNewBrowserWindow();
- try {
- await callback(win);
- } finally {
- await BrowserTestUtils.closeWindow(win);
- }
-}
-
-function isCompact(win) {
- return win.document.documentElement.getAttribute("uidensity") == "compact";
-}
-
-// Reads a computed custom property off the window's root element.
-function cssVar(win, name) {
- return win
- .getComputedStyle(win.document.documentElement)
- .getPropertyValue(name)
- .trim();
-}
-
-// Runs `callback` with only the collapsed-launcher width branch of
-// _shouldAutoCompact() able to activate compact mode, so compact tracks the launcher
-// state alone. Resizing the window narrow enough to cross the width threshold
-// naturally isn't an option (resizeTo below the WM minimum width is unreliable
-// in CI), so instead:
-// - zero out the tabstrip height, which makes the height ratio 0 so
-// that check can never exceed a threshold, and
-// - increase the launcher width to the window's width, making the
-// width ratio exactly 1, then pick a threshold below it.
-async function withLauncherWidthCheckOnly(win, callback) {
- let { gUIDensity } = win;
- let originalRefHeight = gUIDensity.AUTO_COMPACT_REFERENCE_TABSTRIP_HEIGHT;
- let originalRefWidth =
- gUIDensity.AUTO_COMPACT_REFERENCE_SIDEBAR_LAUNCHER_WIDTH;
- gUIDensity.AUTO_COMPACT_REFERENCE_TABSTRIP_HEIGHT = 0;
- gUIDensity.AUTO_COMPACT_REFERENCE_SIDEBAR_LAUNCHER_WIDTH = win.innerWidth;
- Services.prefs.setCharPref(PREF_THRESHOLD, below(1));
- try {
- await callback();
- } finally {
- gUIDensity.AUTO_COMPACT_REFERENCE_TABSTRIP_HEIGHT = originalRefHeight;
- gUIDensity.AUTO_COMPACT_REFERENCE_SIDEBAR_LAUNCHER_WIDTH = originalRefWidth;
- Services.prefs.clearUserPref(PREF_THRESHOLD);
- }
-}
-
-add_task(async function test_auto_compact_engages_in_small_window() {
- await SpecialPowers.pushPrefEnv({
- set: [[PREF_NOVA, true]],
- clear: [[PREF_UI_DENSITY]],
- });
-
- await withNewWindow(async win => {
- let ratio = heightRatio(win);
- Services.prefs.setCharPref(PREF_THRESHOLD, below(ratio));
- win.gUIDensity.update();
-
- let density = win.gUIDensity.getCurrentDensity();
- is(
- density.mode,
- win.gUIDensity.MODE_COMPACT,
- "Auto-compact engages when the tabstrip ratio exceeds the threshold"
- );
- Assert.ok(
- density.overridden,
- "The compact density is reported as overridden"
- );
- Assert.ok(isCompact(win), "The document is marked compact");
- });
-
- Services.prefs.clearUserPref(PREF_THRESHOLD);
- await SpecialPowers.popPrefEnv();
-});
-
-add_task(async function test_auto_compact_disabled_above_threshold() {
- await SpecialPowers.pushPrefEnv({
- set: [[PREF_NOVA, true]],
- clear: [[PREF_UI_DENSITY]],
- });
-
- await withNewWindow(async win => {
- let ratio = heightRatio(win);
- Services.prefs.setCharPref(PREF_THRESHOLD, above(ratio));
- win.gUIDensity.update();
-
- let density = win.gUIDensity.getCurrentDensity();
- is(
- density.mode,
- win.gUIDensity.MODE_NORMAL,
- "Auto-compact does not engage when the ratio is below the threshold"
- );
- Assert.ok(!density.overridden, "The density is not reported as overridden");
- Assert.ok(!isCompact(win), "The document is not marked compact");
- });
-
- Services.prefs.clearUserPref(PREF_THRESHOLD);
- await SpecialPowers.popPrefEnv();
-});
-
-add_task(async function test_user_uidensity_disables_auto_compact() {
- await withNewWindow(async win => {
- let ratio = heightRatio(win);
- await SpecialPowers.pushPrefEnv({
- set: [
- [PREF_NOVA, true],
- // A triggering threshold, but the user has explicitly chosen a
- // (non-default) uidensity, which must win over auto-compact.
- [PREF_THRESHOLD, below(ratio)],
- [PREF_UI_DENSITY, win.gUIDensity.MODE_TOUCH],
- ],
- });
-
- win.gUIDensity.update();
-
- let density = win.gUIDensity.getCurrentDensity();
- is(
- density.mode,
- win.gUIDensity.MODE_TOUCH,
- "Auto-compact is skipped when the user has chosen a uidensity value"
- );
- Assert.ok(!density.overridden, "The density is not reported as overridden");
- Assert.ok(!isCompact(win), "The document is not marked compact");
-
- await SpecialPowers.popPrefEnv();
- });
-});
-
-add_task(async function test_threshold_zero_disables_auto_compact() {
- await SpecialPowers.pushPrefEnv({
- set: [
- [PREF_NOVA, true],
- [PREF_THRESHOLD, "0"],
- ],
- clear: [[PREF_UI_DENSITY]],
- });
-
- await withNewWindow(async win => {
- win.gUIDensity.update();
- is(
- win.gUIDensity.getCurrentDensity().mode,
- win.gUIDensity.MODE_NORMAL,
- "A threshold of zero disables auto-compact entirely"
- );
- Assert.ok(!isCompact(win), "The document is not marked compact");
- });
-
- await SpecialPowers.popPrefEnv();
-});
-
-add_task(async function test_nova_disabled_disables_auto_compact() {
- await SpecialPowers.pushPrefEnv({
- set: [[PREF_NOVA, false]],
- clear: [[PREF_UI_DENSITY]],
- });
-
- await withNewWindow(async win => {
- let ratio = heightRatio(win);
- Services.prefs.setCharPref(PREF_THRESHOLD, below(ratio));
- win.gUIDensity.update();
-
- is(
- win.gUIDensity.getCurrentDensity().mode,
- win.gUIDensity.MODE_NORMAL,
- "Auto-compact does not engage when nova is disabled"
- );
- Assert.ok(!isCompact(win), "The document is not marked compact");
- });
-
- Services.prefs.clearUserPref(PREF_THRESHOLD);
- await SpecialPowers.popPrefEnv();
-});
-
-add_task(async function test_threshold_change_reevaluates() {
- await SpecialPowers.pushPrefEnv({
- set: [[PREF_NOVA, true]],
- clear: [[PREF_UI_DENSITY]],
- });
-
- await withNewWindow(async win => {
- let ratio = heightRatio(win);
-
- // Start above the threshold: not compact.
- Services.prefs.setCharPref(PREF_THRESHOLD, above(ratio));
- await TestUtils.waitForCondition(
- () => !isCompact(win),
- "Window starts non-compact above the threshold"
- );
-
- // Lowering the threshold under the ratio should engage compact via the
- // pref observer, without an explicit update() call.
- Services.prefs.setCharPref(PREF_THRESHOLD, below(ratio));
- await TestUtils.waitForCondition(
- () => isCompact(win),
- "Lowering the threshold re-evaluates and engages compact"
- );
-
- // Raising it back should disengage compact.
- Services.prefs.setCharPref(PREF_THRESHOLD, above(ratio));
- await TestUtils.waitForCondition(
- () => !isCompact(win),
- "Raising the threshold re-evaluates and disengages compact"
- );
- });
-
- Services.prefs.clearUserPref(PREF_THRESHOLD);
- await SpecialPowers.popPrefEnv();
-});
-
-// A resize triggers update() only when auto-compact could change the density.
-// When it can't apply, resizing can't affect density, so update() is skipped
-// to keep the resize hot path cheap (bug 2049353).
-function resizeCallsUpdate(win) {
- let original = win.gUIDensity.update;
- let called = false;
- win.gUIDensity.update = function (...args) {
- called = true;
- return original.apply(this, args);
- };
- try {
- win.dispatchEvent(new win.Event("resize"));
- return called;
- } finally {
- win.gUIDensity.update = original;
- }
-}
-
-add_task(
- async function test_resize_triggers_update_when_auto_compact_applies() {
- await SpecialPowers.pushPrefEnv({
- set: [[PREF_NOVA, true]],
- clear: [[PREF_UI_DENSITY]],
- });
-
- await withNewWindow(async win => {
- Assert.ok(
- resizeCallsUpdate(win),
- "A resize triggers update() when auto-compact can apply"
- );
- });
-
- await SpecialPowers.popPrefEnv();
- }
-);
-
-add_task(
- async function test_resize_skips_update_when_auto_compact_inapplicable() {
- await SpecialPowers.pushPrefEnv({
- set: [[PREF_NOVA, false]],
- clear: [[PREF_UI_DENSITY]],
- });
-
- await withNewWindow(async win => {
- Assert.ok(
- !resizeCallsUpdate(win),
- "A resize skips update() when auto-compact can't apply (nova disabled)"
- );
- });
-
- await SpecialPowers.popPrefEnv();
- }
-);
-
-add_task(async function test_resize_skips_update_with_user_uidensity() {
- await SpecialPowers.pushPrefEnv({
- set: [
- [PREF_NOVA, true],
- // A non-default (touch) value so prefHasUserValue() is unambiguously true.
- [PREF_UI_DENSITY, 2],
- ],
- });
-
- await withNewWindow(async win => {
- Assert.ok(
- !resizeCallsUpdate(win),
- "A resize skips update() when the user has chosen a uidensity value"
- );
- });
-
- await SpecialPowers.popPrefEnv();
-});
-
-// Regression test for bug 2047330: update() runs on every window resize, but
-// must only notify consumers (the urlbar view and tabstrip listen for
-// uidensitychanged) when the resolved density actually changes. Otherwise the
-// view and tabstrip flicker continuously while the window is resized.
-add_task(async function test_uidensitychanged_only_on_actual_change() {
- await withNewWindow(async win => {
- win.gUIDensity.update(win.gUIDensity.MODE_NORMAL);
-
- let count = 0;
- let listener = () => count++;
- win.addEventListener("uidensitychanged", listener);
- try {
- // Re-applying the same mode must not notify consumers.
- win.gUIDensity.update(win.gUIDensity.MODE_NORMAL);
- Assert.equal(count, 0, "No uidensitychanged when the mode is unchanged");
-
- // An actual change notifies exactly once.
- win.gUIDensity.update(win.gUIDensity.MODE_COMPACT);
- Assert.equal(
- count,
- 1,
- "uidensitychanged fires once when the mode changes"
- );
-
- // Re-applying the new mode must not notify again.
- win.gUIDensity.update(win.gUIDensity.MODE_COMPACT);
- Assert.equal(
- count,
- 1,
- "No uidensitychanged when re-applying the same mode"
- );
- } finally {
- win.removeEventListener("uidensitychanged", listener);
- win.gUIDensity.update(win.gUIDensity.MODE_NORMAL);
- }
- });
-});
-
-// Resize events that don't change the resolved density must not re-dispatch
-// uidensitychanged. This reproduces the bug 2047330 STR (resizing the window)
-// at the event level.
-add_task(async function test_resize_without_change_does_not_redispatch() {
- await SpecialPowers.pushPrefEnv({
- set: [[PREF_NOVA, false]],
- clear: [[PREF_UI_DENSITY]],
- });
-
- await withNewWindow(async win => {
- // Settle on a stable density that a resize cannot change (nova off).
- win.gUIDensity.update();
-
- let dispatched = false;
- let listener = () => {
- dispatched = true;
- };
- win.addEventListener("uidensitychanged", listener);
- try {
- for (let i = 0; i < 5; i++) {
- win.dispatchEvent(new win.Event("resize"));
- }
- Assert.ok(
- !dispatched,
- "uidensitychanged is not dispatched on resize when density is unchanged"
- );
- } finally {
- win.removeEventListener("uidensitychanged", listener);
- }
- });
-
- await SpecialPowers.popPrefEnv();
-});
-
-add_task(async function test_sidebar_launcher_collapsed_requires_revamp() {
- await withNewWindow(async win => {
- await SpecialPowers.pushPrefEnv({
- set: [["sidebar.revamp", false]],
- });
- Assert.ok(
- !win.gUIDensity._isSidebarLauncherCollapsed(),
- "The collapsed-launcher check is false when sidebar.revamp is disabled"
- );
- await SpecialPowers.popPrefEnv();
- });
-});
-
-add_task(async function test_collapsed_launcher_width_triggers_compact() {
- await SpecialPowers.pushPrefEnv({
- set: [
- [PREF_NOVA, true],
- ["sidebar.revamp", true],
- ["sidebar.verticalTabs", true],
- ],
- clear: [[PREF_UI_DENSITY]],
- });
-
- await withNewWindow(async win => {
- await TestUtils.waitForCondition(
- () => win.SidebarController?.initialized,
- "SidebarController is initialized"
- );
-
- // Put the launcher in its visible-but-collapsed state explicitly rather
- // than relying on the default, which can be overridden by persisted state.
- win.SidebarController._state.launcherVisible = true;
- win.SidebarController._state.launcherExpanded = false;
-
- Assert.ok(
- win.gUIDensity._isSidebarLauncherCollapsed(),
- "The launcher is visible and collapsed"
- );
-
- await withLauncherWidthCheckOnly(win, async () => {
- win.gUIDensity.update();
- Assert.ok(
- isCompact(win),
- "Compact engages via the collapsed-launcher width check"
- );
-
- // Expanding the launcher removes the collapsed condition, so compact
- // should disengage since the height check can't engage it.
- win.SidebarController._state.launcherExpanded = true;
- win.gUIDensity.update();
- Assert.ok(
- !isCompact(win),
- "Compact disengages once the launcher is expanded"
- );
-
- win.SidebarController._state.launcherExpanded = false;
- });
- });
-
- await SpecialPowers.popPrefEnv();
-});
-
-add_task(async function test_closing_sidebar_disengages_compact() {
- await SpecialPowers.pushPrefEnv({
- set: [
- [PREF_NOVA, true],
- ["sidebar.revamp", true],
- ["sidebar.verticalTabs", false],
- ["sidebar.visibility", "hide-on-close"],
- ],
- clear: [[PREF_UI_DENSITY]],
- });
-
- await withNewWindow(async win => {
- await TestUtils.waitForCondition(
- () => win.SidebarController?.initialized,
- "SidebarController is initialized"
- );
-
- // Start from the STR's state: sidebar closed, launcher not showing.
- win.SidebarController._state.launcherVisible = false;
-
- await withLauncherWidthCheckOnly(win, async () => {
- await TestUtils.waitForCondition(
- () => !isCompact(win),
- "Window starts non-compact with the launcher hidden"
- );
- Assert.ok(!isCompact(win), "Not compact while the sidebar is closed");
-
- await win.SidebarController.show("viewHistorySidebar");
- await TestUtils.waitForCondition(
- () => isCompact(win),
- "Compact engages when the panel makes the collapsed launcher visible"
- );
- Assert.ok(isCompact(win), "Compact engages when the panel opens");
-
- win.SidebarController.hide();
- await TestUtils.waitForCondition(
- () => !isCompact(win),
- "Compact disengages once the panel is closed and the launcher hidden"
- );
- Assert.ok(!isCompact(win), "Compact disengages when the panel closes");
- });
- });
-
- await SpecialPowers.popPrefEnv();
-});
-
-// The expand-on-hover launcher is absolutely positioned while expanded, so it
-// keeps reserving only its collapsed width. Compact must not flip on and off as
-// the pointer enters and leaves the launcher.
-add_task(async function test_expand_on_hover_keeps_compact() {
- await SpecialPowers.pushPrefEnv({
- set: [
- [PREF_NOVA, true],
- ["sidebar.revamp", true],
- ["sidebar.verticalTabs", true],
- ["sidebar.visibility", "expand-on-hover"],
- ],
- clear: [[PREF_UI_DENSITY]],
- });
-
- await withNewWindow(async win => {
- await TestUtils.waitForCondition(
- () => win.SidebarController?.initialized,
- "SidebarController is initialized"
- );
-
- win.SidebarController._state.launcherVisible = true;
- win.SidebarController._state.launcherExpanded = false;
-
- await withLauncherWidthCheckOnly(win, async () => {
- await TestUtils.waitForCondition(
- () => isCompact(win),
- "Compact engages via the collapsed-launcher width check"
- );
-
- win.SidebarController._state.launcherExpanded = true;
- await TestUtils.waitForCondition(
- () => win.SidebarController._state.launcherExpanded,
- "The launcher reports itself expanded"
- );
- Assert.ok(
- win.gUIDensity._isSidebarLauncherCollapsed(),
- "A hover-expanded launcher still counts as collapsed"
- );
- Assert.ok(isCompact(win), "Compact stays engaged while hover-expanded");
-
- win.SidebarController._state.launcherExpanded = false;
- Assert.ok(isCompact(win), "Compact stays engaged once un-hovered");
- });
- });
-
- await SpecialPowers.popPrefEnv();
-});
-
-registerCleanupFunction(() => {
- // Enabling sidebar.revamp introduces the sidebar button as a side effect,
- // which persists this pref; clear it so we don't leak a changed pref.
- Services.prefs.clearUserPref(
- "browser.toolbarbuttons.introduced.sidebar-button"
- );
-});
diff -urN firefox-157.0-orig/browser/components/customizableui/test/browser_uidensity_auto_touch.js firefox-157.0/browser/components/customizableui/test/browser_uidensity_auto_touch.js
--- firefox-157.0-orig/browser/components/customizableui/test/browser_uidensity_auto_touch.js 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/customizableui/test/browser_uidensity_auto_touch.js 1970-01-01 09:00:00 +0900
@@ -1,308 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-"use strict";
-
-const PREF_UI_DENSITY = "browser.uidensity";
-const PREF_NOVA = "browser.nova.enabled";
-const PREF_AUTO_TOUCH = "browser.touchmode.auto";
-const PREF_THRESHOLD = "browser.compactmode.auto.threshold";
-
-const gUIDensity = window.gUIDensity;
-
-// CustomizableUI owns the startup logic that sets browser.touchmode.auto's
-// default based on nova (see _setAutoTouchModeDefault). Reach it to re-derive
-// the default on demand for the default-value assertions below.
-const CustomizableUIInternal = CustomizableUI.getTestOnlyInternalProp(
- "CustomizableUIInternal"
-);
-
-async function withTabletMode({ prefs, inTablet }, callback) {
- let original = gUIDensity._inTabletMode;
- gUIDensity._inTabletMode = () => inTablet;
- await SpecialPowers.pushPrefEnv(prefs);
- try {
- gUIDensity.update();
- await callback();
- } finally {
- gUIDensity._inTabletMode = original;
- await SpecialPowers.popPrefEnv();
- gUIDensity.update();
- }
-}
-
-function isTouch() {
- return document.documentElement.getAttribute("uidensity") == "touch";
-}
-
-add_task(async function test_startup_default_reflects_nova() {
- is(
- Services.prefs.getDefaultBranch("").getBoolPref(PREF_AUTO_TOUCH),
- !Services.prefs.getBoolPref(PREF_NOVA, false),
- "browser.touchmode.auto default is the inverse of the nova value"
- );
-});
-
-add_task(async function test_automatic_switches_to_touch_in_tablet_mode() {
- await withTabletMode(
- {
- // The auto-touch checkbox is off: automatic must still switch to touch.
- prefs: {
- set: [
- [PREF_NOVA, true],
- [PREF_THRESHOLD, "0"],
- [PREF_AUTO_TOUCH, false],
- ],
- clear: [[PREF_UI_DENSITY]],
- },
- inTablet: true,
- },
- () => {
- let density = gUIDensity.getCurrentDensity();
- is(
- density.mode,
- gUIDensity.MODE_TOUCH,
- "Automatic density switches to touch in tablet mode even when " +
- "browser.touchmode.auto is false"
- );
- Assert.ok(
- density.overridden,
- "The touch density is reported as overridden"
- );
- Assert.ok(isTouch(), "The document is marked touch");
- }
- );
-});
-
-add_task(async function test_automatic_touch_leaves_tablet_mode() {
- await withTabletMode(
- {
- prefs: {
- set: [
- [PREF_NOVA, true],
- [PREF_THRESHOLD, "0"],
- [PREF_AUTO_TOUCH, false],
- ],
- clear: [[PREF_UI_DENSITY]],
- },
- inTablet: false,
- },
- () => {
- let density = gUIDensity.getCurrentDensity();
- is(
- density.mode,
- gUIDensity.MODE_NORMAL,
- "Automatic density is normal when not in tablet mode"
- );
- Assert.ok(
- !density.overridden,
- "The density is not reported as overridden"
- );
- Assert.ok(!isTouch(), "The document is not marked touch");
- }
- );
-});
-
-add_task(async function test_standard_ignores_tablet_mode_without_optin() {
- await withTabletMode(
- {
- // Standard is an explicit uidensity value (MODE_NORMAL), so it is not
- // "automatic" and must not switch to touch unless the user opted in.
- prefs: {
- set: [
- [PREF_NOVA, true],
- [PREF_THRESHOLD, "0"],
- [PREF_UI_DENSITY, 0],
- [PREF_AUTO_TOUCH, false],
- ],
- },
- inTablet: true,
- },
- () => {
- let density = gUIDensity.getCurrentDensity();
- is(
- density.mode,
- gUIDensity.MODE_NORMAL,
- "Standard density stays normal in tablet mode without the opt-in"
- );
- Assert.ok(
- !density.overridden,
- "The density is not reported as overridden"
- );
- Assert.ok(!isTouch(), "The document is not marked touch");
- }
- );
-});
-
-add_task(async function test_standard_optin_switches_to_touch_in_tablet_mode() {
- await withTabletMode(
- {
- // The user opted into auto-touch-mode for the standard density.
- prefs: {
- set: [
- [PREF_NOVA, true],
- [PREF_THRESHOLD, "0"],
- [PREF_UI_DENSITY, 0],
- [PREF_AUTO_TOUCH, true],
- ],
- },
- inTablet: true,
- },
- () => {
- let density = gUIDensity.getCurrentDensity();
- is(
- density.mode,
- gUIDensity.MODE_TOUCH,
- "Standard density switches to touch in tablet mode when the user " +
- "opted into auto-touch-mode"
- );
- Assert.ok(
- density.overridden,
- "The touch density is reported as overridden"
- );
- Assert.ok(isTouch(), "The document is marked touch");
- }
- );
-});
-
-add_task(async function test_auto_touch_ignored_for_explicit_compact() {
- await withTabletMode(
- {
- // Compact is an explicit choice. The auto-touch-mode pref is the standard
- // density's opt-in, so it must not override compact to touch even when on.
- prefs: {
- set: [
- [PREF_NOVA, true],
- [PREF_THRESHOLD, "0"],
- [PREF_UI_DENSITY, 1],
- [PREF_AUTO_TOUCH, true],
- ],
- },
- inTablet: true,
- },
- () => {
- let density = gUIDensity.getCurrentDensity();
- is(
- density.mode,
- gUIDensity.MODE_COMPACT,
- "Explicit compact stays compact in tablet mode even with " +
- "browser.touchmode.auto enabled"
- );
- Assert.ok(
- !density.overridden,
- "The density is not reported as overridden"
- );
- Assert.ok(!isTouch(), "The document is not marked touch");
- }
- );
-});
-
-add_task(async function test_explicit_touchmode_pref_without_nova() {
- await withTabletMode(
- {
- // Without nova there is no "Automatic" density, so tablet-mode touch is
- // driven purely by the auto-touch-mode pref. Here it is explicitly off.
- prefs: {
- set: [
- [PREF_NOVA, false],
- [PREF_THRESHOLD, "0"],
- [PREF_AUTO_TOUCH, false],
- ],
- clear: [[PREF_UI_DENSITY]],
- },
- inTablet: true,
- },
- async () => {
- is(
- gUIDensity.getCurrentDensity().mode,
- gUIDensity.MODE_NORMAL,
- "Without nova, tablet mode does not switch to touch when " +
- "browser.touchmode.auto is explicitly false"
- );
- Assert.ok(!isTouch(), "The document is not marked touch");
-
- // Turning it on switches to touch without nova.
- await SpecialPowers.pushPrefEnv({ set: [[PREF_AUTO_TOUCH, true]] });
- gUIDensity.update();
- is(
- gUIDensity.getCurrentDensity().mode,
- gUIDensity.MODE_TOUCH,
- "Without nova, enabling browser.touchmode.auto switches to touch"
- );
- Assert.ok(isTouch(), "The document is marked touch");
- await SpecialPowers.popPrefEnv();
- }
- );
-});
-
-add_task(async function test_auto_touch_default_follows_nova() {
- const defaultBranch = Services.prefs.getDefaultBranch("");
- const original = defaultBranch.getBoolPref(PREF_AUTO_TOUCH);
- registerCleanupFunction(() =>
- defaultBranch.setBoolPref(PREF_AUTO_TOUCH, original)
- );
-
- await SpecialPowers.pushPrefEnv({ set: [[PREF_NOVA, false]] });
- CustomizableUIInternal._setAutoTouchModeDefault();
- is(
- defaultBranch.getBoolPref(PREF_AUTO_TOUCH),
- true,
- "browser.touchmode.auto defaults on when nova is disabled"
- );
- await SpecialPowers.popPrefEnv();
-
- await SpecialPowers.pushPrefEnv({ set: [[PREF_NOVA, true]] });
- CustomizableUIInternal._setAutoTouchModeDefault();
- is(
- defaultBranch.getBoolPref(PREF_AUTO_TOUCH),
- false,
- "browser.touchmode.auto defaults off when nova is enabled"
- );
- await SpecialPowers.popPrefEnv();
-
- CustomizableUIInternal._setAutoTouchModeDefault();
-});
-
-add_task(async function test_non_nova_default_switches_to_touch_in_tablet() {
- const defaultBranch = Services.prefs.getDefaultBranch("");
- const original = defaultBranch.getBoolPref(PREF_AUTO_TOUCH);
- registerCleanupFunction(() =>
- defaultBranch.setBoolPref(PREF_AUTO_TOUCH, original)
- );
-
- await withTabletMode(
- {
- // No explicit browser.touchmode.auto user value: rely on the nova-derived
- // default (on, pre-nova).
- prefs: {
- set: [
- [PREF_NOVA, false],
- [PREF_THRESHOLD, "0"],
- ],
- clear: [[PREF_UI_DENSITY], [PREF_AUTO_TOUCH]],
- },
- inTablet: true,
- },
- () => {
- CustomizableUIInternal._setAutoTouchModeDefault();
- is(
- Services.prefs.getBoolPref(PREF_AUTO_TOUCH),
- true,
- "Pre-nova, browser.touchmode.auto is on by default"
- );
- gUIDensity.update();
- let density = gUIDensity.getCurrentDensity();
- is(
- density.mode,
- gUIDensity.MODE_TOUCH,
- "Pre-nova auto-switches to touch in tablet mode with the default pref"
- );
- Assert.ok(
- density.overridden,
- "The touch density is reported as overridden"
- );
- Assert.ok(isTouch(), "The document is marked touch");
- }
- );
-});
diff -urN firefox-157.0-orig/browser/components/extensions/extension-popup-panel.css firefox-157.0/browser/components/extensions/extension-popup-panel.css
--- firefox-157.0-orig/browser/components/extensions/extension-popup-panel.css 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/extensions/extension-popup-panel.css 2026-10-05 08:24:16 +0900
@@ -5,15 +5,6 @@
body {
border-radius: 8px;
- @media -moz-pref("browser.nova.enabled") {
- /* TODO: Look into generating this CSS based on the Design Tokens
- * to ensure the border radius is automatically kept in sync with
- * the Design Tokens json data. */
-
- /* NOTE: keep in sync with --popup-border-radius */
- border-radius: 24px;
- }
-
@media (-moz-platform: linux) and (not (-moz-gtk-csd-transparency-available)) {
/* NOTE: keep in sync with the Linux CSD-transparency exception in
* toolkit/themes/shared/popup.css: some linux WMs can't draw
diff -urN firefox-157.0-orig/browser/components/extensions/test/browser/browser_ext_popup_corners.js firefox-157.0/browser/components/extensions/test/browser/browser_ext_popup_corners.js
--- firefox-157.0-orig/browser/components/extensions/test/browser/browser_ext_popup_corners.js 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/extensions/test/browser/browser_ext_popup_corners.js 2026-10-05 08:23:51 +0900
@@ -1,10 +1,7 @@
"use strict";
// Nova being enabled changes some of the styling that is being tested here.
-const novaEnabled = Services.prefs.getBoolPref(
- "browser.nova.enabled",
- true // If the pref isn't set to false assume Nova styles are enabled by default.
-);
+const novaEnabled = false;
info(`Run with Nova browser styles ${novaEnabled ? "enabled" : "disabled"}`);
diff -urN firefox-157.0-orig/browser/components/firefoxview/SyncedTabsController.sys.mjs firefox-157.0/browser/components/firefoxview/SyncedTabsController.sys.mjs
--- firefox-157.0-orig/browser/components/firefoxview/SyncedTabsController.sys.mjs 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/firefoxview/SyncedTabsController.sys.mjs 2026-10-05 08:53:13 +0900
@@ -251,7 +251,7 @@
#getMessageCardForState({ error = false, action, errorState }) {
errorState = errorState || this.errorState;
- const nova = Services.prefs.getBoolPref("browser.nova.enabled", false);
+ const nova = false;
let header, description, descriptionLink, buttonLabel, mainImageUrl;
let descriptionArray;
if (error) {
diff -urN firefox-157.0-orig/browser/components/firefoxview/chats.mjs firefox-157.0/browser/components/firefoxview/chats.mjs
--- firefox-157.0-orig/browser/components/firefoxview/chats.mjs 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/firefoxview/chats.mjs 2026-10-05 08:46:20 +0900
@@ -233,7 +233,7 @@
const descriptionHeader = "firefoxview-chats-empty-header";
const descriptionLabels = ["firefoxview-chats-empty-description"];
- let asset = Services.prefs.getBoolPref("browser.nova.enabled", false)
+ let asset = false
? "chrome://browser/skin/sidebar/kit-page-history.svg"
: "chrome://browser/content/firefoxview/history-empty.svg";
diff -urN firefox-157.0-orig/browser/components/firefoxview/firefox-view-synced-tabs-error-handler.sys.mjs firefox-157.0/browser/components/firefoxview/firefox-view-synced-tabs-error-handler.sys.mjs
--- firefox-157.0-orig/browser/components/firefoxview/firefox-view-synced-tabs-error-handler.sys.mjs 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/firefoxview/firefox-view-synced-tabs-error-handler.sys.mjs 2026-10-05 08:53:22 +0900
@@ -91,7 +91,7 @@
},
getFluentStringsForErrorType(type) {
- const mappings = Services.prefs.getBoolPref("browser.nova.enabled", false)
+ const mappings = false
? this._novaErrorStateStringMappings
: this._errorStateStringMappings;
return Object.freeze(mappings[type]);
diff -urN firefox-157.0-orig/browser/components/firefoxview/firefoxview.css firefox-157.0/browser/components/firefoxview/firefoxview.css
--- firefox-157.0-orig/browser/components/firefoxview/firefoxview.css 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/firefoxview/firefoxview.css 2026-10-05 08:46:09 +0900
@@ -37,12 +37,10 @@
color-scheme: dark;
}
- @media not -moz-pref("browser.nova.enabled") {
/* ensure utility button hover states match those of the rest of the page */
--button-background-color-hover: var(--fxview-element-background-hover);
--button-background-color-active: var(--fxview-element-background-active);
--button-text-color-hover: var(--fxview-text-color-hover);
- }
}
@media (forced-colors) {
@@ -156,7 +154,6 @@
min-width: 250px;
}
- @media not (-moz-pref("browser.nova.enabled")) {
/* center align the empty state image */
&.recentlyclosed::part(image-container) {
margin-inline-start: 50px;
@@ -166,5 +163,4 @@
&.recentlyclosed::part(main) {
padding-inline-start: 50px;
}
- }
}
diff -urN firefox-157.0-orig/browser/components/firefoxview/fxview-empty-state.css firefox-157.0/browser/components/firefoxview/fxview-empty-state.css
--- firefox-157.0-orig/browser/components/firefoxview/fxview-empty-state.css 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/firefoxview/fxview-empty-state.css 2026-10-05 08:47:12 +0900
@@ -84,7 +84,6 @@
/* Restore the legacy emphasized heading and tighter title spacing when the
* sidebar/Firefox View redesign is disabled. */
-@media not -moz-pref("browser.nova.enabled") {
.header {
font-weight: var(--font-weight-heading);
}
@@ -92,7 +91,6 @@
.description {
margin-block-start: 4px;
}
-}
.main a {
color: var(--fxview-primary-action-background);
diff -urN firefox-157.0-orig/browser/components/firefoxview/history.mjs firefox-157.0/browser/components/firefoxview/history.mjs
--- firefox-157.0-orig/browser/components/firefoxview/history.mjs 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/firefoxview/history.mjs 2026-10-05 08:47:24 +0900
@@ -353,7 +353,7 @@
}
#emptyMessageTemplate() {
- const nova = Services.prefs.getBoolPref("browser.nova.enabled", false);
+ const nova = false;
let descriptionHeader;
let descriptionLabels;
let descriptionLink;
diff -urN firefox-157.0-orig/browser/components/firefoxview/opentabs-tab-row.css firefox-157.0/browser/components/firefoxview/opentabs-tab-row.css
--- firefox-157.0-orig/browser/components/firefoxview/opentabs-tab-row.css 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/firefoxview/opentabs-tab-row.css 2026-10-05 08:45:48 +0900
@@ -80,19 +80,6 @@
background-size: cover;
-moz-context-properties: fill;
fill: var(--identity-icon-color);
-
- /* Match the container context-menu items: fill-color icon inside a round
- 15% tinted background. */
- @media -moz-pref("browser.nova.enabled") {
- box-sizing: content-box;
- padding: var(--identity-icon-inset);
- border-radius: var(--border-radius-circle);
- background-color: var(--identity-fill-tint);
- background-origin: content-box;
- background-repeat: no-repeat;
- background-position: center;
- fill: var(--identity-fill-color);
- }
}
.fxview-tab-row-main {
diff -urN firefox-157.0-orig/browser/components/firefoxview/recentlyclosed.mjs firefox-157.0/browser/components/firefoxview/recentlyclosed.mjs
--- firefox-157.0-orig/browser/components/firefoxview/recentlyclosed.mjs 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/firefoxview/recentlyclosed.mjs 2026-10-05 08:46:00 +0900
@@ -307,7 +307,7 @@
}
emptyMessageTemplate() {
- const nova = Services.prefs.getBoolPref("browser.nova.enabled", false);
+ const nova = false;
let descriptionHeader;
let descriptionLabels;
let descriptionLink;
diff -urN firefox-157.0-orig/browser/components/firefoxview/tests/browser/browser_history_firefoxview.js firefox-157.0/browser/components/firefoxview/tests/browser/browser_history_firefoxview.js
--- firefox-157.0-orig/browser/components/firefoxview/tests/browser/browser_history_firefoxview.js 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/firefoxview/tests/browser/browser_history_firefoxview.js 2026-10-05 08:46:28 +0900
@@ -19,7 +19,7 @@
const NEVER_REMEMBER_HISTORY_PREF = "browser.privatebrowsing.autostart";
// Different strings used for Nova UI.
-const isNovaEnabled = Services.prefs.getBoolPref("browser.nova.enabled", false);
+const isNovaEnabled = false;
const EMPTY_HEADER_L10N_ID = isNovaEnabled
? "firefoxview-history-empty-header-2"
: "firefoxview-history-empty-header";
diff -urN firefox-157.0-orig/browser/components/firefoxview/tests/browser/browser_recentlyclosed_firefoxview.js firefox-157.0/browser/components/firefoxview/tests/browser/browser_recentlyclosed_firefoxview.js
--- firefox-157.0-orig/browser/components/firefoxview/tests/browser/browser_recentlyclosed_firefoxview.js 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/firefoxview/tests/browser/browser_recentlyclosed_firefoxview.js 2026-10-05 08:46:53 +0900
@@ -11,7 +11,7 @@
const NEVER_REMEMBER_HISTORY_PREF = "browser.privatebrowsing.autostart";
// Different strings used for Nova UI.
-let isNovaEnabled = Services.prefs.getBoolPref("browser.nova.enabled", false);
+let isNovaEnabled = false;
let NEVER_REMEMBER_HEADER_L10N_ID = isNovaEnabled
? "firefoxview-dont-remember-history-empty-header-3"
: "firefoxview-dont-remember-history-empty-header-2";
diff -urN firefox-157.0-orig/browser/components/firefoxview/tests/browser/browser_syncedtabs_errors_firefoxview.js firefox-157.0/browser/components/firefoxview/tests/browser/browser_syncedtabs_errors_firefoxview.js
--- firefox-157.0-orig/browser/components/firefoxview/tests/browser/browser_syncedtabs_errors_firefoxview.js 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/firefoxview/tests/browser/browser_syncedtabs_errors_firefoxview.js 2026-10-05 08:47:02 +0900
@@ -6,7 +6,7 @@
);
// Different strings used for Nova UI.
-let isNovaEnabled = Services.prefs.getBoolPref("browser.nova.enabled", false);
+let isNovaEnabled = false;
const OFFLINE_HEADER_L10N_ID = isNovaEnabled
? "firefoxview-tabpickup-network-offline-header-2"
: "firefoxview-tabpickup-network-offline-header";
diff -urN firefox-157.0-orig/browser/components/firefoxview/tests/browser/browser_syncedtabs_firefoxview.js firefox-157.0/browser/components/firefoxview/tests/browser/browser_syncedtabs_firefoxview.js
--- firefox-157.0-orig/browser/components/firefoxview/tests/browser/browser_syncedtabs_firefoxview.js 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/firefoxview/tests/browser/browser_syncedtabs_firefoxview.js 2026-10-05 08:46:42 +0900
@@ -68,10 +68,7 @@
});
add_task(async function test_loading_state() {
- const isNovaEnabled = Services.prefs.getBoolPref(
- "browser.nova.enabled",
- false
- );
+ const isNovaEnabled = false;
const loadingHeaderL10nId = isNovaEnabled
? "firefoxview-syncedtabs-loading-header-2"
: "firefoxview-syncedtabs-loading-header";
@@ -192,7 +189,7 @@
Services.fog.testResetFOG();
// TODO: Exercise the QR-code based flow on Nova, once implemented.
// FIXME: Bug 2058059 - [Nova] On the tabs from other devices panel there is no QR code displayed when signed in to sync with no devices connected
- if (!Services.prefs.getBoolPref("browser.nova.enabled", false)) {
+ if (!false) {
EventUtils.synthesizeMouseAtCenter(
emptyState.querySelector(`moz-button[data-action="add-device"]`)
.buttonEl,
diff -urN firefox-157.0-orig/browser/components/ipprotection/assets/shield-vpn-exceptions.svg firefox-157.0/browser/components/ipprotection/assets/shield-vpn-exceptions.svg
--- firefox-157.0-orig/browser/components/ipprotection/assets/shield-vpn-exceptions.svg 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/ipprotection/assets/shield-vpn-exceptions.svg 2026-10-05 09:06:23 +0900
@@ -5,10 +5,6 @@
diff -urN firefox-157.0-orig/browser/components/ipprotection/content/ipprotection-content.css firefox-157.0/browser/components/ipprotection/content/ipprotection-content.css
--- firefox-157.0-orig/browser/components/ipprotection/content/ipprotection-content.css 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/ipprotection/content/ipprotection-content.css 2026-10-05 09:07:04 +0900
@@ -7,11 +7,6 @@
:host {
--skeleton-container-bg-color: var(--background-color-box-info);
--skeleton-placeholder-bg-color: var(--card-border-color);
-
- @media -moz-pref("browser.nova.enabled") {
- --skeleton-container-bg-color: light-dark(var(--color-gray-0), var(--color-black-alpha-50));
- --skeleton-placeholder-bg-color: light-dark(var(--color-black-alpha-10), var(--color-white-alpha-20));
- }
}
hr {
@@ -28,10 +23,6 @@
hr {
margin-block-end: var(--space-small);
}
-
- @media -moz-pref("browser.nova.enabled") {
- margin-inline: var(--space-small);
- }
}
ipprotection-status-card {
@@ -52,9 +43,7 @@
--focus-outline-offset: calc(-1 * var(--focus-outline-width));
width: 100%;
- @media not -moz-pref("browser.nova.enabled") {
--button-border-radius: var(--border-radius-small);
- }
}
}
@@ -122,9 +111,7 @@
padding-block-end: var(--space-small);
padding-inline-start: var(--space-large);
padding-inline-end: var(--space-large);
- @media not -moz-pref("browser.nova.enabled") {
color: var(--text-color);
- }
}
#unauthenticated-vpn-img {
@@ -161,9 +148,7 @@
margin: 0 auto;
width: var(--size-layout-small);
- @media not -moz-pref("browser.nova.enabled") {
width: 100%;
- }
}
#unauthenticated-footer {
@@ -209,10 +194,6 @@
width: var(--size-layout-xsmall);
border-radius: var(--space-xxsmall);
margin-block: var(--space-medium) var(--space-small);
-
- @media -moz-pref("browser.nova.enabled") {
- margin-block: var(--space-xsmall) 0;
- }
}
.skeleton-line {
@@ -229,11 +210,6 @@
&:first-of-type {
margin-block-start: var(--space-xxlarge);
}
-
- @media -moz-pref("browser.nova.enabled") {
- padding-block: var(--space-xsmall);
- border-radius: var(--border-radius-circle);
- }
}
.skeleton-image {
diff -urN firefox-157.0-orig/browser/components/ipprotection/content/ipprotection-status-box.css firefox-157.0/browser/components/ipprotection/content/ipprotection-status-box.css
--- firefox-157.0-orig/browser/components/ipprotection/content/ipprotection-status-box.css 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/ipprotection/content/ipprotection-status-box.css 2026-10-05 09:06:29 +0900
@@ -69,13 +69,6 @@
border-radius: var(--border-radius-medium);
padding: var(--space-medium);
- @media -moz-pref("browser.nova.enabled") {
- /* Use one neutral panel background for every state with Nova enabled. */
- /* stylelint-disable-next-line stylelint-plugin-mozilla/no-base-design-tokens, stylelint-plugin-mozilla/use-design-tokens */
- background-color: light-dark(var(--color-gray-0), var(--color-black-alpha-50));
- border: var(--border-width) solid var(--border-color-deemphasized);
- }
-
@media (prefers-contrast) {
background-color: var(--background-color-box);
}
diff -urN firefox-157.0-orig/browser/components/multilineeditor/multiline-editor.css firefox-157.0/browser/components/multilineeditor/multiline-editor.css
--- firefox-157.0-orig/browser/components/multilineeditor/multiline-editor.css 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/multilineeditor/multiline-editor.css 2026-10-05 08:09:43 +0900
@@ -17,14 +17,6 @@
width: 100%;
}
-@media -moz-pref("browser.nova.enabled") {
- /* TODO: Bug 2033070 - Nova tokens were implemented as the default value for the custom properties, and the fallbacks (and lint exceptions) will need to be removed after launch */
- :host {
- --multiline-editor-mention-placeholder-background-color: light-dark(var(--color-violet-desaturated-10), var(--color-violet-desaturated-60));
- --multiline-editor-mention-placeholder-border-color: light-dark(var(--color-violet-desaturated-10), var(--color-violet-desaturated-60));
- }
-}
-
.multiline-editor {
border-radius: var(--multiline-editor-border-radius);
border: var(--multiline-editor-border);
diff -urN firefox-157.0-orig/browser/components/preferences/config/appearance.mjs firefox-157.0/browser/components/preferences/config/appearance.mjs
--- firefox-157.0-orig/browser/components/preferences/config/appearance.mjs 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/preferences/config/appearance.mjs 2026-10-05 08:38:58 +0900
@@ -172,7 +172,7 @@
Preferences.addSetting({
id: "uiDensity",
deps: ["uiDensityPref"],
- visible: () => Services.prefs.getBoolPref("browser.nova.enabled", false),
+ visible: () => false,
// Map the browser.uidensity pref to one of the radio options. When the pref
// has no user value, gUIDensity (see browser.js) chooses the density
// automatically: small windows are auto-compacted based on
diff -urN firefox-157.0-orig/browser/components/preferences/tests/browser_appearance_pane.js firefox-157.0/browser/components/preferences/tests/browser_appearance_pane.js
--- firefox-157.0-orig/browser/components/preferences/tests/browser_appearance_pane.js 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/preferences/tests/browser_appearance_pane.js 2026-10-05 08:38:37 +0900
@@ -136,36 +136,6 @@
.isTabletCapable;
}
-async function withWindowDensityPane(callback) {
- await SpecialPowers.pushPrefEnv({
- set: [["browser.nova.enabled", true]],
- });
- // browser.uidensity is a sticky pref, so any user value set during the test
- // outlives pushPrefEnv. Start each task from the default (no user value, i.e.
- // automatic) and restore it when we're done.
- Services.prefs.clearUserPref("browser.uidensity");
- registerCleanupFunction(() =>
- Services.prefs.clearUserPref("browser.uidensity")
- );
-
- let tab = await openPrefsTab("appearance");
- let win = tab.linkedBrowser.contentWindow;
- let doc = win.document;
-
- await BrowserTestUtils.waitForMutationCondition(
- doc.getElementById("mainPrefPane"),
- { childList: true, subtree: true },
- () => doc.querySelector('setting-group[groupid="windowDensity"]')
- );
-
- try {
- await callback({ tab, win, doc });
- } finally {
- BrowserTestUtils.removeTab(tab);
- await SpecialPowers.popPrefEnv();
- }
-}
-
// Click a Window Density radio option in the pane the way a user would. The
// radio group re-renders asynchronously when browser.uidensity changes, so
// wait for it to settle (DOM value caught up to the setting model) before
@@ -190,147 +160,6 @@
);
}
-add_task(async function test_window_density_group_visible_with_nova() {
- await withWindowDensityPane(async ({ win }) => {
- let group = win.document.querySelector(
- 'setting-group[groupid="windowDensity"]'
- );
- ok(group, "windowDensity setting-group exists");
- is_element_visible(group, "windowDensity setting-group is visible");
-
- let control = getSettingControl("uiDensity", win);
- ok(control, "uiDensity setting-control exists");
- await control.updateComplete;
- is_element_visible(control, "uiDensity radio group is visible");
- });
-});
-
-add_task(async function test_window_density_radio_reflects_pref() {
- await withWindowDensityPane(async ({ win }) => {
- let control = getSettingControl("uiDensity", win);
- await control.updateComplete;
-
- const cases = [
- { pref: null, expected: "auto", desc: "no user value maps to automatic" },
- {
- pref: 0,
- expected: "standard",
- desc: "normal density maps to standard",
- },
- { pref: 1, expected: "compact", desc: "compact density maps to compact" },
- { pref: 2, expected: "touch", desc: "touch density maps to touch" },
- ];
-
- for (let { pref, expected, desc } of cases) {
- if (pref === null) {
- Services.prefs.clearUserPref("browser.uidensity");
- } else {
- Services.prefs.setIntPref("browser.uidensity", pref);
- }
- is(control.setting.value, expected, desc);
- await TestUtils.waitForCondition(
- () => control.controlEl.value === expected,
- `radio group renders "${expected}": ${desc}`
- );
- }
- });
-});
-
-add_task(async function test_window_density_radio_updates_pref() {
- await withWindowDensityPane(async ({ win }) => {
- let control = getSettingControl("uiDensity", win);
- await control.updateComplete;
-
- let selectOption = value => selectDensityOption(control, value);
-
- await selectOption("compact");
- is(
- Services.prefs.getIntPref("browser.uidensity"),
- 1,
- "Selecting compact sets browser.uidensity to 1"
- );
-
- await selectOption("touch");
- is(
- Services.prefs.getIntPref("browser.uidensity"),
- 2,
- "Selecting touch sets browser.uidensity to 2"
- );
-
- await selectOption("standard");
- ok(
- Services.prefs.prefHasUserValue("browser.uidensity"),
- "Selecting standard records an explicit user value"
- );
- is(
- Services.prefs.getIntPref("browser.uidensity"),
- 0,
- "Selecting standard sets browser.uidensity to 0"
- );
-
- await selectOption("auto");
- ok(
- !Services.prefs.prefHasUserValue("browser.uidensity"),
- "Selecting automatic clears the browser.uidensity user value"
- );
- });
-});
-
-// Picking an explicit density in about:preferences must leave the user's
-// browser.touchmode.auto choice untouched, even when the density is currently
-// overridden (e.g. forced to touch by tablet mode). gUIDensity.getCurrentDensity
-// already respects an explicit compact/touch value over the auto-touch pref, and
-// the auto-touch pref is the standard density's own opt-in, so selecting a
-// density should never rewrite it.
-add_task(
- async function test_window_density_preserves_auto_touch_on_explicit_choice() {
- await withWindowDensityPane(async ({ win }) => {
- let control = getSettingControl("uiDensity", win);
- await control.updateComplete;
-
- let gUIDensity = win.browsingContext.topChromeWindow.gUIDensity;
- let originalGetCurrentDensity = gUIDensity.getCurrentDensity;
- // Simulate tablet mode's touch override without needing a real tablet, so
- // that any re-introduced clear-on-override logic would trigger here.
- gUIDensity.getCurrentDensity = () => ({
- mode: gUIDensity.MODE_TOUCH,
- overridden: true,
- });
- registerCleanupFunction(() => {
- gUIDensity.getCurrentDensity = originalGetCurrentDensity;
- Services.prefs.clearUserPref("browser.touchmode.auto");
- Services.prefs.clearUserPref("browser.uidensity");
- });
-
- let selectOption = value => selectDensityOption(control, value);
-
- Services.prefs.setBoolPref("browser.touchmode.auto", true);
- await selectOption("compact");
- is(
- Services.prefs.getIntPref("browser.uidensity"),
- 1,
- "Selecting compact sets browser.uidensity to 1"
- );
- ok(
- Services.prefs.getBoolPref("browser.touchmode.auto"),
- "Selecting compact leaves browser.touchmode.auto untouched"
- );
-
- await selectOption("touch");
- ok(
- Services.prefs.getBoolPref("browser.touchmode.auto"),
- "Selecting touch leaves browser.touchmode.auto untouched"
- );
-
- await selectOption("standard");
- ok(
- Services.prefs.getBoolPref("browser.touchmode.auto"),
- "Selecting standard leaves browser.touchmode.auto untouched"
- );
- });
- }
-);
-
// Assert the nested auto-touch checkbox's visibility. Only meaningful where
// auto-touch is available; callers skip otherwise.
async function assertAutoTouchCheckboxVisibility(win, expectVisible, desc) {
@@ -347,81 +176,6 @@
}
}
-// The "Use touch spacing for tablet mode" checkbox is nested under the Standard
-// density option and should only be shown while that option is selected.
-add_task(async function test_window_density_auto_touch_checkbox_visibility() {
- if (!autoTouchModeAvailable()) {
- info(
- "Auto-touch mode is unavailable on this device, so the checkbox is " +
- "always hidden and there is nothing to assert. Note that this leaves " +
- "the shown path uncovered here; Linux (GTK) is where it runs."
- );
- return;
- }
- await withWindowDensityPane(async ({ win }) => {
- let control = getSettingControl("uiDensity", win);
- await control.updateComplete;
-
- let selectOption = value => selectDensityOption(control, value);
- let assertVisibility = (standardSelected, desc) =>
- assertAutoTouchCheckboxVisibility(win, standardSelected, desc);
-
- // The pane opens on automatic in a fresh profile.
- await assertVisibility(false, "automatic hides the checkbox on load");
-
- // Switch automatic to standard, with the int fixed at 0: the checkbox has to
- // appear the first time Standard is selected.
- await selectOption("standard");
- await assertVisibility(true, "standard shows the checkbox");
-
- // Switch standard to automatic, again with the int fixed at 0.
- await selectOption("auto");
- await assertVisibility(false, "automatic hides the checkbox");
-
- await selectOption("compact");
- await assertVisibility(false, "compact hides the checkbox");
-
- await selectOption("standard");
- await assertVisibility(true, "standard shows the checkbox again");
-
- await selectOption("touch");
- await assertVisibility(false, "touch hides the checkbox");
- });
-});
-
-// The checkbox must also follow the density changing from outside the pane (for
-// example from another window), which has no radio click to piggyback on.
-add_task(
- async function test_window_density_auto_touch_checkbox_follows_pref_changes() {
- if (!autoTouchModeAvailable()) {
- info(
- "Auto-touch mode is unavailable on this device, so the checkbox is " +
- "always hidden and there is nothing to assert. Note that this " +
- "leaves the shown path uncovered here; Linux (GTK) is where it runs."
- );
- return;
- }
- await withWindowDensityPane(async ({ win }) => {
- let control = getSettingControl("uiDensity", win);
- await control.updateComplete;
- let assertVisibility = (standardSelected, desc) =>
- assertAutoTouchCheckboxVisibility(win, standardSelected, desc);
-
- Services.prefs.setIntPref("browser.uidensity", 0);
- await assertVisibility(true, "explicit standard shows the checkbox");
-
- Services.prefs.clearUserPref("browser.uidensity");
- await assertVisibility(false, "cleared pref hides the checkbox");
-
- Services.prefs.setIntPref("browser.uidensity", 2);
- await assertVisibility(false, "touch hides the checkbox");
-
- Services.prefs.setIntPref("browser.uidensity", 0);
- await assertVisibility(true, "standard shows the checkbox");
- });
- }
-);
-
add_task(async function test_browser_layout_group_in_tabs_browsing_pane() {
await SpecialPowers.pushPrefEnv({
set: [["browser.settings-redesign.enabled", true]],
diff -urN firefox-157.0-orig/browser/components/privatebrowsing/content/aboutPrivateBrowsing.js firefox-157.0/browser/components/privatebrowsing/content/aboutPrivateBrowsing.js
--- firefox-157.0-orig/browser/components/privatebrowsing/content/aboutPrivateBrowsing.js 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/privatebrowsing/content/aboutPrivateBrowsing.js 2026-10-05 08:37:27 +0900
@@ -41,7 +41,7 @@
const shouldShowPromo = await RPMSendQuery("ShouldShowPromo", {
type: promoType,
});
- const novaEnabled = RPMGetBoolPref("browser.nova.enabled", false);
+ const novaEnabled = false;
const legacyContainer = document.querySelector(".promo");
const novaContainer = document.querySelector(".nova-promo-wrapper");
@@ -409,7 +409,7 @@
window.PrivateBrowsingRecordClick("InfoLink");
});
- if (RPMGetBoolPref("browser.nova.enabled", false)) {
+ if (false) {
document.getElementById("info-title").hidden = true;
document.l10n.setAttributes(
document.getElementById("info-body"),
diff -urN firefox-157.0-orig/browser/components/privatebrowsing/test/browser/browser.toml firefox-157.0/browser/components/privatebrowsing/test/browser/browser.toml
--- firefox-157.0-orig/browser/components/privatebrowsing/test/browser/browser.toml 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/privatebrowsing/test/browser/browser.toml 2026-10-05 08:34:42 +0900
@@ -47,8 +47,6 @@
["browser_privatebrowsing_about_nimbus_impressions.js"]
-["browser_privatebrowsing_about_nova_promo.js"]
-
["browser_privatebrowsing_about_search_banner.js"]
["browser_privatebrowsing_beacon.js"]
diff -urN firefox-157.0-orig/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_about_nova_promo.js firefox-157.0/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_about_nova_promo.js
--- firefox-157.0-orig/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_about_nova_promo.js 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_about_nova_promo.js 1970-01-01 09:00:00 +0900
@@ -1,378 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-const PROMO_HEADER = "Nova promo header";
-const PROMO_TITLE = "Nova promo body text";
-const PROMO_LINK_TEXT = "Nova learn more";
-const PROMO_IMAGE = "chrome://browser/content/assets/private-promo-asset.svg";
-
-function novaPromoMessage(contentOverrides = {}) {
- return {
- id: `PB_NEWTAB_NOVA_PROMO_${Math.random()}`,
- template: "pb_newtab",
- content: {
- hideDefault: true,
- promoEnabled: true,
- promoSectionStyle: "bottom",
- promoHeader: PROMO_HEADER,
- promoTitleEnabled: true,
- promoTitle: PROMO_TITLE,
- promoLinkText: PROMO_LINK_TEXT,
- promoLinkType: "link",
- promoImageLarge: PROMO_IMAGE,
- promoButton: {
- action: {
- data: { args: "https://example.com/", where: "tabshifted" },
- type: "OPEN_URL",
- },
- },
- ...contentOverrides,
- },
- // Priority ensures this message is picked over the ones in
- // OnboardingMessageProvider.
- priority: 5,
- targeting: "true",
- };
-}
-
-add_setup(async function () {
- ASRouter.resetMessageState();
-});
-
-add_task(async function test_nova_promo_renders() {
- await SpecialPowers.pushPrefEnv({
- set: [["browser.nova.enabled", true]],
- });
- let doExperimentCleanup =
- await setupMSExperimentWithMessage(novaPromoMessage());
-
- let { win, tab } = await openTabAndWaitForRender();
-
- await SpecialPowers.spawn(
- tab,
- [{ PROMO_HEADER, PROMO_TITLE, PROMO_LINK_TEXT, PROMO_IMAGE }],
- async function (expected) {
- const promoEl = content.document.getElementById("nova-promo");
- ok(promoEl, "Nova moz-promo element is rendered");
- is(
- content.document.querySelector(".promo"),
- null,
- "Legacy promo markup is not used when Nova is enabled"
- );
-
- // The moz-promo properties are set on the underlying JS object, which is
- // not visible through the content task's Xray wrapper. Assert on the
- // rendered shadow DOM instead, which is what the user sees.
- const shadow = promoEl.shadowRoot;
- await ContentTaskUtils.waitForCondition(
- () => shadow.querySelector(".heading")?.textContent,
- "Promo heading rendered"
- );
- is(
- shadow.querySelector(".heading").textContent,
- expected.PROMO_HEADER,
- "Promo heading is rendered"
- );
- ok(
- shadow
- .querySelector(".message")
- .textContent.includes(expected.PROMO_TITLE),
- "Promo message is rendered"
- );
- is(
- shadow.querySelector(".image-container img").getAttribute("src"),
- expected.PROMO_IMAGE,
- "Promo image is rendered"
- );
- is(
- content.document.getElementById("nova-promo-link").textContent,
- expected.PROMO_LINK_TEXT,
- "Promo link text is set"
- );
- is(
- content.document.getElementById("nova-promo-button"),
- null,
- "The button call to action is removed for a link promo"
- );
- const closeButton = shadow.querySelector("moz-button.close");
- ok(closeButton, "The promo has a close button");
- const closeButtonEl = closeButton.shadowRoot.querySelector("button");
- await ContentTaskUtils.waitForCondition(
- () => closeButtonEl.getAttribute("aria-label"),
- "Close button is localized"
- );
- is(
- closeButtonEl.getAttribute("aria-label"),
- "Close",
- "Close button has an accessible name"
- );
-
- // Regardless of the requested "bottom" section style, the Nova promo is
- // always shown below the search box.
- const wrapper = content.document.querySelector(".nova-promo-wrapper");
- ok(!wrapper.hidden, "Nova promo wrapper is visible");
- is(
- wrapper.previousElementSibling,
- content.document.querySelector(".search-inner-wrapper"),
- "Nova promo is inserted directly below the search box"
- );
- }
- );
-
- await BrowserTestUtils.closeWindow(win);
- await doExperimentCleanup();
- await SpecialPowers.popPrefEnv();
-});
-
-add_task(async function test_nova_promo_link_dispatches_action() {
- await SpecialPowers.pushPrefEnv({
- set: [["browser.nova.enabled", true]],
- });
- let doExperimentCleanup =
- await setupMSExperimentWithMessage(novaPromoMessage());
-
- let { win, tab } = await openTabAndWaitForRender();
-
- let newTabOpened = BrowserTestUtils.waitForNewTab(
- win.gBrowser,
- "https://example.com/"
- );
-
- await SpecialPowers.spawn(tab, [], async function () {
- content.document.getElementById("nova-promo-link").click();
- });
-
- let newTab = await newTabOpened;
- ok(newTab, "Clicking the Nova promo link dispatched the OPEN_URL action");
-
- BrowserTestUtils.removeTab(newTab);
- await BrowserTestUtils.closeWindow(win);
- await doExperimentCleanup();
- await SpecialPowers.popPrefEnv();
-});
-
-add_task(async function test_nova_promo_button_renders_and_dispatches_action() {
- await SpecialPowers.pushPrefEnv({
- set: [["browser.nova.enabled", true]],
- });
- let doExperimentCleanup = await setupMSExperimentWithMessage(
- novaPromoMessage({ promoLinkType: "button" })
- );
-
- let { win, tab } = await openTabAndWaitForRender();
-
- await SpecialPowers.spawn(tab, [PROMO_LINK_TEXT], async function (linkText) {
- const buttonEl = content.document.getElementById("nova-promo-button");
- ok(buttonEl, "Button call to action is rendered for a button promo");
- is(
- content.document.getElementById("nova-promo-link"),
- null,
- "The link call to action is removed for a button promo"
- );
- // moz-button reflects its label to an attribute, which is visible through
- // the content task's Xray wrapper unlike the underlying JS property.
- await ContentTaskUtils.waitForCondition(
- () => buttonEl.getAttribute("label") === linkText,
- "Promo button label is set"
- );
- });
-
- let newTabOpened = BrowserTestUtils.waitForNewTab(
- win.gBrowser,
- "https://example.com/"
- );
-
- await SpecialPowers.spawn(tab, [], async function () {
- content.document.getElementById("nova-promo-button").click();
- });
-
- let newTab = await newTabOpened;
- ok(newTab, "Clicking the Nova promo button dispatched the OPEN_URL action");
-
- BrowserTestUtils.removeTab(newTab);
- await BrowserTestUtils.closeWindow(win);
- await doExperimentCleanup();
- await SpecialPowers.popPrefEnv();
-});
-
-add_task(async function test_nova_promo_dismiss() {
- await SpecialPowers.pushPrefEnv({
- set: [["browser.nova.enabled", true]],
- });
- let doExperimentCleanup =
- await setupMSExperimentWithMessage(novaPromoMessage());
-
- let { win: win1, tab: tab1 } = await openTabAndWaitForRender();
-
- await SpecialPowers.spawn(tab1, [], async function () {
- ok(
- content.document.getElementById("nova-promo"),
- "Nova promo is shown before dismissing"
- );
- });
- await clickPromoDismissButton(tab1);
-
- let { win: win2, tab: tab2 } = await openTabAndWaitForRender();
-
- await SpecialPowers.spawn(tab2, [], async function () {
- is(
- content.document.getElementById("nova-promo"),
- null,
- "Nova promo is no longer shown after dismissing"
- );
- });
-
- await BrowserTestUtils.closeWindow(win1);
- await BrowserTestUtils.closeWindow(win2);
- await doExperimentCleanup();
- await SpecialPowers.popPrefEnv();
-});
-
-add_task(async function test_nova_promo_respects_impression_cap() {
- await SpecialPowers.pushPrefEnv({
- set: [["browser.nova.enabled", true]],
- });
- const message = novaPromoMessage();
- message.frequency = { lifetime: 2 };
- let doExperimentCleanup = await setupMSExperimentWithMessage(message);
-
- for (let i = 1; i <= 2; i++) {
- let { win, tab } = await openTabAndWaitForRender();
- await SpecialPowers.spawn(tab, [i], async function (impression) {
- ok(
- content.document.getElementById("nova-promo"),
- `Nova promo is shown on impression ${impression}`
- );
- });
- await BrowserTestUtils.closeWindow(win);
- }
-
- let { win, tab } = await openTabAndWaitForRender();
- await SpecialPowers.spawn(tab, [], async function () {
- is(
- content.document.getElementById("nova-promo"),
- null,
- "Nova promo is no longer shown once the impression cap is reached"
- );
- });
-
- await BrowserTestUtils.closeWindow(win);
- await doExperimentCleanup();
- await SpecialPowers.popPrefEnv();
-});
-
-add_task(
- async function test_nova_promo_removed_from_prerendered_tab_if_blocked() {
- // The PB newtab is pre-rendered. If the promo is dismissed in one tab, the
- // handlePromoOnPreload() visibilitychange handler removes it from the
- // already-rendered tab when it becomes visible. See aboutPrivateBrowsing.js.
- await SpecialPowers.pushPrefEnv({
- set: [["browser.nova.enabled", true]],
- });
- let doExperimentCleanup =
- await setupMSExperimentWithMessage(novaPromoMessage());
-
- const { win, tab: tab1 } = await openTabAndWaitForRender();
-
- await SpecialPowers.spawn(tab1, [], async function () {
- ok(
- content.document.getElementById("nova-promo"),
- "Nova promo is shown in tab 1"
- );
- });
-
- // Open a background tab while the promo is still unblocked, so it pre-renders
- // with the promo present.
- win.openTrustedLinkIn(win.BROWSER_NEW_TAB_URL, "tabshifted");
-
- // Dismiss (block) the promo in tab 1.
- await clickPromoDismissButton(tab1);
- await SpecialPowers.spawn(tab1, [], async function () {
- await ContentTaskUtils.waitForCondition(
- () => !content.document.querySelector(".nova-promo-wrapper"),
- "The promo is removed from tab 1 after dismissing"
- );
- });
-
- // Switch to the background tab, triggering its visibilitychange handler.
- await BrowserTestUtils.switchTab(win.gBrowser, win.gBrowser.tabs[1]);
-
- await SpecialPowers.spawn(
- win.gBrowser.tabs[1].linkedBrowser,
- [],
- async () => {
- await ContentTaskUtils.waitForCondition(
- () => !content.document.querySelector(".nova-promo-wrapper"),
- "Nova promo is removed from a new tab after being dismissed in another tab"
- );
- }
- );
-
- await BrowserTestUtils.closeWindow(win);
- await doExperimentCleanup();
- await SpecialPowers.popPrefEnv();
- }
-);
-
-add_task(async function test_nova_promo_is_hidden_until_it_has_content() {
- // The user should never see an empty promo. The page builds the promo while
- // it is still marked `hidden`, then reveals it once it has content. This test
- // guards that the `hidden` promo really is invisible to the user: previously
- // the styling ignored the `hidden` attribute, so an empty promo was shown
- // before its heading, message and link were filled in.
- await SpecialPowers.pushPrefEnv({
- set: [["browser.nova.enabled", true]],
- });
- let doExperimentCleanup =
- await setupMSExperimentWithMessage(novaPromoMessage());
-
- let { win, tab } = await openTabAndWaitForRender();
-
- await SpecialPowers.spawn(tab, [], async function () {
- const promo = content.document.querySelector(".nova-promo-wrapper");
-
- ok(
- ContentTaskUtils.isVisible(promo),
- "The populated promo is shown to the user"
- );
-
- promo.hidden = true;
- ok(
- ContentTaskUtils.isHidden(promo),
- "A promo marked hidden is not shown to the user"
- );
- });
-
- await BrowserTestUtils.closeWindow(win);
- await doExperimentCleanup();
- await SpecialPowers.popPrefEnv();
-});
-
-add_task(async function test_nova_disabled_uses_legacy_promo() {
- await SpecialPowers.pushPrefEnv({
- set: [["browser.nova.enabled", false]],
- });
- let doExperimentCleanup =
- await setupMSExperimentWithMessage(novaPromoMessage());
-
- let { win, tab } = await openTabAndWaitForRender();
-
- await SpecialPowers.spawn(tab, [], async function () {
- const promo = content.document.querySelector(".promo");
- ok(promo, "Legacy promo markup is used when Nova is disabled");
- ok(
- ContentTaskUtils.isVisible(promo),
- "Legacy promo is visible when Nova is disabled"
- );
- is(
- content.document.getElementById("nova-promo"),
- null,
- "Nova moz-promo element is not used when Nova is disabled"
- );
- });
-
- await BrowserTestUtils.closeWindow(win);
- await doExperimentCleanup();
- await SpecialPowers.popPrefEnv();
-});
diff -urN firefox-157.0-orig/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_indicator.js firefox-157.0/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_indicator.js
--- firefox-157.0-orig/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_indicator.js 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_indicator.js 2026-10-05 08:35:55 +0900
@@ -141,130 +141,15 @@
await BrowserTestUtils.closeWindow(win);
});
-// The button + info panel below are gated on the design-refresh pref, so the
-// tests set it explicitly rather than relying on the channel default.
-const NOVA_PREF = "browser.nova.enabled";
-
function getVisibleIndicatorButton(win) {
return [...win.document.querySelectorAll(BUTTON_INDICATOR_SELECTOR)].find(
el => BrowserTestUtils.isVisible(el)
);
}
-// In a private window, the icon-only indicator button is shown and clicking it
-// opens the info panel with a title, body copy, and learn-more link.
-add_task(async function test_indicator_button_opens_panel() {
- await SpecialPowers.pushPrefEnv({ set: [[NOVA_PREF, true]] });
- let win = await BrowserTestUtils.openNewBrowserWindow({ private: true });
-
- let button = getVisibleIndicatorButton(win);
- Assert.ok(button, "Private browsing indicator button is visible");
-
- let panel = win.document.getElementById("private-browsing-info-panel");
- let shown = BrowserTestUtils.waitForEvent(panel, "popupshown");
- EventUtils.synthesizeMouseAtCenter(button, {}, win);
- await shown;
-
- Assert.ok(
- panel.querySelector(".private-browsing-info-title")?.textContent,
- "Panel has a title"
- );
- Assert.ok(
- panel.querySelector(".private-browsing-info-description")?.textContent,
- "Panel has body copy"
- );
- Assert.ok(
- panel.querySelector("a[is='moz-support-link']"),
- "Panel has a learn-more link"
- );
-
- let hidden = BrowserTestUtils.waitForEvent(panel, "popuphidden");
- panel.hidePopup();
- await hidden;
-
- await BrowserTestUtils.closeWindow(win);
- await SpecialPowers.popPrefEnv();
-});
-
-// Clicking the button again while the panel is open dismisses it, and the button
-// reflects the open state via the [open] attribute while the panel is showing.
-add_task(async function test_indicator_button_toggles_closed() {
- await SpecialPowers.pushPrefEnv({ set: [[NOVA_PREF, true]] });
- let win = await BrowserTestUtils.openNewBrowserWindow({ private: true });
-
- let button = getVisibleIndicatorButton(win);
- let panel = win.document.getElementById("private-browsing-info-panel");
-
- let shown = BrowserTestUtils.waitForEvent(panel, "popupshown");
- EventUtils.synthesizeMouseAtCenter(button, {}, win);
- await shown;
- Assert.ok(
- button.hasAttribute("open"),
- "Button has [open] while the panel is showing"
- );
-
- let hidden = BrowserTestUtils.waitForEvent(panel, "popuphidden");
- EventUtils.synthesizeMouseAtCenter(button, {}, win);
- await hidden;
- Assert.equal(
- panel.state,
- "closed",
- "Clicking the button again closes the panel"
- );
- Assert.ok(
- !button.hasAttribute("open"),
- "Button [open] is cleared after dismissal"
- );
-
- await BrowserTestUtils.closeWindow(win);
- await SpecialPowers.popPrefEnv();
-});
-
-// Clicking the learn-more link inside the panel dismisses it.
-add_task(async function test_indicator_link_closes_panel() {
- await SpecialPowers.pushPrefEnv({ set: [[NOVA_PREF, true]] });
- let win = await BrowserTestUtils.openNewBrowserWindow({ private: true });
-
- let button = getVisibleIndicatorButton(win);
- let panel = win.document.getElementById("private-browsing-info-panel");
-
- let shown = BrowserTestUtils.waitForEvent(panel, "popupshown");
- EventUtils.synthesizeMouseAtCenter(button, {}, win);
- await shown;
-
- // Stub link navigation so the click doesn't open a SUMO tab.
- let originalOpen = win.openTrustedLinkIn;
- win.openTrustedLinkIn = () => {};
-
- let link = panel.querySelector("a[is='moz-support-link']");
- let hidden = BrowserTestUtils.waitForEvent(panel, "popuphidden");
- EventUtils.synthesizeMouseAtCenter(link, {}, win);
- await hidden;
- Assert.equal(
- panel.state,
- "closed",
- "Panel closes when the learn-more link is clicked"
- );
-
- win.openTrustedLinkIn = originalOpen;
- await BrowserTestUtils.closeWindow(win);
- await SpecialPowers.popPrefEnv();
-});
-
-// The indicator button is not shown in a regular (non-private) window.
-add_task(async function test_indicator_button_not_in_regular_window() {
- await SpecialPowers.pushPrefEnv({ set: [[NOVA_PREF, true]] });
- Assert.ok(
- !getVisibleIndicatorButton(window),
- "No indicator button in a regular window"
- );
- await SpecialPowers.popPrefEnv();
-});
-
// The indicator button is not shown when the pref is off (the classic labeled
// indicator is used instead).
add_task(async function test_indicator_button_hidden_when_pref_off() {
- await SpecialPowers.pushPrefEnv({ set: [[NOVA_PREF, false]] });
let win = await BrowserTestUtils.openNewBrowserWindow({ private: true });
Assert.ok(
!getVisibleIndicatorButton(win),
diff -urN firefox-157.0-orig/browser/components/privatebrowsing/test/browser/head.js firefox-157.0/browser/components/privatebrowsing/test/browser/head.js
--- firefox-157.0-orig/browser/components/privatebrowsing/test/browser/head.js 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/privatebrowsing/test/browser/head.js 2026-10-05 08:34:13 +0900
@@ -73,10 +73,6 @@
container: ".promo",
link: "#private-browsing-promo-link",
},
- nova: {
- container: ".nova-promo-wrapper",
- link: "#nova-promo-link",
- },
};
/**
@@ -89,15 +85,10 @@
body: "about-private-browsing-felt-privacy-v1-info-body",
link: "about-private-browsing-felt-privacy-v1-info-link",
},
- nova: {
- titleHidden: true,
- body: "about-private-browsing-nova-info-body",
- link: "about-private-browsing-nova-info-link",
- },
};
function isNovaEnabled() {
- return Services.prefs.getBoolPref("browser.nova.enabled", false);
+ return false;
}
/**
diff -urN firefox-157.0-orig/browser/components/profiles/ProfilesParent.sys.mjs firefox-157.0/browser/components/profiles/ProfilesParent.sys.mjs
--- firefox-157.0-orig/browser/components/profiles/ProfilesParent.sys.mjs 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/profiles/ProfilesParent.sys.mjs 2026-10-05 08:31:06 +0900
@@ -47,7 +47,7 @@
profiles: await Promise.all(profiles.map(p => p.toContentSafeObject())),
profileCreated: await profileAge.created,
themes,
- novaEnabled: Services.prefs.getBoolPref("browser.nova.enabled", false),
+ novaEnabled: false,
};
}
@@ -293,7 +293,7 @@
}
async getSafeForContentThemes(isDark) {
- let novaEnabled = Services.prefs.getBoolPref("browser.nova.enabled", false);
+ let novaEnabled = false;
if (novaEnabled) {
let themesList = await lazy.getThemesList({
diff -urN firefox-157.0-orig/browser/components/profiles/SelectableProfileService.sys.mjs firefox-157.0/browser/components/profiles/SelectableProfileService.sys.mjs
--- firefox-157.0-orig/browser/components/profiles/SelectableProfileService.sys.mjs 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/profiles/SelectableProfileService.sys.mjs 2026-10-05 08:31:25 +0900
@@ -53,12 +53,7 @@
false
);
-XPCOMUtils.defineLazyPreferenceGetter(
- lazy,
- "NOVA_ENABLED",
- "browser.nova.enabled",
- true
-);
+lazy.NOVA_ENABLED = false;
const PROFILES_CRYPTO_SALT_LENGTH_BYTES = 16;
diff -urN firefox-157.0-orig/browser/components/profiles/tests/browser/browser-legacy.toml firefox-157.0/browser/components/profiles/tests/browser/browser-legacy.toml
--- firefox-157.0-orig/browser/components/profiles/tests/browser/browser-legacy.toml 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/profiles/tests/browser/browser-legacy.toml 2026-10-05 08:32:33 +0900
@@ -1,7 +1,7 @@
[DEFAULT]
support-files = ["head.js"]
dupe-manifest = true
-prefs = ["browser.profiles.enabled=true","browser.profiles.created=false","browser.nova.enabled=false",]
+prefs = ["browser.profiles.enabled=true","browser.profiles.created=false",]
["browser_activate.js"]
run-if = [
diff -urN firefox-157.0-orig/browser/components/profiles/tests/browser/browser.toml firefox-157.0/browser/components/profiles/tests/browser/browser.toml
--- firefox-157.0-orig/browser/components/profiles/tests/browser/browser.toml 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/profiles/tests/browser/browser.toml 2026-10-05 08:31:53 +0900
@@ -1,7 +1,7 @@
[DEFAULT]
support-files = ["head.js"]
dupe-manifest = true
-prefs = ["browser.profiles.enabled=true","browser.profiles.created=false","browser.nova.enabled=true",]
+prefs = ["browser.profiles.enabled=true","browser.profiles.created=false",]
["browser_activate.js"]
run-if = [
diff -urN firefox-157.0-orig/browser/components/profiles/tests/browser/browser_create_profile_page_test.js firefox-157.0/browser/components/profiles/tests/browser/browser_create_profile_page_test.js
--- firefox-157.0-orig/browser/components/profiles/tests/browser/browser_create_profile_page_test.js 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/profiles/tests/browser/browser_create_profile_page_test.js 2026-10-05 08:32:24 +0900
@@ -346,7 +346,7 @@
"Current profile theme was updated"
);
- if (!Services.prefs.getBoolPref("browser.nova.enabled", false)) {
+ if (!false) {
await assertGlean("profiles", "new", "theme", expectedThemeId);
}
}
diff -urN firefox-157.0-orig/browser/components/search/SearchUIUtils.sys.mjs firefox-157.0/browser/components/search/SearchUIUtils.sys.mjs
--- firefox-157.0-orig/browser/components/search/SearchUIUtils.sys.mjs 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/search/SearchUIUtils.sys.mjs 2026-10-05 08:18:26 +0900
@@ -589,9 +589,6 @@
}
onPrefChanged(pref) {
- if (pref == "browser.nova.enabled") {
- this.updated();
- }
}
getComponents() {
diff -urN firefox-157.0-orig/browser/components/sidebar/sidebar-bookmark-list.css firefox-157.0/browser/components/sidebar/sidebar-bookmark-list.css
--- firefox-157.0-orig/browser/components/sidebar/sidebar-bookmark-list.css 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/sidebar/sidebar-bookmark-list.css 2026-10-05 08:18:34 +0900
@@ -113,9 +113,7 @@
background-repeat: no-repeat;
}
- @media not -moz-pref("browser.nova.enabled") {
border-radius: var(--border-radius-small);
- }
}
details > summary {
@@ -185,7 +183,5 @@
outline-offset: var(--focus-outline-inset);
}
- @media not -moz-pref("browser.nova.enabled") {
border-radius: var(--border-radius-medium);
- }
}
diff -urN firefox-157.0-orig/browser/components/sidebar/sidebar-customize.css firefox-157.0/browser/components/sidebar/sidebar-customize.css
--- firefox-157.0-orig/browser/components/sidebar/sidebar-customize.css 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/sidebar/sidebar-customize.css 2026-10-05 08:19:32 +0900
@@ -46,10 +46,8 @@
color: var(--sidebar-box-color);
border-radius: var(--border-radius-medium);
- @media not -moz-pref("browser.nova.enabled") {
background-color: var(--sidebar-box-background);
border: var(--sidebar-box-border);
- }
}
.extension-item {
@@ -72,10 +70,8 @@
display: block;
&::part(inputs) {
- @media not -moz-pref("browser.nova.enabled") {
background-color: var(--sidebar-box-background);
border: var(--sidebar-box-border);
- }
color: var(--sidebar-box-color);
border-radius: var(--border-radius-medium);
gap: 0;
@@ -86,11 +82,9 @@
moz-checkbox {
padding-block: var(--space-medium);
- @media not -moz-pref("browser.nova.enabled") {
&:not(:last-of-type) {
border-bottom: 0.5px solid var(--panel-separator-color);
}
- }
> moz-checkbox:last-of-type {
padding-block: 0;
diff -urN firefox-157.0-orig/browser/components/sidebar/sidebar-history.mjs firefox-157.0/browser/components/sidebar/sidebar-history.mjs
--- firefox-157.0-orig/browser/components/sidebar/sidebar-history.mjs 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/sidebar/sidebar-history.mjs 2026-10-05 08:19:22 +0900
@@ -434,7 +434,7 @@
}
#emptyMessageTemplate() {
- const nova = Services.prefs.getBoolPref("browser.nova.enabled", false);
+ const nova = false;
let descriptionHeader;
let descriptionLabels;
let descriptionLink;
diff -urN firefox-157.0-orig/browser/components/sidebar/sidebar-main.css firefox-157.0/browser/components/sidebar/sidebar-main.css
--- firefox-157.0-orig/browser/components/sidebar/sidebar-main.css 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/sidebar/sidebar-main.css 2026-10-05 08:20:05 +0900
@@ -62,9 +62,6 @@
margin-inline: var(--tab-inner-inline-margin);
margin-block-end: var(--space-small);
min-height: 2px;
- @media -moz-pref("browser.nova.enabled") {
- min-height: 4px;
- }
&:hover {
background-color: var(--focus-outline-color);
@@ -121,18 +118,10 @@
&:first-of-type {
--button-outer-padding-block-start: var(--space-small);
-
- @media -moz-pref("browser.nova.enabled") and (not -moz-pref("sidebar.verticalTabs")) {
- --button-outer-padding-block-start: 4px;
- }
}
&:last-of-type {
--button-outer-padding-block-end: var(--space-small);
-
- @media -moz-pref("browser.nova.enabled") and (not -moz-pref("sidebar.verticalTabs")) {
- --button-outer-padding-block-end: 4px;
- }
}
}
@@ -156,10 +145,6 @@
padding-inline: var(--space-medium);
padding-block-end: var(--space-small);
- @media -moz-pref("browser.nova.enabled") {
- gap: 12.5px;
- }
-
@media -moz-pref("sidebar.visibility", "expand-on-hover") {
/* We need these rules to apply at all times when the sidebar.visibility
pref is set to "expand-on-hover" as opposed to when the "sidebar-expand-on-hover" attribute
diff -urN firefox-157.0-orig/browser/components/sidebar/sidebar-opentabs-preview.css firefox-157.0/browser/components/sidebar/sidebar-opentabs-preview.css
--- firefox-157.0-orig/browser/components/sidebar/sidebar-opentabs-preview.css 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/sidebar/sidebar-opentabs-preview.css 2026-10-05 08:19:53 +0900
@@ -32,10 +32,6 @@
border-radius: var(--border-radius-medium);
margin-inline: calc(-1 * var(--space-small));
- @media -moz-pref("browser.nova.enabled") {
- border-radius: var(--border-radius-circle);
- }
-
cursor: pointer;
&:hover {
diff -urN firefox-157.0-orig/browser/components/sidebar/sidebar-opentabs.css firefox-157.0/browser/components/sidebar/sidebar-opentabs.css
--- firefox-157.0-orig/browser/components/sidebar/sidebar-opentabs.css 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/sidebar/sidebar-opentabs.css 2026-10-05 08:20:38 +0900
@@ -4,39 +4,6 @@
@import url("chrome://browser/skin/tabbrowser/tab.tokens.css");
-.pinned-tabs moz-button::part(button) {
- @media -moz-pref("browser.nova.enabled") {
- border-color: transparent;
- }
-}
-
-.pinned-tabs moz-button.selected::part(button) {
- @media -moz-pref("browser.nova.enabled") {
- outline: 1px solid var(--tab-border-color-selected);
- outline-offset: -1px;
-
- @media (not (prefers-contrast)) {
- border: 1px solid transparent;
- /* stylelint-disable-next-line stylelint-plugin-mozilla/use-design-tokens */
- background:
- var(--tab-border-color-accent) border-box border-area,
- var(--tab-background-color-selected) padding-box;
- color: var(--tab-text-color-selected);
- }
- }
-}
-
-.pinned-tabs moz-button.selected.inactive::part(button) {
- @media -moz-pref("browser.nova.enabled") {
- outline-color: color-mix(in srgb, var(--tab-border-color-selected) 60%, transparent);
- --tab-border-color-accent: linear-gradient(
- 96deg,
- color-mix(in srgb, var(--color-violet-30) 60%, transparent) 20.68%,
- color-mix(in srgb, light-dark(var(--color-orange-30), var(--color-violet-50)) 60%, transparent) 79.34%
- );
- }
-}
-
.pinned-tabs {
display: flex;
flex-wrap: wrap;
diff -urN firefox-157.0-orig/browser/components/sidebar/sidebar-pins-promo.mjs firefox-157.0/browser/components/sidebar/sidebar-pins-promo.mjs
--- firefox-157.0-orig/browser/components/sidebar/sidebar-pins-promo.mjs 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/sidebar/sidebar-pins-promo.mjs 2026-10-05 08:19:01 +0900
@@ -53,13 +53,7 @@
false,
() => this.requestUpdate()
);
- XPCOMUtils.defineLazyPreferenceGetter(
- this,
- "novaEnabled",
- "browser.nova.enabled",
- false,
- () => this.requestUpdate()
- );
+ this.novaEnabled = false;
this.launcherObserver = new MutationObserver(() => this.requestUpdate());
}
#icons = [
diff -urN firefox-157.0-orig/browser/components/sidebar/sidebar-tab-list.css firefox-157.0/browser/components/sidebar/sidebar-tab-list.css
--- firefox-157.0-orig/browser/components/sidebar/sidebar-tab-list.css 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/sidebar/sidebar-tab-list.css 2026-10-05 08:20:10 +0900
@@ -22,7 +22,5 @@
outline-offset: var(--focus-outline-inset);
}
- @media not -moz-pref("browser.nova.enabled") {
border-radius: var(--border-radius-medium);
- }
}
diff -urN firefox-157.0-orig/browser/components/sidebar/sidebar-tab-row.css firefox-157.0/browser/components/sidebar/sidebar-tab-row.css
--- firefox-157.0-orig/browser/components/sidebar/sidebar-tab-row.css 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/sidebar/sidebar-tab-row.css 2026-10-05 08:19:49 +0900
@@ -116,42 +116,6 @@
-moz-context-properties: fill;
fill: var(--identity-icon-color);
margin-inline-end: 8px;
-
- /* Match the container context-menu items: fill-color icon inside a round
- 15% tinted background. */
- @media -moz-pref("browser.nova.enabled") {
- box-sizing: content-box;
- padding: var(--identity-icon-inset);
- border-radius: var(--border-radius-circle);
- background-color: var(--identity-fill-tint);
- background-origin: content-box;
- background-repeat: no-repeat;
- background-position: center;
- fill: var(--identity-fill-color);
- }
-}
-
-:host([current]) {
- @media -moz-pref("browser.nova.enabled") {
- outline: 1px solid var(--tab-border-color-selected);
- outline-offset: -1px;
-
- @media (not (prefers-contrast)) {
- border: 1px solid transparent;
- background:
- var(--tab-border-color-accent) border-box border-area,
- var(--tab-background-color-selected) padding-box;
- color: var(--tab-text-color-selected);
- }
- }
-}
-
-:host([current][inactive-window]) {
- @media -moz-pref("browser.nova.enabled") {
- outline-color: color-mix(in srgb, var(--tab-border-color-selected) 60%, transparent);
- --tab-border-color-selected-leading: color-mix(in srgb, var(--color-violet-30) 60%, transparent);
- --tab-border-color-selected-trailing: color-mix(in srgb, light-dark(var(--color-orange-30), var(--color-violet-50)) 60%, transparent);
- }
}
:host([medium-view]) {
diff -urN firefox-157.0-orig/browser/components/sidebar/sidebar.css firefox-157.0/browser/components/sidebar/sidebar.css
--- firefox-157.0-orig/browser/components/sidebar/sidebar.css 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/sidebar/sidebar.css 2026-10-05 08:23:40 +0900
@@ -55,22 +55,11 @@
--card-gap: var(--space-small);
--card-padding: 8px;
--card-heading-padding-inline: 12px;
- @media -moz-pref("browser.nova.enabled") {
- --card-background-color: transparent;
- }
margin-block-start: var(--space-medium);
box-shadow: none;
color: var(--sidebar-box-color);
border: var(--sidebar-box-border);
- @media -moz-pref("browser.nova.enabled") {
- --card-padding: 0;
- border: none;
-
- &::part(moz-card-heading-wrapper) {
- padding-inline: 8px;
- }
- }
&::part(summary) {
min-height: var(--sidebar-panel-subheading-min-height);
diff -urN firefox-157.0-orig/browser/components/sidebar/tests/browser/browser.toml firefox-157.0/browser/components/sidebar/tests/browser/browser.toml
--- firefox-157.0-orig/browser/components/sidebar/tests/browser/browser.toml 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/sidebar/tests/browser/browser.toml 2026-10-05 08:23:20 +0900
@@ -67,9 +67,6 @@
["browser_launcher_splitter_drag_release.js"]
tags = "vertical-tabs"
-["browser_launcher_splitter_expand_on_hover.js"]
-tags = "vertical-tabs"
-
["browser_launcher_splitter_visibility.js"]
tags = "vertical-tabs"
diff -urN firefox-157.0-orig/browser/components/sidebar/tests/browser/browser_domfullscreen_sidebar.js firefox-157.0/browser/components/sidebar/tests/browser/browser_domfullscreen_sidebar.js
--- firefox-157.0-orig/browser/components/sidebar/tests/browser/browser_domfullscreen_sidebar.js 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/sidebar/tests/browser/browser_domfullscreen_sidebar.js 2026-10-05 08:21:26 +0900
@@ -64,35 +64,3 @@
);
});
});
-
-add_task(async function dom_fullscreen_has_no_extra_margins() {
- // Ensure that DOM fullscreen takes up the entire window with no unnecessary
- // gaps. (Bug 2057087)
- await SpecialPowers.pushPrefEnv({
- set: [
- ["browser.nova.enabled", true],
- ["sidebar.visibility", "expand-on-hover"],
- ],
- });
- const tabbox = document.getElementById("tabbrowser-tabbox");
-
- await BrowserTestUtils.withNewTab(
- { gBrowser, url: "https://example.com/" },
- async browser => {
- await DOMFullscreenTestUtils.changeFullscreen(browser, true);
- const { marginInlineStart, marginInlineEnd } = getComputedStyle(tabbox);
- Assert.equal(
- parseInt(marginInlineStart),
- 0,
- "Tabbox has no start margins while in DOM fullscreen."
- );
- Assert.equal(
- parseInt(marginInlineEnd),
- 0,
- "Tabbox has no end margins while in DOM fullscreen."
- );
- }
- );
-
- await SpecialPowers.popPrefEnv();
-});
diff -urN firefox-157.0-orig/browser/components/sidebar/tests/browser/browser_opentabs_sidebar.js firefox-157.0/browser/components/sidebar/tests/browser/browser_opentabs_sidebar.js
--- firefox-157.0-orig/browser/components/sidebar/tests/browser/browser_opentabs_sidebar.js 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/sidebar/tests/browser/browser_opentabs_sidebar.js 2026-10-05 08:21:14 +0900
@@ -323,58 +323,6 @@
SidebarTestUtils.closePanel(window);
});
-add_task(async function test_nova_current_tab_marker() {
- await SpecialPowers.pushPrefEnv({
- set: [["browser.nova.enabled", true]],
- });
-
- const tabA = await BrowserTestUtils.openNewForegroundTab(
- gBrowser,
- "about:blank"
- );
- const tabB = await BrowserTestUtils.openNewForegroundTab(
- gBrowser,
- "about:blank"
- );
-
- const component = await showOpenTabsPanel();
- const tabList = getTabList(component);
- await waitForRowCount(tabList, getVisibleTabCount());
-
- const rowFor = tab =>
- [...tabList.rowEls].find(rowEl => rowEl.tabElement === tab);
-
- Assert.ok(
- rowFor(tabB).hasAttribute("current"),
- "The currently-selected tab's row carries the [current] attribute."
- );
- Assert.ok(
- !rowFor(tabA).hasAttribute("current"),
- "A non-selected tab's row does not carry the [current] attribute."
- );
-
- gBrowser.selectedTab = tabA;
- await BrowserTestUtils.waitForMutationCondition(
- tabList.shadowRoot,
- { subtree: true, attributes: true, attributeFilter: ["current"] },
- () => rowFor(tabA)?.hasAttribute("current")
- );
-
- Assert.ok(
- rowFor(tabA).hasAttribute("current"),
- "Switching gBrowser.selectedTab moves the [current] attribute."
- );
- Assert.ok(
- !rowFor(tabB).hasAttribute("current"),
- "The previously-selected tab no longer has the [current] attribute."
- );
-
- BrowserTestUtils.removeTab(tabA);
- BrowserTestUtils.removeTab(tabB);
- SidebarTestUtils.closePanel(window);
- await SpecialPowers.popPrefEnv();
-});
-
add_task(async function test_window_card_collapse_state_persists() {
const PREF = "sidebar.openTabsPanel.collapsedWindows";
const { SidebarCollapsedWindows } = ChromeUtils.importESModule(
@@ -659,140 +607,6 @@
SidebarTestUtils.closePanel(window);
});
-add_task(async function test_pinned_tab_selected_marker() {
- await SpecialPowers.pushPrefEnv({
- set: [["browser.nova.enabled", true]],
- });
-
- const nonPinnedTab = gBrowser.selectedTab;
- const tabA = await BrowserTestUtils.openNewForegroundTab(
- gBrowser,
- "data:text/html,PinnedA"
- );
- const tabB = await BrowserTestUtils.openNewForegroundTab(
- gBrowser,
- "data:text/html,PinnedB"
- );
- gBrowser.pinTab(tabA);
- gBrowser.pinTab(tabB);
-
- const component = await showOpenTabsPanel();
- await BrowserTestUtils.waitForMutationCondition(
- component.shadowRoot,
- { childList: true, subtree: true },
- () =>
- component.shadowRoot.querySelectorAll(".pinned-tabs moz-button")
- .length === 2
- );
-
- const buttonFor = title =>
- [...component.shadowRoot.querySelectorAll(".pinned-tabs moz-button")].find(
- button => button.title === title
- );
-
- // tabB is the currently-selected tab, so its pinned button is marked.
- await TestUtils.waitForCondition(
- () => buttonFor("PinnedB").classList.contains("selected"),
- "The selected pinned tab's button carries the selected class."
- );
- Assert.ok(
- !buttonFor("PinnedA").classList.contains("selected"),
- "A non-selected pinned tab's button does not carry the selected class."
- );
-
- // Selecting the other pinned tab moves the marker.
- gBrowser.selectedTab = tabA;
- await TestUtils.waitForCondition(
- () => buttonFor("PinnedA").classList.contains("selected"),
- "Selecting the other pinned tab moves the selected class."
- );
- Assert.ok(
- !buttonFor("PinnedB").classList.contains("selected"),
- "The previously-selected pinned tab no longer carries the selected class."
- );
-
- // Selecting a non-pinned tab clears the marker from both pinned buttons.
- gBrowser.selectedTab = nonPinnedTab;
- await TestUtils.waitForCondition(
- () =>
- !buttonFor("PinnedA").classList.contains("selected") &&
- !buttonFor("PinnedB").classList.contains("selected"),
- "Selecting a non-pinned tab clears the marker from the pinned buttons."
- );
-
- gBrowser.unpinTab(tabA);
- gBrowser.unpinTab(tabB);
- BrowserTestUtils.removeTab(tabA);
- BrowserTestUtils.removeTab(tabB);
- SidebarTestUtils.closePanel(window);
- await SpecialPowers.popPrefEnv();
-});
-
-add_task(async function test_inactive_window_deemphasizes_selected_border() {
- await SpecialPowers.pushPrefEnv({
- set: [["browser.nova.enabled", true]],
- });
-
- const component = await showOpenTabsPanel();
- await BrowserTestUtils.waitForMutationCondition(
- component.shadowRoot,
- { childList: true, subtree: true },
- () => component.shadowRoot.querySelectorAll("moz-card").length === 1
- );
-
- const secondWindow = await BrowserTestUtils.openNewBrowserWindow();
- await BrowserTestUtils.openNewForegroundTab(
- secondWindow.gBrowser,
- "data:text/html,Inactive"
- );
- const pinnedTab = secondWindow.gBrowser.tabs[0];
- secondWindow.gBrowser.pinTab(pinnedTab);
- secondWindow.gBrowser.selectedTab = pinnedTab;
-
- await BrowserTestUtils.waitForMutationCondition(
- component.shadowRoot,
- { childList: true, subtree: true },
- () => component.shadowRoot.querySelectorAll("moz-card").length === 2
- );
-
- const cards = component.shadowRoot.querySelectorAll("moz-card");
- const currentList = cards[0].querySelector("sidebar-tab-list");
- const inactiveList = cards[1].querySelector("sidebar-tab-list");
-
- await TestUtils.waitForCondition(
- () => inactiveList.hasAttribute("inactive-window"),
- "The non-current window's tab list is marked inactive."
- );
- Assert.ok(
- !currentList.hasAttribute("inactive-window"),
- "The current window's tab list is not marked inactive."
- );
-
- await BrowserTestUtils.waitForMutationCondition(
- inactiveList.shadowRoot,
- { childList: true, subtree: true, attributes: true },
- () =>
- !![...inactiveList.rowEls].length &&
- [...inactiveList.rowEls].every(row => row.hasAttribute("inactive-window"))
- );
- Assert.ok(
- [...currentList.rowEls].every(row => !row.hasAttribute("inactive-window")),
- "Rows in the current window are not marked inactive."
- );
-
- const inactivePinnedButton = await TestUtils.waitForCondition(() =>
- cards[1].querySelector(".pinned-tabs moz-button.selected")
- );
- Assert.ok(
- inactivePinnedButton.classList.contains("inactive"),
- "The selected pinned tab in a non-current window is marked inactive."
- );
-
- await BrowserTestUtils.closeWindow(secondWindow);
- SidebarTestUtils.closePanel(window);
- await SpecialPowers.popPrefEnv();
-});
-
add_task(async function test_context_menu_close_tab() {
const url = "data:text/html,CloseMe";
const tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, url);
diff -urN firefox-157.0-orig/browser/components/sidebar/tests/browser/browser_sidebar_expand_on_hover.js firefox-157.0/browser/components/sidebar/tests/browser/browser_sidebar_expand_on_hover.js
--- firefox-157.0-orig/browser/components/sidebar/tests/browser/browser_sidebar_expand_on_hover.js 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/sidebar/tests/browser/browser_sidebar_expand_on_hover.js 2026-10-05 08:21:36 +0900
@@ -3,7 +3,7 @@
"use strict";
-const novaEnabled = Services.prefs.getBoolPref("browser.nova.enabled", false);
+const novaEnabled = false;
add_setup(async () => {
await SpecialPowers.pushPrefEnv({
diff -urN firefox-157.0-orig/browser/components/sidebar/tests/browser/browser_sidebar_pinned_tab_promo.js firefox-157.0/browser/components/sidebar/tests/browser/browser_sidebar_pinned_tab_promo.js
--- firefox-157.0-orig/browser/components/sidebar/tests/browser/browser_sidebar_pinned_tab_promo.js 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/sidebar/tests/browser/browser_sidebar_pinned_tab_promo.js 2026-10-05 08:20:55 +0900
@@ -9,7 +9,6 @@
["sidebar.verticalTabs", true],
["sidebar.verticalTabs.dragToPinPromo.dismissed", false],
["sidebar.visibility", "always-show"],
- ["browser.nova.enabled", false],
],
});
});
@@ -30,40 +29,6 @@
);
});
-/* Bug 2052309: tests that the promo is hidden when Nova is enabled */
-add_task(async function test_promo_card_hidden_when_nova_enabled() {
- await SpecialPowers.pushPrefEnv({ set: [["browser.nova.enabled", false]] });
- const promoCard = document.getElementById("drag-to-pin-promo-card");
-
- await SidebarController.updateUIState({ expanded: true });
- ok(
- BrowserTestUtils.isVisible(promoCard),
- "Drag-to-pin promo card is shown when Nova is disabled."
- );
-
- await SpecialPowers.pushPrefEnv({ set: [["browser.nova.enabled", true]] });
- await BrowserTestUtils.waitForMutationCondition(
- promoCard,
- { attributeFilter: ["hidden"] },
- () => BrowserTestUtils.isHidden(promoCard)
- );
- ok(
- BrowserTestUtils.isHidden(promoCard),
- "Drag-to-pin promo card is hidden when Nova is enabled."
- );
-
- await SpecialPowers.popPrefEnv();
- await BrowserTestUtils.waitForMutationCondition(
- promoCard,
- { attributeFilter: ["hidden"] },
- () => BrowserTestUtils.isVisible(promoCard)
- );
- ok(
- BrowserTestUtils.isVisible(promoCard),
- "Drag-to-pin promo card is shown again when Nova is disabled."
- );
-});
-
add_task(async function test_dismiss_promo_card() {
const promoCard = document.getElementById("drag-to-pin-promo-card");
diff -urN firefox-157.0-orig/browser/components/tabbrowser/content/tab-bar-visibility.js firefox-157.0/browser/components/tabbrowser/content/tab-bar-visibility.js
--- firefox-157.0-orig/browser/components/tabbrowser/content/tab-bar-visibility.js 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/tabbrowser/content/tab-bar-visibility.js 2026-10-05 08:44:10 +0900
@@ -37,7 +37,7 @@
// a titlebar? When the tabs toolbar is hidden they form the top edge of the
// window, so they share the titlebar's background and inactive styling.
let isTitlebar = CustomTitlebar.enabled && hideTabsToolbar;
- let titlebarIds = Services.prefs.getBoolPref("browser.nova.enabled")
+ let titlebarIds = false
? ["nav-bar", "PersonalToolbar"]
: ["nav-bar"];
for (let id of titlebarIds) {
diff -urN firefox-157.0-orig/browser/components/tabbrowser/content/tab-hover-preview.mjs firefox-157.0/browser/components/tabbrowser/content/tab-hover-preview.mjs
--- firefox-157.0-orig/browser/components/tabbrowser/content/tab-hover-preview.mjs 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/tabbrowser/content/tab-hover-preview.mjs 2026-10-05 08:44:03 +0900
@@ -56,12 +56,7 @@
"ui.popup.disable_autohide",
false
);
- XPCOMUtils.defineLazyPreferenceGetter(
- this,
- "_novaEnabled",
- "browser.nova.enabled",
- false
- );
+ this._novaEnabled = false;
this.#win = win;
this.#deactivateTimers = new WeakMap();
diff -urN firefox-157.0-orig/browser/components/tabbrowser/content/tabgroup-menu.js firefox-157.0/browser/components/tabbrowser/content/tabgroup-menu.js
--- firefox-157.0-orig/browser/components/tabbrowser/content/tabgroup-menu.js 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/tabbrowser/content/tabgroup-menu.js 2026-10-05 08:43:46 +0900
@@ -951,10 +951,7 @@
}
#maybeUpdateLayoutForNova() {
- const isNovaEnabled = Services.prefs.getBoolPref(
- "browser.nova.enabled",
- false
- );
+ const isNovaEnabled = false;
if (isNovaEnabled) {
this.#nameContainer.before(this.#swatchesContainer);
} else {
diff -urN firefox-157.0-orig/browser/components/tabbrowser/test/browser/dragdrop/browser_drag_to_pin.js firefox-157.0/browser/components/tabbrowser/test/browser/dragdrop/browser_drag_to_pin.js
--- firefox-157.0-orig/browser/components/tabbrowser/test/browser/dragdrop/browser_drag_to_pin.js 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/tabbrowser/test/browser/dragdrop/browser_drag_to_pin.js 2026-10-05 08:41:50 +0900
@@ -138,8 +138,6 @@
["sidebar.verticalTabs", true],
["sidebar.verticalTabs.dragToPinPromo.dismissed", false],
["sidebar.visibility", "always-show"],
- // Bug 2052309: promo card is hidden when Nova is enabled.
- ["browser.nova.enabled", false],
],
});
diff -urN firefox-157.0-orig/browser/components/tabbrowser/test/browser/tabs/browser.toml firefox-157.0/browser/components/tabbrowser/test/browser/tabs/browser.toml
--- firefox-157.0-orig/browser/components/tabbrowser/test/browser/tabs/browser.toml 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/tabbrowser/test/browser/tabs/browser.toml 2026-10-05 08:43:09 +0900
@@ -662,8 +662,6 @@
["browser_tab_splitview_alt_click.js"]
-["browser_tab_splitview_content_size.js"]
-
["browser_tab_splitview_contextmenu.js"]
skip-if = [
"os == 'mac' && os_version == '10.15' && arch == 'x86_64'", # Bug 1994508
diff -urN firefox-157.0-orig/browser/components/tabbrowser/test/browser/tabs/browser_tab_group_menu.js firefox-157.0/browser/components/tabbrowser/test/browser/tabs/browser_tab_group_menu.js
--- firefox-157.0-orig/browser/components/tabbrowser/test/browser/tabs/browser_tab_group_menu.js 2026-09-24 19:45:34 +0900
+++ firefox-157.0/browser/components/tabbrowser/test/browser/tabs/browser_tab_group_menu.js 2026-10-05 08:43:21 +0900
@@ -509,10 +509,6 @@
* when Nova is disabled.
*/
add_task(async function test_swatchLayoutDefault() {
- await SpecialPowers.pushPrefEnv({
- set: [["browser.nova.enabled", false]],
- });
-
let { tabgroupEditor, group } = await createTabGroupAndOpenEditPanel(
[],
"test_swatchLayoutDefault"
@@ -539,71 +535,6 @@
tabgroupPanel.hidePopup();
await panelHidden;
- await removeTabGroup(group);
- await SpecialPowers.popPrefEnv();
-});
-
-/**
- * Tests that the swatches are positioned before the name field
- * when Nova is enabled, and that their positions are restored
- * when Nova is disabled.
- */
-add_task(async function test_swatchLayoutNova() {
- await SpecialPowers.pushPrefEnv({
- set: [["browser.nova.enabled", true]],
- });
-
- let { tabgroupEditor, group } = await createTabGroupAndOpenEditPanel(
- [],
- "test_swatchLayoutNova"
- );
- let tabgroupPanel = tabgroupEditor.panel;
- let swatches = tabgroupPanel.querySelector(".tab-group-editor-swatches");
- let nameContainer = tabgroupPanel.querySelector(".tab-group-editor-name");
- let propertiesActions = tabgroupPanel.querySelector(
- "#tab-group-properties-and-actions"
- );
-
- Assert.equal(
- swatches.nextElementSibling,
- nameContainer,
- "Swatches are directly above the name field when Nova is enabled"
- );
- Assert.notEqual(
- swatches.parentElement,
- propertiesActions,
- "Swatches are not in the properties-and-actions container when Nova is enabled"
- );
-
- let panelHidden = BrowserTestUtils.waitForPopupEvent(tabgroupPanel, "hidden");
- tabgroupPanel.hidePopup();
- await panelHidden;
- await SpecialPowers.popPrefEnv();
-
- // Verify layout is restored when we re-open the panel and disable Nova.
- await SpecialPowers.pushPrefEnv({
- set: [["browser.nova.enabled", false]],
- });
-
- let panelShown = BrowserTestUtils.waitForPopupEvent(tabgroupPanel, "shown");
- tabgroupEditor.openEditModal(group);
- await panelShown;
-
- Assert.notEqual(
- swatches.nextElementSibling,
- nameContainer,
- "Swatches are not directly above the name field after disabling Nova"
- );
- Assert.equal(
- swatches.parentElement,
- propertiesActions,
- "Swatches are back in the properties-and-actions container after disabling Nova"
- );
-
- panelHidden = BrowserTestUtils.waitForPopupEvent(tabgroupPanel, "hidden");
- tabgroupPanel.hidePopup();
- await panelHidden;
-
await removeTabGroup(group);
await SpecialPowers.popPrefEnv();
});
diff -urN firefox-157.0-orig/browser/components/tabbrowser/test/browser/tabs/browser_tab_preview.js firefox-157.0/browser/components/tabbrowser/test/browser/tabs/browser_tab_preview.js
--- firefox-157.0-orig/browser/components/tabbrowser/test/browser/tabs/browser_tab_preview.js 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/tabbrowser/test/browser/tabs/browser_tab_preview.js 2026-10-05 08:42:25 +0900
@@ -1203,23 +1203,9 @@
const testCases = [
{
- prefs: [["browser.nova.enabled", false]],
expected: { position: "bottomleft topleft", x: 0, y: 0 },
message: "Without Nova there is no offset",
},
- {
- prefs: [["browser.nova.enabled", true]],
- expected: { position: "bottomleft topleft", x: -16, y: 0 },
- message: "LTR Nova anchors to the left edge and offsets by -16px",
- },
- {
- prefs: [
- ["browser.nova.enabled", true],
- ["intl.l10n.pseudo", "bidi"],
- ],
- expected: { position: "bottomright topright", x: 16, y: 0 },
- message: "RTL Nova anchors to the right edge and offsets by +16px",
- },
];
await withGroupPanel(async groupPanel => {
@@ -1232,60 +1218,18 @@
await SpecialPowers.popPrefEnv();
});
-add_task(async function tabGroupPanelHorizontalOpensWithOffset() {
- // The vertical-tabs variant enables sidebar.verticalTabs for the whole run.
- await SpecialPowers.pushPrefEnv({
- set: [
- ["sidebar.verticalTabs", false],
- ["browser.nova.enabled", true],
- ],
- });
-
- await withGroupPanel(async (groupPanel, group) => {
- const openPopupSpy = sinon.spy(groupPanel.panelElement, "openPopup");
- await openGroupPreview(group);
-
- Assert.ok(
- openPopupSpy.calledWith(
- group.labelContainerElement,
- sinon.match({ position: "bottomleft topleft", x: -16, y: 0 })
- ),
- "openPopup is called anchored to the label with the Nova offset"
- );
-
- await closeGroupPreviews();
- sinon.restore();
- });
-
- await SpecialPowers.popPrefEnv();
-});
-
add_task(async function tabGroupPanelVerticalOffsetOptions() {
const testCases = [
{
- nova: false,
start: true,
expected: { position: "topright topleft", x: 0, y: -5 },
message: "Nova off, sidebar at start: keeps the 5px upward offset",
},
{
- nova: false,
start: false,
expected: { position: "topleft topright", x: 0, y: -5 },
message: "Nova off, sidebar at end: 5px offset, anchor mirrored",
},
- {
- nova: true,
- start: true,
- expected: { position: "topright topleft", x: 0, y: -16 },
- message: "Nova on, sidebar at start: 16px upward offset",
- },
- {
- nova: true,
- start: false,
- expected: { position: "topleft topright", x: 0, y: -16 },
- message: "Nova on, sidebar at end: 16px offset, anchor mirrored",
- },
];
await withGroupPanel(async groupPanel => {
await SpecialPowers.pushPrefEnv({
@@ -1299,10 +1243,9 @@
"Tabs are in vertical mode"
);
- for (const { nova, start, expected, message } of testCases) {
+ for (const { start, expected, message } of testCases) {
await assertPopupOptions(groupPanel, {
prefs: [
- ["browser.nova.enabled", nova],
["sidebar.position_start", start],
],
expected,
diff -urN firefox-157.0-orig/browser/components/tabbrowser/test/browser/tabs/browser_tab_splitview_content_size.js firefox-157.0/browser/components/tabbrowser/test/browser/tabs/browser_tab_splitview_content_size.js
--- firefox-157.0-orig/browser/components/tabbrowser/test/browser/tabs/browser_tab_splitview_content_size.js 2026-09-24 19:45:33 +0900
+++ firefox-157.0/browser/components/tabbrowser/test/browser/tabs/browser_tab_splitview_content_size.js 1970-01-01 09:00:00 +0900
@@ -1,227 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- https://creativecommons.org/publicdomain/zero/1.0/ */
-
-"use strict";
-
-// Selecting one panel of a split view must not resize either panel's content
-// area. Decoration that distinguishes the selected panel from the non-selected
-// one has to be drawn without taking up layout space, otherwise every
-// selection change reflows both documents (bug 2051212).
-
-// Give the document enough width- and height-dependent layout that resizing it
-// has real work to do, so that an optimization which skips reflow for a trivial
-// document could not quietly invalidate this test.
-const PAGE =
- "data:text/html," +
- encodeURIComponent(
- "Split view panel" +
- '' +
- "
" +
- "Text that must be laid out again whenever the viewport changes. ".repeat(
- 10
- ) +
- "
"
- );
-const STOP_COUNTING = "TestStopCountingReflows";
-
-registerCleanupFunction(() => {
- Services.prefs.clearUserPref("browser.tabs.splitview.hasUsed");
-});
-
-/**
- * Content area dimensions of a split view panel, measured both from the parent
- * process and from within the document itself.
- *
- * @param {MozTabbrowserTab} tab
- * @returns {Promise