From 20ea551c9b2337d851b65a1b9f84184e432cd1cd Mon Sep 17 00:00:00 2001
From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com>
Date: Fri, 20 Mar 2026 12:48:24 +0100
Subject: [PATCH] no-bug: Sync upstream Firefox to version 149.0 (gh-12826)
---
README.md | 2 +-
build/firefox-cache/l10n-last-commit-hash | 2 +-
prefs/firefox/browser.yaml | 3 +
prefs/firefox/urlbar.yaml | 3 +
prefs/zen/zen.yaml | 3 -
src/-prettierignore.patch | 4 +-
src/-stylelintrc-js.patch | 7 +-
src/Cargo-lock.patch | 13 -
src/Cargo-toml.patch | 13 -
src/browser/actors/WebRTCParent-sys-mjs.patch | 2 +-
.../base/content/browser-addons-js.patch | 22 +-
.../base/content/browser-commands-js.patch | 2 +-
.../browser-fullScreenAndPointerLock-js.patch | 10 +-
.../base/content/browser-init-js.patch | 6 +-
src/browser/base/content/browser-js.patch | 16 +-
.../base/content/browser-places-js.patch | 8 +-
.../base/content/browser-sets-inc.patch | 4 +-
.../base/content/browser-sets-js.patch | 6 +-
.../content/browser-siteIdentity-js.patch | 6 +-
src/browser/base/content/browser-xhtml.patch | 2 +-
.../content/navigator-toolbox-inc-xhtml.patch | 2 +-
.../base/content/navigator-toolbox-js.patch | 16 +-
.../base/content/nsContextMenu-sys-mjs.patch | 4 +-
.../base/content/zen-preloaded.inc.xhtml | 1 -
src/browser/base/jar-mn.patch | 4 +-
.../components/BrowserGlue-sys-mjs.patch | 6 +-
.../content/aboutwelcome-css.patch | 8 +-
.../ui/modules/AIWindow-sys-mjs.patch | 12 +
.../modules/FeatureCallout-sys-mjs.patch | 2 +-
.../CustomizableUI-sys-mjs.patch | 48 +--
.../CustomizeMode-sys-mjs.patch | 2 +-
.../ToolbarContextMenu-sys-mjs.patch | 4 +-
.../customizableui/content/panelUI-js.patch | 2 +-
.../extensions/parent/ext-browser-js.patch | 4 +-
.../extensions/parent/ext-tabs-js.patch | 6 +-
.../places/PlacesUIUtils-sys-mjs.patch | 14 +-
.../content/bookmarkProperties-xhtml.patch | 2 +-
.../content/browserPlacesViews-js.patch | 12 +-
.../places/content/editBookmark-js.patch | 8 +-
.../components/preferences/jar-mn.patch | 4 +-
.../preferences/main-inc-xhtml.patch | 14 +-
.../components/preferences/main-js.patch | 6 +-
.../preferences/preferences-js.patch | 6 +-
.../preferences/preferences-xhtml.patch | 10 +-
.../preferences/sync-inc-xhtml.patch | 2 +-
.../search/SearchOneOffs-sys-mjs.patch | 4 +-
.../search/SearchUIUtils-sys-mjs.patch | 4 +-
.../sessionstore/SessionStore-sys-mjs.patch | 72 ++--
.../sessionstore/TabGroupState-sys-mjs.patch | 4 +-
.../sessionstore/TabState-sys-mjs.patch | 6 +-
.../sidebar/browser-sidebar-js.patch | 4 +-
.../tabbrowser/TabsList-sys-mjs.patch | 2 +-
.../tabbrowser/content/drag-and-drop-js.patch | 166 ++++-----
.../tabbrowser/content/tab-js.patch | 34 +-
.../tabbrowser/content/tabbrowser-js.patch | 252 +++++++-------
.../tabbrowser/content/tabgroup-js.patch | 25 +-
.../tabbrowser/content/tabs-js.patch | 48 +--
.../urlbar/UrlbarController-sys-mjs.patch | 2 +-
.../urlbar/UrlbarMuxerStandard-sys-mjs.patch | 4 +-
.../urlbar/UrlbarPrefs-sys-mjs.patch | 2 +-
...barProviderHeuristicFallback-sys-mjs.patch | 4 +-
.../UrlbarProvidersManager-sys-mjs.patch | 4 +-
.../urlbar/UrlbarResult-sys-mjs.patch | 4 +-
.../urlbar/UrlbarUtils-sys-mjs.patch | 8 +-
.../urlbar/UrlbarValueFormatter-sys-mjs.patch | 8 +-
.../newtab/lib/ActivityStream-sys-mjs.patch | 4 +-
.../installer/package-manifest-in.patch | 4 +-
.../windows/msix/AppxManifest-xml-in.patch | 12 -
.../windows/nsis/installer-nsi.patch | 6 +-
.../installer/windows/nsis/shared-nsh.patch | 48 ---
.../windows/nsis/uninstaller-nsi.patch | 4 +-
.../BrowserWindowTracker-sys-mjs.patch | 6 +-
.../modules/ExtensionsUI-sys-mjs.patch | 4 +-
.../modules/URILoadingHelper-sys-mjs.patch | 22 +-
src/browser/themes/linux/browser-css.patch | 2 +-
src/browser/themes/osx/browser-css.patch | 2 +-
.../themes/shared/browser-shared-css.patch | 15 +-
.../identity-block/identity-block-css.patch | 2 +-
src/browser/themes/shared/jar-inc-mn.patch | 4 +-
.../shared/preferences/zen-preferences.css | 3 +-
.../shared/tabbrowser/content-area-css.patch | 8 +-
.../themes/shared/tabbrowser/tabs-css.patch | 38 +--
.../themes/shared/toolbarbuttons-css.patch | 26 +-
.../themes/shared/urlbar-searchbar-css.patch | 10 +-
.../themes/shared/urlbar-variables-css.patch | 13 +
.../themes/shared/urlbarView-css.patch | 6 +-
src/docshell/base/nsAboutRedirector-cpp.patch | 2 +-
src/dom/base/Document-cpp.patch | 6 +-
.../mediacontrol/MediaController-cpp.patch | 2 +-
.../mediaelement/HTMLMediaElement-cpp.patch | 4 +-
src/eslint-file-globals-config-mjs.patch | 4 +-
..._urlbar_closeonwindowblur_preference.patch | 2 +-
.../firefox/native_macos_popovers.patch | 130 +++----
src/external-patches/manifest.json | 8 +-
src/gfx/wr/webrender/src/picture-rs.patch | 18 -
src/image/decoders/nsJXLDecoder-cpp.patch | 318 ------------------
src/image/decoders/nsJXLDecoder-h.patch | 23 --
.../libpref/init/StaticPrefList-yaml.patch | 4 +-
.../style/gecko/media_features-rs.patch | 2 +-
src/testing/mochitest/browser-test-js.patch | 6 +-
.../rust/mime_guess/src/mime_types-rs.patch | 31 --
.../PictureInPictureChild-sys-mjs.patch | 2 +-
.../downloads/DownloadList-sys-mjs.patch | 12 -
.../extensions/parent/ext-downloads-js.patch | 20 --
.../extensions/parent/ext-tabs-base-js.patch | 14 +-
.../content/filepicker-properties.patch | 13 -
.../widgets/browser-custom-element-mjs.patch | 4 +-
src/toolkit/content/widgets/tabbox-js.patch | 12 +-
src/toolkit/content/xul-css.patch | 2 +-
.../unknownContentType-properties.patch | 12 -
.../modules/AppConstants-sys-mjs.patch | 4 +-
.../LightweightThemeConsumer-sys-mjs.patch | 4 +-
src/toolkit/modules/moz-build.patch | 4 +-
.../extensions/AddonManager-sys-mjs.patch | 4 +-
.../extensions/content/aboutaddons-css.patch | 4 +-
.../profile/nsToolkitProfileService-cpp.patch | 6 +-
.../dist/tokens-shared-css.patch | 2 +-
.../shared/in-content/common-shared-css.patch | 24 +-
src/toolkit/themes/shared/menulist-css.patch | 2 +-
src/toolkit/themes/shared/popup-css.patch | 6 +-
src/toolkit/xre/nsXREDirProvider-cpp.patch | 8 +-
.../signing/macos/mach_commands-py.patch | 4 +-
src/widget/cocoa/nsDragService-mm.patch | 6 +-
src/widget/gtk/nsAppShell-cpp.patch | 14 -
src/xpfe/appshell/AppWindow-cpp.patch | 2 +-
src/zen/common/ZenPreloadedScripts.js | 1 +
src/zen/common/modules/ZenUIManager.mjs | 3 +-
src/zen/common/styles/zen-omnibox.css | 2 +-
.../common/styles/zen-single-components.css | 3 +-
src/zen/drag-and-drop/nsZenDragAndDrop.h | 4 +-
src/zen/folders/ZenFolders.mjs | 4 +-
src/zen/mods/ZenStyleSheetCache.h | 4 +-
src/zen/mods/nsZenModsBackend.h | 4 +-
src/zen/split-view/ZenViewSplitter.mjs | 2 +-
src/zen/tabs/ZenPinnedTabManager.mjs | 2 +-
.../sandbox/browser_xdg_default.toml | 5 +-
.../sandbox/browser_xdg_mozLegacyHome.toml | 5 +-
.../shell/unit/test_writeShortcutIcon.js | 72 ++++
.../tests/mochitests/shell/unit/xpcshell.toml | 9 +
src/zen/toolkit/common/ZenCommonUtils.h | 4 +-
src/zen/toolkit/common/ZenShareInternal.h | 4 +-
src/zen/urlbar/ZenUBProvider.sys.mjs | 7 +-
src/zen/welcome/ZenWelcome.mjs | 19 +-
surfer.json | 2 +-
144 files changed, 828 insertions(+), 1302 deletions(-)
delete mode 100644 src/Cargo-lock.patch
delete mode 100644 src/Cargo-toml.patch
create mode 100644 src/browser/components/aiwindow/ui/modules/AIWindow-sys-mjs.patch
delete mode 100644 src/browser/installer/windows/msix/AppxManifest-xml-in.patch
delete mode 100644 src/browser/installer/windows/nsis/shared-nsh.patch
create mode 100644 src/browser/themes/shared/urlbar-variables-css.patch
delete mode 100644 src/gfx/wr/webrender/src/picture-rs.patch
delete mode 100644 src/image/decoders/nsJXLDecoder-cpp.patch
delete mode 100644 src/image/decoders/nsJXLDecoder-h.patch
delete mode 100644 src/third_party/rust/mime_guess/src/mime_types-rs.patch
delete mode 100644 src/toolkit/components/downloads/DownloadList-sys-mjs.patch
delete mode 100644 src/toolkit/components/extensions/parent/ext-downloads-js.patch
delete mode 100644 src/toolkit/content/filepicker-properties.patch
delete mode 100644 src/toolkit/locales/en-US/chrome/mozapps/downloads/unknownContentType-properties.patch
delete mode 100644 src/widget/gtk/nsAppShell-cpp.patch
create mode 100644 src/zen/tests/mochitests/shell/unit/test_writeShortcutIcon.js
diff --git a/README.md b/README.md
index 8482e4ec2..39b0bd086 100644
--- a/README.md
+++ b/README.md
@@ -35,7 +35,7 @@ Zen is a firefox-based browser with the aim of pushing your productivity to a ne
### Firefox Versions
- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `148.0.2`! 🚀
-- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 148.0.2`!
+- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 149.0`!
### Contributing
diff --git a/build/firefox-cache/l10n-last-commit-hash b/build/firefox-cache/l10n-last-commit-hash
index 7057faa04..d845bf6e1 100644
--- a/build/firefox-cache/l10n-last-commit-hash
+++ b/build/firefox-cache/l10n-last-commit-hash
@@ -1 +1 @@
-7b8f3620beb1de157d972de32f9f34320f0ae189
\ No newline at end of file
+c10d7dc50d4b596942cce48f8b023b831a27480a
\ No newline at end of file
diff --git a/prefs/firefox/browser.yaml b/prefs/firefox/browser.yaml
index 1570f2eba..e477ec087 100644
--- a/prefs/firefox/browser.yaml
+++ b/prefs/firefox/browser.yaml
@@ -79,3 +79,6 @@
- name: browser.tabs.dragDrop.moveOverThresholdPercent
value: 50 # Percentage of tab height to trigger move over on drag-and-drop
+
+- name: browser.settings-redesign.enabled
+ value: true
diff --git a/prefs/firefox/urlbar.yaml b/prefs/firefox/urlbar.yaml
index df3ae8b60..804198654 100644
--- a/prefs/firefox/urlbar.yaml
+++ b/prefs/firefox/urlbar.yaml
@@ -61,3 +61,6 @@
#Â We've submitted a patch to Firefox at https://bugzilla.mozilla.org/show_bug.cgi?id=2018499
- name: browser.urlbar.closeOnWindowBlur
value: false
+
+- name: browser.urlbar.trustPanel.featureGate
+ value: false
diff --git a/prefs/zen/zen.yaml b/prefs/zen/zen.yaml
index d83477751..fd0dbd67f 100644
--- a/prefs/zen/zen.yaml
+++ b/prefs/zen/zen.yaml
@@ -23,9 +23,6 @@
- name: zen.tabs.select-recently-used-on-close
value: true
-- name: zen.tabs.use-legacy-drag-and-drop
- value: false
-
- name: zen.tabs.folder-dragover-threshold-percent
value: 20 # Percentage of folder height to trigger dragover
diff --git a/src/-prettierignore.patch b/src/-prettierignore.patch
index edcc3a185..a1963c31b 100644
--- a/src/-prettierignore.patch
+++ b/src/-prettierignore.patch
@@ -1,8 +1,8 @@
diff --git a/.prettierignore b/.prettierignore
-index cbca8bb4b36cecc44e6b498e9ef15bc4bdc21871..8f3a14e14a2d58875bdd6f04bd31f57e23073148 100644
+index 3e562d74d744bb703c9ebb8ea2df496feb40f48a..3285ee51c32029ce80e8b22616389bc776345da4 100644
--- a/.prettierignore
+++ b/.prettierignore
-@@ -1795,3 +1795,12 @@ tools/ts/test/baselines/
+@@ -1804,3 +1804,12 @@ tools/ts/test/baselines/
try_task_config.json
xpcom/idl-parser/xpidl/fixtures/xpctest.d.json
**/package-lock.json
diff --git a/src/-stylelintrc-js.patch b/src/-stylelintrc-js.patch
index 9e3900231..2454e3824 100644
--- a/src/-stylelintrc-js.patch
+++ b/src/-stylelintrc-js.patch
@@ -1,5 +1,5 @@
diff --git a/.stylelintrc.js b/.stylelintrc.js
-index 36719c9e152c34da2aa76fc74d74e58cb9e6b1cc..4226db2e0af4b36923a93dcd0b76e59f8508ba36 100644
+index 3c9fecf731126fdbf900d1bdcd3635dd31ed53ef..c3a210b8153e9699c6cbdc0d568bb72433976b2c 100644
--- a/.stylelintrc.js
+++ b/.stylelintrc.js
@@ -67,7 +67,7 @@ module.exports = {
@@ -11,15 +11,12 @@ index 36719c9e152c34da2aa76fc74d74e58cb9e6b1cc..4226db2e0af4b36923a93dcd0b76e59f
{
ignore: ["blockless-at-rules"],
},
-@@ -274,9 +274,9 @@ module.exports = {
+@@ -274,7 +274,7 @@ module.exports = {
// Remove this line setting `csscontrols/use-logical` to null after implementing fixes
"csstools/use-logical": null,
"stylelint-plugin-mozilla/no-base-design-tokens": true,
- "stylelint-plugin-mozilla/use-design-tokens": true,
+ "stylelint-plugin-mozilla/use-design-tokens": false,
- "stylelint-plugin-mozilla/no-non-semantic-token-usage": true,
-- "stylelint-plugin-mozilla/use-size-tokens": true,
-+ "stylelint-plugin-mozilla/use-size-tokens": false,
},
overrides: [
diff --git a/src/Cargo-lock.patch b/src/Cargo-lock.patch
deleted file mode 100644
index 8b955b8f7..000000000
--- a/src/Cargo-lock.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/Cargo.lock b/Cargo.lock
-index abc04e6a8e1e68fa71c6de0375f8e953e6369d8b..7bdfb41e255fc12065de064162e9bf9e15d7ff12 100644
---- a/Cargo.lock
-+++ b/Cargo.lock
-@@ -4214,8 +4214,6 @@ dependencies = [
- [[package]]
- name = "mime_guess"
- version = "2.0.4"
--source = "registry+https://github.com/rust-lang/crates.io-index"
--checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef"
- dependencies = [
- "mime",
- "unicase",
diff --git a/src/Cargo-toml.patch b/src/Cargo-toml.patch
deleted file mode 100644
index 33daab5bf..000000000
--- a/src/Cargo-toml.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/Cargo.toml b/Cargo.toml
-index ab9eda43302a6281e59a2738170e77bb0f0b1b90..3389f1c744b56e3a6a4eb3f05b0601bed4538fa1 100644
---- a/Cargo.toml
-+++ b/Cargo.toml
-@@ -240,6 +240,8 @@ moz_asserts = { path = "mozglue/static/rust/moz_asserts" }
- # Workaround for https://github.com/rust-lang/cargo/issues/11232
- rure = { path = "third_party/rust/rure" }
-
-+mime_guess = { path = "third_party/rust/mime_guess" }
-+
- # To-be-published changes.
- unicode-bidi = { git = "https://github.com/servo/unicode-bidi", rev = "ca612daf1c08c53abe07327cb3e6ef6e0a760f0c" }
- nss-gk-api = { git = "https://github.com/beurdouche/nss-gk-api", rev = "e48a946811ffd64abc78de3ee284957d8d1c0d63" }
diff --git a/src/browser/actors/WebRTCParent-sys-mjs.patch b/src/browser/actors/WebRTCParent-sys-mjs.patch
index dca293e17..736cb9905 100644
--- a/src/browser/actors/WebRTCParent-sys-mjs.patch
+++ b/src/browser/actors/WebRTCParent-sys-mjs.patch
@@ -1,5 +1,5 @@
diff --git a/browser/actors/WebRTCParent.sys.mjs b/browser/actors/WebRTCParent.sys.mjs
-index ffa7d61ded4f2cf5866d0cb12dd9b14728a63570..5575943208a734f820758fd50a80503061934d56 100644
+index e8b762b4c8f71ddafc090415abfe97674401dbc2..5dda5fe9c9bc02ebe7713f7bd21315fe4ba8b8cd 100644
--- a/browser/actors/WebRTCParent.sys.mjs
+++ b/browser/actors/WebRTCParent.sys.mjs
@@ -152,6 +152,7 @@ export class WebRTCParent extends JSWindowActorParent {
diff --git a/src/browser/base/content/browser-addons-js.patch b/src/browser/base/content/browser-addons-js.patch
index 0ffa166ff..ba8db225e 100644
--- a/src/browser/base/content/browser-addons-js.patch
+++ b/src/browser/base/content/browser-addons-js.patch
@@ -1,8 +1,8 @@
diff --git a/browser/base/content/browser-addons.js b/browser/base/content/browser-addons.js
-index cfb6b8dd5443966d0635c3d7b477a68eca8fa9e0..c876890706b1a314c7760bbe1ff5e9eb57857e60 100644
+index 737ccf0feff4910426f7f75a20ac20ec480461dc..177ab12f9478e1ce664b7b2c66b0e2c8bca63573 100644
--- a/browser/base/content/browser-addons.js
+++ b/browser/base/content/browser-addons.js
-@@ -1069,7 +1069,7 @@ var gXPInstallObserver = {
+@@ -1061,7 +1061,7 @@ var gXPInstallObserver = {
persistent: true,
hideClose: true,
popupOptions: {
@@ -11,7 +11,7 @@ index cfb6b8dd5443966d0635c3d7b477a68eca8fa9e0..c876890706b1a314c7760bbe1ff5e9eb
},
};
-@@ -1279,7 +1279,7 @@ var gXPInstallObserver = {
+@@ -1283,7 +1283,7 @@ var gXPInstallObserver = {
hideClose: true,
timeout: Date.now() + 30000,
popupOptions: {
@@ -20,7 +20,7 @@ index cfb6b8dd5443966d0635c3d7b477a68eca8fa9e0..c876890706b1a314c7760bbe1ff5e9eb
},
};
-@@ -2212,7 +2212,7 @@ var gUnifiedExtensions = {
+@@ -2210,7 +2210,7 @@ var gUnifiedExtensions = {
// If the new ID is not added in NOTIFICATION_IDS, consider handling the case
// in the "PopupNotificationsBeforeAnchor" handler elsewhere in this file.
getPopupAnchorID(aBrowser, aWindow) {
@@ -29,7 +29,7 @@ index cfb6b8dd5443966d0635c3d7b477a68eca8fa9e0..c876890706b1a314c7760bbe1ff5e9eb
const attr = anchorID + "popupnotificationanchor";
if (!aBrowser[attr]) {
-@@ -2223,7 +2223,7 @@ var gUnifiedExtensions = {
+@@ -2221,7 +2221,7 @@ var gUnifiedExtensions = {
anchorID
// Anchor on the toolbar icon to position the popup right below the
// button.
@@ -38,7 +38,7 @@ index cfb6b8dd5443966d0635c3d7b477a68eca8fa9e0..c876890706b1a314c7760bbe1ff5e9eb
}
return anchorID;
-@@ -2548,7 +2548,7 @@ var gUnifiedExtensions = {
+@@ -2546,7 +2546,7 @@ var gUnifiedExtensions = {
requestAnimationFrame(() => this.updateAttention());
},
@@ -47,7 +47,7 @@ index cfb6b8dd5443966d0635c3d7b477a68eca8fa9e0..c876890706b1a314c7760bbe1ff5e9eb
// A list of extension widget IDs (possibly empty).
let widgetIDs;
-@@ -2562,7 +2562,7 @@ var gUnifiedExtensions = {
+@@ -2560,7 +2560,7 @@ var gUnifiedExtensions = {
}
// The list of overflowed extensions in the extensions panel.
@@ -56,7 +56,7 @@ index cfb6b8dd5443966d0635c3d7b477a68eca8fa9e0..c876890706b1a314c7760bbe1ff5e9eb
"#overflowed-extensions-list"
);
-@@ -2663,37 +2663,41 @@ var gUnifiedExtensions = {
+@@ -2661,37 +2661,41 @@ var gUnifiedExtensions = {
);
template.replaceWith(template.content);
this._panel = document.getElementById("unified-extensions-panel");
@@ -123,7 +123,7 @@ index cfb6b8dd5443966d0635c3d7b477a68eca8fa9e0..c876890706b1a314c7760bbe1ff5e9eb
if (!CustomizationHandler.isCustomizing()) {
if (aEvent) {
if (
-@@ -2715,6 +2719,7 @@ var gUnifiedExtensions = {
+@@ -2713,6 +2717,7 @@ var gUnifiedExtensions = {
// and no alternative content is available for display in the panel.
const policies = this.getActivePolicies();
if (
@@ -131,7 +131,7 @@ index cfb6b8dd5443966d0635c3d7b477a68eca8fa9e0..c876890706b1a314c7760bbe1ff5e9eb
policies.length &&
!this.hasExtensionsInPanel(policies) &&
!this.isPrivateWindowMissingExtensionsWithoutPBMAccess() &&
-@@ -2730,32 +2735,30 @@ var gUnifiedExtensions = {
+@@ -2728,32 +2733,30 @@ var gUnifiedExtensions = {
this.blocklistAttentionInfo =
await AddonManager.getBlocklistAttentionInfo();
@@ -170,7 +170,7 @@ index cfb6b8dd5443966d0635c3d7b477a68eca8fa9e0..c876890706b1a314c7760bbe1ff5e9eb
triggerEvent: aEvent,
});
}
-@@ -2942,18 +2945,20 @@ var gUnifiedExtensions = {
+@@ -2948,18 +2951,20 @@ var gUnifiedExtensions = {
this._maybeMoveWidgetNodeBack(widgetId);
}
diff --git a/src/browser/base/content/browser-commands-js.patch b/src/browser/base/content/browser-commands-js.patch
index 1c8e4e1fb..fa9a0af70 100644
--- a/src/browser/base/content/browser-commands-js.patch
+++ b/src/browser/base/content/browser-commands-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/base/content/browser-commands.js b/browser/base/content/browser-commands.js
-index 939ca497b882b3f4200141ba1b6764fb5c846f45..09eb945215bb26e18c4414850bc4233ad5bd760c 100644
+index 75ddd82c18979571f377dec94fe1883f1349cc16..58ae4d88f7f0b37187cb61fcaf4cf84a9af7991f 100644
--- a/browser/base/content/browser-commands.js
+++ b/browser/base/content/browser-commands.js
@@ -14,6 +14,10 @@ var BrowserCommands = {
diff --git a/src/browser/base/content/browser-fullScreenAndPointerLock-js.patch b/src/browser/base/content/browser-fullScreenAndPointerLock-js.patch
index 26368038d..60692a527 100644
--- a/src/browser/base/content/browser-fullScreenAndPointerLock-js.patch
+++ b/src/browser/base/content/browser-fullScreenAndPointerLock-js.patch
@@ -1,13 +1,13 @@
diff --git a/browser/base/content/browser-fullScreenAndPointerLock.js b/browser/base/content/browser-fullScreenAndPointerLock.js
-index 0e1aa344c084abdce40058278b12a042a4510997..50c06aaab823cb8572eee2ad53a7b709b1cfd084 100644
+index 38b4267c737ba247068e1001c12f1cb93cd248f7..f0d7002246645de48dd3ed24a84122d0bcc95b5a 100644
--- a/browser/base/content/browser-fullScreenAndPointerLock.js
+++ b/browser/base/content/browser-fullScreenAndPointerLock.js
-@@ -425,8 +425,6 @@ var FullScreen = {
+@@ -461,8 +461,6 @@ var FullScreen = {
gNavToolbox.classList.toggle("fullscreen-with-menubar", shiftSize > 0);
let transform = shiftSize > 0 ? `translateY(${shiftSize}px)` : "";
- gNavToolbox.style.transform = transform;
- gURLBar.style.transform = gURLBar.hasAttribute("breakout") ? transform : "";
- if (shiftSize > 0) {
- // If the mouse tracking missed our fullScreenToggler, then the toolbox
- // might not have been shown before the menubar is animated down. Make
+ let searchbar = document.getElementById("searchbar-new");
+ if (searchbar) {
+ searchbar.style.transform = searchbar.hasAttribute("breakout")
diff --git a/src/browser/base/content/browser-init-js.patch b/src/browser/base/content/browser-init-js.patch
index 7f346758d..e5b1bb945 100644
--- a/src/browser/base/content/browser-init-js.patch
+++ b/src/browser/base/content/browser-init-js.patch
@@ -1,8 +1,8 @@
diff --git a/browser/base/content/browser-init.js b/browser/base/content/browser-init.js
-index 0186e3a6508fc8e40f93619d8b3e5a0c003cbd4a..1f4fa115e591cfbe3e23d4ce880be66277a50a26 100644
+index dba83914d1131616ead67f48949bda74105b7d46..86294fe79cd30b2a24b20738c9cd1f5114e8e669 100644
--- a/browser/base/content/browser-init.js
+++ b/browser/base/content/browser-init.js
-@@ -243,6 +243,7 @@ var gBrowserInit = {
+@@ -247,6 +247,7 @@ var gBrowserInit = {
},
onLoad() {
@@ -10,7 +10,7 @@ index 0186e3a6508fc8e40f93619d8b3e5a0c003cbd4a..1f4fa115e591cfbe3e23d4ce880be662
gBrowser.addEventListener("DOMUpdateBlockedPopups", e =>
PopupAndRedirectBlockerObserver.handleEvent(e)
);
-@@ -433,6 +434,7 @@ var gBrowserInit = {
+@@ -444,6 +445,7 @@ var gBrowserInit = {
this._handleURIToLoad();
diff --git a/src/browser/base/content/browser-js.patch b/src/browser/base/content/browser-js.patch
index b9dd6c2d9..15dfe2198 100644
--- a/src/browser/base/content/browser-js.patch
+++ b/src/browser/base/content/browser-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
-index e2e0526a0ddd617291f1f6c17bcfb807954b481f..1373fe072b3c74a52413859d4ad3612cbe1a2bda 100644
+index 0ea3d82b88819c41ffd866ae9533ebb5a7bff957..37db181d7e71fb6250df5bae363e9cf984b44f79 100644
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -33,6 +33,7 @@ ChromeUtils.defineESModuleGetters(this, {
@@ -24,7 +24,7 @@ index e2e0526a0ddd617291f1f6c17bcfb807954b481f..1373fe072b3c74a52413859d4ad3612c
if (backDisabled) {
backCommand.removeAttribute("disabled");
} else {
-@@ -2301,6 +2307,8 @@ var XULBrowserWindow = {
+@@ -2305,6 +2311,8 @@ var XULBrowserWindow = {
AboutReaderParent.updateReaderButton(gBrowser.selectedBrowser);
TranslationsParent.onLocationChange(gBrowser.selectedBrowser);
@@ -33,7 +33,7 @@ index e2e0526a0ddd617291f1f6c17bcfb807954b481f..1373fe072b3c74a52413859d4ad3612c
PictureInPicture.updateUrlbarToggle(gBrowser.selectedBrowser);
if (!gMultiProcessBrowser) {
-@@ -3821,7 +3829,7 @@ function warnAboutClosingWindow() {
+@@ -3820,7 +3828,7 @@ function warnAboutClosingWindow() {
if (!isPBWindow && !toolbar.visible) {
return gBrowser.warnAboutClosingTabs(
@@ -42,7 +42,7 @@ index e2e0526a0ddd617291f1f6c17bcfb807954b481f..1373fe072b3c74a52413859d4ad3612c
gBrowser.closingTabsEnum.ALL
);
}
-@@ -3861,7 +3869,7 @@ function warnAboutClosingWindow() {
+@@ -3860,7 +3868,7 @@ function warnAboutClosingWindow() {
return (
isPBWindow ||
gBrowser.warnAboutClosingTabs(
@@ -51,7 +51,7 @@ index e2e0526a0ddd617291f1f6c17bcfb807954b481f..1373fe072b3c74a52413859d4ad3612c
gBrowser.closingTabsEnum.ALL
)
);
-@@ -3886,7 +3894,7 @@ function warnAboutClosingWindow() {
+@@ -3885,7 +3893,7 @@ function warnAboutClosingWindow() {
AppConstants.platform != "macosx" ||
isPBWindow ||
gBrowser.warnAboutClosingTabs(
@@ -60,9 +60,9 @@ index e2e0526a0ddd617291f1f6c17bcfb807954b481f..1373fe072b3c74a52413859d4ad3612c
gBrowser.closingTabsEnum.ALL
)
);
-@@ -4809,6 +4817,9 @@ var ConfirmationHint = {
- MozXULElement.insertFTLIfNeeded("toolkit/branding/brandings.ftl");
- MozXULElement.insertFTLIfNeeded("browser/confirmationHints.ftl");
+@@ -4825,6 +4833,9 @@ var ConfirmationHint = {
+ }
+
document.l10n.setAttributes(this._message, messageId, options.l10nArgs);
+ if (window.gZenUIManager?.showToast) {
+ return window.gZenUIManager.showToast(messageId, options);
diff --git a/src/browser/base/content/browser-places-js.patch b/src/browser/base/content/browser-places-js.patch
index d458d84a6..15472a9f3 100644
--- a/src/browser/base/content/browser-places-js.patch
+++ b/src/browser/base/content/browser-places-js.patch
@@ -1,8 +1,8 @@
diff --git a/browser/base/content/browser-places.js b/browser/base/content/browser-places.js
-index 925d74575827340960706718a29426bdf079b47c..921feb0e4229706b4691a43c9fc1005cbfd90999 100644
+index 543630b89bc4f1d40eda7e4e7ae68a3c9f45e1e7..fac68af45985ad2feeb1daebd470d028b49d1dde 100644
--- a/browser/base/content/browser-places.js
+++ b/browser/base/content/browser-places.js
-@@ -249,6 +249,8 @@ var StarUI = {
+@@ -261,6 +261,8 @@ var StarUI = {
});
}
@@ -11,7 +11,7 @@ index 925d74575827340960706718a29426bdf079b47c..921feb0e4229706b4691a43c9fc1005c
let onPanelReady = fn => {
let target = this.panel;
if (target.parentNode) {
-@@ -300,6 +302,21 @@ var StarUI = {
+@@ -312,6 +314,21 @@ var StarUI = {
}
},
@@ -33,7 +33,7 @@ index 925d74575827340960706718a29426bdf079b47c..921feb0e4229706b4691a43c9fc1005c
removeBookmarkButtonCommand: function SU_removeBookmarkButtonCommand() {
this._removeBookmarksOnPopupHidden = true;
this.panel.hidePopup();
-@@ -1806,6 +1823,7 @@ var BookmarkingUI = {
+@@ -1811,6 +1828,7 @@ var BookmarkingUI = {
document.getElementById("context-bookmarkpage"),
PanelMultiView.getViewNode(document, "panelMenuBookmarkThisPage"),
document.getElementById("pageAction-panel-bookmark"),
diff --git a/src/browser/base/content/browser-sets-inc.patch b/src/browser/base/content/browser-sets-inc.patch
index 3abbb9f94..bc6e0e638 100644
--- a/src/browser/base/content/browser-sets-inc.patch
+++ b/src/browser/base/content/browser-sets-inc.patch
@@ -1,8 +1,8 @@
diff --git a/browser/base/content/browser-sets.inc b/browser/base/content/browser-sets.inc
-index df768aaa77a6986260da5052ed14c8403d48de6b..a30e3a2784a6215c959d23802b5c2c966f89ca10 100644
+index 8871fc984acccfd9c54c7aef9f91934d81ba00c0..923ab3bda423eae77518f437221c32ca4990f5ce 100644
--- a/browser/base/content/browser-sets.inc
+++ b/browser/base/content/browser-sets.inc
-@@ -414,3 +414,4 @@
+@@ -415,3 +415,4 @@
internal="true"/>
#endif
diff --git a/src/browser/base/content/browser-sets-js.patch b/src/browser/base/content/browser-sets-js.patch
index 84709df03..14f373418 100644
--- a/src/browser/base/content/browser-sets-js.patch
+++ b/src/browser/base/content/browser-sets-js.patch
@@ -1,8 +1,8 @@
diff --git a/browser/base/content/browser-sets.js b/browser/base/content/browser-sets.js
-index 50845ebd925955bf9646fc499b9828eccbf266ef..5482a24576ebcd4382409cae01a4c6bcbd88a96c 100644
+index 2918f0c46f404cba1658d4da823c6ca41cba8ded..2cb8e8c1c9dd1059bee45911159bf392f3a86ee9 100644
--- a/browser/base/content/browser-sets.js
+++ b/browser/base/content/browser-sets.js
-@@ -270,7 +270,7 @@ document.addEventListener(
+@@ -272,7 +272,7 @@ document.addEventListener(
}
});
@@ -11,7 +11,7 @@ index 50845ebd925955bf9646fc499b9828eccbf266ef..5482a24576ebcd4382409cae01a4c6bc
const SIDEBAR_REVAMP_PREF = "sidebar.revamp";
const SIDEBAR_REVAMP_ENABLED = Services.prefs.getBoolPref(
SIDEBAR_REVAMP_PREF,
-@@ -308,6 +308,8 @@ document.addEventListener(
+@@ -310,6 +310,8 @@ document.addEventListener(
panel: SidebarController.currentID,
opened: SidebarController._state.launcherExpanded,
});
diff --git a/src/browser/base/content/browser-siteIdentity-js.patch b/src/browser/base/content/browser-siteIdentity-js.patch
index ca9cb89b0..cae64fb0e 100644
--- a/src/browser/base/content/browser-siteIdentity-js.patch
+++ b/src/browser/base/content/browser-siteIdentity-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/base/content/browser-siteIdentity.js b/browser/base/content/browser-siteIdentity.js
-index 6d2052e060896bb5e91ba84c15bf14c969340935..6ceef1806e2d88cd7e2ebc867d633e9148f3b298 100644
+index cff28e1cdb550357662e8a7a41856e80b1de0018..9d569c1a1e6249c58a1e30fbb224c316c52ef204 100644
--- a/browser/base/content/browser-siteIdentity.js
+++ b/browser/base/content/browser-siteIdentity.js
@@ -464,11 +464,6 @@ var gIdentityHandler = {
@@ -14,7 +14,7 @@ index 6d2052e060896bb5e91ba84c15bf14c969340935..6ceef1806e2d88cd7e2ebc867d633e91
let baseDomain = SiteDataManager.getBaseDomainFromHost(this._uri.host);
if (SiteDataManager.promptSiteDataRemoval(window, [baseDomain])) {
-@@ -847,7 +842,7 @@ var gIdentityHandler = {
+@@ -853,7 +848,7 @@ var gIdentityHandler = {
// This is a secure internal Firefox page.
this._identityBox.className = "chromeUI";
let brandBundle = document.getElementById("bundle_brand");
@@ -23,7 +23,7 @@ index 6d2052e060896bb5e91ba84c15bf14c969340935..6ceef1806e2d88cd7e2ebc867d633e91
} else if (this._pageExtensionPolicy) {
// This is a WebExtension page.
this._identityBox.className = "extensionPage";
-@@ -1190,6 +1185,12 @@ var gIdentityHandler = {
+@@ -1196,6 +1191,12 @@ var gIdentityHandler = {
}
}
diff --git a/src/browser/base/content/browser-xhtml.patch b/src/browser/base/content/browser-xhtml.patch
index 548bf7cc6..364f2198f 100644
--- a/src/browser/base/content/browser-xhtml.patch
+++ b/src/browser/base/content/browser-xhtml.patch
@@ -1,5 +1,5 @@
diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml
-index 832d98f911e0bd0e231421332a521bfefea72ef8..a9955256c81b252fe0527ae5857c9283e2518274 100644
+index a95ce8f0b28d98632c06f605b510b5ae3e98c4ed..275b3f5f30046a5e08d9ebceff0d2b91c865eb1b 100644
--- a/browser/base/content/browser.xhtml
+++ b/browser/base/content/browser.xhtml
@@ -19,6 +19,7 @@
diff --git a/src/browser/base/content/navigator-toolbox-inc-xhtml.patch b/src/browser/base/content/navigator-toolbox-inc-xhtml.patch
index 25e327eca..d75f5a2c9 100644
--- a/src/browser/base/content/navigator-toolbox-inc-xhtml.patch
+++ b/src/browser/base/content/navigator-toolbox-inc-xhtml.patch
@@ -1,5 +1,5 @@
diff --git a/browser/base/content/navigator-toolbox.inc.xhtml b/browser/base/content/navigator-toolbox.inc.xhtml
-index 4d4223c508560136aba220adb18528aac913a188..10d4d9cecbb0e7cec9191d78fb81a57376b37ff1 100644
+index 3f7b85086de11923f9453c8f02afb517c49afa8b..5be31a0cb3c5a52ba90cd2cd7f333a0354d9f2af 100644
--- a/browser/base/content/navigator-toolbox.inc.xhtml
+++ b/browser/base/content/navigator-toolbox.inc.xhtml
@@ -2,7 +2,7 @@
diff --git a/src/browser/base/content/navigator-toolbox-js.patch b/src/browser/base/content/navigator-toolbox-js.patch
index 15afc4341..b1d06369c 100644
--- a/src/browser/base/content/navigator-toolbox-js.patch
+++ b/src/browser/base/content/navigator-toolbox-js.patch
@@ -1,8 +1,8 @@
diff --git a/browser/base/content/navigator-toolbox.js b/browser/base/content/navigator-toolbox.js
-index 15469e9d9b91c1eaef2578c9e43b6999edac3392..95ae5036b57baeb5237603c0921f1e9252af6919 100644
+index 362a85c20d8f0633fa78f85578e4cf015fdd0e44..ef7d6ff9e0e9876bc1918e365fd0addcd177cecb 100644
--- a/browser/base/content/navigator-toolbox.js
+++ b/browser/base/content/navigator-toolbox.js
-@@ -6,7 +6,7 @@
+@@ -11,7 +11,7 @@ ChromeUtils.defineESModuleGetters(this, {
document.addEventListener(
"DOMContentLoaded",
() => {
@@ -11,7 +11,7 @@ index 15469e9d9b91c1eaef2578c9e43b6999edac3392..95ae5036b57baeb5237603c0921f1e92
const widgetOverflow = document.getElementById("widget-overflow");
function onPopupShowing(event) {
-@@ -184,6 +184,7 @@ document.addEventListener(
+@@ -189,6 +189,7 @@ document.addEventListener(
#forward-button,
#reload-button ,
#reader-mode-button,
@@ -19,7 +19,7 @@ index 15469e9d9b91c1eaef2578c9e43b6999edac3392..95ae5036b57baeb5237603c0921f1e92
#picture-in-picture-button,
#urlbar-zoom-button,
#star-button-box,
-@@ -209,6 +210,17 @@ document.addEventListener(
+@@ -215,6 +216,17 @@ document.addEventListener(
gBrowser.handleNewTabMiddleClick(element, event);
break;
@@ -37,15 +37,15 @@ index 15469e9d9b91c1eaef2578c9e43b6999edac3392..95ae5036b57baeb5237603c0921f1e92
case "back-button":
case "forward-button":
case "reload-button":
-@@ -318,6 +330,7 @@ document.addEventListener(
+@@ -330,6 +342,7 @@ document.addEventListener(
#downloads-button,
#fxa-toolbar-menu-button,
#unified-extensions-button,
+ #zen-site-data-icon-button,
#library-button,
- #split-view-button
- `);
-@@ -401,6 +414,16 @@ document.addEventListener(
+ #split-view-button,
+ #smartwindow-ask-button
+@@ -414,6 +427,16 @@ document.addEventListener(
gUnifiedExtensions.togglePanel(event);
break;
diff --git a/src/browser/base/content/nsContextMenu-sys-mjs.patch b/src/browser/base/content/nsContextMenu-sys-mjs.patch
index 9eaa02e26..c76ecb3c8 100644
--- a/src/browser/base/content/nsContextMenu-sys-mjs.patch
+++ b/src/browser/base/content/nsContextMenu-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/base/content/nsContextMenu.sys.mjs b/browser/base/content/nsContextMenu.sys.mjs
-index 90c8d48fa992ca5ac125fa2998741db79264de4a..a598431671e42b9ede23b0595790564202408a8e 100644
+index a929907fcaf893c00259f56815f202ba475e1e41..9e15f5b8f8eb3fa31fd463e383794acd18314767 100644
--- a/browser/base/content/nsContextMenu.sys.mjs
+++ b/browser/base/content/nsContextMenu.sys.mjs
-@@ -371,6 +371,9 @@ export class nsContextMenu {
+@@ -377,6 +377,9 @@ export class nsContextMenu {
this.initPDFItems();
this.initTextFragmentItems();
diff --git a/src/browser/base/content/zen-preloaded.inc.xhtml b/src/browser/base/content/zen-preloaded.inc.xhtml
index 3e38442e9..d7893b9e6 100644
--- a/src/browser/base/content/zen-preloaded.inc.xhtml
+++ b/src/browser/base/content/zen-preloaded.inc.xhtml
@@ -8,6 +8,5 @@
-
\ No newline at end of file
diff --git a/src/browser/base/jar-mn.patch b/src/browser/base/jar-mn.patch
index a935240d2..a53fcbea0 100644
--- a/src/browser/base/jar-mn.patch
+++ b/src/browser/base/jar-mn.patch
@@ -1,8 +1,8 @@
diff --git a/browser/base/jar.mn b/browser/base/jar.mn
-index b1f7121a1f3926fe3eb89540edb7dcbb68734039..61c98964cf5efd0a603500cf36559713e1f231f7 100644
+index 22550debb8bba2a06bcd34ba9a21737105be5d92..fb4832243078c78926a66693f4ebe447c692b393 100644
--- a/browser/base/jar.mn
+++ b/browser/base/jar.mn
-@@ -109,3 +109,5 @@ browser.jar:
+@@ -108,3 +108,5 @@ browser.jar:
# L10n resources and overrides.
% override chrome://global/locale/appstrings.properties chrome://browser/locale/appstrings.properties
diff --git a/src/browser/components/BrowserGlue-sys-mjs.patch b/src/browser/components/BrowserGlue-sys-mjs.patch
index 51d378d4a..a0b40ae78 100644
--- a/src/browser/components/BrowserGlue-sys-mjs.patch
+++ b/src/browser/components/BrowserGlue-sys-mjs.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/BrowserGlue.sys.mjs b/browser/components/BrowserGlue.sys.mjs
-index 33a0f6b7e5cfe087388483fefa55b927e3e3f4a3..65135c6904b5e9523f77689dfc572aefe11b0961 100644
+index 938b7aa84266ad92b6654b4e44f7bca3dc315912..cb4f544e3cb9e035d17079c11420d72148db0d33 100644
--- a/browser/components/BrowserGlue.sys.mjs
+++ b/browser/components/BrowserGlue.sys.mjs
@@ -8,6 +8,7 @@ import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
@@ -10,7 +10,7 @@ index 33a0f6b7e5cfe087388483fefa55b927e3e3f4a3..65135c6904b5e9523f77689dfc572aef
AboutHomeStartupCache: "resource:///modules/AboutHomeStartupCache.sys.mjs",
AWToolbarButton: "resource:///modules/aboutwelcome/AWToolbarUtils.sys.mjs",
ASRouter: "resource:///modules/asrouter/ASRouter.sys.mjs",
-@@ -1455,7 +1456,7 @@ BrowserGlue.prototype = {
+@@ -1456,7 +1457,7 @@ BrowserGlue.prototype = {
windowcount++;
let tabbrowser = win.gBrowser;
if (tabbrowser) {
@@ -19,7 +19,7 @@ index 33a0f6b7e5cfe087388483fefa55b927e3e3f4a3..65135c6904b5e9523f77689dfc572aef
}
}
-@@ -1620,6 +1621,8 @@ BrowserGlue.prototype = {
+@@ -1621,6 +1622,8 @@ BrowserGlue.prototype = {
} else if (profileDataVersion < APP_DATA_VERSION) {
lazy.ProfileDataUpgrader.upgrade(profileDataVersion, APP_DATA_VERSION);
}
diff --git a/src/browser/components/aboutwelcome/content/aboutwelcome-css.patch b/src/browser/components/aboutwelcome/content/aboutwelcome-css.patch
index 7c57e388a..18dc4a35c 100644
--- a/src/browser/components/aboutwelcome/content/aboutwelcome-css.patch
+++ b/src/browser/components/aboutwelcome/content/aboutwelcome-css.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/aboutwelcome/content/aboutwelcome.css b/browser/components/aboutwelcome/content/aboutwelcome.css
-index 0e1985aa519d66b047c5d40977bb12099d966b18..76b59891b4c4464b38d6973858f13fff0285737d 100644
+index 6952ca1c306aa8815f662d8c557d4dd6b79fce0f..ce420f1b2f57e3f23ef18cac20938662f3ecf1ae 100644
--- a/browser/components/aboutwelcome/content/aboutwelcome.css
+++ b/browser/components/aboutwelcome/content/aboutwelcome.css
-@@ -329,6 +329,11 @@ panel#feature-callout {
+@@ -331,6 +331,11 @@ panel#feature-callout {
--panel-shadow-margin: 6px;
--panel-arrow-space: calc(var(--panel-shadow-margin) + var(--arrow-visible-height) - 1.5px);
--panel-margin-offset: calc(-1 * (var(--panel-shadow-margin) + var(--arrow-corner-distance) + (var(--arrow-width) / 2)));
@@ -14,7 +14,7 @@ index 0e1985aa519d66b047c5d40977bb12099d966b18..76b59891b4c4464b38d6973858f13fff
}
panel#feature-callout::part(content) {
-@@ -512,6 +517,12 @@ div#feature-callout.hidden {
+@@ -517,6 +522,12 @@ div#feature-callout.hidden {
width: 25em;
gap: 16px;
background: var(--fc-background);
@@ -27,7 +27,7 @@ index 0e1985aa519d66b047c5d40977bb12099d966b18..76b59891b4c4464b38d6973858f13fff
}
#feature-callout .screen[pos=callout] .section-main .main-content .main-content-inner {
gap: 12px;
-@@ -818,6 +829,10 @@ panel#feature-callout::part(content) {
+@@ -830,6 +841,10 @@ panel#feature-callout::part(content) {
overflow: visible;
transform: rotate(45deg);
transform-style: preserve-3d;
diff --git a/src/browser/components/aiwindow/ui/modules/AIWindow-sys-mjs.patch b/src/browser/components/aiwindow/ui/modules/AIWindow-sys-mjs.patch
new file mode 100644
index 000000000..7dccc12a8
--- /dev/null
+++ b/src/browser/components/aiwindow/ui/modules/AIWindow-sys-mjs.patch
@@ -0,0 +1,12 @@
+diff --git a/browser/components/aiwindow/ui/modules/AIWindow.sys.mjs b/browser/components/aiwindow/ui/modules/AIWindow.sys.mjs
+index 7338737a25c2b75f28c48f573a58b72ec326ad3b..7cf3aa1164d38bc9daaa010f27c567e0d9792bc6 100644
+--- a/browser/components/aiwindow/ui/modules/AIWindow.sys.mjs
++++ b/browser/components/aiwindow/ui/modules/AIWindow.sys.mjs
+@@ -200,6 +200,7 @@ export const AIWindow = {
+ },
+
+ _updateWindowSwitcherPosition(win) {
++ return;
+ const modeSwitcherButton = win.document.getElementById("ai-window-toggle");
+
+ const targetToolbar = win.document.getElementById(
diff --git a/src/browser/components/asrouter/modules/FeatureCallout-sys-mjs.patch b/src/browser/components/asrouter/modules/FeatureCallout-sys-mjs.patch
index b949e423e..1cf76c7cd 100644
--- a/src/browser/components/asrouter/modules/FeatureCallout-sys-mjs.patch
+++ b/src/browser/components/asrouter/modules/FeatureCallout-sys-mjs.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/asrouter/modules/FeatureCallout.sys.mjs b/browser/components/asrouter/modules/FeatureCallout.sys.mjs
-index 80dd8b5e357acc9decea6cf621c4868d547a0eb3..8a5fea6ed1a62a5930bafffcbbde3ce3292e42a1 100644
+index a380e024e4ad6f77ad3ad74bb7a0784d7dfb6ff3..e990f8c2412f48ca5272a7741dcb7445a406462e 100644
--- a/browser/components/asrouter/modules/FeatureCallout.sys.mjs
+++ b/browser/components/asrouter/modules/FeatureCallout.sys.mjs
@@ -778,6 +778,7 @@ export class FeatureCallout {
diff --git a/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch b/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch
index df0c67a67..d71574f53 100644
--- a/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch
+++ b/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/customizableui/CustomizableUI.sys.mjs b/browser/components/customizableui/CustomizableUI.sys.mjs
-index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292fa1347f4 100644
+index 4aca0aa0c90603e09b58395debb62875c018a8cf..400ad196c846083001b36d27edec6885c6bde16d 100644
--- a/browser/components/customizableui/CustomizableUI.sys.mjs
+++ b/browser/components/customizableui/CustomizableUI.sys.mjs
@@ -14,6 +14,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
@@ -10,7 +10,7 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
HomePage: "resource:///modules/HomePage.sys.mjs",
PanelMultiView:
"moz-src:///browser/components/customizableui/PanelMultiView.sys.mjs",
-@@ -326,7 +327,7 @@ var CustomizableUIInternal = {
+@@ -348,7 +349,7 @@ var CustomizableUIInternal = {
{
type: CustomizableUI.TYPE_PANEL,
defaultPlacements: [],
@@ -19,7 +19,7 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
},
false
);
-@@ -336,19 +337,14 @@ var CustomizableUIInternal = {
+@@ -358,20 +359,15 @@ var CustomizableUIInternal = {
"back-button",
"forward-button",
"stop-reload-button",
@@ -32,6 +32,7 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
"spring",
- "downloads-button",
AppConstants.MOZ_DEV_EDITION ? "developer-button" : null,
+ lazy.ippEnabled ? "ipprotection-button" : null,
- "fxa-toolbar-menu-button",
lazy.resetPBMToolbarButtonEnabled ? "reset-pbm-toolbar-button" : null,
].filter(name => name);
@@ -40,7 +41,7 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
this.registerArea(
CustomizableUI.AREA_NAVBAR,
{
-@@ -356,8 +352,6 @@ var CustomizableUIInternal = {
+@@ -379,8 +375,6 @@ var CustomizableUIInternal = {
overflowable: true,
defaultPlacements: navbarPlacements,
verticalTabsDefaultPlacements: [
@@ -49,7 +50,7 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
],
defaultCollapsed: false,
},
-@@ -381,10 +375,7 @@ var CustomizableUIInternal = {
+@@ -404,10 +398,7 @@ var CustomizableUIInternal = {
{
type: CustomizableUI.TYPE_TOOLBAR,
defaultPlacements: [
@@ -60,7 +61,7 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
],
verticalTabsDefaultPlacements: [],
defaultCollapsed: null,
-@@ -466,6 +457,7 @@ var CustomizableUIInternal = {
+@@ -489,6 +480,7 @@ var CustomizableUIInternal = {
CustomizableUI.AREA_NAVBAR,
CustomizableUI.AREA_BOOKMARKS,
CustomizableUI.AREA_TABSTRIP,
@@ -68,7 +69,7 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
]);
if (AppConstants.platform != "macosx") {
toolbars.add(CustomizableUI.AREA_MENUBAR);
-@@ -1242,6 +1234,9 @@ var CustomizableUIInternal = {
+@@ -1265,6 +1257,9 @@ var CustomizableUIInternal = {
placements = gPlacements.get(area);
}
@@ -78,16 +79,15 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
// For toolbars that need it, mark as dirty.
let defaultPlacements = areaProperties.get("defaultPlacements");
if (
-@@ -1749,7 +1744,7 @@ var CustomizableUIInternal = {
+@@ -1772,7 +1767,6 @@ var CustomizableUIInternal = {
lazy.log.info(
"Widget " + aWidgetId + " not found, unable to remove from " + aArea
);
- continue;
-+ // continue;
}
this.notifyDOMChange(widgetNode, null, container, true, () => {
-@@ -1759,7 +1754,7 @@ var CustomizableUIInternal = {
+@@ -1782,7 +1776,7 @@ var CustomizableUIInternal = {
// We also need to remove the panel context menu if it's there:
this.ensureButtonContextMenu(widgetNode);
if (gPalette.has(aWidgetId) || this.isSpecialWidget(aWidgetId)) {
@@ -96,7 +96,7 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
} else {
window.gNavToolbox.palette.appendChild(widgetNode);
}
-@@ -1927,16 +1922,16 @@ var CustomizableUIInternal = {
+@@ -1950,16 +1944,16 @@ var CustomizableUIInternal = {
elem.setAttribute("skipintoolbarset", "true");
}
}
@@ -116,7 +116,7 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
// Handle initial state of vertical tabs.
if (isVerticalTabs) {
// Show the vertical tabs toolbar
-@@ -2178,6 +2173,10 @@ var CustomizableUIInternal = {
+@@ -2201,6 +2195,10 @@ var CustomizableUIInternal = {
* The identifier string of the area that aNode is being inserted into.
*/
insertWidgetBefore(aNode, aNextNode, aContainer, aAreaId) {
@@ -127,7 +127,7 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
this.notifyDOMChange(aNode, aNextNode, aContainer, false, () => {
this.setLocationAttributes(aNode, aAreaId);
aContainer.insertBefore(aNode, aNextNode);
-@@ -4533,7 +4532,7 @@ var CustomizableUIInternal = {
+@@ -4554,7 +4552,7 @@ var CustomizableUIInternal = {
* For all registered areas, builds those areas to reflect the current
* placement state of all widgets.
*/
@@ -136,7 +136,7 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
for (let [areaId, areaNodes] of gBuildAreas) {
let placements = gPlacements.get(areaId);
let isFirstChangedToolbar = true;
-@@ -4544,7 +4543,7 @@ var CustomizableUIInternal = {
+@@ -4565,7 +4563,7 @@ var CustomizableUIInternal = {
if (area.get("type") == CustomizableUI.TYPE_TOOLBAR) {
let defaultCollapsed = area.get("defaultCollapsed");
let win = areaNode.ownerGlobal;
@@ -145,7 +145,7 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
win.setToolbarVisibility(
areaNode,
typeof defaultCollapsed == "string"
-@@ -5835,6 +5834,7 @@ export var CustomizableUI = {
+@@ -5856,6 +5854,7 @@ export var CustomizableUI = {
unregisterArea(aName, aDestroyPlacements) {
CustomizableUIInternal.unregisterArea(aName, aDestroyPlacements);
},
@@ -153,7 +153,7 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
/**
* Add a widget to an area.
* If the area to which you try to add is not known to CustomizableUI,
-@@ -7798,7 +7798,9 @@ class OverflowableToolbar {
+@@ -7819,7 +7818,9 @@ class OverflowableToolbar {
);
if (webExtList && CustomizableUI.isWebExtensionWidget(child.id)) {
@@ -163,7 +163,7 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
webExtList.insertBefore(child, webExtList.firstElementChild);
} else {
child.setAttribute("cui-anchorid", this.#defaultListButton.id);
-@@ -7858,7 +7860,7 @@ class OverflowableToolbar {
+@@ -7879,7 +7880,7 @@ class OverflowableToolbar {
) {
continue;
}
@@ -172,7 +172,7 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
if (child != aExceptChild) {
sum += getInlineSize(child);
}
-@@ -7882,11 +7884,11 @@ class OverflowableToolbar {
+@@ -7903,11 +7904,11 @@ class OverflowableToolbar {
parseFloat(style.paddingLeft) -
parseFloat(style.paddingRight) -
toolbarChildrenWidth;
@@ -186,7 +186,7 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
});
lazy.log.debug(
-@@ -7901,7 +7903,14 @@ class OverflowableToolbar {
+@@ -7922,7 +7923,14 @@ class OverflowableToolbar {
Math.max(targetWidth, targetChildrenWidth)
);
totalAvailWidth = Math.ceil(totalAvailWidth);
@@ -202,7 +202,7 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
return { isOverflowing, targetContentWidth, totalAvailWidth };
}
-@@ -7962,7 +7971,11 @@ class OverflowableToolbar {
+@@ -7983,7 +7991,11 @@ class OverflowableToolbar {
return;
}
}
@@ -215,7 +215,7 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
lazy.log.debug(
`Need ${minSize} but width is ${totalAvailWidth} so bailing`
);
-@@ -7995,7 +8008,7 @@ class OverflowableToolbar {
+@@ -8016,7 +8028,7 @@ class OverflowableToolbar {
}
}
if (!inserted) {
@@ -224,7 +224,7 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
}
child.removeAttribute("cui-anchorid");
child.removeAttribute("overflowedItem");
-@@ -8121,6 +8134,9 @@ class OverflowableToolbar {
+@@ -8142,6 +8154,9 @@ class OverflowableToolbar {
* if no such list exists.
*/
get #webExtList() {
@@ -234,7 +234,7 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
if (!this.#webExtListRef) {
let targetID = this.#toolbar.getAttribute("addon-webext-overflowtarget");
if (!targetID) {
-@@ -8132,6 +8148,9 @@ class OverflowableToolbar {
+@@ -8153,6 +8168,9 @@ class OverflowableToolbar {
let win = this.#toolbar.ownerGlobal;
let { panel } = win.gUnifiedExtensions;
this.#webExtListRef = panel.querySelector(`#${targetID}`);
@@ -244,7 +244,7 @@ index 9a98f56d83ee38e0f1aa41467b4ddf215c3d90f7..c50781a1e8fd1a71baf497ba64d85292
}
return this.#webExtListRef;
}
-@@ -8340,7 +8359,7 @@ class OverflowableToolbar {
+@@ -8361,7 +8379,7 @@ class OverflowableToolbar {
break;
}
case "mousedown": {
diff --git a/src/browser/components/customizableui/CustomizeMode-sys-mjs.patch b/src/browser/components/customizableui/CustomizeMode-sys-mjs.patch
index 7472a3627..130d1e130 100644
--- a/src/browser/components/customizableui/CustomizeMode-sys-mjs.patch
+++ b/src/browser/components/customizableui/CustomizeMode-sys-mjs.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/customizableui/CustomizeMode.sys.mjs b/browser/components/customizableui/CustomizeMode.sys.mjs
-index 52e93e9d9d77f6e410d72bee707fccf26f728004..1142f096e1221213195453d60507ba1bd2f7aed9 100644
+index e72ff7eab14f66ff4454850930a1d7266b3acefa..1a5d9c63b8942e8c20e9f91b82b5b11647b12ecc 100644
--- a/browser/components/customizableui/CustomizeMode.sys.mjs
+++ b/browser/components/customizableui/CustomizeMode.sys.mjs
@@ -503,7 +503,7 @@ export class CustomizeMode {
diff --git a/src/browser/components/customizableui/ToolbarContextMenu-sys-mjs.patch b/src/browser/components/customizableui/ToolbarContextMenu-sys-mjs.patch
index d4ac42499..bf9fc9dbb 100644
--- a/src/browser/components/customizableui/ToolbarContextMenu-sys-mjs.patch
+++ b/src/browser/components/customizableui/ToolbarContextMenu-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/customizableui/ToolbarContextMenu.sys.mjs b/browser/components/customizableui/ToolbarContextMenu.sys.mjs
-index 5be4e8ea7867e93bda2cd3eb49d966ebd73dc786..650d0008e755583392e07f35bd8e541dff7c43c4 100644
+index d5fd707b98e4b163a624c97ff4a8f2574e0b0180..32360b11270d9dad4b83229428932e598f69e774 100644
--- a/browser/components/customizableui/ToolbarContextMenu.sys.mjs
+++ b/browser/components/customizableui/ToolbarContextMenu.sys.mjs
-@@ -246,10 +246,7 @@ export var ToolbarContextMenu = {
+@@ -243,10 +243,7 @@ export var ToolbarContextMenu = {
// Show/hide sidebar and vertical tabs menu items
let sidebarRevampEnabled = Services.prefs.getBoolPref("sidebar.revamp");
let showSidebarActions =
diff --git a/src/browser/components/customizableui/content/panelUI-js.patch b/src/browser/components/customizableui/content/panelUI-js.patch
index 1e1afd09d..2f814e123 100644
--- a/src/browser/components/customizableui/content/panelUI-js.patch
+++ b/src/browser/components/customizableui/content/panelUI-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/customizableui/content/panelUI.js b/browser/components/customizableui/content/panelUI.js
-index 1c696a11d831ea25b4b01689e9b23bda8a754900..fed5576c05aeffd87022565580ce085cb81fe70c 100644
+index e21e54525d197ca5e4c1a62999f9c34c5b4eda7d..3a57749000ba3f04c0dbd034f89e1458f5fa355e 100644
--- a/browser/components/customizableui/content/panelUI.js
+++ b/browser/components/customizableui/content/panelUI.js
@@ -627,10 +627,12 @@ const PanelUI = {
diff --git a/src/browser/components/extensions/parent/ext-browser-js.patch b/src/browser/components/extensions/parent/ext-browser-js.patch
index 73708e882..1c6064321 100644
--- a/src/browser/components/extensions/parent/ext-browser-js.patch
+++ b/src/browser/components/extensions/parent/ext-browser-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/extensions/parent/ext-browser.js b/browser/components/extensions/parent/ext-browser.js
-index 2488267f4be5142bcacf984635d9e9ecdb5f02e9..03127808b3cae28850cc276fac0f1acbca85d326 100644
+index 3ce6ae3271bb0b3873118a94363a9552877559f8..9e62181986d039cc171dfe87de1d95c1f5aacd8c 100644
--- a/browser/components/extensions/parent/ext-browser.js
+++ b/browser/components/extensions/parent/ext-browser.js
@@ -354,6 +354,7 @@ class TabTracker extends TabTrackerBase {
@@ -18,7 +18,7 @@ index 2488267f4be5142bcacf984635d9e9ecdb5f02e9..03127808b3cae28850cc276fac0f1acb
this._tabs.set(nativeTab, id);
if (nativeTab.linkedBrowser) {
-@@ -1273,6 +1275,10 @@ class TabManager extends TabManagerBase {
+@@ -1278,6 +1280,10 @@ class TabManager extends TabManagerBase {
}
canAccessTab(nativeTab) {
diff --git a/src/browser/components/extensions/parent/ext-tabs-js.patch b/src/browser/components/extensions/parent/ext-tabs-js.patch
index 915d6c2fd..add96ed9b 100644
--- a/src/browser/components/extensions/parent/ext-tabs-js.patch
+++ b/src/browser/components/extensions/parent/ext-tabs-js.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/extensions/parent/ext-tabs.js b/browser/components/extensions/parent/ext-tabs.js
-index 7e32fc3f3c325b7317533acf5142bb912556fdbe..04bbe6bece881a05d2eadf81411bd4df2b745017 100644
+index 019aa2ef81f76ce4921e261fd4c65c11a28c4149..4848aa4d7d4ad6b11a64abff65d2637de09bd9a5 100644
--- a/browser/components/extensions/parent/ext-tabs.js
+++ b/browser/components/extensions/parent/ext-tabs.js
-@@ -501,6 +501,7 @@ this.tabs = class extends ExtensionAPIPersistent {
+@@ -516,6 +516,7 @@ this.tabs = class extends ExtensionAPIPersistent {
}
let tab = tabManager.getWrapper(updatedTab);
@@ -10,7 +10,7 @@ index 7e32fc3f3c325b7317533acf5142bb912556fdbe..04bbe6bece881a05d2eadf81411bd4df
let changeInfo = {};
for (let prop of needed) {
-@@ -855,6 +856,7 @@ this.tabs = class extends ExtensionAPIPersistent {
+@@ -881,6 +882,7 @@ this.tabs = class extends ExtensionAPIPersistent {
});
}
diff --git a/src/browser/components/places/PlacesUIUtils-sys-mjs.patch b/src/browser/components/places/PlacesUIUtils-sys-mjs.patch
index 884380fc2..faddca8d4 100644
--- a/src/browser/components/places/PlacesUIUtils-sys-mjs.patch
+++ b/src/browser/components/places/PlacesUIUtils-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/places/PlacesUIUtils.sys.mjs b/browser/components/places/PlacesUIUtils.sys.mjs
-index 615efa4238a3c0084354383a128e0dd8712c720e..29e9dbe7039ba3dc1413da45908ca8418103f6e6 100644
+index 2db11dad245dccca246cc8429a7498af9f143d5f..980ec44d9e92639b249bc83f59ea3bfae40dd921 100644
--- a/browser/components/places/PlacesUIUtils.sys.mjs
+++ b/browser/components/places/PlacesUIUtils.sys.mjs
-@@ -60,6 +60,7 @@ class BookmarkState {
+@@ -61,6 +61,7 @@ class BookmarkState {
info,
tags = "",
keyword = "",
@@ -10,7 +10,7 @@ index 615efa4238a3c0084354383a128e0dd8712c720e..29e9dbe7039ba3dc1413da45908ca841
isFolder = false,
children = [],
autosave = false,
-@@ -84,12 +85,18 @@ class BookmarkState {
+@@ -85,12 +86,18 @@ class BookmarkState {
keyword,
parentGuid: info.parentGuid,
index,
@@ -29,7 +29,7 @@ index 615efa4238a3c0084354383a128e0dd8712c720e..29e9dbe7039ba3dc1413da45908ca841
/**
* Save edited title for the bookmark
*
-@@ -183,6 +190,14 @@ class BookmarkState {
+@@ -184,6 +191,14 @@ class BookmarkState {
"BookmarkState::createBookmark"
);
this._guid = results?.[0];
@@ -44,7 +44,7 @@ index 615efa4238a3c0084354383a128e0dd8712c720e..29e9dbe7039ba3dc1413da45908ca841
return this._guid;
}
-@@ -216,6 +231,14 @@ class BookmarkState {
+@@ -217,6 +232,14 @@ class BookmarkState {
"BookmarkState::save::createFolder"
);
this._guid = results[0];
@@ -59,7 +59,7 @@ index 615efa4238a3c0084354383a128e0dd8712c720e..29e9dbe7039ba3dc1413da45908ca841
return this._guid;
}
-@@ -302,11 +325,97 @@ class BookmarkState {
+@@ -303,11 +326,97 @@ class BookmarkState {
await lazy.PlacesTransactions.batch(transactions, "BookmarkState::save");
}
@@ -157,7 +157,7 @@ index 615efa4238a3c0084354383a128e0dd8712c720e..29e9dbe7039ba3dc1413da45908ca841
/**
* Append transactions to update tags by given information.
*
-@@ -904,7 +1013,7 @@ export var PlacesUIUtils = {
+@@ -915,7 +1024,7 @@ export var PlacesUIUtils = {
aNode,
aWhere,
aWindow,
diff --git a/src/browser/components/places/content/bookmarkProperties-xhtml.patch b/src/browser/components/places/content/bookmarkProperties-xhtml.patch
index 3207a4b51..e661bfa5f 100644
--- a/src/browser/components/places/content/bookmarkProperties-xhtml.patch
+++ b/src/browser/components/places/content/bookmarkProperties-xhtml.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/places/content/bookmarkProperties.xhtml b/browser/components/places/content/bookmarkProperties.xhtml
-index 4aad4e4fb4139aa3d81e00eefa82e26b697df973..831e42a4a55e277b5b8e81e4317a2007c5306996 100644
+index 4aad4e4fb4139aa3d81e00eefa82e26b697df973..eb4055341964edaaff53163da8fc3723b93e72f6 100644
--- a/browser/components/places/content/bookmarkProperties.xhtml
+++ b/browser/components/places/content/bookmarkProperties.xhtml
@@ -38,6 +38,8 @@
diff --git a/src/browser/components/places/content/browserPlacesViews-js.patch b/src/browser/components/places/content/browserPlacesViews-js.patch
index b71b2f5bd..aa584f20d 100644
--- a/src/browser/components/places/content/browserPlacesViews-js.patch
+++ b/src/browser/components/places/content/browserPlacesViews-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/places/content/browserPlacesViews.js b/browser/components/places/content/browserPlacesViews.js
-index bbfbe9c703dff25bf939369f5b99cdaa76a5ae24..c28688d488960c1de73baf4c0e69b9f8401e4226 100644
+index 384d599c58cefbf80f5a50489fc401df0c8de8a5..aa85972946c3ff7866fbea86b0372432fb02cd6f 100644
--- a/browser/components/places/content/browserPlacesViews.js
+++ b/browser/components/places/content/browserPlacesViews.js
@@ -328,12 +328,23 @@ class PlacesViewBase {
@@ -37,7 +37,7 @@ index bbfbe9c703dff25bf939369f5b99cdaa76a5ae24..c28688d488960c1de73baf4c0e69b9f8
} else if (PlacesUtils.containerTypes.includes(type)) {
element = document.createXULElement("menu");
element.setAttribute("container", "true");
-@@ -1014,25 +1026,33 @@ class PlacesToolbar extends PlacesViewBase {
+@@ -1015,25 +1027,33 @@ class PlacesToolbar extends PlacesViewBase {
this._rootElt.firstChild.remove();
}
@@ -82,7 +82,7 @@ index bbfbe9c703dff25bf939369f5b99cdaa76a5ae24..c28688d488960c1de73baf4c0e69b9f8
);
++startIndex;
if (elt.localName != "toolbarseparator") {
-@@ -1040,15 +1060,12 @@ class PlacesToolbar extends PlacesViewBase {
+@@ -1041,15 +1061,12 @@ class PlacesToolbar extends PlacesViewBase {
}
}
if (!elt) {
@@ -101,7 +101,7 @@ index bbfbe9c703dff25bf939369f5b99cdaa76a5ae24..c28688d488960c1de73baf4c0e69b9f8
});
});
-@@ -1058,7 +1075,7 @@ class PlacesToolbar extends PlacesViewBase {
+@@ -1059,7 +1076,7 @@ class PlacesToolbar extends PlacesViewBase {
let fragment = document.createDocumentFragment();
for (let i = startIndex; i < limit; ++i) {
@@ -110,7 +110,7 @@ index bbfbe9c703dff25bf939369f5b99cdaa76a5ae24..c28688d488960c1de73baf4c0e69b9f8
}
await new Promise(resolve => window.requestAnimationFrame(resolve));
if (!this._isAlive) {
-@@ -1120,6 +1137,8 @@ class PlacesToolbar extends PlacesViewBase {
+@@ -1122,6 +1139,8 @@ class PlacesToolbar extends PlacesViewBase {
"scheme",
PlacesUIUtils.guessUrlSchemeForUI(aChild.uri)
);
@@ -119,7 +119,7 @@ index bbfbe9c703dff25bf939369f5b99cdaa76a5ae24..c28688d488960c1de73baf4c0e69b9f8
}
}
-@@ -2268,7 +2287,7 @@ this.PlacesPanelview = class PlacesPanelview extends PlacesViewBase {
+@@ -2314,7 +2333,7 @@ this.PlacesPanelview = class PlacesPanelview extends PlacesViewBase {
PlacesUIUtils.guessUrlSchemeForUI(placesNode.uri)
);
element.setAttribute("label", PlacesUIUtils.getBestTitle(placesNode));
diff --git a/src/browser/components/places/content/editBookmark-js.patch b/src/browser/components/places/content/editBookmark-js.patch
index 92392184f..7dd2e0524 100644
--- a/src/browser/components/places/content/editBookmark-js.patch
+++ b/src/browser/components/places/content/editBookmark-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/places/content/editBookmark.js b/browser/components/places/content/editBookmark.js
-index f562f19741d882d92365da531b55e2810a0e79ea..a68ce8191314845c589f3a9f14b56028e0532628 100644
+index 0fb2225d0fadd27e9e7851be77f18afe7d053c80..347203d6ea9cab3cb803f28515613229b6a454b3 100644
--- a/browser/components/places/content/editBookmark.js
+++ b/browser/components/places/content/editBookmark.js
@@ -387,6 +387,10 @@ var gEditItemOverlay = {
@@ -21,7 +21,7 @@ index f562f19741d882d92365da531b55e2810a0e79ea..a68ce8191314845c589f3a9f14b56028
}
if (this._paneInfo.bulkTagging) {
-@@ -1194,6 +1199,9 @@ var gEditItemOverlay = {
+@@ -1178,6 +1183,9 @@ var gEditItemOverlay = {
case "editBMPanel_tagsSelectorExpander":
this.toggleTagsSelector().catch(console.error);
break;
@@ -31,7 +31,7 @@ index f562f19741d882d92365da531b55e2810a0e79ea..a68ce8191314845c589f3a9f14b56028
}
break;
}
-@@ -1280,6 +1288,128 @@ var gEditItemOverlay = {
+@@ -1256,6 +1264,128 @@ var gEditItemOverlay = {
get bookmarkState() {
return this._bookmarkState;
},
@@ -160,7 +160,7 @@ index f562f19741d882d92365da531b55e2810a0e79ea..a68ce8191314845c589f3a9f14b56028
};
ChromeUtils.defineLazyGetter(gEditItemOverlay, "_folderTree", () => {
-@@ -1318,6 +1448,9 @@ for (let elt of [
+@@ -1294,6 +1424,9 @@ for (let elt of [
"locationField",
"keywordField",
"tagsField",
diff --git a/src/browser/components/preferences/jar-mn.patch b/src/browser/components/preferences/jar-mn.patch
index c012d4399..e34d6d44a 100644
--- a/src/browser/components/preferences/jar-mn.patch
+++ b/src/browser/components/preferences/jar-mn.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/preferences/jar.mn b/browser/components/preferences/jar.mn
-index f06aaedc681cac4dc26d8e168d47991098477424..db2e81338793f99d9f034555abb1f6ef28bb1ae9 100644
+index bd094a48b418b8ff1e28ebbe722877262868d750..47f026b74f75329406fe021402124d5307cf6e32 100644
--- a/browser/components/preferences/jar.mn
+++ b/browser/components/preferences/jar.mn
-@@ -46,3 +46,5 @@ browser.jar:
+@@ -49,3 +49,5 @@ browser.jar:
content/browser/preferences/widgets/sync-device-name.mjs (widgets/sync-device-name/sync-device-name.mjs)
content/browser/preferences/widgets/sync-engines-list.mjs (widgets/sync-engine-list/sync-engines-list.mjs)
content/browser/preferences/widgets/sync-engines-list.css (widgets/sync-engine-list/sync-engines-list.css)
diff --git a/src/browser/components/preferences/main-inc-xhtml.patch b/src/browser/components/preferences/main-inc-xhtml.patch
index 51f4997c3..5ce97c789 100644
--- a/src/browser/components/preferences/main-inc-xhtml.patch
+++ b/src/browser/components/preferences/main-inc-xhtml.patch
@@ -1,18 +1,8 @@
diff --git a/browser/components/preferences/main.inc.xhtml b/browser/components/preferences/main.inc.xhtml
-index 171021979f4783251db7f74d52a922d4bd244f08..cdc91ac91905956a82dfa3ed229146622d1d3d80 100644
+index f23beeb5c793bc7a6cbea4512a5f2cd379ec98c7..09617b8fbbd01e87b97e323cb3f7ca055bc06778 100644
--- a/browser/components/preferences/main.inc.xhtml
+++ b/browser/components/preferences/main.inc.xhtml
-@@ -49,7 +49,8 @@
-
-
-+ hidden="true"
-+ style="display: none !important;">
-
-
-
-@@ -210,6 +211,7 @@
+@@ -96,6 +96,7 @@
languages-customize-add.label,
" />
diff --git a/src/browser/components/preferences/main-js.patch b/src/browser/components/preferences/main-js.patch
index f344585a4..2a03cb2c3 100644
--- a/src/browser/components/preferences/main-js.patch
+++ b/src/browser/components/preferences/main-js.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/preferences/main.js b/browser/components/preferences/main.js
-index 3720de145e6aa3fa2fb13f8480155d9472edaa8b..f04808d58b29611f4058d9fc52ab8bc20a34825a 100644
+index e77dfebdf3a15033182eeae6eccd44a63aae3740..4e25b3e1abaeeaec3e83e0e1b53bf578eba5587b 100644
--- a/browser/components/preferences/main.js
+++ b/browser/components/preferences/main.js
-@@ -2190,6 +2190,11 @@ SettingGroupManager.registerGroups({
+@@ -2652,6 +2652,11 @@ SettingGroupManager.registerGroups({
id: "browserRestoreSession",
l10nId: "startup-restore-windows-and-tabs",
},
@@ -14,7 +14,7 @@ index 3720de145e6aa3fa2fb13f8480155d9472edaa8b..f04808d58b29611f4058d9fc52ab8bc2
{
id: "windowsLaunchOnLogin",
l10nId: "windows-launch-on-login",
-@@ -4606,7 +4611,7 @@ function getBundleForLocales(newLocales) {
+@@ -5277,7 +5282,7 @@ function getBundleForLocales(newLocales) {
])
);
return new Localization(
diff --git a/src/browser/components/preferences/preferences-js.patch b/src/browser/components/preferences/preferences-js.patch
index ff28dac0c..d1f8e8a89 100644
--- a/src/browser/components/preferences/preferences-js.patch
+++ b/src/browser/components/preferences/preferences-js.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/preferences/preferences.js b/browser/components/preferences/preferences.js
-index 7a279d4655523156ff259c9f6bcb2a0def9d1749..de71cec7693d1fe3bf34017ab76027b83631830a 100644
+index 3c60cc9f199ba5836ea1233fbbeb74a6dd63b0c0..252966bca1c8c915885b6c6391360fb6cd90f5ba 100644
--- a/browser/components/preferences/preferences.js
+++ b/browser/components/preferences/preferences.js
-@@ -121,6 +121,7 @@ ChromeUtils.defineLazyGetter(this, "gSubDialog", function () {
+@@ -119,6 +119,7 @@ ChromeUtils.defineLazyGetter(this, "gSubDialog", function () {
styleSheets: [
"chrome://browser/skin/preferences/dialog.css",
"chrome://browser/skin/preferences/preferences.css",
@@ -10,7 +10,7 @@ index 7a279d4655523156ff259c9f6bcb2a0def9d1749..de71cec7693d1fe3bf34017ab76027b8
],
resizeCallback: async ({ title, frame }) => {
// Search within main document and highlight matched keyword.
-@@ -350,6 +351,10 @@ function init_all() {
+@@ -359,6 +360,10 @@ function init_all() {
register_module("paneSearch", gSearchPane);
register_module("panePrivacy", gPrivacyPane);
register_module("paneContainers", gContainersPane);
diff --git a/src/browser/components/preferences/preferences-xhtml.patch b/src/browser/components/preferences/preferences-xhtml.patch
index 32b4a023f..dd7973708 100644
--- a/src/browser/components/preferences/preferences-xhtml.patch
+++ b/src/browser/components/preferences/preferences-xhtml.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/preferences/preferences.xhtml b/browser/components/preferences/preferences.xhtml
-index 0dd43c76f947e593a9be5edae936f1af17f9b627..df026b3e164da92536adef72ee0388386cb9708b 100644
+index b006d5e5e64c418fbf930c010401e4ea3a3647a3..27886c04258e40f7c6ec444320a9a2a1cf960db0 100644
--- a/browser/components/preferences/preferences.xhtml
+++ b/browser/components/preferences/preferences.xhtml
@@ -42,6 +42,8 @@
@@ -11,7 +11,7 @@ index 0dd43c76f947e593a9be5edae936f1af17f9b627..df026b3e164da92536adef72ee038838
-@@ -111,6 +113,11 @@
+@@ -112,6 +114,11 @@
@@ -23,7 +23,7 @@ index 0dd43c76f947e593a9be5edae936f1af17f9b627..df026b3e164da92536adef72ee038838
@@ -74,7 +74,7 @@ index 0dd43c76f947e593a9be5edae936f1af17f9b627..df026b3e164da92536adef72ee038838
@@ -86,7 +86,7 @@ index 0dd43c76f947e593a9be5edae936f1af17f9b627..df026b3e164da92536adef72ee038838
-@@ -265,6 +311,10 @@
+@@ -266,6 +312,10 @@
#include sync.inc.xhtml
#include experimental.inc.xhtml
#include moreFromMozilla.inc.xhtml
diff --git a/src/browser/components/preferences/sync-inc-xhtml.patch b/src/browser/components/preferences/sync-inc-xhtml.patch
index 6b81d057a..98a7f91e4 100644
--- a/src/browser/components/preferences/sync-inc-xhtml.patch
+++ b/src/browser/components/preferences/sync-inc-xhtml.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/preferences/sync.inc.xhtml b/browser/components/preferences/sync.inc.xhtml
-index 86053cbf35ef1b004185ee54e9d7b9f2e2b8d550..a8fe2db034ffe99e01fd0f92d629151df7f708a8 100644
+index d473643ccf12b1f1116acaed2d5541622982ee6e..2e3496c24533f4c663c9b07bf689d18c1ed11b95 100644
--- a/browser/components/preferences/sync.inc.xhtml
+++ b/browser/components/preferences/sync.inc.xhtml
@@ -223,6 +223,10 @@
diff --git a/src/browser/components/search/SearchOneOffs-sys-mjs.patch b/src/browser/components/search/SearchOneOffs-sys-mjs.patch
index ef27cf200..ed2cd3169 100644
--- a/src/browser/components/search/SearchOneOffs-sys-mjs.patch
+++ b/src/browser/components/search/SearchOneOffs-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/search/SearchOneOffs.sys.mjs b/browser/components/search/SearchOneOffs.sys.mjs
-index 3e5b29bc0a740df503e69f811ef01de1d6f0340a..b1bcdfc8c1bba506370f1a05fb31630c64bbd6d3 100644
+index 6317d8e22342bf50c82e5b526253d43406e74428..f233584b4a863309f71806cf7a3ee8e06f043429 100644
--- a/browser/components/search/SearchOneOffs.sys.mjs
+++ b/browser/components/search/SearchOneOffs.sys.mjs
-@@ -473,7 +473,7 @@ export class SearchOneOffs {
+@@ -482,7 +482,7 @@ export class SearchOneOffs {
// For the search-bar, always show the one-off buttons where there is an
// option to add an engine.
let addEngineNeeded = isSearchBar && addEngines.length;
diff --git a/src/browser/components/search/SearchUIUtils-sys-mjs.patch b/src/browser/components/search/SearchUIUtils-sys-mjs.patch
index a916f0fc6..003ba1465 100644
--- a/src/browser/components/search/SearchUIUtils-sys-mjs.patch
+++ b/src/browser/components/search/SearchUIUtils-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/search/SearchUIUtils.sys.mjs b/browser/components/search/SearchUIUtils.sys.mjs
-index 22680c91da251adc21bb46debc73b3dbf6cdf08c..80d465e698c9900a6495d3f17ca2e66a25ff4021 100644
+index cc84dd2417809ca7f8403c07a52601d37f79354b..3d54118375691af3a5cd8f2191be930b00161a52 100644
--- a/browser/components/search/SearchUIUtils.sys.mjs
+++ b/browser/components/search/SearchUIUtils.sys.mjs
-@@ -445,6 +445,7 @@ export var SearchUIUtils = {
+@@ -456,6 +456,7 @@ export var SearchUIUtils = {
},
});
diff --git a/src/browser/components/sessionstore/SessionStore-sys-mjs.patch b/src/browser/components/sessionstore/SessionStore-sys-mjs.patch
index e6a7b8a35..a59ddb865 100644
--- a/src/browser/components/sessionstore/SessionStore-sys-mjs.patch
+++ b/src/browser/components/sessionstore/SessionStore-sys-mjs.patch
@@ -1,18 +1,18 @@
diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs
-index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf06644d92 100644
+index 3bebeb70e1a88aefb3ef4bc2114bd85b0d8d1e51..5414adeca242f00bff98c5e41de74f33dd2846bb 100644
--- a/browser/components/sessionstore/SessionStore.sys.mjs
+++ b/browser/components/sessionstore/SessionStore.sys.mjs
-@@ -127,6 +127,9 @@ const TAB_EVENTS = [
- "TabGroupCollapse",
- "TabGroupExpand",
+@@ -129,6 +129,9 @@ const TAB_EVENTS = [
"TabSplitViewActivate",
+ "SplitViewRemoved",
+ "SplitViewCreated",
+ "TabAddedToEssentials",
+ "TabRemovedFromEssentials",
+ "ZenWorkspaceDataChanged",
];
const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
-@@ -198,6 +201,8 @@ ChromeUtils.defineESModuleGetters(lazy, {
+@@ -200,6 +203,8 @@ ChromeUtils.defineESModuleGetters(lazy, {
TabStateCache: "resource:///modules/sessionstore/TabStateCache.sys.mjs",
TabStateFlusher: "resource:///modules/sessionstore/TabStateFlusher.sys.mjs",
setTimeout: "resource://gre/modules/Timer.sys.mjs",
@@ -21,7 +21,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
});
ChromeUtils.defineLazyGetter(lazy, "blankURI", () => {
-@@ -1263,10 +1268,7 @@ var SessionStoreInternal = {
+@@ -1292,10 +1297,7 @@ var SessionStoreInternal = {
*/
get willAutoRestore() {
return (
@@ -33,7 +33,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
);
},
-@@ -1940,6 +1942,9 @@ var SessionStoreInternal = {
+@@ -1972,6 +1974,9 @@ var SessionStoreInternal = {
case "TabPinned":
case "TabUnpinned":
case "SwapDocShells":
@@ -43,7 +43,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
this.saveStateDelayed(win);
break;
case "TabGroupCreate":
-@@ -2050,6 +2055,10 @@ var SessionStoreInternal = {
+@@ -2085,6 +2090,10 @@ var SessionStoreInternal = {
this._windows[aWindow.__SSi].isTaskbarTab = true;
}
@@ -54,7 +54,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
if (lazy.AIWindow.isAIWindowActiveAndEnabled(aWindow)) {
this._windows[aWindow.__SSi].isAIWindow = true;
}
-@@ -2086,7 +2095,7 @@ var SessionStoreInternal = {
+@@ -2121,7 +2130,7 @@ var SessionStoreInternal = {
let isTaskbarTab = this._windows[aWindow.__SSi].isTaskbarTab;
// A regular window is not a private window, taskbar tab window, or popup window
let isRegularWindow =
@@ -63,7 +63,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
// perform additional initialization when the first window is loading
if (lazy.RunState.isStopped) {
-@@ -2098,7 +2107,7 @@ var SessionStoreInternal = {
+@@ -2133,7 +2142,7 @@ var SessionStoreInternal = {
// to disk to NOW() to enforce a full interval before the next write.
lazy.SessionSaver.updateLastSaveTime();
@@ -72,7 +72,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
this._log.debug(
"initializeWindow, the window is private or a web app. Saving SessionStartup.state for possibly restoring later"
);
-@@ -2141,6 +2150,7 @@ var SessionStoreInternal = {
+@@ -2176,6 +2185,7 @@ var SessionStoreInternal = {
null,
"sessionstore-one-or-no-tab-restored"
);
@@ -80,7 +80,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
this._deferredAllWindowsRestored.resolve();
}
// this window was opened by _openWindowWithState
-@@ -2190,7 +2200,6 @@ var SessionStoreInternal = {
+@@ -2225,7 +2235,6 @@ var SessionStoreInternal = {
if (closedWindowState) {
let newWindowState;
if (
@@ -88,7 +88,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
!lazy.SessionStartup.willRestore()
) {
// We want to split the window up into pinned tabs and unpinned tabs.
-@@ -2226,6 +2235,7 @@ var SessionStoreInternal = {
+@@ -2261,6 +2270,7 @@ var SessionStoreInternal = {
}
if (newWindowState) {
@@ -96,7 +96,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
// Ensure that the window state isn't hidden
this._restoreCount = 1;
let state = { windows: [newWindowState] };
-@@ -2254,6 +2264,15 @@ var SessionStoreInternal = {
+@@ -2289,6 +2299,15 @@ var SessionStoreInternal = {
});
this._shouldRestoreLastSession = false;
}
@@ -112,7 +112,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
if (this._restoreLastWindow && aWindow.toolbar.visible) {
// always reset (if not a popup window)
-@@ -2404,7 +2423,7 @@ var SessionStoreInternal = {
+@@ -2439,7 +2458,7 @@ var SessionStoreInternal = {
var tabbrowser = aWindow.gBrowser;
@@ -121,7 +121,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
TAB_EVENTS.forEach(function (aEvent) {
tabbrowser.tabContainer.removeEventListener(aEvent, this, true);
-@@ -2455,7 +2474,7 @@ var SessionStoreInternal = {
+@@ -2490,7 +2509,7 @@ var SessionStoreInternal = {
let isLastRegularWindow =
Object.values(this._windows).filter(
@@ -130,7 +130,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
).length == 1;
this._log.debug(
`onClose, closing window isLastRegularWindow? ${isLastRegularWindow}`
-@@ -2512,8 +2531,8 @@ var SessionStoreInternal = {
+@@ -2547,8 +2566,8 @@ var SessionStoreInternal = {
// 2) Flush the window.
// 3) When the flush is complete, revisit our decision to store the window
// in _closedWindows, and add/remove as necessary.
@@ -141,7 +141,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
}
completionPromise = lazy.TabStateFlusher.flushWindow(aWindow).then(() => {
-@@ -2533,8 +2552,9 @@ var SessionStoreInternal = {
+@@ -2568,8 +2587,9 @@ var SessionStoreInternal = {
// Save non-private windows if they have at
// least one saveable tab or are the last window.
@@ -153,7 +153,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
if (!isLastWindow && winData.closedId > -1) {
this._addClosedAction(
-@@ -2610,7 +2630,7 @@ var SessionStoreInternal = {
+@@ -2645,7 +2665,7 @@ var SessionStoreInternal = {
* to call this method again asynchronously (for example, after
* a window flush).
*/
@@ -162,7 +162,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
// Make sure SessionStore is still running, and make sure that we
// haven't chosen to forget this window.
if (
-@@ -2627,6 +2647,7 @@ var SessionStoreInternal = {
+@@ -2662,6 +2682,7 @@ var SessionStoreInternal = {
// _closedWindows from a previous call to this function.
let winIndex = this._closedWindows.indexOf(winData);
let alreadyStored = winIndex != -1;
@@ -170,7 +170,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
// If sidebar command is truthy, i.e. sidebar is open, store sidebar settings
let shouldStore = hasSaveableTabs || isLastWindow;
-@@ -3429,7 +3450,7 @@ var SessionStoreInternal = {
+@@ -3483,7 +3504,7 @@ var SessionStoreInternal = {
if (!isPrivateWindow && tabState.isPrivate) {
return;
}
@@ -179,7 +179,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
return;
}
-@@ -4150,6 +4171,12 @@ var SessionStoreInternal = {
+@@ -4223,6 +4244,12 @@ var SessionStoreInternal = {
Math.min(tabState.index, tabState.entries.length)
);
tabState.pinned = false;
@@ -192,7 +192,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
if (inBackground === false) {
aWindow.gBrowser.selectedTab = newTab;
-@@ -4586,6 +4613,8 @@ var SessionStoreInternal = {
+@@ -4659,6 +4686,8 @@ var SessionStoreInternal = {
// Append the tab if we're opening into a different window,
tabIndex: aSource == aTargetWindow ? pos : Infinity,
pinned: state.pinned,
@@ -201,7 +201,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
userContextId: state.userContextId,
skipLoad: true,
preferredRemoteType,
-@@ -5087,9 +5116,10 @@ var SessionStoreInternal = {
+@@ -5160,9 +5189,10 @@ var SessionStoreInternal = {
if (activePageData.title && activePageData.title != activePageData.url) {
win.gBrowser.setInitialTabTitle(tab, activePageData.title, {
isContentTitle: true,
@@ -213,7 +213,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
}
}
-@@ -5446,7 +5476,7 @@ var SessionStoreInternal = {
+@@ -5527,7 +5557,7 @@ var SessionStoreInternal = {
for (let i = tabbrowser.pinnedTabCount; i < tabbrowser.tabs.length; i++) {
let tab = tabbrowser.tabs[i];
@@ -222,7 +222,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
removableTabs.push(tab);
}
}
-@@ -5559,7 +5589,7 @@ var SessionStoreInternal = {
+@@ -5640,7 +5670,7 @@ var SessionStoreInternal = {
// collect the data for all windows
for (ix in this._windows) {
@@ -231,7 +231,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
// window data is still in _statesToRestore
continue;
}
-@@ -5702,11 +5732,12 @@ var SessionStoreInternal = {
+@@ -5784,11 +5814,12 @@ var SessionStoreInternal = {
}
let tabbrowser = aWindow.gBrowser;
@@ -245,7 +245,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
// update the internal state data for this window
for (let tab of tabs) {
if (tab == aWindow.FirefoxViewHandler.tab) {
-@@ -5717,6 +5748,9 @@ var SessionStoreInternal = {
+@@ -5799,6 +5830,9 @@ var SessionStoreInternal = {
tabsData.push(tabData);
}
@@ -255,7 +255,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
// update tab group state for this window
winData.groups = [];
for (let tabGroup of aWindow.gBrowser.tabGroups) {
-@@ -5729,7 +5763,7 @@ var SessionStoreInternal = {
+@@ -5815,7 +5849,7 @@ var SessionStoreInternal = {
// a window is closed, point to the first item in the tab strip instead (it will never be the Firefox View tab,
// since it's only inserted into the tab strip after it's selected).
if (aWindow.FirefoxViewHandler.tab?.selected) {
@@ -264,7 +264,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
winData.title = tabbrowser.tabs[0].label;
}
winData.selected = selectedIndex;
-@@ -5844,8 +5878,8 @@ var SessionStoreInternal = {
+@@ -6017,8 +6051,8 @@ var SessionStoreInternal = {
// selectTab represents.
let selectTab = 0;
if (overwriteTabs) {
@@ -275,7 +275,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
selectTab = Math.min(selectTab, winData.tabs.length);
}
-@@ -5867,6 +5901,7 @@ var SessionStoreInternal = {
+@@ -6040,6 +6074,7 @@ var SessionStoreInternal = {
if (overwriteTabs) {
for (let i = tabbrowser.browsers.length - 1; i >= 0; i--) {
if (!tabbrowser.tabs[i].selected) {
@@ -283,7 +283,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
tabbrowser.removeTab(tabbrowser.tabs[i]);
}
}
-@@ -5900,6 +5935,12 @@ var SessionStoreInternal = {
+@@ -6074,6 +6109,12 @@ var SessionStoreInternal = {
savedTabGroup => !openTabGroupIdsInWindow.has(savedTabGroup.id)
);
}
@@ -296,7 +296,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
// Move the originally open tabs to the end.
if (initialTabs) {
-@@ -6453,6 +6494,25 @@ var SessionStoreInternal = {
+@@ -6638,6 +6679,25 @@ var SessionStoreInternal = {
// Most of tabData has been restored, now continue with restoring
// attributes that may trigger external events.
@@ -322,7 +322,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
if (tabData.pinned) {
tabbrowser.pinTab(tab);
-@@ -6601,6 +6661,9 @@ var SessionStoreInternal = {
+@@ -6797,6 +6857,9 @@ var SessionStoreInternal = {
aWindow.gURLBar.readOnly = false;
}
}
@@ -332,7 +332,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
let promiseParts = Promise.withResolvers();
aWindow.setTimeout(() => {
-@@ -7389,7 +7452,7 @@ var SessionStoreInternal = {
+@@ -7592,7 +7655,7 @@ var SessionStoreInternal = {
let groupsToSave = new Map();
for (let tIndex = 0; tIndex < window.tabs.length; ) {
@@ -341,7 +341,7 @@ index f066bc7a9cca1788080d088141030c225a733931..accb078ebbc23f9a823ae6c277f1e1bf
// Adjust window.selected
if (tIndex + 1 < window.selected) {
window.selected -= 1;
-@@ -7404,7 +7467,7 @@ var SessionStoreInternal = {
+@@ -7607,7 +7670,7 @@ var SessionStoreInternal = {
);
// We don't want to increment tIndex here.
continue;
diff --git a/src/browser/components/sessionstore/TabGroupState-sys-mjs.patch b/src/browser/components/sessionstore/TabGroupState-sys-mjs.patch
index 034fc32d3..0ced48d9a 100644
--- a/src/browser/components/sessionstore/TabGroupState-sys-mjs.patch
+++ b/src/browser/components/sessionstore/TabGroupState-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/sessionstore/TabGroupState.sys.mjs b/browser/components/sessionstore/TabGroupState.sys.mjs
-index 934326aefc80479a2ca2ee9e376375f117512b4d..db840ead9ab53849f8f1f33864972347d43f9398 100644
+index 1289549cf33ce6efb620c877bd1ba1c24475d2b0..4c34c923f4b129dd9ea79414d978c6432317340c 100644
--- a/browser/components/sessionstore/TabGroupState.sys.mjs
+++ b/browser/components/sessionstore/TabGroupState.sys.mjs
-@@ -62,6 +62,9 @@ class _TabGroupState {
+@@ -65,6 +65,9 @@ class _TabGroupState {
*/
collect(tabGroup) {
return {
diff --git a/src/browser/components/sessionstore/TabState-sys-mjs.patch b/src/browser/components/sessionstore/TabState-sys-mjs.patch
index 01a91ed76..a0916b716 100644
--- a/src/browser/components/sessionstore/TabState-sys-mjs.patch
+++ b/src/browser/components/sessionstore/TabState-sys-mjs.patch
@@ -1,9 +1,9 @@
diff --git a/browser/components/sessionstore/TabState.sys.mjs b/browser/components/sessionstore/TabState.sys.mjs
-index 82721356d191055bec0d4b0ca49e481221988801..e01904a6ea73e068c236adecbac6a97adedb2bd3 100644
+index eb24c3ffdd2cfb33379aca993af5171fdb91ac2c..15d3fbff397df23f112355e22ca5dba5bf29528f 100644
--- a/browser/components/sessionstore/TabState.sys.mjs
+++ b/browser/components/sessionstore/TabState.sys.mjs
-@@ -85,7 +85,25 @@ class _TabState {
- tabData.groupId = tab.group.id;
+@@ -99,7 +99,25 @@ class _TabState {
+ }
}
+ tabData.zenWorkspace = tab.getAttribute("zen-workspace-id");
diff --git a/src/browser/components/sidebar/browser-sidebar-js.patch b/src/browser/components/sidebar/browser-sidebar-js.patch
index 37d268851..dbce99ae3 100644
--- a/src/browser/components/sidebar/browser-sidebar-js.patch
+++ b/src/browser/components/sidebar/browser-sidebar-js.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/sidebar/browser-sidebar.js b/browser/components/sidebar/browser-sidebar.js
-index 86a74b2abfe9b49d71ce61fefc636b865bef83a9..7c18fcf15d127d79febb03ca15f0193dd6263604 100644
+index ae85009ad8f0a1cc6d3f3a890b27178df99e5ece..a432f7ee5d3f92bf623ff6d00d5b68ab7a6ecbe7 100644
--- a/browser/components/sidebar/browser-sidebar.js
+++ b/browser/components/sidebar/browser-sidebar.js
-@@ -799,7 +799,7 @@ var SidebarController = {
+@@ -807,7 +807,7 @@ var SidebarController = {
setPosition() {
// First reset all ordinals to match DOM ordering.
let contentArea = document.getElementById("tabbrowser-tabbox");
diff --git a/src/browser/components/tabbrowser/TabsList-sys-mjs.patch b/src/browser/components/tabbrowser/TabsList-sys-mjs.patch
index eb3402bae..1815399e6 100644
--- a/src/browser/components/tabbrowser/TabsList-sys-mjs.patch
+++ b/src/browser/components/tabbrowser/TabsList-sys-mjs.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/TabsList.sys.mjs b/browser/components/tabbrowser/TabsList.sys.mjs
-index 400a69449e6477da754b06530eef7c15ea9ad887..7dd22f481dade16286533acffc2c2321d4c34b41 100644
+index 4de5139f404fab227874f626bda27e2a32cf87a0..7574e6db1606c72e8da3141d4a8deec727376af8 100644
--- a/browser/components/tabbrowser/TabsList.sys.mjs
+++ b/browser/components/tabbrowser/TabsList.sys.mjs
@@ -87,7 +87,7 @@ class TabsListBase {
diff --git a/src/browser/components/tabbrowser/content/drag-and-drop-js.patch b/src/browser/components/tabbrowser/content/drag-and-drop-js.patch
index 96ceb2308..a854251d8 100644
--- a/src/browser/components/tabbrowser/content/drag-and-drop-js.patch
+++ b/src/browser/components/tabbrowser/content/drag-and-drop-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/drag-and-drop.js b/browser/components/tabbrowser/content/drag-and-drop.js
-index 730190d845f5312736f437cdc654c1693241ce56..d0404c46955fa16103a6f83e410f4f8ad7e78655 100644
+index ced2bfd88de2d16e2c028ca3f4d9d27516363575..752eeca60ecb8693fb56a3a594a341d1c3587e35 100644
--- a/browser/components/tabbrowser/content/drag-and-drop.js
+++ b/browser/components/tabbrowser/content/drag-and-drop.js
@@ -35,6 +35,9 @@
@@ -22,7 +22,15 @@ index 730190d845f5312736f437cdc654c1693241ce56..d0404c46955fa16103a6f83e410f4f8a
if (
(dropEffect == "move" || dropEffect == "copy") &&
document == draggedTab.ownerDocument &&
-@@ -136,10 +142,6 @@
+@@ -138,6 +144,7 @@
+ !draggedTab.group.collapsed
+ ) {
+ draggedTab.group.collapsed = true;
++ gZenFolders.animateGroupMove(tab.group);
+ }
+
+ if (dropEffect == "move") {
+@@ -145,10 +152,6 @@
// Pinned tabs in expanded vertical mode are on a grid format and require
// different logic to drag and drop.
@@ -33,7 +41,7 @@ index 730190d845f5312736f437cdc654c1693241ce56..d0404c46955fa16103a6f83e410f4f8a
this._animateTabMove(event);
return;
}
-@@ -272,6 +274,10 @@
+@@ -287,6 +290,10 @@
this._tabDropIndicator.hidden = true;
event.stopPropagation();
@@ -44,7 +52,7 @@ index 730190d845f5312736f437cdc654c1693241ce56..d0404c46955fa16103a6f83e410f4f8a
if (draggedTab && dropEffect == "copy") {
let duplicatedDraggedTab;
let duplicatedTabs = [];
-@@ -297,8 +303,9 @@
+@@ -312,12 +319,16 @@
let translateOffsetY = oldTranslateY % tabHeight;
let newTranslateX = oldTranslateX - translateOffsetX;
let newTranslateY = oldTranslateY - translateOffsetY;
@@ -53,30 +61,24 @@ index 730190d845f5312736f437cdc654c1693241ce56..d0404c46955fa16103a6f83e410f4f8a
+ let isPinned = draggedTab?.group ? draggedTab.group.pinned : draggedTab.pinned;
+ let numPinned = gBrowser._numVisiblePinTabsWithoutCollapsed;
+ let essential = draggedTab.hasAttribute("zen-essential");
+ let tabs = this._tabbrowserTabs.dragAndDropElements.slice(
+- isPinned ? 0 : numPinned,
+- isPinned ? numPinned : undefined
++ isPinned ? (essential ? 0 : gBrowser._numZenEssentials) : numPinned,
++ isPinned ? (essential ? gBrowser._numZenEssentials : numPinned) : undefined
+ );
++ if (tabs.length == 0) {
++ tabs = [...movingTabs];
++ }
if (this._tabbrowserTabs.isContainerVerticalPinnedGrid(draggedTab)) {
// Update both translate axis for pinned vertical expanded tabs
-@@ -314,9 +321,12 @@
- }
- } else {
- let tabs = this._tabbrowserTabs.dragAndDropElements.slice(
-- isPinned ? 0 : numPinned,
-- isPinned ? numPinned : undefined
-+ isPinned ? (essential ? 0 : gBrowser._numZenEssentials) : numPinned,
-+ isPinned ? (essential ? gBrowser._numZenEssentials : numPinned) : undefined
- );
-+ if (tabs.length == 0) {
-+ tabs = [...movingTabs];
-+ }
- let size = this._tabbrowserTabs.verticalMode ? "height" : "width";
- let screenAxis = this._tabbrowserTabs.verticalMode
- ? "screenY"
-@@ -368,11 +378,13 @@
+@@ -390,11 +401,13 @@
this._dragToPinPromoCard,
];
let shouldPin =
+ false &&
- isTab(draggedTab) &&
+ movingTabs.some(t => isTab(t)) &&
!draggedTab.pinned &&
(overPinnedDropIndicator ||
dragToPinTargets.some(el => el.contains(event.target)));
@@ -85,7 +87,7 @@ index 730190d845f5312736f437cdc654c1693241ce56..d0404c46955fa16103a6f83e410f4f8a
isTab(draggedTab) &&
draggedTab.pinned &&
this._tabbrowserTabs.arrowScrollbox.contains(event.target);
-@@ -436,6 +448,7 @@
+@@ -458,6 +471,7 @@
}
}
@@ -93,7 +95,7 @@ index 730190d845f5312736f437cdc654c1693241ce56..d0404c46955fa16103a6f83e410f4f8a
if (shouldTranslate) {
let translationPromises = [];
for (let item of movingTabs) {
-@@ -447,7 +460,7 @@
+@@ -469,7 +483,7 @@
item.removeAttribute("tabdrop-samewindow");
resolve();
};
@@ -102,16 +104,16 @@ index 730190d845f5312736f437cdc654c1693241ce56..d0404c46955fa16103a6f83e410f4f8a
postTransitionCleanup();
} else {
let onTransitionEnd = transitionendEvent => {
-@@ -521,7 +534,7 @@
+@@ -544,7 +558,7 @@
if (tab.selected) {
selectedTab = tab;
indexForSelectedTab = newIndex;
-- } else {
+- } else if (isSplitViewWrapper(tab)) {
+ } else if (false) {
- const newTab = gBrowser.adoptTab(tab, {
- elementIndex: newIndex,
- selectTab: tab == draggedTab,
-@@ -531,7 +544,7 @@
+ const droppedIntoPinnedArea = dropIndex < gBrowser.pinnedTabCount;
+ const newSplitView = gBrowser.adoptSplitView(tab, {
+ elementIndex: droppedIntoPinnedArea
+@@ -569,7 +583,7 @@
}
}
}
@@ -120,18 +122,18 @@ index 730190d845f5312736f437cdc654c1693241ce56..d0404c46955fa16103a6f83e410f4f8a
const newTab = gBrowser.adoptTab(selectedTab, {
elementIndex: indexForSelectedTab,
selectTab: selectedTab == draggedTab,
-@@ -542,10 +555,6 @@
+@@ -603,10 +617,6 @@
+ this._tabbrowserTabs.dragAndDropElements[
+ gBrowser.pinnedTabCount + unpinnedSplitViews.length - 1
+ ];
+- gBrowser.addRangeToMultiSelectedTabs(
+- firstUnpinnedSplitView.tabs.at(0),
+- lastUnpinnedSplitView.tabs.at(-1)
+- );
+ }
}
-
- // Restore tab selection
-- gBrowser.addRangeToMultiSelectedTabs(
-- this._tabbrowserTabs.dragAndDropElements[dropIndex],
-- this._tabbrowserTabs.dragAndDropElements[newIndex - 1]
-- );
} else {
- // Pass true to disallow dropping javascript: or data: urls
- let links;
-@@ -592,6 +601,7 @@
+@@ -655,6 +665,7 @@
let nextItem = this._tabbrowserTabs.dragAndDropElements[newIndex];
let tabGroup = isTab(nextItem) && nextItem.group;
@@ -139,7 +141,7 @@ index 730190d845f5312736f437cdc654c1693241ce56..d0404c46955fa16103a6f83e410f4f8a
gBrowser.loadTabs(urls, {
inBackground,
replace,
-@@ -629,7 +639,16 @@
+@@ -696,7 +707,16 @@
this._expandGroupOnDrop(draggedTab);
}
this._resetTabsAfterDrop(draggedTab.ownerDocument);
@@ -157,9 +159,9 @@ index 730190d845f5312736f437cdc654c1693241ce56..d0404c46955fa16103a6f83e410f4f8a
if (
dt.mozUserCancelled ||
dt.dropEffect != "none" ||
-@@ -833,11 +852,10 @@
- _getDragTarget(event, { ignoreSides = false } = {}) {
- let { target } = event;
+@@ -909,11 +929,10 @@
+ return this.#getHorizontalScrollboxDragTarget(event, ignoreSides);
+ }
while (target) {
- if (
- isTab(target) ||
@@ -173,7 +175,7 @@ index 730190d845f5312736f437cdc654c1693241ce56..d0404c46955fa16103a6f83e410f4f8a
break;
}
target = target.parentNode;
-@@ -854,6 +872,9 @@
+@@ -943,6 +962,9 @@
return null;
}
}
@@ -183,7 +185,7 @@ index 730190d845f5312736f437cdc654c1693241ce56..d0404c46955fa16103a6f83e410f4f8a
return target;
}
-@@ -883,7 +904,8 @@
+@@ -996,7 +1018,8 @@
isTabGroupLabel(draggedTab) &&
draggedTab._dragData?.expandGroupOnDrop
) {
@@ -193,7 +195,7 @@ index 730190d845f5312736f437cdc654c1693241ce56..d0404c46955fa16103a6f83e410f4f8a
}
}
-@@ -1061,7 +1083,6 @@
+@@ -1180,7 +1203,6 @@
// using updateDragImage. On Linux, we can use a panel.
if (platform == "win" || platform == "macosx") {
captureListener = function () {
@@ -201,7 +203,7 @@ index 730190d845f5312736f437cdc654c1693241ce56..d0404c46955fa16103a6f83e410f4f8a
};
} else {
// Create a panel to use it in setDragImage
-@@ -1099,7 +1120,6 @@
+@@ -1218,7 +1240,6 @@
);
dragImageOffset = dragImageOffset * scale;
}
@@ -209,7 +211,7 @@ index 730190d845f5312736f437cdc654c1693241ce56..d0404c46955fa16103a6f83e410f4f8a
// _dragData.offsetX/Y give the coordinates that the mouse should be
// positioned relative to the corner of the new window created upon
-@@ -1118,7 +1138,7 @@
+@@ -1237,7 +1258,7 @@
let dropEffect = this.getDropEffectForTabDrag(event);
let isMovingInTabStrip = !fromTabList && dropEffect == "move";
let collapseTabGroupDuringDrag =
@@ -218,7 +220,7 @@ index 730190d845f5312736f437cdc654c1693241ce56..d0404c46955fa16103a6f83e410f4f8a
tab._dragData = {
offsetX: this._tabbrowserTabs.verticalMode
-@@ -1128,7 +1148,7 @@
+@@ -1247,7 +1268,7 @@
? event.screenY - window.screenY - tabOffset
: event.screenY - window.screenY,
scrollPos:
@@ -227,53 +229,59 @@ index 730190d845f5312736f437cdc654c1693241ce56..d0404c46955fa16103a6f83e410f4f8a
? this._tabbrowserTabs.pinnedTabsContainer.scrollPosition
: this._tabbrowserTabs.arrowScrollbox.scrollPosition,
screenX: event.screenX,
-@@ -1155,6 +1175,7 @@
-
- if (collapseTabGroupDuringDrag) {
- tab.group.collapsed = true;
-+ gZenFolders.animateGroupMove(tab.group);
- }
- }
- }
-@@ -1179,6 +1200,7 @@
+@@ -1294,6 +1315,7 @@
if (tabStripItemElement.hasAttribute("dragtarget")) {
return;
}
+ return;
let isPinned = tab.pinned;
- let numPinned = gBrowser.pinnedTabCount;
let dragAndDropElements = this._tabbrowserTabs.dragAndDropElements;
-@@ -1604,7 +1626,6 @@
+ let isGrid = this._tabbrowserTabs.isContainerVerticalPinnedGrid(tab);
+@@ -1660,23 +1682,6 @@
+ // Slide the relevant tabs to their new position.
+ // non-moving tabs adjust for RTL
+- for (let item of this._tabbrowserTabs.dragAndDropElements) {
+- if (
+- !tab._dragData.movingTabsSet.has(item) &&
+- (item._moveTogetherSelectedTabsData?.translateX ||
+- item._moveTogetherSelectedTabsData?.translateY) &&
+- ((item.pinned && tab.pinned) || (!item.pinned && !tab.pinned))
+- ) {
+- let element = elementToMove(item);
+- if (isGrid) {
+- element.style.transform = `translate(${(this._rtlMode ? -1 : 1) * item._moveTogetherSelectedTabsData.translateX}px, ${item._moveTogetherSelectedTabsData.translateY}px)`;
+- } else if (this._tabbrowserTabs.verticalMode) {
+- element.style.transform = `translateY(${item._moveTogetherSelectedTabsData.translateY}px)`;
+- } else {
+- element.style.transform = `translateX(${(this._rtlMode ? -1 : 1) * item._moveTogetherSelectedTabsData.translateX}px)`;
+- }
+- }
+- }
+ // moving tabs don't adjust for RTL
+ for (let item of selectedElements) {
+ if (
+@@ -1725,7 +1730,6 @@
for (let item of this._tabbrowserTabs.dragAndDropElements) {
+ delete item._moveTogetherSelectedTabsData;
item = elementToMove(item);
- item.style.transform = "";
item.removeAttribute("multiselected-move-together");
- delete item._moveTogetherSelectedTabsData;
}
-@@ -2432,7 +2453,6 @@
- for (let item of this._tabbrowserTabs.dragAndDropElements) {
- this._resetGroupTarget(item);
- item = elementToMove(item);
-- item.style.transform = "";
- }
- this._tabbrowserTabs.removeAttribute("movingtab-group");
- this._tabbrowserTabs.removeAttribute("movingtab-ungroup");
-@@ -2463,17 +2483,14 @@
- tab.style.left = "";
+ }
+@@ -2569,7 +2573,6 @@
tab.style.top = "";
tab.style.maxWidth = "";
+ tab.style.pointerEvents = "";
- tab.removeAttribute("dragtarget");
+ tab.removeAttribute("small-stack");
+ tab.removeAttribute("big-stack");
}
- for (let label of draggedTabDocument.getElementsByClassName(
- "tab-group-label-container"
- )) {
- label.style.width = "";
-- label.style.height = "";
+@@ -2582,7 +2585,6 @@
label.style.left = "";
label.style.top = "";
- label.style.maxWidth = "";
+ label.style.pointerEvents = "";
- label.removeAttribute("dragtarget");
}
- let periphery = draggedTabDocument.getElementById(
- "tabbrowser-arrowscrollbox-periphery"
+ for (let label of draggedTabContainer.getElementsByClassName(
+ "tab-group-label"
diff --git a/src/browser/components/tabbrowser/content/tab-js.patch b/src/browser/components/tabbrowser/content/tab-js.patch
index 340265cd8..8bd69d35d 100644
--- a/src/browser/components/tabbrowser/content/tab-js.patch
+++ b/src/browser/components/tabbrowser/content/tab-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/tab.js b/browser/components/tabbrowser/content/tab.js
-index 836bee14d2b63604688ebe477a5d915a5e99b305..5f60aa3bedd4f80b887ea3e050fd86a21a6b280a 100644
+index e4266a159a0d5c42cc294602d00b8f66131f35d5..88c321f05dabd948d06e155f6e0474669fc15c20 100644
--- a/browser/components/tabbrowser/content/tab.js
+++ b/browser/components/tabbrowser/content/tab.js
@@ -21,6 +21,7 @@
@@ -22,7 +22,7 @@ index 836bee14d2b63604688ebe477a5d915a5e99b305..5f60aa3bedd4f80b887ea3e050fd86a2
`;
-@@ -86,7 +89,7 @@
+@@ -87,7 +90,7 @@
".tab-content":
"pinned,selected=visuallyselected,multiselected,titlechanged,attention",
".tab-icon-stack":
@@ -31,7 +31,7 @@ index 836bee14d2b63604688ebe477a5d915a5e99b305..5f60aa3bedd4f80b887ea3e050fd86a2
".tab-throbber":
"fadein,pinned,busy,progress,selected=visuallyselected",
".tab-icon-pending":
-@@ -95,9 +98,9 @@
+@@ -96,9 +99,9 @@
"src=image,requestcontextid,fadein,pinned,selected=visuallyselected,busy,crashed,sharing,pictureinpicture,pending,discarded",
".tab-sharing-icon-overlay": "sharing,selected=visuallyselected,pinned",
".tab-icon-overlay":
@@ -43,7 +43,7 @@ index 836bee14d2b63604688ebe477a5d915a5e99b305..5f60aa3bedd4f80b887ea3e050fd86a2
".tab-label-container":
"pinned,selected=visuallyselected,labeldirection",
".tab-label":
-@@ -188,7 +191,7 @@
+@@ -189,7 +192,7 @@
}
set _visuallySelected(val) {
@@ -52,7 +52,7 @@ index 836bee14d2b63604688ebe477a5d915a5e99b305..5f60aa3bedd4f80b887ea3e050fd86a2
return;
}
-@@ -224,11 +227,23 @@
+@@ -225,11 +228,23 @@
}
get visible() {
@@ -81,7 +81,7 @@ index 836bee14d2b63604688ebe477a5d915a5e99b305..5f60aa3bedd4f80b887ea3e050fd86a2
}
get hidden() {
-@@ -307,7 +322,7 @@
+@@ -308,7 +323,7 @@
return false;
}
@@ -90,7 +90,7 @@ index 836bee14d2b63604688ebe477a5d915a5e99b305..5f60aa3bedd4f80b887ea3e050fd86a2
}
get lastAccessed() {
-@@ -384,7 +399,18 @@
+@@ -393,7 +408,18 @@
}
get group() {
@@ -110,9 +110,9 @@ index 836bee14d2b63604688ebe477a5d915a5e99b305..5f60aa3bedd4f80b887ea3e050fd86a2
}
get splitview() {
-@@ -444,6 +470,10 @@
- : this;
- gBrowser.warmupTab(tabToWarm);
+@@ -475,6 +501,10 @@
+ }
+ }
+ if (event.target.classList.contains("tab-reset-pin-button")) {
+ gZenPinnedTabManager.onResetPinButtonMouseOver(this, event);
@@ -121,7 +121,7 @@ index 836bee14d2b63604688ebe477a5d915a5e99b305..5f60aa3bedd4f80b887ea3e050fd86a2
// If the previous target wasn't part of this tab then this is a mouseenter event.
if (!this.contains(event.relatedTarget)) {
this._mouseenter();
-@@ -455,6 +485,7 @@
+@@ -504,6 +534,7 @@
if (!this.contains(event.relatedTarget)) {
this._mouseleave();
}
@@ -129,7 +129,7 @@ index 836bee14d2b63604688ebe477a5d915a5e99b305..5f60aa3bedd4f80b887ea3e050fd86a2
}
on_dragstart(event) {
-@@ -489,6 +520,8 @@
+@@ -538,6 +569,8 @@
this.style.MozUserFocus = "ignore";
} else if (
event.target.classList.contains("tab-close-button") ||
@@ -138,7 +138,7 @@ index 836bee14d2b63604688ebe477a5d915a5e99b305..5f60aa3bedd4f80b887ea3e050fd86a2
event.target.classList.contains("tab-icon-overlay") ||
event.target.classList.contains("tab-audio-button")
) {
-@@ -543,16 +576,21 @@
+@@ -592,16 +625,21 @@
this.style.MozUserFocus = "";
}
@@ -161,7 +161,7 @@ index 836bee14d2b63604688ebe477a5d915a5e99b305..5f60aa3bedd4f80b887ea3e050fd86a2
gBrowser.multiSelectedTabsCount > 0 &&
!event.target.classList.contains("tab-close-button") &&
!event.target.classList.contains("tab-icon-overlay") &&
-@@ -564,8 +602,9 @@
+@@ -613,8 +651,9 @@
}
if (
@@ -173,7 +173,7 @@ index 836bee14d2b63604688ebe477a5d915a5e99b305..5f60aa3bedd4f80b887ea3e050fd86a2
) {
if (this.activeMediaBlocked) {
if (this.multiselected) {
-@@ -583,7 +622,7 @@
+@@ -632,7 +671,7 @@
return;
}
@@ -182,7 +182,7 @@ index 836bee14d2b63604688ebe477a5d915a5e99b305..5f60aa3bedd4f80b887ea3e050fd86a2
if (this.multiselected) {
gBrowser.removeMultiSelectedTabs(
lazy.TabMetrics.userTriggeredContext(
-@@ -603,6 +642,14 @@
+@@ -652,6 +691,14 @@
// (see tabbrowser-tabs 'click' handler).
gBrowser.tabContainer._blockDblClick = true;
}
@@ -197,7 +197,7 @@ index 836bee14d2b63604688ebe477a5d915a5e99b305..5f60aa3bedd4f80b887ea3e050fd86a2
}
on_dblclick(event) {
-@@ -626,6 +673,8 @@
+@@ -675,6 +722,8 @@
animate: true,
triggeringEvent: event,
});
diff --git a/src/browser/components/tabbrowser/content/tabbrowser-js.patch b/src/browser/components/tabbrowser/content/tabbrowser-js.patch
index ad66c739e..2c47ad27a 100644
--- a/src/browser/components/tabbrowser/content/tabbrowser-js.patch
+++ b/src/browser/components/tabbrowser/content/tabbrowser-js.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
-index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498dd65b1fba 100644
+index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c19d2c96fa 100644
--- a/browser/components/tabbrowser/content/tabbrowser.js
+++ b/browser/components/tabbrowser/content/tabbrowser.js
-@@ -405,6 +405,7 @@
+@@ -413,6 +413,7 @@
* @type {MozBrowser[]}
*/
get splitViewBrowsers() {
@@ -10,7 +10,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
const browsers = [];
if (this.#activeSplitView) {
for (const tab of this.#activeSplitView.tabs) {
-@@ -469,15 +470,66 @@
+@@ -486,15 +487,66 @@
return this.tabContainer.visibleTabs;
}
@@ -79,7 +79,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
set selectedTab(val) {
if (
gSharedTabWarning.willShowSharedTabWarning(val) ||
-@@ -553,6 +605,10 @@
+@@ -570,6 +622,10 @@
userContextId = parseInt(tabArgument.getAttribute("usercontextid"), 10);
}
@@ -90,7 +90,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
if (tabArgument && tabArgument.linkedBrowser) {
remoteType = tabArgument.linkedBrowser.remoteType;
initialBrowsingContextGroupId =
-@@ -645,6 +701,8 @@
+@@ -662,6 +718,8 @@
this.tabpanels.appendChild(panel);
let tab = this.tabs[0];
@@ -99,7 +99,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
tab.linkedPanel = uniqueId;
this._selectedTab = tab;
this._selectedBrowser = browser;
-@@ -932,13 +990,18 @@
+@@ -949,13 +1007,18 @@
}
this.showTab(aTab);
@@ -119,7 +119,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
aTab.setAttribute("pinned", "true");
this._updateTabBarForPinnedTabs();
-@@ -951,11 +1014,19 @@
+@@ -968,11 +1031,19 @@
}
this.#handleTabMove(aTab, () => {
@@ -140,7 +140,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
});
aTab.style.marginInlineStart = "";
-@@ -1132,6 +1203,9 @@
+@@ -1149,6 +1220,9 @@
let LOCAL_PROTOCOLS = ["chrome:", "about:", "resource:", "data:"];
@@ -150,7 +150,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
if (
aIconURL &&
!LOCAL_PROTOCOLS.some(protocol => aIconURL.startsWith(protocol))
-@@ -1141,6 +1215,9 @@
+@@ -1158,6 +1232,9 @@
);
return;
}
@@ -160,7 +160,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
let browser = this.getBrowserForTab(aTab);
browser.mIconURL = aIconURL;
-@@ -1422,7 +1499,6 @@
+@@ -1479,7 +1556,6 @@
// Preview mode should not reset the owner
if (!this._previewMode && !oldTab.selected) {
@@ -168,7 +168,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
}
let lastRelatedTab = this._lastRelatedTabMap.get(oldTab);
-@@ -1513,6 +1589,7 @@
+@@ -1570,6 +1646,7 @@
if (!this._previewMode) {
newTab.recordTimeFromUnloadToReload();
newTab.updateLastAccessed();
@@ -176,7 +176,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
oldTab.updateLastAccessed();
// if this is the foreground window, update the last-seen timestamps.
if (this.ownerGlobal == BrowserWindowTracker.getTopWindow()) {
-@@ -1665,6 +1742,9 @@
+@@ -1784,6 +1861,9 @@
}
let activeEl = document.activeElement;
@@ -186,7 +186,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
// If focus is on the old tab, move it to the new tab.
if (activeEl == oldTab) {
newTab.focus();
-@@ -1987,7 +2067,12 @@
+@@ -2110,7 +2190,12 @@
return this._setTabLabel(aTab, aLabel);
}
@@ -200,7 +200,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
if (!aLabel || aLabel.includes("about:reader?")) {
return false;
}
-@@ -2096,7 +2181,7 @@
+@@ -2235,7 +2320,7 @@
newIndex = this.selectedTab._tPos + 1;
}
@@ -209,7 +209,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
if (this.isTabGroupLabel(targetTab)) {
throw new Error(
"Replacing a tab group label with a tab is not supported"
-@@ -2371,6 +2456,7 @@
+@@ -2515,6 +2600,7 @@
uriIsAboutBlank,
userContextId,
skipLoad,
@@ -217,7 +217,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
} = {}) {
let b = document.createXULElement("browser");
// Use the JSM global to create the permanentKey, so that if the
-@@ -2444,8 +2530,7 @@
+@@ -2588,8 +2674,7 @@
// we use a different attribute name for this?
b.setAttribute("name", name);
}
@@ -227,7 +227,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
b.setAttribute("transparent", "true");
}
-@@ -2610,7 +2695,7 @@
+@@ -2759,7 +2844,7 @@
let panel = this.getPanel(browser);
let uniqueId = this._generateUniquePanelID();
@@ -236,7 +236,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
aTab.linkedPanel = uniqueId;
// Inject the into the DOM if necessary.
-@@ -2670,8 +2755,8 @@
+@@ -2819,8 +2904,8 @@
// If we transitioned from one browser to two browsers, we need to set
// hasSiblings=false on both the existing browser and the new browser.
if (this.tabs.length == 2) {
@@ -247,7 +247,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
} else {
aTab.linkedBrowser.browsingContext.hasSiblings = this.tabs.length > 1;
}
-@@ -2858,7 +2943,6 @@
+@@ -3005,7 +3090,6 @@
this.selectedTab = this.addTrustedTab(BROWSER_NEW_TAB_URL, {
tabIndex: tab._tPos + 1,
userContextId: tab.userContextId,
@@ -255,7 +255,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
focusUrlBar: true,
});
resolve(this.selectedBrowser);
-@@ -2968,6 +3052,9 @@
+@@ -3115,6 +3199,9 @@
schemelessInput,
hasValidUserGestureActivation = false,
textDirectiveUserActivation = false,
@@ -265,7 +265,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
} = {}
) {
// all callers of addTab that pass a params object need to pass
-@@ -2978,10 +3065,17 @@
+@@ -3125,10 +3212,17 @@
);
}
@@ -283,7 +283,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
// If we're opening a foreground tab, set the owner by default.
ownerTab ??= inBackground ? null : this.selectedTab;
-@@ -2989,6 +3083,7 @@
+@@ -3136,6 +3230,7 @@
if (this.selectedTab.owner) {
this.selectedTab.owner = null;
}
@@ -291,7 +291,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
// Find the tab that opened this one, if any. This is used for
// determining positioning, and inherited attributes such as the
-@@ -3041,6 +3136,22 @@
+@@ -3188,6 +3283,22 @@
noInitialLabel,
skipBackgroundNotify,
});
@@ -314,7 +314,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
if (insertTab) {
// Insert the tab into the tab container in the correct position.
this.#insertTabAtIndex(t, {
-@@ -3049,6 +3160,7 @@
+@@ -3196,6 +3307,7 @@
ownerTab,
openerTab,
pinned,
@@ -322,7 +322,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
bulkOrderedOpen,
tabGroup: tabGroup ?? openerTab?.group,
});
-@@ -3067,6 +3179,7 @@
+@@ -3214,6 +3326,7 @@
openWindowInfo,
skipLoad,
triggeringRemoteType,
@@ -330,7 +330,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
}));
if (focusUrlBar) {
-@@ -3191,6 +3304,12 @@
+@@ -3338,6 +3451,12 @@
}
}
@@ -343,7 +343,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
// Additionally send pinned tab events
if (pinned) {
this.#notifyPinnedStatus(t);
-@@ -3426,6 +3545,7 @@
+@@ -3656,6 +3775,7 @@
isAdoptingGroup = false,
isUserTriggered = false,
telemetryUserCreateSource = "unknown",
@@ -351,7 +351,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
} = {}
) {
if (
-@@ -3436,9 +3556,6 @@
+@@ -3666,9 +3786,6 @@
!this.isSplitViewWrapper(tabOrSplitView)
)
) {
@@ -361,7 +361,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
}
if (!color) {
-@@ -3459,9 +3576,14 @@
+@@ -3689,9 +3806,14 @@
label,
isAdoptingGroup
);
@@ -378,7 +378,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
);
group.addTabs(tabsAndSplitViews);
-@@ -3582,7 +3704,7 @@
+@@ -3812,7 +3934,7 @@
}
this.#handleTabMove(tab, () =>
@@ -387,7 +387,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
);
}
-@@ -3666,6 +3788,7 @@
+@@ -3896,6 +4018,7 @@
color: group.color,
insertBefore: newTabs[0],
isAdoptingGroup: true,
@@ -395,7 +395,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
});
}
-@@ -3856,6 +3979,7 @@
+@@ -4107,6 +4230,7 @@
openWindowInfo,
skipLoad,
triggeringRemoteType,
@@ -403,7 +403,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
}
) {
// If we don't have a preferred remote type (or it is `NOT_REMOTE`), and
-@@ -3925,6 +4049,7 @@
+@@ -4176,6 +4300,7 @@
openWindowInfo,
name,
skipLoad,
@@ -411,7 +411,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
});
}
-@@ -4120,9 +4245,9 @@
+@@ -4389,9 +4514,9 @@
}
// Add a new tab if needed.
@@ -423,7 +423,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
let url = "about:blank";
if (tabData.entries?.length) {
-@@ -4159,8 +4284,10 @@
+@@ -4428,8 +4553,10 @@
insertTab: false,
skipLoad: true,
preferredRemoteType,
@@ -435,7 +435,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
if (select) {
tabToSelect = tab;
}
-@@ -4172,7 +4299,8 @@
+@@ -4451,7 +4578,8 @@
this.pinTab(tab);
// Then ensure all the tab open/pinning information is sent.
this._fireTabOpen(tab, {});
@@ -445,7 +445,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
let { groupId } = tabData;
const tabGroup = tabGroupWorkingData.get(groupId);
// if a tab refers to a tab group we don't know, skip any group
-@@ -4186,7 +4314,10 @@
+@@ -4471,7 +4599,10 @@
tabGroup.stateData.id,
tabGroup.stateData.color,
tabGroup.stateData.collapsed,
@@ -457,7 +457,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
);
tabsFragment.appendChild(tabGroup.node);
}
-@@ -4231,9 +4362,23 @@
+@@ -4526,9 +4657,23 @@
// to remove the old selected tab.
if (tabToSelect) {
let leftoverTab = this.selectedTab;
@@ -473,15 +473,15 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
+ gZenWorkspaces._initialTab._shouldRemove = true;
+ }
+ }
- }
++ }
+ else {
+ gZenWorkspaces._tabToRemoveForEmpty = this.selectedTab;
-+ }
+ }
+ this._hasAlreadyInitializedZenSessionStore = true;
if (tabs.length > 1 || !tabs[0].selected) {
this._updateTabsAfterInsert();
-@@ -4424,11 +4569,14 @@
+@@ -4719,11 +4864,14 @@
if (ownerTab) {
tab.owner = ownerTab;
}
@@ -497,7 +497,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
if (
!bulkOrderedOpen &&
((openerTab &&
-@@ -4440,7 +4588,7 @@
+@@ -4735,7 +4883,7 @@
let lastRelatedTab =
openerTab && this._lastRelatedTabMap.get(openerTab);
let previousTab = lastRelatedTab || openerTab || this.selectedTab;
@@ -506,7 +506,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
tabGroup = previousTab.group;
}
if (
-@@ -4456,7 +4604,7 @@
+@@ -4751,7 +4899,7 @@
previousTab.splitview
) + 1;
} else if (previousTab.visible) {
@@ -515,7 +515,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
} else if (previousTab == FirefoxViewHandler.tab) {
elementIndex = 0;
}
-@@ -4484,14 +4632,14 @@
+@@ -4779,14 +4927,14 @@
}
// Ensure index is within bounds.
if (tab.pinned) {
@@ -534,7 +534,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
if (pinned && !itemAfter?.pinned) {
itemAfter = null;
-@@ -4504,7 +4652,7 @@
+@@ -4803,7 +4951,7 @@
this.tabContainer._invalidateCachedTabs();
@@ -543,7 +543,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
if (
(this.isTab(itemAfter) && itemAfter.group == tabGroup) ||
this.isSplitViewWrapper(itemAfter)
-@@ -4535,7 +4683,11 @@
+@@ -4834,7 +4982,11 @@
const tabContainer = pinned
? this.tabContainer.pinnedTabsContainer
: this.tabContainer;
@@ -555,7 +555,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
}
if (tab.group?.collapsed) {
-@@ -4550,6 +4702,7 @@
+@@ -4849,6 +5001,7 @@
if (pinned) {
this._updateTabBarForPinnedTabs();
}
@@ -563,7 +563,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
TabBarVisibility.update();
}
-@@ -5102,6 +5255,7 @@
+@@ -5397,6 +5550,7 @@
telemetrySource,
} = {}
) {
@@ -571,7 +571,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
// When 'closeWindowWithLastTab' pref is enabled, closing all tabs
// can be considered equivalent to closing the window.
if (
-@@ -5191,6 +5345,7 @@
+@@ -5486,6 +5640,7 @@
if (lastToClose) {
this.removeTab(lastToClose, aParams);
}
@@ -579,7 +579,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
} catch (e) {
console.error(e);
}
-@@ -5229,6 +5384,12 @@
+@@ -5524,6 +5679,12 @@
aTab._closeTimeNoAnimTimerId = Glean.browserTabclose.timeNoAnim.start();
}
@@ -592,7 +592,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
// Handle requests for synchronously removing an already
// asynchronously closing tab.
if (!animate && aTab.closing) {
-@@ -5243,6 +5404,9 @@
+@@ -5538,6 +5699,9 @@
// state).
let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width;
let isLastTab = this.#isLastTabInWindow(aTab);
@@ -602,7 +602,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
if (
!this._beginRemoveTab(aTab, {
closeWindowFastpath: true,
-@@ -5291,7 +5455,13 @@
+@@ -5586,7 +5750,13 @@
// We're not animating, so we can cancel the animation stopwatch.
Glean.browserTabclose.timeAnim.cancel(aTab._closeTimeAnimTimerId);
aTab._closeTimeAnimTimerId = null;
@@ -617,7 +617,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
return;
}
-@@ -5425,7 +5595,7 @@
+@@ -5720,7 +5890,7 @@
closeWindowWithLastTab != null
? closeWindowWithLastTab
: !window.toolbar.visible ||
@@ -626,7 +626,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
if (closeWindow) {
// We've already called beforeunload on all the relevant tabs if we get here,
-@@ -5449,6 +5619,7 @@
+@@ -5744,6 +5914,7 @@
newTab = true;
}
@@ -634,7 +634,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
aTab._endRemoveArgs = [closeWindow, newTab];
// swapBrowsersAndCloseOther will take care of closing the window without animation.
-@@ -5489,13 +5660,7 @@
+@@ -5784,13 +5955,7 @@
aTab._mouseleave();
if (newTab) {
@@ -649,7 +649,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
} else {
TabBarVisibility.update();
}
-@@ -5628,6 +5793,7 @@
+@@ -5923,6 +6088,7 @@
this.tabs[i]._tPos = i;
}
@@ -657,7 +657,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
if (!this._windowIsClosing) {
// update tab close buttons state
this.tabContainer._updateCloseButtons();
-@@ -5851,6 +6017,7 @@
+@@ -6153,6 +6319,7 @@
}
let excludeTabs = new Set(aExcludeTabs);
@@ -665,7 +665,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
// If this tab has a successor, it should be selectable, since
// hiding or closing a tab removes that tab as a successor.
-@@ -5863,15 +6030,22 @@
+@@ -6165,15 +6332,22 @@
!excludeTabs.has(aTab.owner) &&
Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose")
) {
@@ -690,7 +690,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
let tab = this.tabContainer.findNextTab(aTab, {
direction: 1,
filter: _tab => remainingTabs.includes(_tab),
-@@ -5885,7 +6059,7 @@
+@@ -6187,7 +6361,7 @@
}
if (tab) {
@@ -699,7 +699,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
}
// If no qualifying visible tab was found, see if there is a tab in
-@@ -5906,7 +6080,7 @@
+@@ -6208,7 +6382,7 @@
});
}
@@ -708,7 +708,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
}
_blurTab(aTab) {
-@@ -5917,7 +6091,7 @@
+@@ -6219,7 +6393,7 @@
* @returns {boolean}
* False if swapping isn't permitted, true otherwise.
*/
@@ -717,7 +717,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
// Do not allow transfering a private tab to a non-private window
// and vice versa.
if (
-@@ -5971,6 +6145,7 @@
+@@ -6273,6 +6447,7 @@
// fire the beforeunload event in the process. Close the other
// window if this was its last tab.
if (
@@ -725,7 +725,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
!remoteBrowser._beginRemoveTab(aOtherTab, {
adoptedByTab: aOurTab,
closeWindowWithLastTab: true,
-@@ -5982,7 +6157,7 @@
+@@ -6284,7 +6459,7 @@
// If this is the last tab of the window, hide the window
// immediately without animation before the docshell swap, to avoid
// about:blank being painted.
@@ -734,7 +734,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
if (closeWindow) {
let win = aOtherTab.ownerGlobal;
win.windowUtils.suppressAnimation(true);
-@@ -6110,11 +6285,13 @@
+@@ -6412,11 +6587,13 @@
}
// Finish tearing down the tab that's going away.
@@ -748,7 +748,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
this.setTabTitle(aOurTab);
-@@ -6316,10 +6493,10 @@
+@@ -6618,10 +6795,10 @@
SessionStore.deleteCustomTabValue(aTab, "hiddenBy");
}
@@ -761,33 +761,35 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
aTab.selected ||
aTab.closing ||
// Tabs that are sharing the screen, microphone or camera cannot be hidden.
-@@ -6377,7 +6554,8 @@
- *
- * @param {MozTabbrowserTab|MozTabbrowserTabGroup|MozTabbrowserTabGroup.labelElement} aTab
+@@ -6681,7 +6858,8 @@
+ * @param {object} [aOptions={}]
+ * Key-value pairs that will be serialized into the features string.
*/
-- replaceTabWithWindow(aTab, aOptions) {
-+ replaceTabWithWindow(aTab, aOptions, zenForceSync = false) {
+- replaceTabWithWindow(aTab, aOptions = {}) {
++ replaceTabWithWindow(aTab, aOptions = {}, zenForceSync = false) {
+ if (!this.isTab(aTab)) return; // TODO: Handle tab groups
if (this.tabs.length == 1) {
return null;
}
-@@ -6401,12 +6579,14 @@
- }
-
+@@ -6698,7 +6876,7 @@
// tell a new window to take the "dropped" tab
-- return window.openDialog(
-+ let win = window.openDialog(
- AppConstants.BROWSER_CHROME_URL,
- "_blank",
- options,
- aTab
- );
+ let args = Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray);
+ args.appendElement(aTab.splitview ?? aTab);
+- return BrowserWindowTracker.openWindow({
++ let win = BrowserWindowTracker.openWindow({
+ private: PrivateBrowsingUtils.isWindowPrivate(window),
+ features: Object.entries(aOptions)
+ .map(([key, value]) => `${key}=${value}`)
+@@ -6706,6 +6884,8 @@
+ openerWindow: window,
+ args,
+ });
+ win._zenStartupSyncFlag = (zenForceSync || !Services.prefs.getBoolPref("zen.tabs.dnd-open-blank-window", true)) ? 'synced' : 'unsynced';
+ return win;
}
/**
-@@ -6511,7 +6691,7 @@
+@@ -6818,7 +6998,7 @@
* `true` if element is a ``
*/
isTabGroup(element) {
@@ -796,7 +798,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
}
/**
-@@ -6596,8 +6776,8 @@
+@@ -6903,8 +7083,8 @@
}
// Don't allow mixing pinned and unpinned tabs.
@@ -807,7 +809,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
} else {
tabIndex = Math.max(tabIndex, this.pinnedTabCount);
}
-@@ -6623,10 +6803,16 @@
+@@ -6933,13 +7113,19 @@
this.#handleTabMove(
element,
() => {
@@ -817,16 +819,19 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
+ if ((forceUngrouped && neighbor?.group) || neighbor?.group?.hasAttribute("split-view-group")) {
neighbor = neighbor.group;
}
+ if (neighbor?.splitview) {
+ neighbor = neighbor.splitview;
+ }
+ if (element.group?.hasAttribute("split-view-group")) {
+ element = element.group;
+ }
+ if (element.group?.hasAttribute("split-view-group") && neighbor == element.group) {
+ return;
+ }
- if (neighbor && this.isTab(element) && tabIndex > element._tPos) {
- neighbor.after(element);
- } else {
-@@ -6684,23 +6870,31 @@
+ let useAfter = false;
+ if (this.isTab(element)) {
+ useAfter = neighbor && tabIndex > element._tPos;
+@@ -7004,23 +7190,31 @@
#moveTabNextTo(element, targetElement, moveBefore = false, metricsContext) {
if (this.isTabGroupLabel(targetElement)) {
targetElement = targetElement.group;
@@ -864,7 +869,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
} else if (!element.pinned && targetElement && targetElement.pinned) {
// If the caller asks to move an unpinned element next to a pinned
// tab, move the unpinned element to be the first unpinned element
-@@ -6713,14 +6907,38 @@
+@@ -7033,12 +7227,35 @@
// move the tab group right before the first unpinned tab.
// 4. Moving a tab group and the first unpinned tab is grouped:
// move the tab group right before the first unpinned tab's tab group.
@@ -899,12 +904,17 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
+ }
+ }
+ // We want to include the splitview wrapper if it's the targetElement, but
+ // not in the case where we want to reverse tabs within the same splitview.
+@@ -7047,6 +7264,7 @@
+ }
+
let getContainer = () =>
+ element.hasAttribute("zen-essential") ? gZenWorkspaces.getEssentialsSection(element) :
element.pinned
? this.tabContainer.pinnedTabsContainer
: this.tabContainer;
-@@ -6729,11 +6947,15 @@
+@@ -7055,11 +7273,15 @@
element,
() => {
if (moveBefore) {
@@ -921,7 +931,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
}
},
metricsContext
-@@ -6799,10 +7021,10 @@
+@@ -7133,10 +7355,10 @@
* @param {TabMetricsContext} [metricsContext]
*/
moveTabToExistingGroup(aTab, aGroup, metricsContext) {
@@ -934,7 +944,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
return;
}
if (aTab.group && aTab.group.id === aGroup.id) {
-@@ -6874,6 +7096,7 @@
+@@ -7209,6 +7431,7 @@
let state = {
tabIndex: tab._tPos,
@@ -942,16 +952,16 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
};
if (tab.visible) {
state.elementIndex = tab.elementIndex;
-@@ -6903,7 +7126,7 @@
- let changedTabGroup =
- previousTabState.tabGroupId != currentTabState.tabGroupId;
+@@ -7240,7 +7463,7 @@
+ let changedSplitView =
+ previousTabState.splitViewId != currentTabState.splitViewId;
-- if (changedPosition || changedTabGroup) {
-+ if (changedPosition || changedTabGroup || (previousTabState.workspaceId != currentTabState.workspaceId)) {
+- if (changedPosition || changedTabGroup || changedSplitView) {
++ if (changedPosition || changedTabGroup || changedSplitView || (previousTabState.workspaceId != currentTabState.workspaceId)) {
tab.dispatchEvent(
new CustomEvent("TabMove", {
bubbles: true,
-@@ -6942,6 +7165,10 @@
+@@ -7281,6 +7504,10 @@
moveActionCallback();
@@ -962,7 +972,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
// Clear tabs cache after moving nodes because the order of tabs may have
// changed.
this.tabContainer._invalidateCachedTabs();
-@@ -6992,7 +7219,22 @@
+@@ -7331,7 +7558,22 @@
* @returns {object}
* The new tab in the current window, null if the tab couldn't be adopted.
*/
@@ -986,7 +996,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
// Swap the dropped tab with a new one we create and then close
// it in the other window (making it seem to have moved between
// windows). We also ensure that the tab we create to swap into has
-@@ -7035,6 +7277,8 @@
+@@ -7374,6 +7616,8 @@
}
params.skipLoad = true;
let newTab = this.addWebTab("about:blank", params);
@@ -995,24 +1005,24 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
aTab.container.tabDragAndDrop.finishAnimateTabMove();
-@@ -7837,7 +8081,7 @@
- // preventDefault(). It will still raise the window if appropriate.
- break;
- }
-- this.selectedTab = tab;
-+ gZenWorkspaces.switchTabIfNeeded(tab);
- window.focus();
- aEvent.preventDefault();
- break;
-@@ -7854,7 +8098,6 @@
- }
- case "TabGroupCollapse":
- aEvent.target.tabs.forEach(tab => {
-- this.removeFromMultiSelectedTabs(tab);
- });
- break;
- case "TabGroupCreateByUser":
-@@ -8014,7 +8257,9 @@
+@@ -8076,7 +8320,7 @@
+ // preventDefault(). It will still raise the window if appropriate.
+ return;
+ }
+- this.selectedTab = tab;
++ gZenWorkspaces.switchTabIfNeeded(tab);
+ window.focus();
+ aEvent.preventDefault();
+ }
+@@ -8093,7 +8337,6 @@
+
+ on_TabGroupCollapse(aEvent) {
+ aEvent.target.tabs.forEach(tab => {
+- this.removeFromMultiSelectedTabs(tab);
+ });
+ }
+
+@@ -8427,7 +8670,9 @@
let filter = this._tabFilters.get(tab);
if (filter) {
@@ -1022,7 +1032,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
let listener = this._tabListeners.get(tab);
if (listener) {
-@@ -8817,6 +9062,7 @@
+@@ -9233,6 +9478,7 @@
aWebProgress.isTopLevel
) {
this.mTab.setAttribute("busy", "true");
@@ -1030,7 +1040,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
gBrowser._tabAttrModified(this.mTab, ["busy"]);
this.mTab._notselectedsinceload = !this.mTab.selected;
}
-@@ -8897,6 +9143,7 @@
+@@ -9313,6 +9559,7 @@
// known defaults. Note we use the original URL since about:newtab
// redirects to a prerendered page.
const shouldRemoveFavicon =
@@ -1038,7 +1048,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
!this.mBrowser.mIconURL &&
!ignoreBlank &&
!(originalLocation.spec in FAVICON_DEFAULTS);
-@@ -9071,13 +9318,6 @@
+@@ -9487,13 +9734,6 @@
this.mBrowser.originalURI = aRequest.originalURI;
}
@@ -1052,7 +1062,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..d787c39f68ea4507b2cb902df325498d
}
let userContextId = this.mBrowser.getAttribute("usercontextid") || 0;
-@@ -9941,7 +10181,7 @@ var TabContextMenu = {
+@@ -10379,7 +10619,7 @@ var TabContextMenu = {
);
contextUnpinSelectedTabs.hidden =
!this.contextTab.pinned || !this.multiselected;
diff --git a/src/browser/components/tabbrowser/content/tabgroup-js.patch b/src/browser/components/tabbrowser/content/tabgroup-js.patch
index 8d6902d3c..4517ac261 100644
--- a/src/browser/components/tabbrowser/content/tabgroup-js.patch
+++ b/src/browser/components/tabbrowser/content/tabgroup-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/tabgroup.js b/browser/components/tabbrowser/content/tabgroup.js
-index ebcc072abca51ba9936d0e6d97bbd329427c0231..2b0980a745e2339d3220bb701092f4f621876985 100644
+index 3ca119e8dc72fac652c98505211864483d98add2..026b524be51170882e788a701095b938d6923f3e 100644
--- a/browser/components/tabbrowser/content/tabgroup.js
+++ b/browser/components/tabbrowser/content/tabgroup.js
@@ -14,11 +14,11 @@
@@ -17,7 +17,7 @@ index ebcc072abca51ba9936d0e6d97bbd329427c0231..2b0980a745e2339d3220bb701092f4f6
-@@ -69,20 +69,36 @@
+@@ -71,21 +71,37 @@
}
connectedCallback() {
@@ -50,6 +50,7 @@ index ebcc072abca51ba9936d0e6d97bbd329427c0231..2b0980a745e2339d3220bb701092f4f6
// Similar to above, always set up TabSelect listener, as this gets
// removed in disconnectedCallback
this.ownerGlobal.addEventListener("TabSelect", this);
+ this.addEventListener("SplitViewTabChange", this);
- if (this._initialized) {
- return;
@@ -58,7 +59,7 @@ index ebcc072abca51ba9936d0e6d97bbd329427c0231..2b0980a745e2339d3220bb701092f4f6
this._initialized = true;
this.saveOnWindowClose = true;
-@@ -114,11 +130,14 @@
+@@ -112,11 +128,14 @@
this.#labelContainerElement.addEventListener("mouseover", this);
this.#labelContainerElement.addEventListener("mouseout", this);
@@ -78,7 +79,7 @@ index ebcc072abca51ba9936d0e6d97bbd329427c0231..2b0980a745e2339d3220bb701092f4f6
this.#updateLabelAriaAttributes();
-@@ -132,17 +151,21 @@
+@@ -130,17 +149,21 @@
let tabGroupCreateDetail = this.#wasCreatedByAdoption
? { isAdoptingGroup: true }
: {};
@@ -100,7 +101,7 @@ index ebcc072abca51ba9936d0e6d97bbd329427c0231..2b0980a745e2339d3220bb701092f4f6
resetDefaultGroupName = () => {
this.#defaultGroupName = "";
-@@ -166,7 +189,9 @@
+@@ -178,7 +201,9 @@
this.dispatchEvent(
new CustomEvent("TabGroupRemoved", { bubbles: true })
);
@@ -110,7 +111,7 @@ index ebcc072abca51ba9936d0e6d97bbd329427c0231..2b0980a745e2339d3220bb701092f4f6
Services.obs.notifyObservers(
this,
"browser-tabgroup-removed-from-dom"
-@@ -211,7 +236,10 @@
+@@ -223,7 +248,10 @@
}
});
}
@@ -122,7 +123,7 @@ index ebcc072abca51ba9936d0e6d97bbd329427c0231..2b0980a745e2339d3220bb701092f4f6
}
get color() {
-@@ -305,6 +333,9 @@
+@@ -317,6 +345,9 @@
}
set collapsed(val) {
@@ -132,7 +133,7 @@ index ebcc072abca51ba9936d0e6d97bbd329427c0231..2b0980a745e2339d3220bb701092f4f6
if (!!val == this.collapsed) {
return;
}
-@@ -391,7 +422,6 @@
+@@ -403,7 +434,6 @@
tabGroupName,
})
.then(result => {
@@ -140,7 +141,7 @@ index ebcc072abca51ba9936d0e6d97bbd329427c0231..2b0980a745e2339d3220bb701092f4f6
});
}
-@@ -466,13 +496,65 @@
+@@ -478,13 +508,65 @@
* @returns {MozTabbrowserTab[]}
*/
get tabs() {
@@ -211,7 +212,7 @@ index ebcc072abca51ba9936d0e6d97bbd329427c0231..2b0980a745e2339d3220bb701092f4f6
}
/**
-@@ -569,7 +651,6 @@
+@@ -592,7 +674,6 @@
);
} else {
if (tabOrSplitView.pinned) {
@@ -219,7 +220,7 @@ index ebcc072abca51ba9936d0e6d97bbd329427c0231..2b0980a745e2339d3220bb701092f4f6
}
let tabToMove =
this.ownerGlobal === tabOrSplitView.ownerGlobal
-@@ -634,7 +715,7 @@
+@@ -661,7 +742,7 @@
*/
on_click(event) {
let isToggleElement =
@@ -228,7 +229,7 @@ index ebcc072abca51ba9936d0e6d97bbd329427c0231..2b0980a745e2339d3220bb701092f4f6
event.target === this.#overflowCountLabel;
if (isToggleElement && event.button === 0) {
event.preventDefault();
-@@ -705,5 +786,6 @@
+@@ -740,5 +821,6 @@
}
}
diff --git a/src/browser/components/tabbrowser/content/tabs-js.patch b/src/browser/components/tabbrowser/content/tabs-js.patch
index b44d531e5..4e985ecb0 100644
--- a/src/browser/components/tabbrowser/content/tabs-js.patch
+++ b/src/browser/components/tabbrowser/content/tabs-js.patch
@@ -1,17 +1,17 @@
diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js
-index 2760f6700056e2ae9b6a6fdad006c5b679a97233..0b9454f0bb8dc796d54a69e33c05b0d5590b6286 100644
+index 17a56b0e5a7f1fcdf04904586572c7f719e57904..778a4e49fad39a160d1000733a9e27b0c258d78c 100644
--- a/browser/components/tabbrowser/content/tabs.js
+++ b/browser/components/tabbrowser/content/tabs.js
-@@ -244,7 +244,7 @@
- true
- )
- ? new window.TabStacking(this)
-- : new window.TabDragAndDrop(this);
-+ : Services.prefs.getBoolPref("zen.tabs.use-legacy-drag-and-drop") ? new window.TabDragAndDrop(this) : new window.ZenDragAndDrop(this);
+@@ -230,7 +230,7 @@
+
+ this.tooltip = "tabbrowser-tab-tooltip";
+
+- this.tabDragAndDrop = new window.TabDragAndDrop(this);
++ this.tabDragAndDrop = new window.ZenDragAndDrop(this);
this.tabDragAndDrop.init();
}
-@@ -450,7 +450,7 @@
+@@ -454,7 +454,7 @@
// and we're not hitting the scroll buttons.
if (
event.button != 0 ||
@@ -20,7 +20,7 @@ index 2760f6700056e2ae9b6a6fdad006c5b679a97233..0b9454f0bb8dc796d54a69e33c05b0d5
event.composedTarget.localName == "toolbarbutton"
) {
return;
-@@ -531,7 +531,6 @@
+@@ -535,7 +535,6 @@
});
}
} else if (isTabGroupLabel(event.target)) {
@@ -28,7 +28,7 @@ index 2760f6700056e2ae9b6a6fdad006c5b679a97233..0b9454f0bb8dc796d54a69e33c05b0d5
} else if (
event.originalTarget.closest("scrollbox") &&
!Services.prefs.getBoolPref(
-@@ -567,6 +566,9 @@
+@@ -571,6 +570,9 @@
}
on_keydown(event) {
@@ -38,7 +38,7 @@ index 2760f6700056e2ae9b6a6fdad006c5b679a97233..0b9454f0bb8dc796d54a69e33c05b0d5
let { altKey, shiftKey } = event;
let [accel, nonAccel] =
AppConstants.platform == "macosx"
-@@ -761,7 +763,6 @@
+@@ -765,7 +767,6 @@
this._updateCloseButtons();
if (!this.#animatingGroups.size) {
@@ -46,7 +46,7 @@ index 2760f6700056e2ae9b6a6fdad006c5b679a97233..0b9454f0bb8dc796d54a69e33c05b0d5
}
document
-@@ -822,7 +823,7 @@
+@@ -832,7 +833,7 @@
}
get newTabButton() {
@@ -55,7 +55,7 @@ index 2760f6700056e2ae9b6a6fdad006c5b679a97233..0b9454f0bb8dc796d54a69e33c05b0d5
}
get verticalMode() {
-@@ -838,6 +839,7 @@
+@@ -848,6 +849,7 @@
}
get overflowing() {
@@ -63,7 +63,7 @@ index 2760f6700056e2ae9b6a6fdad006c5b679a97233..0b9454f0bb8dc796d54a69e33c05b0d5
return this.hasAttribute("overflow");
}
-@@ -851,29 +853,56 @@
+@@ -861,29 +863,56 @@
if (pinnedChildren?.at(-1)?.id == "pinned-tabs-container-periphery") {
pinnedChildren.pop();
}
@@ -129,8 +129,8 @@ index 2760f6700056e2ae9b6a6fdad006c5b679a97233..0b9454f0bb8dc796d54a69e33c05b0d5
+ return gZenWorkspaces.allTabGroups;
}
- /**
-@@ -941,29 +970,28 @@
+ get allSplitViews() {
+@@ -968,29 +997,28 @@
return this.#focusableItems;
}
@@ -170,7 +170,7 @@ index 2760f6700056e2ae9b6a6fdad006c5b679a97233..0b9454f0bb8dc796d54a69e33c05b0d5
this.#focusableItems = focusableItems;
return this.#focusableItems;
-@@ -976,6 +1004,7 @@
+@@ -1003,6 +1031,7 @@
* focusable (ex, we don't want the splitview container to be focusable, only its children).
*/
get dragAndDropElements() {
@@ -178,7 +178,7 @@ index 2760f6700056e2ae9b6a6fdad006c5b679a97233..0b9454f0bb8dc796d54a69e33c05b0d5
if (this.#dragAndDropElements) {
return this.#dragAndDropElements;
}
-@@ -1046,6 +1075,7 @@
+@@ -1073,6 +1102,7 @@
_invalidateCachedTabs() {
this.#allTabs = null;
this._invalidateCachedVisibleTabs();
@@ -186,7 +186,7 @@ index 2760f6700056e2ae9b6a6fdad006c5b679a97233..0b9454f0bb8dc796d54a69e33c05b0d5
}
_invalidateCachedVisibleTabs() {
-@@ -1065,7 +1095,8 @@
+@@ -1092,7 +1122,8 @@
isContainerVerticalPinnedGrid(tab) {
return (
@@ -196,7 +196,7 @@ index 2760f6700056e2ae9b6a6fdad006c5b679a97233..0b9454f0bb8dc796d54a69e33c05b0d5
this.verticalMode &&
this.hasAttribute("expanded") &&
!this.expandOnHover
-@@ -1159,7 +1190,7 @@
+@@ -1186,7 +1217,7 @@
if (node == null) {
// We have a container for non-tab elements at the end of the scrollbox.
@@ -205,7 +205,7 @@ index 2760f6700056e2ae9b6a6fdad006c5b679a97233..0b9454f0bb8dc796d54a69e33c05b0d5
}
node.before(tab);
-@@ -1257,7 +1288,7 @@
+@@ -1281,7 +1312,7 @@
// There are separate "new tab" buttons for horizontal tabs toolbar, vertical tabs and
// for when the tab strip is overflowed (which is shared by vertical and horizontal tabs);
// Attach the long click popup to all of them.
@@ -214,7 +214,7 @@ index 2760f6700056e2ae9b6a6fdad006c5b679a97233..0b9454f0bb8dc796d54a69e33c05b0d5
const newTab2 = this.newTabButton;
const newTabVertical = document.getElementById(
"vertical-tabs-newtab-button"
-@@ -1358,8 +1389,10 @@
+@@ -1382,8 +1413,10 @@
*/
_handleTabSelect(aInstant) {
let selectedTab = this.selectedItem;
@@ -225,7 +225,7 @@ index 2760f6700056e2ae9b6a6fdad006c5b679a97233..0b9454f0bb8dc796d54a69e33c05b0d5
selectedTab._notselectedsinceload = false;
}
-@@ -1368,7 +1401,7 @@
+@@ -1392,7 +1425,7 @@
* @param {boolean} [shouldScrollInstantly=false]
*/
#ensureTabIsVisible(tab, shouldScrollInstantly = false) {
@@ -234,7 +234,7 @@ index 2760f6700056e2ae9b6a6fdad006c5b679a97233..0b9454f0bb8dc796d54a69e33c05b0d5
if (arrowScrollbox?.overflowing) {
arrowScrollbox.ensureElementIsVisible(tab, shouldScrollInstantly);
}
-@@ -1501,7 +1534,7 @@
+@@ -1519,7 +1552,7 @@
}
_notifyBackgroundTab(aTab) {
diff --git a/src/browser/components/urlbar/UrlbarController-sys-mjs.patch b/src/browser/components/urlbar/UrlbarController-sys-mjs.patch
index 95ea94ee2..afcf34135 100644
--- a/src/browser/components/urlbar/UrlbarController-sys-mjs.patch
+++ b/src/browser/components/urlbar/UrlbarController-sys-mjs.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/urlbar/UrlbarController.sys.mjs b/browser/components/urlbar/UrlbarController.sys.mjs
-index 2dff3603fda9d70d875367fc2b9a05ea5f8eb8c9..0ed283c65f69f00236957aefcb608209e35a3f7c 100644
+index 7751871815ac3aa4641a7752c21f625e03e34c82..418dbecd2739fb8a95ce44efb5d671ac97934f21 100644
--- a/browser/components/urlbar/UrlbarController.sys.mjs
+++ b/browser/components/urlbar/UrlbarController.sys.mjs
@@ -302,7 +302,6 @@ export class UrlbarController {
diff --git a/src/browser/components/urlbar/UrlbarMuxerStandard-sys-mjs.patch b/src/browser/components/urlbar/UrlbarMuxerStandard-sys-mjs.patch
index 8aaaa1045..a0ad5d32a 100644
--- a/src/browser/components/urlbar/UrlbarMuxerStandard-sys-mjs.patch
+++ b/src/browser/components/urlbar/UrlbarMuxerStandard-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/urlbar/UrlbarMuxerStandard.sys.mjs b/browser/components/urlbar/UrlbarMuxerStandard.sys.mjs
-index 000a00f3e56c2f1d3bf4eec8c4924228de1cb418..f91f8cf38f0ba9c403bc284a7cdaaee17435b258 100644
+index 136c66310f37bda3229b82eef32a4a22a716a0b0..4ca15850002cefda0484179839280e58eaf42cfa 100644
--- a/browser/components/urlbar/UrlbarMuxerStandard.sys.mjs
+++ b/browser/components/urlbar/UrlbarMuxerStandard.sys.mjs
-@@ -839,11 +839,16 @@ class MuxerUnifiedComplete extends UrlbarMuxer {
+@@ -837,11 +837,16 @@ class MuxerUnifiedComplete extends UrlbarMuxer {
result.providerName == "UrlbarProviderHeuristicFallback" &&
state.context.heuristicResult?.providerName !=
"UrlbarProviderHeuristicFallback"
diff --git a/src/browser/components/urlbar/UrlbarPrefs-sys-mjs.patch b/src/browser/components/urlbar/UrlbarPrefs-sys-mjs.patch
index de0f9401f..71d0e194c 100644
--- a/src/browser/components/urlbar/UrlbarPrefs-sys-mjs.patch
+++ b/src/browser/components/urlbar/UrlbarPrefs-sys-mjs.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/urlbar/UrlbarPrefs.sys.mjs b/browser/components/urlbar/UrlbarPrefs.sys.mjs
-index e09c9b6007c29ea31005a69cf458ce502b0df361..5846f943c03b2b36a36c1e4a8dbbd9a80ff10fe0 100644
+index ec7b7eeee7999aba76286e84808ed09ffc6df463..12bfafdc7e34c5d6345579cd0aaf515a19d82b31 100644
--- a/browser/components/urlbar/UrlbarPrefs.sys.mjs
+++ b/browser/components/urlbar/UrlbarPrefs.sys.mjs
@@ -760,6 +760,7 @@ function makeDefaultResultGroups({ showSearchSuggestionsFirst }) {
diff --git a/src/browser/components/urlbar/UrlbarProviderHeuristicFallback-sys-mjs.patch b/src/browser/components/urlbar/UrlbarProviderHeuristicFallback-sys-mjs.patch
index 87a664d65..82e3f9236 100644
--- a/src/browser/components/urlbar/UrlbarProviderHeuristicFallback-sys-mjs.patch
+++ b/src/browser/components/urlbar/UrlbarProviderHeuristicFallback-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs b/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs
-index 1e159d12ffdc39be87046689b05022813ea925ac..cba7168eeffa54d2c576982927f096b21e039c83 100644
+index f611d8e44af518aa1adc7505c5021235f55b49de..0eca20cb869626dfa6ace02acc00cad84462d54f 100644
--- a/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs
+++ b/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs
-@@ -77,22 +77,26 @@ export class UrlbarProviderHeuristicFallback extends UrlbarProvider {
+@@ -78,22 +78,26 @@ export class UrlbarProviderHeuristicFallback extends UrlbarProvider {
// Since we can't tell if this is a real URL and whether the user wants
// to visit or search for it, we provide an alternative searchengine
// match if the string looks like an alphanumeric origin or an e-mail.
diff --git a/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch b/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch
index 6f9ceff00..dd171221a 100644
--- a/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch
+++ b/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/urlbar/UrlbarProvidersManager.sys.mjs b/browser/components/urlbar/UrlbarProvidersManager.sys.mjs
-index 3a9cb4735185691df021157e42f8b9cc93f14aa1..00d7eaf3177d27df1e0db5303405ce28f3031d34 100644
+index d9a0566c5ad2a9ae375a23769f856aecc6efd86c..f6e5004806d24e009f96de9482e24c88590939b1 100644
--- a/browser/components/urlbar/UrlbarProvidersManager.sys.mjs
+++ b/browser/components/urlbar/UrlbarProvidersManager.sys.mjs
-@@ -893,6 +893,7 @@ export class Query {
+@@ -912,6 +912,7 @@ export class Query {
if (
result.heuristic &&
this.context.searchMode &&
diff --git a/src/browser/components/urlbar/UrlbarResult-sys-mjs.patch b/src/browser/components/urlbar/UrlbarResult-sys-mjs.patch
index ee573ee49..eed513287 100644
--- a/src/browser/components/urlbar/UrlbarResult-sys-mjs.patch
+++ b/src/browser/components/urlbar/UrlbarResult-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/urlbar/UrlbarResult.sys.mjs b/browser/components/urlbar/UrlbarResult.sys.mjs
-index e6eccc010ed3b4595c0aabb1e7d528b20ce1be9b..b71466ebfad0edecb8d7b78ffbe20a95cd69df98 100644
+index 65b8fb67b51c8959fe1d47b98efbb2bca591eafc..c52c50a87b37ca1c885c55b36e5beccc8dd7c5fb 100644
--- a/browser/components/urlbar/UrlbarResult.sys.mjs
+++ b/browser/components/urlbar/UrlbarResult.sys.mjs
-@@ -178,6 +178,10 @@ export class UrlbarResult {
+@@ -181,6 +181,10 @@ export class UrlbarResult {
return this.#heuristic;
}
diff --git a/src/browser/components/urlbar/UrlbarUtils-sys-mjs.patch b/src/browser/components/urlbar/UrlbarUtils-sys-mjs.patch
index 1b84fce26..4a3ac4e4f 100644
--- a/src/browser/components/urlbar/UrlbarUtils-sys-mjs.patch
+++ b/src/browser/components/urlbar/UrlbarUtils-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/urlbar/UrlbarUtils.sys.mjs b/browser/components/urlbar/UrlbarUtils.sys.mjs
-index caceb63a04fe282d7c906e27a6a2cfebc1ec8cda..74e395e649dd2cbe84683cb583d641b5596082d4 100644
+index 9e9f786b6fd3441000d9cdb0b582f817b73ad814..8f86652520a433c94e34fc0e35dc8aad4a86faa2 100644
--- a/browser/components/urlbar/UrlbarUtils.sys.mjs
+++ b/browser/components/urlbar/UrlbarUtils.sys.mjs
-@@ -81,6 +81,7 @@ export var UrlbarUtils = {
+@@ -84,6 +84,7 @@ export var UrlbarUtils = {
RESTRICT_SEARCH_KEYWORD: "restrictSearchKeyword",
SUGGESTED_INDEX: "suggestedIndex",
TAIL_SUGGESTION: "tailSuggestion",
@@ -10,7 +10,7 @@ index caceb63a04fe282d7c906e27a6a2cfebc1ec8cda..74e395e649dd2cbe84683cb583d641b5
}),
// Defines provider types.
-@@ -140,6 +141,7 @@ export var UrlbarUtils = {
+@@ -145,6 +146,7 @@ export var UrlbarUtils = {
OTHER_NETWORK: 6,
ADDON: 7,
ACTIONS: 8,
@@ -18,7 +18,7 @@ index caceb63a04fe282d7c906e27a6a2cfebc1ec8cda..74e395e649dd2cbe84683cb583d641b5
}),
// Per-result exposure telemetry.
-@@ -561,6 +563,8 @@ export var UrlbarUtils = {
+@@ -585,6 +587,8 @@ export var UrlbarUtils = {
return this.RESULT_GROUP.HEURISTIC_FALLBACK;
case "UrlbarProviderHistoryUrlHeuristic":
return this.RESULT_GROUP.HEURISTIC_HISTORY_URL;
diff --git a/src/browser/components/urlbar/UrlbarValueFormatter-sys-mjs.patch b/src/browser/components/urlbar/UrlbarValueFormatter-sys-mjs.patch
index 7b9e100f1..469665532 100644
--- a/src/browser/components/urlbar/UrlbarValueFormatter-sys-mjs.patch
+++ b/src/browser/components/urlbar/UrlbarValueFormatter-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/urlbar/UrlbarValueFormatter.sys.mjs b/browser/components/urlbar/UrlbarValueFormatter.sys.mjs
-index 3a8c233dd1e05c070e497ec9877e65b9d8a3e87b..dd2a7aac6945331a3a50a0d7f6d62aeda396b560 100644
+index f28d277764158566bc9406ce0e6160d92d346a63..82dd5f8568ec1b12e87676e5c2b243824628b5af 100644
--- a/browser/components/urlbar/UrlbarValueFormatter.sys.mjs
+++ b/browser/components/urlbar/UrlbarValueFormatter.sys.mjs
-@@ -76,7 +76,7 @@ export class UrlbarValueFormatter {
+@@ -77,7 +77,7 @@ export class UrlbarValueFormatter {
if (this.#updateInstance != instance) {
return;
}
@@ -11,7 +11,7 @@ index 3a8c233dd1e05c070e497ec9877e65b9d8a3e87b..dd2a7aac6945331a3a50a0d7f6d62aed
});
}
-@@ -370,7 +370,7 @@ export class UrlbarValueFormatter {
+@@ -371,7 +371,7 @@ export class UrlbarValueFormatter {
* @returns {boolean}
* True if formatting was applied and false if not.
*/
@@ -20,7 +20,7 @@ index 3a8c233dd1e05c070e497ec9877e65b9d8a3e87b..dd2a7aac6945331a3a50a0d7f6d62aed
let urlMetaData = this.#getUrlMetaData();
if (!urlMetaData) {
return false;
-@@ -639,6 +639,7 @@ export class UrlbarValueFormatter {
+@@ -640,6 +640,7 @@ export class UrlbarValueFormatter {
this.#window.requestAnimationFrame(() => {
if (instance == this.#resizeInstance) {
this.#ensureFormattedHostVisible();
diff --git a/src/browser/extensions/newtab/lib/ActivityStream-sys-mjs.patch b/src/browser/extensions/newtab/lib/ActivityStream-sys-mjs.patch
index 2bbef690d..b6ddba914 100644
--- a/src/browser/extensions/newtab/lib/ActivityStream-sys-mjs.patch
+++ b/src/browser/extensions/newtab/lib/ActivityStream-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/extensions/newtab/lib/ActivityStream.sys.mjs b/browser/extensions/newtab/lib/ActivityStream.sys.mjs
-index 5e182ead8a17ef2e8e3e1701fe227f279d0506ff..7fc7cba4152c2682dd8ef90c35ab1a3a92e04529 100644
+index 8bb36697cca3761dc98d8be9d8ee954fdff3ce3d..bd40d251eeeff2b61fdd1d2170947d071b8f0872 100644
--- a/browser/extensions/newtab/lib/ActivityStream.sys.mjs
+++ b/browser/extensions/newtab/lib/ActivityStream.sys.mjs
-@@ -288,7 +288,7 @@ export const PREFS_CONFIG = new Map([
+@@ -289,7 +289,7 @@ export const PREFS_CONFIG = new Map([
"showSponsoredTopSites",
{
title: "Show sponsored top sites",
diff --git a/src/browser/installer/package-manifest-in.patch b/src/browser/installer/package-manifest-in.patch
index 65ccef529..3aec7d9df 100644
--- a/src/browser/installer/package-manifest-in.patch
+++ b/src/browser/installer/package-manifest-in.patch
@@ -1,8 +1,8 @@
diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
-index dbfb287747ed9059cfb46838800421ac9ffe78c1..47279559a7dbea8b08bafb75e968f7b219e1d818 100644
+index 36eafe35063f02fe3d4acaab24a08dc1b7b0ae24..951889b156498f66118d67d4245aca649e27a3a2 100644
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
-@@ -374,17 +374,17 @@ bin/libfreebl_64int_3.so
+@@ -378,17 +378,17 @@ bin/libfreebl_64int_3.so
; [MaintenanceService]
;
#ifdef MOZ_MAINTENANCE_SERVICE
diff --git a/src/browser/installer/windows/msix/AppxManifest-xml-in.patch b/src/browser/installer/windows/msix/AppxManifest-xml-in.patch
deleted file mode 100644
index 1c638f2df..000000000
--- a/src/browser/installer/windows/msix/AppxManifest-xml-in.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff --git a/browser/installer/windows/msix/AppxManifest.xml.in b/browser/installer/windows/msix/AppxManifest.xml.in
-index b81a73518a183b7b1d178793886c66f44651058d..89690a4177229b70013bcf35ec1d805fff7e1b26 100644
---- a/browser/installer/windows/msix/AppxManifest.xml.in
-+++ b/browser/installer/windows/msix/AppxManifest.xml.in
-@@ -61,6 +61,7 @@
- .avif
- .htm
- .html
-+ .jxl
- .pdf
- .shtml
- .xht
diff --git a/src/browser/installer/windows/nsis/installer-nsi.patch b/src/browser/installer/windows/nsis/installer-nsi.patch
index 7a2c2f422..8aebadb7c 100644
--- a/src/browser/installer/windows/nsis/installer-nsi.patch
+++ b/src/browser/installer/windows/nsis/installer-nsi.patch
@@ -1,8 +1,8 @@
diff --git a/browser/installer/windows/nsis/installer.nsi b/browser/installer/windows/nsis/installer.nsi
-index 74bfc36cb6e370b7dbf9fff6697a469c207f10d6..c5cdc832a430752340b33655d010c0348183b601 100755
+index f752555d18b0c6c7325cc99e73a85819fc015f5c..2416d2a79ca358ab901103d9546bc3d0454333eb 100755
--- a/browser/installer/windows/nsis/installer.nsi
+++ b/browser/installer/windows/nsis/installer.nsi
-@@ -836,7 +836,7 @@ Section "-InstallEndCleanup"
+@@ -842,7 +842,7 @@ Section "-InstallEndCleanup"
; When we're using the GUI, .onGUIEnd sends the ping, but of course that isn't
; invoked when we're running silently.
${If} ${Silent}
@@ -11,7 +11,7 @@ index 74bfc36cb6e370b7dbf9fff6697a469c207f10d6..c5cdc832a430752340b33655d010c034
${EndIf}
SectionEnd
-@@ -1964,5 +1964,5 @@ FunctionEnd
+@@ -1984,5 +1984,5 @@ FunctionEnd
Function .onGUIEnd
${OnEndCommon}
diff --git a/src/browser/installer/windows/nsis/shared-nsh.patch b/src/browser/installer/windows/nsis/shared-nsh.patch
deleted file mode 100644
index 09a2396f0..000000000
--- a/src/browser/installer/windows/nsis/shared-nsh.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-diff --git a/browser/installer/windows/nsis/shared.nsh b/browser/installer/windows/nsis/shared.nsh
-old mode 100755
-new mode 100644
-index bc8f5775785e08a0cc1c8a6ad1f0e19e980c607d..bf11d30d10fb38855f6a0e8d5346be271042769e
---- a/browser/installer/windows/nsis/shared.nsh
-+++ b/browser/installer/windows/nsis/shared.nsh
-@@ -513,6 +513,7 @@ ${RemoveDefaultBrowserAgentShortcut}
- ${AddAssociationIfNoneExist} ".svg" "FirefoxHTML$5"
- ${AddAssociationIfNoneExist} ".webp" "FirefoxHTML$5"
- ${AddAssociationIfNoneExist} ".avif" "FirefoxHTML$5"
-+ ${AddAssociationIfNoneExist} ".jxl" "FirefoxHTML$5"
-
- ${AddAssociationIfNoneExist} ".pdf" "FirefoxPDF$5"
-
-@@ -609,6 +610,7 @@ ${RemoveDefaultBrowserAgentShortcut}
- WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".svg" "FirefoxHTML$2"
- WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".webp" "FirefoxHTML$2"
- WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".avif" "FirefoxHTML$2"
-+ WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".jxl" "FirefoxHTML$2"
-
- WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".pdf" "FirefoxPDF$2"
-
-@@ -681,6 +683,7 @@ ${RemoveDefaultBrowserAgentShortcut}
- ${WriteApplicationsSupportedType} ${RegKey} ".webm"
- ${WriteApplicationsSupportedType} ${RegKey} ".webp"
- ${WriteApplicationsSupportedType} ${RegKey} ".avif"
-+ ${WriteApplicationsSupportedType} ${RegKey} ".jxl"
- ${WriteApplicationsSupportedType} ${RegKey} ".xht"
- ${WriteApplicationsSupportedType} ${RegKey} ".xhtml"
- ${WriteApplicationsSupportedType} ${RegKey} ".xml"
-@@ -1727,6 +1730,8 @@ Function SetAsDefaultAppUserHKCU
- Pop $0
- AppAssocReg::SetAppAsDefault "$R9" ".avif" "file"
- Pop $0
-+ AppAssocReg::SetAppAsDefault "$R9" ".jxl" "file"
-+ Pop $0
- AppAssocReg::SetAppAsDefault "$R9" ".xht" "file"
- Pop $0
- AppAssocReg::SetAppAsDefault "$R9" ".xhtml" "file"
-@@ -1856,7 +1861,7 @@ FunctionEnd
- ; uninstalled.
-
- ; Do all of that twice, once for the local machine and once for the current user
--
-+
- ; Remove protocol handlers
- ClearErrors
- ReadRegStr $0 HKLM "Software\Classes\${_PROTOCOL}\DefaultIcon" ""
diff --git a/src/browser/installer/windows/nsis/uninstaller-nsi.patch b/src/browser/installer/windows/nsis/uninstaller-nsi.patch
index 55290f036..a3cfc3b60 100644
--- a/src/browser/installer/windows/nsis/uninstaller-nsi.patch
+++ b/src/browser/installer/windows/nsis/uninstaller-nsi.patch
@@ -1,10 +1,10 @@
diff --git a/browser/installer/windows/nsis/uninstaller.nsi b/browser/installer/windows/nsis/uninstaller.nsi
old mode 100755
new mode 100644
-index 4eecccea6e053073fafad35cc97b326f7d0f5162..e4d077415294d456539637868144331ea9a46753
+index a193a94e4893a8b07111d83ebdd2a6488a98be7a..ab7d84abbf6d9442cbc299194c4ffb74c5785723
--- a/browser/installer/windows/nsis/uninstaller.nsi
+++ b/browser/installer/windows/nsis/uninstaller.nsi
-@@ -514,6 +514,7 @@ Section "Uninstall"
+@@ -515,6 +515,7 @@ Section "Uninstall"
${un.RegCleanFileHandler} ".svg" "FirefoxHTML-$AppUserModelID"
${un.RegCleanFileHandler} ".webp" "FirefoxHTML-$AppUserModelID"
${un.RegCleanFileHandler} ".avif" "FirefoxHTML-$AppUserModelID"
diff --git a/src/browser/modules/BrowserWindowTracker-sys-mjs.patch b/src/browser/modules/BrowserWindowTracker-sys-mjs.patch
index 684a52ad5..bd6f5cd91 100644
--- a/src/browser/modules/BrowserWindowTracker-sys-mjs.patch
+++ b/src/browser/modules/BrowserWindowTracker-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/modules/BrowserWindowTracker.sys.mjs b/browser/modules/BrowserWindowTracker.sys.mjs
-index 0f2f66e4bbc27785d53e262001f2ad7f9a1b3216..ed8b600fd2093428e01489d7dc4aa1f5365b645e 100644
+index 9aecab66d8f23fac9f16cea2120a5fe903ae1122..692f2bfe3899a58925789503a6bb2a547cdbf7f3 100644
--- a/browser/modules/BrowserWindowTracker.sys.mjs
+++ b/browser/modules/BrowserWindowTracker.sys.mjs
-@@ -331,6 +331,7 @@ export const BrowserWindowTracker = {
+@@ -330,6 +330,7 @@ export const BrowserWindowTracker = {
args = null,
remote = undefined,
fission = undefined,
@@ -10,7 +10,7 @@ index 0f2f66e4bbc27785d53e262001f2ad7f9a1b3216..ed8b600fd2093428e01489d7dc4aa1f5
} = options;
args = lazy.AIWindow.handleAIWindowOptions(options);
-@@ -390,6 +391,12 @@ export const BrowserWindowTracker = {
+@@ -386,6 +387,12 @@ export const BrowserWindowTracker = {
windowFeatures,
args
);
diff --git a/src/browser/modules/ExtensionsUI-sys-mjs.patch b/src/browser/modules/ExtensionsUI-sys-mjs.patch
index 736ae6904..0fe9f96f4 100644
--- a/src/browser/modules/ExtensionsUI-sys-mjs.patch
+++ b/src/browser/modules/ExtensionsUI-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/modules/ExtensionsUI.sys.mjs b/browser/modules/ExtensionsUI.sys.mjs
-index 31229b3bc1b93565a57c2c0b0307ceeb594c3936..30456ef5d3c58e96717cd292f861a04a790d0ee1 100644
+index 5251697341bf94f3ca6c877d87a6fe5f4debf03a..71d9247a669cea2135e6f0b76b2c10a869bf35bc 100644
--- a/browser/modules/ExtensionsUI.sys.mjs
+++ b/browser/modules/ExtensionsUI.sys.mjs
-@@ -480,7 +480,7 @@ export var ExtensionsUI = {
+@@ -500,7 +500,7 @@ export var ExtensionsUI = {
eventCallback,
removeOnDismissal: true,
popupOptions: {
diff --git a/src/browser/modules/URILoadingHelper-sys-mjs.patch b/src/browser/modules/URILoadingHelper-sys-mjs.patch
index 1495f6529..3ca4a6103 100644
--- a/src/browser/modules/URILoadingHelper-sys-mjs.patch
+++ b/src/browser/modules/URILoadingHelper-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/modules/URILoadingHelper.sys.mjs b/browser/modules/URILoadingHelper.sys.mjs
-index 9175fa820ad6bb75cd125fbfda2bf07d6dba4c90..62a1a62f304ec8c83e859196861025347e79ba46 100644
+index a005dbdf84609622ef8054f73f78c0c290e76125..d5bf6fb51c9af5e60f69a73612ee91598080730a 100644
--- a/browser/modules/URILoadingHelper.sys.mjs
+++ b/browser/modules/URILoadingHelper.sys.mjs
-@@ -225,6 +225,7 @@ function openInWindow(url, params, sourceWindow) {
+@@ -224,6 +224,7 @@ function openInWindow(url, params, sourceWindow) {
features,
sa
);
@@ -10,7 +10,7 @@ index 9175fa820ad6bb75cd125fbfda2bf07d6dba4c90..62a1a62f304ec8c83e85919686102534
}
function openInCurrentTab(targetBrowser, url, uriObj, params) {
-@@ -542,7 +543,7 @@ export const URILoadingHelper = {
+@@ -541,7 +542,7 @@ export const URILoadingHelper = {
// page. If a load request bounces off for the currently selected tab,
// we'll open a new tab instead.
let tab = w.gBrowser.getTabForBrowser(targetBrowser);
@@ -19,7 +19,7 @@ index 9175fa820ad6bb75cd125fbfda2bf07d6dba4c90..62a1a62f304ec8c83e85919686102534
where = "tab";
targetBrowser = null;
} else if (
-@@ -972,7 +973,7 @@ export const URILoadingHelper = {
+@@ -974,7 +975,7 @@ export const URILoadingHelper = {
ignoreQueryString || replaceQueryString,
ignoreFragmentWhenComparing
);
@@ -28,12 +28,12 @@ index 9175fa820ad6bb75cd125fbfda2bf07d6dba4c90..62a1a62f304ec8c83e85919686102534
for (let i = 0; i < browsers.length; i++) {
let browser = browsers[i];
let browserCompare = cleanURL(
-@@ -1018,7 +1019,7 @@ export const URILoadingHelper = {
+@@ -1030,7 +1031,7 @@ export const URILoadingHelper = {
+ );
+ aSplitView.ownerGlobal.focus();
+ } else {
+- aWindow.gBrowser.tabContainer.selectedIndex = i;
++ aWindow.gZenWorkspaces.switchIfNeeded(browser);
+ }
}
- if (!doAdopt) {
-- aWindow.gBrowser.tabContainer.selectedIndex = i;
-+ aWindow.gZenWorkspaces.switchIfNeeded(browser);
- }
-
- return true;
diff --git a/src/browser/themes/linux/browser-css.patch b/src/browser/themes/linux/browser-css.patch
index 5e3848d3c..014369b38 100644
--- a/src/browser/themes/linux/browser-css.patch
+++ b/src/browser/themes/linux/browser-css.patch
@@ -1,5 +1,5 @@
diff --git a/browser/themes/linux/browser.css b/browser/themes/linux/browser.css
-index e6ef8578b460282eeb473f78c71addc43192e228..2c7418f6eb416a58166287e2c6a37c22ee12d6ea 100644
+index dfb3e2c843d748e46c0f5878c9d06cebacffb603..4805a0bed7e60713218530c1b03f0f5dd65fe3af 100644
--- a/browser/themes/linux/browser.css
+++ b/browser/themes/linux/browser.css
@@ -14,7 +14,6 @@
diff --git a/src/browser/themes/osx/browser-css.patch b/src/browser/themes/osx/browser-css.patch
index 9dbafc524..a716c81ea 100644
--- a/src/browser/themes/osx/browser-css.patch
+++ b/src/browser/themes/osx/browser-css.patch
@@ -1,5 +1,5 @@
diff --git a/browser/themes/osx/browser.css b/browser/themes/osx/browser.css
-index 79f62b14809196e6ac073b8e560331e96be5d990..dcec04606e78c66673fb602b6a986321d20e1d4c 100644
+index 8fe643be3f60da00760775c918ba3228fbd2b610..d634c09685065b4096a74a93e0373e4942fd2a29 100644
--- a/browser/themes/osx/browser.css
+++ b/browser/themes/osx/browser.css
@@ -37,7 +37,7 @@
diff --git a/src/browser/themes/shared/browser-shared-css.patch b/src/browser/themes/shared/browser-shared-css.patch
index 69689e09c..f0c494b61 100644
--- a/src/browser/themes/shared/browser-shared-css.patch
+++ b/src/browser/themes/shared/browser-shared-css.patch
@@ -1,17 +1,8 @@
diff --git a/browser/themes/shared/browser-shared.css b/browser/themes/shared/browser-shared.css
-index aceda010e08cd20dcfb5eb2e6f253314ea087849..9b0b4af4fded24be573d59b62b9905d15e1e2dd6 100644
+index 4e7ca6259c92da2c45c6ea3157863b971fbd6201..15da124b3e10da664bc0ba3a63cd02b33e31337c 100644
--- a/browser/themes/shared/browser-shared.css
+++ b/browser/themes/shared/browser-shared.css
-@@ -104,7 +104,7 @@ body {
- --toolbarbutton-border-radius: var(--button-border-radius);
- --identity-box-margin-inline: 4px;
- --urlbar-min-height: max(32px, 1.4em);
-- --urlbar-icon-padding: calc((var(--urlbar-min-height) - 2px /* border */ - 2px /* padding */ - 16px /* icon */) / 2);
-+ --urlbar-icon-padding: calc((var(--urlbar-min-height) - 2px /* border */ - 14px /* icon */) / 2);
-
- /* This should be used for icons and chiclets inside the input field, as well
- as result rows. It makes the gap around them more uniform when they are
-@@ -173,8 +173,6 @@ body {
+@@ -155,8 +155,6 @@ body {
*/
&.fullscreen-with-menubar {
z-index: var(--browser-area-z-index-toolbox-while-animating);
@@ -20,7 +11,7 @@ index aceda010e08cd20dcfb5eb2e6f253314ea087849..9b0b4af4fded24be573d59b62b9905d1
}
/* Themes define a set of toolbox foreground and background colors which we
-@@ -283,13 +281,13 @@ body {
+@@ -265,13 +263,13 @@ body {
@media (-moz-platform: macos) and (not (-moz-mac-rtl)) {
&:-moz-locale-dir(ltr) {
diff --git a/src/browser/themes/shared/identity-block/identity-block-css.patch b/src/browser/themes/shared/identity-block/identity-block-css.patch
index 8244a2580..0864e98da 100644
--- a/src/browser/themes/shared/identity-block/identity-block-css.patch
+++ b/src/browser/themes/shared/identity-block/identity-block-css.patch
@@ -1,5 +1,5 @@
diff --git a/browser/themes/shared/identity-block/identity-block.css b/browser/themes/shared/identity-block/identity-block.css
-index 3996a050162f4baa3a3ed3d09bc6b7bd0c3a1404..ba432205acde344dfec9f98333df2d4dd85c14ba 100644
+index c867b8602c5b3bdce335b932a3a1cd0c538e4ad6..2dc1cf17603bcdd9b8d81a6f46ed8b6ed75b2763 100644
--- a/browser/themes/shared/identity-block/identity-block.css
+++ b/browser/themes/shared/identity-block/identity-block.css
@@ -7,7 +7,7 @@
diff --git a/src/browser/themes/shared/jar-inc-mn.patch b/src/browser/themes/shared/jar-inc-mn.patch
index 57dbbe246..c04fd6d25 100644
--- a/src/browser/themes/shared/jar-inc-mn.patch
+++ b/src/browser/themes/shared/jar-inc-mn.patch
@@ -1,8 +1,8 @@
diff --git a/browser/themes/shared/jar.inc.mn b/browser/themes/shared/jar.inc.mn
-index ccae208d64af19d15b85f72a4a38ea95448ed9e9..5c184a33c1d3416d9c16e3edf1353174aea3ed03 100644
+index 94de6f280e709161a54a65ffb621256b4e4e86fa..a882ce63c47e7757a9cd3b5bda7da792c5c3b616 100644
--- a/browser/themes/shared/jar.inc.mn
+++ b/browser/themes/shared/jar.inc.mn
-@@ -328,3 +328,5 @@
+@@ -331,3 +331,5 @@
skin/classic/browser/illustrations/market-opt-in.svg (../shared/illustrations/market-opt-in.svg)
skin/classic/browser/illustrations/yelpRealtime-opt-in.svg (../shared/illustrations/yelpRealtime-opt-in.svg)
diff --git a/src/browser/themes/shared/preferences/zen-preferences.css b/src/browser/themes/shared/preferences/zen-preferences.css
index 2e80b92fa..bae330acc 100644
--- a/src/browser/themes/shared/preferences/zen-preferences.css
+++ b/src/browser/themes/shared/preferences/zen-preferences.css
@@ -504,7 +504,8 @@ groupbox h2 {
#setting-control-sidebarChatbotFieldset,
#aiControlsDescription,
#category-ai-features,
-.mission-message {
+.mission-message,
+html|setting-group[data-subcategory="layout"] {
display: none !important;
}
diff --git a/src/browser/themes/shared/tabbrowser/content-area-css.patch b/src/browser/themes/shared/tabbrowser/content-area-css.patch
index 51c5f74a2..569299c80 100644
--- a/src/browser/themes/shared/tabbrowser/content-area-css.patch
+++ b/src/browser/themes/shared/tabbrowser/content-area-css.patch
@@ -1,5 +1,5 @@
diff --git a/browser/themes/shared/tabbrowser/content-area.css b/browser/themes/shared/tabbrowser/content-area.css
-index 7fbe572527a702f35434ad73ad6cda41c5c082c0..ccf7c8c5f408cec50e562a9821767ea3e22b7e3c 100644
+index f01e484caadedbd7094a09c93dbd6f578261f24b..84e682e52f38c41fdaad1aea2f9468ce7040cc9d 100644
--- a/browser/themes/shared/tabbrowser/content-area.css
+++ b/browser/themes/shared/tabbrowser/content-area.css
@@ -89,7 +89,6 @@
@@ -17,8 +17,8 @@ index 7fbe572527a702f35434ad73ad6cda41c5c082c0..ccf7c8c5f408cec50e562a9821767ea3
- opacity: 0;
}
- browser[type="content"] {
-@@ -423,7 +421,7 @@ split-view-footer {
+ /* Exclude browsers with smartwindow-content attribute which inherit
+@@ -431,7 +429,7 @@ split-view-footer {
.dialogStack {
z-index: var(--browser-stack-z-index-dialog-stack);
@@ -27,7 +27,7 @@ index 7fbe572527a702f35434ad73ad6cda41c5c082c0..ccf7c8c5f408cec50e562a9821767ea3
inset: 0;
/* --browser-with-dialog set on browser[tabDialogShowing], we want to position the overlay
only on the top of the element so it doesn't overlap the DevTools toolbox */
-@@ -590,7 +588,7 @@ split-view-footer {
+@@ -598,7 +596,7 @@ split-view-footer {
.dialogOverlay[topmost="true"],
#window-modal-dialog::backdrop {
diff --git a/src/browser/themes/shared/tabbrowser/tabs-css.patch b/src/browser/themes/shared/tabbrowser/tabs-css.patch
index a2ce72726..e2e0bcd83 100644
--- a/src/browser/themes/shared/tabbrowser/tabs-css.patch
+++ b/src/browser/themes/shared/tabbrowser/tabs-css.patch
@@ -1,8 +1,8 @@
diff --git a/browser/themes/shared/tabbrowser/tabs.css b/browser/themes/shared/tabbrowser/tabs.css
-index dff30e3f3f800e3fb499aa84450d3571e705820f..57a97e8955f3a6c9b0b8b6a9a15addd343204691 100644
+index fc1e0870696fb5866663cdab0fc96faff0d5a3f8..2430d7afd4761c66cd5ad05a7f26200143299425 100644
--- a/browser/themes/shared/tabbrowser/tabs.css
+++ b/browser/themes/shared/tabbrowser/tabs.css
-@@ -21,7 +21,7 @@
+@@ -24,7 +24,7 @@
--tab-group-line-thickness: 2px;
--tab-group-line-toolbar-border-distance: 1px;
/* Collapsed tabs should be square, so set width to match the min height */
@@ -11,7 +11,7 @@ index dff30e3f3f800e3fb499aa84450d3571e705820f..57a97e8955f3a6c9b0b8b6a9a15addd3
--tab-collapsed-width: calc(var(--tab-collapsed-background-width) + 2 * var(--tab-inner-inline-margin));
--tab-inner-inline-margin: var(--space-medium);
--tab-inline-padding: 8px;
-@@ -35,9 +35,9 @@
+@@ -38,9 +38,9 @@
--tab-block-margin: 4px;
--tab-icon-end-margin: 5.5px;
--tab-label-line-height: 1.7;
@@ -23,7 +23,7 @@ index dff30e3f3f800e3fb499aa84450d3571e705820f..57a97e8955f3a6c9b0b8b6a9a15addd3
--tab-selected-bgcolor: var(--toolbar-bgcolor);
--tab-selected-color-scheme: var(--toolbar-color-scheme);
&[lwt-tab-selected="light"] {
-@@ -294,7 +294,6 @@ tab-split-view-wrapper[dragtarget] {
+@@ -298,7 +298,6 @@ tab-split-view-wrapper[dragtarget] {
}
:root:not([uidensity="compact"], [sidebar-expand-on-hover]) &[pinned] {
@@ -31,7 +31,7 @@ index dff30e3f3f800e3fb499aa84450d3571e705820f..57a97e8955f3a6c9b0b8b6a9a15addd3
}
&:is([selected], [multiselected]) {
-@@ -308,6 +307,7 @@ tab-split-view-wrapper[dragtarget] {
+@@ -312,6 +311,7 @@ tab-split-view-wrapper[dragtarget] {
border-radius: inherit;
position: relative;
overflow: hidden;
@@ -39,7 +39,7 @@ index dff30e3f3f800e3fb499aa84450d3571e705820f..57a97e8955f3a6c9b0b8b6a9a15addd3
&::before {
position: absolute;
-@@ -507,10 +507,6 @@ tab-split-view-wrapper[dragtarget] {
+@@ -511,10 +511,6 @@ tab-split-view-wrapper[dragtarget] {
/* stylelint-disable-next-line media-query-no-invalid */
@media -moz-pref("browser.tabs.fadeOutUnloadedTabs") {
&[pending] {
@@ -50,7 +50,7 @@ index dff30e3f3f800e3fb499aa84450d3571e705820f..57a97e8955f3a6c9b0b8b6a9a15addd3
opacity: 0.5;
/* Fade the favicon out */
transition-property: filter, opacity;
-@@ -527,10 +523,6 @@ tab-split-view-wrapper[dragtarget] {
+@@ -531,10 +527,6 @@ tab-split-view-wrapper[dragtarget] {
/* stylelint-disable-next-line media-query-no-invalid */
@media -moz-pref("browser.tabs.fadeOutExplicitlyUnloadedTabs") {
&[pending][discarded] {
@@ -61,7 +61,7 @@ index dff30e3f3f800e3fb499aa84450d3571e705820f..57a97e8955f3a6c9b0b8b6a9a15addd3
opacity: 0.5;
/* Fade the favicon out */
transition-property: filter, opacity;
-@@ -599,7 +591,7 @@ tab-split-view-wrapper[dragtarget] {
+@@ -603,7 +595,7 @@ tab-split-view-wrapper[dragtarget] {
z-index: 1; /* Overlay tab title */
#tabbrowser-tabs[orient="vertical"] & {
@@ -70,7 +70,7 @@ index dff30e3f3f800e3fb499aa84450d3571e705820f..57a97e8955f3a6c9b0b8b6a9a15addd3
}
&[crashed] {
-@@ -607,7 +599,7 @@ tab-split-view-wrapper[dragtarget] {
+@@ -611,7 +603,7 @@ tab-split-view-wrapper[dragtarget] {
}
#tabbrowser-tabs[orient="vertical"]:not([expanded]) &:not([crashed]),
@@ -79,7 +79,7 @@ index dff30e3f3f800e3fb499aa84450d3571e705820f..57a97e8955f3a6c9b0b8b6a9a15addd3
&[soundplaying] {
list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio-playing-small.svg");
}
-@@ -664,7 +656,7 @@ tab-split-view-wrapper[dragtarget] {
+@@ -668,7 +660,7 @@ tab-split-view-wrapper[dragtarget] {
}
}
@@ -88,7 +88,7 @@ index dff30e3f3f800e3fb499aa84450d3571e705820f..57a97e8955f3a6c9b0b8b6a9a15addd3
&[crashed] {
display: revert;
}
-@@ -831,7 +823,7 @@ tab-split-view-wrapper[dragtarget] {
+@@ -835,7 +827,7 @@ tab-split-view-wrapper[dragtarget] {
has not been added to root. There are certain scenarios when that attribute is temporarily
removed from root such as when toggling the sidebar to expand with the toolbar button. */
#tabbrowser-tabs[orient="horizontal"] &:not([pinned]):not([crashed]),
@@ -97,7 +97,7 @@ index dff30e3f3f800e3fb499aa84450d3571e705820f..57a97e8955f3a6c9b0b8b6a9a15addd3
&:is([soundplaying], [muted], [activemedia-blocked]) {
display: flex;
}
-@@ -1529,7 +1521,7 @@ tab-group {
+@@ -1562,7 +1554,7 @@ tab-group {
}
#tabbrowser-tabs[orient="vertical"][expanded] {
@@ -106,7 +106,7 @@ index dff30e3f3f800e3fb499aa84450d3571e705820f..57a97e8955f3a6c9b0b8b6a9a15addd3
&[movingtab][movingtab-addToGroup]:not([movingtab-group], [movingtab-ungroup]) .tabbrowser-tab:is(:active, [multiselected]) {
margin-inline-start: var(--space-medium);
}
-@@ -2036,7 +2028,7 @@ tab-group {
+@@ -2057,7 +2049,7 @@ tab-group {
}
}
@@ -115,7 +115,7 @@ index dff30e3f3f800e3fb499aa84450d3571e705820f..57a97e8955f3a6c9b0b8b6a9a15addd3
#vertical-tabs-newtab-button {
appearance: none;
min-height: var(--tab-min-height);
-@@ -2047,7 +2039,7 @@ tab-group {
+@@ -2068,7 +2060,7 @@ tab-group {
margin-inline: var(--tab-inner-inline-margin);
#tabbrowser-tabs[orient="vertical"]:not([expanded]) & > .toolbarbutton-text {
@@ -124,7 +124,7 @@ index dff30e3f3f800e3fb499aa84450d3571e705820f..57a97e8955f3a6c9b0b8b6a9a15addd3
}
&:hover {
-@@ -2071,7 +2063,7 @@ tab-group {
+@@ -2092,7 +2084,7 @@ tab-group {
* flex container. #tabs-newtab-button is a child of the arrowscrollbox where
* we don't want a gap (between tabs), so we have to add some margin.
*/
@@ -133,7 +133,7 @@ index dff30e3f3f800e3fb499aa84450d3571e705820f..57a97e8955f3a6c9b0b8b6a9a15addd3
margin-block: var(--tab-block-margin);
}
-@@ -2259,7 +2251,6 @@ tab-group {
+@@ -2280,7 +2272,6 @@ tab-group {
&:not([expanded]) {
.tabbrowser-tab[pinned] {
@@ -141,7 +141,7 @@ index dff30e3f3f800e3fb499aa84450d3571e705820f..57a97e8955f3a6c9b0b8b6a9a15addd3
}
.tab-background {
-@@ -2299,8 +2290,8 @@ tab-group {
+@@ -2320,8 +2311,8 @@ tab-group {
display: block;
position: absolute;
inset: auto;
@@ -152,7 +152,7 @@ index dff30e3f3f800e3fb499aa84450d3571e705820f..57a97e8955f3a6c9b0b8b6a9a15addd3
&:-moz-window-inactive {
background-image:
-@@ -2385,9 +2376,6 @@ tab-group {
+@@ -2406,9 +2397,6 @@ tab-group {
:root:not([privatebrowsingmode]) :is(toolbarbutton, toolbarpaletteitem) ~ #tabbrowser-tabs,
:root[privatebrowsingmode] :is(toolbarbutton:not(#firefox-view-button), toolbarpaletteitem:not(#wrapper-firefox-view-button)) ~ #tabbrowser-tabs {
@@ -162,7 +162,7 @@ index dff30e3f3f800e3fb499aa84450d3571e705820f..57a97e8955f3a6c9b0b8b6a9a15addd3
}
:root[privatebrowsingmode] :is(#firefox-view-button, #menu_openFirefoxView) {
-@@ -2419,7 +2407,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button {
+@@ -2440,7 +2428,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button {
list-style-image: url(chrome://global/skin/icons/plus.svg);
}
diff --git a/src/browser/themes/shared/toolbarbuttons-css.patch b/src/browser/themes/shared/toolbarbuttons-css.patch
index 4eb221d15..4fb315a5f 100644
--- a/src/browser/themes/shared/toolbarbuttons-css.patch
+++ b/src/browser/themes/shared/toolbarbuttons-css.patch
@@ -1,29 +1,29 @@
diff --git a/browser/themes/shared/toolbarbuttons.css b/browser/themes/shared/toolbarbuttons.css
-index f681decf193605b633f1cffa493ac3b000b542bd..21ee9ce2594308aba0ae6d86e4f82bef6ef95b6d 100644
+index 08e7ff0d00f2f41b0ca253a6a895d5111d65668e..9b24e9f386edb881b95de75776e46a4d5e40c4cd 100644
--- a/browser/themes/shared/toolbarbuttons.css
+++ b/browser/themes/shared/toolbarbuttons.css
-@@ -44,20 +44,6 @@
- --toolbarbutton-inner-padding: 9px;
+@@ -13,20 +13,6 @@
+ --toolbarbutton-inner-padding: var(--toolbarbutton-inner-padding-touch);
--bookmark-block-padding: 7px;
}
- @media (width <= 900px) {
-- --toolbarbutton-outer-padding: 1px;
+- --toolbarbutton-outer-padding: var(--toolbarbutton-outer-padding-narrow);
- }
- @media (width <= 800px) {
-- --toolbarbutton-inner-padding: 7px;
+- --toolbarbutton-inner-padding: var(--toolbarbutton-inner-padding-narrow);
- &:where([uidensity="touch"]) {
-- --toolbarbutton-inner-padding: 8px;
+- --toolbarbutton-inner-padding: var(--toolbarbutton-inner-padding-touch-narrow);
- }
- }
- /* 700px is just above half of the popular 1366px screen width, so two browser
- windows put next to each other will be below this threshold. */
- @media (width <= 700px) {
-- --toolbarbutton-inner-padding: 6px;
+- --toolbarbutton-inner-padding: var(--toolbarbutton-inner-padding-compact);
- }
&:where([uidensity="compact"]) {
- --toolbarbutton-inner-padding: 6px;
+ --toolbarbutton-inner-padding: var(--toolbarbutton-inner-padding-compact);
--bookmark-block-padding: 1px;
-@@ -67,9 +53,7 @@
+@@ -65,9 +51,7 @@
#TabsToolbar {
/* Override the inner padding to ensure the dimensions match the tabs, but also making sure
different types of buttons (combined-buttons-dropmarker or text) still look correct. */
@@ -33,7 +33,7 @@ index f681decf193605b633f1cffa493ac3b000b542bd..21ee9ce2594308aba0ae6d86e4f82bef
}
/* Primary toolbar buttons */
-@@ -148,8 +132,8 @@ toolbar .toolbarbutton-1 {
+@@ -146,8 +130,8 @@ toolbar .toolbarbutton-1 {
> .toolbarbutton-icon {
/* horizontal padding + actual icon width */
@@ -44,7 +44,7 @@ index f681decf193605b633f1cffa493ac3b000b542bd..21ee9ce2594308aba0ae6d86e4f82bef
}
> .toolbarbutton-text {
-@@ -159,7 +143,7 @@ toolbar .toolbarbutton-1 {
+@@ -157,7 +141,7 @@ toolbar .toolbarbutton-1 {
* height as the button icons and the same vertical padding, but as a minimum,
* because otherwise an increase in text sizes would break things.
*/
@@ -53,7 +53,7 @@ index f681decf193605b633f1cffa493ac3b000b542bd..21ee9ce2594308aba0ae6d86e4f82bef
@media (-moz-platform: macos) {
padding-top: calc(var(--toolbarbutton-inner-padding) + 1px);
-@@ -279,7 +263,7 @@ toolbar .toolbaritem-combined-buttons {
+@@ -277,7 +261,7 @@ toolbar .toolbaritem-combined-buttons {
#nav-bar-overflow-button {
list-style-image: url("chrome://global/skin/icons/chevron.svg");
@@ -62,7 +62,7 @@ index f681decf193605b633f1cffa493ac3b000b542bd..21ee9ce2594308aba0ae6d86e4f82bef
display: none;
}
-@@ -489,7 +473,7 @@ toolbarbutton.bookmark-item:not(.subviewbutton) {
+@@ -487,7 +471,7 @@ toolbarbutton.bookmark-item:not(.subviewbutton) {
*/
align-items: stretch;
> .toolbarbutton-icon {
diff --git a/src/browser/themes/shared/urlbar-searchbar-css.patch b/src/browser/themes/shared/urlbar-searchbar-css.patch
index b40b752d5..416f79f84 100644
--- a/src/browser/themes/shared/urlbar-searchbar-css.patch
+++ b/src/browser/themes/shared/urlbar-searchbar-css.patch
@@ -1,8 +1,8 @@
diff --git a/browser/themes/shared/urlbar-searchbar.css b/browser/themes/shared/urlbar-searchbar.css
-index 78a2c85af51f90958b445eac53a540b382163102..7509b28c6d868a6f1c34f36330e695c163e12788 100644
+index cbbf55f31ae5e456401172f79ddbbe41256025a4..8cab0f2809a43c0aa4249453732eb0e006c2c676 100644
--- a/browser/themes/shared/urlbar-searchbar.css
+++ b/browser/themes/shared/urlbar-searchbar.css
-@@ -9,7 +9,7 @@
+@@ -10,7 +10,7 @@
/* Usually we wouldn't need snapping border widths manually, but we use this
* for other layout calculations too */
--urlbar-container-border-width: max(env(hairline), round(down, 1px, env(hairline)));
@@ -11,7 +11,7 @@ index 78a2c85af51f90958b445eac53a540b382163102..7509b28c6d868a6f1c34f36330e695c1
--urlbar-container-border-padding: calc(var(--urlbar-container-border-width) + var(--urlbar-container-padding));
--urlbar-margin-inline: 5px;
--urlbar-padding-block: 4px;
-@@ -54,7 +54,7 @@ toolbar[inactive="true"] .urlbar,
+@@ -55,7 +55,7 @@ toolbar[inactive="true"] .urlbar,
.urlbar:not([usertyping]) > .urlbar-input-container > .urlbar-go-button,
.urlbar:not(#searchbar-new, [focused]) > .urlbar-input-container > .urlbar-go-button,
#urlbar-revert-button-container {
@@ -19,8 +19,8 @@ index 78a2c85af51f90958b445eac53a540b382163102..7509b28c6d868a6f1c34f36330e695c1
+ display: none !important;
}
- /* When rich suggestions are enabled the urlbar identity icon is given extra padding to
-@@ -325,10 +325,14 @@ toolbar[inactive="true"] .urlbar,
+ /* Document Picture-in-Picture API window */
+@@ -333,10 +333,14 @@ toolbar[inactive="true"] .urlbar,
.urlbar[breakout][breakout-extend] {
height: auto;
diff --git a/src/browser/themes/shared/urlbar-variables-css.patch b/src/browser/themes/shared/urlbar-variables-css.patch
new file mode 100644
index 000000000..7f41861f4
--- /dev/null
+++ b/src/browser/themes/shared/urlbar-variables-css.patch
@@ -0,0 +1,13 @@
+diff --git a/browser/themes/shared/urlbar-variables.css b/browser/themes/shared/urlbar-variables.css
+index 0710bcc11e8040750ff826e3d3551454fdad61c6..2be2fa3e386ad9d4296d73ee8814e09750382a0d 100644
+--- a/browser/themes/shared/urlbar-variables.css
++++ b/browser/themes/shared/urlbar-variables.css
+@@ -9,7 +9,7 @@
+ :root {
+ --identity-box-margin-inline: 4px;
+ --urlbar-min-height: max(32px, 1.4em);
+- --urlbar-icon-padding: calc((var(--urlbar-min-height) - 2px /* border */ - 2px /* padding */ - 16px /* icon */) / 2);
++ --urlbar-icon-padding: calc((var(--urlbar-min-height) - 2px /* border */ - 14px /* icon */) / 2);
+
+ /* This should be used for icons and chiclets inside the input field, as well
+ as result rows. It makes the gap around them more uniform when they are
diff --git a/src/browser/themes/shared/urlbarView-css.patch b/src/browser/themes/shared/urlbarView-css.patch
index 33269132c..4a115a94c 100644
--- a/src/browser/themes/shared/urlbarView-css.patch
+++ b/src/browser/themes/shared/urlbarView-css.patch
@@ -1,8 +1,8 @@
diff --git a/browser/themes/shared/urlbarView.css b/browser/themes/shared/urlbarView.css
-index 1af12e42c529481ff87539a84db20a1d6016d63a..7060711042a72c9df54c98ceb2c3ba3c850f9295 100644
+index 212f3dc956df418b838e568d0b0fed5c1e848914..0dea37660e44ed5f000638eddf2770ebce049a43 100644
--- a/browser/themes/shared/urlbarView.css
+++ b/browser/themes/shared/urlbarView.css
-@@ -20,7 +20,7 @@
+@@ -21,7 +21,7 @@
--urlbarView-small-font-size: 0.85em;
@@ -11,7 +11,7 @@ index 1af12e42c529481ff87539a84db20a1d6016d63a..7060711042a72c9df54c98ceb2c3ba3c
--urlbarView-row-gutter: 2px;
--urlbarView-item-inline-padding: var(--urlbar-icon-padding);
--urlbarView-item-block-padding: 6px;
-@@ -171,7 +171,6 @@
+@@ -172,7 +172,6 @@
min-height: 32px;
}
:root[uidensity="touch"] & {
diff --git a/src/docshell/base/nsAboutRedirector-cpp.patch b/src/docshell/base/nsAboutRedirector-cpp.patch
index c8bcd5300..4012d8890 100644
--- a/src/docshell/base/nsAboutRedirector-cpp.patch
+++ b/src/docshell/base/nsAboutRedirector-cpp.patch
@@ -1,5 +1,5 @@
diff --git a/docshell/base/nsAboutRedirector.cpp b/docshell/base/nsAboutRedirector.cpp
-index d6720d69cb123ab7cdc53671e49d27a8970d9607..b83748e2f6b5bb4623db709a6ac8803644c6d56a 100644
+index 6789b3d1d8ba3477c30da8b8dff54a659206c37f..a13b07368c8ea1b7510d55ac9e3dcae50f226158 100644
--- a/docshell/base/nsAboutRedirector.cpp
+++ b/docshell/base/nsAboutRedirector.cpp
@@ -117,7 +117,7 @@ static const RedirEntry kRedirMap[] = {
diff --git a/src/dom/base/Document-cpp.patch b/src/dom/base/Document-cpp.patch
index 937c85b42..665d7a948 100644
--- a/src/dom/base/Document-cpp.patch
+++ b/src/dom/base/Document-cpp.patch
@@ -1,8 +1,8 @@
diff --git a/dom/base/Document.cpp b/dom/base/Document.cpp
-index d9917d78b93d3200cbe15a1ee316cf01c0ad88de..4d7e4f9d57f0d121c717758ead06e554e01aea91 100644
+index b837e66d4fd5b6a96ad3d9c35f8e50e911cd168b..c35a395da59fc30d70b1e05b94db41b7136db0de 100644
--- a/dom/base/Document.cpp
+++ b/dom/base/Document.cpp
-@@ -462,6 +462,7 @@
+@@ -464,6 +464,7 @@
#include "prtime.h"
#include "prtypes.h"
#include "xpcpublic.h"
@@ -10,7 +10,7 @@ index d9917d78b93d3200cbe15a1ee316cf01c0ad88de..4d7e4f9d57f0d121c717758ead06e554
// clang-format off
#include "mozilla/Encoding.h"
-@@ -3327,6 +3328,10 @@ void Document::FillStyleSetUserAndUASheets() {
+@@ -3317,6 +3318,10 @@ void Document::FillStyleSetUserAndUASheets() {
for (StyleSheet* sheet : *sheetService->UserStyleSheets()) {
styleSet.AppendStyleSheet(*sheet);
}
diff --git a/src/dom/media/mediacontrol/MediaController-cpp.patch b/src/dom/media/mediacontrol/MediaController-cpp.patch
index 7c588afe2..937897290 100644
--- a/src/dom/media/mediacontrol/MediaController-cpp.patch
+++ b/src/dom/media/mediacontrol/MediaController-cpp.patch
@@ -1,5 +1,5 @@
diff --git a/dom/media/mediacontrol/MediaController.cpp b/dom/media/mediacontrol/MediaController.cpp
-index 8a1735b70f2003b7ee554230c4ad93c68793fce2..86d86a83545287356be5e455501b8c30062adc3a 100644
+index 51369c404f10d6c83e83c4284efc6c19a08961a0..3d5c2e48187d59fba0dde348894da4dc03a66eee 100644
--- a/dom/media/mediacontrol/MediaController.cpp
+++ b/dom/media/mediacontrol/MediaController.cpp
@@ -51,6 +51,25 @@ void MediaController::GetSupportedKeys(
diff --git a/src/dom/media/mediaelement/HTMLMediaElement-cpp.patch b/src/dom/media/mediaelement/HTMLMediaElement-cpp.patch
index f89fc4887..0df960077 100644
--- a/src/dom/media/mediaelement/HTMLMediaElement-cpp.patch
+++ b/src/dom/media/mediaelement/HTMLMediaElement-cpp.patch
@@ -1,5 +1,5 @@
diff --git a/dom/media/mediaelement/HTMLMediaElement.cpp b/dom/media/mediaelement/HTMLMediaElement.cpp
-index 935c9783ceb66ad8c6c8748ca3113664f5b114d3..a9f256a83b68940c829b24a19c67c56f11a01765 100644
+index 624375b514cb0b101ae24bb5906d0097d4b335db..27c91b01db611a0cd75b20907310d2fa4c8a1b47 100644
--- a/dom/media/mediaelement/HTMLMediaElement.cpp
+++ b/dom/media/mediaelement/HTMLMediaElement.cpp
@@ -451,6 +451,7 @@ class HTMLMediaElement::MediaControlKeyListener final
@@ -10,7 +10,7 @@ index 935c9783ceb66ad8c6c8748ca3113664f5b114d3..a9f256a83b68940c829b24a19c67c56f
NotifyAudibleStateChanged(mIsOwnerAudible
? MediaAudibleState::eAudible
: MediaAudibleState::eInaudible);
-@@ -7247,6 +7248,9 @@ void HTMLMediaElement::FireTimeUpdate(TimeupdateType aType) {
+@@ -7392,6 +7393,9 @@ void HTMLMediaElement::FireTimeUpdate(TimeupdateType aType) {
QueueTask(std::move(runner));
mQueueTimeUpdateRunnerTime = TimeStamp::Now();
mLastCurrentTime = CurrentTime();
diff --git a/src/eslint-file-globals-config-mjs.patch b/src/eslint-file-globals-config-mjs.patch
index d1149428e..6764cf430 100644
--- a/src/eslint-file-globals-config-mjs.patch
+++ b/src/eslint-file-globals-config-mjs.patch
@@ -1,5 +1,5 @@
diff --git a/eslint-file-globals.config.mjs b/eslint-file-globals.config.mjs
-index 00e49fce00efecab254aa1b8f0f0fe9ed2c24057..e9f390e15537d3d03a87f1c87099cb34698aee49 100644
+index 4f07a1bf0e0845fc955601167d011cbac8d73801..d1bda7e60d4d807226153a98198150005b69abe0 100644
--- a/eslint-file-globals.config.mjs
+++ b/eslint-file-globals.config.mjs
@@ -22,6 +22,7 @@
@@ -10,7 +10,7 @@ index 00e49fce00efecab254aa1b8f0f0fe9ed2c24057..e9f390e15537d3d03a87f1c87099cb34
export default [
{
-@@ -550,4 +551,9 @@ export default [
+@@ -553,4 +554,9 @@ export default [
],
languageOptions: { globals: globals.worker },
},
diff --git a/src/external-patches/firefox/add_urlbar_closeonwindowblur_preference.patch b/src/external-patches/firefox/add_urlbar_closeonwindowblur_preference.patch
index e113d4ea4..e1c9b63ad 100644
--- a/src/external-patches/firefox/add_urlbar_closeonwindowblur_preference.patch
+++ b/src/external-patches/firefox/add_urlbar_closeonwindowblur_preference.patch
@@ -72,4 +72,4 @@ diff --git a/browser/components/urlbar/content/UrlbarInput.mjs b/browser/compone
// a command causing a focus change. For example opening preferences from
// the oneoff settings button.
// For now we detect that case by discarding the event on command, but we
-
+ // may want to figure out a more robust way to detect abandonment.
\ No newline at end of file
diff --git a/src/external-patches/firefox/native_macos_popovers.patch b/src/external-patches/firefox/native_macos_popovers.patch
index fa21c5dc9..c1cee907a 100644
--- a/src/external-patches/firefox/native_macos_popovers.patch
+++ b/src/external-patches/firefox/native_macos_popovers.patch
@@ -1,7 +1,7 @@
diff --git a/browser/base/content/main-popupset.inc.xhtml b/browser/base/content/main-popupset.inc.xhtml
--- a/browser/base/content/main-popupset.inc.xhtml
+++ b/browser/base/content/main-popupset.inc.xhtml
-@@ -193,10 +193,11 @@
+@@ -196,10 +196,11 @@
-@@ -204,10 +205,11 @@
+@@ -207,10 +208,11 @@
-@@ -556,10 +558,11 @@
+@@ -560,10 +562,11 @@
type="arrow"
orient="vertical"
noautofocus="true"
@@ -33,10 +33,10 @@ diff --git a/browser/base/content/main-popupset.inc.xhtml b/browser/base/content
consumeoutsideclicks="false"
+ nonnativepopover="true"
role="tooltip">
-
-
-
-
+
+
+
+
diff --git a/browser/components/asrouter/modules/FeatureCallout.sys.mjs b/browser/components/asrouter/modules/FeatureCallout.sys.mjs
--- a/browser/components/asrouter/modules/FeatureCallout.sys.mjs
+++ b/browser/components/asrouter/modules/FeatureCallout.sys.mjs
@@ -70,23 +70,22 @@ diff --git a/browser/components/customizableui/content/panelUI.inc.xhtml b/brows
diff --git a/dom/xul/XULPopupElement.cpp b/dom/xul/XULPopupElement.cpp
--- a/dom/xul/XULPopupElement.cpp
+++ b/dom/xul/XULPopupElement.cpp
-@@ -84,10 +84,15 @@
+@@ -82,10 +82,14 @@
void XULPopupElement::OpenPopupAtScreen(int32_t aXPos, int32_t aYPos,
bool aIsContextMenu,
Event* aTriggerEvent) {
nsXULPopupManager* pm = nsXULPopupManager::GetInstance();
-+ // TODO(cheff): We do the same at nsCocoaWindow::Show but it doesn't seem
-+ // to trigger a restyle so `appearance: auto` doesn't apply the native
-+ // popover style. We should remove this and use the other implementation
-+ // because this is a bit of a hack, not sure how reliable it is.
-+ SetXULBoolAttr(nsGkAtoms::nonnativepopover, true, IgnoreErrors());
++ // TODO(cheff): At nsCocoaWindow::Show but we check for ShouldShowAsNSPopover
++ // to determine whether to use a native popover or not. This should sort of
++ // "replicate" that logic here, but it's a bit of a hacky way.
++ SetAttr(kNameSpaceID_None, nsGkAtoms::nonnativepopover, u"true"_ns, true);
if (pm) {
pm->ShowPopupAtScreen(this, aXPos, aYPos, aIsContextMenu, aTriggerEvent);
}
}
-@@ -96,10 +101,14 @@
+@@ -94,10 +98,14 @@
int32_t aWidth, int32_t aHeight,
bool aIsContextMenu,
bool aAttributesOverride,
@@ -95,7 +94,7 @@ diff --git a/dom/xul/XULPopupElement.cpp b/dom/xul/XULPopupElement.cpp
+ // TODO: See OpenPopupAtScreen. We should remove this and use the other
+ // implementation because this is a bit of a hacky way to determine whether to
+ // use a native popover or not.
-+ SetXULBoolAttr(nsGkAtoms::nonnativepopover, true, IgnoreErrors());
++ SetAttr(kNameSpaceID_None, nsGkAtoms::nonnativepopover, u"true"_ns, true);
if (pm) {
pm->ShowPopupAtScreenRect(
this, aPosition, nsIntRect(aXPos, aYPos, aWidth, aHeight),
@@ -104,7 +103,7 @@ diff --git a/dom/xul/XULPopupElement.cpp b/dom/xul/XULPopupElement.cpp
diff --git a/layout/xul/nsMenuPopupFrame.h b/layout/xul/nsMenuPopupFrame.h
--- a/layout/xul/nsMenuPopupFrame.h
+++ b/layout/xul/nsMenuPopupFrame.h
-@@ -516,18 +516,10 @@
+@@ -530,18 +530,10 @@
// Move the popup to the position specified in its |left| and |top|
// attributes.
@@ -123,7 +122,7 @@ diff --git a/layout/xul/nsMenuPopupFrame.h b/layout/xul/nsMenuPopupFrame.h
public:
/**
* Return whether the popup direction should be RTL.
-@@ -536,10 +528,18 @@
+@@ -550,10 +542,18 @@
*
* Return whether the popup direction should be RTL.
*/
@@ -145,7 +144,7 @@ diff --git a/layout/xul/nsMenuPopupFrame.h b/layout/xul/nsMenuPopupFrame.h
diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml
--- a/modules/libpref/init/StaticPrefList.yaml
+++ b/modules/libpref/init/StaticPrefList.yaml
-@@ -19311,10 +19311,19 @@
+@@ -19477,10 +19477,19 @@
value: true
mirror: always
@@ -168,7 +167,7 @@ diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/Sta
diff --git a/toolkit/themes/shared/global-shared.css b/toolkit/themes/shared/global-shared.css
--- a/toolkit/themes/shared/global-shared.css
+++ b/toolkit/themes/shared/global-shared.css
-@@ -102,10 +102,22 @@
+@@ -85,10 +85,22 @@
--menuitem-border-radius: var(--arrowpanel-menuitem-border-radius);
--menuitem-padding: var(--arrowpanel-menuitem-padding);
--menuitem-margin: var(--arrowpanel-menuitem-margin);
@@ -194,7 +193,7 @@ diff --git a/toolkit/themes/shared/global-shared.css b/toolkit/themes/shared/glo
diff --git a/widget/cocoa/nsCocoaWindow.h b/widget/cocoa/nsCocoaWindow.h
--- a/widget/cocoa/nsCocoaWindow.h
+++ b/widget/cocoa/nsCocoaWindow.h
-@@ -133,23 +133,38 @@
+@@ -132,23 +132,38 @@
// to create its "frame view".
+ (Class)frameViewClassForStyleMask:(NSUInteger)styleMask;
@@ -234,7 +233,7 @@ diff --git a/widget/cocoa/nsCocoaWindow.h b/widget/cocoa/nsCocoaWindow.h
@interface BorderlessWindow : BaseWindow {
}
-@@ -201,10 +216,14 @@
+@@ -200,10 +215,14 @@
typedef nsIWidget Inherited;
public:
@@ -252,7 +251,7 @@ diff --git a/widget/cocoa/nsCocoaWindow.h b/widget/cocoa/nsCocoaWindow.h
diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm
--- a/widget/cocoa/nsCocoaWindow.mm
+++ b/widget/cocoa/nsCocoaWindow.mm
-@@ -5,10 +5,13 @@
+@@ -3,10 +3,13 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "nsCocoaWindow.h"
@@ -266,7 +265,7 @@ diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm
#include "nsIDOMWindowUtils.h"
#include "nsILocalFileMac.h"
#include "CocoaCompositorWidget.h"
-@@ -4958,10 +4961,15 @@
+@@ -4973,10 +4976,15 @@
if (mWindowType == WindowType::Popup) {
SetPopupWindowLevel();
mWindow.backgroundColor = NSColor.clearColor;
@@ -282,7 +281,7 @@ diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm
// the active space. Does not work with multiple displays. See
// NeedsRecreateToReshow() for multi-display with multi-space workaround.
mWindow.collectionBehavior = mWindow.collectionBehavior |
-@@ -5163,10 +5171,57 @@
+@@ -5178,10 +5186,57 @@
NS_OBJC_END_TRY_IGNORE_BLOCK;
}
@@ -340,25 +339,7 @@ diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm
NS_OBJC_BEGIN_TRY_IGNORE_BLOCK;
if (!mWindow) {
-@@ -5185,10 +5240,17 @@
- }
-
- NSWindow* nativeParentWindow =
- mParent ? (NSWindow*)mParent->GetNativeData(NS_NATIVE_WINDOW) : nil;
-
-+ bool shouldUseNativePopover = false;
-+ if (mWindowType == WindowType::Popup && aState) {
-+ nsMenuPopupFrame* popupFrame = GetPopupFrame();
-+ popupFrame->PopupElement().SetXULBoolAttr(
-+ nsGkAtoms::nonnativepopover, !ShouldShowAsNSPopover(), IgnoreErrors());
-+ }
-+
- if (aState && !mBounds.IsEmpty()) {
- // If we had set the activationPolicy to accessory, then right now we won't
- // have a dock icon. Make sure that we undo that and show a dock icon now
- // that we're going to show a window.
- if (NSApp.activationPolicy != NSApplicationActivationPolicyRegular) {
-@@ -5227,10 +5289,54 @@
+@@ -5242,10 +5297,54 @@
mWindow.contentView.needsDisplay = YES;
if (!nativeParentWindow || mPopupLevel != PopupLevel::Parent) {
[mWindow orderFront:nil];
@@ -413,7 +394,7 @@ diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm
// close other programs' context menus when ours open.
if ([mWindow isKindOfClass:[PopupWindow class]] &&
[(PopupWindow*)mWindow isContextMenu]) {
-@@ -5301,10 +5407,15 @@
+@@ -5316,10 +5415,15 @@
// of a window it hides the parent window.
if (mWindowType == WindowType::Popup && nativeParentWindow) {
[nativeParentWindow removeChildWindow:mWindow];
@@ -429,7 +410,7 @@ diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm
// other programs) that a menu has closed.
if ([mWindow isKindOfClass:[PopupWindow class]] &&
[(PopupWindow*)mWindow isContextMenu]) {
-@@ -5351,10 +5462,28 @@
+@@ -5366,10 +5470,28 @@
return false;
}
return nsIWidget::ShouldUseOffMainThreadCompositing();
@@ -458,7 +439,7 @@ diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm
return mWindow.isOpaque ? TransparencyMode::Opaque
: TransparencyMode::Transparent;
-@@ -6313,10 +6442,20 @@
+@@ -6328,10 +6450,20 @@
// We ignore aRepaint -- we have to call display:YES, otherwise the
// title bar doesn't immediately get repainted and is displayed in
// the wrong place, leading to a visual jump.
@@ -479,19 +460,18 @@ diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm
void nsCocoaWindow::Resize(const DesktopRect& aRect, bool aRepaint) {
DoResize(aRect.x, aRect.y, aRect.width, aRect.height, aRepaint, false);
-@@ -8277,18 +8416,27 @@
- backing:(NSBackingStoreType)bufferingType
- defer:(BOOL)deferCreation {
- NS_OBJC_BEGIN_TRY_BLOCK_RETURN;
+@@ -8314,17 +8446,26 @@
+ defer:deferCreation];
+ if (!self) {
+ return nil;
+ }
- mIsContextMenu = false;
+ mPopover = nil;
+ mPopoverViewController = nil;
+ mUsePopover = NO;
- return [super initWithContentRect:contentRect
- styleMask:styleMask
- backing:bufferingType
- defer:deferCreation];
+ mIsContextMenu = false;
+
+ return self;
NS_OBJC_END_TRY_BLOCK_RETURN(nil);
}
@@ -507,7 +487,7 @@ diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm
// Return 0 in order to match what the system does for sheet windows and
// _NSPopoverWindows.
- (CGFloat)_backdropBleedAmount {
-@@ -8342,10 +8490,120 @@
+@@ -8378,10 +8519,122 @@
- (void)setIsContextMenu:(BOOL)flag {
mIsContextMenu = flag;
@@ -597,23 +577,25 @@ diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm
+
+- (void)updatePopoverContent {
+ NS_OBJC_BEGIN_TRY_IGNORE_BLOCK;
++ if (!mPopover || !mPopoverViewController) {
++ return;
++ }
+
-+ if (mPopover && mPopoverViewController) {
-+ NSView* contentView = self.contentView;
-+ if (contentView) {
-+ // Ensure proper hit testing for hover events
-+ [contentView setWantsLayer:YES];
-+ [contentView setAcceptsTouchEvents:YES];
++ NSView* contentView = self.contentView;
++ if (!contentView) {
++ return;
++ }
++ // Ensure proper hit testing for hover events
++ [contentView setWantsLayer:YES];
++ [contentView setAcceptsTouchEvents:YES];
+
-+ // Update the popover content view to match current window content
-+ mPopoverViewController.view = contentView;
++ // Update the popover content view to match current window content
++ mPopoverViewController.view = contentView;
+
-+ // Update popover size to match content
-+ NSRect contentRect = [contentView frame];
-+ if (contentRect.size.width > 0 && contentRect.size.height > 0) {
-+ mPopover.contentSize = contentRect.size;
-+ }
-+ }
++ // Update popover size to match content
++ NSRect contentRect = [contentView frame];
++ if (contentRect.size.width > 0 && contentRect.size.height > 0) {
++ mPopover.contentSize = contentRect.size;
+ }
+
+ NS_OBJC_END_TRY_IGNORE_BLOCK;
@@ -624,14 +606,14 @@ diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm
+}
+
- (BOOL)canBecomeMainWindow {
- // This is overriden because the default is 'yes' when a titlebar is present.
+ // This is overridden because the default is 'yes' when a titlebar is present.
return NO;
}
diff --git a/widget/nsIWidget.h b/widget/nsIWidget.h
--- a/widget/nsIWidget.h
+++ b/widget/nsIWidget.h
-@@ -836,10 +836,15 @@
+@@ -843,10 +843,15 @@
virtual void SuppressAnimation(bool aSuppress) {}
/** Sets windows-specific mica backdrop on this widget. */
@@ -650,7 +632,7 @@ diff --git a/widget/nsIWidget.h b/widget/nsIWidget.h
diff --git a/xpcom/ds/StaticAtoms.py b/xpcom/ds/StaticAtoms.py
--- a/xpcom/ds/StaticAtoms.py
+++ b/xpcom/ds/StaticAtoms.py
-@@ -535,10 +535,11 @@
+@@ -536,10 +536,11 @@
Atom("hgroup", "hgroup"),
Atom("hidden", "hidden"),
Atom("hidechrome", "hidechrome"),
@@ -662,7 +644,7 @@ diff --git a/xpcom/ds/StaticAtoms.py b/xpcom/ds/StaticAtoms.py
Atom("highest", "highest"),
Atom("horizontal", "horizontal"),
Atom("hover", "hover"),
-@@ -756,10 +757,11 @@
+@@ -757,10 +758,11 @@
Atom("nohref", "nohref"),
Atom("noinitialselection", "noinitialselection"),
Atom("nomodule", "nomodule"),
diff --git a/src/external-patches/manifest.json b/src/external-patches/manifest.json
index 523cc8bf9..157506bcb 100644
--- a/src/external-patches/manifest.json
+++ b/src/external-patches/manifest.json
@@ -12,9 +12,6 @@
"id": "D284084",
"name": "Native MacOS popovers",
"replaces": {
- // The patch we sent was for firefox 149, but we are currently in 148, so theres
- // a conflict in the patch. See https://bugzilla.mozilla.org/show_bug.cgi?id=2015354
- "overridden": "overriden",
// Specifically trying to target FeatureCallout.sys.mjs's change.
// IMPORTANT: Make sure Feature callouts STILL use native popopvers when
// syncing from upstream, as this is a critical part of the patch.
@@ -25,7 +22,10 @@
{
"type": "phabricator",
"id": "D284404",
- "name": "Add urlbar closeOnWindowBlur preference"
+ "name": "Add urlbar closeOnWindowBlur preference",
+ "replaces": {
+ "\n\n": "\n // may want to figure out a more robust way to detect abandonment."
+ }
},
{
"type": "local",
diff --git a/src/gfx/wr/webrender/src/picture-rs.patch b/src/gfx/wr/webrender/src/picture-rs.patch
deleted file mode 100644
index d945e2536..000000000
--- a/src/gfx/wr/webrender/src/picture-rs.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-diff --git a/gfx/wr/webrender/src/picture.rs b/gfx/wr/webrender/src/picture.rs
-index ba0885e8af7043e0939a61bab1574c59e7e99d01..43e6476c59cee2477f011f2014052e3fe9f7da02 100644
---- a/gfx/wr/webrender/src/picture.rs
-+++ b/gfx/wr/webrender/src/picture.rs
-@@ -1540,7 +1540,12 @@ pub fn get_relative_scale_offset(
- CoordinateSpaceMapping::Local => ScaleOffset::identity(),
- CoordinateSpaceMapping::ScaleOffset(scale_offset) => scale_offset,
- CoordinateSpaceMapping::Transform(m) => {
-- ScaleOffset::from_transform(&m).expect("bug: pictures caches don't support complex transforms")
-+ // Temporary fix when opening extensions (#34)
-+ // TODO: Look more into this
-+ ScaleOffset {
-+ scale: Vector2D::new(m.m11, m.m22),
-+ offset: Vector2D::new(m.m41, m.m42),
-+ }
- }
- };
-
diff --git a/src/image/decoders/nsJXLDecoder-cpp.patch b/src/image/decoders/nsJXLDecoder-cpp.patch
deleted file mode 100644
index 2f3adf7cd..000000000
--- a/src/image/decoders/nsJXLDecoder-cpp.patch
+++ /dev/null
@@ -1,318 +0,0 @@
-diff --git a/image/decoders/nsJXLDecoder.cpp b/image/decoders/nsJXLDecoder.cpp
-index ffb7f3cd51e1d0e480bf8ac5e936a90c11f0c93d..378ae56d7fa99fbe8bdea2e689949994bbdf8034 100644
---- a/image/decoders/nsJXLDecoder.cpp
-+++ b/image/decoders/nsJXLDecoder.cpp
-@@ -45,9 +45,20 @@ nsJXLDecoder::nsJXLDecoder(RasterImage* aImage)
- Transition::TerminateSuccess()),
- mDecoder(JxlDecoderMake(nullptr)),
- mParallelRunner(
-- JxlThreadParallelRunnerMake(nullptr, PreferredThreadCount())) {
-- JxlDecoderSubscribeEvents(mDecoder.get(),
-- JXL_DEC_BASIC_INFO | JXL_DEC_FULL_IMAGE);
-+ JxlThreadParallelRunnerMake(nullptr, PreferredThreadCount())),
-+ mUsePipeTransform(true),
-+ mCMSLine(nullptr),
-+ mNumFrames(0),
-+ mTimeout(FrameTimeout::Forever()),
-+ mSurfaceFormat(SurfaceFormat::OS_RGBX),
-+ mContinue(false) {
-+ int events = JXL_DEC_BASIC_INFO | JXL_DEC_FRAME | JXL_DEC_FULL_IMAGE;
-+
-+ if (mCMSMode != CMSMode::Off) {
-+ events |= JXL_DEC_COLOR_ENCODING;
-+ }
-+
-+ JxlDecoderSubscribeEvents(mDecoder.get(), events);
- JxlDecoderSetParallelRunner(mDecoder.get(), JxlThreadParallelRunner,
- mParallelRunner.get());
-
-@@ -58,6 +69,10 @@ nsJXLDecoder::nsJXLDecoder(RasterImage* aImage)
- nsJXLDecoder::~nsJXLDecoder() {
- MOZ_LOG(sJXLLog, LogLevel::Debug,
- ("[this=%p] nsJXLDecoder::~nsJXLDecoder", this));
-+
-+ if (mCMSLine) {
-+ free(mCMSLine);
-+ }
- }
-
- size_t nsJXLDecoder::PreferredThreadCount() {
-@@ -86,14 +101,20 @@ LexerResult nsJXLDecoder::DoDecode(SourceBufferIterator& aIterator,
-
- LexerTransition nsJXLDecoder::ReadJXLData(
- const char* aData, size_t aLength) {
-- const uint8_t* input = (const uint8_t*)aData;
-- size_t length = aLength;
-- if (mBuffer.length() != 0) {
-- JXL_TRY_BOOL(mBuffer.append(aData, aLength));
-- input = mBuffer.begin();
-- length = mBuffer.length();
-+ // Ignore data we have already read.
-+ // This will only occur as a result of a yield for animation.
-+ if (!mContinue) {
-+ const uint8_t* input = (const uint8_t*)aData;
-+ size_t length = aLength;
-+ if (mBuffer.length() != 0) {
-+ JXL_TRY_BOOL(mBuffer.append(aData, aLength));
-+ input = mBuffer.begin();
-+ length = mBuffer.length();
-+ }
-+
-+ JXL_TRY(JxlDecoderSetInput(mDecoder.get(), input, length));
- }
-- JXL_TRY(JxlDecoderSetInput(mDecoder.get(), input, length));
-+ mContinue = false;
-
- while (true) {
- JxlDecoderStatus status = JxlDecoderProcessInput(mDecoder.get());
-@@ -106,51 +127,238 @@ LexerTransition nsJXLDecoder::ReadJXLData(
- size_t remaining = JxlDecoderReleaseInput(mDecoder.get());
- mBuffer.clear();
- JXL_TRY_BOOL(mBuffer.append(aData + aLength - remaining, remaining));
-+
-+ if (mNumFrames == 0 && InFrame()) {
-+ // If an image was flushed by JxlDecoderFlushImage, then we know that
-+ // JXL_DEC_FRAME has already been run and there is a pipe.
-+ if (JxlDecoderFlushImage(mDecoder.get()) == JXL_DEC_SUCCESS) {
-+ // A full frame partial image is written to the buffer.
-+ mPipe.ResetToFirstRow();
-+ for (uint8_t* rowPtr = mOutBuffer.begin();
-+ rowPtr < mOutBuffer.end(); rowPtr += mInfo.xsize * mChannels) {
-+ uint8_t* rowToWrite = rowPtr;
-+
-+ if (!mUsePipeTransform && mTransform) {
-+ qcms_transform_data(mTransform, rowToWrite, mCMSLine,
-+ mInfo.xsize);
-+ rowToWrite = mCMSLine;
-+ }
-+
-+ mPipe.WriteBuffer(reinterpret_cast(rowToWrite));
-+ }
-+
-+ if (Maybe invalidRect =
-+ mPipe.TakeInvalidRect()) {
-+ PostInvalidation(invalidRect->mInputSpaceRect,
-+ Some(invalidRect->mOutputSpaceRect));
-+ }
-+ }
-+ }
-+
- return Transition::ContinueUnbuffered(State::JXL_DATA);
- }
-
- case JXL_DEC_BASIC_INFO: {
- JXL_TRY(JxlDecoderGetBasicInfo(mDecoder.get(), &mInfo));
- PostSize(mInfo.xsize, mInfo.ysize);
-+
- if (WantsFrameCount()) {
-- PostFrameCount(/* aFrameCount */ 1);
-+ // We start at 1 as additional frames are added in
-+ PostFrameCount(1);
- }
-+
- if (mInfo.alpha_bits > 0) {
-+ mSurfaceFormat = SurfaceFormat::OS_RGBA;
- PostHasTransparency();
- }
-+
-+ if (!mInfo.have_animation && IsMetadataDecode()) {
-+ return Transition::TerminateSuccess();
-+ }
-+
-+ // If CMS is off or the image is RGB, always output in RGBA.
-+ // If the image is grayscale, then the pipe transform can't be used.
-+ if (mCMSMode != CMSMode::Off) {
-+ mChannels = mInfo.num_color_channels == 1
-+ ? 1 + (mInfo.alpha_bits > 0 ? 1 : 0)
-+ : 4;
-+ } else {
-+ mChannels = 4;
-+ }
-+
-+ mFormat = {mChannels, JXL_TYPE_UINT8, JXL_LITTLE_ENDIAN, 0};
-+
-+ break;
-+ }
-+
-+ case JXL_DEC_COLOR_ENCODING: {
-+ size_t size = 0;
-+ JXL_TRY(JxlDecoderGetICCProfileSize(
-+ mDecoder.get(), JXL_COLOR_PROFILE_TARGET_DATA, &size))
-+ std::vector icc_profile(size);
-+ JXL_TRY(JxlDecoderGetColorAsICCProfile(mDecoder.get(),
-+ JXL_COLOR_PROFILE_TARGET_DATA,
-+ icc_profile.data(), size))
-+
-+ mInProfile = qcms_profile_from_memory((char*)icc_profile.data(), size);
-+
-+ uint32_t profileSpace = qcms_profile_get_color_space(mInProfile);
-+
-+ // Skip color management if color profile is not compatible with number
-+ // of channels.
-+ if (profileSpace != icSigRgbData &&
-+ (mInfo.num_color_channels == 3 || profileSpace != icSigGrayData)) {
-+ break;
-+ }
-+
-+ mUsePipeTransform =
-+ profileSpace == icSigRgbData && mInfo.num_color_channels == 3;
-+
-+ qcms_data_type inType;
-+ if (mInfo.num_color_channels == 3) {
-+ inType = QCMS_DATA_RGBA_8;
-+ } else if (mInfo.alpha_bits > 0) {
-+ inType = QCMS_DATA_GRAYA_8;
-+ } else {
-+ inType = QCMS_DATA_GRAY_8;
-+ }
-+
-+ if (!mUsePipeTransform) {
-+ mCMSLine =
-+ static_cast(malloc(sizeof(uint32_t) * mInfo.xsize));
-+ }
-+
-+ int intent = gfxPlatform::GetRenderingIntent();
-+ if (intent == -1) {
-+ intent = qcms_profile_get_rendering_intent(mInProfile);
-+ }
-+
-+ mTransform =
-+ qcms_transform_create(mInProfile, inType, GetCMSOutputProfile(),
-+ QCMS_DATA_RGBA_8, (qcms_intent)intent);
-+
-+ break;
-+ }
-+
-+ case JXL_DEC_FRAME: {
-+ if (mInfo.have_animation) {
-+ JXL_TRY(JxlDecoderGetFrameHeader(mDecoder.get(), &mFrameHeader));
-+ int32_t duration = (int32_t)(1000.0 * mFrameHeader.duration *
-+ mInfo.animation.tps_denominator /
-+ mInfo.animation.tps_numerator);
-+
-+ mTimeout = FrameTimeout::FromRawMilliseconds(duration);
-+
-+ if (!HasAnimation()) {
-+ PostIsAnimated(mTimeout);
-+ }
-+ }
-+
-+ bool is_last = mInfo.have_animation ? mFrameHeader.is_last : true;
-+ MOZ_LOG(sJXLLog, LogLevel::Debug,
-+ ("[this=%p] nsJXLDecoder::ReadJXLData - frame %d, is_last %d, "
-+ "metadata decode %d, first frame decode %d\n",
-+ this, mNumFrames, is_last, IsMetadataDecode(),
-+ IsFirstFrameDecode()));
-+
- if (IsMetadataDecode()) {
- return Transition::TerminateSuccess();
- }
-+
-+ OrientedIntSize size(mInfo.xsize, mInfo.ysize);
-+
-+ Maybe animParams;
-+ if (!IsFirstFrameDecode()) {
-+ animParams.emplace(FullFrame().ToUnknownRect(), mTimeout, mNumFrames,
-+ BlendMethod::SOURCE, DisposalMethod::CLEAR);
-+ }
-+
-+ SurfacePipeFlags pipeFlags = SurfacePipeFlags();
-+ if (mNumFrames == 0) {
-+ // The first frame may be displayed progressively.
-+ pipeFlags |= SurfacePipeFlags::PROGRESSIVE_DISPLAY;
-+ }
-+ if (mSurfaceFormat == SurfaceFormat::OS_RGBA &&
-+ !(GetSurfaceFlags() & SurfaceFlags::NO_PREMULTIPLY_ALPHA)) {
-+ pipeFlags |= SurfacePipeFlags::PREMULTIPLY_ALPHA;
-+ }
-+
-+ qcms_transform* pipeTransform =
-+ mUsePipeTransform ? mTransform : nullptr;
-+
-+ Maybe pipe = SurfacePipeFactory::CreateSurfacePipe(
-+ this, size, OutputSize(), FullFrame(), SurfaceFormat::R8G8B8A8,
-+ mSurfaceFormat, animParams, pipeTransform, pipeFlags);
-+
-+ if (!pipe) {
-+ MOZ_LOG(sJXLLog, LogLevel::Debug,
-+ ("[this=%p] nsJXLDecoder::ReadJXLData - no pipe\n", this));
-+ return Transition::TerminateFailure();
-+ }
-+
-+ mPipe = std::move(*pipe);
-+
- break;
- }
-
- case JXL_DEC_NEED_IMAGE_OUT_BUFFER: {
- size_t size = 0;
-- JxlPixelFormat format{4, JXL_TYPE_UINT8, JXL_LITTLE_ENDIAN, 0};
-- JXL_TRY(JxlDecoderImageOutBufferSize(mDecoder.get(), &format, &size));
-+ JXL_TRY(JxlDecoderImageOutBufferSize(mDecoder.get(), &mFormat, &size));
-
- mOutBuffer.clear();
- JXL_TRY_BOOL(mOutBuffer.growBy(size));
-- JXL_TRY(JxlDecoderSetImageOutBuffer(mDecoder.get(), &format,
-+ JXL_TRY(JxlDecoderSetImageOutBuffer(mDecoder.get(), &mFormat,
- mOutBuffer.begin(), size));
- break;
- }
-
- case JXL_DEC_FULL_IMAGE: {
-- OrientedIntSize size(mInfo.xsize, mInfo.ysize);
-- Maybe pipe = SurfacePipeFactory::CreateSurfacePipe(
-- this, size, OutputSize(), FullFrame(), SurfaceFormat::R8G8B8A8,
-- SurfaceFormat::OS_RGBA, Nothing(), nullptr, SurfacePipeFlags());
-+ mPipe.ResetToFirstRow();
-+
- for (uint8_t* rowPtr = mOutBuffer.begin(); rowPtr < mOutBuffer.end();
-- rowPtr += mInfo.xsize * 4) {
-- pipe->WriteBuffer(reinterpret_cast(rowPtr));
-+ rowPtr += mInfo.xsize * mChannels) {
-+ uint8_t* rowToWrite = rowPtr;
-+
-+ if (!mUsePipeTransform && mTransform) {
-+ qcms_transform_data(mTransform, rowToWrite, mCMSLine, mInfo.xsize);
-+ rowToWrite = mCMSLine;
-+ }
-+
-+ mPipe.WriteBuffer(reinterpret_cast(rowToWrite));
- }
-
-- if (Maybe invalidRect = pipe->TakeInvalidRect()) {
-+ if (Maybe invalidRect = mPipe.TakeInvalidRect()) {
- PostInvalidation(invalidRect->mInputSpaceRect,
- Some(invalidRect->mOutputSpaceRect));
- }
-- PostFrameStop();
-+
-+ Opacity opacity = (mSurfaceFormat == SurfaceFormat::OS_RGBA)
-+ ? Opacity::SOME_TRANSPARENCY
-+ : Opacity::FULLY_OPAQUE;
-+ PostFrameStop(opacity);
-+
-+ if (!IsFirstFrameDecode() && mInfo.have_animation &&
-+ !mFrameHeader.is_last) {
-+ mNumFrames++;
-+ mContinue = true;
-+ if (WantsFrameCount()) {
-+ // If we want frame count, report it now.
-+ PostFrameCount(mNumFrames + 1);
-+ }
-+ // Notify for a new frame but there may be data in the current buffer
-+ // that can immediately be processed.
-+ return Transition::ToAfterYield(State::JXL_DATA);
-+ }
-+ [[fallthrough]]; // We are done.
-+ }
-+
-+ case JXL_DEC_SUCCESS: {
-+ // Decoding is done. Report the full frame count.
-+ if (WantsFrameCount()) {
-+ PostFrameCount(mInfo.have_animation ? mNumFrames + 1 : 1);
-+ }
-+ PostLoopCount(HasAnimation() ? (int32_t)mInfo.animation.num_loops - 1
-+ : 0);
- PostDecodeDone();
- return Transition::TerminateSuccess();
- }
diff --git a/src/image/decoders/nsJXLDecoder-h.patch b/src/image/decoders/nsJXLDecoder-h.patch
deleted file mode 100644
index 864cd4e2e..000000000
--- a/src/image/decoders/nsJXLDecoder-h.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-diff --git a/image/decoders/nsJXLDecoder.h b/image/decoders/nsJXLDecoder.h
-index 0b723878aefdc5a37c2cffb72a561f859ad79cdf..6d39326dbefa9a85cc02b426de5c9f9149fe612d 100644
---- a/image/decoders/nsJXLDecoder.h
-+++ b/image/decoders/nsJXLDecoder.h
-@@ -46,6 +46,18 @@ class nsJXLDecoder final : public Decoder {
- Vector mBuffer;
- Vector mOutBuffer;
- JxlBasicInfo mInfo{};
-+ JxlPixelFormat mFormat;
-+ JxlFrameHeader mFrameHeader;
-+
-+ bool mUsePipeTransform;
-+ uint8_t mChannels;
-+ uint8_t* mCMSLine;
-+
-+ uint32_t mNumFrames;
-+ FrameTimeout mTimeout;
-+ gfx::SurfaceFormat mSurfaceFormat;
-+ SurfacePipe mPipe;
-+ bool mContinue;
- };
-
- } // namespace mozilla::image
diff --git a/src/modules/libpref/init/StaticPrefList-yaml.patch b/src/modules/libpref/init/StaticPrefList-yaml.patch
index fd6390e9c..91fce5005 100644
--- a/src/modules/libpref/init/StaticPrefList-yaml.patch
+++ b/src/modules/libpref/init/StaticPrefList-yaml.patch
@@ -1,8 +1,8 @@
diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml
-index b34b34d6f94525dc97c9e7008e689b2069862845..d56f4daccbfb3cf316dafb68d50dbd572d297fad 100644
+index 262eee800b3f2bf7b84809cd1f4a7aa2020eafb6..0812945dca0c0610c5d5f8792cb3f25dc642fb1e 100644
--- a/modules/libpref/init/StaticPrefList.yaml
+++ b/modules/libpref/init/StaticPrefList.yaml
-@@ -19786,6 +19786,7 @@
+@@ -20036,6 +20036,7 @@
mirror: always
#endif
diff --git a/src/servo/components/style/gecko/media_features-rs.patch b/src/servo/components/style/gecko/media_features-rs.patch
index 3aff814ea..7c370a616 100644
--- a/src/servo/components/style/gecko/media_features-rs.patch
+++ b/src/servo/components/style/gecko/media_features-rs.patch
@@ -1,5 +1,5 @@
diff --git a/servo/components/style/gecko/media_features.rs b/servo/components/style/gecko/media_features.rs
-index 9db79f86868edd798177bc04a8520025c4cf4568..fe0e74f9a047fd101d8e510eda3abf690b33f41f 100644
+index 21c274075116ace81c29babbf8b2ce94fa749e4f..512f34734d6a4d81bde1aed3df5a655e9310a2ec 100644
--- a/servo/components/style/gecko/media_features.rs
+++ b/servo/components/style/gecko/media_features.rs
@@ -15,6 +15,9 @@ use crate::values::computed::{CSSPixelLength, Context, Ratio, Resolution};
diff --git a/src/testing/mochitest/browser-test-js.patch b/src/testing/mochitest/browser-test-js.patch
index e349d9767..bd904354f 100644
--- a/src/testing/mochitest/browser-test-js.patch
+++ b/src/testing/mochitest/browser-test-js.patch
@@ -1,8 +1,8 @@
diff --git a/testing/mochitest/browser-test.js b/testing/mochitest/browser-test.js
-index 1e1fa8146450e3e09706180b85633cc87ddf6269..acbcefa6533d6bf909a767899b280592d3b0efda 100644
+index 82702aa28a04b87153efaab43a5510da88141bd5..e0a5f1b7a7b33bb8fe2117140aac06c12299c976 100644
--- a/testing/mochitest/browser-test.js
+++ b/testing/mochitest/browser-test.js
-@@ -442,10 +442,10 @@ Tester.prototype = {
+@@ -445,10 +445,10 @@ Tester.prototype = {
// But not the Thunderbird window, it doesn't have these things!
if (AppConstants.MOZ_APP_NAME != "thunderbird") {
// Remove stale tabs
@@ -15,7 +15,7 @@ index 1e1fa8146450e3e09706180b85633cc87ddf6269..acbcefa6533d6bf909a767899b280592
let lastTab = gBrowser.tabs[gBrowser.tabs.length - 1];
if (!lastTab.closing) {
// Report the stale tab as an error only when they're not closing.
-@@ -1151,12 +1151,6 @@ Tester.prototype = {
+@@ -1156,12 +1156,6 @@ Tester.prototype = {
// test_end is logged, otherwise the new windows created by addTab will be
// tracked by ShutdownLeaks as belonging to the test and cause false leak reports.
if (window.gBrowser) {
diff --git a/src/third_party/rust/mime_guess/src/mime_types-rs.patch b/src/third_party/rust/mime_guess/src/mime_types-rs.patch
deleted file mode 100644
index 9568fa141..000000000
--- a/src/third_party/rust/mime_guess/src/mime_types-rs.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-diff --git a/third_party/rust/mime_guess/src/mime_types.rs b/third_party/rust/mime_guess/src/mime_types.rs
-index 13c91b7bee77a0c0a4b45b8e05a25bb89daac66e..1521cd729ec78dbc51b86cf04546c4cd4ceb1163 100644
---- a/third_party/rust/mime_guess/src/mime_types.rs
-+++ b/third_party/rust/mime_guess/src/mime_types.rs
-@@ -103,6 +103,7 @@ pub static MIME_TYPES: &[(&str, &[&str])] = &[
- ("au", &["audio/basic"]),
- ("avi", &["video/x-msvideo"]),
- ("avif", &["image/avif"]),
-+ ("avifs", &["image/avif-sequence"]),
- ("aw", &["application/applixware"]),
- ("axa", &["audio/annodex"]),
- ("axs", &["application/olescript"]),
-@@ -449,6 +450,10 @@ pub static MIME_TYPES: &[(&str, &[&str])] = &[
- ("hdf", &["application/x-hdf"]),
- ("hdml", &["text/x-hdml"]),
- ("hdr", &["image/vnd.radiance"]),
-+ ("heic", &["image/heic"]),
-+ ("heics", &["image/heic-sequence"]),
-+ ("heif", &["image/heif"]),
-+ ("heifs", &["image/heif-sequence"]),
- ("hh", &["text/plain"]),
- ("hhc", &["application/x-oleobject"]),
- ("hhk", &["application/octet-stream"]),
-@@ -567,6 +572,7 @@ pub static MIME_TYPES: &[(&str, &[&str])] = &[
- ("jsonml", &["application/jsonml+json"]),
- ("jsx", &["text/jscript"]),
- ("jsxbin", &["text/plain"]),
-+ ("jxl", &["image/jxl"]),
- ("kar", &["audio/midi"]),
- ("karbon", &["application/vnd.kde.karbon"]),
- ("kfo", &["application/vnd.kde.kformula"]),
diff --git a/src/toolkit/actors/PictureInPictureChild-sys-mjs.patch b/src/toolkit/actors/PictureInPictureChild-sys-mjs.patch
index 77c6d0296..43acbb23d 100644
--- a/src/toolkit/actors/PictureInPictureChild-sys-mjs.patch
+++ b/src/toolkit/actors/PictureInPictureChild-sys-mjs.patch
@@ -1,5 +1,5 @@
diff --git a/toolkit/actors/PictureInPictureChild.sys.mjs b/toolkit/actors/PictureInPictureChild.sys.mjs
-index c768bf13f6736062fcbf0972cdb750c8d8f6e93b..9d5d9debe73457ff25ffa4efda1f420968743c52 100644
+index 0ec4b9f736994b47f836ce749f9ddaf128b0fb87..a86e2e7181a47023dc2a93a0ba4c582c350e0398 100644
--- a/toolkit/actors/PictureInPictureChild.sys.mjs
+++ b/toolkit/actors/PictureInPictureChild.sys.mjs
@@ -295,6 +295,7 @@ export class PictureInPictureLauncherChild extends JSWindowActorChild {
diff --git a/src/toolkit/components/downloads/DownloadList-sys-mjs.patch b/src/toolkit/components/downloads/DownloadList-sys-mjs.patch
deleted file mode 100644
index 3e553f346..000000000
--- a/src/toolkit/components/downloads/DownloadList-sys-mjs.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff --git a/toolkit/components/downloads/DownloadList.sys.mjs b/toolkit/components/downloads/DownloadList.sys.mjs
-index 8e6d1987c359c9388ae73aeeb57ec6c94be033e5..0162a3f3033e97be95d1230852d38c9fe0c524a1 100644
---- a/toolkit/components/downloads/DownloadList.sys.mjs
-+++ b/toolkit/components/downloads/DownloadList.sys.mjs
-@@ -50,6 +50,7 @@ const FILE_EXTENSIONS = [
- "jpg",
- "jpeg",
- "json",
-+ "jxl",
- "m4a",
- "mdb",
- "mid",
diff --git a/src/toolkit/components/extensions/parent/ext-downloads-js.patch b/src/toolkit/components/extensions/parent/ext-downloads-js.patch
deleted file mode 100644
index f142716dc..000000000
--- a/src/toolkit/components/extensions/parent/ext-downloads-js.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-diff --git a/toolkit/components/extensions/parent/ext-downloads.js b/toolkit/components/extensions/parent/ext-downloads.js
-index b58256216d5f79ee87bbbd79142c080e211f94fa..7ed34100a34223b78660f1cad18afd72e90380b2 100644
---- a/toolkit/components/extensions/parent/ext-downloads.js
-+++ b/toolkit/components/extensions/parent/ext-downloads.js
-@@ -87,6 +87,7 @@ const FILTER_IMAGES_EXTENSIONS = [
- "jpe",
- "jpg",
- "jpeg",
-+ "jxl",
- "gif",
- "png",
- "bmp",
-@@ -104,6 +105,7 @@ const FILTER_IMAGES_EXTENSIONS = [
- "raw",
- "webp",
- "heic",
-+ "avif",
- ];
-
- const FILTER_XML_EXTENSIONS = ["xml"];
diff --git a/src/toolkit/components/extensions/parent/ext-tabs-base-js.patch b/src/toolkit/components/extensions/parent/ext-tabs-base-js.patch
index 62e3b152e..1619961a7 100644
--- a/src/toolkit/components/extensions/parent/ext-tabs-base-js.patch
+++ b/src/toolkit/components/extensions/parent/ext-tabs-base-js.patch
@@ -1,8 +1,8 @@
diff --git a/toolkit/components/extensions/parent/ext-tabs-base.js b/toolkit/components/extensions/parent/ext-tabs-base.js
-index 1db6abb2b8dc4051ad5ed452b6f42e1511a4a39c..91c9f1b358ca84278bee933d75111673d3a4721d 100644
+index b915a9bed9a08afc4cabcc9c7268ecfddeb5a9f6..f318a20a17caf3d4c9ebaa67715ad3835bf89970 100644
--- a/toolkit/components/extensions/parent/ext-tabs-base.js
+++ b/toolkit/components/extensions/parent/ext-tabs-base.js
-@@ -1951,6 +1951,7 @@ class TabManagerBase {
+@@ -1964,6 +1964,7 @@ class TabManagerBase {
*/
addActiveTabPermission(nativeTab) {
let tab = this.getWrapper(nativeTab);
@@ -10,7 +10,7 @@ index 1db6abb2b8dc4051ad5ed452b6f42e1511a4a39c..91c9f1b358ca84278bee933d75111673
if (
this.extension.hasPermission("activeTab") ||
(this.extension.originControls &&
-@@ -1972,7 +1973,9 @@ class TabManagerBase {
+@@ -1985,7 +1986,9 @@ class TabManagerBase {
* The native tab for which to revoke permissions.
*/
revokeActiveTabPermission(nativeTab) {
@@ -21,7 +21,7 @@ index 1db6abb2b8dc4051ad5ed452b6f42e1511a4a39c..91c9f1b358ca84278bee933d75111673
}
/**
-@@ -1985,7 +1988,9 @@ class TabManagerBase {
+@@ -1998,7 +2001,9 @@ class TabManagerBase {
* True if the extension has activeTab permissions for this tab.
*/
hasActiveTabPermission(nativeTab) {
@@ -32,7 +32,7 @@ index 1db6abb2b8dc4051ad5ed452b6f42e1511a4a39c..91c9f1b358ca84278bee933d75111673
}
/**
-@@ -1996,6 +2001,7 @@ class TabManagerBase {
+@@ -2009,6 +2014,7 @@ class TabManagerBase {
*/
activateScripts(nativeTab) {
let tab = this.getWrapper(nativeTab);
@@ -40,7 +40,7 @@ index 1db6abb2b8dc4051ad5ed452b6f42e1511a4a39c..91c9f1b358ca84278bee933d75111673
if (
this.extension.originControls &&
!tab.matchesHostPermission &&
-@@ -2028,7 +2034,9 @@ class TabManagerBase {
+@@ -2041,7 +2047,9 @@ class TabManagerBase {
* True if the extension has permissions for this tab.
*/
hasTabPermission(nativeTab) {
@@ -51,7 +51,7 @@ index 1db6abb2b8dc4051ad5ed452b6f42e1511a4a39c..91c9f1b358ca84278bee933d75111673
}
/**
-@@ -2075,7 +2083,9 @@ class TabManagerBase {
+@@ -2088,7 +2096,9 @@ class TabManagerBase {
* @returns {object}
*/
convert(nativeTab, fallbackTabSize = null) {
diff --git a/src/toolkit/content/filepicker-properties.patch b/src/toolkit/content/filepicker-properties.patch
deleted file mode 100644
index c3abaca23..000000000
--- a/src/toolkit/content/filepicker-properties.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/toolkit/content/filepicker.properties b/toolkit/content/filepicker.properties
-index 03daec114c2882ed5ab7899b9b435d1cce936838..b6bd09c3c5625a1649b31dc99935bc90773d4133 100644
---- a/toolkit/content/filepicker.properties
-+++ b/toolkit/content/filepicker.properties
-@@ -5,7 +5,7 @@
- allFilter=*
- htmlFilter=*.html; *.htm; *.shtml; *.xhtml
- textFilter=*.txt; *.text
--imageFilter=*.jpe; *.jpg; *.jpeg; *.gif; *.png; *.bmp; *.ico; *.svg; *.svgz; *.tif; *.tiff; *.ai; *.drw; *.pct; *.psp; *.xcf; *.psd; *.raw; *.webp; *.heic
-+imageFilter=*.jpe; *.jpg; *.jpeg; *.gif; *.png; *.bmp; *.ico; *.svg; *.svgz; *.tif; *.tiff; *.ai; *.drw; *.pct; *.psp; *.xcf; *.psd; *.raw; *.webp; *.heic; *.avif; *.jxl
- xmlFilter=*.xml
- xulFilter=*.xul
- audioFilter=*.aac; *.aif; *.flac; *.iff; *.m4a; *.m4b; *.mid; *.midi; *.mp3; *.mpa; *.mpc; *.oga; *.ogg; *.opus; *.ra; *.ram; *.snd; *.wav; *.wma
diff --git a/src/toolkit/content/widgets/browser-custom-element-mjs.patch b/src/toolkit/content/widgets/browser-custom-element-mjs.patch
index 199706103..429435d1c 100644
--- a/src/toolkit/content/widgets/browser-custom-element-mjs.patch
+++ b/src/toolkit/content/widgets/browser-custom-element-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/toolkit/content/widgets/browser-custom-element.mjs b/toolkit/content/widgets/browser-custom-element.mjs
-index 44f3d5f5875fbd83f54a0a06d4881ded95e396e5..43f107b2a8231f4a0994afd724ff66a5e1e1a0e8 100644
+index 75890c23989a4f4d0da06e9f0220e3e374038ec0..08c74103a2fde76aad228af7671f9fe4dfb39760 100644
--- a/toolkit/content/widgets/browser-custom-element.mjs
+++ b/toolkit/content/widgets/browser-custom-element.mjs
-@@ -495,11 +495,11 @@ export class MozBrowser extends MozElements.MozElementMixin(XULFrameElement) {
+@@ -504,11 +504,11 @@ export class MozBrowser extends MozElements.MozElementMixin(XULFrameElement) {
if (!this.browsingContext) {
return;
}
diff --git a/src/toolkit/content/widgets/tabbox-js.patch b/src/toolkit/content/widgets/tabbox-js.patch
index 5dbe3649d..5be62e3ea 100644
--- a/src/toolkit/content/widgets/tabbox-js.patch
+++ b/src/toolkit/content/widgets/tabbox-js.patch
@@ -1,5 +1,5 @@
diff --git a/toolkit/content/widgets/tabbox.js b/toolkit/content/widgets/tabbox.js
-index 344984211e70c67bcc65fbbee54495f381da2b9f..1346ab8b820ae60b13511f6e35b713060b2453d7 100644
+index 24196c658309b1d3c049939f57a13c22d422a153..0cf49a0dc18b34a5be2fad8d2b124c7c3ba3d92c 100644
--- a/toolkit/content/widgets/tabbox.js
+++ b/toolkit/content/widgets/tabbox.js
@@ -11,6 +11,23 @@
@@ -35,7 +35,7 @@ index 344984211e70c67bcc65fbbee54495f381da2b9f..1346ab8b820ae60b13511f6e35b71306
this._selectedPanel?.classList.add("deck-selected");
}
this.setAttribute("selectedIndex", val);
-@@ -736,7 +753,7 @@
+@@ -853,7 +870,7 @@
if (!tab) {
return;
}
@@ -44,7 +44,7 @@ index 344984211e70c67bcc65fbbee54495f381da2b9f..1346ab8b820ae60b13511f6e35b71306
if (otherTab != tab && otherTab.selected) {
otherTab._selected = false;
}
-@@ -772,6 +789,7 @@
+@@ -889,6 +906,7 @@
* @param {MozTab|null} [val]
*/
set selectedItem(val) {
@@ -52,7 +52,7 @@ index 344984211e70c67bcc65fbbee54495f381da2b9f..1346ab8b820ae60b13511f6e35b71306
if (val && !val.selected) {
// The selectedIndex setter ignores invalid values
// such as -1 if |val| isn't one of our child nodes.
-@@ -949,7 +967,7 @@
+@@ -1066,7 +1084,7 @@
if (tab == startTab) {
return null;
}
@@ -61,7 +61,7 @@ index 344984211e70c67bcc65fbbee54495f381da2b9f..1346ab8b820ae60b13511f6e35b71306
return tab;
}
}
-@@ -1011,13 +1029,30 @@
+@@ -1128,13 +1146,30 @@
* @param {boolean} [aWrap]
*/
advanceSelectedTab(aDir, aWrap) {
@@ -93,7 +93,7 @@ index 344984211e70c67bcc65fbbee54495f381da2b9f..1346ab8b820ae60b13511f6e35b71306
// Handle keyboard navigation for a hidden tab that can be selected, like the Firefox View tab,
// which has a random placement in this.allTabs.
if (startTab.hidden) {
-@@ -1030,7 +1065,7 @@
+@@ -1147,7 +1182,7 @@
newTab = this.findNextTab(startTab, {
direction: aDir,
wrap: aWrap,
diff --git a/src/toolkit/content/xul-css.patch b/src/toolkit/content/xul-css.patch
index a2bd47ce3..5d43984e8 100644
--- a/src/toolkit/content/xul-css.patch
+++ b/src/toolkit/content/xul-css.patch
@@ -1,5 +1,5 @@
diff --git a/toolkit/content/xul.css b/toolkit/content/xul.css
-index d881606aa72ba8c703ff83f23c265189ccc648a0..637a384dbe9367f9914ee593afbbc4e5594c81c5 100644
+index db311601fb2c814139a66316e06707a56b7ac5cc..3a4cefcefe029d0054de0252fe8dead6dc248f59 100644
--- a/toolkit/content/xul.css
+++ b/toolkit/content/xul.css
@@ -463,7 +463,8 @@ deck > *|*:not(:-moz-native-anonymous) {
diff --git a/src/toolkit/locales/en-US/chrome/mozapps/downloads/unknownContentType-properties.patch b/src/toolkit/locales/en-US/chrome/mozapps/downloads/unknownContentType-properties.patch
deleted file mode 100644
index c8c23196b..000000000
--- a/src/toolkit/locales/en-US/chrome/mozapps/downloads/unknownContentType-properties.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff --git a/toolkit/locales/en-US/chrome/mozapps/downloads/unknownContentType.properties b/toolkit/locales/en-US/chrome/mozapps/downloads/unknownContentType.properties
-index fa3c5e389bad5abb05c86a3cb08d6c7abf34166c..1bb1f48c4d3964e4637462bb0b3d4a1e965ca5ec 100644
---- a/toolkit/locales/en-US/chrome/mozapps/downloads/unknownContentType.properties
-+++ b/toolkit/locales/en-US/chrome/mozapps/downloads/unknownContentType.properties
-@@ -17,6 +17,7 @@ fileType=%S file
- # LOCALIZATION NOTE (orderedFileSizeWithType): first %S is type, second %S is size, and third %S is unit
- orderedFileSizeWithType=%1$S (%2$S %3$S)
- avifExtHandlerDescription=AV1 Image File (AVIF)
-+jxlExtHandlerDescription=JPEG XL Image (JXL)
- pdfExtHandlerDescription=Portable Document Format (PDF)
- svgExtHandlerDescription=Scalable Vector Graphics (SVG)
- webpExtHandlerDescription=WebP Image
diff --git a/src/toolkit/modules/AppConstants-sys-mjs.patch b/src/toolkit/modules/AppConstants-sys-mjs.patch
index 03c1b256c..7177ea31f 100644
--- a/src/toolkit/modules/AppConstants-sys-mjs.patch
+++ b/src/toolkit/modules/AppConstants-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/toolkit/modules/AppConstants.sys.mjs b/toolkit/modules/AppConstants.sys.mjs
-index e2a22ddd6c6ba36491f37ed22bc2e1fbc149790c..920d8649ef48d685891223a834110ad9a059001a 100644
+index a51aa0459c5c48226d039d3dd6807a4bca1df700..e70ed433b28f172f179fc08cf600c41e91a150cb 100644
--- a/toolkit/modules/AppConstants.sys.mjs
+++ b/toolkit/modules/AppConstants.sys.mjs
-@@ -170,6 +170,8 @@ export var AppConstants = Object.freeze({
+@@ -177,6 +177,8 @@ export var AppConstants = Object.freeze({
MOZ_UPDATE_CHANNEL: "@MOZ_UPDATE_CHANNEL@",
MOZ_WIDGET_TOOLKIT: "@MOZ_WIDGET_TOOLKIT@",
diff --git a/src/toolkit/modules/LightweightThemeConsumer-sys-mjs.patch b/src/toolkit/modules/LightweightThemeConsumer-sys-mjs.patch
index 6763e401b..11c4ddb77 100644
--- a/src/toolkit/modules/LightweightThemeConsumer-sys-mjs.patch
+++ b/src/toolkit/modules/LightweightThemeConsumer-sys-mjs.patch
@@ -1,5 +1,5 @@
diff --git a/toolkit/modules/LightweightThemeConsumer.sys.mjs b/toolkit/modules/LightweightThemeConsumer.sys.mjs
-index c62ad0b054296d0302aaeb60d78a30eba257647e..68f5ff2761ab4ded10cd98fb12e5668ece511e14 100644
+index 3b455ba0cdf8782bef1d44856a72556f8b62d200..18dd1f681dc72c6d08cd7196629ab272d0c0ff68 100644
--- a/toolkit/modules/LightweightThemeConsumer.sys.mjs
+++ b/toolkit/modules/LightweightThemeConsumer.sys.mjs
@@ -34,7 +34,7 @@ const toolkitVariableMap = [
@@ -11,7 +11,7 @@ index c62ad0b054296d0302aaeb60d78a30eba257647e..68f5ff2761ab4ded10cd98fb12e5668e
}
// Remove the alpha channel
const { r, g, b } = rgbaChannels;
-@@ -347,7 +347,7 @@ LightweightThemeConsumer.prototype = {
+@@ -377,7 +377,7 @@ LightweightThemeConsumer.prototype = {
let forcedColorsThemeOverride =
this.FORCED_COLORS_OVERRIDE_ENABLED &&
this.forcedColorsMediaQuery?.matches;
diff --git a/src/toolkit/modules/moz-build.patch b/src/toolkit/modules/moz-build.patch
index c1b0486c6..afa588713 100644
--- a/src/toolkit/modules/moz-build.patch
+++ b/src/toolkit/modules/moz-build.patch
@@ -1,8 +1,8 @@
diff --git a/toolkit/modules/moz.build b/toolkit/modules/moz.build
-index fec07181bc5ee7c9086d0d273d9355f3ce76a969..2deab6b10c67898e7383b194b0f949ba970b639e 100644
+index c7322c51ce2e0b750186ba575cca21ad03491822..e208b02f8afccfa28f78dcedf7f98cc54fc1429a 100644
--- a/toolkit/modules/moz.build
+++ b/toolkit/modules/moz.build
-@@ -286,6 +286,7 @@ for var in (
+@@ -290,6 +290,7 @@ for var in (
"DLL_SUFFIX",
"DEBUG_JS_MODULES",
"OMNIJAR_NAME",
diff --git a/src/toolkit/mozapps/extensions/AddonManager-sys-mjs.patch b/src/toolkit/mozapps/extensions/AddonManager-sys-mjs.patch
index b48135a67..16329d88b 100644
--- a/src/toolkit/mozapps/extensions/AddonManager-sys-mjs.patch
+++ b/src/toolkit/mozapps/extensions/AddonManager-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/toolkit/mozapps/extensions/AddonManager.sys.mjs b/toolkit/mozapps/extensions/AddonManager.sys.mjs
-index ed5f2525b1c7e8c31107e63adbefe2b1d3db82b0..ce79802f2f8f801b66806ee53c9203bf14fad441 100644
+index ba8a534bf857e35a46ff4ce7e140828c4ed3b081..16f505621533fb39616c3a0b9f002f5097be40c8 100644
--- a/toolkit/mozapps/extensions/AddonManager.sys.mjs
+++ b/toolkit/mozapps/extensions/AddonManager.sys.mjs
-@@ -1271,12 +1271,12 @@ var AddonManagerInternal = {
+@@ -1289,12 +1289,12 @@ var AddonManagerInternal = {
ITEM_VERSION: aAddon.version,
ITEM_STATUS: addonStatus,
APP_ID: Services.appinfo.ID,
diff --git a/src/toolkit/mozapps/extensions/content/aboutaddons-css.patch b/src/toolkit/mozapps/extensions/content/aboutaddons-css.patch
index 27b01add7..717a22797 100644
--- a/src/toolkit/mozapps/extensions/content/aboutaddons-css.patch
+++ b/src/toolkit/mozapps/extensions/content/aboutaddons-css.patch
@@ -1,8 +1,8 @@
diff --git a/toolkit/mozapps/extensions/content/aboutaddons.css b/toolkit/mozapps/extensions/content/aboutaddons.css
-index da127019467107973300b4df8d9b95e8bfb0e05c..bcee9583654609bdcba55605eebb97be8bec286e 100644
+index af6f7f42da3eb14c18058a9cc0516620a20a461b..fe049902b3c0606c038ad1bf076175593f1a1d76 100644
--- a/toolkit/mozapps/extensions/content/aboutaddons.css
+++ b/toolkit/mozapps/extensions/content/aboutaddons.css
-@@ -106,6 +106,13 @@ h2 {
+@@ -105,6 +105,13 @@ h2 {
.category[name="theme"] {
background-image: url("chrome://mozapps/skin/extensions/category-themes.svg");
}
diff --git a/src/toolkit/profile/nsToolkitProfileService-cpp.patch b/src/toolkit/profile/nsToolkitProfileService-cpp.patch
index 50140846e..e2f775deb 100644
--- a/src/toolkit/profile/nsToolkitProfileService-cpp.patch
+++ b/src/toolkit/profile/nsToolkitProfileService-cpp.patch
@@ -1,8 +1,8 @@
diff --git a/toolkit/profile/nsToolkitProfileService.cpp b/toolkit/profile/nsToolkitProfileService.cpp
-index 474f55e5662da51a3783fbaef4d9c76422210513..90afd653f6989334bc9a0fa3789338ebc07cb762 100644
+index 33c9621d60cedd32f5ac7c65cf9f94f4ecc40c3d..5973e1f3eb4f5003ec171e6ca511ee99efd76cad 100644
--- a/toolkit/profile/nsToolkitProfileService.cpp
+++ b/toolkit/profile/nsToolkitProfileService.cpp
-@@ -83,6 +83,8 @@ using namespace mozilla;
+@@ -96,6 +96,8 @@ using namespace mozilla;
#define INSTALL_PREFIX_LENGTH 7
#define STORE_ID_PREF "toolkit.profiles.storeID"
@@ -11,7 +11,7 @@ index 474f55e5662da51a3783fbaef4d9c76422210513..90afd653f6989334bc9a0fa3789338eb
struct KeyValue {
KeyValue(const char* aKey, const char* aValue) : key(aKey), value(aValue) {}
-@@ -1370,7 +1372,7 @@ nsresult nsToolkitProfileService::CreateDefaultProfile(
+@@ -1394,7 +1396,7 @@ nsresult nsToolkitProfileService::CreateDefaultProfile(
if (mUseDevEditionProfile) {
name.AssignLiteral(DEV_EDITION_NAME);
} else if (mUseDedicatedProfile) {
diff --git a/src/toolkit/themes/shared/design-system/dist/tokens-shared-css.patch b/src/toolkit/themes/shared/design-system/dist/tokens-shared-css.patch
index 70bf1cea5..f01ea6500 100644
--- a/src/toolkit/themes/shared/design-system/dist/tokens-shared-css.patch
+++ b/src/toolkit/themes/shared/design-system/dist/tokens-shared-css.patch
@@ -1,5 +1,5 @@
diff --git a/toolkit/themes/shared/design-system/dist/tokens-shared.css b/toolkit/themes/shared/design-system/dist/tokens-shared.css
-index b941f3dcfb24afa182800521d92795e69505e82c..cac0d1f72bb29b93313d21075846dd2afa315432 100644
+index 09a76c06a1b1982e27df5a2a1f770bad97e11247..26082ffa45480079da62f452ae6d7be652847464 100644
--- a/toolkit/themes/shared/design-system/dist/tokens-shared.css
+++ b/toolkit/themes/shared/design-system/dist/tokens-shared.css
@@ -5,6 +5,8 @@
diff --git a/src/toolkit/themes/shared/in-content/common-shared-css.patch b/src/toolkit/themes/shared/in-content/common-shared-css.patch
index b990121ce..34e7e8bc9 100644
--- a/src/toolkit/themes/shared/in-content/common-shared-css.patch
+++ b/src/toolkit/themes/shared/in-content/common-shared-css.patch
@@ -1,8 +1,8 @@
diff --git a/toolkit/themes/shared/in-content/common-shared.css b/toolkit/themes/shared/in-content/common-shared.css
-index 6d2bfbfed592d91b383cd2e307b635393932329f..25ddc2660f4c43129d783769b9eee4e208512c3a 100644
+index 814075aef59969a7e8656974b4f46022f8e88783..53c5d857c15f0a9ec553a2bcfec66c2d2db121fa 100644
--- a/toolkit/themes/shared/in-content/common-shared.css
+++ b/toolkit/themes/shared/in-content/common-shared.css
-@@ -58,7 +58,7 @@
+@@ -54,7 +54,7 @@
* this in forced colors mode, as we should be using system colours then.
*/
:root[dialogroot] {
@@ -11,7 +11,7 @@ index 6d2bfbfed592d91b383cd2e307b635393932329f..25ddc2660f4c43129d783769b9eee4e2
}
}
-@@ -169,7 +169,7 @@ xul|menulist {
+@@ -160,7 +160,7 @@ xul|menulist {
border-radius: var(--button-border-radius);
background-color: var(--button-background-color);
font-weight: normal;
@@ -20,21 +20,3 @@ index 6d2bfbfed592d91b383cd2e307b635393932329f..25ddc2660f4c43129d783769b9eee4e2
text-decoration: none;
margin: 4px 8px;
/* Ensure font-size isn't overridden by widget styling (e.g. in forms.css) */
-@@ -688,7 +688,7 @@ html|*#categories[last-input-type="mouse"] > html|button.category:focus-visible
- fill-opacity: 1;
- }
-
--@media (max-width: 830px) {
-+@media (max-width: 130px) {
- :root {
- --in-content-sidebar-width: 118px;
- }
-@@ -1070,7 +1070,7 @@ xul|*.sidebar-footer-link {
- user-select: none;
- }
-
--@media (max-width: 830px) {
-+@media (max-width: 130px) {
- .sidebar-footer-list {
- margin-inline-start: 40px;
- align-items: flex-start;
diff --git a/src/toolkit/themes/shared/menulist-css.patch b/src/toolkit/themes/shared/menulist-css.patch
index 091bd3be3..5b0afb327 100644
--- a/src/toolkit/themes/shared/menulist-css.patch
+++ b/src/toolkit/themes/shared/menulist-css.patch
@@ -1,5 +1,5 @@
diff --git a/toolkit/themes/shared/menulist.css b/toolkit/themes/shared/menulist.css
-index 56e61a11aa1180ed637104838a802d1dd2808e7b..3b44880e1aa194f0ff2f05760fd2f36d5e167738 100644
+index 278131adcec06fcdea567e6be1dc473bfe336586..85776c454a9e57b7a47ac179ec13a25a34edb461 100644
--- a/toolkit/themes/shared/menulist.css
+++ b/toolkit/themes/shared/menulist.css
@@ -53,7 +53,7 @@
diff --git a/src/toolkit/themes/shared/popup-css.patch b/src/toolkit/themes/shared/popup-css.patch
index 83a79dc5d..b1a0fbd8a 100644
--- a/src/toolkit/themes/shared/popup-css.patch
+++ b/src/toolkit/themes/shared/popup-css.patch
@@ -1,12 +1,12 @@
diff --git a/toolkit/themes/shared/popup.css b/toolkit/themes/shared/popup.css
-index c2618b86d7e8bb71f9f7f71ef9916c8140ca1ead..9e2006015e22f1ac043c46066c4c9a85fe053a21 100644
+index 064d39c586c01270545877ee9506ef3befa45a87..9b40bae87c3dd74cb921b5c486be01610c008216 100644
--- a/toolkit/themes/shared/popup.css
+++ b/toolkit/themes/shared/popup.css
-@@ -22,8 +22,8 @@ panel {
+@@ -23,8 +23,8 @@ panel {
--panel-border-color: ThreeDShadow;
--panel-width: initial;
-- --panel-shadow-margin: 4px;
+- --panel-shadow-margin: var(--dimension-4);
- --panel-shadow: 0 0 var(--panel-shadow-margin) hsla(0, 0%, 0%, 0.2);
+ --panel-shadow-margin: 10px;
+ --panel-shadow: var(--zen-big-shadow);
diff --git a/src/toolkit/xre/nsXREDirProvider-cpp.patch b/src/toolkit/xre/nsXREDirProvider-cpp.patch
index ab96f470b..17150fa97 100644
--- a/src/toolkit/xre/nsXREDirProvider-cpp.patch
+++ b/src/toolkit/xre/nsXREDirProvider-cpp.patch
@@ -1,8 +1,8 @@
diff --git a/toolkit/xre/nsXREDirProvider.cpp b/toolkit/xre/nsXREDirProvider.cpp
-index f60d1ab57e2fdf522744381ca43b953c3270122d..0c7ac9541821f169e4fb5bbf43cdc932390860a3 100644
+index 1b346ce2e62b6947e9f6b5f5f88ec16454847e09..301f896842a3f598b99eb3b9f617b361d423ca0e 100644
--- a/toolkit/xre/nsXREDirProvider.cpp
+++ b/toolkit/xre/nsXREDirProvider.cpp
-@@ -1322,9 +1322,11 @@ nsresult nsXREDirProvider::AppendFromAppData(nsIFile* aFile, bool aIsDotted) {
+@@ -1342,9 +1342,11 @@ nsresult nsXREDirProvider::AppendFromAppData(nsIFile* aFile, bool aIsDotted) {
// Similar to nsXREDirProvider::AppendProfilePath.
// TODO: Bug 1990407 - Evaluate if refactoring might be required there in the
// future?
@@ -15,7 +15,7 @@ index f60d1ab57e2fdf522744381ca43b953c3270122d..0c7ac9541821f169e4fb5bbf43cdc932
MOZ_TRY(aFile->AppendRelativeNativePath(profile));
} else {
nsAutoCString vendor;
-@@ -1334,8 +1336,6 @@ nsresult nsXREDirProvider::AppendFromAppData(nsIFile* aFile, bool aIsDotted) {
+@@ -1354,8 +1356,6 @@ nsresult nsXREDirProvider::AppendFromAppData(nsIFile* aFile, bool aIsDotted) {
ToLowerCase(vendor);
ToLowerCase(appName);
@@ -24,7 +24,7 @@ index f60d1ab57e2fdf522744381ca43b953c3270122d..0c7ac9541821f169e4fb5bbf43cdc932
MOZ_TRY(aFile->AppendRelativeNativePath(appName));
}
-@@ -1503,13 +1503,8 @@ nsresult nsXREDirProvider::GetLegacyOrXDGHomePath(const char* aHomeDir,
+@@ -1523,13 +1523,8 @@ nsresult nsXREDirProvider::GetLegacyOrXDGHomePath(const char* aHomeDir,
// If the build was made against a specific profile name, MOZ_APP_PROFILE=
// then make sure we respect this and dont move to XDG directory
diff --git a/src/tools/signing/macos/mach_commands-py.patch b/src/tools/signing/macos/mach_commands-py.patch
index 7ebbe027e..01f7415c1 100644
--- a/src/tools/signing/macos/mach_commands-py.patch
+++ b/src/tools/signing/macos/mach_commands-py.patch
@@ -1,5 +1,5 @@
diff --git a/tools/signing/macos/mach_commands.py b/tools/signing/macos/mach_commands.py
-index 4227363da7f07b02b9a37ef7e6e4bdae5b159554..af9f6baebda3ab4895af8e5933176691e375efb5 100644
+index f11ddae6ee8a76df28a21bfe3894f8ca4bdef6de..4f0530d682617d3d7dc30d06497350eee6ec5df3 100644
--- a/tools/signing/macos/mach_commands.py
+++ b/tools/signing/macos/mach_commands.py
@@ -37,7 +37,6 @@ from mozbuild.base import MachCommandConditions as conditions
@@ -21,7 +21,7 @@ index 4227363da7f07b02b9a37ef7e6e4bdae5b159554..af9f6baebda3ab4895af8e5933176691
if use_rcodesign_arg is True:
sign_with_rcodesign(
command_context,
-@@ -614,7 +617,7 @@ def sign_with_rcodesign(
+@@ -627,7 +630,7 @@ def sign_with_rcodesign(
# input path and its options are specified as standard arguments.
ctx.log(logging.INFO, "macos-sign", {}, "Signing with rcodesign")
diff --git a/src/widget/cocoa/nsDragService-mm.patch b/src/widget/cocoa/nsDragService-mm.patch
index aeada0b44..081b79b3e 100644
--- a/src/widget/cocoa/nsDragService-mm.patch
+++ b/src/widget/cocoa/nsDragService-mm.patch
@@ -1,5 +1,5 @@
diff --git a/widget/cocoa/nsDragService.mm b/widget/cocoa/nsDragService.mm
-index fb01c7e5ec5ce0f10a3f5c4c842d8a272665190d..b59cc2f5fd07c24b741cce63515c3fd0288152b4 100644
+index d5db98bff66a4daace6454af16406822d79fe912..522262b8d7ccba1f333755c48b0327cd098a5248 100644
--- a/widget/cocoa/nsDragService.mm
+++ b/widget/cocoa/nsDragService.mm
@@ -23,6 +23,7 @@
@@ -10,7 +10,7 @@ index fb01c7e5ec5ce0f10a3f5c4c842d8a272665190d..b59cc2f5fd07c24b741cce63515c3fd0
#include "nsIContent.h"
#include "nsCocoaUtils.h"
#include "mozilla/gfx/2D.h"
-@@ -144,6 +145,10 @@
+@@ -147,6 +148,10 @@
bitsPerPixel:32];
uint8_t* dest = [imageRep bitmapData];
@@ -21,7 +21,7 @@ index fb01c7e5ec5ce0f10a3f5c4c842d8a272665190d..b59cc2f5fd07c24b741cce63515c3fd0
for (uint32_t i = 0; i < height; ++i) {
uint8_t* src = map.mData + i * map.mStride;
for (uint32_t j = 0; j < width; ++j) {
-@@ -151,15 +156,15 @@
+@@ -154,15 +159,15 @@
// is premultipled here. Also, Quartz likes RGBA, so do that translation
// as well.
#ifdef IS_BIG_ENDIAN
diff --git a/src/widget/gtk/nsAppShell-cpp.patch b/src/widget/gtk/nsAppShell-cpp.patch
deleted file mode 100644
index fc6c0666a..000000000
--- a/src/widget/gtk/nsAppShell-cpp.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-diff --git a/widget/gtk/nsAppShell.cpp b/widget/gtk/nsAppShell.cpp
-index 3e57fab78f630eba8401cc77d9cc7e024d482a76..248d1271ca257dbe415d477827f90c8d6902bb86 100644
---- a/widget/gtk/nsAppShell.cpp
-+++ b/widget/gtk/nsAppShell.cpp
-@@ -504,7 +504,8 @@ nsresult nsAppShell::Init() {
- gchar* name = gdk_pixbuf_format_get_name(format);
- if (strcmp(name, "jpeg") && strcmp(name, "png") && strcmp(name, "gif") &&
- strcmp(name, "bmp") && strcmp(name, "ico") && strcmp(name, "xpm") &&
-- strcmp(name, "svg") && strcmp(name, "webp") && strcmp(name, "avif")) {
-+ strcmp(name, "svg") && strcmp(name, "webp") && strcmp(name, "avif") &&
-+ strcmp(name, "jxl")) {
- gdk_pixbuf_format_set_disabled(format, TRUE);
- }
- g_free(name);
diff --git a/src/xpfe/appshell/AppWindow-cpp.patch b/src/xpfe/appshell/AppWindow-cpp.patch
index 4e5f36ef9..b7e51a153 100644
--- a/src/xpfe/appshell/AppWindow-cpp.patch
+++ b/src/xpfe/appshell/AppWindow-cpp.patch
@@ -1,5 +1,5 @@
diff --git a/xpfe/appshell/AppWindow.cpp b/xpfe/appshell/AppWindow.cpp
-index 001e5db59cf4c6f6f156fcddc080c72725d9e883..d9e5ba63ab799b9a2c92eed0ecf8e5c3aaa4bb57 100644
+index f297266b3f7cb948d548f935a1feb1ea4b7be7d9..6bc589c1853bac48169b885581d4bdc89ad9e90a 100644
--- a/xpfe/appshell/AppWindow.cpp
+++ b/xpfe/appshell/AppWindow.cpp
@@ -1849,7 +1849,7 @@ nsresult AppWindow::MaybeSaveEarlyWindowPersistentValues(
diff --git a/src/zen/common/ZenPreloadedScripts.js b/src/zen/common/ZenPreloadedScripts.js
index dd83de876..01fa01ddd 100644
--- a/src/zen/common/ZenPreloadedScripts.js
+++ b/src/zen/common/ZenPreloadedScripts.js
@@ -8,6 +8,7 @@
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenSpaceBookmarksStorage.js", this);
ChromeUtils.importESModule("chrome://browser/content/ZenStartup.mjs", { global: "current" });
+ ChromeUtils.importESModule("resource:///modules/zen/ZenSpaceManager.mjs", { global: "current" });
ChromeUtils.importESModule("chrome://browser/content/zen-components/ZenCompactMode.mjs", { global: "current" });
ChromeUtils.importESModule("chrome://browser/content/ZenUIManager.mjs", { global: "current" });
ChromeUtils.importESModule("chrome://browser/content/zen-components/ZenMods.mjs", { global: "current" });
diff --git a/src/zen/common/modules/ZenUIManager.mjs b/src/zen/common/modules/ZenUIManager.mjs
index 2b376532a..a038e2a86 100644
--- a/src/zen/common/modules/ZenUIManager.mjs
+++ b/src/zen/common/modules/ZenUIManager.mjs
@@ -579,8 +579,7 @@ window.gZenUIManager = {
this._lastTab &&
!this._lastTab.closing &&
this._lastTab.ownerGlobal &&
- !this._lastTab.ownerGlobal.closed &&
- !onSwitch
+ !this._lastTab.ownerGlobal.closed
) {
this._lastTab._visuallySelected = true;
this._lastTab = null;
diff --git a/src/zen/common/styles/zen-omnibox.css b/src/zen/common/styles/zen-omnibox.css
index d3ee11dbd..8b8bc51e5 100644
--- a/src/zen/common/styles/zen-omnibox.css
+++ b/src/zen/common/styles/zen-omnibox.css
@@ -112,7 +112,7 @@
outline: none !important;
margin-bottom: auto;
- padding: 6px 8px !important;
+ padding: 6px !important;
:root:not([zen-single-toolbar="true"]) & {
padding-block: 2px !important;
}
diff --git a/src/zen/common/styles/zen-single-components.css b/src/zen/common/styles/zen-single-components.css
index 4b1ed8898..8ea0e3388 100644
--- a/src/zen/common/styles/zen-single-components.css
+++ b/src/zen/common/styles/zen-single-components.css
@@ -304,6 +304,7 @@
flex-wrap: wrap;
gap: 8px;
overflow: visible;
+ flex-direction: row;
unified-extensions-item-messagebar-wrapper,
.unified-extensions-item-contents {
@@ -480,7 +481,7 @@
#identity-box,
#page-action-buttons {
- opacity: 0.6;
+ fill-opacity: 0.6;
}
#zen-site-data-footer {
diff --git a/src/zen/drag-and-drop/nsZenDragAndDrop.h b/src/zen/drag-and-drop/nsZenDragAndDrop.h
index b5f593ba1..7f672352e 100644
--- a/src/zen/drag-and-drop/nsZenDragAndDrop.h
+++ b/src/zen/drag-and-drop/nsZenDragAndDrop.h
@@ -2,8 +2,8 @@
* 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/. */
-#ifndef mozilla_ZenDragAndDrop_h__
-#define mozilla_ZenDragAndDrop_h__
+#ifndef mozilla_ZenDragAndDrop_h_
+#define mozilla_ZenDragAndDrop_h_
#include "nsIZenDragAndDrop.h"
#include "nsCOMPtr.h"
diff --git a/src/zen/folders/ZenFolders.mjs b/src/zen/folders/ZenFolders.mjs
index 31d3cbf41..ffb57831e 100644
--- a/src/zen/folders/ZenFolders.mjs
+++ b/src/zen/folders/ZenFolders.mjs
@@ -101,9 +101,9 @@ class nsZenFolders extends nsZenDOMOperatedFeature {
const newSubfolderItem = document.getElementById(
"context_zenFolderNewSubfolder"
);
- newSubfolderItem.setAttribute(
+ newSubfolderItem.toggleAttribute(
"disabled",
- folder.level >= this.#ZEN_MAX_SUBFOLDERS - 1 ? "true" : "false"
+ folder.level >= this.#ZEN_MAX_SUBFOLDERS - 1
);
const changeFolderSpace = document
diff --git a/src/zen/mods/ZenStyleSheetCache.h b/src/zen/mods/ZenStyleSheetCache.h
index cb16fbf85..84ed1815d 100644
--- a/src/zen/mods/ZenStyleSheetCache.h
+++ b/src/zen/mods/ZenStyleSheetCache.h
@@ -2,8 +2,8 @@
* 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/. */
-#ifndef mozilla_ZenStyleSheetCache_h__
-#define mozilla_ZenStyleSheetCache_h__
+#ifndef mozilla_ZenStyleSheetCache_h_
+#define mozilla_ZenStyleSheetCache_h_
#include "mozilla/css/Loader.h"
#include "mozilla/StaticPtr.h"
diff --git a/src/zen/mods/nsZenModsBackend.h b/src/zen/mods/nsZenModsBackend.h
index 2929d7be1..58e30301b 100644
--- a/src/zen/mods/nsZenModsBackend.h
+++ b/src/zen/mods/nsZenModsBackend.h
@@ -2,8 +2,8 @@
* 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/. */
-#ifndef mozilla_ZenModsBackend_h__
-#define mozilla_ZenModsBackend_h__
+#ifndef mozilla_ZenModsBackend_h_
+#define mozilla_ZenModsBackend_h_
#include "nsIZenModsBackend.h"
#include "nsIZenCommonUtils.h"
diff --git a/src/zen/split-view/ZenViewSplitter.mjs b/src/zen/split-view/ZenViewSplitter.mjs
index e6a7206ce..851f18c42 100644
--- a/src/zen/split-view/ZenViewSplitter.mjs
+++ b/src/zen/split-view/ZenViewSplitter.mjs
@@ -2408,7 +2408,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
const shouldBeDisabled = !this.canOpenLinkInSplitView();
document
.getElementById("cmd_zenSplitViewLinkInNewTab")
- .setAttribute("disabled", shouldBeDisabled);
+ .toggleAttribute("disabled", shouldBeDisabled);
const splitGlanceCommand = document.getElementById("cmd_zenGlanceSplit");
if (shouldBeDisabled) {
splitGlanceCommand.setAttribute("disabled", true);
diff --git a/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs
index 10b213481..7d26334ca 100644
--- a/src/zen/tabs/ZenPinnedTabManager.mjs
+++ b/src/zen/tabs/ZenPinnedTabManager.mjs
@@ -639,7 +639,7 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
});
document
.getElementById("cmd_contextZenAddToEssentials")
- .setAttribute("disabled", !this.canEssentialBeAdded(contextTab));
+ .toggleAttribute("disabled", !this.canEssentialBeAdded(contextTab));
document.getElementById("context_closeTab").hidden =
contextTab.hasAttribute("zen-essential");
document.getElementById("context_zen-remove-essential").hidden =
diff --git a/src/zen/tests/mochitests/sandbox/browser_xdg_default.toml b/src/zen/tests/mochitests/sandbox/browser_xdg_default.toml
index ab7d75b8c..f03f4c06f 100644
--- a/src/zen/tests/mochitests/sandbox/browser_xdg_default.toml
+++ b/src/zen/tests/mochitests/sandbox/browser_xdg_default.toml
@@ -3,7 +3,6 @@
[DEFAULT]
skip-if = [
"ccov",
- "os == 'linux' && os_version == '22.04' && arch == 'x86_64' && display == 'wayland' && asan", # bug 1784517
"os == 'linux' && os_version == '24.04' && arch == 'x86_64' && display == 'x11' && asan", # bug 1784517
"os == 'linux' && os_version == '24.04' && arch == 'x86_64' && display == 'x11' && tsan", # bug 1784517
]
@@ -22,4 +21,6 @@ environment = [
profile-path = "/tmp/.xdg_default_test/.config/mozilla/firefox/xdg_default_profile"
["browser_content_sandbox_fs_xdg_default.js"]
-run-if = ["os == 'linux'"]
+run-if = [
+ "os == 'linux'"
+]
diff --git a/src/zen/tests/mochitests/sandbox/browser_xdg_mozLegacyHome.toml b/src/zen/tests/mochitests/sandbox/browser_xdg_mozLegacyHome.toml
index 4e30a8e33..7f7b680a8 100644
--- a/src/zen/tests/mochitests/sandbox/browser_xdg_mozLegacyHome.toml
+++ b/src/zen/tests/mochitests/sandbox/browser_xdg_mozLegacyHome.toml
@@ -3,7 +3,6 @@
[DEFAULT]
skip-if = [
"ccov",
- "os == 'linux' && os_version == '22.04' && arch == 'x86_64' && display == 'wayland' && asan", # bug 1784517
"os == 'linux' && os_version == '24.04' && arch == 'x86_64' && display == 'x11' && asan", # bug 1784517
"os == 'linux' && os_version == '24.04' && arch == 'x86_64' && display == 'x11' && tsan", # bug 1784517
]
@@ -25,4 +24,6 @@ environment = [
profile-path = "/tmp/.xdg_mozLegacyHome_test/.mozilla/firefox/xdg_mozLegacyHome_profile"
["browser_content_sandbox_fs_xdg_mozLegacyHome.js"]
-run-if = ["os == 'linux'"]
+run-if = [
+ "os == 'linux'"
+]
diff --git a/src/zen/tests/mochitests/shell/unit/test_writeShortcutIcon.js b/src/zen/tests/mochitests/shell/unit/test_writeShortcutIcon.js
new file mode 100644
index 000000000..8a05114b3
--- /dev/null
+++ b/src/zen/tests/mochitests/shell/unit/test_writeShortcutIcon.js
@@ -0,0 +1,72 @@
+/* Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+ChromeUtils.defineESModuleGetters(this, {
+ FileTestUtils: "resource://testing-common/FileTestUtils.sys.mjs",
+ ShellService: "moz-src:///browser/components/shell/ShellService.sys.mjs",
+ XPCOMUtils: "resource://gre/modules/XPCOMUtils.sys.mjs",
+});
+
+XPCOMUtils.defineLazyServiceGetters(this, {
+ imgTools: ["@mozilla.org/image/tools;1", Ci.imgITools],
+});
+
+let gPngImage;
+let gSvgImage;
+
+add_setup(async function loadImages() {
+ let pngFile = do_get_file("favicon-normal16.png");
+ gPngImage = imgTools.decodeImageFromArrayBuffer(
+ (await IOUtils.read(pngFile.path)).buffer,
+ "image/png"
+ );
+
+ let svgFile = do_get_file("icon.svg");
+ let svgUri = Services.io.newFileURI(svgFile);
+ let svgChannel = Services.io.newChannelFromURI(
+ svgUri,
+ null,
+ Services.scriptSecurityManager.getSystemPrincipal(),
+ null,
+ Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_SEC_CONTEXT_IS_NULL,
+ Ci.nsIContentPolicy.TYPE_IMAGE
+ );
+ gSvgImage = await ChromeUtils.fetchDecodedImage(svgUri, svgChannel);
+});
+
+/**
+ * Ensures that the file is an ICO file with the correct dimensions.
+ *
+ * Currently, this doesn't actually check the file's image data, since that's
+ * (a) difficult to do from JavaScript for raster files (especially given the
+ * scaling) and (b) not easy in general for vector files without just rewriting
+ * createWindowsIcon inline.
+ *
+ * @param {nsIFile} file - The file containing the image.
+ */
+async function verifyOutput(file) {
+ let image = imgTools.decodeImageFromArrayBuffer(
+ (await IOUtils.read(file.path)).buffer,
+ "image/vnd.microsoft.icon"
+ );
+
+ ok(image, "Image decoded successfully from its native format");
+ Assert.equal(image.width, 256, "Image is 256 pixels wide");
+ Assert.equal(image.height, 256, "Image is 256 pixels tall");
+}
+
+add_task(async function test_iconDimensions_raster() {
+ let tempFile = FileTestUtils.getTempFile();
+ await ShellService.createWindowsIcon(tempFile, gPngImage);
+ await verifyOutput(tempFile);
+ await IOUtils.remove(tempFile.path);
+});
+
+add_task(async function test_iconDimensions_vector() {
+ let tempFile = FileTestUtils.getTempFile();
+ await ShellService.createWindowsIcon(tempFile, gSvgImage);
+ await verifyOutput(tempFile);
+ await IOUtils.remove(tempFile.path);
+});
diff --git a/src/zen/tests/mochitests/shell/unit/xpcshell.toml b/src/zen/tests/mochitests/shell/unit/xpcshell.toml
index 563a940e2..8f339f132 100644
--- a/src/zen/tests/mochitests/shell/unit/xpcshell.toml
+++ b/src/zen/tests/mochitests/shell/unit/xpcshell.toml
@@ -9,3 +9,12 @@ tags = "os_integration"
run-if = [
"os == 'mac'",
]
+
+["test_writeShortcutIcon.js"]
+run-if = [
+ "os == 'win'",
+]
+support-files = [
+ "../../../places/tests/browser/favicon-normal16.png",
+ "../../../../base/content/test/favicons/icon.svg",
+]
diff --git a/src/zen/toolkit/common/ZenCommonUtils.h b/src/zen/toolkit/common/ZenCommonUtils.h
index d940d0286..48cc03a6e 100644
--- a/src/zen/toolkit/common/ZenCommonUtils.h
+++ b/src/zen/toolkit/common/ZenCommonUtils.h
@@ -2,8 +2,8 @@
* 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/. */
-#ifndef mozilla_nsZenCommonUtils_h__
-#define mozilla_nsZenCommonUtils_h__
+#ifndef mozilla_nsZenCommonUtils_h_
+#define mozilla_nsZenCommonUtils_h_
#include "nsIZenCommonUtils.h"
diff --git a/src/zen/toolkit/common/ZenShareInternal.h b/src/zen/toolkit/common/ZenShareInternal.h
index c3c53f5b7..41046942f 100644
--- a/src/zen/toolkit/common/ZenShareInternal.h
+++ b/src/zen/toolkit/common/ZenShareInternal.h
@@ -2,8 +2,8 @@
* 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/. */
-#ifndef mozilla_nsZenShareInternal_h__
-#define mozilla_nsZenShareInternal_h__
+#ifndef mozilla_nsZenShareInternal_h_
+#define mozilla_nsZenShareInternal_h_
#include "nsIZenCommonUtils.h"
diff --git a/src/zen/urlbar/ZenUBProvider.sys.mjs b/src/zen/urlbar/ZenUBProvider.sys.mjs
index cd1d65c1e..0ff005228 100644
--- a/src/zen/urlbar/ZenUBProvider.sys.mjs
+++ b/src/zen/urlbar/ZenUBProvider.sys.mjs
@@ -2,7 +2,7 @@
* 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/. */
-import { UrlbarProvidersManager } from "moz-src:///browser/components/urlbar/UrlbarProvidersManager.sys.mjs";
+import { ProvidersManager } from "moz-src:///browser/components/urlbar/UrlbarProvidersManager.sys.mjs";
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
@@ -12,11 +12,12 @@ ChromeUtils.defineESModuleGetters(lazy, {
});
export function registerZenUrlbarProviders() {
+ let instance = ProvidersManager.getInstanceForSap("urlbar");
for (let i = 0; i < Object.keys(lazy).length; i++) {
const provider = Object.values(lazy)[i];
const name = Object.keys(lazy)[i];
- if (!UrlbarProvidersManager.getProvider(name)) {
- UrlbarProvidersManager.registerProvider(new provider());
+ if (!instance.getProvider(name)) {
+ instance.registerProvider(new provider());
}
}
}
diff --git a/src/zen/welcome/ZenWelcome.mjs b/src/zen/welcome/ZenWelcome.mjs
index 59806986b..9ccee0934 100644
--- a/src/zen/welcome/ZenWelcome.mjs
+++ b/src/zen/welcome/ZenWelcome.mjs
@@ -4,6 +4,11 @@
{
let _tabsToPinEssentials = [];
+ let lazy = {};
+
+ ChromeUtils.defineESModuleGetters(lazy, {
+ SearchService: "moz-src:///toolkit/components/search/SearchService.sys.mjs",
+ });
const kZenElementsToIgnore = [
"zen-browser-background",
@@ -77,9 +82,6 @@
return data;
}
- /**
- *
- */
class nsZenWelcomePages {
constructor(pages) {
this._currentPage = -1;
@@ -300,16 +302,13 @@
}
}
- /**
- *
- */
class ZenSearchEngineStore {
constructor() {
this._engines = [];
}
async init() {
- const visibleEngines = await Services.search.getVisibleEngines();
+ const visibleEngines = await lazy.SearchService.getVisibleEngines();
this.initSpecificEngine(visibleEngines);
}
@@ -351,12 +350,12 @@
}
async getDefaultEngine() {
- let engineName = await Services.search.getDefault();
+ let engineName = await lazy.SearchService.getDefault();
return this.getEngineByName(engineName._name);
}
async setDefaultEngine(engine) {
- await Services.search.setDefault(
+ await lazy.SearchService.setDefault(
engine.originalEngine,
Ci.nsISearchService.CHANGE_REASON_USER
);
@@ -460,7 +459,7 @@
content.setAttribute("select-engine", "true");
- const defaultEngine = await Services.search.getDefault();
+ const defaultEngine = await lazy.SearchService.getDefault();
const promises = [];
engineStore.getEngines().forEach(engine => {
const label = document.createElement("label");
diff --git a/surfer.json b/surfer.json
index 71695cd09..28bc5aec7 100644
--- a/surfer.json
+++ b/surfer.json
@@ -6,7 +6,7 @@
"version": {
"product": "firefox",
"version": "148.0.2",
- "candidate": "148.0.2",
+ "candidate": "149.0",
"candidateBuild": 1
},
"buildOptions": {