chore: Updated to firefox 142.0, p=#9870

* chore: Updateed to firefox 142.0, b=no-bug, c=l10n, folders

* chore: Finish updating to firefox, b=no-bug, c=tabs

* chore: Fixed mods builds, b=no-bug, c=mods

* feat: Small changes to tabs layout, b=no-bug, c=tabs, compact-mode, folders, workspaces

* test: Fixed tests, b=no-bug, c=scripts, tests, folders

* test: Fixed tests, b=no-bug, c=tabs, tests, welcome
This commit is contained in:
mr. m
2025-08-13 23:21:38 +02:00
committed by GitHub
parent 2d54e9f27f
commit 199da1f824
73 changed files with 464 additions and 447 deletions

View File

@@ -30,7 +30,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 `141.0.3`! 🚀
- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 141.0.3`!
- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 142.0`!
### Contributing

View File

@@ -1 +1 @@
4a784a2037bf44d4fcacf70fd69c86ff30825ec1
aeeb12ebf5e8312e56bf0126778460f7a5fa607a

View File

@@ -3,6 +3,11 @@
# 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/.
IGNORE_FILES=(
"shared.nsh"
"ignorePrefs.json"
)
# Recursively find all .patch files in the current directory and its subdirectories
find src -type f -name "*.patch" | while read -r patch_file; do
# Replace all - with . and remove the .patch extension
@@ -17,8 +22,10 @@ find src -type f -name "*.patch" | while read -r patch_file; do
new_file="${new_file/-ftl/.ftl}"
fi
# Create the new file with the same content as the original
npm run export ${new_file} &
new_file_base=$(basename "$new_file")
if [[ ! " ${IGNORE_FILES[@]} " =~ " ${new_file_base} " ]]; then
npm run export ${new_file}
fi
done
for job in $(jobs -p); do

View File

@@ -4,10 +4,33 @@
import os
import sys
import json
from pathlib import Path
IGNORE_PREFS_FILE_IN = os.path.join(
'src', 'zen', 'tests', 'ignorePrefs.json'
)
IGNORE_PREFS_FILE_OUT = os.path.join(
'engine', 'testing', 'mochitest', 'ignorePrefs.json'
)
def copy_ignore_prefs():
print("Copying ignorePrefs.json from src/zen/tests to engine/testing/mochitest...")
# if there are prefs that dont exist on output file, copy them from input file
all_prefs = []
with open(IGNORE_PREFS_FILE_OUT, 'r') as f:
all_prefs = json.load(f)
with open(IGNORE_PREFS_FILE_IN, 'r') as f_in:
new_prefs = json.load(f_in)
all_prefs.extend(p for p in new_prefs if p not in all_prefs)
with open(IGNORE_PREFS_FILE_OUT, 'w') as f_out:
json.dump(all_prefs, f_out, indent=2)
def main():
copy_ignore_prefs()
project_root = Path(__file__).resolve().parent.parent
package_json = project_root / 'package.json'

View File

@@ -1,8 +1,8 @@
diff --git a/Cargo.lock b/Cargo.lock
index f223ba9af3edd60a42730a606aca2c48bbdddc0c..501cf2de684532203bfb2e96f8add919f3d6e739 100644
index fe4eff865884fb79983f636861897648c36491b5..a9516246ffacfd50b7e4198967bebb71b2c73eca 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4049,8 +4049,6 @@ dependencies = [
@@ -4067,8 +4067,6 @@ dependencies = [
[[package]]
name = "mime_guess"
version = "2.0.4"

View File

@@ -1,12 +1,11 @@
diff --git a/Cargo.toml b/Cargo.toml
index d402d783e2bbc30b87b2c59cf02e38b74d0484c1..b718ee7ed0519cac20d2828fee0350b44fc3f45a 100644
index c41cc4f4e68e5b30e1a290e07b2c5061db4400cc..7fa5402b32116922766ee1463b441d3fc86c1eff 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -227,6 +227,9 @@ rure = { path = "third_party/rust/rure" }
# Patch `plist` to work with `indexmap` 2.*
plist = { path = "third_party/rust/plist" }
@@ -218,6 +218,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" }
+# Patch mime_guess to add missing mime types
+mime_guess = { path = "third_party/rust/mime_guess" }
+
# Patch `unicode-width` 0.1.* to 0.2.

View File

@@ -1,5 +1,5 @@
diff --git a/browser/actors/WebRTCParent.sys.mjs b/browser/actors/WebRTCParent.sys.mjs
index 4ed2dd19207fc38b9e5cc22ea2947aba94b2f5ad..ffc88d62dc46683399c68cdfd35f1b1efde70902 100644
index 49ba7724801e699c60fac72d67b3b2d11b6c8c93..5a9f209b3e6b625c6346083ab7eace552a81a3b4 100644
--- a/browser/actors/WebRTCParent.sys.mjs
+++ b/browser/actors/WebRTCParent.sys.mjs
@@ -152,6 +152,7 @@ export class WebRTCParent extends JSWindowActorParent {

View File

@@ -1,5 +1,5 @@
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
index 8e839c497bba9de04948ad8759679b6a6f61a65f..d79bd14443d94b91309f0add133e35ab87d7fbf3 100644
index 05f6aec3dac31231e15cb316f6e06d66ee87bea9..3bbbe8553777056798ea9ddce1744a8e48848a37 100644
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -29,6 +29,7 @@ ChromeUtils.defineESModuleGetters(this, {
@@ -10,7 +10,7 @@ index 8e839c497bba9de04948ad8759679b6a6f61a65f..d79bd14443d94b91309f0add133e35ab
DevToolsSocketStatus:
"resource://devtools/shared/security/DevToolsSocketStatus.sys.mjs",
DownloadUtils: "resource://gre/modules/DownloadUtils.sys.mjs",
@@ -2282,6 +2283,8 @@ var XULBrowserWindow = {
@@ -2287,6 +2288,8 @@ var XULBrowserWindow = {
AboutReaderParent.updateReaderButton(gBrowser.selectedBrowser);
TranslationsParent.onLocationChange(gBrowser.selectedBrowser);
@@ -19,7 +19,7 @@ index 8e839c497bba9de04948ad8759679b6a6f61a65f..d79bd14443d94b91309f0add133e35ab
PictureInPicture.updateUrlbarToggle(gBrowser.selectedBrowser);
if (!gMultiProcessBrowser) {
@@ -4617,7 +4620,7 @@ function switchToTabHavingURI(
@@ -4630,7 +4633,7 @@ function switchToTabHavingURI(
ignoreQueryString || replaceQueryString,
ignoreFragmentWhenComparing
);
@@ -28,7 +28,7 @@ index 8e839c497bba9de04948ad8759679b6a6f61a65f..d79bd14443d94b91309f0add133e35ab
for (let i = 0; i < browsers.length; i++) {
let browser = browsers[i];
let browserCompare = cleanURL(
@@ -4660,7 +4663,7 @@ function switchToTabHavingURI(
@@ -4673,7 +4676,7 @@ function switchToTabHavingURI(
}
if (!doAdopt) {
@@ -37,7 +37,7 @@ index 8e839c497bba9de04948ad8759679b6a6f61a65f..d79bd14443d94b91309f0add133e35ab
}
return true;
@@ -5476,6 +5479,9 @@ var ConfirmationHint = {
@@ -5489,6 +5492,9 @@ var ConfirmationHint = {
MozXULElement.insertFTLIfNeeded("toolkit/branding/brandings.ftl");
MozXULElement.insertFTLIfNeeded("browser/confirmationHints.ftl");
document.l10n.setAttributes(this._message, messageId, options.l10nArgs);

View File

@@ -1,8 +1,8 @@
diff --git a/browser/base/content/nsContextMenu.sys.mjs b/browser/base/content/nsContextMenu.sys.mjs
index e5ae99edff6cef4964ff15a7d32b0f9c80625425..6b7b6e75c76b25319334113bf2f17817f67e1073 100644
index b12427b3c23447ab26499120f8395c716dae9e82..934f5c1f1b38d035cd7d3a5253a8d3cecad385f8 100644
--- a/browser/base/content/nsContextMenu.sys.mjs
+++ b/browser/base/content/nsContextMenu.sys.mjs
@@ -1050,6 +1050,8 @@ export class nsContextMenu {
@@ -1054,6 +1054,8 @@ export class nsContextMenu {
!this.isSecureAboutPage()
);

View File

@@ -5,7 +5,10 @@
<panel id="zen-folder-tabs-popup" type="arrow" orient="vertical">
<hbox class="tabs-list-header">
<image class="zen-folder-tabs-list-search-icon" src="chrome://global/skin/icons/search-glass.svg"/>
<html:input id="zen-folder-tabs-list-search" data-l10n-id="zen-folders-search-placeholder" type="search"/>
<html:input id="zen-folder-tabs-list-search"
data-l10n-id="zen-folders-search-placeholder"
data-l10n-args="{&quot;folder-name&quot;:&quot;&quot;}"
type="search" />
</hbox>
<scrollbox class="zen-folder-tabs-list-scrollbox" flex="1">
<vbox id="zen-folder-tabs-list"></vbox>

View File

@@ -45,4 +45,3 @@
<menuseparator />
<menuitem id="context_zenFolderDelete" data-l10n-id="zen-folders-panel-delete-folder"/>
</menupopup>

View File

@@ -1,8 +1,8 @@
diff --git a/browser/base/jar.mn b/browser/base/jar.mn
index ad10fe2c55c422090ebfc3989ca6858c1d958a10..0ff76c3bd768b2b337683a35f8dbd197f421905c 100644
index f5a94b47c95304399bce8159dd9fb5d2911ea60a..f63cb861e8807294d597a341ddb408f236ee2df2 100644
--- a/browser/base/jar.mn
+++ b/browser/base/jar.mn
@@ -105,3 +105,5 @@ browser.jar:
@@ -106,3 +106,5 @@ browser.jar:
# L10n resources and overrides.
% override chrome://global/locale/appstrings.properties chrome://browser/locale/appstrings.properties

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/BrowserContentHandler.sys.mjs b/browser/components/BrowserContentHandler.sys.mjs
index 415d1d52507e0710a3c1daa5864618527b162100..f420fcb8db2ed6f33eb3b38ec9bd213809aa74c3 100644
index 81f72563b93b9ce77191ad4cf200489222e0122e..40bc484301b3d66542c4171921f527c2ac6ed047 100644
--- a/browser/components/BrowserContentHandler.sys.mjs
+++ b/browser/components/BrowserContentHandler.sys.mjs
@@ -1276,6 +1276,7 @@ function maybeRecordToHandleTelemetry(uri, isLaunch) {

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/BrowserGlue.sys.mjs b/browser/components/BrowserGlue.sys.mjs
index 05a5063427e4038b3d57f6f5bae31b60428c7880..a01e25b52ffc3a68dddb513cb085b7df726d15b0 100644
index f3253d2565cf735bdf33792697f91db9ca9ba5e9..5a6a62e3de3d510a3ae514773e6f8886ef8f9a09 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 05a5063427e4038b3d57f6f5bae31b60428c7880..a01e25b52ffc3a68dddb513cb085b7df
AboutHomeStartupCache: "resource:///modules/AboutHomeStartupCache.sys.mjs",
AWToolbarButton: "resource:///modules/aboutwelcome/AWToolbarUtils.sys.mjs",
ASRouter: "resource:///modules/asrouter/ASRouter.sys.mjs",
@@ -1496,7 +1497,7 @@ BrowserGlue.prototype = {
@@ -1490,7 +1491,7 @@ BrowserGlue.prototype = {
windowcount++;
let tabbrowser = win.gBrowser;
if (tabbrowser) {
@@ -19,7 +19,7 @@ index 05a5063427e4038b3d57f6f5bae31b60428c7880..a01e25b52ffc3a68dddb513cb085b7df
}
}
@@ -1659,6 +1660,8 @@ BrowserGlue.prototype = {
@@ -1653,6 +1654,8 @@ BrowserGlue.prototype = {
} else if (profileDataVersion < APP_DATA_VERSION) {
lazy.ProfileDataUpgrader.upgrade(profileDataVersion, APP_DATA_VERSION);
}

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/search/SearchOneOffs.sys.mjs b/browser/components/search/SearchOneOffs.sys.mjs
index 23808139bc885c5e6457b3e4be0b1727c0f3bbf9..472fdbe863db5725d01af903b69a479b9edc3244 100644
index 3930862215a667e223f1bf6959dcf1c08421b37d..68d767b6d8490a374973eb86a032a6386879fd93 100644
--- a/browser/components/search/SearchOneOffs.sys.mjs
+++ b/browser/components/search/SearchOneOffs.sys.mjs
@@ -455,7 +455,7 @@ export class SearchOneOffs {
@@ -466,7 +466,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;

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/search/SearchUIUtils.sys.mjs b/browser/components/search/SearchUIUtils.sys.mjs
index 3666beb83bc50e80fa8848f18aaeb6545d5ff8a7..0566fc87e90531456e78bc6c33a0696f0aff6cb3 100644
index dfd18da85323751c4be7963cb5ab2357de488d83..e228bf594a0a736396cabd247bac4033091afccc 100644
--- a/browser/components/search/SearchUIUtils.sys.mjs
+++ b/browser/components/search/SearchUIUtils.sys.mjs
@@ -412,7 +412,7 @@ export var SearchUIUtils = {

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs
index be029379c101a0105d4837136e064e6007b67c3e..cfa861920b15c2f535f1d9351425e29ee03bbdda 100644
index e954a8df26ed84731b08b151f90a758206946582..5b8013c71c6b50579668d16a5f7d5a82b5d43e4d 100644
--- a/browser/components/sessionstore/SessionStore.sys.mjs
+++ b/browser/components/sessionstore/SessionStore.sys.mjs
@@ -2120,7 +2120,6 @@ var SessionStoreInternal = {
@@ -2135,7 +2135,6 @@ var SessionStoreInternal = {
if (closedWindowState) {
let newWindowState;
if (
@@ -10,7 +10,7 @@ index be029379c101a0105d4837136e064e6007b67c3e..cfa861920b15c2f535f1d9351425e29e
!lazy.SessionStartup.willRestore()
) {
// We want to split the window up into pinned tabs and unpinned tabs.
@@ -2353,11 +2352,9 @@ var SessionStoreInternal = {
@@ -2368,11 +2367,9 @@ var SessionStoreInternal = {
tabbrowser.selectedTab.label;
}
@@ -22,7 +22,7 @@ index be029379c101a0105d4837136e064e6007b67c3e..cfa861920b15c2f535f1d9351425e29e
// Store the window's close date to figure out when each individual tab
// was closed. This timestamp should allow re-arranging data based on how
@@ -3303,7 +3300,7 @@ var SessionStoreInternal = {
@@ -3357,7 +3354,7 @@ var SessionStoreInternal = {
if (!isPrivateWindow && tabState.isPrivate) {
return;
}
@@ -31,7 +31,7 @@ index be029379c101a0105d4837136e064e6007b67c3e..cfa861920b15c2f535f1d9351425e29e
return;
}
@@ -4012,6 +4009,11 @@ var SessionStoreInternal = {
@@ -4069,6 +4066,11 @@ var SessionStoreInternal = {
Math.min(tabState.index, tabState.entries.length)
);
tabState.pinned = false;
@@ -43,7 +43,7 @@ index be029379c101a0105d4837136e064e6007b67c3e..cfa861920b15c2f535f1d9351425e29e
if (inBackground === false) {
aWindow.gBrowser.selectedTab = newTab;
@@ -4448,6 +4450,7 @@ var SessionStoreInternal = {
@@ -4505,6 +4507,7 @@ var SessionStoreInternal = {
// Append the tab if we're opening into a different window,
tabIndex: aSource == aTargetWindow ? pos : Infinity,
pinned: state.pinned,
@@ -51,7 +51,7 @@ index be029379c101a0105d4837136e064e6007b67c3e..cfa861920b15c2f535f1d9351425e29e
userContextId: state.userContextId,
skipLoad: true,
preferredRemoteType,
@@ -5303,7 +5306,7 @@ var SessionStoreInternal = {
@@ -5360,7 +5363,7 @@ var SessionStoreInternal = {
for (let i = tabbrowser.pinnedTabCount; i < tabbrowser.tabs.length; i++) {
let tab = tabbrowser.tabs[i];
@@ -60,7 +60,7 @@ index be029379c101a0105d4837136e064e6007b67c3e..cfa861920b15c2f535f1d9351425e29e
removableTabs.push(tab);
}
}
@@ -5363,7 +5366,7 @@ var SessionStoreInternal = {
@@ -5420,7 +5423,7 @@ var SessionStoreInternal = {
}
let workspaceID = aWindow.getWorkspaceID();
@@ -69,7 +69,7 @@ index be029379c101a0105d4837136e064e6007b67c3e..cfa861920b15c2f535f1d9351425e29e
winData.workspaceID = workspaceID;
}
},
@@ -5554,11 +5557,12 @@ var SessionStoreInternal = {
@@ -5611,11 +5614,12 @@ var SessionStoreInternal = {
}
let tabbrowser = aWindow.gBrowser;
@@ -83,7 +83,7 @@ index be029379c101a0105d4837136e064e6007b67c3e..cfa861920b15c2f535f1d9351425e29e
// update the internal state data for this window
for (let tab of tabs) {
if (tab == aWindow.FirefoxViewHandler.tab) {
@@ -5569,6 +5573,7 @@ var SessionStoreInternal = {
@@ -5626,6 +5630,7 @@ var SessionStoreInternal = {
tabsData.push(tabData);
}
@@ -91,7 +91,7 @@ index be029379c101a0105d4837136e064e6007b67c3e..cfa861920b15c2f535f1d9351425e29e
// update tab group state for this window
winData.groups = [];
for (let tabGroup of aWindow.gBrowser.tabGroups) {
@@ -5581,7 +5586,7 @@ var SessionStoreInternal = {
@@ -5638,7 +5643,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) {
@@ -100,7 +100,7 @@ index be029379c101a0105d4837136e064e6007b67c3e..cfa861920b15c2f535f1d9351425e29e
winData.title = tabbrowser.tabs[0].label;
}
winData.selected = selectedIndex;
@@ -5693,8 +5698,8 @@ var SessionStoreInternal = {
@@ -5750,8 +5755,8 @@ var SessionStoreInternal = {
// selectTab represents.
let selectTab = 0;
if (overwriteTabs) {
@@ -111,7 +111,7 @@ index be029379c101a0105d4837136e064e6007b67c3e..cfa861920b15c2f535f1d9351425e29e
selectTab = Math.min(selectTab, winData.tabs.length);
}
@@ -5737,6 +5742,8 @@ var SessionStoreInternal = {
@@ -5794,6 +5799,8 @@ var SessionStoreInternal = {
winData.tabs,
winData.groups ?? []
);
@@ -120,7 +120,7 @@ index be029379c101a0105d4837136e064e6007b67c3e..cfa861920b15c2f535f1d9351425e29e
this._log.debug(
`restoreWindow, createTabsForSessionRestore returned ${tabs.length} tabs`
);
@@ -6286,6 +6293,22 @@ var SessionStoreInternal = {
@@ -6351,6 +6358,22 @@ var SessionStoreInternal = {
// Most of tabData has been restored, now continue with restoring
// attributes that may trigger external events.

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/tab.js b/browser/components/tabbrowser/content/tab.js
index e5509953509c4da8756e36a0792f76814e24ba0c..32e21e1295aa508a2b8dc6b8a0ea4d678dd81594 100644
index f261f0f2c7945cbdb41e5d1b6067a8db38bef117..32e21e1295aa508a2b8dc6b8a0ea4d678dd81594 100644
--- a/browser/components/tabbrowser/content/tab.js
+++ b/browser/components/tabbrowser/content/tab.js
@@ -21,6 +21,7 @@
@@ -42,11 +42,13 @@ index e5509953509c4da8756e36a0792f76814e24ba0c..32e21e1295aa508a2b8dc6b8a0ea4d67
return;
}
@@ -224,7 +227,19 @@
@@ -224,9 +227,19 @@
}
get visible() {
- return this.isOpen && !this.hidden && !this.group?.collapsed;
- return (
- this.isOpen && !this.hidden && (!this.group?.collapsed || this.selected)
- );
+ if (!this.isOpen || this.hidden || this.hasAttribute("zen-empty-tab")) {
+ return false;
+ }
@@ -63,7 +65,7 @@ index e5509953509c4da8756e36a0792f76814e24ba0c..32e21e1295aa508a2b8dc6b8a0ea4d67
}
get hidden() {
@@ -295,7 +310,7 @@
@@ -297,7 +310,7 @@
return false;
}
@@ -72,7 +74,7 @@ index e5509953509c4da8756e36a0792f76814e24ba0c..32e21e1295aa508a2b8dc6b8a0ea4d67
}
get lastAccessed() {
@@ -372,8 +387,11 @@
@@ -374,8 +387,11 @@
}
get group() {
@@ -86,7 +88,7 @@ index e5509953509c4da8756e36a0792f76814e24ba0c..32e21e1295aa508a2b8dc6b8a0ea4d67
}
return null;
}
@@ -467,6 +485,8 @@
@@ -469,6 +485,8 @@
this.style.MozUserFocus = "ignore";
} else if (
event.target.classList.contains("tab-close-button") ||
@@ -95,7 +97,7 @@ index e5509953509c4da8756e36a0792f76814e24ba0c..32e21e1295aa508a2b8dc6b8a0ea4d67
event.target.classList.contains("tab-icon-overlay") ||
event.target.classList.contains("tab-audio-button")
) {
@@ -521,6 +541,10 @@
@@ -523,6 +541,10 @@
this.style.MozUserFocus = "";
}
@@ -106,7 +108,7 @@ index e5509953509c4da8756e36a0792f76814e24ba0c..32e21e1295aa508a2b8dc6b8a0ea4d67
on_click(event) {
if (event.button != 0) {
return;
@@ -569,6 +593,7 @@
@@ -571,6 +593,7 @@
)
);
} else {
@@ -114,7 +116,7 @@ index e5509953509c4da8756e36a0792f76814e24ba0c..32e21e1295aa508a2b8dc6b8a0ea4d67
gBrowser.removeTab(this, {
animate: true,
triggeringEvent: event,
@@ -581,6 +606,14 @@
@@ -583,6 +606,14 @@
// (see tabbrowser-tabs 'click' handler).
gBrowser.tabContainer._blockDblClick = true;
}
@@ -129,7 +131,7 @@ index e5509953509c4da8756e36a0792f76814e24ba0c..32e21e1295aa508a2b8dc6b8a0ea4d67
}
on_dblclick(event) {
@@ -604,6 +637,8 @@
@@ -606,6 +637,8 @@
animate: true,
triggeringEvent: event,
});

View File

@@ -1,14 +1,11 @@
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
index 96fd8acdc0..a8abf1597f 100644
index d80a66a01002e78a9c65545d08fe786328ddf124..5c784c911fcd30353744a79caad9bb42b1257c3f 100644
--- a/browser/components/tabbrowser/content/tabbrowser.js
+++ b/browser/components/tabbrowser/content/tabbrowser.js
@@ -422,15 +422,60 @@
return this.tabContainer.visibleTabs;
}
- get pinnedTabCount() {
- for (var i = 0; i < this.tabs.length; i++) {
- if (!this.tabs[i].pinned) {
+ get _numVisiblePinTabsWithoutCollapsed() {
+ let i = 0;
+ for (let item of this.tabContainer.ariaFocusableItems) {
@@ -17,15 +14,15 @@ index 96fd8acdc0..a8abf1597f 100644
+ continue;
+ }
+ if (!item.pinned && !item.hasAttribute("zen-glance-tab")) {
break;
}
+ break;
+ }
+ if (item.visible) {
+ i += !item.hasAttribute("zen-glance-tab");
+ }
}
return i;
}
+ }
+ return i;
+ }
+
+ ungroupTabsUntilNoActive(tab) {
+ if (!tab || !tab.group) return;
+ const activeGroups = tab.group.activeGroups;
@@ -48,17 +45,19 @@ index 96fd8acdc0..a8abf1597f 100644
+ return i;
+ }
+
+ get pinnedTabCount() {
get pinnedTabCount() {
- for (var i = 0; i < this.tabs.length; i++) {
- if (!this.tabs[i].pinned) {
+ let i = 0;
+ for (let tab of this.tabs) {
+ if (!tab.pinned && !tab.hasAttribute("zen-glance-tab")) {
+ break;
+ }
break;
}
+ i += !tab.hasAttribute("zen-glance-tab");
+ }
+ return i;
+ }
+
}
return i;
}
+ get tabsWithoutGlance() {
+ return this.tabs.filter(tab => !tab.hasAttribute("zen-glance-tab"));
+ }
@@ -294,7 +293,7 @@ index 96fd8acdc0..a8abf1597f 100644
}
if (!color) {
@@ -3040,9 +3132,14 @@
@@ -3040,9 +3132,13 @@
label,
isAdoptingGroup
);
@@ -304,14 +303,13 @@ index 96fd8acdc0..a8abf1597f 100644
+ }
+ group.essential = tabs.some(tab => tab.hasAttribute("essential"));
+ group.pinned = group.essential || tabs.some(tab => tab.pinned);
+ if (forSplitView) insertBefore = insertBefore.group;
+ insertBefore.before(
group,
- insertBefore?.group ?? insertBefore
);
group.addTabs(tabs);
@@ -3163,7 +3260,7 @@
@@ -3163,7 +3259,7 @@
}
this.#handleTabMove(tab, () =>
@@ -320,7 +318,7 @@ index 96fd8acdc0..a8abf1597f 100644
);
}
@@ -3357,6 +3454,7 @@
@@ -3365,6 +3461,7 @@
openWindowInfo,
skipLoad,
triggeringRemoteType,
@@ -328,7 +326,7 @@ index 96fd8acdc0..a8abf1597f 100644
}
) {
// If we don't have a preferred remote type (or it is `NOT_REMOTE`), and
@@ -3426,6 +3524,7 @@
@@ -3434,6 +3531,7 @@
openWindowInfo,
name,
skipLoad,
@@ -336,7 +334,7 @@ index 96fd8acdc0..a8abf1597f 100644
});
}
@@ -3613,7 +3712,7 @@
@@ -3621,7 +3719,7 @@
// Add a new tab if needed.
if (!tab) {
let createLazyBrowser =
@@ -345,7 +343,7 @@ index 96fd8acdc0..a8abf1597f 100644
let url = "about:blank";
if (tabData.entries?.length) {
@@ -3650,8 +3749,10 @@
@@ -3658,8 +3756,10 @@
insertTab: false,
skipLoad: true,
preferredRemoteType,
@@ -357,7 +355,7 @@ index 96fd8acdc0..a8abf1597f 100644
if (select) {
tabToSelect = tab;
}
@@ -3663,7 +3764,8 @@
@@ -3671,7 +3771,8 @@
this.pinTab(tab);
// Then ensure all the tab open/pinning information is sent.
this._fireTabOpen(tab, {});
@@ -367,7 +365,7 @@ index 96fd8acdc0..a8abf1597f 100644
let { groupId } = tabData;
const tabGroup = tabGroupWorkingData.get(groupId);
// if a tab refers to a tab group we don't know, skip any group
@@ -3677,7 +3779,10 @@
@@ -3685,7 +3786,10 @@
tabGroup.stateData.id,
tabGroup.stateData.color,
tabGroup.stateData.collapsed,
@@ -379,7 +377,7 @@ index 96fd8acdc0..a8abf1597f 100644
);
tabsFragment.appendChild(tabGroup.node);
}
@@ -3722,9 +3827,23 @@
@@ -3730,9 +3834,23 @@
// to remove the old selected tab.
if (tabToSelect) {
let leftoverTab = this.selectedTab;
@@ -395,15 +393,15 @@ index 96fd8acdc0..a8abf1597f 100644
+ gZenWorkspaces._initialTab._shouldRemove = true;
+ }
+ }
}
+ }
+ else {
+ gZenWorkspaces._tabToRemoveForEmpty = this.selectedTab;
+ }
}
+ this._hasAlreadyInitializedZenSessionStore = true;
if (tabs.length > 1 || !tabs[0].selected) {
this._updateTabsAfterInsert();
@@ -3919,7 +4038,7 @@
@@ -3927,7 +4045,7 @@
// Ensure we have an index if one was not provided.
if (typeof elementIndex != "number" && typeof tabIndex != "number") {
// Move the new tab after another tab if needed, to the end otherwise.
@@ -412,7 +410,7 @@ index 96fd8acdc0..a8abf1597f 100644
if (
!bulkOrderedOpen &&
((openerTab &&
@@ -3931,7 +4050,7 @@
@@ -3939,7 +4057,7 @@
let lastRelatedTab =
openerTab && this._lastRelatedTabMap.get(openerTab);
let previousTab = lastRelatedTab || openerTab || this.selectedTab;
@@ -421,7 +419,7 @@ index 96fd8acdc0..a8abf1597f 100644
tabGroup = previousTab.group;
}
if (
@@ -3942,7 +4061,7 @@
@@ -3950,7 +4068,7 @@
) {
elementIndex = Infinity;
} else if (previousTab.visible) {
@@ -430,7 +428,7 @@ index 96fd8acdc0..a8abf1597f 100644
} else if (previousTab == FirefoxViewHandler.tab) {
elementIndex = 0;
}
@@ -3970,14 +4089,14 @@
@@ -3978,14 +4096,14 @@
}
// Ensure index is within bounds.
if (tab.pinned) {
@@ -447,9 +445,9 @@ index 96fd8acdc0..a8abf1597f 100644
- let itemAfter = allItems.at(index);
+ let itemAfter = gZenGlanceManager.getTabOrGlanceParent(allItems.at(index));
// Prevent a flash of unstyled content by setting up the tab content
// and inherited attributes before appending it (see Bug 1592054):
@@ -3985,7 +4104,7 @@
if (pinned && !itemAfter?.pinned) {
itemAfter = null;
@@ -3996,7 +4114,7 @@
this.tabContainer._invalidateCachedTabs();
@@ -458,7 +456,7 @@ index 96fd8acdc0..a8abf1597f 100644
if (this.isTab(itemAfter) && itemAfter.group == tabGroup) {
// Place at the front of, or between tabs in, the same tab group
this.tabContainer.insertBefore(tab, itemAfter);
@@ -4018,6 +4137,7 @@
@@ -4032,6 +4150,7 @@
if (pinned) {
this._updateTabBarForPinnedTabs();
}
@@ -466,7 +464,7 @@ index 96fd8acdc0..a8abf1597f 100644
TabBarVisibility.update();
}
@@ -4307,6 +4427,9 @@
@@ -4321,6 +4440,9 @@
return;
}
@@ -476,7 +474,7 @@ index 96fd8acdc0..a8abf1597f 100644
this.removeTabs(selectedTabs, { isUserTriggered, telemetrySource });
}
@@ -4568,6 +4691,7 @@
@@ -4582,6 +4704,7 @@
telemetrySource,
} = {}
) {
@@ -484,7 +482,7 @@ index 96fd8acdc0..a8abf1597f 100644
// When 'closeWindowWithLastTab' pref is enabled, closing all tabs
// can be considered equivalent to closing the window.
if (
@@ -4657,6 +4781,7 @@
@@ -4671,6 +4794,7 @@
if (lastToClose) {
this.removeTab(lastToClose, aParams);
}
@@ -492,7 +490,7 @@ index 96fd8acdc0..a8abf1597f 100644
} catch (e) {
console.error(e);
}
@@ -4695,6 +4820,12 @@
@@ -4709,6 +4833,12 @@
aTab._closeTimeNoAnimTimerId = Glean.browserTabclose.timeNoAnim.start();
}
@@ -505,7 +503,7 @@ index 96fd8acdc0..a8abf1597f 100644
// Handle requests for synchronously removing an already
// asynchronously closing tab.
if (!animate && aTab.closing) {
@@ -4709,6 +4840,9 @@
@@ -4723,6 +4853,9 @@
// state).
let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width;
let isLastTab = this.#isLastTabInWindow(aTab);
@@ -515,7 +513,7 @@ index 96fd8acdc0..a8abf1597f 100644
if (
!this._beginRemoveTab(aTab, {
closeWindowFastpath: true,
@@ -4891,7 +5025,7 @@
@@ -4905,7 +5038,7 @@
closeWindowWithLastTab != null
? closeWindowWithLastTab
: !window.toolbar.visible ||
@@ -524,7 +522,7 @@ index 96fd8acdc0..a8abf1597f 100644
if (closeWindow) {
// We've already called beforeunload on all the relevant tabs if we get here,
@@ -4915,6 +5049,7 @@
@@ -4929,6 +5062,7 @@
newTab = true;
}
@@ -532,18 +530,22 @@ index 96fd8acdc0..a8abf1597f 100644
aTab._endRemoveArgs = [closeWindow, newTab];
// swapBrowsersAndCloseOther will take care of closing the window without animation.
@@ -4955,9 +5090,7 @@
@@ -4969,13 +5103,7 @@
aTab._mouseleave();
if (newTab) {
- this.addTrustedTab(BROWSER_NEW_TAB_URL, {
- skipAnimation: true,
- // In the event that insertAfterCurrent is set and the current tab is
- // inside a group that is being closed we want to avoid creating the
- // new tab inside that group.
- tabIndex: 0,
- });
+ gZenWorkspaces.selectEmptyTab(BROWSER_NEW_TAB_URL);
} else {
TabBarVisibility.update();
}
@@ -5090,6 +5223,7 @@
@@ -5108,6 +5236,7 @@
this.tabs[i]._tPos = i;
}
@@ -551,7 +553,7 @@ index 96fd8acdc0..a8abf1597f 100644
if (!this._windowIsClosing) {
// update tab close buttons state
this.tabContainer._updateCloseButtons();
@@ -5302,6 +5436,7 @@
@@ -5320,6 +5449,7 @@
}
let excludeTabs = new Set(aExcludeTabs);
@@ -559,7 +561,7 @@ index 96fd8acdc0..a8abf1597f 100644
// If this tab has a successor, it should be selectable, since
// hiding or closing a tab removes that tab as a successor.
@@ -5314,13 +5449,13 @@
@@ -5332,13 +5462,13 @@
!excludeTabs.has(aTab.owner) &&
Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose")
) {
@@ -575,7 +577,7 @@ index 96fd8acdc0..a8abf1597f 100644
);
let tab = this.tabContainer.findNextTab(aTab, {
@@ -5336,7 +5471,7 @@
@@ -5354,7 +5484,7 @@
}
if (tab) {
@@ -584,7 +586,7 @@ index 96fd8acdc0..a8abf1597f 100644
}
// If no qualifying visible tab was found, see if there is a tab in
@@ -5357,7 +5492,7 @@
@@ -5375,7 +5505,7 @@
});
}
@@ -593,7 +595,7 @@ index 96fd8acdc0..a8abf1597f 100644
}
_blurTab(aTab) {
@@ -5759,10 +5894,10 @@
@@ -5777,10 +5907,10 @@
SessionStore.deleteCustomTabValue(aTab, "hiddenBy");
}
@@ -606,7 +608,7 @@ index 96fd8acdc0..a8abf1597f 100644
aTab.selected ||
aTab.closing ||
// Tabs that are sharing the screen, microphone or camera cannot be hidden.
@@ -5952,7 +6087,7 @@
@@ -5972,7 +6102,7 @@
* `true` if element is a `<tab-group>`
*/
isTabGroup(element) {
@@ -615,7 +617,7 @@ index 96fd8acdc0..a8abf1597f 100644
}
/**
@@ -6029,7 +6164,7 @@
@@ -6049,7 +6179,7 @@
// Don't allow mixing pinned and unpinned tabs.
if (this.isTab(element) && element.pinned) {
@@ -624,7 +626,7 @@ index 96fd8acdc0..a8abf1597f 100644
} else {
tabIndex = Math.max(tabIndex, this.pinnedTabCount);
}
@@ -6055,10 +6190,16 @@
@@ -6075,10 +6205,16 @@
this.#handleTabMove(
element,
() => {
@@ -643,7 +645,7 @@ index 96fd8acdc0..a8abf1597f 100644
if (neighbor && this.isTab(element) && tabIndex > element._tPos) {
neighbor.after(element);
} else {
@@ -6116,22 +6257,26 @@
@@ -6136,22 +6272,26 @@
#moveTabNextTo(element, targetElement, moveBefore = false, metricsContext) {
if (this.isTabGroupLabel(targetElement)) {
targetElement = targetElement.group;
@@ -676,7 +678,7 @@ index 96fd8acdc0..a8abf1597f 100644
moveBefore = false;
} else if (!element.pinned && targetElement && targetElement.pinned) {
// If the caller asks to move an unpinned element next to a pinned
@@ -6145,14 +6290,18 @@
@@ -6165,14 +6305,18 @@
// 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.
@@ -696,7 +698,7 @@ index 96fd8acdc0..a8abf1597f 100644
element.pinned
? this.tabContainer.pinnedTabsContainer
: this.tabContainer;
@@ -6161,7 +6310,7 @@
@@ -6181,7 +6325,7 @@
element,
() => {
if (moveBefore) {
@@ -705,7 +707,7 @@ index 96fd8acdc0..a8abf1597f 100644
} else if (targetElement) {
targetElement.after(element);
} else {
@@ -6210,7 +6359,7 @@
@@ -6230,7 +6374,7 @@
if (!this.isTab(aTab)) {
throw new Error("Can only move a tab into a tab group");
}
@@ -714,7 +716,7 @@ index 96fd8acdc0..a8abf1597f 100644
return;
}
if (aTab.group && aTab.group.id === aGroup.id) {
@@ -6304,6 +6453,10 @@
@@ -6324,6 +6468,10 @@
moveActionCallback();
@@ -725,7 +727,7 @@ index 96fd8acdc0..a8abf1597f 100644
// Clear tabs cache after moving nodes because the order of tabs may have
// changed.
this.tabContainer._invalidateCachedTabs();
@@ -7198,7 +7351,7 @@
@@ -7221,7 +7369,7 @@
// preventDefault(). It will still raise the window if appropriate.
break;
}
@@ -734,7 +736,7 @@ index 96fd8acdc0..a8abf1597f 100644
window.focus();
aEvent.preventDefault();
break;
@@ -8143,6 +8296,7 @@
@@ -8166,6 +8314,7 @@
aWebProgress.isTopLevel
) {
this.mTab.setAttribute("busy", "true");
@@ -742,16 +744,16 @@ index 96fd8acdc0..a8abf1597f 100644
gBrowser._tabAttrModified(this.mTab, ["busy"]);
this.mTab._notselectedsinceload = !this.mTab.selected;
}
@@ -9108,7 +9262,7 @@ var TabContextMenu = {
@@ -9157,7 +9306,7 @@ var TabContextMenu = {
);
contextUnpinSelectedTabs.hidden =
!this.contextTab.pinned || !this.multiselected;
-
+ gZenPinnedTabManager.updatePinnedTabContextMenu(this.contextTab);
// Move Tab items
let contextMoveTabOptions = document.getElementById(
"context_moveTabOptions"
@@ -9384,6 +9538,7 @@ var TabContextMenu = {
// Build Ask Chat items
TabContextMenu.GenAI.buildTabMenu(
document.getElementById("context_askChat"),
@@ -9476,6 +9625,7 @@ var TabContextMenu = {
)
);
} else {

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/tabgroup.js b/browser/components/tabbrowser/content/tabgroup.js
index 2ed2fa02b16013e40a32391b3dba0a4301d65262..aea9fb03dbc28a524ec5a26e76510b1fda11a48c 100644
index caea196b22b4689f55780a528661d87b52f4e728..43d815218d652055378f50cb577086f3f01b681a 100644
--- a/browser/components/tabbrowser/content/tabgroup.js
+++ b/browser/components/tabbrowser/content/tabgroup.js
@@ -13,10 +13,12 @@
@@ -15,10 +15,10 @@ index 2ed2fa02b16013e40a32391b3dba0a4301d65262..aea9fb03dbc28a524ec5a26e76510b1f
+ <html:div class="tab-group-container">
+ <html:div class="zen-tab-group-start"/>
+ </html:div>
`;
/** @type {string} */
@@ -45,16 +47,22 @@
<vbox class="tab-group-overflow-count-container" pack="center">
<label class="tab-group-overflow-count" role="button" />
</vbox>
@@ -57,20 +59,27 @@
}
connectedCallback() {
@@ -38,42 +38,44 @@ index 2ed2fa02b16013e40a32391b3dba0a4301d65262..aea9fb03dbc28a524ec5a26e76510b1f
// causes the component to be repositioned in the DOM.
- this.#observeTabChanges();
// Similar to above, always set up TabSelect listener, as this gets
// removed in disconnectedCallback
this.ownerGlobal.addEventListener("TabSelect", this);
- if (this._initialized) {
- return;
- }
+ if (!this._initialized) {
+
this._initialized = true;
this.saveOnWindowClose = true;
@@ -68,12 +76,14 @@
@@ -97,11 +106,10 @@
this.#labelElement.container = gBrowser.tabContainer;
this.#labelElement.group = this;
- this.#labelElement.addEventListener("click", this);
+ this.querySelector(".tab-group-label-container").addEventListener("click", this);
+ if (!this.isZenFolder) {
this.#labelElement.addEventListener("contextmenu", e => {
e.preventDefault();
gBrowser.tabGroupMenu.openEditModal(this);
return false;
});
+ }
- this.#labelElement.addEventListener("contextmenu", e => {
- e.preventDefault();
- gBrowser.tabGroupMenu.openEditModal(this);
- return false;
- });
+ this.appendChild = function (child) {
+ this.querySelector(".tab-group-container").appendChild(child);
+ };
+
this.#updateLabelAriaAttributes();
this.#updateCollapsedAriaAttributes();
@@ -93,6 +103,11 @@
// claim that a tab group was created by adoption the first time it
@@ -127,6 +135,8 @@
// mounts after getting created by `Tabbrowser.adoptTabGroup`.
this.#wasCreatedByAdoption = false;
+ this.appendChild = function (child) {
+ this.querySelector(".tab-group-container").appendChild(child);
+ }
+ }
+ this.#observeTabChanges();
}
+ this.#observeTabChanges();
+ }
disconnectedCallback() {
@@ -123,7 +138,10 @@
resetDefaultGroupName = () => {
this.#defaultGroupName = "";
@@ -197,7 +207,10 @@
}
});
}
@@ -85,15 +87,12 @@ index 2ed2fa02b16013e40a32391b3dba0a4301d65262..aea9fb03dbc28a524ec5a26e76510b1f
}
get color() {
@@ -172,7 +190,6 @@
// always create a text node and get consistent layout.
this.setAttribute("label", val || "\u200b");
- this.dataset.tooltip = val;
this.#updateLabelAriaAttributes();
if (diff) {
@@ -244,7 +261,53 @@
@@ -338,12 +351,57 @@
tabGroupName,
})
.then(result => {
- this.dataset.tooltip = result;
});
}
get tabs() {
@@ -148,7 +147,7 @@ index 2ed2fa02b16013e40a32391b3dba0a4301d65262..aea9fb03dbc28a524ec5a26e76510b1f
}
/**
@@ -270,7 +333,7 @@
@@ -373,7 +431,7 @@
*/
addTabs(tabs, metricsContext) {
for (let tab of tabs) {
@@ -157,16 +156,16 @@ index 2ed2fa02b16013e40a32391b3dba0a4301d65262..aea9fb03dbc28a524ec5a26e76510b1f
tab.ownerGlobal.gBrowser.unpinTab(tab);
}
let tabToMove =
@@ -333,7 +396,7 @@
* @param {PointerEvent} event
@@ -437,7 +495,7 @@
*/
on_click(event) {
- if (event.target === this.#labelElement && event.button === 0) {
+ if (event.target.closest('.tab-group-label-container') && event.button === 0) {
let isToggleElement =
- event.target === this.#labelElement ||
+ event.target.closest(".tab-group-label-container") ||
event.target === this.#overflowCountLabel;
if (isToggleElement && event.button === 0) {
event.preventDefault();
this.collapsed = !this.collapsed;
gBrowser.tabGroupMenu.close();
@@ -364,5 +427,6 @@
@@ -470,5 +528,6 @@
}
}

View File

@@ -1,16 +1,8 @@
diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js
index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d784cc9da0 100644
index e47f735e4e4563c9b7537944628418d1478c068d..e8e52b56ba2eca562186512363d90e38c4d3dffe 100644
--- a/browser/components/tabbrowser/content/tabs.js
+++ b/browser/components/tabbrowser/content/tabs.js
@@ -289,6 +289,7 @@
on_TabGroupCollapse(event) {
this._invalidateCachedVisibleTabs();
this._unlockTabSizing();
+ return;
// If the user's selected tab is in the collapsing group, kick them off
// the tab. If no tabs exist outside the group, create a new one and
@@ -345,7 +346,7 @@
@@ -332,7 +332,7 @@
// and we're not hitting the scroll buttons.
if (
event.button != 0 ||
@@ -19,7 +11,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
event.composedTarget.localName == "toolbarbutton"
) {
return;
@@ -695,7 +696,7 @@
@@ -686,7 +686,7 @@
if (this.#isContainerVerticalPinnedGrid(tab)) {
// In expanded vertical mode, the max number of pinned tabs per row is dynamic
// Set this before adjusting dragged tab's position
@@ -28,14 +20,10 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
let tabsPerRow = 0;
let position = RTL_UI
? window.windowUtils.getBoundsWithoutFlushing(
@@ -777,11 +778,12 @@
@@ -773,8 +773,9 @@
if (tab.multiselected) {
this.#moveTogetherSelectedTabs(tab);
- } else if (isTabGroupLabel(tab) && !tab.group.collapsed) {
+ } else if (isTabGroupLabel(tab)) {
this._lockTabSizing();
this.#keepTabSizeLocked = true;
} else if (isTabGroupLabel(tab) && !tab.group.collapsed) {
- tab.group.collapsed = true;
- expandGroupOnDrop = true;
+ tab.group.collapsed = !tab.group.hasAttribute("split-view-group");
@@ -44,7 +32,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
}
}
@@ -879,7 +881,7 @@
@@ -872,7 +873,7 @@
? event.screenY - window.screenY - tabOffset
: event.screenY - window.screenY,
scrollPos:
@@ -53,18 +41,18 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
? this.pinnedTabsContainer.scrollPosition
: this.arrowScrollbox.scrollPosition,
screenX: event.screenX,
@@ -933,6 +935,10 @@
@@ -933,6 +934,10 @@
}
let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0);
+ if (draggedTab && effects === "move") {
+ if (draggedTab && dropEffect === "move") {
+ gZenPinnedTabManager.applyDragoverClass(event, draggedTab);
+ gZenViewSplitter.onBrowserDragEndToSplit(event);
+ }
if (
(effects == "move" || effects == "copy") &&
(dropEffect == "move" || dropEffect == "copy") &&
document == draggedTab.ownerDocument &&
@@ -1060,7 +1066,9 @@
@@ -1060,7 +1065,9 @@
isTabGroupLabel(draggedTab) &&
draggedTab._dragData?.expandGroupOnDrop
) {
@@ -72,10 +60,10 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
+ const isActive = draggedTab.group.hasAttribute("has-active");
+ draggedTab.group.collapsed = isActive;
+ if (isActive) gZenFolders.expandVisibleTab(draggedTab.group);
this.#keepTabSizeLocked = false;
this._unlockTabSizing();
}
@@ -1089,6 +1097,18 @@
}
@@ -1096,6 +1103,18 @@
this._tabDropIndicator.hidden = true;
event.stopPropagation();
@@ -94,15 +82,21 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
if (draggedTab && dropEffect == "copy") {
let duplicatedDraggedTab;
let duplicatedTabs = [];
@@ -1127,11 +1147,12 @@
newTranslateY -= tabHeight;
@@ -1120,8 +1139,9 @@
let translateOffsetY = oldTranslateY % tabHeight;
let newTranslateX = oldTranslateX - translateOffsetX;
let newTranslateY = oldTranslateY - translateOffsetY;
- let isPinned = draggedTab.pinned;
- let numPinned = gBrowser.pinnedTabCount;
+ let isPinned = draggedTab?.group ? draggedTab.group.pinned : draggedTab.pinned;
+ let numPinned = gBrowser._numVisiblePinTabsWithoutCollapsed;
+ let essential = draggedTab.hasAttribute("zen-essential");
if (this.#isContainerVerticalPinnedGrid(draggedTab)) {
// Update both translate axis for pinned vertical expanded tabs
@@ -1137,8 +1157,8 @@
}
} else {
- let isPinned = draggedTab.pinned;
- let numPinned = gBrowser.pinnedTabCount;
+ let isPinned = draggedTab?.group ? draggedTab.group.pinned : draggedTab.pinned;
+ let numPinned = gBrowser._numVisiblePinTabsWithoutCollapsed;
+ let essential = draggedTab.hasAttribute("zen-essential");
let tabs = this.ariaFocusableItems.slice(
- isPinned ? 0 : numPinned,
- isPinned ? numPinned : undefined
@@ -111,15 +105,29 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
);
let size = this.verticalMode ? "height" : "width";
let screenAxis = this.verticalMode ? "screenY" : "screenX";
@@ -1181,6 +1202,7 @@
@@ -1179,11 +1199,9 @@
}
let shouldPin =
- numPinned &&
- this.pinnedTabsContainer.contains(event.target) &&
- !draggedTab.pinned;
+ false;
let shouldUnpin =
- this.arrowScrollbox.contains(event.target) && draggedTab.pinned;
+ false;
let shouldTranslate =
!gReduceMotion &&
!shouldCreateGroupOnDrop &&
@@ -1196,6 +1214,7 @@
(oldTranslateY && oldTranslateY != newTranslateY);
} else if (this.verticalMode) {
shouldTranslate &&= oldTranslateY && oldTranslateY != newTranslateY;
+ shouldTranslate = false; // TODO: Find a way to animate vertical tab moves.
+ shouldTranslate = false;
} else {
shouldTranslate &&= oldTranslateX && oldTranslateX != newTranslateX;
}
@@ -1349,6 +1371,7 @@
@@ -1379,6 +1398,7 @@
let nextItem = this.ariaFocusableItems[newIndex];
let tabGroup = isTab(nextItem) && nextItem.group;
@@ -127,7 +135,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
gBrowser.loadTabs(urls, {
inBackground,
replace,
@@ -1381,6 +1404,17 @@
@@ -1411,6 +1431,17 @@
this.finishMoveTogetherSelectedTabs(draggedTab);
this.finishAnimateTabMove();
@@ -142,10 +150,10 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
+ if (gZenViewSplitter._lastOpenedTab) gZenViewSplitter._lastOpenedTab._visuallySelected = false;
+ }
+
this.#keepTabSizeLocked = false;
this._unlockTabSizing();
this.#expandGroupOnDrop(draggedTab);
if (
@@ -1607,7 +1641,7 @@
@@ -1640,7 +1671,7 @@
}
get newTabButton() {
@@ -154,7 +162,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
}
get verticalMode() {
@@ -1623,6 +1657,7 @@
@@ -1656,6 +1687,7 @@
}
get overflowing() {
@@ -162,7 +170,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
return this.hasAttribute("overflow");
}
@@ -1631,26 +1666,54 @@
@@ -1664,26 +1696,54 @@
if (this.#allTabs) {
return this.#allTabs;
}
@@ -224,7 +232,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
}
/**
@@ -1717,33 +1780,27 @@
@@ -1750,32 +1810,27 @@
let elementIndex = 0;
@@ -243,17 +251,18 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
} else if (isTabGroup(child)) {
child.labelElement.elementIndex = elementIndex++;
focusableItems.push(child.labelElement);
- if (!child.collapsed) {
- let visibleTabsInGroup = child.tabs.filter(tab => tab.visible);
- visibleTabsInGroup.forEach(tab => {
-
- let visibleTabsInGroup = child.tabs.filter(tab => tab.visible);
- visibleTabsInGroup.forEach(tab => {
- tab.elementIndex = elementIndex++;
- });
+ if (!child.hasAttribute("split-view-group")) {
+ let visibleTabsAndGroupsInGroup = child.childGroupsAndTabs.filter(tab => tab.visible);
+ visibleTabsAndGroupsInGroup.forEach(tab => {
tab.elementIndex = elementIndex++;
});
- focusableItems.push(...visibleTabsInGroup);
+ focusableItems.push(...visibleTabsAndGroupsInGroup);
}
+ let visibleTabsInGroup = child.childGroupsAndTabs.filter(tab => tab.visible);
+ visibleTabsInGroup.forEach(tab => {
+ tab.elementIndex = elementIndex++;
+ });
focusableItems.push(...visibleTabsInGroup);
+ }
}
}
@@ -265,7 +274,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
return this.#focusableItems;
}
@@ -1751,6 +1808,7 @@
@@ -1783,6 +1838,7 @@
_invalidateCachedTabs() {
this.#allTabs = null;
this._invalidateCachedVisibleTabs();
@@ -273,7 +282,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
}
_invalidateCachedVisibleTabs() {
@@ -1766,8 +1824,8 @@
@@ -1798,8 +1854,8 @@
#isContainerVerticalPinnedGrid(tab) {
return (
this.verticalMode &&
@@ -284,7 +293,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
!this.expandOnHover
);
}
@@ -1783,7 +1841,7 @@
@@ -1815,7 +1871,7 @@
if (node == null) {
// We have a container for non-tab elements at the end of the scrollbox.
@@ -293,7 +302,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
}
node.before(tab);
@@ -1878,7 +1936,7 @@
@@ -1910,7 +1966,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.
@@ -302,7 +311,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
const newTab2 = this.newTabButton;
const newTabVertical = document.getElementById(
"vertical-tabs-newtab-button"
@@ -1973,10 +2031,12 @@
@@ -2005,10 +2061,12 @@
_handleTabSelect(aInstant) {
let selectedTab = this.selectedItem;
@@ -315,7 +324,15 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
selectedTab._notselectedsinceload = false;
}
@@ -2130,7 +2190,7 @@
@@ -2152,6 +2210,7 @@
when the tab is first selected to be dragged.
*/
#updateTabStylesOnDrag(tab) {
+ return;
let isPinned = tab.pinned;
let numPinned = gBrowser.pinnedTabCount;
let allTabs = this.ariaFocusableItems;
@@ -2385,7 +2444,7 @@
return;
}
@@ -324,7 +341,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
let directionX = screenX > dragData.animLastScreenX;
let directionY = screenY > dragData.animLastScreenY;
@@ -2139,6 +2199,8 @@
@@ -2394,6 +2453,8 @@
let { width: tabWidth, height: tabHeight } =
draggedTab.getBoundingClientRect();
@@ -333,16 +350,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
let shiftSizeX = tabWidth * movingTabs.length;
let shiftSizeY = tabHeight;
dragData.tabWidth = tabWidth;
@@ -2168,7 +2230,7 @@
let translateX = screenX - dragData.screenX;
let translateY = screenY - dragData.screenY;
translateY +=
- this.pinnedTabsContainer.scrollPosition - dragData.scrollPos;
+ dragData.scrollPos;
let firstBoundX = firstTabInRow.screenX - firstMovingTabScreenX;
let firstBoundY = firstTabInRow.screenY - firstMovingTabScreenY;
let lastBoundX =
@@ -2294,7 +2356,7 @@
@@ -2547,7 +2608,7 @@
}
dragData.animDropElementIndex = newIndex;
@@ -351,7 +359,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
dragData.dropBefore = newIndex < tabs.length;
// Shift background tabs to leave a gap where the dragged tab
@@ -2327,12 +2389,17 @@
@@ -2580,13 +2641,18 @@
this.#clearDragOverCreateGroupTimer();
@@ -361,7 +369,8 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
+ let numPinned = gBrowser._numVisiblePinTabsWithoutCollapsed;
+ let essential = draggedTab.hasAttribute("zen-essential");
+ const isDraggingFolder = isTabGroupLabel(draggedTab) && draggedTab.group?.isZenFolder;
let tabs = this.ariaFocusableItems.slice(
let allTabs = this.ariaFocusableItems;
let tabs = allTabs.slice(
- isPinned ? 0 : numPinned,
- isPinned ? numPinned : undefined
+ (isPinned && essential) ? 0 : gBrowser._numZenEssentials,
@@ -373,17 +382,17 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
if (this.#rtlMode) {
tabs.reverse();
@@ -2346,7 +2413,7 @@
@@ -2597,7 +2663,7 @@
let screenAxis = this.verticalMode ? "screenY" : "screenX";
let size = this.verticalMode ? "height" : "width";
let translateAxis = this.verticalMode ? "translateY" : "translateX";
let scrollDirection = this.verticalMode ? "scrollTop" : "scrollLeft";
- let { width: tabWidth, height: tabHeight } = bounds(draggedTab);
+ let { width: tabWidth, height: tabHeight } = bounds(draggedTab.group?.hasAttribute("split-view-group") ? draggedTab.group : draggedTab);
let translateX = event.screenX - dragData.screenX;
let translateY = event.screenY - dragData.screenY;
@@ -2360,12 +2427,18 @@
let lastTab = tabs.at(-1);
@@ -2611,6 +2677,12 @@
let lastTab = allTabs.at(this.#rtlMode ? 0 : -1);
let lastMovingTab = movingTabs.at(-1);
let firstMovingTab = movingTabs[0];
+ if (lastMovingTab.group?.hasAttribute("split-view-group")) {
@@ -395,22 +404,15 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
let endEdge = ele => ele[screenAxis] + bounds(ele)[size];
let lastMovingTabScreen = endEdge(lastMovingTab);
let firstMovingTabScreen = firstMovingTab[screenAxis];
let shiftSize = lastMovingTabScreen - firstMovingTabScreen;
let translate = screen - dragData[screenAxis];
- if (!isPinned) {
+ if (true) {
translate +=
this.arrowScrollbox.scrollbox[scrollDirection] - dragData.scrollPos;
} else if (isPinned && this.verticalMode) {
@@ -2377,6 +2450,7 @@
// - for unpinned tabs, between the first and last unpinned tab
@@ -2619,6 +2691,7 @@
// Constrain the range over which the moving tabs can move between the first and last tab
let firstBound = firstTab[screenAxis] - firstMovingTabScreen;
let lastBound = endEdge(lastTab) - lastMovingTabScreen;
+ lastBound = gZenPinnedTabManager.getLastTabBound(lastBound, lastTab, isDraggingFolder);
translate = Math.min(Math.max(translate, firstBound), lastBound);
for (let item of movingTabs) {
@@ -2384,6 +2458,9 @@
// Center the tab under the cursor if the tab is not under the cursor while dragging
if (
@@ -2636,6 +2709,9 @@
// Shift the `.tab-group-label-container` to shift the label element.
item = item.parentElement;
}
@@ -420,7 +422,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
item.style.transform = `${translateAxis}(${translate}px)`;
}
@@ -2521,6 +2598,9 @@
@@ -2773,6 +2849,9 @@
break;
}
let element = tabs[mid];
@@ -430,7 +432,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
let elementForSize = isTabGroupLabel(element)
? element.parentElement
: element;
@@ -2540,6 +2620,8 @@
@@ -2792,6 +2871,8 @@
};
let dropElement = getOverlappedElement();
@@ -439,7 +441,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
let newDropElementIndex;
if (dropElement) {
@@ -2604,7 +2686,7 @@
@@ -2856,7 +2937,7 @@
let shouldCreateGroupOnDrop;
let dropBefore;
if (dropElement) {
@@ -448,7 +450,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
? dropElement.parentElement
: dropElement;
@@ -2624,7 +2706,7 @@
@@ -2876,7 +2957,7 @@
? Services.prefs.getIntPref(
"browser.tabs.dragDrop.moveOverThresholdPercent"
) / 100
@@ -457,7 +459,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
moveOverThreshold = Math.min(1, Math.max(0, moveOverThreshold));
let shouldMoveOver = overlapPercent > moveOverThreshold;
if (logicalForward && shouldMoveOver) {
@@ -2656,44 +2738,21 @@
@@ -2908,44 +2989,21 @@
// If dragging a group over another group, don't make it look like it is
// possible to drop the dragged group inside the other group.
@@ -507,7 +509,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
// When dragging tab(s) over an ungrouped tab, signal to the user
// that dropping the tab(s) will create a new tab group.
shouldCreateGroupOnDrop =
@@ -2703,12 +2762,6 @@
@@ -2955,12 +3013,6 @@
overlapPercent > dragOverGroupingThreshold;
if (shouldCreateGroupOnDrop) {
@@ -520,7 +522,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
} else {
this.removeAttribute("movingtab-createGroup");
document
@@ -2735,19 +2788,14 @@
@@ -2987,19 +3039,14 @@
dropElement = dropElementGroup;
colorCode = undefined;
} else if (isTabGroupLabel(dropElement)) {
@@ -548,7 +550,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
}
this.#setDragOverGroupColor(colorCode);
this.toggleAttribute("movingtab-ungroup", !colorCode);
@@ -2765,19 +2813,28 @@
@@ -3017,19 +3064,28 @@
dragData.dropElement = dropElement;
dragData.dropBefore = dropBefore;
dragData.animDropElementIndex = newDropElementIndex;
@@ -579,7 +581,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
}
item.style.transform = transform;
}
@@ -2830,12 +2887,14 @@
@@ -3082,12 +3138,14 @@
);
}
@@ -596,7 +598,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
for (let item of this.ariaFocusableItems) {
if (isTabGroupLabel(item)) {
@@ -2843,6 +2902,18 @@
@@ -3095,6 +3153,18 @@
item = item.parentElement;
}
item.style.transform = "";
@@ -615,7 +617,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
item.removeAttribute("dragover-createGroup");
}
this.removeAttribute("movingtab-createGroup");
@@ -2889,7 +2960,7 @@
@@ -3198,7 +3268,7 @@
let postTransitionCleanup = () => {
movingTab._moveTogetherSelectedTabsData.animate = false;
};
@@ -624,7 +626,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
postTransitionCleanup();
} else {
let onTransitionEnd = transitionendEvent => {
@@ -3062,7 +3133,7 @@
@@ -3371,7 +3441,7 @@
}
_notifyBackgroundTab(aTab) {
@@ -633,7 +635,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
return;
}
@@ -3171,7 +3242,10 @@
@@ -3480,7 +3550,10 @@
#getDragTarget(event, { ignoreSides = false } = {}) {
let { target } = event;
while (target) {
@@ -645,7 +647,7 @@ index 1fcebe3962398ff1b7cadef657ac8b68a80e720d..1cd2e9f24b3be1717493b4e663bc41d7
break;
}
target = target.parentNode;
@@ -3188,6 +3262,9 @@
@@ -3497,6 +3570,9 @@
return null;
}
}

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/urlbar/UrlbarInput.sys.mjs b/browser/components/urlbar/UrlbarInput.sys.mjs
index 50e9d3931789551869ff37a4fc89d5dfe2c09ad1..0cbce1ce41345075c999f3ff9c0268965bbc92b9 100644
index db1a780f36d16c1b63ad50af76887b16e88ca8fe..dee34ba81aae1fd961e7c01f10e485458c01977c 100644
--- a/browser/components/urlbar/UrlbarInput.sys.mjs
+++ b/browser/components/urlbar/UrlbarInput.sys.mjs
@@ -68,6 +68,13 @@ XPCOMUtils.defineLazyPreferenceGetter(
@@ -16,7 +16,7 @@ index 50e9d3931789551869ff37a4fc89d5dfe2c09ad1..0cbce1ce41345075c999f3ff9c026896
const DEFAULT_FORM_HISTORY_NAME = "searchbar-history";
const SEARCH_BUTTON_CLASS = "urlbar-search-button";
@@ -378,7 +385,16 @@ export class UrlbarInput {
@@ -380,7 +387,16 @@ export class UrlbarInput {
// See _on_select(). HTMLInputElement.select() dispatches a "select"
// event but does not set the primary selection.
this._suppressPrimaryAdjustment = true;
@@ -33,7 +33,7 @@ index 50e9d3931789551869ff37a4fc89d5dfe2c09ad1..0cbce1ce41345075c999f3ff9c026896
this._suppressPrimaryAdjustment = false;
}
@@ -454,6 +470,10 @@ export class UrlbarInput {
@@ -456,6 +472,10 @@ export class UrlbarInput {
hideSearchTerms = false,
isSameDocument = false
) {
@@ -44,7 +44,7 @@ index 50e9d3931789551869ff37a4fc89d5dfe2c09ad1..0cbce1ce41345075c999f3ff9c026896
// We only need to update the searchModeUI on tab switch conditionally
// as we only persist searchMode with ScotchBonnet enabled.
if (
@@ -717,8 +737,16 @@ export class UrlbarInput {
@@ -728,8 +748,16 @@ export class UrlbarInput {
return;
}
}
@@ -62,7 +62,7 @@ index 50e9d3931789551869ff37a4fc89d5dfe2c09ad1..0cbce1ce41345075c999f3ff9c026896
}
/**
@@ -1124,7 +1152,11 @@ export class UrlbarInput {
@@ -1143,7 +1171,11 @@ export class UrlbarInput {
}
if (!this.#providesSearchMode(result)) {
@@ -75,7 +75,7 @@ index 50e9d3931789551869ff37a4fc89d5dfe2c09ad1..0cbce1ce41345075c999f3ff9c026896
}
if (isCanonized) {
@@ -2177,6 +2209,10 @@ export class UrlbarInput {
@@ -2208,6 +2240,10 @@ export class UrlbarInput {
await this.#updateLayoutBreakoutDimensions();
}
@@ -86,7 +86,7 @@ index 50e9d3931789551869ff37a4fc89d5dfe2c09ad1..0cbce1ce41345075c999f3ff9c026896
startLayoutExtend() {
if (!this.#allowBreakout || this.hasAttribute("breakout-extend")) {
// Do not expand if the Urlbar does not support being expanded or it is
@@ -2191,6 +2227,12 @@ export class UrlbarInput {
@@ -2222,6 +2258,12 @@ export class UrlbarInput {
this.setAttribute("breakout-extend", "true");
@@ -99,7 +99,7 @@ index 50e9d3931789551869ff37a4fc89d5dfe2c09ad1..0cbce1ce41345075c999f3ff9c026896
// Enable the animation only after the first extend call to ensure it
// doesn't run when opening a new window.
if (!this.hasAttribute("breakout-extend-animate")) {
@@ -2210,6 +2252,24 @@ export class UrlbarInput {
@@ -2241,6 +2283,24 @@ export class UrlbarInput {
return;
}
@@ -124,7 +124,7 @@ index 50e9d3931789551869ff37a4fc89d5dfe2c09ad1..0cbce1ce41345075c999f3ff9c026896
this.removeAttribute("breakout-extend");
this.#updateTextboxPosition();
}
@@ -2539,7 +2599,7 @@ export class UrlbarInput {
@@ -2570,7 +2630,7 @@ export class UrlbarInput {
this.textbox.parentNode.style.setProperty(
"--urlbar-container-height",
@@ -133,7 +133,7 @@ index 50e9d3931789551869ff37a4fc89d5dfe2c09ad1..0cbce1ce41345075c999f3ff9c026896
);
this.textbox.style.setProperty(
"--urlbar-height",
@@ -2954,6 +3014,7 @@ export class UrlbarInput {
@@ -2985,6 +3045,7 @@ export class UrlbarInput {
}
_toggleActionOverride(event) {
@@ -141,7 +141,7 @@ index 50e9d3931789551869ff37a4fc89d5dfe2c09ad1..0cbce1ce41345075c999f3ff9c026896
if (
event.keyCode == KeyEvent.DOM_VK_SHIFT ||
event.keyCode == KeyEvent.DOM_VK_ALT ||
@@ -3055,7 +3116,7 @@ export class UrlbarInput {
@@ -3086,7 +3147,7 @@ export class UrlbarInput {
*/
_trimValue(val) {
let trimmedValue = lazy.UrlbarPrefs.get("trimURLs")
@@ -150,7 +150,7 @@ index 50e9d3931789551869ff37a4fc89d5dfe2c09ad1..0cbce1ce41345075c999f3ff9c026896
: val;
// Only trim value if the directionality doesn't change to RTL and we're not
// showing a strikeout https protocol.
@@ -3425,6 +3486,10 @@ export class UrlbarInput {
@@ -3459,6 +3520,10 @@ export class UrlbarInput {
}
reuseEmpty = true;
}
@@ -161,7 +161,7 @@ index 50e9d3931789551869ff37a4fc89d5dfe2c09ad1..0cbce1ce41345075c999f3ff9c026896
if (
where == "tab" &&
reuseEmpty &&
@@ -3432,6 +3497,9 @@ export class UrlbarInput {
@@ -3466,6 +3531,9 @@ export class UrlbarInput {
) {
where = "current";
}
@@ -171,7 +171,7 @@ index 50e9d3931789551869ff37a4fc89d5dfe2c09ad1..0cbce1ce41345075c999f3ff9c026896
return where;
}
@@ -3689,6 +3757,7 @@ export class UrlbarInput {
@@ -3723,6 +3791,7 @@ export class UrlbarInput {
this.setResultForCurrentValue(null);
this.handleCommand();
this.controller.clearLastQueryContextCache();
@@ -179,7 +179,7 @@ index 50e9d3931789551869ff37a4fc89d5dfe2c09ad1..0cbce1ce41345075c999f3ff9c026896
this._suppressStartQuery = false;
});
@@ -3696,7 +3765,6 @@ export class UrlbarInput {
@@ -3730,7 +3799,6 @@ export class UrlbarInput {
contextMenu.addEventListener("popupshowing", () => {
// Close the results pane when the input field contextual menu is open,
// because paste and go doesn't want a result selection.
@@ -187,7 +187,7 @@ index 50e9d3931789551869ff37a4fc89d5dfe2c09ad1..0cbce1ce41345075c999f3ff9c026896
let controller =
this.document.commandDispatcher.getControllerForCommand("cmd_paste");
@@ -4098,6 +4166,7 @@ export class UrlbarInput {
@@ -4138,6 +4206,7 @@ export class UrlbarInput {
this.document.l10n.setAttributes(
this.inputField,
@@ -195,7 +195,7 @@ index 50e9d3931789551869ff37a4fc89d5dfe2c09ad1..0cbce1ce41345075c999f3ff9c026896
l10nId,
l10nId == "urlbar-placeholder-with-name" ? { name } : undefined
);
@@ -4209,6 +4278,11 @@ export class UrlbarInput {
@@ -4249,6 +4318,11 @@ export class UrlbarInput {
}
_on_click(event) {
@@ -207,7 +207,7 @@ index 50e9d3931789551869ff37a4fc89d5dfe2c09ad1..0cbce1ce41345075c999f3ff9c026896
if (
event.target == this.inputField ||
event.target == this._inputContainer ||
@@ -4280,7 +4354,7 @@ export class UrlbarInput {
@@ -4320,7 +4394,7 @@ export class UrlbarInput {
}
}
@@ -216,7 +216,7 @@ index 50e9d3931789551869ff37a4fc89d5dfe2c09ad1..0cbce1ce41345075c999f3ff9c026896
this.view.autoOpen({ event });
} else {
if (this._untrimOnFocusAfterKeydown) {
@@ -4320,9 +4394,16 @@ export class UrlbarInput {
@@ -4360,9 +4434,16 @@ export class UrlbarInput {
}
_on_mousedown(event) {
@@ -234,7 +234,7 @@ index 50e9d3931789551869ff37a4fc89d5dfe2c09ad1..0cbce1ce41345075c999f3ff9c026896
if (
event.target != this.inputField &&
@@ -4334,6 +4415,10 @@ export class UrlbarInput {
@@ -4374,6 +4455,10 @@ export class UrlbarInput {
this.focusedViaMousedown = !this.focused;
this._preventClickSelectsAll = this.focused;
@@ -245,7 +245,7 @@ index 50e9d3931789551869ff37a4fc89d5dfe2c09ad1..0cbce1ce41345075c999f3ff9c026896
// Keep the focus status, since the attribute may be changed
// upon calling this.focus().
@@ -4374,7 +4459,7 @@ export class UrlbarInput {
@@ -4414,7 +4499,7 @@ export class UrlbarInput {
}
// Don't close the view when clicking on a tab; we may want to keep the
// view open on tab switch, and the TabSelect event arrived earlier.

View File

@@ -0,0 +1,12 @@
diff --git a/browser/components/urlbar/UrlbarMuxerStandard.sys.mjs b/browser/components/urlbar/UrlbarMuxerStandard.sys.mjs
index 57463d2c4e39e67eeec7e2c752fe5236a662c7d2..4ca28540a71594e935847679a4b676ae48eb10d8 100644
--- a/browser/components/urlbar/UrlbarMuxerStandard.sys.mjs
+++ b/browser/components/urlbar/UrlbarMuxerStandard.sys.mjs
@@ -845,6 +845,7 @@ class MuxerUnifiedComplete extends UrlbarMuxer {
}
if (result.providerName == lazy.UrlbarProviderTabToSearch.name) {
+ return false;
// Discard the result if a tab-to-search result was added already.
if (!state.canAddTabToSearch) {
return false;

View File

@@ -1,12 +0,0 @@
diff --git a/browser/components/urlbar/UrlbarMuxerUnifiedComplete.sys.mjs b/browser/components/urlbar/UrlbarMuxerUnifiedComplete.sys.mjs
index c0d2b04ff869c4ad193d71aa19949d0e1fefe5ea..e5d054bf583a10fd96a94096cfe3752beb97d2ab 100644
--- a/browser/components/urlbar/UrlbarMuxerUnifiedComplete.sys.mjs
+++ b/browser/components/urlbar/UrlbarMuxerUnifiedComplete.sys.mjs
@@ -845,6 +845,7 @@ class MuxerUnifiedComplete extends UrlbarMuxer {
}
if (result.providerName == lazy.UrlbarProviderTabToSearch.name) {
+ return false;
// Discard the result if a tab-to-search result was added already.
if (!state.canAddTabToSearch) {
return false;

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs b/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs
index 815734d9a5a589174ac33cb15ff9988d13e78b8c..adbd1e99987a92c9b79af8bcde204543e46e181f 100644
index ad971f090bdaba2865cf1fac2840b1f553d2630c..a9e676e43d35b617eebd5a67c8653397b7c0c6bf 100644
--- a/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs
+++ b/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs
@@ -40,11 +40,13 @@ function defaultQuery(conditions = "") {
@@ -26,7 +26,7 @@ index 815734d9a5a589174ac33cb15ff9988d13e78b8c..adbd1e99987a92c9b79af8bcde204543
h.visit_count, h.typed,
0, t.open_count,
:matchBehavior, :searchBehavior, NULL)
@@ -1114,11 +1116,13 @@ Search.prototype = {
@@ -1116,11 +1118,13 @@ Search.prototype = {
? lazy.PlacesUtils.toDate(lastVisitPRTime).getTime()
: undefined;
let tabGroup = row.getResultByName("groupId");

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/urlbar/UrlbarView.sys.mjs b/browser/components/urlbar/UrlbarView.sys.mjs
index ec5575d8990ee431729d044953924d3a8b79d665..376d68f3a30bc75ca19bba5efc97fe923ab0e49e 100644
index b3608bb8b851979b893da9c83e86d08b54288047..021ce0b80015256767b88132e99c67fa8ddfd2c4 100644
--- a/browser/components/urlbar/UrlbarView.sys.mjs
+++ b/browser/components/urlbar/UrlbarView.sys.mjs
@@ -609,7 +609,7 @@ export class UrlbarView {
@@ -11,7 +11,7 @@ index ec5575d8990ee431729d044953924d3a8b79d665..376d68f3a30bc75ca19bba5efc97fe92
// Try to reuse the cached top-sites context. If it's not cached, then
// there will be a gap of time between when the input is focused and
// when the view opens that can be perceived as flicker.
@@ -1325,7 +1325,7 @@ export class UrlbarView {
@@ -1333,7 +1333,7 @@ export class UrlbarView {
includeHiddenExposures: true,
});
let canBeVisible =
@@ -20,7 +20,7 @@ index ec5575d8990ee431729d044953924d3a8b79d665..376d68f3a30bc75ca19bba5efc97fe92
if (result.isHiddenExposure) {
if (canBeVisible) {
this.controller.engagementEvent.addExposure(
@@ -3015,7 +3015,7 @@ export class UrlbarView {
@@ -3061,7 +3061,7 @@ export class UrlbarView {
}
#enableOrDisableRowWrap() {

View File

@@ -1,8 +1,8 @@
diff --git a/browser/extensions/newtab/lib/ActivityStream.sys.mjs b/browser/extensions/newtab/lib/ActivityStream.sys.mjs
index fc416c1977f9bc20ad86ecb7758056489cbc94cf..939f5ea34a914e919ebe568f8e795d7421c0abbc 100644
index f4eca54a9638072a03b4c0e406fe14388b85db61..7f0c5f724558bdb004114f2a6bea266c94facdf9 100644
--- a/browser/extensions/newtab/lib/ActivityStream.sys.mjs
+++ b/browser/extensions/newtab/lib/ActivityStream.sys.mjs
@@ -258,7 +258,7 @@ export const PREFS_CONFIG = new Map([
@@ -260,7 +260,7 @@ export const PREFS_CONFIG = new Map([
"showSponsoredTopSites",
{
title: "Show sponsored top sites",

View File

@@ -1,8 +1,8 @@
diff --git a/browser/modules/BrowserDOMWindow.sys.mjs b/browser/modules/BrowserDOMWindow.sys.mjs
index 2bc4918c15b5ea80e486db66d20bb9668b9e29c0..3800a3807f11c5f65ce0d602a775f95037f5dcf8 100644
index 534d23b3e66176ea77f3ef577bf9630626948b9d..752e229bbe725ae394b7648adb949635f2bd70e4 100644
--- a/browser/modules/BrowserDOMWindow.sys.mjs
+++ b/browser/modules/BrowserDOMWindow.sys.mjs
@@ -362,7 +362,7 @@ export class BrowserDOMWindow {
@@ -374,7 +374,7 @@ export class BrowserDOMWindow {
// Passing a null-URI to only create the content window,
// and pass true for aSkipLoad to prevent loading of
// about:blank
@@ -11,7 +11,7 @@ index 2bc4918c15b5ea80e486db66d20bb9668b9e29c0..3800a3807f11c5f65ce0d602a775f950
null,
aParams,
aWhere,
@@ -370,6 +370,10 @@ export class BrowserDOMWindow {
@@ -382,6 +382,10 @@ export class BrowserDOMWindow {
aName,
true
);

View File

@@ -1,5 +1,5 @@
diff --git a/browser/modules/ExtensionsUI.sys.mjs b/browser/modules/ExtensionsUI.sys.mjs
index a31179ef7986e1290aef8af58d1f82e23e55fcbe..4adaa921ce5fce8155cd98aa0e7a2b0b6d44ac1b 100644
index 3302b1e9a66c8495e1a627b33488b952e8ef72b1..1de6ee8b59595da4acbb91bc625cd380be32845a 100644
--- a/browser/modules/ExtensionsUI.sys.mjs
+++ b/browser/modules/ExtensionsUI.sys.mjs
@@ -466,7 +466,7 @@ export var ExtensionsUI = {

View File

@@ -1,5 +1,5 @@
diff --git a/browser/modules/URILoadingHelper.sys.mjs b/browser/modules/URILoadingHelper.sys.mjs
index 14bf18132eaee8a0c8fe6e108ac423de91a7d3e2..fa616654fdf8a29d59889227780a98f0f9dc9a20 100644
index ce594b69f55f9b9245a56fe8c962cf8a83cfe9a1..f3b99524f49f5a624c2fc213257a911862cd70c2 100644
--- a/browser/modules/URILoadingHelper.sys.mjs
+++ b/browser/modules/URILoadingHelper.sys.mjs
@@ -516,7 +516,7 @@ export const URILoadingHelper = {

View File

@@ -1,5 +1,5 @@
diff --git a/browser/themes/BuiltInThemeConfig.sys.mjs b/browser/themes/BuiltInThemeConfig.sys.mjs
index a5361f1f0ec57f575f8d76e118ff762dc7547501..db5c5eb2059b4ceef3911fd807bf985408859d1a 100644
index 28b254d5757caf35c4ba755ef4cfed44bab5af00..660f517e0e3342970c6e30837fcf4d0adf360777 100644
--- a/browser/themes/BuiltInThemeConfig.sys.mjs
+++ b/browser/themes/BuiltInThemeConfig.sys.mjs
@@ -33,11 +33,4 @@ export const BuiltInThemeConfig = new Map([

View File

@@ -1,31 +1,31 @@
diff --git a/browser/themes/linux/browser.css b/browser/themes/linux/browser.css
index 714e465f6d5bb28fc0c9517013ce7f9961bd0ace..8d739cb6e0cee93d994b17f7e3451fb3fcf11ed7 100644
index dadb198cbf968dc622d2d0ee6c754f3541c052a2..5b7d17d8705c7cfddaee04c90d342bd705338a18 100644
--- a/browser/themes/linux/browser.css
+++ b/browser/themes/linux/browser.css
@@ -42,7 +42,8 @@
-moz-default-appearance: -moz-window-decorations;
appearance: auto;
@@ -43,7 +43,8 @@
-moz-default-appearance: -moz-window-decorations;
appearance: auto;
- #navigator-toolbox,
- #navigator-toolbox,
+ #zen-main-app-wrapper,
+ #zen-browser-background,
dialog::backdrop {
border-top-left-radius: env(-moz-gtk-csd-titlebar-radius);
border-top-right-radius: env(-moz-gtk-csd-titlebar-radius);
@@ -50,13 +51,14 @@
dialog::backdrop {
border-top-left-radius: env(-moz-gtk-csd-titlebar-radius);
border-top-right-radius: env(-moz-gtk-csd-titlebar-radius);
@@ -51,13 +52,14 @@
/* stylelint-disable-next-line media-query-no-invalid */
@media -moz-pref("widget.gtk.rounded-bottom-corners.enabled") {
- #navigator-toolbox {
/* stylelint-disable-next-line media-query-no-invalid */
@media -moz-pref("widget.gtk.rounded-bottom-corners.enabled") {
- #navigator-toolbox {
+ #zen-main-app-wrapper {
/* The body clip below covers this. */
border-radius: 0;
}
/* The body clip below covers this. */
border-radius: 0;
}
body,
- dialog::backdrop {
body,
- dialog::backdrop {
+ dialog::backdrop,
+ #zen-browser-background {
/* Use an uniform clip to allow WebRender to optimize it better */
border-radius: env(-moz-gtk-csd-titlebar-radius);
}
/* Use an uniform clip to allow WebRender to optimize it better */
border-radius: env(-moz-gtk-csd-titlebar-radius);
}

View File

@@ -1,18 +0,0 @@
diff --git a/browser/themes/shared/controlcenter/panel.css b/browser/themes/shared/controlcenter/panel.css
index d0bc0e89142ef8d6090f1b270a0193ac8899c41f..cb16ab639c675433b2bfbcee11def5428c41afb3 100644
--- a/browser/themes/shared/controlcenter/panel.css
+++ b/browser/themes/shared/controlcenter/panel.css
@@ -10,11 +10,11 @@
#identity-popup,
#permission-popup,
#protections-popup {
- --popup-width: 30.81em;
+ --popup-width: 28.81em;
/* Set default fill for icons in the identity popup.
Individual icons can override this. */
fill: currentColor;
- --horizontal-padding: calc(var(--arrowpanel-menuitem-padding-inline) * 2);
+ --horizontal-padding: 0;
--vertical-section-padding: 0.9em;
--height-offset: 0px;
font: menu;

View File

@@ -1,10 +0,0 @@
diff --git a/browser/themes/shared/light-dark-overrides.css b/browser/themes/shared/light-dark-overrides.css
index 8b10da7c3ccbbfca30f77e2b7602794dccbf306d..f9188accee0e02d3ef6944b155da613fa6bd335d 100644
--- a/browser/themes/shared/light-dark-overrides.css
+++ b/browser/themes/shared/light-dark-overrides.css
@@ -5,5 +5,4 @@
#urlbar {
--urlbar-box-bgcolor: var(--toolbar-field-focus-background-color);
--urlbar-box-focus-bgcolor: var(--button-background-color);
- --urlbar-box-hover-bgcolor: var(--button-background-color-hover);
}

View File

@@ -1,5 +1,5 @@
diff --git a/browser/themes/shared/tabbrowser/tabs.css b/browser/themes/shared/tabbrowser/tabs.css
index 79a95268e5..3a9fe04d6a 100644
index b710cbf2aa3febc0693bdc6aef48ef4aea855235..61c813322c866ae823dac6c0826d572a1e768135 100644
--- a/browser/themes/shared/tabbrowser/tabs.css
+++ b/browser/themes/shared/tabbrowser/tabs.css
@@ -19,7 +19,7 @@
@@ -23,7 +23,7 @@ index 79a95268e5..3a9fe04d6a 100644
--tab-selected-bgcolor: var(--toolbar-bgcolor);
--tab-selected-color-scheme: var(--toolbar-color-scheme);
&[lwt-tab-selected="light"] {
@@ -251,7 +251,6 @@
@@ -255,7 +255,6 @@
}
:root:not([uidensity="compact"], [sidebar-expand-on-hover]) &[pinned] {
@@ -31,7 +31,7 @@ index 79a95268e5..3a9fe04d6a 100644
}
&:is([selected], [multiselected]) {
@@ -265,6 +264,7 @@
@@ -269,6 +268,7 @@
border-radius: inherit;
position: relative;
overflow: hidden;
@@ -39,7 +39,7 @@ index 79a95268e5..3a9fe04d6a 100644
&::before {
position: absolute;
@@ -464,14 +464,11 @@
@@ -468,14 +468,11 @@
.tab-icon-image {
-moz-context-properties: fill, stroke;
fill: currentColor;
@@ -55,7 +55,7 @@ index 79a95268e5..3a9fe04d6a 100644
opacity: 0.5;
/* Fade the favicon out */
transition-property: filter, opacity;
@@ -488,10 +485,6 @@
@@ -492,10 +489,6 @@
/* stylelint-disable-next-line media-query-no-invalid */
@media -moz-pref("browser.tabs.fadeOutExplicitlyUnloadedTabs") {
&[pending][discarded] {
@@ -66,7 +66,7 @@ index 79a95268e5..3a9fe04d6a 100644
opacity: 0.5;
/* Fade the favicon out */
transition-property: filter, opacity;
@@ -564,7 +557,7 @@
@@ -568,7 +561,7 @@
z-index: 1; /* Overlay tab title */
#tabbrowser-tabs[orient="vertical"] & {
@@ -75,7 +75,7 @@ index 79a95268e5..3a9fe04d6a 100644
}
&[crashed] {
@@ -572,7 +565,7 @@
@@ -576,7 +569,7 @@
}
#tabbrowser-tabs[orient="vertical"]:not([expanded]) &:not([crashed]),
@@ -84,7 +84,7 @@ index 79a95268e5..3a9fe04d6a 100644
&[soundplaying] {
list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio-playing-small.svg");
}
@@ -629,7 +622,7 @@
@@ -633,7 +626,7 @@
}
}
@@ -93,7 +93,7 @@ index 79a95268e5..3a9fe04d6a 100644
&[crashed] {
display: revert;
}
@@ -730,7 +723,7 @@
@@ -734,7 +727,7 @@
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]),
@@ -102,22 +102,7 @@ index 79a95268e5..3a9fe04d6a 100644
&:is([soundplaying], [muted], [activemedia-blocked]) {
display: flex;
}
@@ -1004,20 +997,20 @@ tab-group {
*/
display: contents;
- #tabbrowser-tabs[orient="horizontal"] &[collapsed] > .tabbrowser-tab {
+ #tabbrowser-tabs[orient="horizontal"] &[collapsed] .tab-group-container > .tabbrowser-tab {
min-width: 0 !important;
max-width: 0 !important;
padding: 0;
overflow-clip-margin: 0;
}
- #tabbrowser-tabs[orient="vertical"] &[collapsed] > .tabbrowser-tab {
+ #tabbrowser-tabs[orient="vertical"] &[collapsed] .tab-group-container > .tabbrowser-tab {
display: none;
}
@@ -1039,7 +1032,7 @@ tab-group {
}
#tabbrowser-tabs[orient="vertical"][expanded] {
@@ -126,7 +111,7 @@ index 79a95268e5..3a9fe04d6a 100644
&[movingtab][movingtab-addToGroup]:not([movingtab-createGroup], [movingtab-ungroup]) .tabbrowser-tab:is(:active, [multiselected]) {
margin-inline-start: var(--space-medium);
}
@@ -1370,7 +1363,7 @@ tab-group {
@@ -1457,7 +1450,7 @@ tab-group {
}
}
@@ -135,7 +120,7 @@ index 79a95268e5..3a9fe04d6a 100644
#vertical-tabs-newtab-button {
appearance: none;
min-height: var(--tab-min-height);
@@ -1381,7 +1374,7 @@ tab-group {
@@ -1468,7 +1461,7 @@ tab-group {
margin-inline: var(--tab-inner-inline-margin);
#tabbrowser-tabs[orient="vertical"]:not([expanded]) & > .toolbarbutton-text {
@@ -144,7 +129,7 @@ index 79a95268e5..3a9fe04d6a 100644
}
&:hover {
@@ -1405,7 +1398,7 @@ tab-group {
@@ -1492,7 +1485,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.
*/
@@ -153,7 +138,7 @@ index 79a95268e5..3a9fe04d6a 100644
margin-block: var(--tab-block-margin);
}
@@ -1600,7 +1593,6 @@ tab-group {
@@ -1687,7 +1680,6 @@ tab-group {
&:not([expanded]) {
.tabbrowser-tab[pinned] {
@@ -161,7 +146,7 @@ index 79a95268e5..3a9fe04d6a 100644
}
.tab-background {
@@ -1760,7 +1752,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button {
@@ -1847,7 +1839,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button {
list-style-image: url(chrome://global/skin/icons/plus.svg);
}

View File

@@ -1,8 +1,8 @@
diff --git a/browser/themes/shared/toolbarbuttons.css b/browser/themes/shared/toolbarbuttons.css
index a8df2d5cd8b3009daa033a9bf06908be78adeb3b..8c47fd0056599c539eb309eb90b465921400aae4 100644
index 1f91bda717979f3e81d2f6b243336078d97c5cb9..4232ec4761cb15ff96e9b18810b05f548a6f5fd9 100644
--- a/browser/themes/shared/toolbarbuttons.css
+++ b/browser/themes/shared/toolbarbuttons.css
@@ -254,7 +254,7 @@ toolbar .toolbaritem-combined-buttons > separator {
@@ -256,7 +256,7 @@ toolbar .toolbaritem-combined-buttons > separator {
#nav-bar-overflow-button {
list-style-image: url("chrome://global/skin/icons/chevron.svg");
@@ -11,7 +11,7 @@ index a8df2d5cd8b3009daa033a9bf06908be78adeb3b..8c47fd0056599c539eb309eb90b46592
display: none;
}
@@ -464,7 +464,7 @@ toolbarbutton.bookmark-item:not(.subviewbutton) {
@@ -466,7 +466,7 @@ toolbarbutton.bookmark-item:not(.subviewbutton) {
*/
align-items: stretch;
> .toolbarbutton-icon {

View File

@@ -1,5 +1,5 @@
diff --git a/browser/themes/shared/urlbarView.css b/browser/themes/shared/urlbarView.css
index 28608327793ff564d19536e1086660b040c462d4..6714457b1de5928fff19f679eb0388f40e343186 100644
index 428ce749239be2a54c86e0feff123772d1a1d697..9f33c10add207c7971c07743147a458e19b469bb 100644
--- a/browser/themes/shared/urlbarView.css
+++ b/browser/themes/shared/urlbarView.css
@@ -20,7 +20,7 @@

View File

@@ -1,5 +1,5 @@
diff --git a/browser/themes/windows/browser.css b/browser/themes/windows/browser.css
index 587e189d9c403c01463c4167de8c21d3533351cb..5edbc05b905692b29c9e292533616c9bc03cb5fe 100644
index 4f960ae35aa69a1d1ce4ad368f5bae365229bbdf..3a17985b3376eb8a966cd85324d86d00d891bf0f 100644
--- a/browser/themes/windows/browser.css
+++ b/browser/themes/windows/browser.css
@@ -31,7 +31,6 @@
@@ -10,7 +10,7 @@ index 587e189d9c403c01463c4167de8c21d3533351cb..5edbc05b905692b29c9e292533616c9b
}
/* Using a semitransparent background preserves the tinting from the backdrop.
@@ -63,7 +62,7 @@
@@ -61,7 +60,7 @@
/* This is needed for Windows 10, see bug 1961257 */
@media (-moz-windows-accent-color-in-titlebar) {

View File

@@ -1,8 +1,8 @@
diff --git a/build/pgo/profileserver.py b/build/pgo/profileserver.py
index 6017810c873f6be5a5d133dc9386f7cd8879e81b..6d399e0c8135d2c27157c81d75515de04c39f1d7 100755
index faf15719a0537d7c5fc0a62afb93fa4a61605bf7..68d114fd6651b7c210aa1a58e6fcf4fa749f53b1 100755
--- a/build/pgo/profileserver.py
+++ b/build/pgo/profileserver.py
@@ -18,7 +18,13 @@ from mozprofile import FirefoxProfile, Preferences
@@ -17,7 +17,13 @@ from mozprofile import FirefoxProfile, Preferences
from mozprofile.permissions import ServerLocations
from mozrunner import CLI, FirefoxRunner

View File

@@ -1,5 +1,5 @@
diff --git a/dom/base/Document.cpp b/dom/base/Document.cpp
index 36f9681a989bf4007fa837e7c9ef332ee14e55bd..8c407b5297570aee5322515d47b0895b833e3a10 100644
index 40da41ae4ac7d8d61c664e25bec8a74091d8b3e0..59773e80c6220115d0c51e268bb1eff0fe208010 100644
--- a/dom/base/Document.cpp
+++ b/dom/base/Document.cpp
@@ -10,6 +10,7 @@
@@ -10,7 +10,7 @@ index 36f9681a989bf4007fa837e7c9ef332ee14e55bd..8c407b5297570aee5322515d47b0895b
#include <inttypes.h>
#include <stdlib.h>
@@ -3300,6 +3301,11 @@ void Document::FillStyleSetUserAndUASheets() {
@@ -3306,6 +3307,11 @@ void Document::FillStyleSetUserAndUASheets() {
styleSet.AppendStyleSheet(*sheet);
}

View File

@@ -1,8 +1,8 @@
diff --git a/dom/base/use_counter_metrics.yaml b/dom/base/use_counter_metrics.yaml
index c3830ede7637a047ffa285c0e8e281befd933f18..ddc8be98dc969c54774682361bc1f191754a4609 100644
index c8dd3cca62e788eed5e5df5294fa7c9f3a2e9492..91e6281f4eb1c4c6aa1dddd8a0f06aa0c15a71ab 100644
--- a/dom/base/use_counter_metrics.yaml
+++ b/dom/base/use_counter_metrics.yaml
@@ -21765,6 +21765,22 @@ use.counter.css.page:
@@ -21460,6 +21460,22 @@ use.counter.css.page:
send_in_pings:
- use-counters
@@ -25,7 +25,7 @@ index c3830ede7637a047ffa285c0e8e281befd933f18..ddc8be98dc969c54774682361bc1f191
css_transform_origin:
type: counter
description: >
@@ -33752,6 +33768,22 @@ use.counter.css.doc:
@@ -33447,6 +33463,22 @@ use.counter.css.doc:
send_in_pings:
- use-counters

View File

@@ -1,5 +1,5 @@
diff --git a/dom/html/HTMLMediaElement.cpp b/dom/html/HTMLMediaElement.cpp
index ee151115e3db05b4e92c3f68d724bd785f4e4669..b8cfdd0862af690ebaff833049bdd5b48068f34d 100644
index 2becc049b5a0ee8544819b08d65f1df0a4c23658..6e7a05f135c6ab2c4955a679c1a4ac0e9aae7592 100644
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -453,6 +453,7 @@ class HTMLMediaElement::MediaControlKeyListener final
@@ -10,7 +10,7 @@ index ee151115e3db05b4e92c3f68d724bd785f4e4669..b8cfdd0862af690ebaff833049bdd5b4
NotifyAudibleStateChanged(mIsOwnerAudible
? MediaAudibleState::eAudible
: MediaAudibleState::eInaudible);
@@ -7007,6 +7008,9 @@ void HTMLMediaElement::FireTimeUpdate(TimeupdateType aType) {
@@ -7034,6 +7035,9 @@ void HTMLMediaElement::FireTimeUpdate(TimeupdateType aType) {
QueueTask(std::move(runner));
mQueueTimeUpdateRunnerTime = TimeStamp::Now();
mLastCurrentTime = CurrentTime();

View File

@@ -1,8 +1,8 @@
diff --git a/gfx/wr/webrender/src/picture.rs b/gfx/wr/webrender/src/picture.rs
index 2e74dbbc23ed56b469000913ae24addc1a519e60..ff94049a68c75ab61e4792ec37720a340776acef 100644
index e860f36ef2b42a7377047c64dd4f9405f26b3249..8057172482aa042e9951fc7367891a66eed75f5e 100644
--- a/gfx/wr/webrender/src/picture.rs
+++ b/gfx/wr/webrender/src/picture.rs
@@ -8045,7 +8045,12 @@ fn get_relative_scale_offset(
@@ -8112,7 +8112,12 @@ fn get_relative_scale_offset(
CoordinateSpaceMapping::Local => ScaleOffset::identity(),
CoordinateSpaceMapping::ScaleOffset(scale_offset) => scale_offset,
CoordinateSpaceMapping::Transform(m) => {

View File

@@ -1,5 +1,5 @@
diff --git a/layout/base/nsStyleSheetService.h b/layout/base/nsStyleSheetService.h
index 8c49b338bf8e6830874ace9a08e8c0713167ee58..115bf09314970fd2fe79793e9cf8e0c40eb0459b 100644
index 83fc829aad19f8b80692e67bddb781778fbc4f8d..04806a1f51686a82c1dc2555dae86a4397b181fb 100644
--- a/layout/base/nsStyleSheetService.h
+++ b/layout/base/nsStyleSheetService.h
@@ -50,6 +50,8 @@ class nsStyleSheetService final : public nsIStyleSheetService,

View File

@@ -1,8 +1,8 @@
diff --git a/layout/generic/nsIFrame.cpp b/layout/generic/nsIFrame.cpp
index bd4a77009b8f1a791063c6039dabc8b7527a2504..214f10d59ebdd27e04e43e9dc96e55afbfe0a902 100644
index e13628eccc51f0e81fc1404b061840d816502757..85cca51cf37db83f6e79c6e6af080646d2c49670 100644
--- a/layout/generic/nsIFrame.cpp
+++ b/layout/generic/nsIFrame.cpp
@@ -11897,6 +11897,11 @@ gfx::Matrix nsIFrame::ComputeWidgetTransform() const {
@@ -11901,6 +11901,11 @@ gfx::Matrix nsIFrame::ComputeWidgetTransform() const {
gfx::Matrix4x4 matrix = nsStyleTransformMatrix::ReadTransforms(
uiReset->mMozWindowTransform, refBox, float(appUnitsPerDevPixel));

View File

@@ -1,8 +1,8 @@
diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp
index c4f9fd72246a42efcb6b30219bd2af9b0b6f9c99..6ff1d3acbf24f8fdc2ae9545dc52f0f826557022 100644
index 4b979fc1f9d0986f5382cab0c39bf99ed34ef39e..90f67c73c13fbfdcfff86125c6d7258850ca62b0 100644
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
@@ -3234,6 +3234,9 @@ nsStyleUIReset::nsStyleUIReset()
@@ -3237,6 +3237,9 @@ nsStyleUIReset::nsStyleUIReset()
mWindowShadow(StyleWindowShadow::Auto),
mWindowOpacity(1.0),
mMozWindowInputRegionMargin(StyleLength::Zero()),
@@ -12,7 +12,7 @@ index c4f9fd72246a42efcb6b30219bd2af9b0b6f9c99..6ff1d3acbf24f8fdc2ae9545dc52f0f8
mTransitions(
nsStyleAutoArray<StyleTransition>::WITH_SINGLE_INITIAL_ELEMENT),
mTransitionTimingFunctionCount(1),
@@ -3277,6 +3280,7 @@ nsStyleUIReset::nsStyleUIReset(const nsStyleUIReset& aSource)
@@ -3281,6 +3284,7 @@ nsStyleUIReset::nsStyleUIReset(const nsStyleUIReset& aSource)
mWindowOpacity(aSource.mWindowOpacity),
mMozWindowInputRegionMargin(aSource.mMozWindowInputRegionMargin),
mMozWindowTransform(aSource.mMozWindowTransform),

View File

@@ -1,8 +1,8 @@
diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h
index 4811ceab129cd2dcbc65de52c2978bc5735aa486..8ed6eb405cf8843811d8d9721532ab646dc2d759 100644
index 3236244280edaae2bbe4440e76da3455015ab722..3474d4bcfab2944aae9635250350b674a8ed1c42 100644
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -2026,6 +2026,7 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleUIReset {
@@ -2033,6 +2033,7 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleUIReset {
// The margin of the window region that should be transparent to events.
mozilla::StyleLength mMozWindowInputRegionMargin;
mozilla::StyleTransform mMozWindowTransform;

View File

@@ -1,8 +1,8 @@
diff --git a/layout/style/test/ListCSSProperties.cpp b/layout/style/test/ListCSSProperties.cpp
index b6a881b037a3720991f8097903e859dfc72012c1..8917a8cc23b97e37b4accaaf0d6c2876b36594af 100644
index df06ffac358c1b245c84432aa6f143f9c5806029..0bca4b9b40b3b030c54fc36c659966dd3a8894f7 100644
--- a/layout/style/test/ListCSSProperties.cpp
+++ b/layout/style/test/ListCSSProperties.cpp
@@ -108,6 +108,7 @@ const char* gInaccessibleProperties[] = {
@@ -109,6 +109,7 @@ const char* gInaccessibleProperties[] = {
"-moz-window-opacity", // chrome-only internal properties
"-moz-window-transform", // chrome-only internal properties
"-moz-window-shadow", // chrome-only internal properties

View File

@@ -1,8 +1,8 @@
diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml
index f689389fbc0382f10b7d146273efffdd1db4fd41..955f8e6edda62832ce5aeafd16ed58f5c94e312b 100644
index 30a19900c13cd0720008980202077af1df705856..136e3a13b810215be7a102786dce54651b38829d 100644
--- a/modules/libpref/init/StaticPrefList.yaml
+++ b/modules/libpref/init/StaticPrefList.yaml
@@ -19099,6 +19099,7 @@
@@ -19119,6 +19119,7 @@
mirror: always
#endif

View File

@@ -1,5 +1,5 @@
diff --git a/modules/libpref/moz.build b/modules/libpref/moz.build
index bff4fa68bbb4f7937632395351a0f8800815f862..d823accd1227635b555af2ca710645244d53aa12 100644
index 68a0bd6b50b804745b052e1921f4f6120354443e..23e7d03a6796af39dc2d39733b16548e73f8b10f 100644
--- a/modules/libpref/moz.build
+++ b/modules/libpref/moz.build
@@ -93,6 +93,7 @@ pref_groups = [

View File

@@ -1,8 +1,8 @@
diff --git a/netwerk/protocol/http/moz.build b/netwerk/protocol/http/moz.build
index af31c6f5255f0bffd2938bc9ac2d86315f3428ff..8ca3a799302d1ae5d515c0a1616151ab29a5657b 100644
index 906a2fcdcc2684ff4326aeb7f22f3441add7e56c..37e16b62d012498c66bc3a38f4ce48972298b6be 100644
--- a/netwerk/protocol/http/moz.build
+++ b/netwerk/protocol/http/moz.build
@@ -224,7 +224,7 @@ LOCAL_INCLUDES += [
@@ -225,7 +225,7 @@ LOCAL_INCLUDES += [
"/netwerk/url-classifier",
]

View File

@@ -1,5 +1,5 @@
diff --git a/toolkit/actors/PictureInPictureChild.sys.mjs b/toolkit/actors/PictureInPictureChild.sys.mjs
index 7c383a8112d221d029b64fbb7432abc8ac720d28..e853f1a16149b6010377191b9da560a95a017acb 100644
index 21b6295bf46336a70ed0a3797cf3210c8c0cb545..5a7018f1f923e977f63fae296ffdff1730ad1218 100644
--- a/toolkit/actors/PictureInPictureChild.sys.mjs
+++ b/toolkit/actors/PictureInPictureChild.sys.mjs
@@ -292,6 +292,7 @@ export class PictureInPictureLauncherChild extends JSWindowActorChild {

View File

@@ -1,8 +1,8 @@
diff --git a/toolkit/content/widgets/infobar.css b/toolkit/content/widgets/infobar.css
index 4547df3f3573e95e616c803bc37c7da61bbe6b58..b0540c058d7d31ce929319e5ad9381889b9b6c60 100644
index e2272e913ad0215fa733c5fa01d180ccfa919abc..f6da9321fcdc70ab4a81f01787c3d2a55057fda9 100644
--- a/toolkit/content/widgets/infobar.css
+++ b/toolkit/content/widgets/infobar.css
@@ -97,3 +97,18 @@ strong {
@@ -102,3 +102,18 @@ strong {
:host([type="system"]) .content {
margin-inline-start: 0;
}

View File

@@ -1,5 +1,5 @@
diff --git a/toolkit/modules/AppConstants.sys.mjs b/toolkit/modules/AppConstants.sys.mjs
index a794e82288d30c979f2d2798bded49fb4dd3118b..cd1875dc048607447e25d30341052a6930d1c08f 100644
index 5465ed3fb01e4214029b44f338d5e1e1580c3aab..a4d6b42916014d5e0f643b35a7b4feb281f59023 100644
--- a/toolkit/modules/AppConstants.sys.mjs
+++ b/toolkit/modules/AppConstants.sys.mjs
@@ -172,6 +172,8 @@ export var AppConstants = Object.freeze({

View File

@@ -1,5 +1,5 @@
diff --git a/toolkit/modules/LightweightThemeConsumer.sys.mjs b/toolkit/modules/LightweightThemeConsumer.sys.mjs
index c42269ca92e21d1058046d7247e19dc5fde4c1c0..b12d38aa8999d4c2c4c7218b299cd9ed1566fc7d 100644
index 1d16b3f191a53b6877122086de9bba1fbcaa71f4..64df5577aac095ddd3d9a381bf118496bf279276 100644
--- a/toolkit/modules/LightweightThemeConsumer.sys.mjs
+++ b/toolkit/modules/LightweightThemeConsumer.sys.mjs
@@ -31,7 +31,7 @@ const toolkitVariableMap = [

View File

@@ -1,5 +1,5 @@
diff --git a/toolkit/modules/moz.build b/toolkit/modules/moz.build
index 4c45be797e2cca88d302f98e765545b13da3f0dc..31f2694a8cfb73c4f31b819e4362b46bdb22faef 100644
index 8c020ddc23afd11b2592bfd98b3131613b084202..045be1fa401d24932d0fe4197a9dc0d7a63bcd20 100644
--- a/toolkit/modules/moz.build
+++ b/toolkit/modules/moz.build
@@ -280,6 +280,7 @@ for var in (

View File

@@ -1,5 +1,5 @@
diff --git a/toolkit/moz.configure b/toolkit/moz.configure
index 77069eaacf383214e705f04733cd4f5db1fca1e8..9abbd6a9ba58759a33f9e9a0bea934a5fe022893 100644
index 87abe60e93bc7dfb84052c9735ddddc75b74c229..f4649e9d48a2a2892c48ce536da105dcfa72d73b 100644
--- a/toolkit/moz.configure
+++ b/toolkit/moz.configure
@@ -22,6 +22,7 @@ def check_moz_app_id(moz_app_id, build_project):

View File

@@ -1,5 +1,5 @@
diff --git a/toolkit/mozapps/extensions/AddonManager.sys.mjs b/toolkit/mozapps/extensions/AddonManager.sys.mjs
index e09ea87de86b06d1b505e59d4f0c4a090533ca71..9e8291ee5a83a686f3a129c3c6872bb7c84fdcd9 100644
index 14b57fcca58409671361ac5a5d753d8b71235ea5..e75a8939c4b1c574213ed3e2db6377de99218a1f 100644
--- a/toolkit/mozapps/extensions/AddonManager.sys.mjs
+++ b/toolkit/mozapps/extensions/AddonManager.sys.mjs
@@ -1221,12 +1221,12 @@ var AddonManagerInternal = {

View File

@@ -1,5 +1,5 @@
diff --git a/toolkit/mozapps/extensions/content/aboutaddons.css b/toolkit/mozapps/extensions/content/aboutaddons.css
index d8f84dcbf83d4768b9b8174ccf07706702d690a5..afce2630bf64a262b0f6a9e752db5c745167bf6a 100644
index d8ccfe4b25f8139127c5ef48e739d79d960a7c91..93c6f3b6ec84be3e2f0081d5f7257488f47c7c26 100644
--- a/toolkit/mozapps/extensions/content/aboutaddons.css
+++ b/toolkit/mozapps/extensions/content/aboutaddons.css
@@ -105,6 +105,13 @@ h2 {

View File

@@ -1,5 +1,5 @@
diff --git a/toolkit/themes/shared/tree/tree.css b/toolkit/themes/shared/tree/tree.css
index bd743c2b05729644637c172d973ad057387bc5ce..58589094ff68d1972a32fe4f4087af2c0211ee97 100644
index c50cab31785eecece2bf061b9770ba90c6ed0181..dfbd227ddab802d927b6897454a86fcd7252e96f 100644
--- a/toolkit/themes/shared/tree/tree.css
+++ b/toolkit/themes/shared/tree/tree.css
@@ -12,6 +12,7 @@

View File

@@ -1,8 +1,8 @@
diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm
index 225815aca04da2298605a732b25a3ebe17c109bf..3dcf1dfc5cf6c76380c41c37b778bc4160720960 100644
index f753a7a8bf132044060bdcd7bf14b134ca785f4a..ec1f2b26ea2bc178c66c386dc078d6a8f2ec3423 100644
--- a/widget/cocoa/nsCocoaWindow.mm
+++ b/widget/cocoa/nsCocoaWindow.mm
@@ -7380,7 +7380,7 @@ static NSMutableSet* gSwizzledFrameViewClasses = nil;
@@ -7398,7 +7398,7 @@ static NSMutableSet* gSwizzledFrameViewClasses = nil;
// Returns an autoreleased NSImage.
static NSImage* GetMenuMaskImage() {

View File

@@ -1,8 +1,8 @@
diff --git a/xpfe/appshell/AppWindow.cpp b/xpfe/appshell/AppWindow.cpp
index 3efb67402877b3af707e67a9e431415c20d77a58..5dd20250aacde2d082f09deae0ad846fed90a8d6 100644
index ddd7fb3ff3008b4761ddc63b32c7c265ada024df..d18cddc6e00bc68789435f47fd505e04a4789383 100644
--- a/xpfe/appshell/AppWindow.cpp
+++ b/xpfe/appshell/AppWindow.cpp
@@ -1867,7 +1867,7 @@ nsresult AppWindow::MaybeSaveEarlyWindowPersistentValues(
@@ -1880,7 +1880,7 @@ nsresult AppWindow::MaybeSaveEarlyWindowPersistentValues(
}
}

View File

@@ -604,10 +604,10 @@ var gZenCompactModeManager = {
}, this.HOVER_HACK_DELAY);
};
target.addEventListener('mouseenter', onEnter);
target.addEventListener('mouseover', onEnter);
target.addEventListener('dragover', onEnter);
target.addEventListener('mouseleave', onLeave);
target.addEventListener('mouseout', onLeave);
target.addEventListener('dragleave', onLeave);
}

View File

@@ -13,6 +13,9 @@
<html:div class="tab-group-container">
<html:div class="zen-tab-group-start" />
</html:div>
<vbox class="tab-group-overflow-count-container" pack="center">
<label class="tab-group-overflow-count" role="button" />
</vbox>
`;
static rawIcon = new DOMParser().parseFromString(
@@ -133,11 +136,6 @@
return activeGroups;
}
// Dont expand the folder when the user selects a tab in it
on_TabSelect() {
this.collapsed = this.hasAttribute('has-active');
}
rename() {
gZenVerticalTabsManager.renameTabStart({
target: this.labelElement,

View File

@@ -31,7 +31,7 @@
const ZEN_MAX_SUBFOLDERS = Services.prefs.getIntPref('zen.folders.max-subfolders');
class nsZenFolders extends nsZenPreloadedFeature {
class nsZenFolders extends nsZenDOMOperatedFeature {
#popup = null;
#popupTimer = null;
#mouseTimer = null;
@@ -143,11 +143,11 @@
}
});
this.#popup.addEventListener('mouseenter', () => {
this.#popup.addEventListener('mouseover', () => {
clearTimeout(this.#popupTimer);
});
this.#popup.addEventListener('mouseleave', () => {
this.#popup.addEventListener('mouseout', () => {
this.#popupTimer = setTimeout(() => {
if (this.#popup.matches(':hover')) return;
this.#popup.hidePopup();

View File

@@ -192,6 +192,8 @@ zen-folder {
-moz-window-dragging: no-drag;
transition: margin-inline-start 0.15s ease-in-out;
margin-inline-start: var(--zen-folder-indent) !important;
&[selected] > .tab-group-label-container::before {
background-color: color-mix(in srgb, var(--zen-colors-border) 60%, transparent);
}
@@ -272,7 +274,7 @@ zen-folder {
}
& svg[state='open'] {
scale: 0.9;
scale: 0.92;
}
}
@@ -443,3 +445,7 @@ zen-folder {
border-bottom-right-radius: max(calc(var(--panel-border-radius) - 4px), 4px);
}
}
.tab-group-overflow-count-container {
display: none !important;
}

View File

@@ -7,6 +7,7 @@
#include "nsCOMPtr.h"
#include "nsIFile.h"
#include "nsNetUtil.h"
#include "nsStyleSheetService.h"

View File

@@ -707,7 +707,7 @@
}
async savePin(pin, notifyObservers = true) {
if (!this.#hasInitializedPins) {
if (!this.#hasInitializedPins && !gZenUIManager.testingEnabled) {
return;
}
const existingPin = this._pinsCache.find((p) => p.uuid === pin.uuid);
@@ -1196,10 +1196,11 @@
if (!isPinned) {
topToNormalTabs += draggedTab.getBoundingClientRect().height;
}
const isGoingToPinnedTabs = translate < topToNormalTabs;
const isGoingToPinnedTabs =
translate < topToNormalTabs && gBrowser.pinnedTabCount - gBrowser._numZenEssentials > 0;
const multiplier = isGoingToPinnedTabs !== isPinned ? (isGoingToPinnedTabs ? 1 : -1) : 0;
this._isGoingToPinnedTabs = isGoingToPinnedTabs;
if (!dropElement && gBrowser.pinnedTabCount - gBrowser._numZenEssentials > 0) {
if (!dropElement) {
itemsToCheck.forEach((item) => {
item.style.transform = `translateY(${draggingTabHeight * multiplier}px)`;
});

View File

@@ -0,0 +1,6 @@
[
"zen.mods.updated-value-observer",
"zen.mods.last-update",
"zen.view.compact.should-enable-at-startup",
"browser.newtabpage.activity-stream.trendingSearch.defaultSearchEngine"
]

View File

@@ -41,3 +41,12 @@ add_task(async function test_Basic_Split_Groups_Pinning() {
ok(!group.pinned, 'The split group should be unpinned after unpinning a tab');
});
});
add_task(async function test_Basic_Unsplit_Group_Removed() {
let group;
await basicSplitNTabs(async (tabs) => {
group = tabs[0].group;
});
ok(group, 'The split group should exist');
ok(!group.parentNode, 'The split group should be removed from the DOM after unsplitting');
});

View File

@@ -154,6 +154,7 @@ add_task(async function test_Welcome_Steps() {
'The first tab group should be labeled "Zen Basics" after the welcome process'
);
for (const tab of gBrowser.tabs) {
if (tab.hasAttribute('zen-empty-tab')) continue;
if (tab.pinned) {
if (!tab.hasAttribute('zen-essential')) {
ok(

View File

@@ -68,6 +68,8 @@
this.indicator.querySelector('.zen-current-workspace-indicator-name').onRenameFinished =
this.onIndicatorRenameFinished.bind(this);
this.pinnedTabsContainer.scrollbox = this.scrollbox;
this.indicator
.querySelector('.zen-workspaces-actions')
.addEventListener('click', this.onActionsCommand.bind(this));

View File

@@ -6,7 +6,7 @@
"version": {
"product": "firefox",
"version": "141.0.3",
"candidate": "141.0.3"
"candidate": "142.0"
},
"buildOptions": {
"generateBranding": true