mirror of
				https://github.com/zen-browser/desktop.git
				synced 2025-11-04 09:44:32 +00:00 
			
		
		
		
	Compare commits
	
		
			60 Commits
		
	
	
		
			1.12.7b
			...
			better-sta
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					cc1e375cd1 | ||
| 
						 | 
					6fa0e814de | ||
| 
						 | 
					68191d2b47 | ||
| 
						 | 
					81f7587958 | ||
| 
						 | 
					d5e2acfd5b | ||
| 
						 | 
					663243264b | ||
| 
						 | 
					03ca00748c | ||
| 
						 | 
					cbb1a4bc44 | ||
| 
						 | 
					21f3ab23d3 | ||
| 
						 | 
					18944d5ed8 | ||
| 
						 | 
					5c6e5f7361 | ||
| 
						 | 
					bd72aebd98 | ||
| 
						 | 
					0278aea4f7 | ||
| 
						 | 
					3c01004641 | ||
| 
						 | 
					b8213569e5 | ||
| 
						 | 
					4d27f9d741 | ||
| 
						 | 
					3b56abf090 | ||
| 
						 | 
					590ba6de1b | ||
| 
						 | 
					4aa215e091 | ||
| 
						 | 
					de175bff11 | ||
| 
						 | 
					a6bc8d7105 | ||
| 
						 | 
					e48e7caef1 | ||
| 
						 | 
					015cdad2df | ||
| 
						 | 
					ef6cf5fae1 | ||
| 
						 | 
					797152da89 | ||
| 
						 | 
					316ff45859 | ||
| 
						 | 
					e0ac9ba424 | ||
| 
						 | 
					09ca430b88 | ||
| 
						 | 
					dda1dab6f3 | ||
| 
						 | 
					fbf411c096 | ||
| 
						 | 
					a3de3e221c | ||
| 
						 | 
					4b0c6f2ca5 | ||
| 
						 | 
					c32dc7ecd2 | ||
| 
						 | 
					d6e14ca88c | ||
| 
						 | 
					ebfc885745 | ||
| 
						 | 
					89d7b29b12 | ||
| 
						 | 
					6f5d20fd49 | ||
| 
						 | 
					15bd0b2675 | ||
| 
						 | 
					9132019cb3 | ||
| 
						 | 
					a87cbfd7a3 | ||
| 
						 | 
					d2c6c8b734 | ||
| 
						 | 
					6c5be98173 | ||
| 
						 | 
					d51838caf9 | ||
| 
						 | 
					a61dd0ab87 | ||
| 
						 | 
					d15b1f3c1e | ||
| 
						 | 
					40d38b3961 | ||
| 
						 | 
					addc318f29 | ||
| 
						 | 
					ad124c9d95 | ||
| 
						 | 
					4d48395c19 | ||
| 
						 | 
					9eb0aa0de4 | ||
| 
						 | 
					452b7e0e54 | ||
| 
						 | 
					e10a16bc0d | ||
| 
						 | 
					b26da26192 | ||
| 
						 | 
					be55a26a94 | ||
| 
						 | 
					22d4b22c53 | ||
| 
						 | 
					00a86df321 | ||
| 
						 | 
					b03cdba607 | ||
| 
						 | 
					cce90e6ddc | ||
| 
						 | 
					b6fc0e4db7 | ||
| 
						 | 
					50ed1f0a64 | 
@@ -1,3 +1,4 @@
 | 
				
			|||||||
 | 
					<!-- TODO: Get a job -->
 | 
				
			||||||
<img src="./docs/assets/zen-dark.svg" width="100px" align="left">
 | 
					<img src="./docs/assets/zen-dark.svg" width="100px" align="left">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### `Zen Browser`
 | 
					### `Zen Browser`
 | 
				
			||||||
@@ -28,9 +29,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## 🖥️ Compatibility
 | 
					## 🖥️ Compatibility
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Zen is currently built using Firefox version `138.0.4`! 🚀
 | 
					Zen is currently built using Firefox version `139.0`! 🚀
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- [`Zen Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 138.0.4`!
 | 
					- [`Zen Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 139.0`!
 | 
				
			||||||
- Check out the latest [release notes](https://zen-browser.app/release-notes)!
 | 
					- Check out the latest [release notes](https://zen-browser.app/release-notes)!
 | 
				
			||||||
- Part of our mission is to keep Zen up-to-date with the latest version of Firefox, so you can enjoy the latest features and security updates!
 | 
					- Part of our mission is to keep Zen up-to-date with the latest version of Firefox, so you can enjoy the latest features and security updates!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1 +1 @@
 | 
				
			|||||||
f5fd58c29d2c9bfcc5dcfc8f4abbe69016e13b44
 | 
					da30619f3ea895b356ded705b8dff9e4f271198f
 | 
				
			||||||
							
								
								
									
										2
									
								
								l10n
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								l10n
									
									
									
									
									
								
							 Submodule l10n updated: 102a19cdee...ebecb32da8
									
								
							
							
								
								
									
										8
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										8
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -9,7 +9,7 @@
 | 
				
			|||||||
      "version": "1.0.0",
 | 
					      "version": "1.0.0",
 | 
				
			||||||
      "license": "MPL-2.0",
 | 
					      "license": "MPL-2.0",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@zen-browser/surfer": "^1.11.12"
 | 
					        "@zen-browser/surfer": "^1.11.13"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "devDependencies": {
 | 
					      "devDependencies": {
 | 
				
			||||||
        "@babel/preset-typescript": "^7.27.0",
 | 
					        "@babel/preset-typescript": "^7.27.0",
 | 
				
			||||||
@@ -817,9 +817,9 @@
 | 
				
			|||||||
      "license": "MIT"
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@zen-browser/surfer": {
 | 
					    "node_modules/@zen-browser/surfer": {
 | 
				
			||||||
      "version": "1.11.12",
 | 
					      "version": "1.11.13",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.11.12.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.11.13.tgz",
 | 
				
			||||||
      "integrity": "sha512-wny52xOFvZe5aPXxLVxEcAzDNEiWWoDiCZFlzsNxkyQ5Lw6vzqroMWpjQPJwBRJOc/JssgiXMdd1uwl2LLnovQ==",
 | 
					      "integrity": "sha512-D0TyunAWYtTdJkuUkYeOc6VBXzE9aoDs58kWu/Oi/aU3vd8IbqXPbZZfYwj5FWPWDReMrJUNkkKAEdbL44y9aw==",
 | 
				
			||||||
      "license": "MPL-2.0",
 | 
					      "license": "MPL-2.0",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@resvg/resvg-js": "^1.4.0",
 | 
					        "@resvg/resvg-js": "^1.4.0",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,7 +23,9 @@
 | 
				
			|||||||
    "lint": "npx prettier . --check && autopep8 --diff scripts/ src/",
 | 
					    "lint": "npx prettier . --check && autopep8 --diff scripts/ src/",
 | 
				
			||||||
    "prepare": "husky",
 | 
					    "prepare": "husky",
 | 
				
			||||||
    "reset-ff": "surfer reset",
 | 
					    "reset-ff": "surfer reset",
 | 
				
			||||||
    "surfer": "surfer"
 | 
					    "surfer": "surfer",
 | 
				
			||||||
 | 
					    "test": "python3 scripts/run_tests.py",
 | 
				
			||||||
 | 
					    "test:dbg": "python3 scripts/run_tests.py --jsdebugger --debug-on-failure"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "repository": {
 | 
					  "repository": {
 | 
				
			||||||
    "type": "git",
 | 
					    "type": "git",
 | 
				
			||||||
@@ -40,7 +42,7 @@
 | 
				
			|||||||
  },
 | 
					  },
 | 
				
			||||||
  "homepage": "https://github.com/zen-browser/desktop#readme",
 | 
					  "homepage": "https://github.com/zen-browser/desktop#readme",
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "@zen-browser/surfer": "^1.11.12"
 | 
					    "@zen-browser/surfer": "^1.11.13"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "devDependencies": {
 | 
					  "devDependencies": {
 | 
				
			||||||
    "@babel/preset-typescript": "^7.27.0",
 | 
					    "@babel/preset-typescript": "^7.27.0",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										45
									
								
								scripts/run_tests.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								scripts/run_tests.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
				
			|||||||
 | 
					import os
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					import subprocess
 | 
				
			||||||
 | 
					from pathlib import Path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def main():
 | 
				
			||||||
 | 
					  project_root = Path(__file__).resolve().parent.parent
 | 
				
			||||||
 | 
					  package_json = project_root / 'package.json'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Ensure script is run from project root
 | 
				
			||||||
 | 
					  if not package_json.exists():
 | 
				
			||||||
 | 
					    print("Please run this script from the root of the project", file=sys.stderr)
 | 
				
			||||||
 | 
					    sys.exit(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  args = sys.argv[1:]
 | 
				
			||||||
 | 
					  path = ""
 | 
				
			||||||
 | 
					  for arg in args:
 | 
				
			||||||
 | 
					    if not arg.startswith("--"):
 | 
				
			||||||
 | 
					      path = arg
 | 
				
			||||||
 | 
					      break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Collect any additional arguments
 | 
				
			||||||
 | 
					  other_args = [arg for arg in args if arg != path]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  engine_dir = project_root / 'engine'
 | 
				
			||||||
 | 
					  os.chdir(engine_dir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def run_mach_with_paths(test_paths):
 | 
				
			||||||
 | 
					    command = ['./mach', 'mochitest'] + other_args + test_paths
 | 
				
			||||||
 | 
					    subprocess.run(command, check=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if path in ("", "all"):
 | 
				
			||||||
 | 
					    test_dirs = [p for p in Path("zen/tests").iterdir() if p.is_dir()]
 | 
				
			||||||
 | 
					    test_paths = [str(p) for p in test_dirs]
 | 
				
			||||||
 | 
					    run_mach_with_paths(test_paths)
 | 
				
			||||||
 | 
					  else:
 | 
				
			||||||
 | 
					    run_mach_with_paths([f"zen/tests/{path}"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # Return to original directory
 | 
				
			||||||
 | 
					  os.chdir(project_root)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if __name__ == "__main__":
 | 
				
			||||||
 | 
					  main()
 | 
				
			||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/Cargo.lock b/Cargo.lock
 | 
					diff --git a/Cargo.lock b/Cargo.lock
 | 
				
			||||||
index 38508fffccbce801a02d4a4211f368674307c4d3..5ce56c36da2e242ad81621c2032eb68dcd26e960 100644
 | 
					index f7ebed9b2a71da90c5751cfd5d5f018cc8b73612..96e881c7782198f1e58be2578f167c7079a8191e 100644
 | 
				
			||||||
--- a/Cargo.lock
 | 
					--- a/Cargo.lock
 | 
				
			||||||
+++ b/Cargo.lock
 | 
					+++ b/Cargo.lock
 | 
				
			||||||
@@ -3931,8 +3931,6 @@ dependencies = [
 | 
					@@ -4014,8 +4014,6 @@ dependencies = [
 | 
				
			||||||
 [[package]]
 | 
					 [[package]]
 | 
				
			||||||
 name = "mime_guess"
 | 
					 name = "mime_guess"
 | 
				
			||||||
 version = "2.0.4"
 | 
					 version = "2.0.4"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/Cargo.toml b/Cargo.toml
 | 
					diff --git a/Cargo.toml b/Cargo.toml
 | 
				
			||||||
index d3d529b487f80d4b4f3bfa13cdd3f62946352db8..b35a9e0e3339d48d1cd0cab7b22d030f330e40d1 100644
 | 
					index 8c6b99bc629ec26e01ab3746f2ae46174bfaa0b1..5791c7470923c7c15986089b40357ce80365e942 100644
 | 
				
			||||||
--- a/Cargo.toml
 | 
					--- a/Cargo.toml
 | 
				
			||||||
+++ b/Cargo.toml
 | 
					+++ b/Cargo.toml
 | 
				
			||||||
@@ -217,6 +217,9 @@ rure = { path = "third_party/rust/rure" }
 | 
					@@ -233,6 +233,9 @@ rure = { path = "third_party/rust/rure" }
 | 
				
			||||||
 # Patch `plist` to work with `indexmap` 2.*
 | 
					 # Patch `plist` to work with `indexmap` 2.*
 | 
				
			||||||
 plist = { path = "third_party/rust/plist" }
 | 
					 plist = { path = "third_party/rust/plist" }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/browser/actors/WebRTCParent.sys.mjs b/browser/actors/WebRTCParent.sys.mjs
 | 
					diff --git a/browser/actors/WebRTCParent.sys.mjs b/browser/actors/WebRTCParent.sys.mjs
 | 
				
			||||||
index 40e3a057a1d4b2f9bcfb73fa5ff96b2555865434..a92bed06766dd930bd336d56cd9ddcf3c6c0eeca 100644
 | 
					index 4ed2dd19207fc38b9e5cc22ea2947aba94b2f5ad..ffc88d62dc46683399c68cdfd35f1b1efde70902 100644
 | 
				
			||||||
--- a/browser/actors/WebRTCParent.sys.mjs
 | 
					--- a/browser/actors/WebRTCParent.sys.mjs
 | 
				
			||||||
+++ b/browser/actors/WebRTCParent.sys.mjs
 | 
					+++ b/browser/actors/WebRTCParent.sys.mjs
 | 
				
			||||||
@@ -152,6 +152,7 @@ export class WebRTCParent extends JSWindowActorParent {
 | 
					@@ -152,6 +152,7 @@ export class WebRTCParent extends JSWindowActorParent {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,10 +9,14 @@ pref("browser.tabs.closeWindowWithLastTab", false);
 | 
				
			|||||||
pref("browser.tabs.loadBookmarksInTabs", false);
 | 
					pref("browser.tabs.loadBookmarksInTabs", false);
 | 
				
			||||||
pref("browser.tabs.hoverPreview.enabled", false);
 | 
					pref("browser.tabs.hoverPreview.enabled", false);
 | 
				
			||||||
pref("browser.tabs.dragdrop.moveOverThresholdPercent", 50);
 | 
					pref("browser.tabs.dragdrop.moveOverThresholdPercent", 50);
 | 
				
			||||||
 | 
					pref("browser.tabs.unloadTabInContextMenu", true);
 | 
				
			||||||
 | 
					pref("browser.tabs.fadeOutExplicitlyUnloadedTabs", true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pref('browser.toolbars.bookmarks.visibility', 'never');
 | 
					pref('browser.toolbars.bookmarks.visibility', 'never');
 | 
				
			||||||
pref("browser.bookmarks.openInTabClosesMenu", false);
 | 
					pref("browser.bookmarks.openInTabClosesMenu", false);
 | 
				
			||||||
pref("browser.menu.showViewImageInfo", true);
 | 
					pref("browser.menu.showViewImageInfo", true);
 | 
				
			||||||
pref("findbar.highlightAll", true);
 | 
					pref("findbar.highlightAll", true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pref("layout.word_select.eat_space_to_next_word", false);
 | 
					pref("layout.word_select.eat_space_to_next_word", false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Better Windows theming
 | 
					// Better Windows theming
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,13 +22,17 @@ pref('zen.mediacontrols.enabled', true);
 | 
				
			|||||||
// Exposure:
 | 
					// Exposure:
 | 
				
			||||||
pref('zen.haptic-feedback.enabled', true);
 | 
					pref('zen.haptic-feedback.enabled', true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pref('zen.mods.auto-update-days', 20); // In days
 | 
				
			||||||
#ifdef MOZILLA_OFFICIAL
 | 
					#ifdef MOZILLA_OFFICIAL
 | 
				
			||||||
 | 
					pref('zen.mods.auto-update', true);
 | 
				
			||||||
pref('zen.rice.api.url', 'https://share.zen-browser.app', locked);
 | 
					pref('zen.rice.api.url', 'https://share.zen-browser.app', locked);
 | 
				
			||||||
pref('zen.injections.match-urls', 'https://zen-browser.app/*,https://share.zen-browser.app/*', locked);
 | 
					pref('zen.injections.match-urls', 'https://zen-browser.app/*,https://share.zen-browser.app/*', locked);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
 | 
					pref('zen.mods.auto-update', false);
 | 
				
			||||||
pref('zen.rice.api.url', "http://localhost", locked);
 | 
					pref('zen.rice.api.url', "http://localhost", locked);
 | 
				
			||||||
pref('zen.injections.match-urls', 'http://localhost/*', locked);
 | 
					pref('zen.injections.match-urls', 'http://localhost/*', locked);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pref('zen.rice.share.notice.accepted', false);
 | 
					pref('zen.rice.share.notice.accepted', false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef XP_MACOSX
 | 
					#ifdef XP_MACOSX
 | 
				
			||||||
@@ -64,14 +68,6 @@ pref('zen.urlbar.show-domain-only-in-sidebar', true);
 | 
				
			|||||||
pref('zen.urlbar.hide-one-offs', true);
 | 
					pref('zen.urlbar.hide-one-offs', true);
 | 
				
			||||||
pref('zen.urlbar.enable-overrides', false);
 | 
					pref('zen.urlbar.enable-overrides', false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Exoerimental: Apply a blend mode to the websites so they can render rounded corners
 | 
					 | 
				
			||||||
// IMPORTANT: Remove once firefox 139 is released
 | 
					 | 
				
			||||||
#ifdef XP_MACOSX
 | 
					 | 
				
			||||||
pref('zen.view.experimental-rounded-view', false);
 | 
					 | 
				
			||||||
#else 
 | 
					 | 
				
			||||||
pref('zen.view.experimental-rounded-view', true);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Glance
 | 
					// Glance
 | 
				
			||||||
pref('zen.glance.enabled', true);
 | 
					pref('zen.glance.enabled', true);
 | 
				
			||||||
pref('zen.glance.hold-duration', 300); // in ms
 | 
					pref('zen.glance.hold-duration', 300); // in ms
 | 
				
			||||||
@@ -99,18 +95,12 @@ pref('zen.view.grey-out-inactive-windows', true);
 | 
				
			|||||||
pref('zen.view.hide-window-controls', true);
 | 
					pref('zen.view.hide-window-controls', true);
 | 
				
			||||||
pref('zen.view.experimental-no-window-controls', false);
 | 
					pref('zen.view.experimental-no-window-controls', false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pref('zen.tabs.dim-pending', true);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pref('zen.keyboard.shortcuts.enabled', true);
 | 
					pref('zen.keyboard.shortcuts.enabled', true);
 | 
				
			||||||
pref('zen.keyboard.shortcuts.version', 0); // Empty string means default shortcuts
 | 
					pref('zen.keyboard.shortcuts.version', 0); // Empty string means default shortcuts
 | 
				
			||||||
pref('zen.keyboard.shortcuts.disable-mainkeyset-clear', false); // for debugging
 | 
					pref('zen.keyboard.shortcuts.disable-mainkeyset-clear', false); // for debugging
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pref('zen.themes.updated-value-observer', false);
 | 
					pref('zen.themes.updated-value-observer', false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pref('zen.tab-unloader.enabled', true);
 | 
					 | 
				
			||||||
pref('zen.tab-unloader.timeout-minutes', 40);
 | 
					 | 
				
			||||||
pref('zen.tab-unloader.excluded-urls', "example.com,example.org");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pref('zen.pinned-tab-manager.debug', false);
 | 
					pref('zen.pinned-tab-manager.debug', false);
 | 
				
			||||||
pref('zen.pinned-tab-manager.restore-pinned-tabs-to-pinned-url', false);
 | 
					pref('zen.pinned-tab-manager.restore-pinned-tabs-to-pinned-url', false);
 | 
				
			||||||
pref('zen.pinned-tab-manager.close-shortcut-behavior', 'reset-unload-switch');
 | 
					pref('zen.pinned-tab-manager.close-shortcut-behavior', 'reset-unload-switch');
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js
 | 
					diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js
 | 
				
			||||||
index eda8312b0edd34ed22c94c224167680ac6c9c459..56de47f79c553dab2676e127f5320e352b7d3a77 100644
 | 
					index beced8067e6c8b5c8cf8e3f6060ba259ec9a294d..33a264e7f9cf97944da3888bdb957fa6e7c4c346 100644
 | 
				
			||||||
--- a/browser/app/profile/firefox.js
 | 
					--- a/browser/app/profile/firefox.js
 | 
				
			||||||
+++ b/browser/app/profile/firefox.js
 | 
					+++ b/browser/app/profile/firefox.js
 | 
				
			||||||
@@ -3377,3 +3377,5 @@ pref("toolkit.contentRelevancy.enabled", false);
 | 
					@@ -3398,3 +3398,5 @@ pref("toolkit.contentRelevancy.enabled", false);
 | 
				
			||||||
 pref("toolkit.contentRelevancy.ingestEnabled", false);
 | 
					 pref("toolkit.contentRelevancy.ingestEnabled", false);
 | 
				
			||||||
 // Pref to enable extra logging for the content relevancy feature
 | 
					 // Pref to enable extra logging for the content relevancy feature
 | 
				
			||||||
 pref("toolkit.contentRelevancy.log", false);
 | 
					 pref("toolkit.contentRelevancy.log", false);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,6 +12,19 @@ pref("gfx.canvas.accelerated", true);
 | 
				
			|||||||
pref("media.hardware-video-decoding.enabled", true);
 | 
					pref("media.hardware-video-decoding.enabled", true);
 | 
				
			||||||
pref("layers.gpu-process.enabled", true);
 | 
					pref("layers.gpu-process.enabled", true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef XP_MACOSX
 | 
				
			||||||
 | 
					// Pref to control the reponse taken on macOS when the OS is under memory
 | 
				
			||||||
 | 
					// pressure. Changes to the pref take effect immediately. Browser restart not
 | 
				
			||||||
 | 
					// required. The pref value is a bitmask:
 | 
				
			||||||
 | 
					// 0x0: No response (other than recording for telemetry, crash reporting)
 | 
				
			||||||
 | 
					// 0x1: Use the tab unloading feature to reduce memory use. Requires that
 | 
				
			||||||
 | 
					//      the above "browser.tabs.unloadOnLowMemory" pref be set to true for tab
 | 
				
			||||||
 | 
					//      unloading to occur.
 | 
				
			||||||
 | 
					// 0x2: Issue the internal "memory-pressure" notification to reduce memory use
 | 
				
			||||||
 | 
					// 0x3: Both 0x1 and 0x2.
 | 
				
			||||||
 | 
					pref("browser.lowMemoryResponseMask", 3);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Prefetching:
 | 
					// Prefetching:
 | 
				
			||||||
pref("network.dns.disablePrefetch", false);
 | 
					pref("network.dns.disablePrefetch", false);
 | 
				
			||||||
pref("network.prefetch-next", true);
 | 
					pref("network.prefetch-next", true);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/browser/base/content/aboutDialog.js b/browser/base/content/aboutDialog.js
 | 
					diff --git a/browser/base/content/aboutDialog.js b/browser/base/content/aboutDialog.js
 | 
				
			||||||
index f6e1391baf12abb91c85a95107bb3923118746c0..76c7b75a4e29056110f1631a50047c4ddd8b1f4a 100644
 | 
					index f6e1391baf12abb91c85a95107bb3923118746c0..cac04aa288e8a305d0c8b28e0c919abce87658e5 100644
 | 
				
			||||||
--- a/browser/base/content/aboutDialog.js
 | 
					--- a/browser/base/content/aboutDialog.js
 | 
				
			||||||
+++ b/browser/base/content/aboutDialog.js
 | 
					+++ b/browser/base/content/aboutDialog.js
 | 
				
			||||||
@@ -52,7 +52,7 @@ function init() {
 | 
					@@ -52,7 +52,7 @@ function init() {
 | 
				
			||||||
@@ -20,3 +20,18 @@ index f6e1391baf12abb91c85a95107bb3923118746c0..76c7b75a4e29056110f1631a50047c4d
 | 
				
			|||||||
     versionIdKey += "-nightly";
 | 
					     versionIdKey += "-nightly";
 | 
				
			||||||
     let buildID = Services.appinfo.appBuildID;
 | 
					     let buildID = Services.appinfo.appBuildID;
 | 
				
			||||||
     let year = buildID.slice(0, 4);
 | 
					     let year = buildID.slice(0, 4);
 | 
				
			||||||
 | 
					@@ -125,14 +125,6 @@ function init() {
 | 
				
			||||||
 | 
					       window.close();
 | 
				
			||||||
 | 
					     });
 | 
				
			||||||
 | 
					   if (AppConstants.MOZ_UPDATER) {
 | 
				
			||||||
 | 
					-    document
 | 
				
			||||||
 | 
					-      .getElementById("aboutDialogHelpLink")
 | 
				
			||||||
 | 
					-      .addEventListener("click", () => {
 | 
				
			||||||
 | 
					-        openHelpLink("firefox-help");
 | 
				
			||||||
 | 
					-      });
 | 
				
			||||||
 | 
					-    document
 | 
				
			||||||
 | 
					-      .getElementById("submit-feedback")
 | 
				
			||||||
 | 
					-      .addEventListener("click", openFeedbackPage);
 | 
				
			||||||
 | 
					     document
 | 
				
			||||||
 | 
					       .getElementById("checkForUpdatesButton")
 | 
				
			||||||
 | 
					       .addEventListener("command", () => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/browser/base/content/aboutDialog.xhtml b/browser/base/content/aboutDialog.xhtml
 | 
					diff --git a/browser/base/content/aboutDialog.xhtml b/browser/base/content/aboutDialog.xhtml
 | 
				
			||||||
index c64980810570fcea84e33fdc2d66ac42a79f4e46..b7198e810a7510fa82cc6801cfd01c88a08d42c1 100644
 | 
					index c64980810570fcea84e33fdc2d66ac42a79f4e46..6ef9bf4b88f0a0539d833f662c4dd890fd1fde93 100644
 | 
				
			||||||
--- a/browser/base/content/aboutDialog.xhtml
 | 
					--- a/browser/base/content/aboutDialog.xhtml
 | 
				
			||||||
+++ b/browser/base/content/aboutDialog.xhtml
 | 
					+++ b/browser/base/content/aboutDialog.xhtml
 | 
				
			||||||
@@ -35,6 +35,7 @@
 | 
					@@ -35,6 +35,7 @@
 | 
				
			||||||
@@ -10,7 +10,18 @@ index c64980810570fcea84e33fdc2d66ac42a79f4e46..b7198e810a7510fa82cc6801cfd01c88
 | 
				
			|||||||
   </linkset>
 | 
					   </linkset>
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
   <html:div id="aboutDialogContainer">
 | 
					   <html:div id="aboutDialogContainer">
 | 
				
			||||||
@@ -125,21 +126,23 @@
 | 
					@@ -102,10 +103,6 @@
 | 
				
			||||||
 | 
					                 <label id="version" class="update"/>
 | 
				
			||||||
 | 
					                 <label id="releasenotes" is="text-link" hidden="true" data-l10n-id="releaseNotes-link"/>
 | 
				
			||||||
 | 
					               </hbox>
 | 
				
			||||||
 | 
					-              <description class="text-blurb">
 | 
				
			||||||
 | 
					-                <label id="aboutDialogHelpLink" is="text-link" data-l10n-id="aboutdialog-help-user"/>
 | 
				
			||||||
 | 
					-                <label id="submit-feedback" is="text-link" data-l10n-id="aboutdialog-submit-feedback"/>
 | 
				
			||||||
 | 
					-              </description>
 | 
				
			||||||
 | 
					             </vbox>
 | 
				
			||||||
 | 
					 #endif
 | 
				
			||||||
 | 
					           </hbox>
 | 
				
			||||||
 | 
					@@ -125,21 +122,17 @@
 | 
				
			||||||
             </description>
 | 
					             </description>
 | 
				
			||||||
           </vbox>
 | 
					           </vbox>
 | 
				
			||||||
           <description class="text-blurb" id="communityDesc" data-l10n-id="community-2">
 | 
					           <description class="text-blurb" id="communityDesc" data-l10n-id="community-2">
 | 
				
			||||||
@@ -18,12 +29,10 @@ index c64980810570fcea84e33fdc2d66ac42a79f4e46..b7198e810a7510fa82cc6801cfd01c88
 | 
				
			|||||||
+            <label is="text-link" href="https://github.com/zen-browser/desktop" data-l10n-name="community-mozillaLink"/>
 | 
					+            <label is="text-link" href="https://github.com/zen-browser/desktop" data-l10n-name="community-mozillaLink"/>
 | 
				
			||||||
             <label is="text-link" useoriginprincipal="true" href="about:credits" data-l10n-name="community-creditsLink"/>
 | 
					             <label is="text-link" useoriginprincipal="true" href="about:credits" data-l10n-name="community-creditsLink"/>
 | 
				
			||||||
           </description>
 | 
					           </description>
 | 
				
			||||||
+#if 0
 | 
					-          <description class="text-blurb" id="contributeDesc" data-l10n-id="helpus">
 | 
				
			||||||
           <description class="text-blurb" id="contributeDesc" data-l10n-id="helpus">
 | 
					-            <label is="text-link" href="https://foundation.mozilla.org/?form=firefox-about" data-l10n-name="helpus-donateLink"/>
 | 
				
			||||||
             <label is="text-link" href="https://foundation.mozilla.org/?form=firefox-about" data-l10n-name="helpus-donateLink"/>
 | 
					-            <label is="text-link" href="https://www.mozilla.org/contribute/?utm_source=firefox-browser&utm_medium=firefox-desktop&utm_campaign=about-dialog" data-l10n-name="helpus-getInvolvedLink"/>
 | 
				
			||||||
             <label is="text-link" href="https://www.mozilla.org/contribute/?utm_source=firefox-browser&utm_medium=firefox-desktop&utm_campaign=about-dialog" data-l10n-name="helpus-getInvolvedLink"/>
 | 
					-          </description>
 | 
				
			||||||
           </description>
 | 
					 | 
				
			||||||
+#endif
 | 
					 | 
				
			||||||
         </vbox>
 | 
					         </vbox>
 | 
				
			||||||
       </vbox>
 | 
					       </vbox>
 | 
				
			||||||
     </hbox>
 | 
					     </hbox>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,35 @@
 | 
				
			|||||||
diff --git a/browser/base/content/browser-addons.js b/browser/base/content/browser-addons.js
 | 
					diff --git a/browser/base/content/browser-addons.js b/browser/base/content/browser-addons.js
 | 
				
			||||||
index 992d07daaef1abc4554a43aa654888f66963c575..73e620b70b7ed14e9d140e875c2cd5f5ac31456b 100644
 | 
					index 73593191936cc345ee8e2c28cb251dc13f4c2fd4..e6c459c1ebc60a1f3930a55e212570f696bf07a0 100644
 | 
				
			||||||
--- a/browser/base/content/browser-addons.js
 | 
					--- a/browser/base/content/browser-addons.js
 | 
				
			||||||
+++ b/browser/base/content/browser-addons.js
 | 
					+++ b/browser/base/content/browser-addons.js
 | 
				
			||||||
@@ -2105,18 +2105,20 @@ var gUnifiedExtensions = {
 | 
					@@ -735,7 +735,7 @@ var gXPInstallObserver = {
 | 
				
			||||||
 | 
					       persistent: true,
 | 
				
			||||||
 | 
					       hideClose: true,
 | 
				
			||||||
 | 
					       popupOptions: {
 | 
				
			||||||
 | 
					-        position: "bottomright topright",
 | 
				
			||||||
 | 
					+        position: gZenUIManager.panelUIPosition,
 | 
				
			||||||
 | 
					       },
 | 
				
			||||||
 | 
					     };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -942,7 +942,7 @@ var gXPInstallObserver = {
 | 
				
			||||||
 | 
					       hideClose: true,
 | 
				
			||||||
 | 
					       timeout: Date.now() + 30000,
 | 
				
			||||||
 | 
					       popupOptions: {
 | 
				
			||||||
 | 
					-        position: "bottomright topright",
 | 
				
			||||||
 | 
					+        position: gZenUIManager.panelUIPosition,
 | 
				
			||||||
 | 
					       },
 | 
				
			||||||
 | 
					     };
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -2125,7 +2125,7 @@ var gUnifiedExtensions = {
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					         panel.hidden = false;
 | 
				
			||||||
 | 
					         PanelMultiView.openPopup(panel, this._button, {
 | 
				
			||||||
 | 
					-          position: "bottomright topright",
 | 
				
			||||||
 | 
					+          position: gZenUIManager.panelUIPosition,
 | 
				
			||||||
 | 
					           triggerEvent: aEvent,
 | 
				
			||||||
 | 
					         });
 | 
				
			||||||
 | 
					       }
 | 
				
			||||||
 | 
					@@ -2294,18 +2294,20 @@ var gUnifiedExtensions = {
 | 
				
			||||||
       this._maybeMoveWidgetNodeBack(widgetId);
 | 
					       this._maybeMoveWidgetNodeBack(widgetId);
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
 | 
					diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
 | 
				
			||||||
index ea79d296e7dd0f8fd812b0677a252af5cf7ad26e..08568d90f888cc262a23ffaa72e985e7c3463b93 100644
 | 
					index 6d664917a5a3bb1cea8a747e42e8bc0065ec999e..5059293ebfa29d646455b7a3505bd6eae408ba64 100644
 | 
				
			||||||
--- a/browser/base/content/browser.js
 | 
					--- a/browser/base/content/browser.js
 | 
				
			||||||
+++ b/browser/base/content/browser.js
 | 
					+++ b/browser/base/content/browser.js
 | 
				
			||||||
@@ -33,6 +33,7 @@ ChromeUtils.defineESModuleGetters(this, {
 | 
					@@ -33,6 +33,7 @@ ChromeUtils.defineESModuleGetters(this, {
 | 
				
			||||||
@@ -10,19 +10,18 @@ index ea79d296e7dd0f8fd812b0677a252af5cf7ad26e..08568d90f888cc262a23ffaa72e985e7
 | 
				
			|||||||
   DevToolsSocketStatus:
 | 
					   DevToolsSocketStatus:
 | 
				
			||||||
     "resource://devtools/shared/security/DevToolsSocketStatus.sys.mjs",
 | 
					     "resource://devtools/shared/security/DevToolsSocketStatus.sys.mjs",
 | 
				
			||||||
   DownloadUtils: "resource://gre/modules/DownloadUtils.sys.mjs",
 | 
					   DownloadUtils: "resource://gre/modules/DownloadUtils.sys.mjs",
 | 
				
			||||||
@@ -2338,6 +2339,11 @@ var XULBrowserWindow = {
 | 
					@@ -2340,6 +2341,10 @@ var XULBrowserWindow = {
 | 
				
			||||||
     AboutReaderParent.updateReaderButton(gBrowser.selectedBrowser);
 | 
					     AboutReaderParent.updateReaderButton(gBrowser.selectedBrowser);
 | 
				
			||||||
     TranslationsParent.onLocationChange(gBrowser.selectedBrowser);
 | 
					     TranslationsParent.onLocationChange(gBrowser.selectedBrowser);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
+    gZenViewSplitter.onLocationChange(gBrowser.selectedBrowser);
 | 
					+    gZenViewSplitter.onLocationChange(gBrowser.selectedBrowser);
 | 
				
			||||||
+    gZenWorkspaces.onLocationChange(gBrowser.selectedBrowser);
 | 
					+    gZenWorkspaces.onLocationChange(gBrowser.selectedBrowser);
 | 
				
			||||||
+    gZenTabUnloader.onLocationChange(gBrowser.selectedBrowser);
 | 
					 | 
				
			||||||
+    gZenPinnedTabManager.onLocationChange(gBrowser.selectedBrowser);
 | 
					+    gZenPinnedTabManager.onLocationChange(gBrowser.selectedBrowser);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
     PictureInPicture.updateUrlbarToggle(gBrowser.selectedBrowser);
 | 
					     PictureInPicture.updateUrlbarToggle(gBrowser.selectedBrowser);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     if (!gMultiProcessBrowser) {
 | 
					     if (!gMultiProcessBrowser) {
 | 
				
			||||||
@@ -4814,7 +4820,7 @@ function switchToTabHavingURI(
 | 
					@@ -4816,7 +4821,7 @@ function switchToTabHavingURI(
 | 
				
			||||||
       ignoreQueryString || replaceQueryString,
 | 
					       ignoreQueryString || replaceQueryString,
 | 
				
			||||||
       ignoreFragmentWhenComparing
 | 
					       ignoreFragmentWhenComparing
 | 
				
			||||||
     );
 | 
					     );
 | 
				
			||||||
@@ -31,7 +30,7 @@ index ea79d296e7dd0f8fd812b0677a252af5cf7ad26e..08568d90f888cc262a23ffaa72e985e7
 | 
				
			|||||||
     for (let i = 0; i < browsers.length; i++) {
 | 
					     for (let i = 0; i < browsers.length; i++) {
 | 
				
			||||||
       let browser = browsers[i];
 | 
					       let browser = browsers[i];
 | 
				
			||||||
       let browserCompare = cleanURL(
 | 
					       let browserCompare = cleanURL(
 | 
				
			||||||
@@ -4857,7 +4863,7 @@ function switchToTabHavingURI(
 | 
					@@ -4859,7 +4864,7 @@ function switchToTabHavingURI(
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
         if (!doAdopt) {
 | 
					         if (!doAdopt) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml
 | 
					diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml
 | 
				
			||||||
index 51a25aaa5558e6e17246d54a7ed95d5ddf3ecdab..08809c25c01d159a9903f1921936b178d51f9875 100644
 | 
					index 8f8c5536cb6e54300897180ca3f950974c60e930..79305485631f14712d8b2674f477b641ec53fcd6 100644
 | 
				
			||||||
--- a/browser/base/content/browser.xhtml
 | 
					--- a/browser/base/content/browser.xhtml
 | 
				
			||||||
+++ b/browser/base/content/browser.xhtml
 | 
					+++ b/browser/base/content/browser.xhtml
 | 
				
			||||||
@@ -26,6 +26,7 @@
 | 
					@@ -26,6 +26,7 @@
 | 
				
			||||||
@@ -10,7 +10,7 @@ index 51a25aaa5558e6e17246d54a7ed95d5ddf3ecdab..08809c25c01d159a9903f1921936b178
 | 
				
			|||||||
         persist="screenX screenY width height sizemode"
 | 
					         persist="screenX screenY width height sizemode"
 | 
				
			||||||
         data-l10n-sync="true">
 | 
					         data-l10n-sync="true">
 | 
				
			||||||
 <head>
 | 
					 <head>
 | 
				
			||||||
@@ -104,8 +105,11 @@
 | 
					@@ -105,8 +106,11 @@
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
   <title data-l10n-id="browser-main-window-default-title"></title>
 | 
					   <title data-l10n-id="browser-main-window-default-title"></title>
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -22,7 +22,7 @@ index 51a25aaa5558e6e17246d54a7ed95d5ddf3ecdab..08809c25c01d159a9903f1921936b178
 | 
				
			|||||||
 </head>
 | 
					 </head>
 | 
				
			||||||
 <html:body xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 | 
					 <html:body xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 | 
				
			||||||
 # All sets except for popupsets (commands, keys, and stringbundles)
 | 
					 # All sets except for popupsets (commands, keys, and stringbundles)
 | 
				
			||||||
@@ -127,9 +131,11 @@
 | 
					@@ -128,9 +132,11 @@
 | 
				
			||||||
     </vbox>
 | 
					     </vbox>
 | 
				
			||||||
   </html:template>
 | 
					   </html:template>
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,19 +29,15 @@
 | 
				
			|||||||
</linkset>
 | 
					</linkset>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Scripts used all over the browser
 | 
					# Scripts used all over the browser
 | 
				
			||||||
<script>
 | 
					<script src="chrome://browser/content/ZenUIManager.mjs"></script>
 | 
				
			||||||
Services.scriptloader.loadSubScript("chrome://browser/content/ZenUIManager.mjs", this);
 | 
					<script src="chrome://browser/content/zen-components/ZenFolders.mjs"></script>
 | 
				
			||||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenFolders.mjs", this);
 | 
					<script src="chrome://browser/content/zen-components/ZenMods.mjs"></script>
 | 
				
			||||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenThemesCommon.mjs", this);
 | 
					<script src="chrome://browser/content/zen-components/ZenCompactMode.mjs"></script>
 | 
				
			||||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenThemesImporter.mjs", this);
 | 
					<script src="chrome://browser/content/zen-components/ZenPinnedTabsStorage.mjs"></script>
 | 
				
			||||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenCompactMode.mjs", this);
 | 
					<script src="chrome://browser/content/zen-components/ZenWorkspacesStorage.mjs"></script>
 | 
				
			||||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenTabUnloader.mjs", this);
 | 
					<script src="chrome://browser/content/zen-components/ZenPinnedTabManager.mjs"></script>
 | 
				
			||||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenPinnedTabsStorage.mjs", this);
 | 
					<script src="chrome://browser/content/zen-components/ZenGradientGenerator.mjs"></script>
 | 
				
			||||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenWorkspacesStorage.mjs", this);
 | 
					<script src="chrome://browser/content/zen-components/ZenViewSplitter.mjs"></script>
 | 
				
			||||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenPinnedTabManager.mjs", this);
 | 
					<script src="chrome://browser/content/zen-components/ZenGlanceManager.mjs"></script>
 | 
				
			||||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenGradientGenerator.mjs", this);
 | 
					<script src="chrome://browser/content/zen-components/ZenMediaController.mjs"></script>
 | 
				
			||||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenViewSplitter.mjs", this);
 | 
					<script src="chrome://browser/content/zen-components/ZenDownloadAnimation.mjs"></script>
 | 
				
			||||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenGlanceManager.mjs", this);
 | 
					 | 
				
			||||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenMediaController.mjs", this);
 | 
					 | 
				
			||||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenDownloadAnimation.mjs", this);
 | 
					 | 
				
			||||||
</script>
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,6 +9,7 @@
 | 
				
			|||||||
        content/browser/ZenCustomizableUI.sys.mjs                               (../../zen/common/ZenCustomizableUI.sys.mjs)
 | 
					        content/browser/ZenCustomizableUI.sys.mjs                               (../../zen/common/ZenCustomizableUI.sys.mjs)
 | 
				
			||||||
        content/browser/zen-components/ZenUIMigration.mjs                       (../../zen/common/ZenUIMigration.mjs)
 | 
					        content/browser/zen-components/ZenUIMigration.mjs                       (../../zen/common/ZenUIMigration.mjs)
 | 
				
			||||||
        content/browser/zen-components/ZenCommonUtils.mjs                       (../../zen/common/ZenCommonUtils.mjs)
 | 
					        content/browser/zen-components/ZenCommonUtils.mjs                       (../../zen/common/ZenCommonUtils.mjs)
 | 
				
			||||||
 | 
					        content/browser/zen-components/ZenSessionStore.mjs                      (../../zen/common/ZenSessionStore.mjs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        content/browser/zen-styles/zen-theme.css                                (../../zen/common/styles/zen-theme.css)
 | 
					        content/browser/zen-styles/zen-theme.css                                (../../zen/common/styles/zen-theme.css)
 | 
				
			||||||
        content/browser/zen-styles/zen-buttons.css                              (../../zen/common/styles/zen-buttons.css)
 | 
					        content/browser/zen-styles/zen-buttons.css                              (../../zen/common/styles/zen-buttons.css)
 | 
				
			||||||
@@ -34,10 +35,7 @@
 | 
				
			|||||||
        content/browser/zen-components/ZenViewSplitter.mjs                      (../../zen/split-view/ZenViewSplitter.mjs)
 | 
					        content/browser/zen-components/ZenViewSplitter.mjs                      (../../zen/split-view/ZenViewSplitter.mjs)
 | 
				
			||||||
        content/browser/zen-styles/zen-decks.css                                (../../zen/split-view/zen-decks.css)
 | 
					        content/browser/zen-styles/zen-decks.css                                (../../zen/split-view/zen-decks.css)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        content/browser/zen-components/ZenThemesCommon.mjs                      (../../zen/mods/ZenThemesCommon.mjs)
 | 
					        content/browser/zen-components/ZenMods.mjs                      (../../zen/mods/ZenMods.mjs)
 | 
				
			||||||
        content/browser/zen-components/ZenThemesImporter.mjs                    (../../zen/mods/ZenThemesImporter.mjs)
 | 
					 | 
				
			||||||
        content/browser/zen-components/actors/ZenThemeMarketplaceParent.sys.mjs (../../zen/mods/actors/ZenThemeMarketplaceParent.sys.mjs)
 | 
					 | 
				
			||||||
        content/browser/zen-components/actors/ZenThemeMarketplaceChild.sys.mjs  (../../zen/mods/actors/ZenThemeMarketplaceChild.sys.mjs)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        content/browser/zen-components/ZenWorkspaceIcons.mjs                    (../../zen/workspaces/ZenWorkspaceIcons.mjs)
 | 
					        content/browser/zen-components/ZenWorkspaceIcons.mjs                    (../../zen/workspaces/ZenWorkspaceIcons.mjs)
 | 
				
			||||||
        content/browser/zen-components/ZenWorkspace.mjs                         (../../zen/workspaces/ZenWorkspace.mjs)
 | 
					        content/browser/zen-components/ZenWorkspace.mjs                         (../../zen/workspaces/ZenWorkspace.mjs)
 | 
				
			||||||
@@ -50,7 +48,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        content/browser/zen-components/ZenKeyboardShortcuts.mjs                 (../../zen/kbs/ZenKeyboardShortcuts.mjs)
 | 
					        content/browser/zen-components/ZenKeyboardShortcuts.mjs                 (../../zen/kbs/ZenKeyboardShortcuts.mjs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        content/browser/zen-components/ZenTabUnloader.mjs                       (../../zen/tabs/ZenTabUnloader.mjs)
 | 
					 | 
				
			||||||
        content/browser/zen-components/ZenPinnedTabsStorage.mjs                 (../../zen/tabs/ZenPinnedTabsStorage.mjs)
 | 
					        content/browser/zen-components/ZenPinnedTabsStorage.mjs                 (../../zen/tabs/ZenPinnedTabsStorage.mjs)
 | 
				
			||||||
        content/browser/zen-components/ZenPinnedTabManager.mjs                  (../../zen/tabs/ZenPinnedTabManager.mjs)
 | 
					        content/browser/zen-components/ZenPinnedTabManager.mjs                  (../../zen/tabs/ZenPinnedTabManager.mjs)
 | 
				
			||||||
*       content/browser/zen-styles/zen-tabs.css                                 (../../zen/tabs/zen-tabs.css)
 | 
					*       content/browser/zen-styles/zen-tabs.css                                 (../../zen/tabs/zen-tabs.css)
 | 
				
			||||||
@@ -58,8 +55,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        content/browser/zen-components/ZenGlanceManager.mjs                     (../../zen/glance/ZenGlanceManager.mjs)
 | 
					        content/browser/zen-components/ZenGlanceManager.mjs                     (../../zen/glance/ZenGlanceManager.mjs)
 | 
				
			||||||
        content/browser/zen-styles/zen-glance.css                               (../../zen/glance/zen-glance.css)
 | 
					        content/browser/zen-styles/zen-glance.css                               (../../zen/glance/zen-glance.css)
 | 
				
			||||||
        content/browser/zen-components/actors/ZenGlanceChild.sys.mjs            (../../zen/glance/actors/ZenGlanceChild.sys.mjs)
 | 
					 | 
				
			||||||
        content/browser/zen-components/actors/ZenGlanceParent.sys.mjs           (../../zen/glance/actors/ZenGlanceParent.sys.mjs)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        content/browser/zen-components/ZenFolders.mjs                           (../../zen/folders/ZenFolders.mjs)
 | 
					        content/browser/zen-components/ZenFolders.mjs                           (../../zen/folders/ZenFolders.mjs)
 | 
				
			||||||
        content/browser/zen-styles/zen-folders.css                              (../../zen/folders/zen-folders.css)
 | 
					        content/browser/zen-styles/zen-folders.css                              (../../zen/folders/zen-folders.css)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -43,10 +43,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  <command id="cmd_zenCopyCurrentURL" />
 | 
					  <command id="cmd_zenCopyCurrentURL" />
 | 
				
			||||||
  <command id="cmd_zenCopyCurrentURLMarkdown" />
 | 
					  <command id="cmd_zenCopyCurrentURLMarkdown" />
 | 
				
			||||||
 | 
					 | 
				
			||||||
  <command id="cmd_zenUnloadTab" />
 | 
					 | 
				
			||||||
  <command id="cmd_zenPreventUnloadTab" />
 | 
					 | 
				
			||||||
  <command id="cmd_zenIgnoreUnloadTab" />
 | 
					 | 
				
			||||||
</commandset>
 | 
					</commandset>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<keyset id="zenKeyset"></keyset>
 | 
					<keyset id="zenKeyset"></keyset>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,13 +1,13 @@
 | 
				
			|||||||
# This needs to be here, before all the other scripts, because it's used before
 | 
					# This needs to be here, before all the other scripts, because it's used before
 | 
				
			||||||
# the window is fully loaded.
 | 
					# the window is fully loaded.
 | 
				
			||||||
# Make sure they are loaded before the global-scripts.inc file.
 | 
					# Make sure they are loaded before the global-scripts.inc file.
 | 
				
			||||||
<script type="text/javascript">
 | 
					<script type="text/javascript" src="chrome://browser/content/zen-sets.js"></script>                                  
 | 
				
			||||||
  Services.scriptloader.loadSubScript("chrome://browser/content/zen-sets.js", this);
 | 
					<script type="text/javascript" src="chrome://browser/content/zen-components/ZenCommonUtils.mjs"></script>
 | 
				
			||||||
  Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenCommonUtils.mjs", this);
 | 
					<script type="text/javascript" src="chrome://browser/content/zen-components/ZenKeyboardShortcuts.mjs"></script>
 | 
				
			||||||
  Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenKeyboardShortcuts.mjs", this);
 | 
					<script type="text/javascript" src="chrome://browser/content/zen-components/ZenWorkspaceIcons.mjs"></script>
 | 
				
			||||||
  Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenWorkspaceIcons.mjs", this);
 | 
					<script type="text/javascript" src="chrome://browser/content/zen-components/ZenWorkspace.mjs"></script>
 | 
				
			||||||
  Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenWorkspace.mjs", this);
 | 
					<script type="text/javascript" src="chrome://browser/content/zen-components/ZenWorkspaces.mjs"></script>
 | 
				
			||||||
  Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenWorkspaces.mjs", this);
 | 
					<script type="text/javascript" src="chrome://browser/content/zen-components/ZenWorkspacesSync.mjs"></script>
 | 
				
			||||||
  Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenWorkspacesSync.mjs", this);
 | 
					<script type="text/javascript" src="chrome://browser/content/zen-components/ZenActorsManager.mjs"></script>
 | 
				
			||||||
  Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenActorsManager.mjs", this);
 | 
					<script type="text/javascript" src="chrome://browser/content/zen-components/ZenSessionStore.mjs"></script>
 | 
				
			||||||
</script>
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,7 +2,7 @@
 | 
				
			|||||||
<toolbar brighttext="true"
 | 
					<toolbar brighttext="true"
 | 
				
			||||||
  id="zen-sidebar-bottom-buttons"
 | 
					  id="zen-sidebar-bottom-buttons"
 | 
				
			||||||
  fullscreentoolbar="true"
 | 
					  fullscreentoolbar="true"
 | 
				
			||||||
  class="browser-toolbar customization-target zen-dont-hide-on-fullscreen"
 | 
					  class="browser-toolbar customization-target"
 | 
				
			||||||
  data-l10n-id="tabs-toolbar"
 | 
					  data-l10n-id="tabs-toolbar"
 | 
				
			||||||
  customizable="true"
 | 
					  customizable="true"
 | 
				
			||||||
  skipintoolbarset="true"
 | 
					  skipintoolbarset="true"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,9 +1,9 @@
 | 
				
			|||||||
diff --git a/browser/base/moz.build b/browser/base/moz.build
 | 
					diff --git a/browser/base/moz.build b/browser/base/moz.build
 | 
				
			||||||
index 636e0841786735a63ddea00e819c0b6f0b8a5d4d..62e4531bd19caf098fd76c69b213fa32d62546a6 100644
 | 
					index 9da444880c4dbf188443d43e8d0a71d98311a2b7..3a654be6f78931e92479b30de6f0a6e50da81908 100644
 | 
				
			||||||
--- a/browser/base/moz.build
 | 
					--- a/browser/base/moz.build
 | 
				
			||||||
+++ b/browser/base/moz.build
 | 
					+++ b/browser/base/moz.build
 | 
				
			||||||
@@ -87,3 +87,5 @@ if CONFIG["MOZ_WIDGET_TOOLKIT"] in ("windows", "gtk"):
 | 
					@@ -81,3 +81,5 @@ DEFINES["MOZ_APP_VERSION_DISPLAY"] = CONFIG["MOZ_APP_VERSION_DISPLAY"]
 | 
				
			||||||
     DEFINES["MENUBAR_CAN_AUTOHIDE"] = 1
 | 
					 DEFINES["APP_LICENSE_BLOCK"] = "%s/content/overrides/app-license.html" % SRCDIR
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 JAR_MANIFESTS += ["jar.mn"]
 | 
					 JAR_MANIFESTS += ["jar.mn"]
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/browser/components/BrowserContentHandler.sys.mjs b/browser/components/BrowserContentHandler.sys.mjs
 | 
					diff --git a/browser/components/BrowserContentHandler.sys.mjs b/browser/components/BrowserContentHandler.sys.mjs
 | 
				
			||||||
index 5911b276fdc9889d3cb61bac3d302ec5239e4a90..a405f8a0204e98fa9de08f1cd7b6761f0fc6198e 100644
 | 
					index e72feb538c0dc182211945a66e51bcea73d3d4a0..b4d9115873b7af414043c53fb817b611b78ec58f 100644
 | 
				
			||||||
--- a/browser/components/BrowserContentHandler.sys.mjs
 | 
					--- a/browser/components/BrowserContentHandler.sys.mjs
 | 
				
			||||||
+++ b/browser/components/BrowserContentHandler.sys.mjs
 | 
					+++ b/browser/components/BrowserContentHandler.sys.mjs
 | 
				
			||||||
@@ -1270,6 +1270,7 @@ function maybeRecordToHandleTelemetry(uri, isLaunch) {
 | 
					@@ -1281,6 +1281,7 @@ function maybeRecordToHandleTelemetry(uri, isLaunch) {
 | 
				
			||||||
       ".avif",
 | 
					       ".avif",
 | 
				
			||||||
       ".htm",
 | 
					       ".htm",
 | 
				
			||||||
       ".html",
 | 
					       ".html",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/browser/components/BrowserGlue.sys.mjs b/browser/components/BrowserGlue.sys.mjs
 | 
					diff --git a/browser/components/BrowserGlue.sys.mjs b/browser/components/BrowserGlue.sys.mjs
 | 
				
			||||||
index a6a7f9165aece774c3f1c15f7e352b11a4bf90f4..a4b6124b85f099c6f12d297fc26f2040370c337c 100644
 | 
					index cebca6d017a0c3fc8eff7a38f987726324789e69..73a24df91bec368f2f27c538b37d57595e18c599 100644
 | 
				
			||||||
--- a/browser/components/BrowserGlue.sys.mjs
 | 
					--- a/browser/components/BrowserGlue.sys.mjs
 | 
				
			||||||
+++ b/browser/components/BrowserGlue.sys.mjs
 | 
					+++ b/browser/components/BrowserGlue.sys.mjs
 | 
				
			||||||
@@ -8,6 +8,7 @@ import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
 | 
					@@ -8,6 +8,7 @@ import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
 | 
				
			||||||
@@ -10,7 +10,7 @@ index a6a7f9165aece774c3f1c15f7e352b11a4bf90f4..a4b6124b85f099c6f12d297fc26f2040
 | 
				
			|||||||
   AboutHomeStartupCache: "resource:///modules/AboutHomeStartupCache.sys.mjs",
 | 
					   AboutHomeStartupCache: "resource:///modules/AboutHomeStartupCache.sys.mjs",
 | 
				
			||||||
   AboutNewTab: "resource:///modules/AboutNewTab.sys.mjs",
 | 
					   AboutNewTab: "resource:///modules/AboutNewTab.sys.mjs",
 | 
				
			||||||
   AWToolbarButton: "resource:///modules/aboutwelcome/AWToolbarUtils.sys.mjs",
 | 
					   AWToolbarButton: "resource:///modules/aboutwelcome/AWToolbarUtils.sys.mjs",
 | 
				
			||||||
@@ -1886,6 +1887,7 @@ BrowserGlue.prototype = {
 | 
					@@ -881,6 +882,7 @@ BrowserGlue.prototype = {
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     lazy.ProcessHangMonitor.init();
 | 
					     lazy.ProcessHangMonitor.init();
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/browser/components/customizableui/CustomizableUI.sys.mjs b/browser/components/customizableui/CustomizableUI.sys.mjs
 | 
					diff --git a/browser/components/customizableui/CustomizableUI.sys.mjs b/browser/components/customizableui/CustomizableUI.sys.mjs
 | 
				
			||||||
index 91088fab1759b9af908912648d28daa5938a29c9..d420e7a2b1d66ad2bd7699cc580e180ab45a793d 100644
 | 
					index 5bb6be19f7f855b129aac921af1ed5cfc63d732b..41230a61f3088a234903dcc10abd361efac34729 100644
 | 
				
			||||||
--- a/browser/components/customizableui/CustomizableUI.sys.mjs
 | 
					--- a/browser/components/customizableui/CustomizableUI.sys.mjs
 | 
				
			||||||
+++ b/browser/components/customizableui/CustomizableUI.sys.mjs
 | 
					+++ b/browser/components/customizableui/CustomizableUI.sys.mjs
 | 
				
			||||||
@@ -13,6 +13,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
 | 
					@@ -13,6 +13,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/browser/components/customizableui/content/panelUI.js b/browser/components/customizableui/content/panelUI.js
 | 
					diff --git a/browser/components/customizableui/content/panelUI.js b/browser/components/customizableui/content/panelUI.js
 | 
				
			||||||
index ec52437dba30633a374299a46c856e1df05dec0e..48617e32d56c3b3f525557ddeac6297555c48c04 100644
 | 
					index 689205034d9df67ff1fe0ebbf4a3481a5f414391..2626b7286deb51f66b6ccbbc32d510139cacb109 100644
 | 
				
			||||||
--- a/browser/components/customizableui/content/panelUI.js
 | 
					--- a/browser/components/customizableui/content/panelUI.js
 | 
				
			||||||
+++ b/browser/components/customizableui/content/panelUI.js
 | 
					+++ b/browser/components/customizableui/content/panelUI.js
 | 
				
			||||||
@@ -515,8 +515,7 @@ const PanelUI = {
 | 
					@@ -516,8 +516,7 @@ const PanelUI = {
 | 
				
			||||||
         tempPanel.setAttribute("animate", "false");
 | 
					         tempPanel.setAttribute("animate", "false");
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
       tempPanel.setAttribute("context", "");
 | 
					       tempPanel.setAttribute("context", "");
 | 
				
			||||||
@@ -12,7 +12,7 @@ index ec52437dba30633a374299a46c856e1df05dec0e..48617e32d56c3b3f525557ddeac62975
 | 
				
			|||||||
         .appendChild(tempPanel);
 | 
					         .appendChild(tempPanel);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       let multiView = document.createXULElement("panelmultiview");
 | 
					       let multiView = document.createXULElement("panelmultiview");
 | 
				
			||||||
@@ -957,7 +956,7 @@ const PanelUI = {
 | 
					@@ -959,7 +958,7 @@ const PanelUI = {
 | 
				
			||||||
         el.removeAttribute("data-lazy-l10n-id");
 | 
					         el.removeAttribute("data-lazy-l10n-id");
 | 
				
			||||||
       });
 | 
					       });
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/browser/components/places/PlacesUIUtils.sys.mjs b/browser/components/places/PlacesUIUtils.sys.mjs
 | 
					diff --git a/browser/components/places/PlacesUIUtils.sys.mjs b/browser/components/places/PlacesUIUtils.sys.mjs
 | 
				
			||||||
index 1f5e163bae58f3f1cac750ca32846cc8a80bd2ca..028b899b7a5da7ba398965861ff044e596c27666 100644
 | 
					index c7c5c28e1ea6d05094ed9fe751c6b50ab9645370..72f1038aa37b0951a1e78331ee317f714e5b6e8b 100644
 | 
				
			||||||
--- a/browser/components/places/PlacesUIUtils.sys.mjs
 | 
					--- a/browser/components/places/PlacesUIUtils.sys.mjs
 | 
				
			||||||
+++ b/browser/components/places/PlacesUIUtils.sys.mjs
 | 
					+++ b/browser/components/places/PlacesUIUtils.sys.mjs
 | 
				
			||||||
@@ -59,6 +59,7 @@ class BookmarkState {
 | 
					@@ -59,6 +59,7 @@ class BookmarkState {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/browser/components/preferences/main.js b/browser/components/preferences/main.js
 | 
					diff --git a/browser/components/preferences/main.js b/browser/components/preferences/main.js
 | 
				
			||||||
index aa339be9ba94ed776fa25f2d72f9e6b25dc86cd3..4c6c725942b3d6f2a42938d444ac7645526623cc 100644
 | 
					index 2116a8a3b5746b79280f2d73b5e29b01c7a15993..448269adeab747fd2da419509e6923eefbb87d8a 100644
 | 
				
			||||||
--- a/browser/components/preferences/main.js
 | 
					--- a/browser/components/preferences/main.js
 | 
				
			||||||
+++ b/browser/components/preferences/main.js
 | 
					+++ b/browser/components/preferences/main.js
 | 
				
			||||||
@@ -389,7 +389,7 @@ function getBundleForLocales(newLocales) {
 | 
					@@ -389,7 +389,7 @@ function getBundleForLocales(newLocales) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/browser/components/preferences/preferences.js b/browser/components/preferences/preferences.js
 | 
					diff --git a/browser/components/preferences/preferences.js b/browser/components/preferences/preferences.js
 | 
				
			||||||
index e4746e3408e68273126e6d2baf5afcf80721674b..e478aaf6bfefa6acd9062aeb3e4709ca0d5d779c 100644
 | 
					index 6a575e3148de0c73f7ab7ff9afbd3ff179bce313..b7c2f2818358b7b6b6fc62b298dc67a66ebd9e3b 100644
 | 
				
			||||||
--- a/browser/components/preferences/preferences.js
 | 
					--- a/browser/components/preferences/preferences.js
 | 
				
			||||||
+++ b/browser/components/preferences/preferences.js
 | 
					+++ b/browser/components/preferences/preferences.js
 | 
				
			||||||
@@ -118,6 +118,7 @@ ChromeUtils.defineLazyGetter(this, "gSubDialog", function () {
 | 
					@@ -117,6 +117,7 @@ ChromeUtils.defineLazyGetter(this, "gSubDialog", function () {
 | 
				
			||||||
       styleSheets: [
 | 
					       styleSheets: [
 | 
				
			||||||
         "chrome://browser/skin/preferences/dialog.css",
 | 
					         "chrome://browser/skin/preferences/dialog.css",
 | 
				
			||||||
         "chrome://browser/skin/preferences/preferences.css",
 | 
					         "chrome://browser/skin/preferences/preferences.css",
 | 
				
			||||||
@@ -10,7 +10,7 @@ index e4746e3408e68273126e6d2baf5afcf80721674b..e478aaf6bfefa6acd9062aeb3e4709ca
 | 
				
			|||||||
       ],
 | 
					       ],
 | 
				
			||||||
       resizeCallback: async ({ title, frame }) => {
 | 
					       resizeCallback: async ({ title, frame }) => {
 | 
				
			||||||
         // Search within main document and highlight matched keyword.
 | 
					         // Search within main document and highlight matched keyword.
 | 
				
			||||||
@@ -197,6 +198,10 @@ function init_all() {
 | 
					@@ -196,6 +197,10 @@ function init_all() {
 | 
				
			||||||
   register_module("paneSearch", gSearchPane);
 | 
					   register_module("paneSearch", gSearchPane);
 | 
				
			||||||
   register_module("panePrivacy", gPrivacyPane);
 | 
					   register_module("panePrivacy", gPrivacyPane);
 | 
				
			||||||
   register_module("paneContainers", gContainersPane);
 | 
					   register_module("paneContainers", gContainersPane);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/browser/components/preferences/preferences.xhtml b/browser/components/preferences/preferences.xhtml
 | 
					diff --git a/browser/components/preferences/preferences.xhtml b/browser/components/preferences/preferences.xhtml
 | 
				
			||||||
index 43be2b6ac84827bd13723e0211a3ade401934591..513584d7e720451efdb87350ac07d8b2590c1705 100644
 | 
					index b3b128cb5eb8c005c642965a8c8e5e68bf756e77..6e128d45c983b267e349b08097c56380dd04be3d 100644
 | 
				
			||||||
--- a/browser/components/preferences/preferences.xhtml
 | 
					--- a/browser/components/preferences/preferences.xhtml
 | 
				
			||||||
+++ b/browser/components/preferences/preferences.xhtml
 | 
					+++ b/browser/components/preferences/preferences.xhtml
 | 
				
			||||||
@@ -44,6 +44,8 @@
 | 
					@@ -44,6 +44,8 @@
 | 
				
			||||||
@@ -11,7 +11,7 @@ index 43be2b6ac84827bd13723e0211a3ade401934591..513584d7e720451efdb87350ac07d8b2
 | 
				
			|||||||
   <link rel="localization" href="branding/brand.ftl"/>
 | 
					   <link rel="localization" href="branding/brand.ftl"/>
 | 
				
			||||||
   <link rel="localization" href="browser/browser.ftl"/>
 | 
					   <link rel="localization" href="browser/browser.ftl"/>
 | 
				
			||||||
     <!-- Used by fontbuilder.js -->
 | 
					     <!-- Used by fontbuilder.js -->
 | 
				
			||||||
@@ -105,6 +107,11 @@
 | 
					@@ -104,6 +106,11 @@
 | 
				
			||||||
   <hbox flex="1">
 | 
					   <hbox flex="1">
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     <vbox class="navigation">
 | 
					     <vbox class="navigation">
 | 
				
			||||||
@@ -23,7 +23,7 @@ index 43be2b6ac84827bd13723e0211a3ade401934591..513584d7e720451efdb87350ac07d8b2
 | 
				
			|||||||
       <!-- category list -->
 | 
					       <!-- category list -->
 | 
				
			||||||
       <richlistbox id="categories" data-l10n-id="category-list" data-l10n-attrs="aria-label">
 | 
					       <richlistbox id="categories" data-l10n-id="category-list" data-l10n-attrs="aria-label">
 | 
				
			||||||
         <richlistitem id="category-general"
 | 
					         <richlistitem id="category-general"
 | 
				
			||||||
@@ -117,6 +124,50 @@
 | 
					@@ -116,6 +123,50 @@
 | 
				
			||||||
           <label class="category-name" flex="1" data-l10n-id="pane-general-title"></label>
 | 
					           <label class="category-name" flex="1" data-l10n-id="pane-general-title"></label>
 | 
				
			||||||
         </richlistitem>
 | 
					         </richlistitem>
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -74,7 +74,7 @@ index 43be2b6ac84827bd13723e0211a3ade401934591..513584d7e720451efdb87350ac07d8b2
 | 
				
			|||||||
         <richlistitem id="category-home"
 | 
					         <richlistitem id="category-home"
 | 
				
			||||||
                       class="category"
 | 
					                       class="category"
 | 
				
			||||||
                       value="paneHome"
 | 
					                       value="paneHome"
 | 
				
			||||||
@@ -228,11 +279,6 @@
 | 
					@@ -227,11 +278,6 @@
 | 
				
			||||||
                 <html:a href="about:policies" target="_blank" data-l10n-id="managed-notice"/>
 | 
					                 <html:a href="about:policies" target="_blank" data-l10n-id="managed-notice"/>
 | 
				
			||||||
               </hbox>
 | 
					               </hbox>
 | 
				
			||||||
             </hbox>
 | 
					             </hbox>
 | 
				
			||||||
@@ -86,7 +86,7 @@ index 43be2b6ac84827bd13723e0211a3ade401934591..513584d7e720451efdb87350ac07d8b2
 | 
				
			|||||||
           </hbox>
 | 
					           </hbox>
 | 
				
			||||||
         </hbox>
 | 
					         </hbox>
 | 
				
			||||||
         <vbox id="mainPrefPane">
 | 
					         <vbox id="mainPrefPane">
 | 
				
			||||||
@@ -246,6 +292,10 @@
 | 
					@@ -245,6 +291,10 @@
 | 
				
			||||||
 #include sync.inc.xhtml
 | 
					 #include sync.inc.xhtml
 | 
				
			||||||
 #include experimental.inc.xhtml
 | 
					 #include experimental.inc.xhtml
 | 
				
			||||||
 #include moreFromMozilla.inc.xhtml
 | 
					 #include moreFromMozilla.inc.xhtml
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,30 +14,37 @@ var gZenMarketplaceManager = {
 | 
				
			|||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!window.gZenMods) {
 | 
				
			||||||
 | 
					      window.gZenMods = ZenMultiWindowFeature.currentBrowser.gZenMods;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    header.appendChild(this._initDisableAll());
 | 
					    header.appendChild(this._initDisableAll());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this._initImportExport();
 | 
					    this._initImportExport();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.__hasInitializedEvents = true;
 | 
					    this.__hasInitializedEvents = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    await this._buildThemesList();
 | 
					    await this._buildModsList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Services.prefs.addObserver(this.updatePref, this);
 | 
					    Services.prefs.addObserver(gZenMods.updatePref, this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const checkForUpdateClick = (event) => {
 | 
					    const checkForUpdateClick = (event) => {
 | 
				
			||||||
      if (event.target === checkForUpdates) {
 | 
					      if (event.target === checkForUpdates) {
 | 
				
			||||||
        event.preventDefault();
 | 
					        event.preventDefault();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this._checkForThemeUpdates(event);
 | 
					        this._checkForThemeUpdates(event);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    checkForUpdates.addEventListener('click', checkForUpdateClick);
 | 
					    checkForUpdates.addEventListener('click', checkForUpdateClick);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    document.addEventListener('ZenThemeMarketplace:CheckForUpdatesFinished', (event) => {
 | 
					    document.addEventListener('ZenModsMarketplace:CheckForUpdatesFinished', (event) => {
 | 
				
			||||||
      checkForUpdates.disabled = false;
 | 
					      checkForUpdates.disabled = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      const updates = event.detail.updates;
 | 
					      const updates = event.detail.updates;
 | 
				
			||||||
      const success = document.getElementById('zenThemeMarketplaceUpdatesSuccess');
 | 
					      const success = document.getElementById('zenThemeMarketplaceUpdatesSuccess');
 | 
				
			||||||
      const error = document.getElementById('zenThemeMarketplaceUpdatesFailure');
 | 
					      const error = document.getElementById('zenThemeMarketplaceUpdatesFailure');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (updates) {
 | 
					      if (updates) {
 | 
				
			||||||
        success.hidden = false;
 | 
					        success.hidden = false;
 | 
				
			||||||
        error.hidden = true;
 | 
					        error.hidden = true;
 | 
				
			||||||
@@ -48,13 +55,16 @@ var gZenMarketplaceManager = {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    window.addEventListener('unload', () => {
 | 
					    window.addEventListener('unload', () => {
 | 
				
			||||||
      Services.prefs.removeObserver(this.updatePref, this);
 | 
					      Services.prefs.removeObserver(gZenMods.updatePref, this);
 | 
				
			||||||
      this.__hasInitializedEvents = false;
 | 
					      this.__hasInitializedEvents = false;
 | 
				
			||||||
      document.removeEventListener('ZenThemeMarketplace:CheckForUpdatesFinished', this);
 | 
					
 | 
				
			||||||
      document.removeEventListener('ZenCheckForThemeUpdates', this);
 | 
					      document.removeEventListener('ZenModsMarketplace:CheckForUpdatesFinished', this);
 | 
				
			||||||
 | 
					      document.removeEventListener('ZenCheckForModUpdates', this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      checkForUpdates.removeEventListener('click', checkForUpdateClick);
 | 
					      checkForUpdates.removeEventListener('click', checkForUpdateClick);
 | 
				
			||||||
      this.themesList.innerHTML = '';
 | 
					
 | 
				
			||||||
      this._doNotRebuildThemesList = false;
 | 
					      this.modsList.innerHTML = '';
 | 
				
			||||||
 | 
					      this._doNotRebuildModsList = false;
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -63,36 +73,32 @@ var gZenMarketplaceManager = {
 | 
				
			|||||||
    const exportButton = document.getElementById('zenThemeMarketplaceExport');
 | 
					    const exportButton = document.getElementById('zenThemeMarketplaceExport');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (importButton) {
 | 
					    if (importButton) {
 | 
				
			||||||
      importButton.addEventListener('click', async () => {
 | 
					      importButton.addEventListener('click', this._importThemes.bind(this));
 | 
				
			||||||
        await this._importThemes();
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (exportButton) {
 | 
					    if (exportButton) {
 | 
				
			||||||
      exportButton.addEventListener('click', async () => {
 | 
					      exportButton.addEventListener('click', this._exportThemes.bind(this));
 | 
				
			||||||
        await this._exportThemes();
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _initDisableAll() {
 | 
					  _initDisableAll() {
 | 
				
			||||||
    const areThemesDisabled = Services.prefs.getBoolPref('zen.themes.disable-all', false);
 | 
					    const areModsDisabled = Services.prefs.getBoolPref('zen.themes.disable-all', false);
 | 
				
			||||||
    const browser = ZenThemesCommon.currentBrowser;
 | 
					    const browser = ZenMultiWindowFeature.currentBrowser;
 | 
				
			||||||
    const mozToggle = document.createElement('moz-toggle');
 | 
					    const mozToggle = document.createElement('moz-toggle');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    mozToggle.className =
 | 
					    mozToggle.className =
 | 
				
			||||||
      'zenThemeMarketplaceItemPreferenceToggle zenThemeMarketplaceDisableAllToggle';
 | 
					      'zenThemeMarketplaceItemPreferenceToggle zenThemeMarketplaceDisableAllToggle';
 | 
				
			||||||
    mozToggle.pressed = !areThemesDisabled;
 | 
					    mozToggle.pressed = !areModsDisabled;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    browser.document.l10n.setAttributes(
 | 
					    browser.document.l10n.setAttributes(
 | 
				
			||||||
      mozToggle,
 | 
					      mozToggle,
 | 
				
			||||||
      `zen-theme-disable-all-${!areThemesDisabled ? 'enabled' : 'disabled'}`
 | 
					      `zen-theme-disable-all-${!areModsDisabled ? 'enabled' : 'disabled'}`
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    mozToggle.addEventListener('toggle', async (event) => {
 | 
					    mozToggle.addEventListener('toggle', async (event) => {
 | 
				
			||||||
      const { pressed = false } = event.target || {};
 | 
					      const { pressed = false } = event.target || {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      this.themesList.style.display = pressed ? '' : 'none';
 | 
					      this.modsList.style.display = pressed ? '' : 'none';
 | 
				
			||||||
      Services.prefs.setBoolPref('zen.themes.disable-all', !pressed);
 | 
					      Services.prefs.setBoolPref('zen.themes.disable-all', !pressed);
 | 
				
			||||||
      browser.document.l10n.setAttributes(
 | 
					      browser.document.l10n.setAttributes(
 | 
				
			||||||
        mozToggle,
 | 
					        mozToggle,
 | 
				
			||||||
@@ -100,90 +106,65 @@ var gZenMarketplaceManager = {
 | 
				
			|||||||
      );
 | 
					      );
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (areThemesDisabled) {
 | 
					    if (areModsDisabled) {
 | 
				
			||||||
      this.themesList.style.display = 'none';
 | 
					      this.modsList.style.display = 'none';
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return mozToggle;
 | 
					    return mozToggle;
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async observe() {
 | 
					  async observe() {
 | 
				
			||||||
    await this._buildThemesList();
 | 
					    await this._buildModsList();
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _checkForThemeUpdates(event) {
 | 
					  _checkForThemeUpdates(event) {
 | 
				
			||||||
    // Send a message to the child to check for theme updates.
 | 
					    // Send a message to the child to check for theme updates.
 | 
				
			||||||
    event.target.disabled = true;
 | 
					    event.target.disabled = true;
 | 
				
			||||||
    // send an event that will be listened by the child process.
 | 
					    // send an event that will be listened by the child process.
 | 
				
			||||||
    document.dispatchEvent(new CustomEvent('ZenCheckForThemeUpdates'));
 | 
					    document.dispatchEvent(new CustomEvent('ZenCheckForModUpdates'));
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  get updatePref() {
 | 
					  get modsList() {
 | 
				
			||||||
    return 'zen.themes.updated-value-observer';
 | 
					    if (!this._modsList) {
 | 
				
			||||||
  },
 | 
					      this._modsList = document.getElementById('zenThemeMarketplaceList');
 | 
				
			||||||
 | 
					 | 
				
			||||||
  triggerThemeUpdate() {
 | 
					 | 
				
			||||||
    Services.prefs.setBoolPref(this.updatePref, !Services.prefs.getBoolPref(this.updatePref));
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  get themesList() {
 | 
					 | 
				
			||||||
    if (!this._themesList) {
 | 
					 | 
				
			||||||
      this._themesList = document.getElementById('zenThemeMarketplaceList');
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return this._themesList;
 | 
					    return this._modsList;
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async removeTheme(themeId) {
 | 
					  async removeMod(modId) {
 | 
				
			||||||
    const themePath = ZenThemesCommon.getThemeFolder(themeId);
 | 
					    await gZenMods.removeMod(modId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    console.info(`[ZenThemeMarketplaceParent:settings]: Removing theme ${themePath}`);
 | 
					    gZenMods.triggerModsUpdate();
 | 
				
			||||||
 | 
					 | 
				
			||||||
    await IOUtils.remove(themePath, { recursive: true, ignoreAbsent: true });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const themes = await ZenThemesCommon.getThemes();
 | 
					 | 
				
			||||||
    delete themes[themeId];
 | 
					 | 
				
			||||||
    await IOUtils.writeJSON(ZenThemesCommon.themesDataFile, themes);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    this.triggerThemeUpdate();
 | 
					 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async disableTheme(themeId) {
 | 
					  async disableMod(modId) {
 | 
				
			||||||
    const themes = await ZenThemesCommon.getThemes();
 | 
					    await gZenMods.disableMod(modId);
 | 
				
			||||||
    const theme = themes[themeId];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    console.log(`[ZenThemeMarketplaceParent:settings]: Disabling theme ${theme.name}`);
 | 
					    this._doNotRebuildModsList = true;
 | 
				
			||||||
 | 
					    gZenMods.triggerModsUpdate();
 | 
				
			||||||
    theme.enabled = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    await IOUtils.writeJSON(ZenThemesCommon.themesDataFile, themes);
 | 
					 | 
				
			||||||
    this._doNotRebuildThemesList = true;
 | 
					 | 
				
			||||||
    this.triggerThemeUpdate();
 | 
					 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async enableTheme(themeId) {
 | 
					  async enableMod(modId) {
 | 
				
			||||||
    const themes = await ZenThemesCommon.getThemes();
 | 
					    await gZenMods.enableMod(modId);
 | 
				
			||||||
    const theme = themes[themeId];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    console.log(`[ZenThemeMarketplaceParent:settings]: Enabling theme ${theme.name}`);
 | 
					    this._doNotRebuildModsList = true;
 | 
				
			||||||
 | 
					    gZenMods.triggerModsUpdate();
 | 
				
			||||||
    theme.enabled = true;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    await IOUtils.writeJSON(ZenThemesCommon.themesDataFile, themes);
 | 
					 | 
				
			||||||
    this._doNotRebuildThemesList = true;
 | 
					 | 
				
			||||||
    this.triggerThemeUpdate();
 | 
					 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _triggerBuildUpdateWithoutRebuild() {
 | 
					  _triggerBuildUpdateWithoutRebuild() {
 | 
				
			||||||
    this._doNotRebuildThemesList = true;
 | 
					    this._doNotRebuildModsList = true;
 | 
				
			||||||
    this.triggerThemeUpdate();
 | 
					    gZenMods.triggerModsUpdate();
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async _importThemes() {
 | 
					  async _importThemes() {
 | 
				
			||||||
    const errorBox = document.getElementById('zenThemeMarketplaceImportFailure');
 | 
					    const errorBox = document.getElementById('zenThemeMarketplaceImportFailure');
 | 
				
			||||||
    const successBox = document.getElementById('zenThemeMarketplaceImportSuccess');
 | 
					    const successBox = document.getElementById('zenThemeMarketplaceImportSuccess');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    successBox.hidden = true;
 | 
					    successBox.hidden = true;
 | 
				
			||||||
    errorBox.hidden = true;
 | 
					    errorBox.hidden = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const input = document.createElement('input');
 | 
					    const input = document.createElement('input');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    input.type = 'file';
 | 
					    input.type = 'file';
 | 
				
			||||||
    input.accept = '.json';
 | 
					    input.accept = '.json';
 | 
				
			||||||
    input.style.display = 'none';
 | 
					    input.style.display = 'none';
 | 
				
			||||||
@@ -191,37 +172,52 @@ var gZenMarketplaceManager = {
 | 
				
			|||||||
    input.setAttribute('accept', '.json');
 | 
					    input.setAttribute('accept', '.json');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let timeout;
 | 
					    let timeout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const filePromise = new Promise((resolve) => {
 | 
					    const filePromise = new Promise((resolve) => {
 | 
				
			||||||
      input.addEventListener('change', (event) => {
 | 
					      input.addEventListener('change', (event) => {
 | 
				
			||||||
        if (timeout) clearTimeout(timeout);
 | 
					        if (timeout) {
 | 
				
			||||||
 | 
					          clearTimeout(timeout);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const file = event.target.files[0];
 | 
					        const file = event.target.files[0];
 | 
				
			||||||
        resolve(file);
 | 
					        resolve(file);
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      timeout = setTimeout(() => {
 | 
					      timeout = setTimeout(() => {
 | 
				
			||||||
        console.warn('[ZenThemeMarketplaceParent:settings]: Import timeout reached, aborting.');
 | 
					        console.warn('[ZenSettings:ZenMods]: Import timeout reached, aborting.');
 | 
				
			||||||
        resolve(null);
 | 
					        resolve(null);
 | 
				
			||||||
      }, 60000);
 | 
					      }, 60000);
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    input.addEventListener('cancel', () => {
 | 
				
			||||||
 | 
					      console.warn('[ZenSettings:ZenMods]: Import cancelled by user.');
 | 
				
			||||||
 | 
					      clearTimeout(timeout);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    input.click();
 | 
					    input.click();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      const file = await filePromise;
 | 
					      const file = await filePromise;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (!file) {
 | 
					      if (!file) {
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      const content = await file.text();
 | 
					      const content = await file.text();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      const themes = JSON.parse(content);
 | 
					      const mods = JSON.parse(content);
 | 
				
			||||||
      for (const theme of Object.values(themes)) {
 | 
					
 | 
				
			||||||
        theme.themeId = theme.id;
 | 
					      for (const mod of Object.values(mods)) {
 | 
				
			||||||
        window.ZenInstallTheme(theme);
 | 
					        mod.modId = mod.id;
 | 
				
			||||||
 | 
					        await window.ZenInstallMod(mod);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    } catch (error) {
 | 
					    } catch (error) {
 | 
				
			||||||
      console.error('[ZenThemeMarketplaceParent:settings]: Error while importing themes:', error);
 | 
					      console.error('[ZenSettings:ZenMods]: Error while importing mods:', error);
 | 
				
			||||||
      errorBox.hidden = false;
 | 
					      errorBox.hidden = false;
 | 
				
			||||||
    } finally {
 | 
					    }
 | 
				
			||||||
      if (input) input.remove();
 | 
					
 | 
				
			||||||
 | 
					    if (input) {
 | 
				
			||||||
 | 
					      input.remove();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -232,51 +228,54 @@ var gZenMarketplaceManager = {
 | 
				
			|||||||
    successBox.hidden = true;
 | 
					    successBox.hidden = true;
 | 
				
			||||||
    errorBox.hidden = true;
 | 
					    errorBox.hidden = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let a, url;
 | 
					    let temporalAnchor, temporalUrl;
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
      const themes = await ZenThemesCommon.getThemes();
 | 
					      const mods = await gZenMods.getMods();
 | 
				
			||||||
      const themesJson = JSON.stringify(themes, null, 2);
 | 
					      const modsJson = JSON.stringify(mods, null, 2);
 | 
				
			||||||
      const blob = new Blob([themesJson], { type: 'application/json' });
 | 
					      const blob = new Blob([modsJson], { type: 'application/json' });
 | 
				
			||||||
      url = URL.createObjectURL(blob);
 | 
					
 | 
				
			||||||
      // Creating a link to download the JSON file
 | 
					      temporalUrl = URL.createObjectURL(blob);
 | 
				
			||||||
      a = document.createElement('a');
 | 
					      // Creating a link to download the JSON file
 | 
				
			||||||
      a.href = url;
 | 
					      temporalAnchor = document.createElement('a');
 | 
				
			||||||
      a.download = 'zen-themes-export.json';
 | 
					      temporalAnchor.href = temporalUrl;
 | 
				
			||||||
 | 
					      temporalAnchor.download = 'zen-mods-export.json';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      document.body.appendChild(temporalAnchor);
 | 
				
			||||||
 | 
					      temporalAnchor.click();
 | 
				
			||||||
 | 
					      temporalAnchor.remove();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      document.body.appendChild(a);
 | 
					 | 
				
			||||||
      a.click();
 | 
					 | 
				
			||||||
      a.remove();
 | 
					 | 
				
			||||||
      successBox.hidden = false;
 | 
					      successBox.hidden = false;
 | 
				
			||||||
    } catch (error) {
 | 
					    } catch (error) {
 | 
				
			||||||
      console.error('[ZenThemeMarketplaceParent:settings]: Error while exporting themes:', error);
 | 
					      console.error('[ZenSettings:ZenMods]: Error while exporting mods:', error);
 | 
				
			||||||
      errorBox.hidden = false;
 | 
					      errorBox.hidden = false;
 | 
				
			||||||
    } finally {
 | 
					 | 
				
			||||||
      if (a) {
 | 
					 | 
				
			||||||
        a.remove();
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
      if (url) {
 | 
					
 | 
				
			||||||
        URL.revokeObjectURL(url);
 | 
					    if (temporalAnchor) {
 | 
				
			||||||
 | 
					      temporalAnchor.remove();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (temporalUrl) {
 | 
				
			||||||
 | 
					      URL.revokeObjectURL(temporalUrl);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async _buildThemesList() {
 | 
					  async _buildModsList() {
 | 
				
			||||||
    if (!this.themesList) {
 | 
					    if (!this.modsList) {
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (this._doNotRebuildThemesList) {
 | 
					    if (this._doNotRebuildModsList) {
 | 
				
			||||||
      this._doNotRebuildThemesList = false;
 | 
					      this._doNotRebuildModsList = false;
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const themes = await ZenThemesCommon.getThemes();
 | 
					    const mods = await gZenMods.getMods();
 | 
				
			||||||
    const browser = ZenMultiWindowFeature.currentBrowser;
 | 
					    const browser = ZenMultiWindowFeature.currentBrowser;
 | 
				
			||||||
    const themeList = document.createElement('div');
 | 
					    const modList = document.createElement('div');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (const theme of Object.values(themes).sort((a, b) => a.name.localeCompare(b.name))) {
 | 
					    for (const mod of Object.values(mods).sort((a, b) => a.name.localeCompare(b.name))) {
 | 
				
			||||||
      const sanitizedName = `theme-${theme.name?.replaceAll(/\s/g, '-')?.replaceAll(/[^A-Za-z_-]+/g, '')}`;
 | 
					      const sanitizedName = gZenMods.sanitizeModName(mod.name);
 | 
				
			||||||
      const isThemeEnabled = theme.enabled === undefined || theme.enabled;
 | 
					      const isModEnabled = mod.enabled === undefined || mod.enabled;
 | 
				
			||||||
      const fragment = window.MozXULElement.parseXULToFragment(`
 | 
					      const fragment = window.MozXULElement.parseXULToFragment(`
 | 
				
			||||||
        <vbox class="zenThemeMarketplaceItem">
 | 
					        <vbox class="zenThemeMarketplaceItem">
 | 
				
			||||||
          <vbox class="zenThemeMarketplaceItemContent">
 | 
					          <vbox class="zenThemeMarketplaceItemContent">
 | 
				
			||||||
@@ -286,14 +285,14 @@ var gZenMarketplaceManager = {
 | 
				
			|||||||
            <description class="description-deemphasized zenThemeMarketplaceItemDescription"></description>
 | 
					            <description class="description-deemphasized zenThemeMarketplaceItemDescription"></description>
 | 
				
			||||||
          </vbox>
 | 
					          </vbox>
 | 
				
			||||||
          <hbox class="zenThemeMarketplaceItemActions">
 | 
					          <hbox class="zenThemeMarketplaceItemActions">
 | 
				
			||||||
            ${theme.preferences ? `<button id="zenThemeMarketplaceItemConfigureButton-${sanitizedName}" class="zenThemeMarketplaceItemConfigureButton" hidden="true"></button>` : ''}
 | 
					            ${mod.preferences ? `<button id="zenThemeMarketplaceItemConfigureButton-${sanitizedName}" class="zenThemeMarketplaceItemConfigureButton" hidden="true"></button>` : ''}
 | 
				
			||||||
            ${theme.homepage ? `<button id="zenThemeMarketplaceItemHomePageLink-${sanitizedName}" class="zenThemeMarketplaceItemHomepageButton" zen-theme-id="${theme.id}"></button>` : ''}
 | 
					            ${mod.homepage ? `<button id="zenThemeMarketplaceItemHomePageLink-${sanitizedName}" class="zenThemeMarketplaceItemHomepageButton" zen-mod-id="${mod.id}"></button>` : ''}
 | 
				
			||||||
            <button class="zenThemeMarketplaceItemUninstallButton" data-l10n-id="zen-theme-marketplace-remove-button" zen-theme-id="${theme.id}"></button>
 | 
					            <button class="zenThemeMarketplaceItemUninstallButton" data-l10n-id="zen-theme-marketplace-remove-button" zen-mod-id="${mod.id}"></button>
 | 
				
			||||||
          </hbox>
 | 
					          </hbox>
 | 
				
			||||||
        </vbox>
 | 
					        </vbox>
 | 
				
			||||||
      `);
 | 
					      `);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      const themeName = `${theme.name} (v${theme.version || '1.0.0'})`;
 | 
					      const modName = `${mod.name} (v${mod.version ?? '1.0.0'})`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      const base = fragment.querySelector('.zenThemeMarketplaceItem');
 | 
					      const base = fragment.querySelector('.zenThemeMarketplaceItem');
 | 
				
			||||||
      const baseHeader = fragment.querySelector('#zenThemeMarketplaceItemContentHeader');
 | 
					      const baseHeader = fragment.querySelector('#zenThemeMarketplaceItemContentHeader');
 | 
				
			||||||
@@ -308,7 +307,7 @@ var gZenMarketplaceManager = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      mainDialogDiv.className = 'zenThemeMarketplaceItemPreferenceDialog';
 | 
					      mainDialogDiv.className = 'zenThemeMarketplaceItemPreferenceDialog';
 | 
				
			||||||
      headerDiv.className = 'zenThemeMarketplaceItemPreferenceDialogTopBar';
 | 
					      headerDiv.className = 'zenThemeMarketplaceItemPreferenceDialogTopBar';
 | 
				
			||||||
      headerTitle.textContent = themeName;
 | 
					      headerTitle.textContent = modName;
 | 
				
			||||||
      browser.document.l10n.setAttributes(headerTitle, 'zen-theme-marketplace-theme-header-title', {
 | 
					      browser.document.l10n.setAttributes(headerTitle, 'zen-theme-marketplace-theme-header-title', {
 | 
				
			||||||
        name: sanitizedName,
 | 
					        name: sanitizedName,
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
@@ -319,10 +318,10 @@ var gZenMarketplaceManager = {
 | 
				
			|||||||
      contentDiv.className = 'zenThemeMarketplaceItemPreferenceDialogContent';
 | 
					      contentDiv.className = 'zenThemeMarketplaceItemPreferenceDialogContent';
 | 
				
			||||||
      mozToggle.className = 'zenThemeMarketplaceItemPreferenceToggle';
 | 
					      mozToggle.className = 'zenThemeMarketplaceItemPreferenceToggle';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      mozToggle.pressed = isThemeEnabled;
 | 
					      mozToggle.pressed = isModEnabled;
 | 
				
			||||||
      browser.document.l10n.setAttributes(
 | 
					      browser.document.l10n.setAttributes(
 | 
				
			||||||
        mozToggle,
 | 
					        mozToggle,
 | 
				
			||||||
        `zen-theme-marketplace-toggle-${isThemeEnabled ? 'enabled' : 'disabled'}-button`
 | 
					        `zen-theme-marketplace-toggle-${isModEnabled ? 'enabled' : 'disabled'}-button`
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      baseHeader.appendChild(mozToggle);
 | 
					      baseHeader.appendChild(mozToggle);
 | 
				
			||||||
@@ -340,34 +339,34 @@ var gZenMarketplaceManager = {
 | 
				
			|||||||
      });
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      mozToggle.addEventListener('toggle', async (event) => {
 | 
					      mozToggle.addEventListener('toggle', async (event) => {
 | 
				
			||||||
        const themeId = event.target
 | 
					        const modId = event.target
 | 
				
			||||||
          .closest('.zenThemeMarketplaceItem')
 | 
					          .closest('.zenThemeMarketplaceItem')
 | 
				
			||||||
          .querySelector('.zenThemeMarketplaceItemUninstallButton')
 | 
					          .querySelector('.zenThemeMarketplaceItemUninstallButton')
 | 
				
			||||||
          .getAttribute('zen-theme-id');
 | 
					          .getAttribute('zen-mod-id');
 | 
				
			||||||
        event.target.setAttribute('disabled', true);
 | 
					        event.target.setAttribute('disabled', true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!event.target.hasAttribute('pressed')) {
 | 
					        if (!event.target.hasAttribute('pressed')) {
 | 
				
			||||||
          await this.disableTheme(themeId);
 | 
					          await this.disableMod(modId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          browser.document.l10n.setAttributes(
 | 
					          browser.document.l10n.setAttributes(
 | 
				
			||||||
            mozToggle,
 | 
					            mozToggle,
 | 
				
			||||||
            'zen-theme-marketplace-toggle-disabled-button'
 | 
					            'zen-theme-marketplace-toggle-disabled-button'
 | 
				
			||||||
          );
 | 
					          );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          if (theme.preferences) {
 | 
					          if (mod.preferences) {
 | 
				
			||||||
            document
 | 
					            document
 | 
				
			||||||
              .getElementById(`zenThemeMarketplaceItemConfigureButton-${sanitizedName}`)
 | 
					              .getElementById(`zenThemeMarketplaceItemConfigureButton-${sanitizedName}`)
 | 
				
			||||||
              .setAttribute('hidden', true);
 | 
					              .setAttribute('hidden', true);
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
          await this.enableTheme(themeId);
 | 
					          await this.enableMod(modId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          browser.document.l10n.setAttributes(
 | 
					          browser.document.l10n.setAttributes(
 | 
				
			||||||
            mozToggle,
 | 
					            mozToggle,
 | 
				
			||||||
            'zen-theme-marketplace-toggle-enabled-button'
 | 
					            'zen-theme-marketplace-toggle-enabled-button'
 | 
				
			||||||
          );
 | 
					          );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          if (theme.preferences) {
 | 
					          if (mod.preferences) {
 | 
				
			||||||
            document
 | 
					            document
 | 
				
			||||||
              .getElementById(`zenThemeMarketplaceItemConfigureButton-${sanitizedName}`)
 | 
					              .getElementById(`zenThemeMarketplaceItemConfigureButton-${sanitizedName}`)
 | 
				
			||||||
              .removeAttribute('hidden');
 | 
					              .removeAttribute('hidden');
 | 
				
			||||||
@@ -379,8 +378,8 @@ var gZenMarketplaceManager = {
 | 
				
			|||||||
        }, 400);
 | 
					        }, 400);
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      fragment.querySelector('.zenThemeMarketplaceItemTitle').textContent = themeName;
 | 
					      fragment.querySelector('.zenThemeMarketplaceItemTitle').textContent = modName;
 | 
				
			||||||
      fragment.querySelector('.zenThemeMarketplaceItemDescription').textContent = theme.description;
 | 
					      fragment.querySelector('.zenThemeMarketplaceItemDescription').textContent = mod.description;
 | 
				
			||||||
      fragment
 | 
					      fragment
 | 
				
			||||||
        .querySelector('.zenThemeMarketplaceItemUninstallButton')
 | 
					        .querySelector('.zenThemeMarketplaceItemUninstallButton')
 | 
				
			||||||
        .addEventListener('click', async (event) => {
 | 
					        .addEventListener('click', async (event) => {
 | 
				
			||||||
@@ -392,34 +391,34 @@ var gZenMarketplaceManager = {
 | 
				
			|||||||
            return;
 | 
					            return;
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          await this.removeTheme(event.target.getAttribute('zen-theme-id'));
 | 
					          await this.removeMod(event.target.getAttribute('zen-mod-id'));
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (theme.homepage) {
 | 
					      if (mod.homepage) {
 | 
				
			||||||
        const homepageButton = fragment.querySelector('.zenThemeMarketplaceItemHomepageButton');
 | 
					        const homepageButton = fragment.querySelector('.zenThemeMarketplaceItemHomepageButton');
 | 
				
			||||||
        homepageButton.addEventListener('click', () => {
 | 
					        homepageButton.addEventListener('click', () => {
 | 
				
			||||||
          // open the homepage url in a new tab
 | 
					          // open the homepage url in a new tab
 | 
				
			||||||
          const url = theme.homepage;
 | 
					          const url = mod.homepage;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          window.open(url, '_blank');
 | 
					          window.open(url, '_blank');
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (theme.preferences) {
 | 
					      if (mod.preferences) {
 | 
				
			||||||
        fragment
 | 
					        fragment
 | 
				
			||||||
          .querySelector('.zenThemeMarketplaceItemConfigureButton')
 | 
					          .querySelector('.zenThemeMarketplaceItemConfigureButton')
 | 
				
			||||||
          .addEventListener('click', () => {
 | 
					          .addEventListener('click', () => {
 | 
				
			||||||
            dialog.showModal();
 | 
					            dialog.showModal();
 | 
				
			||||||
          });
 | 
					          });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (isThemeEnabled) {
 | 
					        if (isModEnabled) {
 | 
				
			||||||
          fragment
 | 
					          fragment
 | 
				
			||||||
            .querySelector('.zenThemeMarketplaceItemConfigureButton')
 | 
					            .querySelector('.zenThemeMarketplaceItemConfigureButton')
 | 
				
			||||||
            .removeAttribute('hidden');
 | 
					            .removeAttribute('hidden');
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      const preferences = await ZenThemesCommon.getThemePreferences(theme);
 | 
					      const preferences = await gZenMods.getModPreferences(mod);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (preferences.length > 0) {
 | 
					      if (preferences.length > 0) {
 | 
				
			||||||
        const preferencesWrapper = document.createXULElement('vbox');
 | 
					        const preferencesWrapper = document.createXULElement('vbox');
 | 
				
			||||||
@@ -471,7 +470,7 @@ var gZenMarketplaceManager = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                if (!['string', 'number'].includes(valueType)) {
 | 
					                if (!['string', 'number'].includes(valueType)) {
 | 
				
			||||||
                  console.log(
 | 
					                  console.log(
 | 
				
			||||||
                    `[ZenThemeMarketplaceParent:settings]: Warning, invalid data type received (${valueType}), skipping.`
 | 
					                    `[ZenSettings:ZenMods]: Warning, invalid data type received (${valueType}), skipping.`
 | 
				
			||||||
                  );
 | 
					                  );
 | 
				
			||||||
                  continue;
 | 
					                  continue;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -583,7 +582,7 @@ var gZenMarketplaceManager = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
              input.addEventListener(
 | 
					              input.addEventListener(
 | 
				
			||||||
                'change',
 | 
					                'change',
 | 
				
			||||||
                ZenThemesCommon.debounce((event) => {
 | 
					                gZenMods.debounce((event) => {
 | 
				
			||||||
                  const value = event.target.value;
 | 
					                  const value = event.target.value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                  Services.prefs.setStringPref(property, value);
 | 
					                  Services.prefs.setStringPref(property, value);
 | 
				
			||||||
@@ -617,18 +616,18 @@ var gZenMarketplaceManager = {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            default:
 | 
					            default:
 | 
				
			||||||
              console.log(
 | 
					              console.log(
 | 
				
			||||||
                `[ZenThemeMarketplaceParent:settings]: Warning, unknown preference type received (${type}), skipping.`
 | 
					                `[ZenSettings:ZenMods]: Warning, unknown preference type received (${type}), skipping.`
 | 
				
			||||||
              );
 | 
					              );
 | 
				
			||||||
              continue;
 | 
					              continue;
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        contentDiv.appendChild(preferencesWrapper);
 | 
					        contentDiv.appendChild(preferencesWrapper);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      themeList.appendChild(fragment);
 | 
					      modList.appendChild(fragment);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    this.themesList.replaceChildren(...themeList.children);
 | 
					    this.modsList.replaceChildren(...modList.children);
 | 
				
			||||||
    themeList.remove();
 | 
					    modList.remove();
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -636,6 +635,19 @@ const kZenExtendedSidebar = 'zen.view.sidebar-expanded';
 | 
				
			|||||||
const kZenSingleToolbar = 'zen.view.use-single-toolbar';
 | 
					const kZenSingleToolbar = 'zen.view.use-single-toolbar';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var gZenLooksAndFeel = {
 | 
					var gZenLooksAndFeel = {
 | 
				
			||||||
 | 
					  kZenColors: [
 | 
				
			||||||
 | 
					    '#aac7ff',
 | 
				
			||||||
 | 
					    '#74d7cb',
 | 
				
			||||||
 | 
					    '#a0d490',
 | 
				
			||||||
 | 
					    '#dec663',
 | 
				
			||||||
 | 
					    '#ffb787',
 | 
				
			||||||
 | 
					    '#dec1b1',
 | 
				
			||||||
 | 
					    '#ffb1c0',
 | 
				
			||||||
 | 
					    '#ddbfc3',
 | 
				
			||||||
 | 
					    '#f6b0ea',
 | 
				
			||||||
 | 
					    '#d4bbff',
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  init() {
 | 
					  init() {
 | 
				
			||||||
    if (this.__hasInitialized) return;
 | 
					    if (this.__hasInitialized) return;
 | 
				
			||||||
    this.__hasInitialized = true;
 | 
					    this.__hasInitialized = true;
 | 
				
			||||||
@@ -737,7 +749,8 @@ var gZenLooksAndFeel = {
 | 
				
			|||||||
  _initializeColorPicker(accentColor) {
 | 
					  _initializeColorPicker(accentColor) {
 | 
				
			||||||
    let elem = document.getElementById('zenLooksAndFeelColorOptions');
 | 
					    let elem = document.getElementById('zenLooksAndFeelColorOptions');
 | 
				
			||||||
    elem.innerHTML = '';
 | 
					    elem.innerHTML = '';
 | 
				
			||||||
    for (let color of ZenThemesCommon.kZenColors) {
 | 
					
 | 
				
			||||||
 | 
					    for (let color of this.kZenColors) {
 | 
				
			||||||
      let colorElemParen = document.createElement('div');
 | 
					      let colorElemParen = document.createElement('div');
 | 
				
			||||||
      let colorElem = document.createElement('div');
 | 
					      let colorElem = document.createElement('div');
 | 
				
			||||||
      colorElemParen.classList.add('zenLooksAndFeelColorOptionParen');
 | 
					      colorElemParen.classList.add('zenLooksAndFeelColorOptionParen');
 | 
				
			||||||
@@ -761,7 +774,7 @@ var gZenLooksAndFeel = {
 | 
				
			|||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _getInitialAccentColor() {
 | 
					  _getInitialAccentColor() {
 | 
				
			||||||
    return Services.prefs.getStringPref('zen.theme.accent-color', ZenThemesCommon.kZenColors[0]);
 | 
					    return Services.prefs.getStringPref('zen.theme.accent-color', this.kZenColors[0]);
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1219,4 +1232,9 @@ Preferences.addAll([
 | 
				
			|||||||
    type: 'bool',
 | 
					    type: 'bool',
 | 
				
			||||||
    default: false,
 | 
					    default: false,
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 'zen.mods.auto-update',
 | 
				
			||||||
 | 
					    type: 'bool',
 | 
				
			||||||
 | 
					    default: true,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
]);
 | 
					]);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,4 @@
 | 
				
			|||||||
<script src="chrome://browser/content/zen-components/ZenCommonUtils.mjs" defer=""/>
 | 
					<script src="chrome://browser/content/zen-components/ZenCommonUtils.mjs" defer=""/>
 | 
				
			||||||
<script src="chrome://browser/content/zen-components/ZenThemesCommon.mjs" defer=""/>
 | 
					 | 
				
			||||||
<html:template id="template-paneZenMarketplace">
 | 
					<html:template id="template-paneZenMarketplace">
 | 
				
			||||||
<hbox id="ZenMarketplaceCategory"
 | 
					<hbox id="ZenMarketplaceCategory"
 | 
				
			||||||
      class="subcategory"
 | 
					      class="subcategory"
 | 
				
			||||||
@@ -21,6 +20,10 @@
 | 
				
			|||||||
            <button id="zenThemeMarketplaceCheckForUpdates" data-l10n-id="zen-theme-marketplace-check-for-updates-button" />
 | 
					            <button id="zenThemeMarketplaceCheckForUpdates" data-l10n-id="zen-theme-marketplace-check-for-updates-button" />
 | 
				
			||||||
      </hbox>
 | 
					      </hbox>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <checkbox id="zenThemeMarketplaceAutoUpdate"
 | 
				
			||||||
 | 
					            data-l10n-id="zen-themes-auto-update"
 | 
				
			||||||
 | 
					            preference="zen.mods.auto-update"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      <description class="description-deemphasized" data-l10n-id="zen-theme-marketplace-updates-success" hidden="true" id="zenThemeMarketplaceUpdatesSuccess" />
 | 
					      <description class="description-deemphasized" data-l10n-id="zen-theme-marketplace-updates-success" hidden="true" id="zenThemeMarketplaceUpdatesSuccess" />
 | 
				
			||||||
      <description class="description-deemphasized" data-l10n-id="zen-theme-marketplace-updates-failure" hidden="true" id="zenThemeMarketplaceUpdatesFailure" />
 | 
					      <description class="description-deemphasized" data-l10n-id="zen-theme-marketplace-updates-failure" hidden="true" id="zenThemeMarketplaceUpdatesFailure" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,26 +31,6 @@
 | 
				
			|||||||
<html:h1 data-l10n-id="pane-zen-tabs-unloader-title"/>
 | 
					<html:h1 data-l10n-id="pane-zen-tabs-unloader-title"/>
 | 
				
			||||||
</hbox>
 | 
					</hbox>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<groupbox id="zenTabsUnloadGroup" data-category="paneZenTabManagement" hidden="true" class="highlighting-group">
 | 
					 | 
				
			||||||
      <label><html:h2 data-l10n-id="zen-tabs-unloader-header"/></label>
 | 
					 | 
				
			||||||
      <description class="description-deemphasized" data-l10n-id="zen-tabs-unloader-description" />
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      <checkbox id="zenTabsUnloadActivate"
 | 
					 | 
				
			||||||
            data-l10n-id="zen-tabs-unloader-enabled"
 | 
					 | 
				
			||||||
            preference="zen.tab-unloader.enabled"/>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      <label><html:h2 data-l10n-id="zen-tabs-unloader-unload-delay"/></label>
 | 
					 | 
				
			||||||
      <hbox id="zenTabsUnloadDelayContainer">
 | 
					 | 
				
			||||||
            <description class="description-deemphasized" data-l10n-id="zen-tabs-unloader-unload-delay-description" />
 | 
					 | 
				
			||||||
            <html:input id="zenTabsUnloadDelay"
 | 
					 | 
				
			||||||
                  type="number"
 | 
					 | 
				
			||||||
                  min="1"
 | 
					 | 
				
			||||||
                  max="1000"
 | 
					 | 
				
			||||||
                  preference="zen.tab-unloader.timeout-minutes"/>
 | 
					 | 
				
			||||||
      </hbox>
 | 
					 | 
				
			||||||
</groupbox>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
<hbox id="zenPinnedTabsManagerCategory"
 | 
					<hbox id="zenPinnedTabsManagerCategory"
 | 
				
			||||||
      class="subcategory"
 | 
					      class="subcategory"
 | 
				
			||||||
      hidden="true"
 | 
					      hidden="true"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										13
									
								
								src/browser/components/search/SearchUIUtils-sys-mjs.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/browser/components/search/SearchUIUtils-sys-mjs.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					diff --git a/browser/components/search/SearchUIUtils.sys.mjs b/browser/components/search/SearchUIUtils.sys.mjs
 | 
				
			||||||
 | 
					index ecebaad93acfc9eb7dfd9d9f56fec2e1a4abe392..8bb1348b3258dbc518d23ec39181a81f87fc8c1e 100644
 | 
				
			||||||
 | 
					--- a/browser/components/search/SearchUIUtils.sys.mjs
 | 
				
			||||||
 | 
					+++ b/browser/components/search/SearchUIUtils.sys.mjs
 | 
				
			||||||
 | 
					@@ -403,7 +403,7 @@ export var SearchUIUtils = {
 | 
				
			||||||
 | 
					         triggeringSearchEngine: engine.name,
 | 
				
			||||||
 | 
					       },
 | 
				
			||||||
 | 
					     });
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
 | 
					+    window.gZenGlanceManager?.onSearchSelectCommand(where);
 | 
				
			||||||
 | 
					     return { engine, url: submission.uri };
 | 
				
			||||||
 | 
					   },
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs
 | 
					diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs
 | 
				
			||||||
index 11794372f8ff13387b54dabdf4111dfdb89ea998..0e51251a579cee759f25272894c82a1744d79b26 100644
 | 
					index 8c6047e1ada5a22e57e1e665965237c9e22641d7..8d0585e738a5a758ebbddfa0787c71d634dadd4d 100644
 | 
				
			||||||
--- a/browser/components/sessionstore/SessionStore.sys.mjs
 | 
					--- a/browser/components/sessionstore/SessionStore.sys.mjs
 | 
				
			||||||
+++ b/browser/components/sessionstore/SessionStore.sys.mjs
 | 
					+++ b/browser/components/sessionstore/SessionStore.sys.mjs
 | 
				
			||||||
@@ -2088,7 +2088,6 @@ var SessionStoreInternal = {
 | 
					@@ -2088,7 +2088,6 @@ var SessionStoreInternal = {
 | 
				
			||||||
@@ -22,7 +22,7 @@ index 11794372f8ff13387b54dabdf4111dfdb89ea998..0e51251a579cee759f25272894c82a17
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
       // Store the window's close date to figure out when each individual tab
 | 
					       // 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
 | 
					       // was closed. This timestamp should allow re-arranging data based on how
 | 
				
			||||||
@@ -3209,7 +3206,7 @@ var SessionStoreInternal = {
 | 
					@@ -3216,7 +3213,7 @@ var SessionStoreInternal = {
 | 
				
			||||||
     if (!isPrivateWindow && tabState.isPrivate) {
 | 
					     if (!isPrivateWindow && tabState.isPrivate) {
 | 
				
			||||||
       return;
 | 
					       return;
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
@@ -31,17 +31,19 @@ index 11794372f8ff13387b54dabdf4111dfdb89ea998..0e51251a579cee759f25272894c82a17
 | 
				
			|||||||
       return;
 | 
					       return;
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -3918,6 +3915,9 @@ var SessionStoreInternal = {
 | 
					@@ -3925,6 +3922,11 @@ var SessionStoreInternal = {
 | 
				
			||||||
         Math.min(tabState.index, tabState.entries.length)
 | 
					         Math.min(tabState.index, tabState.entries.length)
 | 
				
			||||||
       );
 | 
					       );
 | 
				
			||||||
       tabState.pinned = false;
 | 
					       tabState.pinned = false;
 | 
				
			||||||
+      tabState.zenEssential = false;
 | 
					+      tabState.zenEssential = false;
 | 
				
			||||||
+      tabState.zenPinnedId = null;
 | 
					+      tabState.zenPinnedId = null;
 | 
				
			||||||
 | 
					+      tabState.zenIsGlance = false;
 | 
				
			||||||
 | 
					+      tabState.zenGlanceId = null;
 | 
				
			||||||
+      tabState.zenHasStaticLabel = false;
 | 
					+      tabState.zenHasStaticLabel = false;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       if (inBackground === false) {
 | 
					       if (inBackground === false) {
 | 
				
			||||||
         aWindow.gBrowser.selectedTab = newTab;
 | 
					         aWindow.gBrowser.selectedTab = newTab;
 | 
				
			||||||
@@ -5232,7 +5232,7 @@ var SessionStoreInternal = {
 | 
					@@ -5239,7 +5241,7 @@ var SessionStoreInternal = {
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     let workspaceID = aWindow.getWorkspaceID();
 | 
					     let workspaceID = aWindow.getWorkspaceID();
 | 
				
			||||||
@@ -50,7 +52,7 @@ index 11794372f8ff13387b54dabdf4111dfdb89ea998..0e51251a579cee759f25272894c82a17
 | 
				
			|||||||
       winData.workspaceID = workspaceID;
 | 
					       winData.workspaceID = workspaceID;
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
   },
 | 
					   },
 | 
				
			||||||
@@ -5423,14 +5423,15 @@ var SessionStoreInternal = {
 | 
					@@ -5430,14 +5432,15 @@ var SessionStoreInternal = {
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     let tabbrowser = aWindow.gBrowser;
 | 
					     let tabbrowser = aWindow.gBrowser;
 | 
				
			||||||
@@ -68,16 +70,29 @@ index 11794372f8ff13387b54dabdf4111dfdb89ea998..0e51251a579cee759f25272894c82a17
 | 
				
			|||||||
         continue;
 | 
					         continue;
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
       let tabData = lazy.TabState.collect(tab, TAB_CUSTOM_VALUES.get(tab));
 | 
					       let tabData = lazy.TabState.collect(tab, TAB_CUSTOM_VALUES.get(tab));
 | 
				
			||||||
@@ -5449,7 +5450,7 @@ var SessionStoreInternal = {
 | 
					@@ -5456,8 +5459,8 @@ var SessionStoreInternal = {
 | 
				
			||||||
     // We don't store the Firefox View tab in Session Store, so if it was the last selected "tab" when
 | 
					     // We don't store the Firefox View tab in Session Store, so if it was the last selected "tab" when
 | 
				
			||||||
     // a window is closed, point to the first item in the tab strip instead (it will never be the Firefox View tab,
 | 
					     // 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).
 | 
					     // since it's only inserted into the tab strip after it's selected).
 | 
				
			||||||
-    if (aWindow.FirefoxViewHandler.tab?.selected) {
 | 
					-    if (aWindow.FirefoxViewHandler.tab?.selected) {
 | 
				
			||||||
 | 
					-      selectedIndex = 1;
 | 
				
			||||||
+    if (aWindow.FirefoxViewHandler.tab?.selected || tabbrowser.selectedTab.hasAttribute("zen-empty-tab")) {
 | 
					+    if (aWindow.FirefoxViewHandler.tab?.selected || tabbrowser.selectedTab.hasAttribute("zen-empty-tab")) {
 | 
				
			||||||
       selectedIndex = 1;
 | 
					+      selectedIndex = 0;
 | 
				
			||||||
       winData.title = tabbrowser.tabs[0].label;
 | 
					       winData.title = tabbrowser.tabs[0].label;
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
@@ -5606,6 +5607,7 @@ var SessionStoreInternal = {
 | 
					     winData.selected = selectedIndex;
 | 
				
			||||||
 | 
					@@ -5569,8 +5572,8 @@ var SessionStoreInternal = {
 | 
				
			||||||
 | 
					     // selectTab represents.
 | 
				
			||||||
 | 
					     let selectTab = 0;
 | 
				
			||||||
 | 
					     if (overwriteTabs) {
 | 
				
			||||||
 | 
					-      selectTab = parseInt(winData.selected || 1, 10);
 | 
				
			||||||
 | 
					-      selectTab = Math.max(selectTab, 1);
 | 
				
			||||||
 | 
					+      selectTab = parseInt(winData.selected || 0, 10);
 | 
				
			||||||
 | 
					+      selectTab = Math.max(selectTab, 0);
 | 
				
			||||||
 | 
					       selectTab = Math.min(selectTab, winData.tabs.length);
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 | 
					@@ -5613,6 +5616,7 @@ var SessionStoreInternal = {
 | 
				
			||||||
         winData.tabs,
 | 
					         winData.tabs,
 | 
				
			||||||
         winData.groups ?? []
 | 
					         winData.groups ?? []
 | 
				
			||||||
       );
 | 
					       );
 | 
				
			||||||
@@ -85,12 +100,13 @@ index 11794372f8ff13387b54dabdf4111dfdb89ea998..0e51251a579cee759f25272894c82a17
 | 
				
			|||||||
       this._log.debug(
 | 
					       this._log.debug(
 | 
				
			||||||
         `restoreWindow, createTabsForSessionRestore returned ${tabs.length} tabs`
 | 
					         `restoreWindow, createTabsForSessionRestore returned ${tabs.length} tabs`
 | 
				
			||||||
       );
 | 
					       );
 | 
				
			||||||
@@ -6155,8 +6157,23 @@ var SessionStoreInternal = {
 | 
					@@ -6162,6 +6166,22 @@ var SessionStoreInternal = {
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     // Most of tabData has been restored, now continue with restoring
 | 
					     // Most of tabData has been restored, now continue with restoring
 | 
				
			||||||
     // attributes that may trigger external events.
 | 
					     // attributes that may trigger external events.
 | 
				
			||||||
+    if (tabData.zenEssential) {
 | 
					+    if (tabData.zenEssential) {
 | 
				
			||||||
+      tab.setAttribute("zen-essential", "true");
 | 
					+      tab.setAttribute("zen-essential", "true");
 | 
				
			||||||
 | 
					+      tabData.pinned = true; // Essential tabs are always pinned.
 | 
				
			||||||
+    }
 | 
					+    }
 | 
				
			||||||
+    if (tabData.zenIsEmpty) {
 | 
					+    if (tabData.zenIsEmpty) {
 | 
				
			||||||
+      tab.setAttribute("zen-empty-tab", "true");
 | 
					+      tab.setAttribute("zen-empty-tab", "true");
 | 
				
			||||||
@@ -105,8 +121,5 @@ index 11794372f8ff13387b54dabdf4111dfdb89ea998..0e51251a579cee759f25272894c82a17
 | 
				
			|||||||
+      tab.setAttribute("zenDefaultUserContextId", true);
 | 
					+      tab.setAttribute("zenDefaultUserContextId", true);
 | 
				
			||||||
+    }
 | 
					+    }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
-    if (tabData.pinned) {
 | 
					     if (tabData.pinned) {
 | 
				
			||||||
+    if (tabData.pinned || tabData.zenEssential) {
 | 
					 | 
				
			||||||
       tabbrowser.pinTab(tab);
 | 
					       tabbrowser.pinTab(tab);
 | 
				
			||||||
     } else {
 | 
					 | 
				
			||||||
       tabbrowser.unpinTab(tab);
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/browser/components/sessionstore/TabState.sys.mjs b/browser/components/sessionstore/TabState.sys.mjs
 | 
					diff --git a/browser/components/sessionstore/TabState.sys.mjs b/browser/components/sessionstore/TabState.sys.mjs
 | 
				
			||||||
index 8f7ed557e6aa61e7e16ed4a8d785ad5fe651b3d8..254849e13f7566029dc780c45e376e0f0d427cb5 100644
 | 
					index 8f7ed557e6aa61e7e16ed4a8d785ad5fe651b3d8..76f4cf5aef30cb580ef0295fe6928b5a6a362f4b 100644
 | 
				
			||||||
--- a/browser/components/sessionstore/TabState.sys.mjs
 | 
					--- a/browser/components/sessionstore/TabState.sys.mjs
 | 
				
			||||||
+++ b/browser/components/sessionstore/TabState.sys.mjs
 | 
					+++ b/browser/components/sessionstore/TabState.sys.mjs
 | 
				
			||||||
@@ -84,6 +84,16 @@ class _TabState {
 | 
					@@ -84,6 +84,18 @@ class _TabState {
 | 
				
			||||||
       tabData.groupId = tab.group.id;
 | 
					       tabData.groupId = tab.group.id;
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -15,6 +15,8 @@ index 8f7ed557e6aa61e7e16ed4a8d785ad5fe651b3d8..254849e13f7566029dc780c45e376e0f
 | 
				
			|||||||
+    tabData.zenPinnedIcon = tab.getAttribute("zen-pinned-icon");
 | 
					+    tabData.zenPinnedIcon = tab.getAttribute("zen-pinned-icon");
 | 
				
			||||||
+    tabData.zenIsEmpty = tab.hasAttribute("zen-empty-tab");
 | 
					+    tabData.zenIsEmpty = tab.hasAttribute("zen-empty-tab");
 | 
				
			||||||
+    tabData.zenHasStaticLabel = tab.hasAttribute("zen-has-static-label");
 | 
					+    tabData.zenHasStaticLabel = tab.hasAttribute("zen-has-static-label");
 | 
				
			||||||
 | 
					+    tabData.zenGlanceId = tab.getAttribute("glance-id");
 | 
				
			||||||
 | 
					+    tabData.zenIsGlance = tab.hasAttribute("zen-glance-tab");
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
     tabData.searchMode = tab.ownerGlobal.gURLBar.getSearchMode(browser, true);
 | 
					     tabData.searchMode = tab.ownerGlobal.gURLBar.getSearchMode(browser, true);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										13
									
								
								src/browser/components/tabbrowser/TabUnloader-sys-mjs.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/browser/components/tabbrowser/TabUnloader-sys-mjs.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					diff --git a/browser/components/tabbrowser/TabUnloader.sys.mjs b/browser/components/tabbrowser/TabUnloader.sys.mjs
 | 
				
			||||||
 | 
					index 44846cc902fd3fc17d12be38ac9abccb47a12f23..c715c7cf47486066b3fd6f92bf78bc8a720759bc 100644
 | 
				
			||||||
 | 
					--- a/browser/components/tabbrowser/TabUnloader.sys.mjs
 | 
				
			||||||
 | 
					+++ b/browser/components/tabbrowser/TabUnloader.sys.mjs
 | 
				
			||||||
 | 
					@@ -52,7 +52,7 @@ let CRITERIA_WEIGHT = 1;
 | 
				
			||||||
 | 
					  */
 | 
				
			||||||
 | 
					 let DefaultTabUnloaderMethods = {
 | 
				
			||||||
 | 
					   isNonDiscardable(tab, weight) {
 | 
				
			||||||
 | 
					-    if (tab.undiscardable || tab.selected) {
 | 
				
			||||||
 | 
					+    if (tab.undiscardable || tab.selected || tab.zenModeActive) {
 | 
				
			||||||
 | 
					       return weight;
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/browser/components/tabbrowser/content/tab.js b/browser/components/tabbrowser/content/tab.js
 | 
					diff --git a/browser/components/tabbrowser/content/tab.js b/browser/components/tabbrowser/content/tab.js
 | 
				
			||||||
index dc92771ebc65095dfebbddc238ee6d4fffd897bf..fa35f6835498f8e51f060479addb25237d3fe7ff 100644
 | 
					index f43ab1cf6257ff1a9c9aa522a0180fd9bbfe4036..d9714c46de860243b06af7e8343d36b107efb855 100644
 | 
				
			||||||
--- a/browser/components/tabbrowser/content/tab.js
 | 
					--- a/browser/components/tabbrowser/content/tab.js
 | 
				
			||||||
+++ b/browser/components/tabbrowser/content/tab.js
 | 
					+++ b/browser/components/tabbrowser/content/tab.js
 | 
				
			||||||
@@ -21,6 +21,7 @@
 | 
					@@ -21,6 +21,7 @@
 | 
				
			||||||
@@ -21,7 +21,7 @@ index dc92771ebc65095dfebbddc238ee6d4fffd897bf..fa35f6835498f8e51f060479addb2523
 | 
				
			|||||||
         </hbox>
 | 
					         </hbox>
 | 
				
			||||||
       </stack>
 | 
					       </stack>
 | 
				
			||||||
       `;
 | 
					       `;
 | 
				
			||||||
@@ -175,7 +178,7 @@
 | 
					@@ -180,7 +183,7 @@
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     set _visuallySelected(val) {
 | 
					     set _visuallySelected(val) {
 | 
				
			||||||
@@ -30,7 +30,7 @@ index dc92771ebc65095dfebbddc238ee6d4fffd897bf..fa35f6835498f8e51f060479addb2523
 | 
				
			|||||||
         return;
 | 
					         return;
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -211,7 +214,7 @@
 | 
					@@ -216,7 +219,7 @@
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     get visible() {
 | 
					     get visible() {
 | 
				
			||||||
@@ -39,7 +39,7 @@ index dc92771ebc65095dfebbddc238ee6d4fffd897bf..fa35f6835498f8e51f060479addb2523
 | 
				
			|||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     get hidden() {
 | 
					     get hidden() {
 | 
				
			||||||
@@ -282,7 +285,7 @@
 | 
					@@ -287,7 +290,7 @@
 | 
				
			||||||
         return false;
 | 
					         return false;
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -48,7 +48,7 @@ index dc92771ebc65095dfebbddc238ee6d4fffd897bf..fa35f6835498f8e51f060479addb2523
 | 
				
			|||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     get lastAccessed() {
 | 
					     get lastAccessed() {
 | 
				
			||||||
@@ -454,6 +457,8 @@
 | 
					@@ -459,6 +462,8 @@
 | 
				
			||||||
         this.style.MozUserFocus = "ignore";
 | 
					         this.style.MozUserFocus = "ignore";
 | 
				
			||||||
       } else if (
 | 
					       } else if (
 | 
				
			||||||
         event.target.classList.contains("tab-close-button") ||
 | 
					         event.target.classList.contains("tab-close-button") ||
 | 
				
			||||||
@@ -57,7 +57,7 @@ index dc92771ebc65095dfebbddc238ee6d4fffd897bf..fa35f6835498f8e51f060479addb2523
 | 
				
			|||||||
         event.target.classList.contains("tab-icon-overlay") ||
 | 
					         event.target.classList.contains("tab-icon-overlay") ||
 | 
				
			||||||
         event.target.classList.contains("tab-audio-button")
 | 
					         event.target.classList.contains("tab-audio-button")
 | 
				
			||||||
       ) {
 | 
					       ) {
 | 
				
			||||||
@@ -508,6 +513,10 @@
 | 
					@@ -513,6 +518,10 @@
 | 
				
			||||||
       this.style.MozUserFocus = "";
 | 
					       this.style.MozUserFocus = "";
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -68,7 +68,7 @@ index dc92771ebc65095dfebbddc238ee6d4fffd897bf..fa35f6835498f8e51f060479addb2523
 | 
				
			|||||||
     on_click(event) {
 | 
					     on_click(event) {
 | 
				
			||||||
       if (event.button != 0) {
 | 
					       if (event.button != 0) {
 | 
				
			||||||
         return;
 | 
					         return;
 | 
				
			||||||
@@ -554,6 +563,7 @@
 | 
					@@ -559,6 +568,7 @@
 | 
				
			||||||
             telemetrySource: lazy.TabMetrics.METRIC_SOURCE.TAB_STRIP,
 | 
					             telemetrySource: lazy.TabMetrics.METRIC_SOURCE.TAB_STRIP,
 | 
				
			||||||
           });
 | 
					           });
 | 
				
			||||||
         } else {
 | 
					         } else {
 | 
				
			||||||
@@ -76,7 +76,7 @@ index dc92771ebc65095dfebbddc238ee6d4fffd897bf..fa35f6835498f8e51f060479addb2523
 | 
				
			|||||||
           gBrowser.removeTab(this, {
 | 
					           gBrowser.removeTab(this, {
 | 
				
			||||||
             animate: true,
 | 
					             animate: true,
 | 
				
			||||||
             triggeringEvent: event,
 | 
					             triggeringEvent: event,
 | 
				
			||||||
@@ -564,6 +574,14 @@
 | 
					@@ -569,6 +579,14 @@
 | 
				
			||||||
         // (see tabbrowser-tabs 'click' handler).
 | 
					         // (see tabbrowser-tabs 'click' handler).
 | 
				
			||||||
         gBrowser.tabContainer._blockDblClick = true;
 | 
					         gBrowser.tabContainer._blockDblClick = true;
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
@@ -91,7 +91,7 @@ index dc92771ebc65095dfebbddc238ee6d4fffd897bf..fa35f6835498f8e51f060479addb2523
 | 
				
			|||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     on_dblclick(event) {
 | 
					     on_dblclick(event) {
 | 
				
			||||||
@@ -587,6 +605,8 @@
 | 
					@@ -592,6 +610,8 @@
 | 
				
			||||||
           animate: true,
 | 
					           animate: true,
 | 
				
			||||||
           triggeringEvent: event,
 | 
					           triggeringEvent: event,
 | 
				
			||||||
         });
 | 
					         });
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,15 +1,11 @@
 | 
				
			|||||||
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
 | 
					diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
 | 
				
			||||||
index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f255c4ebc9 100644
 | 
					index d5aa64842a35c6697263c63fd3a0571b64b01344..14f5bc046f2e54109bd3fd0402a8f8b598a513c2 100644
 | 
				
			||||||
--- a/browser/components/tabbrowser/content/tabbrowser.js
 | 
					--- a/browser/components/tabbrowser/content/tabbrowser.js
 | 
				
			||||||
+++ b/browser/components/tabbrowser/content/tabbrowser.js
 | 
					+++ b/browser/components/tabbrowser/content/tabbrowser.js
 | 
				
			||||||
@@ -415,11 +415,45 @@
 | 
					@@ -413,11 +413,41 @@
 | 
				
			||||||
       return this.tabContainer.visibleTabs;
 | 
					       return this.tabContainer.visibleTabs;
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
+    zenInsertTabAtIndex(...args) {
 | 
					 | 
				
			||||||
+      return this.#insertTabAtElementIndex(...args);
 | 
					 | 
				
			||||||
+    }
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+    get _numVisiblePinTabsWithoutCollapsed() {
 | 
					+    get _numVisiblePinTabsWithoutCollapsed() {
 | 
				
			||||||
+      let i = 0;
 | 
					+      let i = 0;
 | 
				
			||||||
+      for (let item of this.tabContainer.ariaFocusableItems) {
 | 
					+      for (let item of this.tabContainer.ariaFocusableItems) {
 | 
				
			||||||
@@ -50,7 +46,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       }
 | 
					       }
 | 
				
			||||||
       return i;
 | 
					       return i;
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
@@ -571,6 +605,7 @@
 | 
					@@ -569,6 +599,7 @@
 | 
				
			||||||
       this.tabpanels.appendChild(panel);
 | 
					       this.tabpanels.appendChild(panel);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       let tab = this.tabs[0];
 | 
					       let tab = this.tabs[0];
 | 
				
			||||||
@@ -58,7 +54,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       tab.linkedPanel = uniqueId;
 | 
					       tab.linkedPanel = uniqueId;
 | 
				
			||||||
       this._selectedTab = tab;
 | 
					       this._selectedTab = tab;
 | 
				
			||||||
       this._selectedBrowser = browser;
 | 
					       this._selectedBrowser = browser;
 | 
				
			||||||
@@ -836,11 +871,13 @@
 | 
					@@ -834,11 +865,13 @@
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       this.showTab(aTab);
 | 
					       this.showTab(aTab);
 | 
				
			||||||
@@ -75,7 +71,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
         this.moveTabTo(aTab, {
 | 
					         this.moveTabTo(aTab, {
 | 
				
			||||||
           tabIndex: this.pinnedTabCount,
 | 
					           tabIndex: this.pinnedTabCount,
 | 
				
			||||||
           forceUngrouped: true,
 | 
					           forceUngrouped: true,
 | 
				
			||||||
@@ -857,12 +894,15 @@
 | 
					@@ -855,12 +888,15 @@
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       if (this.tabContainer.verticalMode) {
 | 
					       if (this.tabContainer.verticalMode) {
 | 
				
			||||||
@@ -92,7 +88,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
         });
 | 
					         });
 | 
				
			||||||
       } else {
 | 
					       } else {
 | 
				
			||||||
         this.moveTabTo(aTab, {
 | 
					         this.moveTabTo(aTab, {
 | 
				
			||||||
@@ -1046,6 +1086,8 @@
 | 
					@@ -1044,6 +1080,8 @@
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       let LOCAL_PROTOCOLS = ["chrome:", "about:", "resource:", "data:"];
 | 
					       let LOCAL_PROTOCOLS = ["chrome:", "about:", "resource:", "data:"];
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -101,7 +97,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       if (
 | 
					       if (
 | 
				
			||||||
         aIconURL &&
 | 
					         aIconURL &&
 | 
				
			||||||
         !aLoadingPrincipal &&
 | 
					         !aLoadingPrincipal &&
 | 
				
			||||||
@@ -1056,6 +1098,9 @@
 | 
					@@ -1054,6 +1092,9 @@
 | 
				
			||||||
         );
 | 
					         );
 | 
				
			||||||
         return;
 | 
					         return;
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
@@ -111,7 +107,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
       let browser = this.getBrowserForTab(aTab);
 | 
					       let browser = this.getBrowserForTab(aTab);
 | 
				
			||||||
       browser.mIconURL = aIconURL;
 | 
					       browser.mIconURL = aIconURL;
 | 
				
			||||||
@@ -1305,6 +1350,7 @@
 | 
					@@ -1303,6 +1344,7 @@
 | 
				
			||||||
       if (!this._previewMode) {
 | 
					       if (!this._previewMode) {
 | 
				
			||||||
         newTab.recordTimeFromUnloadToReload();
 | 
					         newTab.recordTimeFromUnloadToReload();
 | 
				
			||||||
         newTab.updateLastAccessed();
 | 
					         newTab.updateLastAccessed();
 | 
				
			||||||
@@ -119,7 +115,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
         oldTab.updateLastAccessed();
 | 
					         oldTab.updateLastAccessed();
 | 
				
			||||||
         // if this is the foreground window, update the last-seen timestamps.
 | 
					         // if this is the foreground window, update the last-seen timestamps.
 | 
				
			||||||
         if (this.ownerGlobal == BrowserWindowTracker.getTopWindow()) {
 | 
					         if (this.ownerGlobal == BrowserWindowTracker.getTopWindow()) {
 | 
				
			||||||
@@ -1457,6 +1503,9 @@
 | 
					@@ -1455,6 +1497,9 @@
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       let activeEl = document.activeElement;
 | 
					       let activeEl = document.activeElement;
 | 
				
			||||||
@@ -129,7 +125,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       // If focus is on the old tab, move it to the new tab.
 | 
					       // If focus is on the old tab, move it to the new tab.
 | 
				
			||||||
       if (activeEl == oldTab) {
 | 
					       if (activeEl == oldTab) {
 | 
				
			||||||
         newTab.focus();
 | 
					         newTab.focus();
 | 
				
			||||||
@@ -1780,7 +1829,8 @@
 | 
					@@ -1778,7 +1823,8 @@
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     _setTabLabel(aTab, aLabel, { beforeTabOpen, isContentTitle, isURL } = {}) {
 | 
					     _setTabLabel(aTab, aLabel, { beforeTabOpen, isContentTitle, isURL } = {}) {
 | 
				
			||||||
@@ -139,7 +135,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
         return false;
 | 
					         return false;
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -1888,7 +1938,7 @@
 | 
					@@ -1886,7 +1932,7 @@
 | 
				
			||||||
         newIndex = this.selectedTab._tPos + 1;
 | 
					         newIndex = this.selectedTab._tPos + 1;
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -148,7 +144,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
         if (this.isTabGroupLabel(targetTab)) {
 | 
					         if (this.isTabGroupLabel(targetTab)) {
 | 
				
			||||||
           throw new Error(
 | 
					           throw new Error(
 | 
				
			||||||
             "Replacing a tab group label with a tab is not supported"
 | 
					             "Replacing a tab group label with a tab is not supported"
 | 
				
			||||||
@@ -2152,6 +2202,7 @@
 | 
					@@ -2150,6 +2196,7 @@
 | 
				
			||||||
       uriIsAboutBlank,
 | 
					       uriIsAboutBlank,
 | 
				
			||||||
       userContextId,
 | 
					       userContextId,
 | 
				
			||||||
       skipLoad,
 | 
					       skipLoad,
 | 
				
			||||||
@@ -156,7 +152,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
     } = {}) {
 | 
					     } = {}) {
 | 
				
			||||||
       let b = document.createXULElement("browser");
 | 
					       let b = document.createXULElement("browser");
 | 
				
			||||||
       // Use the JSM global to create the permanentKey, so that if the
 | 
					       // Use the JSM global to create the permanentKey, so that if the
 | 
				
			||||||
@@ -2225,8 +2276,7 @@
 | 
					@@ -2223,8 +2270,7 @@
 | 
				
			||||||
         // we use a different attribute name for this?
 | 
					         // we use a different attribute name for this?
 | 
				
			||||||
         b.setAttribute("name", name);
 | 
					         b.setAttribute("name", name);
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
@@ -166,7 +162,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
         b.setAttribute("transparent", "true");
 | 
					         b.setAttribute("transparent", "true");
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -2391,7 +2441,7 @@
 | 
					@@ -2389,7 +2435,7 @@
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       let panel = this.getPanel(browser);
 | 
					       let panel = this.getPanel(browser);
 | 
				
			||||||
       let uniqueId = this._generateUniquePanelID();
 | 
					       let uniqueId = this._generateUniquePanelID();
 | 
				
			||||||
@@ -175,7 +171,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       aTab.linkedPanel = uniqueId;
 | 
					       aTab.linkedPanel = uniqueId;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       // Inject the <browser> into the DOM if necessary.
 | 
					       // Inject the <browser> into the DOM if necessary.
 | 
				
			||||||
@@ -2450,8 +2500,8 @@
 | 
					@@ -2448,8 +2494,8 @@
 | 
				
			||||||
       // If we transitioned from one browser to two browsers, we need to set
 | 
					       // If we transitioned from one browser to two browsers, we need to set
 | 
				
			||||||
       // hasSiblings=false on both the existing browser and the new browser.
 | 
					       // hasSiblings=false on both the existing browser and the new browser.
 | 
				
			||||||
       if (this.tabs.length == 2) {
 | 
					       if (this.tabs.length == 2) {
 | 
				
			||||||
@@ -186,7 +182,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       } else {
 | 
					       } else {
 | 
				
			||||||
         aTab.linkedBrowser.browsingContext.hasSiblings = this.tabs.length > 1;
 | 
					         aTab.linkedBrowser.browsingContext.hasSiblings = this.tabs.length > 1;
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
@@ -2679,6 +2729,7 @@
 | 
					@@ -2680,6 +2726,7 @@
 | 
				
			||||||
         schemelessInput,
 | 
					         schemelessInput,
 | 
				
			||||||
         hasValidUserGestureActivation = false,
 | 
					         hasValidUserGestureActivation = false,
 | 
				
			||||||
         textDirectiveUserActivation = false,
 | 
					         textDirectiveUserActivation = false,
 | 
				
			||||||
@@ -194,7 +190,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       } = {}
 | 
					       } = {}
 | 
				
			||||||
     ) {
 | 
					     ) {
 | 
				
			||||||
       // all callers of addTab that pass a params object need to pass
 | 
					       // all callers of addTab that pass a params object need to pass
 | 
				
			||||||
@@ -2689,6 +2740,12 @@
 | 
					@@ -2690,6 +2737,12 @@
 | 
				
			||||||
         );
 | 
					         );
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -207,7 +203,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       if (!UserInteraction.running("browser.tabs.opening", window)) {
 | 
					       if (!UserInteraction.running("browser.tabs.opening", window)) {
 | 
				
			||||||
         UserInteraction.start("browser.tabs.opening", "initting", window);
 | 
					         UserInteraction.start("browser.tabs.opening", "initting", window);
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
@@ -2752,6 +2809,16 @@
 | 
					@@ -2753,6 +2806,16 @@
 | 
				
			||||||
           noInitialLabel,
 | 
					           noInitialLabel,
 | 
				
			||||||
           skipBackgroundNotify,
 | 
					           skipBackgroundNotify,
 | 
				
			||||||
         });
 | 
					         });
 | 
				
			||||||
@@ -222,9 +218,9 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
+          t.setAttribute("zen-empty-tab", "true");
 | 
					+          t.setAttribute("zen-empty-tab", "true");
 | 
				
			||||||
+        }
 | 
					+        }
 | 
				
			||||||
         if (insertTab) {
 | 
					         if (insertTab) {
 | 
				
			||||||
           if (typeof index == "number") {
 | 
					           // Insert the tab into the tab container in the correct position.
 | 
				
			||||||
             elementIndex = this.#tabIndexToElementIndex(index);
 | 
					           // For now, we support `index` as an alias for `tabIndex`.
 | 
				
			||||||
@@ -2779,6 +2846,7 @@
 | 
					@@ -2783,6 +2846,7 @@
 | 
				
			||||||
           openWindowInfo,
 | 
					           openWindowInfo,
 | 
				
			||||||
           skipLoad,
 | 
					           skipLoad,
 | 
				
			||||||
           triggeringRemoteType,
 | 
					           triggeringRemoteType,
 | 
				
			||||||
@@ -232,7 +228,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
         }));
 | 
					         }));
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
         if (focusUrlBar) {
 | 
					         if (focusUrlBar) {
 | 
				
			||||||
@@ -2898,6 +2966,12 @@
 | 
					@@ -2902,6 +2966,12 @@
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -245,25 +241,8 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       // Additionally send pinned tab events
 | 
					       // Additionally send pinned tab events
 | 
				
			||||||
       if (pinned) {
 | 
					       if (pinned) {
 | 
				
			||||||
         this._notifyPinnedStatus(t);
 | 
					         this._notifyPinnedStatus(t);
 | 
				
			||||||
@@ -2945,12 +3019,15 @@
 | 
					@@ -2990,10 +3060,10 @@
 | 
				
			||||||
      * @param {string} [label=]
 | 
					         isAdoptingGroup = false,
 | 
				
			||||||
      * @returns {MozTabbrowserTabGroup}
 | 
					 | 
				
			||||||
      */
 | 
					 | 
				
			||||||
-    _createTabGroup(id, color, collapsed, label = "") {
 | 
					 | 
				
			||||||
+    _createTabGroup(id, color, collapsed, label = "", pinned = false, essential = false, splitViewGroup = false) {
 | 
					 | 
				
			||||||
       let group = document.createXULElement("tab-group", { is: "tab-group" });
 | 
					 | 
				
			||||||
       group.id = id;
 | 
					 | 
				
			||||||
       group.collapsed = collapsed;
 | 
					 | 
				
			||||||
       group.color = color;
 | 
					 | 
				
			||||||
       group.label = label;
 | 
					 | 
				
			||||||
+      group.pinned = pinned;
 | 
					 | 
				
			||||||
+      group.essential = essential;
 | 
					 | 
				
			||||||
+      if (splitViewGroup) group.setAttribute('split-view-group', true);
 | 
					 | 
				
			||||||
       return group;
 | 
					 | 
				
			||||||
     }
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
@@ -2993,10 +3070,10 @@
 | 
					 | 
				
			||||||
         insertBefore = null,
 | 
					 | 
				
			||||||
         isUserTriggered = false,
 | 
					         isUserTriggered = false,
 | 
				
			||||||
         telemetryUserCreateSource = "unknown",
 | 
					         telemetryUserCreateSource = "unknown",
 | 
				
			||||||
+        forSplitView = false,
 | 
					+        forSplitView = false,
 | 
				
			||||||
@@ -274,10 +253,10 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       if (!color) {
 | 
					       if (!color) {
 | 
				
			||||||
@@ -3011,7 +3088,12 @@
 | 
					@@ -3014,7 +3084,12 @@
 | 
				
			||||||
         id = `${Date.now()}-${Math.round(Math.random() * 100)}`;
 | 
					         label,
 | 
				
			||||||
       }
 | 
					         isAdoptingGroup
 | 
				
			||||||
       let group = this._createTabGroup(id, color, false, label);
 | 
					       );
 | 
				
			||||||
-      this.tabContainer.insertBefore(
 | 
					-      this.tabContainer.insertBefore(
 | 
				
			||||||
+      if (forSplitView) {
 | 
					+      if (forSplitView) {
 | 
				
			||||||
+        group.setAttribute('split-view-group', true);
 | 
					+        group.setAttribute('split-view-group', true);
 | 
				
			||||||
@@ -288,7 +267,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
         group,
 | 
					         group,
 | 
				
			||||||
         insertBefore?.group ?? insertBefore
 | 
					         insertBefore?.group ?? insertBefore
 | 
				
			||||||
       );
 | 
					       );
 | 
				
			||||||
@@ -3342,6 +3424,7 @@
 | 
					@@ -3303,6 +3378,7 @@
 | 
				
			||||||
         openWindowInfo,
 | 
					         openWindowInfo,
 | 
				
			||||||
         skipLoad,
 | 
					         skipLoad,
 | 
				
			||||||
         triggeringRemoteType,
 | 
					         triggeringRemoteType,
 | 
				
			||||||
@@ -296,7 +275,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       }
 | 
					       }
 | 
				
			||||||
     ) {
 | 
					     ) {
 | 
				
			||||||
       // If we don't have a preferred remote type (or it is `NOT_REMOTE`), and
 | 
					       // If we don't have a preferred remote type (or it is `NOT_REMOTE`), and
 | 
				
			||||||
@@ -3411,6 +3494,7 @@
 | 
					@@ -3372,6 +3448,7 @@
 | 
				
			||||||
           openWindowInfo,
 | 
					           openWindowInfo,
 | 
				
			||||||
           name,
 | 
					           name,
 | 
				
			||||||
           skipLoad,
 | 
					           skipLoad,
 | 
				
			||||||
@@ -304,7 +283,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
         });
 | 
					         });
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -3599,7 +3683,7 @@
 | 
					@@ -3560,7 +3637,7 @@
 | 
				
			||||||
         // Add a new tab if needed.
 | 
					         // Add a new tab if needed.
 | 
				
			||||||
         if (!tab) {
 | 
					         if (!tab) {
 | 
				
			||||||
           let createLazyBrowser =
 | 
					           let createLazyBrowser =
 | 
				
			||||||
@@ -313,37 +292,17 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
           let url = "about:blank";
 | 
					           let url = "about:blank";
 | 
				
			||||||
           if (tabData.entries?.length) {
 | 
					           if (tabData.entries?.length) {
 | 
				
			||||||
@@ -3637,7 +3721,29 @@
 | 
					@@ -3598,7 +3675,8 @@
 | 
				
			||||||
             skipLoad: true,
 | 
					             skipLoad: true,
 | 
				
			||||||
             preferredRemoteType,
 | 
					             preferredRemoteType,
 | 
				
			||||||
           });
 | 
					           });
 | 
				
			||||||
 | 
					-
 | 
				
			||||||
+          tab._originalUrl = url;
 | 
					+          tab._originalUrl = url;
 | 
				
			||||||
 
 | 
					+          gZenSessionStore.restoreInitialTabData(tab, tabData);
 | 
				
			||||||
+          if (tabData.zenWorkspace) {
 | 
					 | 
				
			||||||
+            tab.setAttribute("zen-workspace-id", tabData.zenWorkspace);
 | 
					 | 
				
			||||||
+          }
 | 
					 | 
				
			||||||
+          if (tabData.zenPinnedId) {
 | 
					 | 
				
			||||||
+            tab.setAttribute("zen-pin-id", tabData.zenPinnedId);
 | 
					 | 
				
			||||||
+          }
 | 
					 | 
				
			||||||
+          if (tabData.zenIsEmpty) {
 | 
					 | 
				
			||||||
+            tab.setAttribute("zen-empty-tab", "true");
 | 
					 | 
				
			||||||
+          }
 | 
					 | 
				
			||||||
+          if (tabData.zenHasStaticLabel) {
 | 
					 | 
				
			||||||
+            tab.setAttribute("zen-has-static-label", "true");
 | 
					 | 
				
			||||||
+          }
 | 
					 | 
				
			||||||
+          if (tabData.zenEssential) {
 | 
					 | 
				
			||||||
+            tab.setAttribute("zen-essential", "true");
 | 
					 | 
				
			||||||
+          }
 | 
					 | 
				
			||||||
+          if (tabData.zenDefaultUserContextId) {
 | 
					 | 
				
			||||||
+            tab.setAttribute("zenDefaultUserContextId", "true");
 | 
					 | 
				
			||||||
+          }
 | 
					 | 
				
			||||||
+          if (tabData.zenPinnedEntry) {
 | 
					 | 
				
			||||||
+            tab.setAttribute("zen-pinned-entry", tabData.zenPinnedEntry);
 | 
					 | 
				
			||||||
+          }
 | 
					 | 
				
			||||||
           if (select) {
 | 
					           if (select) {
 | 
				
			||||||
             tabToSelect = tab;
 | 
					             tabToSelect = tab;
 | 
				
			||||||
           }
 | 
					           }
 | 
				
			||||||
@@ -3661,7 +3767,8 @@
 | 
					@@ -3622,7 +3700,8 @@
 | 
				
			||||||
             // needs calling:
 | 
					             // needs calling:
 | 
				
			||||||
             shouldUpdateForPinnedTabs = true;
 | 
					             shouldUpdateForPinnedTabs = true;
 | 
				
			||||||
           }
 | 
					           }
 | 
				
			||||||
@@ -353,7 +312,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
           let { groupId } = tabData;
 | 
					           let { groupId } = tabData;
 | 
				
			||||||
           const tabGroup = tabGroupWorkingData.get(groupId);
 | 
					           const tabGroup = tabGroupWorkingData.get(groupId);
 | 
				
			||||||
           // if a tab refers to a tab group we don't know, skip any group
 | 
					           // if a tab refers to a tab group we don't know, skip any group
 | 
				
			||||||
@@ -3675,7 +3782,10 @@
 | 
					@@ -3636,7 +3715,10 @@
 | 
				
			||||||
                 tabGroup.stateData.id,
 | 
					                 tabGroup.stateData.id,
 | 
				
			||||||
                 tabGroup.stateData.color,
 | 
					                 tabGroup.stateData.color,
 | 
				
			||||||
                 tabGroup.stateData.collapsed,
 | 
					                 tabGroup.stateData.collapsed,
 | 
				
			||||||
@@ -365,7 +324,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
               );
 | 
					               );
 | 
				
			||||||
               tabsFragment.appendChild(tabGroup.node);
 | 
					               tabsFragment.appendChild(tabGroup.node);
 | 
				
			||||||
             }
 | 
					             }
 | 
				
			||||||
@@ -3723,8 +3833,16 @@
 | 
					@@ -3684,8 +3766,16 @@
 | 
				
			||||||
       // to remove the old selected tab.
 | 
					       // to remove the old selected tab.
 | 
				
			||||||
       if (tabToSelect) {
 | 
					       if (tabToSelect) {
 | 
				
			||||||
         let leftoverTab = this.selectedTab;
 | 
					         let leftoverTab = this.selectedTab;
 | 
				
			||||||
@@ -384,26 +343,26 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       if (tabs.length > 1 || !tabs[0].selected) {
 | 
					       if (tabs.length > 1 || !tabs[0].selected) {
 | 
				
			||||||
@@ -3912,7 +4030,7 @@
 | 
					@@ -3881,7 +3971,7 @@
 | 
				
			||||||
       // Ensure we have an index if one was not provided.
 | 
					       // Ensure we have an index if one was not provided.
 | 
				
			||||||
       if (typeof index != "number") {
 | 
					       if (typeof elementIndex != "number" && typeof tabIndex != "number") {
 | 
				
			||||||
         // Move the new tab after another tab if needed, to the end otherwise.
 | 
					         // Move the new tab after another tab if needed, to the end otherwise.
 | 
				
			||||||
-        index = Infinity;
 | 
					-        elementIndex = Infinity;
 | 
				
			||||||
+        index = Services.prefs.getBoolPref("zen.view.show-newtab-button-top") ? this._numVisiblePinTabsWithoutCollapsed : Infinity;
 | 
					+        elementIndex = Services.prefs.getBoolPref("zen.view.show-newtab-button-top") ? this._numVisiblePinTabsWithoutCollapsed : Infinity;
 | 
				
			||||||
         if (
 | 
					         if (
 | 
				
			||||||
           !bulkOrderedOpen &&
 | 
					           !bulkOrderedOpen &&
 | 
				
			||||||
           ((openerTab &&
 | 
					           ((openerTab &&
 | 
				
			||||||
@@ -3935,7 +4053,7 @@
 | 
					@@ -3904,7 +3994,7 @@
 | 
				
			||||||
           ) {
 | 
					           ) {
 | 
				
			||||||
             index = Infinity;
 | 
					             elementIndex = Infinity;
 | 
				
			||||||
           } else if (previousTab.visible) {
 | 
					           } else if (previousTab.visible) {
 | 
				
			||||||
-            index = previousTab.elementIndex + 1;
 | 
					-            elementIndex = previousTab.elementIndex + 1;
 | 
				
			||||||
+            index = (typeof previousTab.elementIndex === 'undefined') ? index : (previousTab.elementIndex + 1);
 | 
					+            elementIndex = (typeof previousTab.elementIndex === 'undefined') ? index : (previousTab.elementIndex + 1);
 | 
				
			||||||
           } else if (previousTab == FirefoxViewHandler.tab) {
 | 
					           } else if (previousTab == FirefoxViewHandler.tab) {
 | 
				
			||||||
             index = 0;
 | 
					             elementIndex = 0;
 | 
				
			||||||
 | 
					           }
 | 
				
			||||||
 | 
					@@ -3932,14 +4022,14 @@
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
@@ -3958,18 +4076,18 @@
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
       // Ensure index is within bounds.
 | 
					       // Ensure index is within bounds.
 | 
				
			||||||
       if (tab.pinned) {
 | 
					       if (tab.pinned) {
 | 
				
			||||||
-        index = Math.max(index, 0);
 | 
					-        index = Math.max(index, 0);
 | 
				
			||||||
@@ -413,12 +372,16 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       } else {
 | 
					       } else {
 | 
				
			||||||
-        index = Math.max(index, this.pinnedTabCount);
 | 
					-        index = Math.max(index, this.pinnedTabCount);
 | 
				
			||||||
+        index = Math.max(index, this._numVisiblePinTabsWithoutCollapsed);
 | 
					+        index = Math.max(index, this._numVisiblePinTabsWithoutCollapsed);
 | 
				
			||||||
         index = Math.min(index, this.tabContainer.ariaFocusableItems.length);
 | 
					         index = Math.min(index, allItems.length);
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 | 
				
			||||||
       /** @type {MozTabbrowserTab|undefined} */
 | 
					       /** @type {MozTabbrowserTab|undefined} */
 | 
				
			||||||
-      let itemAfter = this.tabContainer.ariaFocusableItems.at(index);
 | 
					-      let itemAfter = allItems.at(index);
 | 
				
			||||||
+      let itemAfter = this.tabContainer.ariaFocusableItems.filter(tab => !tab.hasAttribute("zen-glance-tab")).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):
 | 
				
			||||||
 | 
					@@ -3947,7 +4037,7 @@
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
       this.tabContainer._invalidateCachedTabs();
 | 
					       this.tabContainer._invalidateCachedTabs();
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
-      if (tabGroup) {
 | 
					-      if (tabGroup) {
 | 
				
			||||||
@@ -426,7 +389,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
         if (this.isTab(itemAfter) && itemAfter.group == tabGroup) {
 | 
					         if (this.isTab(itemAfter) && itemAfter.group == tabGroup) {
 | 
				
			||||||
           // Place at the front of, or between tabs in, the same tab group
 | 
					           // Place at the front of, or between tabs in, the same tab group
 | 
				
			||||||
           this.tabContainer.insertBefore(tab, itemAfter);
 | 
					           this.tabContainer.insertBefore(tab, itemAfter);
 | 
				
			||||||
@@ -4290,6 +4408,9 @@
 | 
					@@ -4268,6 +4358,9 @@
 | 
				
			||||||
         return;
 | 
					         return;
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -436,7 +399,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       this.removeTabs(selectedTabs, { telemetrySource });
 | 
					       this.removeTabs(selectedTabs, { telemetrySource });
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -4542,6 +4663,7 @@
 | 
					@@ -4520,6 +4613,7 @@
 | 
				
			||||||
         telemetrySource,
 | 
					         telemetrySource,
 | 
				
			||||||
       } = {}
 | 
					       } = {}
 | 
				
			||||||
     ) {
 | 
					     ) {
 | 
				
			||||||
@@ -444,7 +407,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       // When 'closeWindowWithLastTab' pref is enabled, closing all tabs
 | 
					       // When 'closeWindowWithLastTab' pref is enabled, closing all tabs
 | 
				
			||||||
       // can be considered equivalent to closing the window.
 | 
					       // can be considered equivalent to closing the window.
 | 
				
			||||||
       if (
 | 
					       if (
 | 
				
			||||||
@@ -4626,6 +4748,7 @@
 | 
					@@ -4604,6 +4698,7 @@
 | 
				
			||||||
         if (lastToClose) {
 | 
					         if (lastToClose) {
 | 
				
			||||||
           this.removeTab(lastToClose, aParams);
 | 
					           this.removeTab(lastToClose, aParams);
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
@@ -452,7 +415,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       } catch (e) {
 | 
					       } catch (e) {
 | 
				
			||||||
         console.error(e);
 | 
					         console.error(e);
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
@@ -4663,6 +4786,12 @@
 | 
					@@ -4641,6 +4736,12 @@
 | 
				
			||||||
         aTab._closeTimeNoAnimTimerId = Glean.browserTabclose.timeNoAnim.start();
 | 
					         aTab._closeTimeNoAnimTimerId = Glean.browserTabclose.timeNoAnim.start();
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -465,7 +428,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       // Handle requests for synchronously removing an already
 | 
					       // Handle requests for synchronously removing an already
 | 
				
			||||||
       // asynchronously closing tab.
 | 
					       // asynchronously closing tab.
 | 
				
			||||||
       if (!animate && aTab.closing) {
 | 
					       if (!animate && aTab.closing) {
 | 
				
			||||||
@@ -4677,7 +4806,9 @@
 | 
					@@ -4655,7 +4756,9 @@
 | 
				
			||||||
       // frame created for it (for example, by updating the visually selected
 | 
					       // frame created for it (for example, by updating the visually selected
 | 
				
			||||||
       // state).
 | 
					       // state).
 | 
				
			||||||
       let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width;
 | 
					       let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width;
 | 
				
			||||||
@@ -476,7 +439,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       if (
 | 
					       if (
 | 
				
			||||||
         !this._beginRemoveTab(aTab, {
 | 
					         !this._beginRemoveTab(aTab, {
 | 
				
			||||||
           closeWindowFastpath: true,
 | 
					           closeWindowFastpath: true,
 | 
				
			||||||
@@ -4840,7 +4971,7 @@
 | 
					@@ -4821,7 +4924,7 @@
 | 
				
			||||||
           closeWindowWithLastTab != null
 | 
					           closeWindowWithLastTab != null
 | 
				
			||||||
             ? closeWindowWithLastTab
 | 
					             ? closeWindowWithLastTab
 | 
				
			||||||
             : !window.toolbar.visible ||
 | 
					             : !window.toolbar.visible ||
 | 
				
			||||||
@@ -485,7 +448,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
         if (closeWindow) {
 | 
					         if (closeWindow) {
 | 
				
			||||||
           // We've already called beforeunload on all the relevant tabs if we get here,
 | 
					           // We've already called beforeunload on all the relevant tabs if we get here,
 | 
				
			||||||
@@ -4864,6 +4995,7 @@
 | 
					@@ -4845,6 +4948,7 @@
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
         newTab = true;
 | 
					         newTab = true;
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
@@ -493,7 +456,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       aTab._endRemoveArgs = [closeWindow, newTab];
 | 
					       aTab._endRemoveArgs = [closeWindow, newTab];
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       // swapBrowsersAndCloseOther will take care of closing the window without animation.
 | 
					       // swapBrowsersAndCloseOther will take care of closing the window without animation.
 | 
				
			||||||
@@ -4903,9 +5035,7 @@
 | 
					@@ -4885,9 +4989,7 @@
 | 
				
			||||||
       aTab._mouseleave();
 | 
					       aTab._mouseleave();
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       if (newTab) {
 | 
					       if (newTab) {
 | 
				
			||||||
@@ -504,7 +467,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       } else {
 | 
					       } else {
 | 
				
			||||||
         TabBarVisibility.update();
 | 
					         TabBarVisibility.update();
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
@@ -5034,6 +5164,8 @@
 | 
					@@ -5016,6 +5118,8 @@
 | 
				
			||||||
         this.tabs[i]._tPos = i;
 | 
					         this.tabs[i]._tPos = i;
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -513,18 +476,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       if (!this._windowIsClosing) {
 | 
					       if (!this._windowIsClosing) {
 | 
				
			||||||
         if (wasPinned) {
 | 
					         if (wasPinned) {
 | 
				
			||||||
           this.tabContainer._positionPinnedTabs();
 | 
					           this.tabContainer._positionPinnedTabs();
 | 
				
			||||||
@@ -5159,8 +5291,8 @@
 | 
					@@ -5230,6 +5334,7 @@
 | 
				
			||||||
       return closedCount;
 | 
					 | 
				
			||||||
     }
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
-    async explicitUnloadTabs(tabs) {
 | 
					 | 
				
			||||||
-      let unloadBlocked = await this.runBeforeUnloadForTabs(tabs);
 | 
					 | 
				
			||||||
+    async explicitUnloadTabs(tabs, skipPermitUnload = false) {
 | 
					 | 
				
			||||||
+      let unloadBlocked = skipPermitUnload ? false : await this.runBeforeUnloadForTabs(tabs);
 | 
					 | 
				
			||||||
       if (unloadBlocked) {
 | 
					 | 
				
			||||||
         return;
 | 
					 | 
				
			||||||
       }
 | 
					 | 
				
			||||||
@@ -5248,6 +5380,7 @@
 | 
					 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       let excludeTabs = new Set(aExcludeTabs);
 | 
					       let excludeTabs = new Set(aExcludeTabs);
 | 
				
			||||||
@@ -532,7 +484,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
       // If this tab has a successor, it should be selectable, since
 | 
					       // If this tab has a successor, it should be selectable, since
 | 
				
			||||||
       // hiding or closing a tab removes that tab as a successor.
 | 
					       // hiding or closing a tab removes that tab as a successor.
 | 
				
			||||||
@@ -5260,13 +5393,13 @@
 | 
					@@ -5242,13 +5347,13 @@
 | 
				
			||||||
         !excludeTabs.has(aTab.owner) &&
 | 
					         !excludeTabs.has(aTab.owner) &&
 | 
				
			||||||
         Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose")
 | 
					         Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose")
 | 
				
			||||||
       ) {
 | 
					       ) {
 | 
				
			||||||
@@ -548,7 +500,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       );
 | 
					       );
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       let tab = this.tabContainer.findNextTab(aTab, {
 | 
					       let tab = this.tabContainer.findNextTab(aTab, {
 | 
				
			||||||
@@ -5282,7 +5415,7 @@
 | 
					@@ -5264,7 +5369,7 @@
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       if (tab) {
 | 
					       if (tab) {
 | 
				
			||||||
@@ -557,7 +509,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       // If no qualifying visible tab was found, see if there is a tab in
 | 
					       // If no qualifying visible tab was found, see if there is a tab in
 | 
				
			||||||
@@ -5303,7 +5436,7 @@
 | 
					@@ -5285,7 +5390,7 @@
 | 
				
			||||||
         });
 | 
					         });
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -566,7 +518,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     _blurTab(aTab) {
 | 
					     _blurTab(aTab) {
 | 
				
			||||||
@@ -5704,10 +5837,10 @@
 | 
					@@ -5686,10 +5791,10 @@
 | 
				
			||||||
       SessionStore.deleteCustomTabValue(aTab, "hiddenBy");
 | 
					       SessionStore.deleteCustomTabValue(aTab, "hiddenBy");
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -579,7 +531,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
         aTab.selected ||
 | 
					         aTab.selected ||
 | 
				
			||||||
         aTab.closing ||
 | 
					         aTab.closing ||
 | 
				
			||||||
         // Tabs that are sharing the screen, microphone or camera cannot be hidden.
 | 
					         // Tabs that are sharing the screen, microphone or camera cannot be hidden.
 | 
				
			||||||
@@ -6001,7 +6134,7 @@
 | 
					@@ -5986,7 +6091,7 @@
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       // Don't allow mixing pinned and unpinned tabs.
 | 
					       // Don't allow mixing pinned and unpinned tabs.
 | 
				
			||||||
       if (this.isTab(element) && element.pinned) {
 | 
					       if (this.isTab(element) && element.pinned) {
 | 
				
			||||||
@@ -588,13 +540,13 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       } else {
 | 
					       } else {
 | 
				
			||||||
         tabIndex = Math.max(tabIndex, this.pinnedTabCount);
 | 
					         tabIndex = Math.max(tabIndex, this.pinnedTabCount);
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
@@ -6027,10 +6160,16 @@
 | 
					@@ -6012,10 +6117,16 @@
 | 
				
			||||||
       this.#handleTabMove(
 | 
					       this.#handleTabMove(
 | 
				
			||||||
         element,
 | 
					         element,
 | 
				
			||||||
         () => {
 | 
					         () => {
 | 
				
			||||||
-          let neighbor = this.tabs[tabIndex];
 | 
					-          let neighbor = this.tabs[tabIndex];
 | 
				
			||||||
-          if (forceUngrouped && neighbor.group) {
 | 
					-          if (forceUngrouped && neighbor?.group) {
 | 
				
			||||||
+          let neighbor = gZenGlanceManager.getTabOrGlanceParent(this.tabs.filter(tab => !tab.hasAttribute("zen-glance-tab"))[tabIndex]);
 | 
					+          let neighbor = gZenGlanceManager.getTabOrGlanceParent(this.tabs[tabIndex]);
 | 
				
			||||||
+          if ((forceUngrouped && neighbor?.group) || neighbor?.group?.hasAttribute("split-view-group")) {
 | 
					+          if ((forceUngrouped && neighbor?.group) || neighbor?.group?.hasAttribute("split-view-group")) {
 | 
				
			||||||
             neighbor = neighbor.group;
 | 
					             neighbor = neighbor.group;
 | 
				
			||||||
           }
 | 
					           }
 | 
				
			||||||
@@ -607,7 +559,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
           if (neighbor && this.isTab(element) && tabIndex > element._tPos) {
 | 
					           if (neighbor && this.isTab(element) && tabIndex > element._tPos) {
 | 
				
			||||||
             neighbor.after(element);
 | 
					             neighbor.after(element);
 | 
				
			||||||
           } else {
 | 
					           } else {
 | 
				
			||||||
@@ -6099,7 +6238,9 @@
 | 
					@@ -6084,17 +6195,29 @@
 | 
				
			||||||
           targetElement = targetElement.group;
 | 
					           targetElement = targetElement.group;
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
@@ -616,9 +568,17 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
+        element = element.group;
 | 
					+        element = element.group;
 | 
				
			||||||
+      }
 | 
					+      }
 | 
				
			||||||
       // Don't allow mixing pinned and unpinned tabs.
 | 
					       // Don't allow mixing pinned and unpinned tabs.
 | 
				
			||||||
       if (element.pinned && !targetElement?.pinned) {
 | 
					-      if (element.pinned && !targetElement?.pinned) {
 | 
				
			||||||
         targetElement = this.tabs[this.pinnedTabCount - 1];
 | 
					-        targetElement = this.tabs[this.pinnedTabCount - 1];
 | 
				
			||||||
@@ -6109,7 +6250,14 @@
 | 
					+      if (element.hasAttribute('zen-essential') && !targetElement?.hasAttribute('zen-essential')) {
 | 
				
			||||||
 | 
					+        targetElement = this.tabs.filter(tab => !tab.hasAttribute('zen-glance-tab'))[this._numZenEssentials - 1];
 | 
				
			||||||
 | 
					+        moveBefore = false;
 | 
				
			||||||
 | 
					+      } else if (element.pinned && !targetElement?.pinned) {
 | 
				
			||||||
 | 
					+        targetElement = this.tabs.filter(tab => !tab.hasAttribute('zen-glance-tab'))[this.pinnedTabCount - 1];
 | 
				
			||||||
 | 
					         moveBefore = false;
 | 
				
			||||||
 | 
					       } else if (!element.pinned && targetElement && targetElement.pinned) {
 | 
				
			||||||
 | 
					-        targetElement = this.tabs[this.pinnedTabCount];
 | 
				
			||||||
 | 
					+        targetElement = this.tabs.filter(tab => !tab.hasAttribute('zen-glance-tab'))[this.pinnedTabCount];
 | 
				
			||||||
         moveBefore = true;
 | 
					         moveBefore = true;
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -633,7 +593,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
         if (element.pinned && this.tabContainer.verticalMode) {
 | 
					         if (element.pinned && this.tabContainer.verticalMode) {
 | 
				
			||||||
           return this.tabContainer.verticalPinnedTabsContainer;
 | 
					           return this.tabContainer.verticalPinnedTabsContainer;
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
@@ -6169,7 +6317,7 @@
 | 
					@@ -6154,7 +6277,7 @@
 | 
				
			||||||
       if (!this.isTab(aTab)) {
 | 
					       if (!this.isTab(aTab)) {
 | 
				
			||||||
         throw new Error("Can only move a tab into a tab group");
 | 
					         throw new Error("Can only move a tab into a tab group");
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
@@ -642,7 +602,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
         return;
 | 
					         return;
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
       if (aTab.group && aTab.group.id === aGroup.id) {
 | 
					       if (aTab.group && aTab.group.id === aGroup.id) {
 | 
				
			||||||
@@ -6263,6 +6411,10 @@
 | 
					@@ -6248,6 +6371,10 @@
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       moveActionCallback();
 | 
					       moveActionCallback();
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -653,7 +613,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
       // Clear tabs cache after moving nodes because the order of tabs may have
 | 
					       // Clear tabs cache after moving nodes because the order of tabs may have
 | 
				
			||||||
       // changed.
 | 
					       // changed.
 | 
				
			||||||
       this.tabContainer._invalidateCachedTabs();
 | 
					       this.tabContainer._invalidateCachedTabs();
 | 
				
			||||||
@@ -7080,7 +7232,7 @@
 | 
					@@ -7145,7 +7272,7 @@
 | 
				
			||||||
             // preventDefault(). It will still raise the window if appropriate.
 | 
					             // preventDefault(). It will still raise the window if appropriate.
 | 
				
			||||||
             break;
 | 
					             break;
 | 
				
			||||||
           }
 | 
					           }
 | 
				
			||||||
@@ -662,7 +622,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
           window.focus();
 | 
					           window.focus();
 | 
				
			||||||
           aEvent.preventDefault();
 | 
					           aEvent.preventDefault();
 | 
				
			||||||
           break;
 | 
					           break;
 | 
				
			||||||
@@ -7981,6 +8133,7 @@
 | 
					@@ -8044,6 +8171,7 @@
 | 
				
			||||||
             aWebProgress.isTopLevel
 | 
					             aWebProgress.isTopLevel
 | 
				
			||||||
           ) {
 | 
					           ) {
 | 
				
			||||||
             this.mTab.setAttribute("busy", "true");
 | 
					             this.mTab.setAttribute("busy", "true");
 | 
				
			||||||
@@ -670,7 +630,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
             gBrowser._tabAttrModified(this.mTab, ["busy"]);
 | 
					             gBrowser._tabAttrModified(this.mTab, ["busy"]);
 | 
				
			||||||
             this.mTab._notselectedsinceload = !this.mTab.selected;
 | 
					             this.mTab._notselectedsinceload = !this.mTab.selected;
 | 
				
			||||||
           }
 | 
					           }
 | 
				
			||||||
@@ -8954,7 +9107,7 @@ var TabContextMenu = {
 | 
					@@ -9009,7 +9137,7 @@ var TabContextMenu = {
 | 
				
			||||||
     );
 | 
					     );
 | 
				
			||||||
     contextUnpinSelectedTabs.hidden =
 | 
					     contextUnpinSelectedTabs.hidden =
 | 
				
			||||||
       !this.contextTab.pinned || !this.multiselected;
 | 
					       !this.contextTab.pinned || !this.multiselected;
 | 
				
			||||||
@@ -679,7 +639,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..5c49c43714b3914130f8d821d902f9f2
 | 
				
			|||||||
     // Move Tab items
 | 
					     // Move Tab items
 | 
				
			||||||
     let contextMoveTabOptions = document.getElementById(
 | 
					     let contextMoveTabOptions = document.getElementById(
 | 
				
			||||||
       "context_moveTabOptions"
 | 
					       "context_moveTabOptions"
 | 
				
			||||||
@@ -9223,6 +9376,7 @@ var TabContextMenu = {
 | 
					@@ -9278,6 +9406,7 @@ var TabContextMenu = {
 | 
				
			||||||
         telemetrySource: gBrowser.TabMetrics.METRIC_SOURCE.TAB_STRIP,
 | 
					         telemetrySource: gBrowser.TabMetrics.METRIC_SOURCE.TAB_STRIP,
 | 
				
			||||||
       });
 | 
					       });
 | 
				
			||||||
     } else {
 | 
					     } else {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										13
									
								
								src/browser/components/tabbrowser/content/tabgroup-js.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/browser/components/tabbrowser/content/tabgroup-js.patch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					diff --git a/browser/components/tabbrowser/content/tabgroup.js b/browser/components/tabbrowser/content/tabgroup.js
 | 
				
			||||||
 | 
					index 6dc774ea335b0c5dba7dcf76cdb23728faae1343..b0b9ef236c2e8517db4bcf3270596456bbefe11d 100644
 | 
				
			||||||
 | 
					--- a/browser/components/tabbrowser/content/tabgroup.js
 | 
				
			||||||
 | 
					+++ b/browser/components/tabbrowser/content/tabgroup.js
 | 
				
			||||||
 | 
					@@ -301,7 +301,7 @@
 | 
				
			||||||
 | 
					      */
 | 
				
			||||||
 | 
					     addTabs(tabs, metricsContext) {
 | 
				
			||||||
 | 
					       for (let tab of tabs) {
 | 
				
			||||||
 | 
					-        if (tab.pinned) {
 | 
				
			||||||
 | 
					+        if (tab.pinned !== this.pinned) {
 | 
				
			||||||
 | 
					           tab.ownerGlobal.gBrowser.unpinTab(tab);
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					         let tabToMove =
 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js
 | 
					diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js
 | 
				
			||||||
index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bffdf463489 100644
 | 
					index 84d633471c89230b981d8a07babef4e0c76c0338..de8b1ecf7cb844f6cf3e66a41b6024c574dfc103 100644
 | 
				
			||||||
--- a/browser/components/tabbrowser/content/tabs.js
 | 
					--- a/browser/components/tabbrowser/content/tabs.js
 | 
				
			||||||
+++ b/browser/components/tabbrowser/content/tabs.js
 | 
					+++ b/browser/components/tabbrowser/content/tabs.js
 | 
				
			||||||
@@ -83,7 +83,7 @@
 | 
					@@ -83,7 +83,7 @@
 | 
				
			||||||
@@ -11,7 +11,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
         }
 | 
					         }
 | 
				
			||||||
         return true;
 | 
					         return true;
 | 
				
			||||||
       };
 | 
					       };
 | 
				
			||||||
@@ -286,6 +286,7 @@
 | 
					@@ -293,6 +293,7 @@
 | 
				
			||||||
     on_TabGroupCollapse(event) {
 | 
					     on_TabGroupCollapse(event) {
 | 
				
			||||||
       this._invalidateCachedVisibleTabs();
 | 
					       this._invalidateCachedVisibleTabs();
 | 
				
			||||||
       this._unlockTabSizing();
 | 
					       this._unlockTabSizing();
 | 
				
			||||||
@@ -19,7 +19,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
       // If the user's selected tab is in the collapsing group, kick them off
 | 
					       // 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
 | 
					       // the tab. If no tabs exist outside the group, create a new one and
 | 
				
			||||||
@@ -342,7 +343,7 @@
 | 
					@@ -349,7 +350,7 @@
 | 
				
			||||||
       // and we're not hitting the scroll buttons.
 | 
					       // and we're not hitting the scroll buttons.
 | 
				
			||||||
       if (
 | 
					       if (
 | 
				
			||||||
         event.button != 0 ||
 | 
					         event.button != 0 ||
 | 
				
			||||||
@@ -28,16 +28,16 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
         event.composedTarget.localName == "toolbarbutton"
 | 
					         event.composedTarget.localName == "toolbarbutton"
 | 
				
			||||||
       ) {
 | 
					       ) {
 | 
				
			||||||
         return;
 | 
					         return;
 | 
				
			||||||
@@ -692,7 +693,7 @@
 | 
					@@ -699,7 +700,7 @@
 | 
				
			||||||
       if (this.#isContainerVerticalPinnedGrid(tab)) {
 | 
					       if (this.#isContainerVerticalPinnedGrid(tab)) {
 | 
				
			||||||
         // In expanded vertical mode, the max number of pinned tabs per row is dynamic
 | 
					         // In expanded vertical mode, the max number of pinned tabs per row is dynamic
 | 
				
			||||||
         // Set this before adjusting dragged tab's position
 | 
					         // Set this before adjusting dragged tab's position
 | 
				
			||||||
-        let pinnedTabs = this.visibleTabs.slice(0, gBrowser.pinnedTabCount);
 | 
					-        let pinnedTabs = this.visibleTabs.slice(0, gBrowser.pinnedTabCount);
 | 
				
			||||||
+        let pinnedTabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(0, gBrowser._numZenEssentials);
 | 
					+        let pinnedTabs = this.ariaFocusableItems.slice(0, gBrowser._numZenEssentials);
 | 
				
			||||||
         let tabsPerRow = 0;
 | 
					         let tabsPerRow = 0;
 | 
				
			||||||
         let position = 0;
 | 
					         let position = 0;
 | 
				
			||||||
         for (let pinnedTab of pinnedTabs) {
 | 
					         for (let pinnedTab of pinnedTabs) {
 | 
				
			||||||
@@ -764,7 +765,7 @@
 | 
					@@ -772,7 +773,7 @@
 | 
				
			||||||
         } else if (isTabGroupLabel(tab) && !tab.group.collapsed) {
 | 
					         } else if (isTabGroupLabel(tab) && !tab.group.collapsed) {
 | 
				
			||||||
           this._lockTabSizing();
 | 
					           this._lockTabSizing();
 | 
				
			||||||
           this.#keepTabSizeLocked = true;
 | 
					           this.#keepTabSizeLocked = true;
 | 
				
			||||||
@@ -46,7 +46,16 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
           expandGroupOnDrop = true;
 | 
					           expandGroupOnDrop = true;
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
@@ -913,6 +914,10 @@
 | 
					@@ -868,7 +869,7 @@
 | 
				
			||||||
 | 
					           ? event.screenY - window.screenY - tabOffset
 | 
				
			||||||
 | 
					           : event.screenY - window.screenY,
 | 
				
			||||||
 | 
					         scrollPos:
 | 
				
			||||||
 | 
					-          this.verticalMode && tab.pinned
 | 
				
			||||||
 | 
					+          this.verticalMode && tab.pinned && false
 | 
				
			||||||
 | 
					             ? this.verticalPinnedTabsContainer.scrollPosition
 | 
				
			||||||
 | 
					             : this.arrowScrollbox.scrollPosition,
 | 
				
			||||||
 | 
					         screenX: event.screenX,
 | 
				
			||||||
 | 
					@@ -921,6 +922,10 @@
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0);
 | 
					       let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0);
 | 
				
			||||||
@@ -57,7 +66,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
       if (
 | 
					       if (
 | 
				
			||||||
         (effects == "move" || effects == "copy") &&
 | 
					         (effects == "move" || effects == "copy") &&
 | 
				
			||||||
         document == draggedTab.ownerDocument &&
 | 
					         document == draggedTab.ownerDocument &&
 | 
				
			||||||
@@ -1069,6 +1074,18 @@
 | 
					@@ -1077,6 +1082,18 @@
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       this._tabDropIndicator.hidden = true;
 | 
					       this._tabDropIndicator.hidden = true;
 | 
				
			||||||
       event.stopPropagation();
 | 
					       event.stopPropagation();
 | 
				
			||||||
@@ -76,32 +85,38 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
       if (draggedTab && dropEffect == "copy") {
 | 
					       if (draggedTab && dropEffect == "copy") {
 | 
				
			||||||
         let duplicatedDraggedTab;
 | 
					         let duplicatedDraggedTab;
 | 
				
			||||||
         let duplicatedTabs = [];
 | 
					         let duplicatedTabs = [];
 | 
				
			||||||
@@ -1108,10 +1125,11 @@
 | 
					@@ -1116,10 +1133,11 @@
 | 
				
			||||||
           }
 | 
					           }
 | 
				
			||||||
         } else {
 | 
					         } else {
 | 
				
			||||||
           let isPinned = draggedTab.pinned;
 | 
					           let isPinned = draggedTab.pinned;
 | 
				
			||||||
-          let numPinned = gBrowser.pinnedTabCount;
 | 
					-          let numPinned = gBrowser.pinnedTabCount;
 | 
				
			||||||
-          let tabs = this.ariaFocusableItems.slice(
 | 
					 | 
				
			||||||
-            isPinned ? 0 : numPinned,
 | 
					 | 
				
			||||||
-            isPinned ? numPinned : undefined
 | 
					 | 
				
			||||||
+          let numPinned = gBrowser._numVisiblePinTabsWithoutCollapsed;
 | 
					+          let numPinned = gBrowser._numVisiblePinTabsWithoutCollapsed;
 | 
				
			||||||
+          let essential = draggedTab.hasAttribute("zen-essential");
 | 
					+          let essential = draggedTab.hasAttribute("zen-essential");
 | 
				
			||||||
+          let tabs = this.ariaFocusableItems.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(
 | 
					           let tabs = this.ariaFocusableItems.slice(
 | 
				
			||||||
 | 
					-            isPinned ? 0 : numPinned,
 | 
				
			||||||
 | 
					-            isPinned ? numPinned : undefined
 | 
				
			||||||
+            isPinned ? (essential ? 0 : gBrowser._numZenEssentials) : numPinned,
 | 
					+            isPinned ? (essential ? 0 : gBrowser._numZenEssentials) : numPinned,
 | 
				
			||||||
+            isPinned ? (essential ? gBrowser._numZenEssentials : numPinned) : undefined
 | 
					+            isPinned ? (essential ? gBrowser._numZenEssentials : numPinned) : undefined
 | 
				
			||||||
           );
 | 
					           );
 | 
				
			||||||
           let size = this.verticalMode ? "height" : "width";
 | 
					           let size = this.verticalMode ? "height" : "width";
 | 
				
			||||||
           let screenAxis = this.verticalMode ? "screenY" : "screenX";
 | 
					           let screenAxis = this.verticalMode ? "screenY" : "screenX";
 | 
				
			||||||
@@ -1203,7 +1221,7 @@
 | 
					@@ -1135,8 +1153,14 @@
 | 
				
			||||||
                 item.removeAttribute("tabdrop-samewindow");
 | 
					             (lastMovingTabScreen + tabSize);
 | 
				
			||||||
                 resolve();
 | 
					 
 | 
				
			||||||
               };
 | 
					           if (this.verticalMode) {
 | 
				
			||||||
-              if (gReduceMotion) {
 | 
					+            if (oldTranslateY > 0 && translateOffsetY > tabHeight / 2) {
 | 
				
			||||||
+              if (true || gReduceMotion) {
 | 
					+              newTranslateY += tabHeight;
 | 
				
			||||||
                 postTransitionCleanup();
 | 
					+            }
 | 
				
			||||||
 | 
					+            if (oldTranslateY < 0 && -translateOffsetY > tabHeight / 2) {
 | 
				
			||||||
 | 
					+              newTranslateY -= tabHeight;
 | 
				
			||||||
 | 
					+            }
 | 
				
			||||||
 | 
					             newTranslateY = Math.min(
 | 
				
			||||||
 | 
					-              Math.max(oldTranslateY, firstBound),
 | 
				
			||||||
 | 
					+              Math.max(newTranslateY, firstBound),
 | 
				
			||||||
 | 
					               lastBound
 | 
				
			||||||
 | 
					             );
 | 
				
			||||||
           } else {
 | 
					           } else {
 | 
				
			||||||
                 let onTransitionEnd = transitionendEvent => {
 | 
					@@ -1337,6 +1361,7 @@
 | 
				
			||||||
@@ -1327,6 +1345,7 @@
 | 
					 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
           let nextItem = this.ariaFocusableItems[newIndex];
 | 
					           let nextItem = this.ariaFocusableItems[newIndex];
 | 
				
			||||||
           let tabGroup = isTab(nextItem) && nextItem.group;
 | 
					           let tabGroup = isTab(nextItem) && nextItem.group;
 | 
				
			||||||
@@ -109,7 +124,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
           gBrowser.loadTabs(urls, {
 | 
					           gBrowser.loadTabs(urls, {
 | 
				
			||||||
             inBackground,
 | 
					             inBackground,
 | 
				
			||||||
             replace,
 | 
					             replace,
 | 
				
			||||||
@@ -1359,6 +1378,17 @@
 | 
					@@ -1369,6 +1394,17 @@
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       this.finishMoveTogetherSelectedTabs(draggedTab);
 | 
					       this.finishMoveTogetherSelectedTabs(draggedTab);
 | 
				
			||||||
       this.finishAnimateTabMove();
 | 
					       this.finishAnimateTabMove();
 | 
				
			||||||
@@ -127,7 +142,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
       this.#expandGroupOnDrop(draggedTab);
 | 
					       this.#expandGroupOnDrop(draggedTab);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       if (
 | 
					       if (
 | 
				
			||||||
@@ -1582,7 +1612,7 @@
 | 
					@@ -1597,7 +1633,7 @@
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     get newTabButton() {
 | 
					     get newTabButton() {
 | 
				
			||||||
@@ -136,7 +151,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     get verticalMode() {
 | 
					     get verticalMode() {
 | 
				
			||||||
@@ -1606,29 +1636,53 @@
 | 
					@@ -1621,29 +1657,54 @@
 | 
				
			||||||
       if (this.#allTabs) {
 | 
					       if (this.#allTabs) {
 | 
				
			||||||
         return this.#allTabs;
 | 
					         return this.#allTabs;
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
@@ -173,19 +188,20 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
         ...children,
 | 
					         ...children,
 | 
				
			||||||
       ];
 | 
					       ];
 | 
				
			||||||
+      const lastPinnedTabIdx = pinnedTabs.length - 1;
 | 
					+      const lastPinnedTabIdx = pinnedTabs.length - 1;
 | 
				
			||||||
+      for (let i = 0; i < allTabs.length; i++) {
 | 
					+      let i = 0;
 | 
				
			||||||
 | 
					+      for (const tab of [...allTabs]) {
 | 
				
			||||||
+        // add glance tabs (tabs inside tabs) to the list
 | 
					+        // add glance tabs (tabs inside tabs) to the list
 | 
				
			||||||
+        const glanceTab = allTabs[i].glanceTab;
 | 
					+        const glanceTab = tab.glanceTab;
 | 
				
			||||||
+        if (glanceTab) {
 | 
					+        if (glanceTab) {
 | 
				
			||||||
+          // insert right after the parent tab. note: it must be inserted before
 | 
					+          // insert right after the parent tab. note: it must be inserted before
 | 
				
			||||||
+          // the last pinned tab so it can be inserted in the correct order
 | 
					+          // the last pinned tab so it can be inserted in the correct order
 | 
				
			||||||
+          allTabs.splice(Math.max(i + 1, lastPinnedTabIdx), 0, glanceTab);
 | 
					+          allTabs.splice(Math.max(i++ + 1, lastPinnedTabIdx), 0, glanceTab);
 | 
				
			||||||
+          i++;
 | 
					+        } else if (tab.classList.contains("vertical-pinned-tabs-container-separator")) {
 | 
				
			||||||
+        } else if (allTabs[i].classList.contains("vertical-pinned-tabs-container-separator")) {
 | 
					 | 
				
			||||||
+          // remove the separator from the list
 | 
					+          // remove the separator from the list
 | 
				
			||||||
+          allTabs.splice(i, 1);
 | 
					+          allTabs.splice(i, 1);
 | 
				
			||||||
+          i--;
 | 
					+          i--;
 | 
				
			||||||
+        }
 | 
					+        }
 | 
				
			||||||
 | 
					+        i++;
 | 
				
			||||||
+      }
 | 
					+      }
 | 
				
			||||||
+      this.#allTabs = allTabs;
 | 
					+      this.#allTabs = allTabs;
 | 
				
			||||||
       return this.#allTabs;
 | 
					       return this.#allTabs;
 | 
				
			||||||
@@ -198,16 +214,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     /**
 | 
					     /**
 | 
				
			||||||
@@ -1648,7 +1702,7 @@
 | 
					@@ -1698,23 +1759,18 @@
 | 
				
			||||||
      */
 | 
					 | 
				
			||||||
     get visibleTabs() {
 | 
					 | 
				
			||||||
       if (!this.#visibleTabs) {
 | 
					 | 
				
			||||||
-        this.#visibleTabs = this.openTabs.filter(tab => tab.visible);
 | 
					 | 
				
			||||||
+        this.#visibleTabs = this.openTabs.filter(tab => tab.visible && !tab.hasAttribute("zen-empty-tab"));
 | 
					 | 
				
			||||||
       }
 | 
					 | 
				
			||||||
       return this.#visibleTabs;
 | 
					 | 
				
			||||||
     }
 | 
					 | 
				
			||||||
@@ -1683,36 +1737,40 @@
 | 
					 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       let elementIndex = 0;
 | 
					       let elementIndex = 0;
 | 
				
			||||||
@@ -235,21 +242,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
             let visibleTabsInGroup = child.tabs.filter(tab => tab.visible);
 | 
					             let visibleTabsInGroup = child.tabs.filter(tab => tab.visible);
 | 
				
			||||||
             visibleTabsInGroup.forEach(tab => {
 | 
					             visibleTabsInGroup.forEach(tab => {
 | 
				
			||||||
               tab.elementIndex = elementIndex++;
 | 
					               tab.elementIndex = elementIndex++;
 | 
				
			||||||
             });
 | 
					@@ -1724,10 +1780,7 @@
 | 
				
			||||||
             focusableItems.push(...visibleTabsInGroup);
 | 
					 | 
				
			||||||
           }
 | 
					 | 
				
			||||||
+          for (let tab of child.tabs) {
 | 
					 | 
				
			||||||
+            let glanceTab = tab.glanceTab;
 | 
					 | 
				
			||||||
+            if (isTab(glanceTab)) {
 | 
					 | 
				
			||||||
+              glanceTab.elementIndex = elementIndex - 1;
 | 
					 | 
				
			||||||
+              focusableItems.push(glanceTab);
 | 
					 | 
				
			||||||
+            }
 | 
					 | 
				
			||||||
+          }
 | 
					 | 
				
			||||||
+        }
 | 
					 | 
				
			||||||
+        let glanceTab = child.glanceTab;
 | 
					 | 
				
			||||||
+        if (isTab(child) && glanceTab) {
 | 
					 | 
				
			||||||
+          glanceTab.elementIndex = elementIndex - 1;
 | 
					 | 
				
			||||||
+          focusableItems.push(glanceTab);
 | 
					 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -261,7 +254,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
       return this.#focusableItems;
 | 
					       return this.#focusableItems;
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
@@ -1720,6 +1778,7 @@
 | 
					@@ -1735,6 +1788,7 @@
 | 
				
			||||||
     _invalidateCachedTabs() {
 | 
					     _invalidateCachedTabs() {
 | 
				
			||||||
       this.#allTabs = null;
 | 
					       this.#allTabs = null;
 | 
				
			||||||
       this._invalidateCachedVisibleTabs();
 | 
					       this._invalidateCachedVisibleTabs();
 | 
				
			||||||
@@ -269,7 +262,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     _invalidateCachedVisibleTabs() {
 | 
					     _invalidateCachedVisibleTabs() {
 | 
				
			||||||
@@ -1734,8 +1793,8 @@
 | 
					@@ -1749,8 +1803,8 @@
 | 
				
			||||||
     #isContainerVerticalPinnedGrid(tab) {
 | 
					     #isContainerVerticalPinnedGrid(tab) {
 | 
				
			||||||
       return (
 | 
					       return (
 | 
				
			||||||
         this.verticalMode &&
 | 
					         this.verticalMode &&
 | 
				
			||||||
@@ -280,7 +273,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
         !this.expandOnHover
 | 
					         !this.expandOnHover
 | 
				
			||||||
       );
 | 
					       );
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
@@ -1751,7 +1810,7 @@
 | 
					@@ -1766,7 +1820,7 @@
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       if (node == null) {
 | 
					       if (node == null) {
 | 
				
			||||||
         // We have a container for non-tab elements at the end of the scrollbox.
 | 
					         // We have a container for non-tab elements at the end of the scrollbox.
 | 
				
			||||||
@@ -289,7 +282,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       node.before(tab);
 | 
					       node.before(tab);
 | 
				
			||||||
@@ -1846,7 +1905,7 @@
 | 
					@@ -1861,7 +1915,7 @@
 | 
				
			||||||
           // There are separate "new tab" buttons for horizontal tabs toolbar, vertical tabs and
 | 
					           // 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);
 | 
					           // for when the tab strip is overflowed (which is shared by vertical and horizontal tabs);
 | 
				
			||||||
           // Attach the long click popup to all of them.
 | 
					           // Attach the long click popup to all of them.
 | 
				
			||||||
@@ -298,7 +291,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
           const newTab2 = this.newTabButton;
 | 
					           const newTab2 = this.newTabButton;
 | 
				
			||||||
           const newTabVertical = document.getElementById(
 | 
					           const newTabVertical = document.getElementById(
 | 
				
			||||||
             "vertical-tabs-newtab-button"
 | 
					             "vertical-tabs-newtab-button"
 | 
				
			||||||
@@ -1941,10 +2000,12 @@
 | 
					@@ -1956,10 +2010,12 @@
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     _handleTabSelect(aInstant) {
 | 
					     _handleTabSelect(aInstant) {
 | 
				
			||||||
       let selectedTab = this.selectedItem;
 | 
					       let selectedTab = this.selectedItem;
 | 
				
			||||||
@@ -311,98 +304,53 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
       selectedTab._notselectedsinceload = false;
 | 
					       selectedTab._notselectedsinceload = false;
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -2085,16 +2146,15 @@
 | 
					@@ -2132,6 +2188,7 @@
 | 
				
			||||||
       // Move pinned tabs to another container when the tabstrip is toggled to vertical
 | 
					 | 
				
			||||||
       // and when session restore code calls _positionPinnedTabs; update styling whenever
 | 
					 | 
				
			||||||
       // the number of pinned tabs changes.
 | 
					 | 
				
			||||||
-      let verticalTabsContainer = document.getElementById(
 | 
					 | 
				
			||||||
-        "vertical-pinned-tabs-container"
 | 
					 | 
				
			||||||
-      );
 | 
					 | 
				
			||||||
+      let verticalTabsContainer = this.verticalPinnedTabsContainer;
 | 
					 | 
				
			||||||
       let numPinned = gBrowser.pinnedTabCount;
 | 
					 | 
				
			||||||
-
 | 
					 | 
				
			||||||
-      if (gBrowser.pinnedTabCount !== verticalTabsContainer.children.length) {
 | 
					 | 
				
			||||||
-        let tabs = this.visibleTabs;
 | 
					 | 
				
			||||||
+      if (!gZenWorkspaces._hasInitializedTabsStrip) return;
 | 
					 | 
				
			||||||
+      let count = gZenWorkspaces.makeSurePinTabIsInCorrectPosition();
 | 
					 | 
				
			||||||
+      if (gBrowser.pinnedTabCount !== (verticalTabsContainer.children.length - count - 1 + gZenWorkspaces.getCurrentEssentialsContainer().children.length)) {
 | 
					 | 
				
			||||||
+        let tabs = this.allTabs.filter(tab => !tab.hasAttribute("zen-glance-tab"));
 | 
					 | 
				
			||||||
         for (let i = 0; i < numPinned; i++) {
 | 
					 | 
				
			||||||
           tabs[i].style.marginInlineStart = "";
 | 
					 | 
				
			||||||
-          verticalTabsContainer.appendChild(tabs[i]);
 | 
					 | 
				
			||||||
+          tabs[i].hasAttribute("zen-essential") ? gZenWorkspaces.getCurrentEssentialsContainer().appendChild(tabs[i].group?.hasAttribute("split-view-group") ? tabs[i].group : tabs[i]) : verticalTabsContainer.insertBefore(tabs[i].group?.hasAttribute("split-view-group") ? tabs[i].group : tabs[i], verticalTabsContainer.lastChild);
 | 
					 | 
				
			||||||
         }
 | 
					 | 
				
			||||||
       }
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
@@ -2102,9 +2162,7 @@
 | 
					 | 
				
			||||||
     }
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
     _resetVerticalPinnedTabs() {
 | 
					 | 
				
			||||||
-      let verticalTabsContainer = document.getElementById(
 | 
					 | 
				
			||||||
-        "vertical-pinned-tabs-container"
 | 
					 | 
				
			||||||
-      );
 | 
					 | 
				
			||||||
+      let verticalTabsContainer = this.verticalPinnedTabsContainer;
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
       if (!verticalTabsContainer.children.length) {
 | 
					 | 
				
			||||||
         return;
 | 
					 | 
				
			||||||
@@ -2117,7 +2175,7 @@
 | 
					 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     _positionPinnedTabs() {
 | 
					     _positionPinnedTabs() {
 | 
				
			||||||
-      let tabs = this.visibleTabs;
 | 
					+      if (true) return;
 | 
				
			||||||
+      let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab"));
 | 
					       let tabs = this.visibleTabs;
 | 
				
			||||||
       let numPinned = gBrowser.pinnedTabCount;
 | 
					       let numPinned = gBrowser.pinnedTabCount;
 | 
				
			||||||
       let absPositionHorizontalTabs =
 | 
					       let absPositionHorizontalTabs =
 | 
				
			||||||
         this.overflowing && tabs.length > numPinned && numPinned > 0;
 | 
					@@ -2206,7 +2263,7 @@
 | 
				
			||||||
@@ -2127,7 +2185,7 @@
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
       if (this.verticalMode) {
 | 
					 | 
				
			||||||
         this._updateVerticalPinnedTabs();
 | 
					 | 
				
			||||||
-      } else if (absPositionHorizontalTabs) {
 | 
					 | 
				
			||||||
+      } else if (absPositionHorizontalTabs && false) {
 | 
					 | 
				
			||||||
         let layoutData = this._pinnedTabsLayoutCache;
 | 
					 | 
				
			||||||
         let uiDensity = document.documentElement.getAttribute("uidensity");
 | 
					 | 
				
			||||||
         if (!layoutData || layoutData.uiDensity != uiDensity) {
 | 
					 | 
				
			||||||
@@ -2191,7 +2249,7 @@
 | 
					 | 
				
			||||||
         return;
 | 
					         return;
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
-      let tabs = this.visibleTabs.slice(0, gBrowser.pinnedTabCount);
 | 
					-      let tabs = this.visibleTabs.slice(0, gBrowser.pinnedTabCount);
 | 
				
			||||||
+      let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(0, gBrowser._numZenEssentials);
 | 
					+      let tabs = this.ariaFocusableItems.slice(0, gBrowser._numZenEssentials);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       let directionX = screenX > dragData.animLastScreenX;
 | 
					       let directionX = screenX > dragData.animLastScreenX;
 | 
				
			||||||
       let directionY = screenY > dragData.animLastScreenY;
 | 
					       let directionY = screenY > dragData.animLastScreenY;
 | 
				
			||||||
@@ -2199,7 +2257,7 @@
 | 
					@@ -2215,6 +2272,8 @@
 | 
				
			||||||
       dragData.animLastScreenX = screenX;
 | 
					 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       let { width: tabWidth, height: tabHeight } =
 | 
					       let { width: tabWidth, height: tabHeight } =
 | 
				
			||||||
-        draggedTab.getBoundingClientRect();
 | 
					         draggedTab.getBoundingClientRect();
 | 
				
			||||||
+        (draggedTab.group?.hasAttribute("split-view-group") ? draggedTab.group : draggedTab).getBoundingClientRect();
 | 
					+      tabWidth += 4; // Add 4px to account for the gap
 | 
				
			||||||
 | 
					+      tabHeight += 4;
 | 
				
			||||||
       let shiftSizeX = tabWidth * movingTabs.length;
 | 
					       let shiftSizeX = tabWidth * movingTabs.length;
 | 
				
			||||||
       let shiftSizeY = tabHeight;
 | 
					       let shiftSizeY = tabHeight;
 | 
				
			||||||
       dragData.tabWidth = tabWidth;
 | 
					       dragData.tabWidth = tabWidth;
 | 
				
			||||||
@@ -2262,7 +2320,7 @@
 | 
					@@ -2244,7 +2303,7 @@
 | 
				
			||||||
       // * We're doing a binary search in order to reduce the amount of
 | 
					       let translateX = screenX - dragData.screenX;
 | 
				
			||||||
       //   tabs we need to check.
 | 
					       let translateY = screenY - dragData.screenY;
 | 
				
			||||||
 
 | 
					       translateY +=
 | 
				
			||||||
-      tabs = tabs.filter(t => !movingTabs.includes(t) || t == draggedTab);
 | 
					-        this.verticalPinnedTabsContainer.scrollPosition - dragData.scrollPos;
 | 
				
			||||||
+      tabs = tabs.filter(t => !movingTabs.includes(t) || t == draggedTab && !t.hasAttribute("zen-glance-tab"));
 | 
					+        dragData.scrollPos;
 | 
				
			||||||
       let firstTabCenterX = firstMovingTabScreenX + translateX + tabWidth / 2;
 | 
					       let firstBoundX = firstTabInRow.screenX - firstMovingTabScreenX;
 | 
				
			||||||
       let lastTabCenterX = lastMovingTabScreenX + translateX + tabWidth / 2;
 | 
					       let firstBoundY = firstTabInRow.screenY - firstMovingTabScreenY;
 | 
				
			||||||
       let tabCenterX = directionX ? lastTabCenterX : firstTabCenterX;
 | 
					       let lastBoundX =
 | 
				
			||||||
@@ -2374,12 +2432,16 @@
 | 
					@@ -2389,12 +2448,16 @@
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       this.#clearDragOverCreateGroupTimer();
 | 
					       this.#clearDragOverCreateGroupTimer();
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
-      let isPinned = draggedTab.pinned;
 | 
					-      let isPinned = draggedTab.pinned;
 | 
				
			||||||
-      let numPinned = gBrowser.pinnedTabCount;
 | 
					-      let numPinned = gBrowser.pinnedTabCount;
 | 
				
			||||||
-      let tabs = this.ariaFocusableItems.slice(
 | 
					 | 
				
			||||||
-        isPinned ? 0 : numPinned,
 | 
					 | 
				
			||||||
-        isPinned ? numPinned : undefined
 | 
					 | 
				
			||||||
+      let isPinned = draggedTab?.group ? draggedTab.group.pinned : draggedTab.pinned;
 | 
					+      let isPinned = draggedTab?.group ? draggedTab.group.pinned : draggedTab.pinned;
 | 
				
			||||||
+      let numPinned = gBrowser._numVisiblePinTabsWithoutCollapsed;
 | 
					+      let numPinned = gBrowser._numVisiblePinTabsWithoutCollapsed;
 | 
				
			||||||
+      let essential = draggedTab.hasAttribute("zen-essential");
 | 
					+      let essential = draggedTab.hasAttribute("zen-essential");
 | 
				
			||||||
+      let tabs = this.ariaFocusableItems.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(
 | 
					       let tabs = this.ariaFocusableItems.slice(
 | 
				
			||||||
 | 
					-        isPinned ? 0 : numPinned,
 | 
				
			||||||
 | 
					-        isPinned ? numPinned : undefined
 | 
				
			||||||
+        isPinned ? (essential ? 0 : gBrowser._numZenEssentials) : numPinned,
 | 
					+        isPinned ? (essential ? 0 : gBrowser._numZenEssentials) : numPinned,
 | 
				
			||||||
+        isPinned ? (essential ? gBrowser._numZenEssentials : numPinned) : undefined
 | 
					+        isPinned ? (essential ? gBrowser._numZenEssentials : numPinned) : undefined
 | 
				
			||||||
       );
 | 
					       );
 | 
				
			||||||
@@ -412,7 +360,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
       if (this.#rtlMode) {
 | 
					       if (this.#rtlMode) {
 | 
				
			||||||
         tabs.reverse();
 | 
					         tabs.reverse();
 | 
				
			||||||
@@ -2393,7 +2455,7 @@
 | 
					@@ -2408,7 +2471,7 @@
 | 
				
			||||||
       let size = this.verticalMode ? "height" : "width";
 | 
					       let size = this.verticalMode ? "height" : "width";
 | 
				
			||||||
       let translateAxis = this.verticalMode ? "translateY" : "translateX";
 | 
					       let translateAxis = this.verticalMode ? "translateY" : "translateX";
 | 
				
			||||||
       let scrollDirection = this.verticalMode ? "scrollTop" : "scrollLeft";
 | 
					       let scrollDirection = this.verticalMode ? "scrollTop" : "scrollLeft";
 | 
				
			||||||
@@ -421,7 +369,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
       let translateX = event.screenX - dragData.screenX;
 | 
					       let translateX = event.screenX - dragData.screenX;
 | 
				
			||||||
       let translateY = event.screenY - dragData.screenY;
 | 
					       let translateY = event.screenY - dragData.screenY;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -2407,12 +2469,21 @@
 | 
					@@ -2422,12 +2485,21 @@
 | 
				
			||||||
       let lastTab = tabs.at(-1);
 | 
					       let lastTab = tabs.at(-1);
 | 
				
			||||||
       let lastMovingTab = movingTabs.at(-1);
 | 
					       let lastMovingTab = movingTabs.at(-1);
 | 
				
			||||||
       let firstMovingTab = movingTabs[0];
 | 
					       let firstMovingTab = movingTabs[0];
 | 
				
			||||||
@@ -444,7 +392,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
         translate +=
 | 
					         translate +=
 | 
				
			||||||
           this.arrowScrollbox.scrollbox[scrollDirection] - dragData.scrollPos;
 | 
					           this.arrowScrollbox.scrollbox[scrollDirection] - dragData.scrollPos;
 | 
				
			||||||
       } else if (isPinned && this.verticalMode) {
 | 
					       } else if (isPinned && this.verticalMode) {
 | 
				
			||||||
@@ -2431,12 +2502,15 @@
 | 
					@@ -2446,6 +2518,9 @@
 | 
				
			||||||
           // Shift the `.tab-group-label-container` to shift the label element.
 | 
					           // Shift the `.tab-group-label-container` to shift the label element.
 | 
				
			||||||
           item = item.parentElement;
 | 
					           item = item.parentElement;
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
@@ -454,14 +402,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
         item.style.transform = `${translateAxis}(${translate}px)`;
 | 
					         item.style.transform = `${translateAxis}(${translate}px)`;
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
       dragData.translatePos = translate;
 | 
					@@ -2583,6 +2658,9 @@
 | 
				
			||||||
 
 | 
					 | 
				
			||||||
-      tabs = tabs.filter(t => !movingTabs.includes(t) || t == draggedTab);
 | 
					 | 
				
			||||||
+      tabs = tabs.filter(t => !movingTabs.includes(t) || t == draggedTab && !t.hasAttribute("zen-glance-tab"));
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
       /**
 | 
					 | 
				
			||||||
        * When the `draggedTab` is just starting to move, the `draggedTab` is in
 | 
					 | 
				
			||||||
@@ -2568,6 +2642,9 @@
 | 
					 | 
				
			||||||
             break;
 | 
					             break;
 | 
				
			||||||
           }
 | 
					           }
 | 
				
			||||||
           let element = tabs[mid];
 | 
					           let element = tabs[mid];
 | 
				
			||||||
@@ -471,20 +412,18 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
           let elementForSize = isTabGroupLabel(element)
 | 
					           let elementForSize = isTabGroupLabel(element)
 | 
				
			||||||
             ? element.parentElement
 | 
					             ? element.parentElement
 | 
				
			||||||
             : element;
 | 
					             : element;
 | 
				
			||||||
@@ -2588,7 +2665,11 @@
 | 
					@@ -2605,6 +2683,10 @@
 | 
				
			||||||
 
 | 
					 | 
				
			||||||
       let dropElement = getOverlappedElement();
 | 
					 | 
				
			||||||
       if (!dropElement) {
 | 
					       if (!dropElement) {
 | 
				
			||||||
-        dropElement = this.ariaFocusableItems[oldDropElementIndex];
 | 
					         dropElement = this.ariaFocusableItems[oldDropElementIndex];
 | 
				
			||||||
+        dropElement = this.ariaFocusableItems.filter(tab => !tab.hasAttribute("zen-glance-tab"))[oldDropElementIndex];
 | 
					       }
 | 
				
			||||||
+      }
 | 
					 | 
				
			||||||
+      if (dropElement?.group?.hasAttribute("split-view-group")) {
 | 
					+      if (dropElement?.group?.hasAttribute("split-view-group")) {
 | 
				
			||||||
+        // We focus the group label element, not the group itself.
 | 
					+        // We focus the group label element, not the group itself.
 | 
				
			||||||
+        dropElement = dropElement.group.labelElement;
 | 
					+        dropElement = dropElement.group.labelElement;
 | 
				
			||||||
       }
 | 
					+      }
 | 
				
			||||||
       let newDropElementIndex = dropElement
 | 
					       let newDropElementIndex = dropElement
 | 
				
			||||||
         ? dropElement.elementIndex
 | 
					         ? dropElement.elementIndex
 | 
				
			||||||
@@ -2598,7 +2679,7 @@
 | 
					         : oldDropElementIndex;
 | 
				
			||||||
 | 
					@@ -2613,7 +2695,7 @@
 | 
				
			||||||
       let shouldCreateGroupOnDrop;
 | 
					       let shouldCreateGroupOnDrop;
 | 
				
			||||||
       let dropBefore;
 | 
					       let dropBefore;
 | 
				
			||||||
       if (dropElement) {
 | 
					       if (dropElement) {
 | 
				
			||||||
@@ -493,7 +432,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
           ? dropElement.parentElement
 | 
					           ? dropElement.parentElement
 | 
				
			||||||
           : dropElement;
 | 
					           : dropElement;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -2660,12 +2741,12 @@
 | 
					@@ -2675,12 +2757,12 @@
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -508,7 +447,16 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
           dropElement != draggedTab &&
 | 
					           dropElement != draggedTab &&
 | 
				
			||||||
           isTab(dropElement) &&
 | 
					           isTab(dropElement) &&
 | 
				
			||||||
           !dropElement?.group &&
 | 
					           !dropElement?.group &&
 | 
				
			||||||
@@ -2735,7 +2816,7 @@
 | 
					@@ -2720,7 +2802,7 @@
 | 
				
			||||||
 | 
					               // Dropping right before the tab group.
 | 
				
			||||||
 | 
					               dropElement = dropElementGroup;
 | 
				
			||||||
 | 
					               colorCode = undefined;
 | 
				
			||||||
 | 
					-            } else if (dropElementGroup.collapsed) {
 | 
				
			||||||
 | 
					+            } else if (dropElement?.group?.hasAttribute("split-view-group")) {
 | 
				
			||||||
 | 
					               // Dropping right after the collapsed tab group.
 | 
				
			||||||
 | 
					               dropElement = dropElementGroup;
 | 
				
			||||||
 | 
					               colorCode = undefined;
 | 
				
			||||||
 | 
					@@ -2750,7 +2832,7 @@
 | 
				
			||||||
       // Shift background tabs to leave a gap where the dragged tab
 | 
					       // Shift background tabs to leave a gap where the dragged tab
 | 
				
			||||||
       // would currently be dropped.
 | 
					       // would currently be dropped.
 | 
				
			||||||
       for (let item of tabs) {
 | 
					       for (let item of tabs) {
 | 
				
			||||||
@@ -517,7 +465,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
           continue;
 | 
					           continue;
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -2744,6 +2825,9 @@
 | 
					@@ -2759,6 +2841,9 @@
 | 
				
			||||||
         if (isTabGroupLabel(item)) {
 | 
					         if (isTabGroupLabel(item)) {
 | 
				
			||||||
           // Shift the `.tab-group-label-container` to shift the label element.
 | 
					           // Shift the `.tab-group-label-container` to shift the label element.
 | 
				
			||||||
           item = item.parentElement;
 | 
					           item = item.parentElement;
 | 
				
			||||||
@@ -527,7 +475,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
         }
 | 
					         }
 | 
				
			||||||
         item.style.transform = transform;
 | 
					         item.style.transform = transform;
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
@@ -2796,8 +2880,9 @@
 | 
					@@ -2811,8 +2896,9 @@
 | 
				
			||||||
       );
 | 
					       );
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -539,7 +487,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
         return;
 | 
					         return;
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -2809,6 +2894,12 @@
 | 
					@@ -2824,6 +2910,12 @@
 | 
				
			||||||
           item = item.parentElement;
 | 
					           item = item.parentElement;
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
         item.style.transform = "";
 | 
					         item.style.transform = "";
 | 
				
			||||||
@@ -552,7 +500,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
         item.removeAttribute("dragover-createGroup");
 | 
					         item.removeAttribute("dragover-createGroup");
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
       this.removeAttribute("movingtab-createGroup");
 | 
					       this.removeAttribute("movingtab-createGroup");
 | 
				
			||||||
@@ -2855,7 +2946,7 @@
 | 
					@@ -2870,7 +2962,7 @@
 | 
				
			||||||
         let postTransitionCleanup = () => {
 | 
					         let postTransitionCleanup = () => {
 | 
				
			||||||
           movingTab._moveTogetherSelectedTabsData.animate = false;
 | 
					           movingTab._moveTogetherSelectedTabsData.animate = false;
 | 
				
			||||||
         };
 | 
					         };
 | 
				
			||||||
@@ -561,7 +509,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
           postTransitionCleanup();
 | 
					           postTransitionCleanup();
 | 
				
			||||||
         } else {
 | 
					         } else {
 | 
				
			||||||
           let onTransitionEnd = transitionendEvent => {
 | 
					           let onTransitionEnd = transitionendEvent => {
 | 
				
			||||||
@@ -3028,7 +3119,7 @@
 | 
					@@ -3043,7 +3135,7 @@
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     _notifyBackgroundTab(aTab) {
 | 
					     _notifyBackgroundTab(aTab) {
 | 
				
			||||||
@@ -570,7 +518,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..e8d5dc64609522b440fb01990fb19bff
 | 
				
			|||||||
         return;
 | 
					         return;
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -3154,6 +3245,9 @@
 | 
					@@ -3169,6 +3261,9 @@
 | 
				
			||||||
           return null;
 | 
					           return null;
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/browser/components/urlbar/UrlbarInput.sys.mjs b/browser/components/urlbar/UrlbarInput.sys.mjs
 | 
					diff --git a/browser/components/urlbar/UrlbarInput.sys.mjs b/browser/components/urlbar/UrlbarInput.sys.mjs
 | 
				
			||||||
index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..66ef8de0d2a767376740ca57d75b5372cc11ed40 100644
 | 
					index 0c5145c3d31862bd2c6b5ed2faa88f02425ffde1..1cf86995514b2c00360f6ed681f0c640dac8ab56 100644
 | 
				
			||||||
--- a/browser/components/urlbar/UrlbarInput.sys.mjs
 | 
					--- a/browser/components/urlbar/UrlbarInput.sys.mjs
 | 
				
			||||||
+++ b/browser/components/urlbar/UrlbarInput.sys.mjs
 | 
					+++ b/browser/components/urlbar/UrlbarInput.sys.mjs
 | 
				
			||||||
@@ -68,6 +68,13 @@ XPCOMUtils.defineLazyPreferenceGetter(
 | 
					@@ -68,6 +68,13 @@ XPCOMUtils.defineLazyPreferenceGetter(
 | 
				
			||||||
@@ -16,7 +16,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..66ef8de0d2a767376740ca57d75b5372
 | 
				
			|||||||
 const DEFAULT_FORM_HISTORY_NAME = "searchbar-history";
 | 
					 const DEFAULT_FORM_HISTORY_NAME = "searchbar-history";
 | 
				
			||||||
 const SEARCH_BUTTON_CLASS = "urlbar-search-button";
 | 
					 const SEARCH_BUTTON_CLASS = "urlbar-search-button";
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -349,7 +356,16 @@ export class UrlbarInput {
 | 
					@@ -355,7 +362,16 @@ export class UrlbarInput {
 | 
				
			||||||
     // See _on_select().  HTMLInputElement.select() dispatches a "select"
 | 
					     // See _on_select().  HTMLInputElement.select() dispatches a "select"
 | 
				
			||||||
     // event but does not set the primary selection.
 | 
					     // event but does not set the primary selection.
 | 
				
			||||||
     this._suppressPrimaryAdjustment = true;
 | 
					     this._suppressPrimaryAdjustment = true;
 | 
				
			||||||
@@ -33,7 +33,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..66ef8de0d2a767376740ca57d75b5372
 | 
				
			|||||||
     this._suppressPrimaryAdjustment = false;
 | 
					     this._suppressPrimaryAdjustment = false;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -425,6 +441,10 @@ export class UrlbarInput {
 | 
					@@ -431,6 +447,10 @@ export class UrlbarInput {
 | 
				
			||||||
     hideSearchTerms = false,
 | 
					     hideSearchTerms = false,
 | 
				
			||||||
     isSameDocument = false
 | 
					     isSameDocument = false
 | 
				
			||||||
   ) {
 | 
					   ) {
 | 
				
			||||||
@@ -44,7 +44,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..66ef8de0d2a767376740ca57d75b5372
 | 
				
			|||||||
     // We only need to update the searchModeUI on tab switch conditionally
 | 
					     // We only need to update the searchModeUI on tab switch conditionally
 | 
				
			||||||
     // as we only persist searchMode with ScotchBonnet enabled.
 | 
					     // as we only persist searchMode with ScotchBonnet enabled.
 | 
				
			||||||
     if (
 | 
					     if (
 | 
				
			||||||
@@ -698,8 +718,16 @@ export class UrlbarInput {
 | 
					@@ -735,8 +755,16 @@ export class UrlbarInput {
 | 
				
			||||||
         return;
 | 
					         return;
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
@@ -62,7 +62,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..66ef8de0d2a767376740ca57d75b5372
 | 
				
			|||||||
   }
 | 
					   }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
   /**
 | 
					   /**
 | 
				
			||||||
@@ -1093,7 +1121,11 @@ export class UrlbarInput {
 | 
					@@ -1142,7 +1170,11 @@ export class UrlbarInput {
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     if (!this.#providesSearchMode(result)) {
 | 
					     if (!this.#providesSearchMode(result)) {
 | 
				
			||||||
@@ -74,8 +74,8 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..66ef8de0d2a767376740ca57d75b5372
 | 
				
			|||||||
+      }
 | 
					+      }
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     this.controller.recordSelectedResult(event, result);
 | 
					     if (isCanonized) {
 | 
				
			||||||
@@ -2125,6 +2157,10 @@ export class UrlbarInput {
 | 
					@@ -2191,6 +2223,10 @@ export class UrlbarInput {
 | 
				
			||||||
     await this.#updateLayoutBreakoutDimensions();
 | 
					     await this.#updateLayoutBreakoutDimensions();
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -86,7 +86,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..66ef8de0d2a767376740ca57d75b5372
 | 
				
			|||||||
   startLayoutExtend() {
 | 
					   startLayoutExtend() {
 | 
				
			||||||
     if (!this.#allowBreakout || this.hasAttribute("breakout-extend")) {
 | 
					     if (!this.#allowBreakout || this.hasAttribute("breakout-extend")) {
 | 
				
			||||||
       // Do not expand if the Urlbar does not support being expanded or it is
 | 
					       // Do not expand if the Urlbar does not support being expanded or it is
 | 
				
			||||||
@@ -2147,6 +2183,12 @@ export class UrlbarInput {
 | 
					@@ -2205,6 +2241,12 @@ export class UrlbarInput {
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     this.setAttribute("breakout-extend", "true");
 | 
					     this.setAttribute("breakout-extend", "true");
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -99,7 +99,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..66ef8de0d2a767376740ca57d75b5372
 | 
				
			|||||||
     // Enable the animation only after the first extend call to ensure it
 | 
					     // Enable the animation only after the first extend call to ensure it
 | 
				
			||||||
     // doesn't run when opening a new window.
 | 
					     // doesn't run when opening a new window.
 | 
				
			||||||
     if (!this.hasAttribute("breakout-extend-animate")) {
 | 
					     if (!this.hasAttribute("breakout-extend-animate")) {
 | 
				
			||||||
@@ -2166,6 +2208,24 @@ export class UrlbarInput {
 | 
					@@ -2224,6 +2266,24 @@ export class UrlbarInput {
 | 
				
			||||||
       return;
 | 
					       return;
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -124,7 +124,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..66ef8de0d2a767376740ca57d75b5372
 | 
				
			|||||||
     this.removeAttribute("breakout-extend");
 | 
					     this.removeAttribute("breakout-extend");
 | 
				
			||||||
     this.#updateTextboxPosition();
 | 
					     this.#updateTextboxPosition();
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
@@ -2485,7 +2545,7 @@ export class UrlbarInput {
 | 
					@@ -2553,7 +2613,7 @@ export class UrlbarInput {
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
         this.textbox.parentNode.style.setProperty(
 | 
					         this.textbox.parentNode.style.setProperty(
 | 
				
			||||||
           "--urlbar-container-height",
 | 
					           "--urlbar-container-height",
 | 
				
			||||||
@@ -133,7 +133,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..66ef8de0d2a767376740ca57d75b5372
 | 
				
			|||||||
         );
 | 
					         );
 | 
				
			||||||
         this.textbox.style.setProperty(
 | 
					         this.textbox.style.setProperty(
 | 
				
			||||||
           "--urlbar-height",
 | 
					           "--urlbar-height",
 | 
				
			||||||
@@ -2900,6 +2960,7 @@ export class UrlbarInput {
 | 
					@@ -2968,6 +3028,7 @@ export class UrlbarInput {
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
   _toggleActionOverride(event) {
 | 
					   _toggleActionOverride(event) {
 | 
				
			||||||
@@ -141,7 +141,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..66ef8de0d2a767376740ca57d75b5372
 | 
				
			|||||||
     if (
 | 
					     if (
 | 
				
			||||||
       event.keyCode == KeyEvent.DOM_VK_SHIFT ||
 | 
					       event.keyCode == KeyEvent.DOM_VK_SHIFT ||
 | 
				
			||||||
       event.keyCode == KeyEvent.DOM_VK_ALT ||
 | 
					       event.keyCode == KeyEvent.DOM_VK_ALT ||
 | 
				
			||||||
@@ -2998,7 +3059,7 @@ export class UrlbarInput {
 | 
					@@ -3069,7 +3130,7 @@ export class UrlbarInput {
 | 
				
			||||||
    */
 | 
					    */
 | 
				
			||||||
   _trimValue(val) {
 | 
					   _trimValue(val) {
 | 
				
			||||||
     let trimmedValue = lazy.UrlbarPrefs.get("trimURLs")
 | 
					     let trimmedValue = lazy.UrlbarPrefs.get("trimURLs")
 | 
				
			||||||
@@ -150,7 +150,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..66ef8de0d2a767376740ca57d75b5372
 | 
				
			|||||||
       : val;
 | 
					       : val;
 | 
				
			||||||
     // Only trim value if the directionality doesn't change to RTL and we're not
 | 
					     // Only trim value if the directionality doesn't change to RTL and we're not
 | 
				
			||||||
     // showing a strikeout https protocol.
 | 
					     // showing a strikeout https protocol.
 | 
				
			||||||
@@ -3368,6 +3429,10 @@ export class UrlbarInput {
 | 
					@@ -3439,6 +3500,10 @@ export class UrlbarInput {
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
       reuseEmpty = true;
 | 
					       reuseEmpty = true;
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
@@ -161,7 +161,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..66ef8de0d2a767376740ca57d75b5372
 | 
				
			|||||||
     if (
 | 
					     if (
 | 
				
			||||||
       where == "tab" &&
 | 
					       where == "tab" &&
 | 
				
			||||||
       reuseEmpty &&
 | 
					       reuseEmpty &&
 | 
				
			||||||
@@ -3375,6 +3440,9 @@ export class UrlbarInput {
 | 
					@@ -3446,6 +3511,9 @@ export class UrlbarInput {
 | 
				
			||||||
     ) {
 | 
					     ) {
 | 
				
			||||||
       where = "current";
 | 
					       where = "current";
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
@@ -171,7 +171,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..66ef8de0d2a767376740ca57d75b5372
 | 
				
			|||||||
     return where;
 | 
					     return where;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -3632,6 +3700,7 @@ export class UrlbarInput {
 | 
					@@ -3703,6 +3771,7 @@ export class UrlbarInput {
 | 
				
			||||||
       this.setResultForCurrentValue(null);
 | 
					       this.setResultForCurrentValue(null);
 | 
				
			||||||
       this.handleCommand();
 | 
					       this.handleCommand();
 | 
				
			||||||
       this.controller.clearLastQueryContextCache();
 | 
					       this.controller.clearLastQueryContextCache();
 | 
				
			||||||
@@ -179,7 +179,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..66ef8de0d2a767376740ca57d75b5372
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
       this._suppressStartQuery = false;
 | 
					       this._suppressStartQuery = false;
 | 
				
			||||||
     });
 | 
					     });
 | 
				
			||||||
@@ -3639,7 +3708,6 @@ export class UrlbarInput {
 | 
					@@ -3710,7 +3779,6 @@ export class UrlbarInput {
 | 
				
			||||||
     contextMenu.addEventListener("popupshowing", () => {
 | 
					     contextMenu.addEventListener("popupshowing", () => {
 | 
				
			||||||
       // Close the results pane when the input field contextual menu is open,
 | 
					       // Close the results pane when the input field contextual menu is open,
 | 
				
			||||||
       // because paste and go doesn't want a result selection.
 | 
					       // because paste and go doesn't want a result selection.
 | 
				
			||||||
@@ -187,7 +187,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..66ef8de0d2a767376740ca57d75b5372
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
       let controller =
 | 
					       let controller =
 | 
				
			||||||
         this.document.commandDispatcher.getControllerForCommand("cmd_paste");
 | 
					         this.document.commandDispatcher.getControllerForCommand("cmd_paste");
 | 
				
			||||||
@@ -4053,6 +4121,11 @@ export class UrlbarInput {
 | 
					@@ -4136,6 +4204,11 @@ export class UrlbarInput {
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
   _on_click(event) {
 | 
					   _on_click(event) {
 | 
				
			||||||
@@ -199,7 +199,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..66ef8de0d2a767376740ca57d75b5372
 | 
				
			|||||||
     if (
 | 
					     if (
 | 
				
			||||||
       event.target == this.inputField ||
 | 
					       event.target == this.inputField ||
 | 
				
			||||||
       event.target == this._inputContainer ||
 | 
					       event.target == this._inputContainer ||
 | 
				
			||||||
@@ -4124,7 +4197,7 @@ export class UrlbarInput {
 | 
					@@ -4207,7 +4280,7 @@ export class UrlbarInput {
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -208,7 +208,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..66ef8de0d2a767376740ca57d75b5372
 | 
				
			|||||||
       this.view.autoOpen({ event });
 | 
					       this.view.autoOpen({ event });
 | 
				
			||||||
     } else {
 | 
					     } else {
 | 
				
			||||||
       if (this._untrimOnFocusAfterKeydown) {
 | 
					       if (this._untrimOnFocusAfterKeydown) {
 | 
				
			||||||
@@ -4164,9 +4237,16 @@ export class UrlbarInput {
 | 
					@@ -4247,9 +4320,16 @@ export class UrlbarInput {
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
   _on_mousedown(event) {
 | 
					   _on_mousedown(event) {
 | 
				
			||||||
@@ -226,7 +226,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..66ef8de0d2a767376740ca57d75b5372
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
         if (
 | 
					         if (
 | 
				
			||||||
           event.target != this.inputField &&
 | 
					           event.target != this.inputField &&
 | 
				
			||||||
@@ -4178,6 +4258,10 @@ export class UrlbarInput {
 | 
					@@ -4261,6 +4341,10 @@ export class UrlbarInput {
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
         this.focusedViaMousedown = !this.focused;
 | 
					         this.focusedViaMousedown = !this.focused;
 | 
				
			||||||
         this._preventClickSelectsAll = this.focused;
 | 
					         this._preventClickSelectsAll = this.focused;
 | 
				
			||||||
@@ -237,7 +237,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..66ef8de0d2a767376740ca57d75b5372
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
         // Keep the focus status, since the attribute may be changed
 | 
					         // Keep the focus status, since the attribute may be changed
 | 
				
			||||||
         // upon calling this.focus().
 | 
					         // upon calling this.focus().
 | 
				
			||||||
@@ -4218,7 +4302,7 @@ export class UrlbarInput {
 | 
					@@ -4301,7 +4385,7 @@ export class UrlbarInput {
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
         // Don't close the view when clicking on a tab; we may want to keep the
 | 
					         // 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 open on tab switch, and the TabSelect event arrived earlier.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs b/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs
 | 
					diff --git a/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs b/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs
 | 
				
			||||||
index b1481a11ef38037bec13939928f72f9772e335a9..925f0dc34bf84bb9e0f143f5c1973a87e7b4f8ac 100644
 | 
					index 899e808c5f8cf14577404e3d1766fe967b32b065..82854a04edc21ac4552d06d6ba45c4714b5ef5cb 100644
 | 
				
			||||||
--- a/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs
 | 
					--- a/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs
 | 
				
			||||||
+++ b/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs
 | 
					+++ b/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs
 | 
				
			||||||
@@ -35,6 +35,8 @@ const QUERYINDEX_SWITCHTAB = 9;
 | 
					@@ -35,6 +35,8 @@ const QUERYINDEX_SWITCHTAB = 9;
 | 
				
			||||||
@@ -9,14 +9,14 @@ index b1481a11ef38037bec13939928f72f9772e335a9..925f0dc34bf84bb9e0f143f5c1973a87
 | 
				
			|||||||
+const QUERYINDEX_PINNEDTITLE = 13;
 | 
					+const QUERYINDEX_PINNEDTITLE = 13;
 | 
				
			||||||
+const QUERYINDEX_PINNEDURL = 14;
 | 
					+const QUERYINDEX_PINNEDURL = 14;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 // Constants to support an alternative frecency algorithm.
 | 
					 // This SQL query fragment provides the following:
 | 
				
			||||||
 const PAGES_USE_ALT_FRECENCY = Services.prefs.getBoolPref(
 | 
					 //   - whether the entry is bookmarked (QUERYINDEX_BOOKMARKED)
 | 
				
			||||||
@@ -65,11 +67,14 @@ const SQL_BOOKMARK_TAGS_FRAGMENT = `EXISTS(SELECT 1 FROM moz_bookmarks WHERE fk
 | 
					@@ -56,11 +58,14 @@ const SQL_BOOKMARK_TAGS_FRAGMENT = `EXISTS(SELECT 1 FROM moz_bookmarks WHERE fk
 | 
				
			||||||
 // condition once, and avoid evaluating "btitle" and "tags" when it is false.
 | 
					 // condition once, and avoid evaluating "btitle" and "tags" when it is false.
 | 
				
			||||||
 function defaultQuery(conditions = "") {
 | 
					 function defaultQuery(conditions = "") {
 | 
				
			||||||
   let query = `SELECT :query_type, h.url, h.title, ${SQL_BOOKMARK_TAGS_FRAGMENT},
 | 
					   let query = `SELECT :query_type, h.url, h.title, ${SQL_BOOKMARK_TAGS_FRAGMENT},
 | 
				
			||||||
-            h.visit_count, h.typed, h.id, t.open_count, ${PAGES_FRECENCY_FIELD}, t.userContextId, h.last_visit_date
 | 
					-            h.visit_count, h.typed, h.id, t.open_count, ${lazy.PAGES_FRECENCY_FIELD}, t.userContextId, h.last_visit_date
 | 
				
			||||||
+            h.visit_count, h.typed, h.id, t.open_count, ${PAGES_FRECENCY_FIELD}, t.userContextId, h.last_visit_date,
 | 
					+            h.visit_count, h.typed, h.id, t.open_count, ${lazy.PAGES_FRECENCY_FIELD}, t.userContextId, h.last_visit_date,
 | 
				
			||||||
+            zp.title AS pinned_title, zp.url AS pinned_url
 | 
					+            zp.title AS pinned_title, zp.url AS pinned_url
 | 
				
			||||||
      FROM moz_places h
 | 
					      FROM moz_places h
 | 
				
			||||||
      LEFT JOIN moz_openpages_temp t
 | 
					      LEFT JOIN moz_openpages_temp t
 | 
				
			||||||
@@ -26,8 +26,8 @@ index b1481a11ef38037bec13939928f72f9772e335a9..925f0dc34bf84bb9e0f143f5c1973a87
 | 
				
			|||||||
+            ON zp.url = h.url
 | 
					+            ON zp.url = h.url
 | 
				
			||||||
      WHERE (
 | 
					      WHERE (
 | 
				
			||||||
         (:switchTabsEnabled AND t.open_count > 0) OR
 | 
					         (:switchTabsEnabled AND t.open_count > 0) OR
 | 
				
			||||||
         ${PAGES_FRECENCY_FIELD} <> 0
 | 
					         ${lazy.PAGES_FRECENCY_FIELD} <> 0
 | 
				
			||||||
@@ -83,7 +88,7 @@ function defaultQuery(conditions = "") {
 | 
					@@ -74,7 +79,7 @@ function defaultQuery(conditions = "") {
 | 
				
			||||||
                               :matchBehavior, :searchBehavior, NULL)
 | 
					                               :matchBehavior, :searchBehavior, NULL)
 | 
				
			||||||
          ELSE
 | 
					          ELSE
 | 
				
			||||||
            AUTOCOMPLETE_MATCH(:searchString, h.url,
 | 
					            AUTOCOMPLETE_MATCH(:searchString, h.url,
 | 
				
			||||||
@@ -36,7 +36,7 @@ index b1481a11ef38037bec13939928f72f9772e335a9..925f0dc34bf84bb9e0f143f5c1973a87
 | 
				
			|||||||
                               h.visit_count, h.typed,
 | 
					                               h.visit_count, h.typed,
 | 
				
			||||||
                               0, t.open_count,
 | 
					                               0, t.open_count,
 | 
				
			||||||
                               :matchBehavior, :searchBehavior, NULL)
 | 
					                               :matchBehavior, :searchBehavior, NULL)
 | 
				
			||||||
@@ -1132,11 +1137,14 @@ Search.prototype = {
 | 
					@@ -1130,11 +1135,14 @@ Search.prototype = {
 | 
				
			||||||
     let lastVisit = lastVisitPRTime
 | 
					     let lastVisit = lastVisitPRTime
 | 
				
			||||||
       ? lazy.PlacesUtils.toDate(lastVisitPRTime).getTime()
 | 
					       ? lazy.PlacesUtils.toDate(lastVisitPRTime).getTime()
 | 
				
			||||||
       : undefined;
 | 
					       : undefined;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					diff --git a/browser/components/urlbar/UrlbarValueFormatter.sys.mjs b/browser/components/urlbar/UrlbarValueFormatter.sys.mjs
 | 
				
			||||||
 | 
					index dfa91b76ad3890ceadb1b1b5d7a63b7074fbb776..6369fa1cdb242de32338bbce6debcdab2a04ca02 100644
 | 
				
			||||||
 | 
					--- a/browser/components/urlbar/UrlbarValueFormatter.sys.mjs
 | 
				
			||||||
 | 
					+++ b/browser/components/urlbar/UrlbarValueFormatter.sys.mjs
 | 
				
			||||||
 | 
					@@ -585,6 +585,7 @@ export class UrlbarValueFormatter {
 | 
				
			||||||
 | 
					       this.window.requestAnimationFrame(() => {
 | 
				
			||||||
 | 
					         if (instance == this._resizeInstance) {
 | 
				
			||||||
 | 
					           this.#ensureFormattedHostVisible();
 | 
				
			||||||
 | 
					+          this._formatURL();
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					       });
 | 
				
			||||||
 | 
					     }, 100);
 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/browser/components/urlbar/UrlbarView.sys.mjs b/browser/components/urlbar/UrlbarView.sys.mjs
 | 
					diff --git a/browser/components/urlbar/UrlbarView.sys.mjs b/browser/components/urlbar/UrlbarView.sys.mjs
 | 
				
			||||||
index d5382623595de8daed8cd13ea2eb2de329a4bd92..c3b5d1bad0bf4e1c5a5875a83751cfa96cdf1510 100644
 | 
					index e17f3d34367d6567c89f632b6d1ce537608a6829..7528dfb0abc8ea8d9315591cd529a341b4c3962a 100644
 | 
				
			||||||
--- a/browser/components/urlbar/UrlbarView.sys.mjs
 | 
					--- a/browser/components/urlbar/UrlbarView.sys.mjs
 | 
				
			||||||
+++ b/browser/components/urlbar/UrlbarView.sys.mjs
 | 
					+++ b/browser/components/urlbar/UrlbarView.sys.mjs
 | 
				
			||||||
@@ -609,7 +609,7 @@ export class UrlbarView {
 | 
					@@ -609,7 +609,7 @@ export class UrlbarView {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/browser/extensions/newtab/lib/ActivityStream.sys.mjs b/browser/extensions/newtab/lib/ActivityStream.sys.mjs
 | 
					diff --git a/browser/extensions/newtab/lib/ActivityStream.sys.mjs b/browser/extensions/newtab/lib/ActivityStream.sys.mjs
 | 
				
			||||||
index 14183ad7165dc91126b4409b26f669409c4e9905..be979225b89b193b9e9c8903de5740dc04a8999f 100644
 | 
					index a00011de585a40b91d33364a04c6bf5c86145ecd..f98b6d11519a80aff307513fd77361179f9914a4 100644
 | 
				
			||||||
--- a/browser/extensions/newtab/lib/ActivityStream.sys.mjs
 | 
					--- a/browser/extensions/newtab/lib/ActivityStream.sys.mjs
 | 
				
			||||||
+++ b/browser/extensions/newtab/lib/ActivityStream.sys.mjs
 | 
					+++ b/browser/extensions/newtab/lib/ActivityStream.sys.mjs
 | 
				
			||||||
@@ -215,7 +215,7 @@ export const PREFS_CONFIG = new Map([
 | 
					@@ -228,7 +228,7 @@ export const PREFS_CONFIG = new Map([
 | 
				
			||||||
     "showSponsoredTopSites",
 | 
					     "showSponsoredTopSites",
 | 
				
			||||||
     {
 | 
					     {
 | 
				
			||||||
       title: "Show sponsored top sites",
 | 
					       title: "Show sponsored top sites",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/browser/locales/en-US/installer/custom.properties b/browser/locales/en-US/installer/custom.properties
 | 
					diff --git a/browser/locales/en-US/installer/custom.properties b/browser/locales/en-US/installer/custom.properties
 | 
				
			||||||
index a9dc6fb90caa50a9ba9ec63a6cd90b4d8dcc2bc0..48d11c0c5a3b926d2d29c30d1ca8630941514210 100644
 | 
					index 8c33192e589de1d819cbb21c31cec0480ed4c85e..9db296363303c153dc05ad9e85493f1197bb1efd 100644
 | 
				
			||||||
--- a/browser/locales/en-US/installer/custom.properties
 | 
					--- a/browser/locales/en-US/installer/custom.properties
 | 
				
			||||||
+++ b/browser/locales/en-US/installer/custom.properties
 | 
					+++ b/browser/locales/en-US/installer/custom.properties
 | 
				
			||||||
@@ -77,7 +77,7 @@ STATUS_INSTALL_LANG=Installing Language Files (${AB_CD})…
 | 
					@@ -73,7 +73,7 @@ STATUS_INSTALL_APP=Installing $BrandShortName…
 | 
				
			||||||
 STATUS_UNINSTALL_MAIN=Uninstalling $BrandShortName…
 | 
					 STATUS_UNINSTALL_MAIN=Uninstalling $BrandShortName…
 | 
				
			||||||
 STATUS_CLEANUP=A Little Housekeeping…
 | 
					 STATUS_CLEANUP=A Little Housekeeping…
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/browser/modules/ExtensionsUI.sys.mjs b/browser/modules/ExtensionsUI.sys.mjs
 | 
					diff --git a/browser/modules/ExtensionsUI.sys.mjs b/browser/modules/ExtensionsUI.sys.mjs
 | 
				
			||||||
index 3f74e47bf7602fa800d1cf3034ec67055cc792b6..e700b88d1aee80c946e234f89f695a31d71ff608 100644
 | 
					index 9734d95742035dbe6f608ad3cdaaefc6ed5b83bc..9a7bbb272025e84968d3173faca259f558746c5e 100644
 | 
				
			||||||
--- a/browser/modules/ExtensionsUI.sys.mjs
 | 
					--- a/browser/modules/ExtensionsUI.sys.mjs
 | 
				
			||||||
+++ b/browser/modules/ExtensionsUI.sys.mjs
 | 
					+++ b/browser/modules/ExtensionsUI.sys.mjs
 | 
				
			||||||
@@ -436,7 +436,7 @@ export var ExtensionsUI = {
 | 
					@@ -466,7 +466,7 @@ export var ExtensionsUI = {
 | 
				
			||||||
         eventCallback,
 | 
					         eventCallback,
 | 
				
			||||||
         removeOnDismissal: true,
 | 
					         removeOnDismissal: true,
 | 
				
			||||||
         popupOptions: {
 | 
					         popupOptions: {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/browser/themes/BuiltInThemeConfig.sys.mjs b/browser/themes/BuiltInThemeConfig.sys.mjs
 | 
					diff --git a/browser/themes/BuiltInThemeConfig.sys.mjs b/browser/themes/BuiltInThemeConfig.sys.mjs
 | 
				
			||||||
index 081187147736f56abfe5866a69e00ac13a8dd940..9a980fe858c1a77af7634037aebc332d237e9c11 100644
 | 
					index a5361f1f0ec57f575f8d76e118ff762dc7547501..db5c5eb2059b4ceef3911fd807bf985408859d1a 100644
 | 
				
			||||||
--- a/browser/themes/BuiltInThemeConfig.sys.mjs
 | 
					--- a/browser/themes/BuiltInThemeConfig.sys.mjs
 | 
				
			||||||
+++ b/browser/themes/BuiltInThemeConfig.sys.mjs
 | 
					+++ b/browser/themes/BuiltInThemeConfig.sys.mjs
 | 
				
			||||||
@@ -33,13 +33,6 @@ export const BuiltInThemeConfig = new Map([
 | 
					@@ -33,11 +33,4 @@ export const BuiltInThemeConfig = new Map([
 | 
				
			||||||
       path: "resource://builtin-themes/dark/",
 | 
					       path: "resource://builtin-themes/dark/",
 | 
				
			||||||
     },
 | 
					     },
 | 
				
			||||||
   ],
 | 
					   ],
 | 
				
			||||||
@@ -13,6 +13,4 @@ index 081187147736f56abfe5866a69e00ac13a8dd940..9a980fe858c1a77af7634037aebc332d
 | 
				
			|||||||
-      path: "resource://builtin-themes/alpenglow/",
 | 
					-      path: "resource://builtin-themes/alpenglow/",
 | 
				
			||||||
-    },
 | 
					-    },
 | 
				
			||||||
-  ],
 | 
					-  ],
 | 
				
			||||||
   [
 | 
					 ]);
 | 
				
			||||||
     "2022red-colorway@mozilla.org",
 | 
					 | 
				
			||||||
     {
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,22 +0,0 @@
 | 
				
			|||||||
diff --git a/browser/themes/addons/jar.mn b/browser/themes/addons/jar.mn
 | 
					 | 
				
			||||||
index 69bb3000d6d2d249d1d77262dc2a0057d0318308..bbed04a6b6f11c582e17e08201db260b9ed496b7 100644
 | 
					 | 
				
			||||||
--- a/browser/themes/addons/jar.mn
 | 
					 | 
				
			||||||
+++ b/browser/themes/addons/jar.mn
 | 
					 | 
				
			||||||
@@ -5,8 +5,8 @@
 | 
					 | 
				
			||||||
 browser.jar:
 | 
					 | 
				
			||||||
 %  resource builtin-themes %content/builtin-themes/
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
-  content/builtin-themes/alpenglow                 (alpenglow/*.svg)
 | 
					 | 
				
			||||||
-  content/builtin-themes/alpenglow/manifest.json   (alpenglow/manifest.json)
 | 
					 | 
				
			||||||
+#  content/builtin-themes/alpenglow                 (alpenglow/*.svg)
 | 
					 | 
				
			||||||
+#  content/builtin-themes/alpenglow/manifest.json   (alpenglow/manifest.json)
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
   content/builtin-themes/dark                      (dark/*.svg)
 | 
					 | 
				
			||||||
   content/builtin-themes/dark                      (dark/*.css)
 | 
					 | 
				
			||||||
@@ -100,3 +100,5 @@ browser.jar:
 | 
					 | 
				
			||||||
   content/builtin-themes/colorways/2022innovator/balanced/manifest.json       (colorways/2022-independent-voices/innovator/balanced/manifest.json)
 | 
					 | 
				
			||||||
   content/builtin-themes/colorways/2022innovator/bold                         (colorways/2022-independent-voices/innovator/bold/*.svg)
 | 
					 | 
				
			||||||
   content/builtin-themes/colorways/2022innovator/bold/manifest.json           (colorways/2022-independent-voices/innovator/bold/manifest.json)
 | 
					 | 
				
			||||||
+
 | 
					 | 
				
			||||||
+#include zen-addons.inc.mn
 | 
					 | 
				
			||||||
\ No newline at end of file
 | 
					 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
 | 
					 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/browser/themes/linux/browser.css b/browser/themes/linux/browser.css
 | 
					diff --git a/browser/themes/linux/browser.css b/browser/themes/linux/browser.css
 | 
				
			||||||
index 5c9891e5ed4b865ed4ecc98d794a239b0f96a8f9..53e69289620dd7e89dad167fb3a59b162545dd89 100644
 | 
					index 195cf888a61893cc9b0015e07e27bce94ec9d409..5f4cb6a1922730e8a0f1e9ad04169fb092917938 100644
 | 
				
			||||||
--- a/browser/themes/linux/browser.css
 | 
					--- a/browser/themes/linux/browser.css
 | 
				
			||||||
+++ b/browser/themes/linux/browser.css
 | 
					+++ b/browser/themes/linux/browser.css
 | 
				
			||||||
@@ -42,7 +42,8 @@
 | 
					@@ -42,7 +42,8 @@
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/browser/themes/osx/browser.css b/browser/themes/osx/browser.css
 | 
					diff --git a/browser/themes/osx/browser.css b/browser/themes/osx/browser.css
 | 
				
			||||||
index 7fc76bc82bd5d6311442b85a76d885dcfb6d753d..61b1b3ac8241c4f12e4ca8966a7ac1fae0eb41ee 100644
 | 
					index 9f795cd5b67b12ed4e6d0838d6e0b8e1048f6e50..e9d9326f174a25140113de40f4c57e8bc67677ff 100644
 | 
				
			||||||
--- a/browser/themes/osx/browser.css
 | 
					--- a/browser/themes/osx/browser.css
 | 
				
			||||||
+++ b/browser/themes/osx/browser.css
 | 
					+++ b/browser/themes/osx/browser.css
 | 
				
			||||||
@@ -38,7 +38,7 @@
 | 
					@@ -38,7 +38,7 @@
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,24 +0,0 @@
 | 
				
			|||||||
diff --git a/browser/themes/shared/customizableui/panelUI-shared.css b/browser/themes/shared/customizableui/panelUI-shared.css
 | 
					 | 
				
			||||||
index bdbfd3521b4921f7d6d44623181019a8263b5825..e69b1fb9ee7e553f1183f7a52f9104d6f99d4288 100644
 | 
					 | 
				
			||||||
--- a/browser/themes/shared/customizableui/panelUI-shared.css
 | 
					 | 
				
			||||||
+++ b/browser/themes/shared/customizableui/panelUI-shared.css
 | 
					 | 
				
			||||||
@@ -18,7 +18,7 @@
 | 
					 | 
				
			||||||
   --menu-panel-width-wide: 29em;
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
   --arrowpanel-menuitem-margin-block: 0;
 | 
					 | 
				
			||||||
-  --arrowpanel-menuitem-margin-inline: 8px;
 | 
					 | 
				
			||||||
+  --arrowpanel-menuitem-margin-inline: 4px;
 | 
					 | 
				
			||||||
   --arrowpanel-menuitem-margin: var(--arrowpanel-menuitem-margin-block) var(--arrowpanel-menuitem-margin-inline);
 | 
					 | 
				
			||||||
   --arrowpanel-menuitem-padding-block: 8px;
 | 
					 | 
				
			||||||
   --arrowpanel-menuitem-padding-inline: 8px;
 | 
					 | 
				
			||||||
@@ -819,8 +819,8 @@ toolbarbutton[constrain-size="true"][cui-areatype="panel"] > .toolbarbutton-badg
 | 
					 | 
				
			||||||
 /* Firefox Account Toolbar Panel */
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 #fxa-avatar-image {
 | 
					 | 
				
			||||||
-  width: 16px;
 | 
					 | 
				
			||||||
-  height: 16px;
 | 
					 | 
				
			||||||
+  width: 20px;
 | 
					 | 
				
			||||||
+  height: 20px;
 | 
					 | 
				
			||||||
 }
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 :root {
 | 
					 | 
				
			||||||
@@ -1,13 +0,0 @@
 | 
				
			|||||||
diff --git a/browser/themes/shared/tabbrowser/fullscreen-and-pointerlock.css b/browser/themes/shared/tabbrowser/fullscreen-and-pointerlock.css
 | 
					 | 
				
			||||||
index 787e3153e2e07b383445e94aa9e25177eb49c929..a017e4c003f6c3b9af7c226c637b37aea6baa7e5 100644
 | 
					 | 
				
			||||||
--- a/browser/themes/shared/tabbrowser/fullscreen-and-pointerlock.css
 | 
					 | 
				
			||||||
+++ b/browser/themes/shared/tabbrowser/fullscreen-and-pointerlock.css
 | 
					 | 
				
			||||||
@@ -7,7 +7,7 @@
 | 
					 | 
				
			||||||
 :root[inDOMFullscreen] #sidebar-box,
 | 
					 | 
				
			||||||
 :root[inDOMFullscreen] #sidebar-main,
 | 
					 | 
				
			||||||
 :root[inDOMFullscreen] #sidebar-splitter,
 | 
					 | 
				
			||||||
-:root[inFullscreen]:not([macOSNativeFullscreen]) toolbar:not([fullscreentoolbar=true]),
 | 
					 | 
				
			||||||
+:root[inFullscreen]:not([macOSNativeFullscreen]) toolbar:not([fullscreentoolbar=true]):not(.zen-dont-hide-on-fullscreen),
 | 
					 | 
				
			||||||
 :root[inFullscreen] .global-notificationbox {
 | 
					 | 
				
			||||||
   visibility: collapse;
 | 
					 | 
				
			||||||
 }
 | 
					 | 
				
			||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/browser/themes/shared/tabbrowser/tabs.css b/browser/themes/shared/tabbrowser/tabs.css
 | 
					diff --git a/browser/themes/shared/tabbrowser/tabs.css b/browser/themes/shared/tabbrowser/tabs.css
 | 
				
			||||||
index 6ca85d9d4d593271fe49138ea736bd96651c05f5..bcae5b6829190d6e36a32b36d20c1c73ed810ba5 100644
 | 
					index 5b9ad123d819c6ef068acd427416957a1d0939fe..311caa27ee268c95215d459be02a93d20e129f8b 100644
 | 
				
			||||||
--- a/browser/themes/shared/tabbrowser/tabs.css
 | 
					--- a/browser/themes/shared/tabbrowser/tabs.css
 | 
				
			||||||
+++ b/browser/themes/shared/tabbrowser/tabs.css
 | 
					+++ b/browser/themes/shared/tabbrowser/tabs.css
 | 
				
			||||||
@@ -32,7 +32,7 @@
 | 
					@@ -33,7 +33,7 @@
 | 
				
			||||||
   --tab-block-margin: 4px;
 | 
					   --tab-block-margin: 4px;
 | 
				
			||||||
   --tab-icon-end-margin: 5.5px;
 | 
					   --tab-icon-end-margin: 5.5px;
 | 
				
			||||||
   --tab-label-line-height: 1.7;
 | 
					   --tab-label-line-height: 1.7;
 | 
				
			||||||
@@ -11,7 +11,7 @@ index 6ca85d9d4d593271fe49138ea736bd96651c05f5..bcae5b6829190d6e36a32b36d20c1c73
 | 
				
			|||||||
   --tab-hover-background-color: color-mix(in srgb, currentColor 11%, transparent);
 | 
					   --tab-hover-background-color: color-mix(in srgb, currentColor 11%, transparent);
 | 
				
			||||||
   --tab-selected-textcolor: var(--toolbar-color);
 | 
					   --tab-selected-textcolor: var(--toolbar-color);
 | 
				
			||||||
   --tab-selected-bgcolor: var(--toolbar-bgcolor);
 | 
					   --tab-selected-bgcolor: var(--toolbar-bgcolor);
 | 
				
			||||||
@@ -210,8 +210,7 @@
 | 
					@@ -211,8 +211,7 @@
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
   #tabbrowser-tabs[positionpinnedtabs] > #tabbrowser-arrowscrollbox > &[pinned] {
 | 
					   #tabbrowser-tabs[positionpinnedtabs] > #tabbrowser-arrowscrollbox > &[pinned] {
 | 
				
			||||||
@@ -21,7 +21,7 @@ index 6ca85d9d4d593271fe49138ea736bd96651c05f5..bcae5b6829190d6e36a32b36d20c1c73
 | 
				
			|||||||
   }
 | 
					   }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
   #tabbrowser-tabs[movingtab] &:is(:active, [multiselected]) {
 | 
					   #tabbrowser-tabs[movingtab] &:is(:active, [multiselected]) {
 | 
				
			||||||
@@ -257,7 +256,6 @@
 | 
					@@ -258,7 +257,6 @@
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
   :root:not([uidensity=compact], [sidebar-expand-on-hover]) &[pinned] {
 | 
					   :root:not([uidensity=compact], [sidebar-expand-on-hover]) &[pinned] {
 | 
				
			||||||
@@ -29,7 +29,7 @@ index 6ca85d9d4d593271fe49138ea736bd96651c05f5..bcae5b6829190d6e36a32b36d20c1c73
 | 
				
			|||||||
   }
 | 
					   }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
   &:is([selected], [multiselected]) {
 | 
					   &:is([selected], [multiselected]) {
 | 
				
			||||||
@@ -271,6 +269,7 @@
 | 
					@@ -272,6 +270,7 @@
 | 
				
			||||||
     border-radius: inherit;
 | 
					     border-radius: inherit;
 | 
				
			||||||
     position: relative;
 | 
					     position: relative;
 | 
				
			||||||
     overflow: hidden;
 | 
					     overflow: hidden;
 | 
				
			||||||
@@ -37,15 +37,34 @@ index 6ca85d9d4d593271fe49138ea736bd96651c05f5..bcae5b6829190d6e36a32b36d20c1c73
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
     &::before {
 | 
					     &::before {
 | 
				
			||||||
       position: absolute;
 | 
					       position: absolute;
 | 
				
			||||||
@@ -458,6 +457,7 @@
 | 
					@@ -459,14 +458,11 @@
 | 
				
			||||||
 .tab-icon-image {
 | 
					 .tab-icon-image {
 | 
				
			||||||
   -moz-context-properties: fill, stroke;
 | 
					   -moz-context-properties: fill, stroke;
 | 
				
			||||||
   fill: currentColor;
 | 
					   fill: currentColor;
 | 
				
			||||||
+  border-radius: 4px;
 | 
					+  border-radius: 4px;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
   /* Apply crisp rendering for favicons at exactly 2dppx resolution */
 | 
					   /* stylelint-disable-next-line media-query-no-invalid */
 | 
				
			||||||
   @media (resolution: 2dppx) {
 | 
					   @media -moz-pref("browser.tabs.fadeOutUnloadedTabs") {
 | 
				
			||||||
@@ -557,7 +557,7 @@
 | 
					     &[pending] {
 | 
				
			||||||
 | 
					-      filter: grayscale(100%);
 | 
				
			||||||
 | 
					-      @media (prefers-color-scheme: dark) {
 | 
				
			||||||
 | 
					-        filter: grayscale(100%) invert();
 | 
				
			||||||
 | 
					-      }
 | 
				
			||||||
 | 
					       opacity: 0.5;
 | 
				
			||||||
 | 
					       /* Fade the favicon out */
 | 
				
			||||||
 | 
					       transition-property: filter, opacity;
 | 
				
			||||||
 | 
					@@ -483,10 +479,6 @@
 | 
				
			||||||
 | 
					   /* stylelint-disable-next-line media-query-no-invalid */
 | 
				
			||||||
 | 
					   @media -moz-pref("browser.tabs.fadeOutExplicitlyUnloadedTabs") {
 | 
				
			||||||
 | 
					     &[pending][discarded] {
 | 
				
			||||||
 | 
					-      filter: grayscale(100%);
 | 
				
			||||||
 | 
					-      @media (prefers-color-scheme: dark) {
 | 
				
			||||||
 | 
					-        filter: grayscale(100%) invert();
 | 
				
			||||||
 | 
					-      }
 | 
				
			||||||
 | 
					       opacity: 0.5;
 | 
				
			||||||
 | 
					       /* Fade the favicon out */
 | 
				
			||||||
 | 
					       transition-property: filter, opacity;
 | 
				
			||||||
 | 
					@@ -559,7 +551,7 @@
 | 
				
			||||||
   z-index: 1; /* Overlay tab title */
 | 
					   z-index: 1; /* Overlay tab title */
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
   #tabbrowser-tabs[orient=vertical] & {
 | 
					   #tabbrowser-tabs[orient=vertical] & {
 | 
				
			||||||
@@ -54,7 +73,7 @@ index 6ca85d9d4d593271fe49138ea736bd96651c05f5..bcae5b6829190d6e36a32b36d20c1c73
 | 
				
			|||||||
   }
 | 
					   }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
   &[crashed] {
 | 
					   &[crashed] {
 | 
				
			||||||
@@ -565,7 +565,7 @@
 | 
					@@ -567,7 +559,7 @@
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
   #tabbrowser-tabs[orient="vertical"]:not([expanded]) &:not([crashed]),
 | 
					   #tabbrowser-tabs[orient="vertical"]:not([expanded]) &:not([crashed]),
 | 
				
			||||||
@@ -63,7 +82,7 @@ index 6ca85d9d4d593271fe49138ea736bd96651c05f5..bcae5b6829190d6e36a32b36d20c1c73
 | 
				
			|||||||
     &[soundplaying] {
 | 
					     &[soundplaying] {
 | 
				
			||||||
       list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio-playing-small.svg");
 | 
					       list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio-playing-small.svg");
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
@@ -595,7 +595,7 @@
 | 
					@@ -597,7 +589,7 @@
 | 
				
			||||||
       background-image: linear-gradient(var(--audio-overlay-extra-background)),
 | 
					       background-image: linear-gradient(var(--audio-overlay-extra-background)),
 | 
				
			||||||
                         linear-gradient(var(--toolbox-bgcolor));
 | 
					                         linear-gradient(var(--toolbox-bgcolor));
 | 
				
			||||||
       -moz-context-properties: fill;
 | 
					       -moz-context-properties: fill;
 | 
				
			||||||
@@ -72,7 +91,7 @@ index 6ca85d9d4d593271fe49138ea736bd96651c05f5..bcae5b6829190d6e36a32b36d20c1c73
 | 
				
			|||||||
       color-scheme: var(--tab-selected-color-scheme);
 | 
					       color-scheme: var(--tab-selected-color-scheme);
 | 
				
			||||||
       border-radius: var(--border-radius-circle);
 | 
					       border-radius: var(--border-radius-circle);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -1362,7 +1362,7 @@ tab-group {
 | 
					@@ -1365,7 +1357,7 @@ tab-group {
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -81,7 +100,7 @@ index 6ca85d9d4d593271fe49138ea736bd96651c05f5..bcae5b6829190d6e36a32b36d20c1c73
 | 
				
			|||||||
 #vertical-tabs-newtab-button {
 | 
					 #vertical-tabs-newtab-button {
 | 
				
			||||||
   appearance: none;
 | 
					   appearance: none;
 | 
				
			||||||
   min-height: var(--tab-min-height);
 | 
					   min-height: var(--tab-min-height);
 | 
				
			||||||
@@ -1373,7 +1373,7 @@ tab-group {
 | 
					@@ -1376,7 +1368,7 @@ tab-group {
 | 
				
			||||||
   margin-inline: var(--tab-inner-inline-margin);
 | 
					   margin-inline: var(--tab-inner-inline-margin);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
   #tabbrowser-tabs[orient="vertical"]:not([expanded]) & > .toolbarbutton-text {
 | 
					   #tabbrowser-tabs[orient="vertical"]:not([expanded]) & > .toolbarbutton-text {
 | 
				
			||||||
@@ -90,7 +109,7 @@ index 6ca85d9d4d593271fe49138ea736bd96651c05f5..bcae5b6829190d6e36a32b36d20c1c73
 | 
				
			|||||||
   }
 | 
					   }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
   &:hover {
 | 
					   &:hover {
 | 
				
			||||||
@@ -1397,7 +1397,7 @@ tab-group {
 | 
					@@ -1400,7 +1392,7 @@ tab-group {
 | 
				
			||||||
  * flex container. #tabs-newtab-button is a child of the arrowscrollbox where
 | 
					  * 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.
 | 
					  * we don't want a gap (between tabs), so we have to add some margin.
 | 
				
			||||||
  */
 | 
					  */
 | 
				
			||||||
@@ -99,7 +118,7 @@ index 6ca85d9d4d593271fe49138ea736bd96651c05f5..bcae5b6829190d6e36a32b36d20c1c73
 | 
				
			|||||||
   margin-block: var(--tab-block-margin);
 | 
					   margin-block: var(--tab-block-margin);
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -1471,8 +1471,6 @@ tab-group {
 | 
					@@ -1474,8 +1466,6 @@ tab-group {
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
   :root:not([sidebar-expand-on-hover]) & {
 | 
					   :root:not([sidebar-expand-on-hover]) & {
 | 
				
			||||||
@@ -108,7 +127,7 @@ index 6ca85d9d4d593271fe49138ea736bd96651c05f5..bcae5b6829190d6e36a32b36d20c1c73
 | 
				
			|||||||
     /* stylelint-disable-next-line media-query-no-invalid */
 | 
					     /* stylelint-disable-next-line media-query-no-invalid */
 | 
				
			||||||
     @media not -moz-pref("sidebar.visibility", "expand-on-hover") {
 | 
					     @media not -moz-pref("sidebar.visibility", "expand-on-hover") {
 | 
				
			||||||
       /* We need these rules to apply at all times when the sidebar.visibility
 | 
					       /* We need these rules to apply at all times when the sidebar.visibility
 | 
				
			||||||
@@ -1586,7 +1584,6 @@ tab-group {
 | 
					@@ -1585,7 +1575,6 @@ tab-group {
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
   &:not([expanded]) {
 | 
					   &:not([expanded]) {
 | 
				
			||||||
     .tabbrowser-tab[pinned] {
 | 
					     .tabbrowser-tab[pinned] {
 | 
				
			||||||
@@ -116,7 +135,7 @@ index 6ca85d9d4d593271fe49138ea736bd96651c05f5..bcae5b6829190d6e36a32b36d20c1c73
 | 
				
			|||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     .tab-background {
 | 
					     .tab-background {
 | 
				
			||||||
@@ -1717,7 +1714,7 @@ tab-group {
 | 
					@@ -1716,7 +1705,7 @@ tab-group {
 | 
				
			||||||
   toolbarbutton:not(#firefox-view-button),
 | 
					   toolbarbutton:not(#firefox-view-button),
 | 
				
			||||||
   toolbarpaletteitem:not(#wrapper-firefox-view-button)
 | 
					   toolbarpaletteitem:not(#wrapper-firefox-view-button)
 | 
				
			||||||
 ) ~ #tabbrowser-tabs {
 | 
					 ) ~ #tabbrowser-tabs {
 | 
				
			||||||
@@ -125,7 +144,7 @@ index 6ca85d9d4d593271fe49138ea736bd96651c05f5..bcae5b6829190d6e36a32b36d20c1c73
 | 
				
			|||||||
   padding-inline-start: calc(var(--tab-overflow-pinned-tabs-width) + 2px);
 | 
					   padding-inline-start: calc(var(--tab-overflow-pinned-tabs-width) + 2px);
 | 
				
			||||||
   margin-inline-start: 2px;
 | 
					   margin-inline-start: 2px;
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
@@ -1751,7 +1748,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button {
 | 
					@@ -1750,7 +1739,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button {
 | 
				
			||||||
   list-style-image: url(chrome://global/skin/icons/plus.svg);
 | 
					   list-style-image: url(chrome://global/skin/icons/plus.svg);
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/browser/themes/shared/toolbarbuttons.css b/browser/themes/shared/toolbarbuttons.css
 | 
					diff --git a/browser/themes/shared/toolbarbuttons.css b/browser/themes/shared/toolbarbuttons.css
 | 
				
			||||||
index 26b58ee104a432a359ba2667d2e49a9231e81fef..7cb950e7b3fcb6f599e9cb645ea24a515e2cc491 100644
 | 
					index d84326072652a48d7fc9b61c585fb00ac4b506ab..c91654eb852460721cf7e45623fb471027f06d90 100644
 | 
				
			||||||
--- a/browser/themes/shared/toolbarbuttons.css
 | 
					--- a/browser/themes/shared/toolbarbuttons.css
 | 
				
			||||||
+++ b/browser/themes/shared/toolbarbuttons.css
 | 
					+++ b/browser/themes/shared/toolbarbuttons.css
 | 
				
			||||||
@@ -218,7 +218,7 @@ toolbar[brighttext] .toolbaritem-combined-buttons > separator {
 | 
					@@ -249,7 +249,7 @@ toolbar[brighttext] .toolbaritem-combined-buttons > separator {
 | 
				
			||||||
 #nav-bar-overflow-button {
 | 
					 #nav-bar-overflow-button {
 | 
				
			||||||
   list-style-image: url("chrome://global/skin/icons/chevron.svg");
 | 
					   list-style-image: url("chrome://global/skin/icons/chevron.svg");
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -11,7 +11,7 @@ index 26b58ee104a432a359ba2667d2e49a9231e81fef..7cb950e7b3fcb6f599e9cb645ea24a51
 | 
				
			|||||||
     display: none;
 | 
					     display: none;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -428,7 +428,7 @@ toolbarbutton.bookmark-item:not(.subviewbutton) {
 | 
					@@ -459,7 +459,7 @@ toolbarbutton.bookmark-item:not(.subviewbutton) {
 | 
				
			||||||
      */
 | 
					      */
 | 
				
			||||||
     align-items: stretch;
 | 
					     align-items: stretch;
 | 
				
			||||||
     > .toolbarbutton-icon {
 | 
					     > .toolbarbutton-icon {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/browser/themes/shared/urlbar-searchbar.css b/browser/themes/shared/urlbar-searchbar.css
 | 
					diff --git a/browser/themes/shared/urlbar-searchbar.css b/browser/themes/shared/urlbar-searchbar.css
 | 
				
			||||||
index e237ee9edea85c1d2ef22f988df6b22755e343e6..abee0dc035833c4334e55bd8cd7483bbcc71f97f 100644
 | 
					index 23661cf489d97cdbd6d4c66de199fd9dc0c8475f..2677dc60a92cebe014c817414a6067be9543cf98 100644
 | 
				
			||||||
--- a/browser/themes/shared/urlbar-searchbar.css
 | 
					--- a/browser/themes/shared/urlbar-searchbar.css
 | 
				
			||||||
+++ b/browser/themes/shared/urlbar-searchbar.css
 | 
					+++ b/browser/themes/shared/urlbar-searchbar.css
 | 
				
			||||||
@@ -5,7 +5,7 @@
 | 
					@@ -5,7 +5,7 @@
 | 
				
			||||||
@@ -11,10 +11,10 @@ index e237ee9edea85c1d2ef22f988df6b22755e343e6..abee0dc035833c4334e55bd8cd7483bb
 | 
				
			|||||||
   --urlbar-margin-inline: 5px;
 | 
					   --urlbar-margin-inline: 5px;
 | 
				
			||||||
   --urlbar-padding-block: 4px;
 | 
					   --urlbar-padding-block: 4px;
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
@@ -292,10 +292,14 @@
 | 
					@@ -303,10 +303,14 @@
 | 
				
			||||||
 }
 | 
					 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 #urlbar[breakout][breakout-extend] {
 | 
					 #urlbar[breakout][breakout-extend] {
 | 
				
			||||||
 | 
					   height: auto;
 | 
				
			||||||
+  :root:not([zen-single-toolbar='true']) {
 | 
					+  :root:not([zen-single-toolbar='true']) {
 | 
				
			||||||
   margin-left: calc(-1 * var(--urlbar-margin-inline));
 | 
					   margin-left: calc(-1 * var(--urlbar-margin-inline));
 | 
				
			||||||
+  }
 | 
					+  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -60,18 +60,6 @@
 | 
				
			|||||||
  list-style-image: url('sidebars-right.svg') !important;
 | 
					  list-style-image: url('sidebars-right.svg') !important;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#context_zenSplitTabs {
 | 
					 | 
				
			||||||
  --menu-image: url('sidebars-right.svg') !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-zen-change-workspace-tab {
 | 
					 | 
				
			||||||
  --menu-image: url('move-tab.svg') !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-zenSplitLink {
 | 
					 | 
				
			||||||
  --menu-image: url('split.svg') !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#sidebar-button:-moz-locale-dir(ltr):not([positionend]),
 | 
					#sidebar-button:-moz-locale-dir(ltr):not([positionend]),
 | 
				
			||||||
#sidebar-button:-moz-locale-dir(rtl)[positionend] {
 | 
					#sidebar-button:-moz-locale-dir(rtl)[positionend] {
 | 
				
			||||||
  list-style-image: url('chrome://browser/skin/sidebars.svg') !important;
 | 
					  list-style-image: url('chrome://browser/skin/sidebars.svg') !important;
 | 
				
			||||||
@@ -133,6 +121,10 @@
 | 
				
			|||||||
  list-style-image: url('tab.svg') !important;
 | 
					  list-style-image: url('tab.svg') !important;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#context-navigation > menuitem {
 | 
				
			||||||
 | 
					  padding: 4px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#history-panelmenu,
 | 
					#history-panelmenu,
 | 
				
			||||||
.urlbarView-row[source='history']
 | 
					.urlbarView-row[source='history']
 | 
				
			||||||
  > .urlbarView-row-inner
 | 
					  > .urlbarView-row-inner
 | 
				
			||||||
@@ -173,15 +165,6 @@
 | 
				
			|||||||
  list-style-image: url('open.svg') !important;
 | 
					  list-style-image: url('open.svg') !important;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#context_zenOpenWorkspace {
 | 
					 | 
				
			||||||
  --menu-image: url('open.svg') !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context_zenEditWorkspace,
 | 
					 | 
				
			||||||
#zenToolbarThemePicker {
 | 
					 | 
				
			||||||
  --menu-image: url('edit-theme.svg') !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#add-ons-button,
 | 
					#add-ons-button,
 | 
				
			||||||
#appMenu-extensions-themes-button,
 | 
					#appMenu-extensions-themes-button,
 | 
				
			||||||
#unified-extensions-button {
 | 
					#unified-extensions-button {
 | 
				
			||||||
@@ -303,6 +286,11 @@
 | 
				
			|||||||
  list-style-image: url('home.svg') !important;
 | 
					  list-style-image: url('home.svg') !important;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#toggle_toolbar-menubar,
 | 
				
			||||||
 | 
					#appMenu_menu_openHelp {
 | 
				
			||||||
 | 
					  display: none;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#library-button {
 | 
					#library-button {
 | 
				
			||||||
  list-style-image: url('library.svg') !important;
 | 
					  list-style-image: url('library.svg') !important;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -447,6 +435,11 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#zen-glance-sidebar-split {
 | 
					#zen-glance-sidebar-split {
 | 
				
			||||||
  list-style-image: url('split.svg');
 | 
					  list-style-image: url('split.svg');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  &[disabled='true'] {
 | 
				
			||||||
 | 
					    opacity: 0.5;
 | 
				
			||||||
 | 
					    cursor: not-allowed;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#sidebar-box[sidebarcommand='viewTabsSidebar']
 | 
					#sidebar-box[sidebarcommand='viewTabsSidebar']
 | 
				
			||||||
@@ -635,371 +628,6 @@
 | 
				
			|||||||
  list-style-image: url('manage.svg') !important;
 | 
					  list-style-image: url('manage.svg') !important;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Context Menu Icons */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-video-pictureinpicture:not([checked='true']) .menu-iconic-icon {
 | 
					 | 
				
			||||||
  list-style-image: url('media-pip.svg') !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-media-loop:not([checked='true']) .menu-iconic-icon {
 | 
					 | 
				
			||||||
  list-style-image: url('media-loop.svg') !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
:not(:not(menubar) > menu, #ContentSelectDropdown)
 | 
					 | 
				
			||||||
  > menupopup
 | 
					 | 
				
			||||||
  > menuitem:not(
 | 
					 | 
				
			||||||
    .menuitem-iconic,
 | 
					 | 
				
			||||||
    [type='checkbox'],
 | 
					 | 
				
			||||||
    [type='radio'],
 | 
					 | 
				
			||||||
    .in-menulist,
 | 
					 | 
				
			||||||
    .in-menulist menuitem,
 | 
					 | 
				
			||||||
    .unified-nav-current
 | 
					 | 
				
			||||||
  ),
 | 
					 | 
				
			||||||
:not(:not(menubar) > menu, #ContentSelectDropdown)
 | 
					 | 
				
			||||||
  > menupopup
 | 
					 | 
				
			||||||
  > menu:not(
 | 
					 | 
				
			||||||
    .menu-iconic,
 | 
					 | 
				
			||||||
    [type='checkbox'],
 | 
					 | 
				
			||||||
    [type='radio'],
 | 
					 | 
				
			||||||
    .in-menulist,
 | 
					 | 
				
			||||||
    .in-menulist menu,
 | 
					 | 
				
			||||||
    .unified-nav-current
 | 
					 | 
				
			||||||
  ),
 | 
					 | 
				
			||||||
#toggle_toolbar-menubar,
 | 
					 | 
				
			||||||
#PanelUI-history toolbarbutton,
 | 
					 | 
				
			||||||
#unified-extensions-context-menu menuitem {
 | 
					 | 
				
			||||||
  background-image: var(--menu-image) !important;
 | 
					 | 
				
			||||||
  background-size: 16px !important;
 | 
					 | 
				
			||||||
  background-position: var(--fp-contextmenu-menuitem-padding-inline) center !important;
 | 
					 | 
				
			||||||
  background-repeat: no-repeat !important;
 | 
					 | 
				
			||||||
  -moz-context-properties: fill, fill-opacity !important;
 | 
					 | 
				
			||||||
  fill: currentColor !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@media not (-moz-platform: windows) {
 | 
					 | 
				
			||||||
  menu > .menu-iconic-text,
 | 
					 | 
				
			||||||
  menuitem > .menu-iconic-text {
 | 
					 | 
				
			||||||
    padding-inline-start: var(--fp-contextmenu-menuicon-margin-inline) !important;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-savepage {
 | 
					 | 
				
			||||||
  --menu-image: url('save.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-selectall,
 | 
					 | 
				
			||||||
.textbox-contextmenu menuitem[cmd*='selectAll'],
 | 
					 | 
				
			||||||
#context_selectAllTabs,
 | 
					 | 
				
			||||||
#toolbar-context-selectAllTabs {
 | 
					 | 
				
			||||||
  --menu-image: url('edit-select-all.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-undo,
 | 
					 | 
				
			||||||
.textbox-contextmenu menuitem[cmd*='undo'],
 | 
					 | 
				
			||||||
#context_undoCloseTab,
 | 
					 | 
				
			||||||
#toolbar-context-undoCloseTab {
 | 
					 | 
				
			||||||
  --menu-image: url('edit-undo.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#toggle_toolbar-menubar {
 | 
					 | 
				
			||||||
  --menu-image: url('menu-bar.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-redo,
 | 
					 | 
				
			||||||
.textbox-contextmenu menuitem[cmd*='redo'] {
 | 
					 | 
				
			||||||
  --menu-image: url('edit-redo.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-copy,
 | 
					 | 
				
			||||||
.textbox-contextmenu menuitem[cmd*='copy'],
 | 
					 | 
				
			||||||
.textbox-contextmenu #strip-on-share,
 | 
					 | 
				
			||||||
#placesContext_copy {
 | 
					 | 
				
			||||||
  --menu-image: url('edit-copy.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-paste,
 | 
					 | 
				
			||||||
.textbox-contextmenu menuitem[cmd*='paste'],
 | 
					 | 
				
			||||||
#placesContext_paste_group {
 | 
					 | 
				
			||||||
  --menu-image: url('edit-paste.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-cut,
 | 
					 | 
				
			||||||
.textbox-contextmenu menuitem[cmd*='cut'],
 | 
					 | 
				
			||||||
#placesContext_cut {
 | 
					 | 
				
			||||||
  --menu-image: url('edit-cut.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-delete,
 | 
					 | 
				
			||||||
.customize-context-removeExtension,
 | 
					 | 
				
			||||||
.unified-extensions-context-menu-remove-extension,
 | 
					 | 
				
			||||||
.textbox-contextmenu menuitem[cmd*='delete'],
 | 
					 | 
				
			||||||
menuitem[id='placesContext_deleteBookmark'],
 | 
					 | 
				
			||||||
menuitem[id='placesContext_deleteFolder'],
 | 
					 | 
				
			||||||
menuitem[id='placesContext_delete'],
 | 
					 | 
				
			||||||
menuitem[id='placesContext_delete_history'],
 | 
					 | 
				
			||||||
menuitem[id='placesContext_deleteHost'],
 | 
					 | 
				
			||||||
#context_zenDeleteWebPanel,
 | 
					 | 
				
			||||||
#context_zenDeleteWorkspace {
 | 
					 | 
				
			||||||
  --menu-image: url('edit-delete.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#paste-and-go {
 | 
					 | 
				
			||||||
  --menu-image: url('paste-and-go.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-print-selection {
 | 
					 | 
				
			||||||
  --menu-image: url('print.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-take-screenshot {
 | 
					 | 
				
			||||||
  --menu-image: url('screenshot.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-viewsource {
 | 
					 | 
				
			||||||
  --menu-image: url('source-code.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-inspect-a11y {
 | 
					 | 
				
			||||||
  --menu-image: url('accessibility.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-inspect {
 | 
					 | 
				
			||||||
  --menu-image: url('inspect.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-searchselect {
 | 
					 | 
				
			||||||
  --menu-image: url('search-glass.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-viewimage {
 | 
					 | 
				
			||||||
  --menu-image: url('image-open.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-viewimageinfo {
 | 
					 | 
				
			||||||
  --menu-image: url('info.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-saveimage,
 | 
					 | 
				
			||||||
#context-video-saveimage {
 | 
					 | 
				
			||||||
  --menu-image: url('image-save.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-savevideo {
 | 
					 | 
				
			||||||
  --menu-image: url('video-save.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-viewvideo {
 | 
					 | 
				
			||||||
  --menu-image: url('video-open.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-saveaudio {
 | 
					 | 
				
			||||||
  --menu-image: url('audio-save.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-copyimage-contents {
 | 
					 | 
				
			||||||
  --menu-image: url('image-copy.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-copyimage,
 | 
					 | 
				
			||||||
#context-copyvideourl,
 | 
					 | 
				
			||||||
#context-copylink,
 | 
					 | 
				
			||||||
#context-stripOnShareLink,
 | 
					 | 
				
			||||||
#context_zenOpenNewTabWebPanel,
 | 
					 | 
				
			||||||
#context-pdfjs-copy {
 | 
					 | 
				
			||||||
  --menu-image: url('link.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-openlinkincurrent {
 | 
					 | 
				
			||||||
  --menu-image: url('ext-link.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-viewsource,
 | 
					 | 
				
			||||||
#context-viewframesource,
 | 
					 | 
				
			||||||
#context-viewpartialsource-selection {
 | 
					 | 
				
			||||||
  --menu-image: url('source-code.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-sendimage,
 | 
					 | 
				
			||||||
#context-sendvideo,
 | 
					 | 
				
			||||||
#context-sendaudio {
 | 
					 | 
				
			||||||
  --menu-image: url('mail.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-setDesktopBackground,
 | 
					 | 
				
			||||||
.viewCustomizeToolbar {
 | 
					 | 
				
			||||||
  --menu-image: url('customize.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-reloadimage,
 | 
					 | 
				
			||||||
#context_reloadTab,
 | 
					 | 
				
			||||||
#context_reloadSelectedTabs,
 | 
					 | 
				
			||||||
#toolbar-context-reloadSelectedTab,
 | 
					 | 
				
			||||||
#toolbar-context-reloadSelectedTabs,
 | 
					 | 
				
			||||||
#context_zen-reset-pinned-tab {
 | 
					 | 
				
			||||||
  --menu-image: url('reload.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-sendlinktodevice,
 | 
					 | 
				
			||||||
#context_sendTabToDevice,
 | 
					 | 
				
			||||||
#context-sendpagetodevice {
 | 
					 | 
				
			||||||
  --menu-image: url('send-to-device.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-openlinkintab,
 | 
					 | 
				
			||||||
#context-openlinkincontainertab,
 | 
					 | 
				
			||||||
#context_zenWorkspacesOpenInContainerTab,
 | 
					 | 
				
			||||||
#context_zenWebPanelContextInContainer,
 | 
					 | 
				
			||||||
menuitem[id='placesContext_open:newtab'],
 | 
					 | 
				
			||||||
menuitem[id='placesContext_openLinks:tabs'],
 | 
					 | 
				
			||||||
menuitem[id='placesContext_openBookmarkLinks:tabs'],
 | 
					 | 
				
			||||||
menuitem[id='placesContext_openBookmarkContainer:tabs'] {
 | 
					 | 
				
			||||||
  --menu-image: url('tab.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context_openANewTab,
 | 
					 | 
				
			||||||
#toolbar-context-openANewTab {
 | 
					 | 
				
			||||||
  --menu-image: url('new-tab-image.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-openlinkinusercontext-menu,
 | 
					 | 
				
			||||||
menu[id='placesContext_open:newcontainertab'],
 | 
					 | 
				
			||||||
menu[id='placesContext_openContainer:tabs'] {
 | 
					 | 
				
			||||||
  --menu-image: url('container-tab.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-openlink,
 | 
					 | 
				
			||||||
menuitem[id='placesContext_open:newwindow'] {
 | 
					 | 
				
			||||||
  --menu-image: url('window.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-openlinkprivate,
 | 
					 | 
				
			||||||
menuitem[id='placesContext_open:newprivatewindow'] {
 | 
					 | 
				
			||||||
  --menu-image: url('private-window.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-savelink {
 | 
					 | 
				
			||||||
  --menu-image: url('downloads.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#spell-add-to-dictionary {
 | 
					 | 
				
			||||||
  --menu-image: url('add-to-dictionary.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#manage-saved-logins {
 | 
					 | 
				
			||||||
  --menu-image: url('passwords.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-media-play,
 | 
					 | 
				
			||||||
#context_playTab,
 | 
					 | 
				
			||||||
#context_playSelectedTabs {
 | 
					 | 
				
			||||||
  --menu-image: url('media-play.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-media-pause {
 | 
					 | 
				
			||||||
  --menu-image: url('media-pause.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-media-mute,
 | 
					 | 
				
			||||||
#context_toggleMuteTab,
 | 
					 | 
				
			||||||
#context_toggleMuteSelectedTabs,
 | 
					 | 
				
			||||||
#context_zenToggleMuteWebPanel {
 | 
					 | 
				
			||||||
  --menu-image: url('media-mute.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-media-unmute,
 | 
					 | 
				
			||||||
#context_toggleMuteTab[muted],
 | 
					 | 
				
			||||||
#context_toggleMuteSelectedTabs[muted],
 | 
					 | 
				
			||||||
#context_zenToggleMuteWebPanel[muted] {
 | 
					 | 
				
			||||||
  --menu-image: url('media-unmute.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-media-playbackrate {
 | 
					 | 
				
			||||||
  --menu-image: url('media-speed.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-video-fullscreen {
 | 
					 | 
				
			||||||
  --menu-image: url('fullscreen.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-leave-dom-fullscreen,
 | 
					 | 
				
			||||||
menuitem[contexttype='fullscreen'][label*='Exit'] {
 | 
					 | 
				
			||||||
  --menu-image: url('fullscreen-exit.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-media-hidecontrols,
 | 
					 | 
				
			||||||
#context-media-showcontrols {
 | 
					 | 
				
			||||||
  --menu-image: url('permissions.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context_pinTab,
 | 
					 | 
				
			||||||
#context_unpinTab,
 | 
					 | 
				
			||||||
#context_pinSelectedTabs,
 | 
					 | 
				
			||||||
#context_unpinSelectedTabs,
 | 
					 | 
				
			||||||
.customize-context-moveToPanel,
 | 
					 | 
				
			||||||
#context_zen-replace-pinned-url-with-current {
 | 
					 | 
				
			||||||
  --menu-image: url('pin.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context_zen-add-essential {
 | 
					 | 
				
			||||||
  --menu-image: url('essential-add.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context_zen-remove-essential {
 | 
					 | 
				
			||||||
  --menu-image: url('essential-remove.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.customize-context-removeFromToolbar {
 | 
					 | 
				
			||||||
  --menu-image: url('unpin.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#zen-sidebar-web-panel-pinned[pinned='true'] {
 | 
					 | 
				
			||||||
  list-style-image: url('pin.svg') !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#zen-sidebar-web-panel-pinned {
 | 
					 | 
				
			||||||
  list-style-image: url('unpin.svg') !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context_duplicateTab,
 | 
					 | 
				
			||||||
#context_duplicateTabs {
 | 
					 | 
				
			||||||
  --menu-image: url('duplicate-tab.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#zen-context-menu-compact-mode {
 | 
					 | 
				
			||||||
  --menu-image: url('sidebar.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context_bookmarkTab,
 | 
					 | 
				
			||||||
#context_bookmarkSelectedTabs,
 | 
					 | 
				
			||||||
#toggle_PersonalToolbar,
 | 
					 | 
				
			||||||
#context-bookmarklink,
 | 
					 | 
				
			||||||
#toolbar-context-bookmarkSelectedTab,
 | 
					 | 
				
			||||||
#toolbar-context-bookmarkSelectedTabs {
 | 
					 | 
				
			||||||
  --menu-image: url('bookmark-hollow.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
menuitem[id='placesContext_show_bookmark:info'],
 | 
					 | 
				
			||||||
menuitem[id='placesContext_show_folder:info'],
 | 
					 | 
				
			||||||
menuitem[id='placesContext_show:info'] {
 | 
					 | 
				
			||||||
  --menu-image: url('edit.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
menuitem[id='placesContext_showAllBookmarks'],
 | 
					 | 
				
			||||||
#BMB_bookmarksShowAllTop,
 | 
					 | 
				
			||||||
#BMB_bookmarksShowAll,
 | 
					 | 
				
			||||||
.customize-context-manageExtension,
 | 
					 | 
				
			||||||
.unified-extensions-context-menu-manage-extension {
 | 
					 | 
				
			||||||
  --menu-image: url('manage.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#BMB_viewBookmarksSidebar {
 | 
					 | 
				
			||||||
  --menu-image: url('chrome://browser/skin/sidebars.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#BMB_searchBookmarks {
 | 
					 | 
				
			||||||
  --menu-image: url('search-page.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#appMenuRecentlyClosedTabs {
 | 
					#appMenuRecentlyClosedTabs {
 | 
				
			||||||
  list-style-image: url('container-tab.svg') !important;
 | 
					  list-style-image: url('container-tab.svg') !important;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1020,58 +648,12 @@ menuitem[id='placesContext_showAllBookmarks'],
 | 
				
			|||||||
  list-style-image: url('manage.svg') !important;
 | 
					  list-style-image: url('manage.svg') !important;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
menuitem[id='placesContext_new:bookmark'],
 | 
					 | 
				
			||||||
menuitem[id='placesContext_new:folder'],
 | 
					 | 
				
			||||||
menuitem[id='placesContext_new:separator'] {
 | 
					 | 
				
			||||||
  --menu-image: url('plus.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context-savelinktopocket,
 | 
					 | 
				
			||||||
#context-pocket {
 | 
					 | 
				
			||||||
  --menu-image: url('pocket-outline.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context_moveTabOptions {
 | 
					 | 
				
			||||||
  --menu-image: url('move-tab.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.share-tab-url-item {
 | 
					 | 
				
			||||||
  --menu-image: url('share.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context_reopenInContainer {
 | 
					 | 
				
			||||||
  --menu-image: url('container-tab.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context_closeTab {
 | 
					 | 
				
			||||||
  --menu-image: url('close.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context_closeTabOptions {
 | 
					 | 
				
			||||||
  --menu-image: url('close-all.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#context_zenUnloadTab,
 | 
					 | 
				
			||||||
#context_zenUnloadWebPanel,
 | 
					 | 
				
			||||||
#context_zenTabActions {
 | 
					 | 
				
			||||||
  --menu-image: url('close-all.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.customize-context-reportExtension,
 | 
					 | 
				
			||||||
.unified-extensions-context-menu-report-extension {
 | 
					 | 
				
			||||||
  --menu-image: url('report.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* FIX header icons for the app menu sub menus (eg. fx account, history...) */
 | 
					/* FIX header icons for the app menu sub menus (eg. fx account, history...) */
 | 
				
			||||||
.panel-header > h1 {
 | 
					.panel-header > h1 {
 | 
				
			||||||
  text-align: left;
 | 
					  text-align: left;
 | 
				
			||||||
  margin-left: 8px !important;
 | 
					  margin-left: 8px !important;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.wordmark::after {
 | 
					 | 
				
			||||||
  content: 'Plus' !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* header icons for the app menu sub menus (eg. fx account, history...) */
 | 
					/* header icons for the app menu sub menus (eg. fx account, history...) */
 | 
				
			||||||
.panel-header > h1 > span::before {
 | 
					.panel-header > h1 > span::before {
 | 
				
			||||||
  content: '';
 | 
					  content: '';
 | 
				
			||||||
@@ -1116,67 +698,10 @@ menuitem[id='placesContext_new:separator'] {
 | 
				
			|||||||
  --fp-enabled: 1;
 | 
					  --fp-enabled: 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@media not (-moz-platform: linux) {
 | 
					 | 
				
			||||||
  .unified-extensions-context-menu-pin-to-toolbar {
 | 
					 | 
				
			||||||
    --menu-image: url('pin.svg');
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.unified-extensions-context-menu-move-widget-down {
 | 
					 | 
				
			||||||
  --menu-image: url('arrow-down.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.unified-extensions-context-menu-move-widget-up {
 | 
					 | 
				
			||||||
  --menu-image: url('arrow-up.svg');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#alltabs-button {
 | 
					#alltabs-button {
 | 
				
			||||||
  list-style-image: url('chrome://browser/skin/tabs.svg') !important;
 | 
					  list-style-image: url('chrome://browser/skin/tabs.svg') !important;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
:not(:not(menubar) > menu, #ContentSelectDropdown)
 | 
					 | 
				
			||||||
  > menupopup
 | 
					 | 
				
			||||||
  > menuitem:not(
 | 
					 | 
				
			||||||
    .menuitem-iconic,
 | 
					 | 
				
			||||||
    [type='checkbox'],
 | 
					 | 
				
			||||||
    [type='radio'],
 | 
					 | 
				
			||||||
    .in-menulist,
 | 
					 | 
				
			||||||
    .in-menulist menuitem,
 | 
					 | 
				
			||||||
    .unified-nav-current
 | 
					 | 
				
			||||||
  ),
 | 
					 | 
				
			||||||
:not(:not(menubar) > menu, #ContentSelectDropdown)
 | 
					 | 
				
			||||||
  > menupopup
 | 
					 | 
				
			||||||
  > menu:not(
 | 
					 | 
				
			||||||
    .menu-iconic,
 | 
					 | 
				
			||||||
    [type='checkbox'],
 | 
					 | 
				
			||||||
    [type='radio'],
 | 
					 | 
				
			||||||
    .in-menulist,
 | 
					 | 
				
			||||||
    .in-menulist menu,
 | 
					 | 
				
			||||||
    .unified-nav-current
 | 
					 | 
				
			||||||
  ),
 | 
					 | 
				
			||||||
:not(:not(menubar) > menu, #ContentSelectDropdown) > menupopup > menucaption {
 | 
					 | 
				
			||||||
  padding-inline-start: calc(
 | 
					 | 
				
			||||||
    var(--fp-contextmenu-menuitem-padding-inline) + 16px +
 | 
					 | 
				
			||||||
      var(--fp-contextmenu-menuicon-margin-inline)
 | 
					 | 
				
			||||||
  ) !important;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
menupopup > menuitem:is([type='checkbox']) .menu-iconic-left {
 | 
					 | 
				
			||||||
  --menu-image: none !important;
 | 
					 | 
				
			||||||
  margin-inline-start: 4px;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  @media not (-moz-platform: windows) {
 | 
					 | 
				
			||||||
    margin-inline-end: 0;
 | 
					 | 
				
			||||||
    padding-inline-end: 0;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@media (-moz-platform: windows) {
 | 
					 | 
				
			||||||
  menupopup > menuitem[checked='true'] {
 | 
					 | 
				
			||||||
    padding-inline-start: 6px;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#toolbar-context-toggle-vertical-tabs,
 | 
					#toolbar-context-toggle-vertical-tabs,
 | 
				
			||||||
#toolbar-context-customize-sidebar,
 | 
					#toolbar-context-customize-sidebar,
 | 
				
			||||||
#sidebarRevampSeparator {
 | 
					#sidebarRevampSeparator {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,21 +1,12 @@
 | 
				
			|||||||
diff --git a/browser/themes/windows/browser.css b/browser/themes/windows/browser.css
 | 
					diff --git a/browser/themes/windows/browser.css b/browser/themes/windows/browser.css
 | 
				
			||||||
index 3e75a5f366e76acf4b9457a510b58b0cb8af580f..99b5712d533e99f3bb3f13c1485e771ab66731cd 100644
 | 
					index 007aec91e089a1d2df20235890b268b820b0a529..ac0592cbcec62ffefb58b491dff48749852f2d88 100644
 | 
				
			||||||
--- a/browser/themes/windows/browser.css
 | 
					--- a/browser/themes/windows/browser.css
 | 
				
			||||||
+++ b/browser/themes/windows/browser.css
 | 
					+++ b/browser/themes/windows/browser.css
 | 
				
			||||||
@@ -34,7 +34,6 @@
 | 
					@@ -31,7 +31,6 @@
 | 
				
			||||||
     /* stylelint-disable-next-line media-query-no-invalid */
 | 
					     /* stylelint-disable-next-line media-query-no-invalid */
 | 
				
			||||||
     @media -moz-pref("widget.windows.mica.toplevel-backdrop", 2) {
 | 
					     @media -moz-pref("widget.windows.mica.toplevel-backdrop", 2) {
 | 
				
			||||||
       /* For acrylic, do the same we do for popups to guarantee some contrast */
 | 
					       /* For acrylic, do the same we do for popups to guarantee some contrast */
 | 
				
			||||||
-      background-color: light-dark(rgba(255, 255, 255, .6), rgba(0, 0, 0, .6));
 | 
					-      background-color: light-dark(rgba(255, 255, 255, .6), rgba(0, 0, 0, .6));
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
     }
 | 
					 | 
				
			||||||
@@ -57,7 +56,7 @@
 | 
					 | 
				
			||||||
       }
 | 
					 | 
				
			||||||
     }
 | 
					 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
-    &[sizemode="normal"] #navigator-toolbox {
 | 
					 | 
				
			||||||
+    &[sizemode="normal"] #browser {
 | 
					 | 
				
			||||||
       border-top: .5px solid ActiveBorder;
 | 
					 | 
				
			||||||
       &:-moz-window-inactive {
 | 
					 | 
				
			||||||
         border-top-color: InactiveBorder;
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/build/moz.build b/build/moz.build
 | 
					diff --git a/build/moz.build b/build/moz.build
 | 
				
			||||||
index ad78395c33bba4f6a7bd73bae2a3b6e0658ed59e..a3ba1001a60b764c9ef1c824917fe4d5b81ed0b2 100644
 | 
					index f7a912ec35dd089ea9a7e712765e954854f55cb3..a84534efbc7662f81573a4a80bc045e0a6d2ed3e 100644
 | 
				
			||||||
--- a/build/moz.build
 | 
					--- a/build/moz.build
 | 
				
			||||||
+++ b/build/moz.build
 | 
					+++ b/build/moz.build
 | 
				
			||||||
@@ -90,7 +90,7 @@ if CONFIG["MOZ_APP_BASENAME"]:
 | 
					@@ -89,7 +89,7 @@ if CONFIG["MOZ_APP_BASENAME"]:
 | 
				
			||||||
         if CONFIG[var]:
 | 
					         if CONFIG[var]:
 | 
				
			||||||
             appini_defines[var] = True
 | 
					             appini_defines[var] = True
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/build/pgo/profileserver.py b/build/pgo/profileserver.py
 | 
					diff --git a/build/pgo/profileserver.py b/build/pgo/profileserver.py
 | 
				
			||||||
index c59efbdc5382da897dcac31da7039cdc92e1d7dc..9b14add5b0c5afec5b7efc7f9df7d04d3169fc80 100755
 | 
					index 6017810c873f6be5a5d133dc9386f7cd8879e81b..6d399e0c8135d2c27157c81d75515de04c39f1d7 100755
 | 
				
			||||||
--- a/build/pgo/profileserver.py
 | 
					--- a/build/pgo/profileserver.py
 | 
				
			||||||
+++ b/build/pgo/profileserver.py
 | 
					+++ b/build/pgo/profileserver.py
 | 
				
			||||||
@@ -18,7 +18,13 @@ from mozprofile import FirefoxProfile, Preferences
 | 
					@@ -18,7 +18,13 @@ from mozprofile import FirefoxProfile, Preferences
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/docshell/base/nsAboutRedirector.cpp b/docshell/base/nsAboutRedirector.cpp
 | 
					diff --git a/docshell/base/nsAboutRedirector.cpp b/docshell/base/nsAboutRedirector.cpp
 | 
				
			||||||
index e95ff966b34576439c745aa206ff534a835c956f..5691cb2baa76b7cd543bb030b7c8d3028359bc4c 100644
 | 
					index 77491402cb2921ad52c028ee8fe940636cbe3cf1..e93265e1bb96a07a6d9a66074f191cb8c16fa37a 100644
 | 
				
			||||||
--- a/docshell/base/nsAboutRedirector.cpp
 | 
					--- a/docshell/base/nsAboutRedirector.cpp
 | 
				
			||||||
+++ b/docshell/base/nsAboutRedirector.cpp
 | 
					+++ b/docshell/base/nsAboutRedirector.cpp
 | 
				
			||||||
@@ -108,7 +108,7 @@ static const RedirEntry kRedirMap[] = {
 | 
					@@ -108,7 +108,7 @@ static const RedirEntry kRedirMap[] = {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/dom/base/use_counter_metrics.yaml b/dom/base/use_counter_metrics.yaml
 | 
					diff --git a/dom/base/use_counter_metrics.yaml b/dom/base/use_counter_metrics.yaml
 | 
				
			||||||
index 58755773c26952b79df258dd8f55147c77db9c5f..041bd3fe99303621733cd3543e196b6a03950526 100644
 | 
					index 6d2b80297f728af4e6b363e09dac4244d9ffd312..03ca7d1c7f27430923f146a3d3a708a09e351948 100644
 | 
				
			||||||
--- a/dom/base/use_counter_metrics.yaml
 | 
					--- a/dom/base/use_counter_metrics.yaml
 | 
				
			||||||
+++ b/dom/base/use_counter_metrics.yaml
 | 
					+++ b/dom/base/use_counter_metrics.yaml
 | 
				
			||||||
@@ -21402,6 +21402,22 @@ use.counter.css.page:
 | 
					@@ -21527,6 +21527,22 @@ use.counter.css.page:
 | 
				
			||||||
     send_in_pings:
 | 
					     send_in_pings:
 | 
				
			||||||
       - use-counters
 | 
					       - use-counters
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -25,7 +25,7 @@ index 58755773c26952b79df258dd8f55147c77db9c5f..041bd3fe99303621733cd3543e196b6a
 | 
				
			|||||||
   css_transform_origin:
 | 
					   css_transform_origin:
 | 
				
			||||||
     type: counter
 | 
					     type: counter
 | 
				
			||||||
     description: >
 | 
					     description: >
 | 
				
			||||||
@@ -33372,6 +33388,22 @@ use.counter.css.doc:
 | 
					@@ -33497,6 +33513,22 @@ use.counter.css.doc:
 | 
				
			||||||
     send_in_pings:
 | 
					     send_in_pings:
 | 
				
			||||||
       - use-counters
 | 
					       - use-counters
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/dom/html/HTMLMediaElement.cpp b/dom/html/HTMLMediaElement.cpp
 | 
					diff --git a/dom/html/HTMLMediaElement.cpp b/dom/html/HTMLMediaElement.cpp
 | 
				
			||||||
index 677a2f25b16f4cf724b57d86a2b83acf40ec6164..e06f85366866c1cc99d27bc10cbebf2cb986e5cb 100644
 | 
					index add22d0f3c462eae3d5b5140779ff7a4e25f9321..7653df83680ee0e6c765432b1539fe1c90bfae35 100644
 | 
				
			||||||
--- a/dom/html/HTMLMediaElement.cpp
 | 
					--- a/dom/html/HTMLMediaElement.cpp
 | 
				
			||||||
+++ b/dom/html/HTMLMediaElement.cpp
 | 
					+++ b/dom/html/HTMLMediaElement.cpp
 | 
				
			||||||
@@ -455,6 +455,7 @@ class HTMLMediaElement::MediaControlKeyListener final
 | 
					@@ -452,6 +452,7 @@ class HTMLMediaElement::MediaControlKeyListener final
 | 
				
			||||||
     // audible state. Therefore, in that case we would noitfy the audible state
 | 
					     // audible state. Therefore, in that case we would noitfy the audible state
 | 
				
			||||||
     // when media starts playing.
 | 
					     // when media starts playing.
 | 
				
			||||||
     if (mState == MediaPlaybackState::ePlayed) {
 | 
					     if (mState == MediaPlaybackState::ePlayed) {
 | 
				
			||||||
@@ -10,8 +10,8 @@ index 677a2f25b16f4cf724b57d86a2b83acf40ec6164..e06f85366866c1cc99d27bc10cbebf2c
 | 
				
			|||||||
       NotifyAudibleStateChanged(mIsOwnerAudible
 | 
					       NotifyAudibleStateChanged(mIsOwnerAudible
 | 
				
			||||||
                                     ? MediaAudibleState::eAudible
 | 
					                                     ? MediaAudibleState::eAudible
 | 
				
			||||||
                                     : MediaAudibleState::eInaudible);
 | 
					                                     : MediaAudibleState::eInaudible);
 | 
				
			||||||
@@ -6967,6 +6968,9 @@ void HTMLMediaElement::FireTimeUpdate(TimeupdateType aType) {
 | 
					@@ -6955,6 +6956,9 @@ void HTMLMediaElement::FireTimeUpdate(TimeupdateType aType) {
 | 
				
			||||||
     DispatchAsyncEvent(std::move(runner));
 | 
					     QueueTask(std::move(runner));
 | 
				
			||||||
     mQueueTimeUpdateRunnerTime = TimeStamp::Now();
 | 
					     mQueueTimeUpdateRunnerTime = TimeStamp::Now();
 | 
				
			||||||
     mLastCurrentTime = CurrentTime();
 | 
					     mLastCurrentTime = CurrentTime();
 | 
				
			||||||
+    if (aType == TimeupdateType::eMandatory) {
 | 
					+    if (aType == TimeupdateType::eMandatory) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/dom/script/ScriptLoader.cpp b/dom/script/ScriptLoader.cpp
 | 
					diff --git a/dom/script/ScriptLoader.cpp b/dom/script/ScriptLoader.cpp
 | 
				
			||||||
index b3bec3821582d48c79cd88a4efe5c7bae1fd42e6..0bb81a8b0fa9478c894f80cfa81fd04c67fdd79f 100644
 | 
					index 51f63f998e47aa4b1dffc3cacdb0a698b33b4623..0387738ce1f29b5db4a5d03a3b2f5f3a91011125 100644
 | 
				
			||||||
--- a/dom/script/ScriptLoader.cpp
 | 
					--- a/dom/script/ScriptLoader.cpp
 | 
				
			||||||
+++ b/dom/script/ScriptLoader.cpp
 | 
					+++ b/dom/script/ScriptLoader.cpp
 | 
				
			||||||
@@ -2670,6 +2670,36 @@ void ScriptLoader::CalculateBytecodeCacheFlag(ScriptLoadRequest* aRequest) {
 | 
					@@ -2679,6 +2679,36 @@ void ScriptLoader::CalculateBytecodeCacheFlag(ScriptLoadRequest* aRequest) {
 | 
				
			||||||
       hasFetchCountMin = false;
 | 
					       hasFetchCountMin = false;
 | 
				
			||||||
       break;
 | 
					       break;
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/gfx/wr/webrender/src/picture.rs b/gfx/wr/webrender/src/picture.rs
 | 
					diff --git a/gfx/wr/webrender/src/picture.rs b/gfx/wr/webrender/src/picture.rs
 | 
				
			||||||
index 7a811bc074959e0f0e7e25603acc4bf50edce4dc..4954cd9b2b3c9efdbe32343152c877186751ec26 100644
 | 
					index 3b0671ec8ffb8cbd0843e18569a948203c2b9cfe..77d4953cc9bf07d38efd26f4fe95e465b244598c 100644
 | 
				
			||||||
--- a/gfx/wr/webrender/src/picture.rs
 | 
					--- a/gfx/wr/webrender/src/picture.rs
 | 
				
			||||||
+++ b/gfx/wr/webrender/src/picture.rs
 | 
					+++ b/gfx/wr/webrender/src/picture.rs
 | 
				
			||||||
@@ -7957,7 +7957,12 @@ fn get_relative_scale_offset(
 | 
					@@ -8027,7 +8027,12 @@ fn get_relative_scale_offset(
 | 
				
			||||||
         CoordinateSpaceMapping::Local => ScaleOffset::identity(),
 | 
					         CoordinateSpaceMapping::Local => ScaleOffset::identity(),
 | 
				
			||||||
         CoordinateSpaceMapping::ScaleOffset(scale_offset) => scale_offset,
 | 
					         CoordinateSpaceMapping::ScaleOffset(scale_offset) => scale_offset,
 | 
				
			||||||
         CoordinateSpaceMapping::Transform(m) => {
 | 
					         CoordinateSpaceMapping::Transform(m) => {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/image/decoders/nsJXLDecoder.h b/image/decoders/nsJXLDecoder.h
 | 
					diff --git a/image/decoders/nsJXLDecoder.h b/image/decoders/nsJXLDecoder.h
 | 
				
			||||||
index 6cde7456ca03f79e74401c1d215b9d50453ebf41..2f593ca3b70100c600b86e753d7a458c83b4f15c 100644
 | 
					index 0b723878aefdc5a37c2cffb72a561f859ad79cdf..6d39326dbefa9a85cc02b426de5c9f9149fe612d 100644
 | 
				
			||||||
--- a/image/decoders/nsJXLDecoder.h
 | 
					--- a/image/decoders/nsJXLDecoder.h
 | 
				
			||||||
+++ b/image/decoders/nsJXLDecoder.h
 | 
					+++ b/image/decoders/nsJXLDecoder.h
 | 
				
			||||||
@@ -48,6 +48,18 @@ class nsJXLDecoder final : public Decoder {
 | 
					@@ -46,6 +46,18 @@ class nsJXLDecoder final : public Decoder {
 | 
				
			||||||
   Vector<uint8_t> mBuffer;
 | 
					   Vector<uint8_t> mBuffer;
 | 
				
			||||||
   Vector<uint8_t> mOutBuffer;
 | 
					   Vector<uint8_t> mOutBuffer;
 | 
				
			||||||
   JxlBasicInfo mInfo{};
 | 
					   JxlBasicInfo mInfo{};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/layout/generic/nsIFrame.cpp b/layout/generic/nsIFrame.cpp
 | 
					diff --git a/layout/generic/nsIFrame.cpp b/layout/generic/nsIFrame.cpp
 | 
				
			||||||
index 0fff882bd3b643e3ab59cfaada984bef0ae7fee4..71e981251fa9395cbb14927d9bd3473c1e18a2cb 100644
 | 
					index fe05efa67f97e0d8cc327a4744a225ed5c6132c9..cce0dfb537fa1735b8e7ff67684d373a3081a527 100644
 | 
				
			||||||
--- a/layout/generic/nsIFrame.cpp
 | 
					--- a/layout/generic/nsIFrame.cpp
 | 
				
			||||||
+++ b/layout/generic/nsIFrame.cpp
 | 
					+++ b/layout/generic/nsIFrame.cpp
 | 
				
			||||||
@@ -11721,6 +11721,11 @@ gfx::Matrix nsIFrame::ComputeWidgetTransform() const {
 | 
					@@ -11810,6 +11810,11 @@ gfx::Matrix nsIFrame::ComputeWidgetTransform() const {
 | 
				
			||||||
   gfx::Matrix4x4 matrix = nsStyleTransformMatrix::ReadTransforms(
 | 
					   gfx::Matrix4x4 matrix = nsStyleTransformMatrix::ReadTransforms(
 | 
				
			||||||
       uiReset->mMozWindowTransform, refBox, float(appUnitsPerDevPixel));
 | 
					       uiReset->mMozWindowTransform, refBox, float(appUnitsPerDevPixel));
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp
 | 
					diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp
 | 
				
			||||||
index f89bade8099183baa55b38ccc3c77c7ba9f1a290..8ada58a7965e7f2c9375d8b9bf64a5c78d80bf3f 100644
 | 
					index 8f587542ad248f7c0183e1787c81f37170c7ba54..3b213204e0faabb7ad8988872c8b39c776b87d73 100644
 | 
				
			||||||
--- a/layout/style/nsStyleStruct.cpp
 | 
					--- a/layout/style/nsStyleStruct.cpp
 | 
				
			||||||
+++ b/layout/style/nsStyleStruct.cpp
 | 
					+++ b/layout/style/nsStyleStruct.cpp
 | 
				
			||||||
@@ -3204,6 +3204,9 @@ nsStyleUIReset::nsStyleUIReset()
 | 
					@@ -3229,6 +3229,9 @@ nsStyleUIReset::nsStyleUIReset()
 | 
				
			||||||
       mWindowShadow(StyleWindowShadow::Auto),
 | 
					       mWindowShadow(StyleWindowShadow::Auto),
 | 
				
			||||||
       mWindowOpacity(1.0),
 | 
					       mWindowOpacity(1.0),
 | 
				
			||||||
       mMozWindowInputRegionMargin(StyleLength::Zero()),
 | 
					       mMozWindowInputRegionMargin(StyleLength::Zero()),
 | 
				
			||||||
@@ -12,7 +12,7 @@ index f89bade8099183baa55b38ccc3c77c7ba9f1a290..8ada58a7965e7f2c9375d8b9bf64a5c7
 | 
				
			|||||||
       mTransitions(
 | 
					       mTransitions(
 | 
				
			||||||
           nsStyleAutoArray<StyleTransition>::WITH_SINGLE_INITIAL_ELEMENT),
 | 
					           nsStyleAutoArray<StyleTransition>::WITH_SINGLE_INITIAL_ELEMENT),
 | 
				
			||||||
       mTransitionTimingFunctionCount(1),
 | 
					       mTransitionTimingFunctionCount(1),
 | 
				
			||||||
@@ -3247,6 +3250,7 @@ nsStyleUIReset::nsStyleUIReset(const nsStyleUIReset& aSource)
 | 
					@@ -3272,6 +3275,7 @@ nsStyleUIReset::nsStyleUIReset(const nsStyleUIReset& aSource)
 | 
				
			||||||
       mWindowOpacity(aSource.mWindowOpacity),
 | 
					       mWindowOpacity(aSource.mWindowOpacity),
 | 
				
			||||||
       mMozWindowInputRegionMargin(aSource.mMozWindowInputRegionMargin),
 | 
					       mMozWindowInputRegionMargin(aSource.mMozWindowInputRegionMargin),
 | 
				
			||||||
       mMozWindowTransform(aSource.mMozWindowTransform),
 | 
					       mMozWindowTransform(aSource.mMozWindowTransform),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h
 | 
					diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h
 | 
				
			||||||
index 472c15a359ecd7ad0834d479f1acc53b4527f5ac..9f8377ab507b5883b92621160987a97e0be80014 100644
 | 
					index 1c6e2b5a3d4a0ca2b5ef50a84c220958885ce3e3..d74f5558ab70c53fc2649f0f3ab40a456c3e1c6a 100644
 | 
				
			||||||
--- a/layout/style/nsStyleStruct.h
 | 
					--- a/layout/style/nsStyleStruct.h
 | 
				
			||||||
+++ b/layout/style/nsStyleStruct.h
 | 
					+++ b/layout/style/nsStyleStruct.h
 | 
				
			||||||
@@ -1876,6 +1876,7 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleUIReset {
 | 
					@@ -2003,6 +2003,7 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleUIReset {
 | 
				
			||||||
   // The margin of the window region that should be transparent to events.
 | 
					   // The margin of the window region that should be transparent to events.
 | 
				
			||||||
   mozilla::StyleLength mMozWindowInputRegionMargin;
 | 
					   mozilla::StyleLength mMozWindowInputRegionMargin;
 | 
				
			||||||
   mozilla::StyleTransform mMozWindowTransform;
 | 
					   mozilla::StyleTransform mMozWindowTransform;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml
 | 
					diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml
 | 
				
			||||||
index c4e19fc5231c2378ddb25f462cd1584aa9eac760..eb0cec062abf0c97bf5ca33e85aeacd496c296a8 100644
 | 
					index c3b88faf0b3294a143139487d3dac1127b84bd4f..7fdb31b61ced2e1f9131396ed88f1216ce7c5b1f 100644
 | 
				
			||||||
--- a/modules/libpref/init/StaticPrefList.yaml
 | 
					--- a/modules/libpref/init/StaticPrefList.yaml
 | 
				
			||||||
+++ b/modules/libpref/init/StaticPrefList.yaml
 | 
					+++ b/modules/libpref/init/StaticPrefList.yaml
 | 
				
			||||||
@@ -18804,6 +18804,7 @@
 | 
					@@ -18839,6 +18839,7 @@
 | 
				
			||||||
   mirror: always
 | 
					   mirror: always
 | 
				
			||||||
 #endif
 | 
					 #endif
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/netwerk/protocol/http/moz.build b/netwerk/protocol/http/moz.build
 | 
					diff --git a/netwerk/protocol/http/moz.build b/netwerk/protocol/http/moz.build
 | 
				
			||||||
index a83080d963322d7baa581f1ca61f93d42bb5a938..0741be2ffc5449be829af7f6067d1abcdc86d155 100644
 | 
					index 4e60ca2b579aa3e02c7769fd966e36d297dd0068..24dbb5de95d4f7dbec354c30f9b2c4d64384225e 100644
 | 
				
			||||||
--- a/netwerk/protocol/http/moz.build
 | 
					--- a/netwerk/protocol/http/moz.build
 | 
				
			||||||
+++ b/netwerk/protocol/http/moz.build
 | 
					+++ b/netwerk/protocol/http/moz.build
 | 
				
			||||||
@@ -223,7 +223,7 @@ LOCAL_INCLUDES += [
 | 
					@@ -222,7 +222,7 @@ LOCAL_INCLUDES += [
 | 
				
			||||||
     "/netwerk/url-classifier",
 | 
					     "/netwerk/url-classifier",
 | 
				
			||||||
 ]
 | 
					 ]
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,13 +0,0 @@
 | 
				
			|||||||
diff --git a/old-configure.in b/old-configure.in
 | 
					 | 
				
			||||||
index 036734708f20d658248a8b5b3a6d8adc2530a878..4e1f0d96cd355cc1195b58548b29c1a5d6bedaa8 100644
 | 
					 | 
				
			||||||
--- a/old-configure.in
 | 
					 | 
				
			||||||
+++ b/old-configure.in
 | 
					 | 
				
			||||||
@@ -89,7 +89,7 @@ dnl Mac bundle identifier (based on MOZ_APP_DISPLAYNAME)
 | 
					 | 
				
			||||||
 if test -z "$MOZ_MACBUNDLE_ID"; then
 | 
					 | 
				
			||||||
    MOZ_MACBUNDLE_ID=`echo $MOZ_APP_DISPLAYNAME | tr 'A-Z' 'a-z' | tr -dc 'a-z-'`
 | 
					 | 
				
			||||||
 fi
 | 
					 | 
				
			||||||
-MOZ_MACBUNDLE_ID=${MOZ_DISTRIBUTION_ID}.${MOZ_MACBUNDLE_ID}
 | 
					 | 
				
			||||||
+MOZ_MACBUNDLE_ID=app.zen-browser.zen
 | 
					 | 
				
			||||||
 if test "$MOZ_DEBUG"; then
 | 
					 | 
				
			||||||
   MOZ_MACBUNDLE_ID=${MOZ_MACBUNDLE_ID}debug
 | 
					 | 
				
			||||||
 fi
 | 
					 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/toolkit/actors/PictureInPictureChild.sys.mjs b/toolkit/actors/PictureInPictureChild.sys.mjs
 | 
					diff --git a/toolkit/actors/PictureInPictureChild.sys.mjs b/toolkit/actors/PictureInPictureChild.sys.mjs
 | 
				
			||||||
index 7ae1aa58bbaeab7a1835a3ea8328735d4f4ecfb1..9d0679dde3c031c2459c09ffbc157f32bc7d003a 100644
 | 
					index e4dea54a29e2a1575d76091061781a504da38465..d5248eebdd018feca7bb9d5ee3284d6f253a4b35 100644
 | 
				
			||||||
--- a/toolkit/actors/PictureInPictureChild.sys.mjs
 | 
					--- a/toolkit/actors/PictureInPictureChild.sys.mjs
 | 
				
			||||||
+++ b/toolkit/actors/PictureInPictureChild.sys.mjs
 | 
					+++ b/toolkit/actors/PictureInPictureChild.sys.mjs
 | 
				
			||||||
@@ -291,6 +291,7 @@ export class PictureInPictureLauncherChild extends JSWindowActorChild {
 | 
					@@ -291,6 +291,7 @@ export class PictureInPictureLauncherChild extends JSWindowActorChild {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/toolkit/content/aboutSupport.xhtml b/toolkit/content/aboutSupport.xhtml
 | 
					diff --git a/toolkit/content/aboutSupport.xhtml b/toolkit/content/aboutSupport.xhtml
 | 
				
			||||||
index 296259cd0360a403e8659e22d0c08e968529a38a..bde1ee8d0a05e6ce2eb3ff8ff8a19ba28c20af98 100644
 | 
					index 7f57218f3573488445ea363e0c4532b292d53167..511f578b4ae38a496ca936adf2fef1f587249f47 100644
 | 
				
			||||||
--- a/toolkit/content/aboutSupport.xhtml
 | 
					--- a/toolkit/content/aboutSupport.xhtml
 | 
				
			||||||
+++ b/toolkit/content/aboutSupport.xhtml
 | 
					+++ b/toolkit/content/aboutSupport.xhtml
 | 
				
			||||||
@@ -10,6 +10,7 @@
 | 
					@@ -10,6 +10,7 @@
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/toolkit/content/widgets/arrowscrollbox.js b/toolkit/content/widgets/arrowscrollbox.js
 | 
					diff --git a/toolkit/content/widgets/arrowscrollbox.js b/toolkit/content/widgets/arrowscrollbox.js
 | 
				
			||||||
index f9191af09f1b7a1654aff62807e7dad573afc172..f49ad7cb08f5d2be4a03046c191361f8c8a004bc 100644
 | 
					index e2000d0f0c33e0e497e79dd206e195235bc5094e..ac69cb75d2be93a1f72fb61bea200d3dcbcdd77f 100644
 | 
				
			||||||
--- a/toolkit/content/widgets/arrowscrollbox.js
 | 
					--- a/toolkit/content/widgets/arrowscrollbox.js
 | 
				
			||||||
+++ b/toolkit/content/widgets/arrowscrollbox.js
 | 
					+++ b/toolkit/content/widgets/arrowscrollbox.js
 | 
				
			||||||
@@ -98,6 +98,7 @@
 | 
					@@ -98,6 +98,7 @@
 | 
				
			||||||
@@ -10,7 +10,7 @@ index f9191af09f1b7a1654aff62807e7dad573afc172..f49ad7cb08f5d2be4a03046c191361f8
 | 
				
			|||||||
         let contentSize =
 | 
					         let contentSize =
 | 
				
			||||||
           slot.getBoundingClientRect()[this.#verticalMode ? "height" : "width"];
 | 
					           slot.getBoundingClientRect()[this.#verticalMode ? "height" : "width"];
 | 
				
			||||||
         // NOTE(emilio): This should be contentSize > scrollClientSize, but due
 | 
					         // NOTE(emilio): This should be contentSize > scrollClientSize, but due
 | 
				
			||||||
@@ -639,7 +640,7 @@
 | 
					@@ -642,7 +643,7 @@
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
     on_wheel(event) {
 | 
					     on_wheel(event) {
 | 
				
			||||||
       // Don't consume the event if we can't scroll.
 | 
					       // Don't consume the event if we can't scroll.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/toolkit/content/widgets/infobar.css b/toolkit/content/widgets/infobar.css
 | 
					diff --git a/toolkit/content/widgets/infobar.css b/toolkit/content/widgets/infobar.css
 | 
				
			||||||
index 7818f1ef1dcc62e184bd5e3e8d6d936acf77d2ea..4803c07a183e2df70e8fdc9769bb4bb15a73f39b 100644
 | 
					index 9b28d3179db134bb14b4c4d840d5f3aac1dc7b3f..5cdd1a379e5a5156d0adeac78b0af300440d84b5 100644
 | 
				
			||||||
--- a/toolkit/content/widgets/infobar.css
 | 
					--- a/toolkit/content/widgets/infobar.css
 | 
				
			||||||
+++ b/toolkit/content/widgets/infobar.css
 | 
					+++ b/toolkit/content/widgets/infobar.css
 | 
				
			||||||
@@ -94,3 +94,18 @@ strong {
 | 
					@@ -96,3 +96,18 @@ strong {
 | 
				
			||||||
 :host([type=system]) .content {
 | 
					 :host([type=system]) .content {
 | 
				
			||||||
   margin-inline-start: 0;
 | 
					   margin-inline-start: 0;
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/toolkit/content/widgets/tabbox.js b/toolkit/content/widgets/tabbox.js
 | 
					diff --git a/toolkit/content/widgets/tabbox.js b/toolkit/content/widgets/tabbox.js
 | 
				
			||||||
index 6775a7635c6cdbb276b3a912d0bba07840acb28f..4ef3eb6a7dbd741cf432668c2ff6e832f5bb97e7 100644
 | 
					index 6775a7635c6cdbb276b3a912d0bba07840acb28f..861640d12c6118e11acb3f51723a79098dbbba10 100644
 | 
				
			||||||
--- a/toolkit/content/widgets/tabbox.js
 | 
					--- a/toolkit/content/widgets/tabbox.js
 | 
				
			||||||
+++ b/toolkit/content/widgets/tabbox.js
 | 
					+++ b/toolkit/content/widgets/tabbox.js
 | 
				
			||||||
@@ -213,7 +213,7 @@
 | 
					@@ -213,7 +213,7 @@
 | 
				
			||||||
@@ -7,7 +7,7 @@ index 6775a7635c6cdbb276b3a912d0bba07840acb28f..4ef3eb6a7dbd741cf432668c2ff6e832
 | 
				
			|||||||
       this._inAsyncOperation = false;
 | 
					       this._inAsyncOperation = false;
 | 
				
			||||||
       if (oldPanel != this._selectedPanel) {
 | 
					       if (oldPanel != this._selectedPanel) {
 | 
				
			||||||
-        oldPanel?.classList.remove("deck-selected");
 | 
					-        oldPanel?.classList.remove("deck-selected");
 | 
				
			||||||
+        if (!oldPanel?.classList.contains("zen-glance-background")) oldPanel?.classList.remove("deck-selected");
 | 
					+        if (!(window.gZenGlanceManager && gZenGlanceManager.shouldShowDeckSelected(this._selectedPanel, oldPanel))) oldPanel?.classList.remove("deck-selected");
 | 
				
			||||||
         this._selectedPanel?.classList.add("deck-selected");
 | 
					         this._selectedPanel?.classList.add("deck-selected");
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
       this.setAttribute("selectedIndex", val);
 | 
					       this.setAttribute("selectedIndex", val);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/toolkit/content/xul.css b/toolkit/content/xul.css
 | 
					diff --git a/toolkit/content/xul.css b/toolkit/content/xul.css
 | 
				
			||||||
index 134acec351c818eb824e2c98fa380d99ebaf8fac..3774893d98617634150f1f85568e212d98f9404c 100644
 | 
					index f730088432526521037a8933a6ee00af8c378f11..ef2bb2ecd364327a348602ff070814f653843081 100644
 | 
				
			||||||
--- a/toolkit/content/xul.css
 | 
					--- a/toolkit/content/xul.css
 | 
				
			||||||
+++ b/toolkit/content/xul.css
 | 
					+++ b/toolkit/content/xul.css
 | 
				
			||||||
@@ -468,7 +468,8 @@ deck > *|*:not(:-moz-native-anonymous) {
 | 
					@@ -446,7 +446,8 @@ deck > *|*:not(:-moz-native-anonymous) {
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 tabpanels > .deck-selected,
 | 
					 tabpanels > .deck-selected,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/toolkit/modules/AppConstants.sys.mjs b/toolkit/modules/AppConstants.sys.mjs
 | 
					diff --git a/toolkit/modules/AppConstants.sys.mjs b/toolkit/modules/AppConstants.sys.mjs
 | 
				
			||||||
index bf7a0ec9570a8657d192fd28c9b4852aa8869225..59f5466582757320ab1f70ec26d76fc589e0a335 100644
 | 
					index a794e82288d30c979f2d2798bded49fb4dd3118b..cd1875dc048607447e25d30341052a6930d1c08f 100644
 | 
				
			||||||
--- a/toolkit/modules/AppConstants.sys.mjs
 | 
					--- a/toolkit/modules/AppConstants.sys.mjs
 | 
				
			||||||
+++ b/toolkit/modules/AppConstants.sys.mjs
 | 
					+++ b/toolkit/modules/AppConstants.sys.mjs
 | 
				
			||||||
@@ -174,6 +174,8 @@ export var AppConstants = Object.freeze({
 | 
					@@ -172,6 +172,8 @@ export var AppConstants = Object.freeze({
 | 
				
			||||||
   MOZ_UPDATE_CHANNEL: "@MOZ_UPDATE_CHANNEL@",
 | 
					   MOZ_UPDATE_CHANNEL: "@MOZ_UPDATE_CHANNEL@",
 | 
				
			||||||
   MOZ_WIDGET_TOOLKIT: "@MOZ_WIDGET_TOOLKIT@",
 | 
					   MOZ_WIDGET_TOOLKIT: "@MOZ_WIDGET_TOOLKIT@",
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/toolkit/modules/moz.build b/toolkit/modules/moz.build
 | 
					diff --git a/toolkit/modules/moz.build b/toolkit/modules/moz.build
 | 
				
			||||||
index b7dd298c4ffa1b95531e3646d57a52e524fcf801..da23bcd2a8b4b49ce07f4602f5e624bf4bfbfc8d 100644
 | 
					index e6a9634bc5ae26a5bc82402a8a0f37e1fedc27ca..e27cab2a984b2d09033bc956df90519e01f683d7 100644
 | 
				
			||||||
--- a/toolkit/modules/moz.build
 | 
					--- a/toolkit/modules/moz.build
 | 
				
			||||||
+++ b/toolkit/modules/moz.build
 | 
					+++ b/toolkit/modules/moz.build
 | 
				
			||||||
@@ -282,6 +282,7 @@ for var in (
 | 
					@@ -277,6 +277,7 @@ for var in (
 | 
				
			||||||
     "DLL_SUFFIX",
 | 
					     "DLL_SUFFIX",
 | 
				
			||||||
     "DEBUG_JS_MODULES",
 | 
					     "DEBUG_JS_MODULES",
 | 
				
			||||||
     "OMNIJAR_NAME",
 | 
					     "OMNIJAR_NAME",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/toolkit/moz.configure b/toolkit/moz.configure
 | 
					diff --git a/toolkit/moz.configure b/toolkit/moz.configure
 | 
				
			||||||
index 09b3065c214ecceacb6f264cdacbb777252f33ea..97ee12093d6330ae9da4aa1bea2ecd5b76843110 100644
 | 
					index f9b96c0a62ae1e222eebeb6f8ca4fbf4c65703b4..6a439a22ee71a03709411fb8480278104d3996d1 100644
 | 
				
			||||||
--- a/toolkit/moz.configure
 | 
					--- a/toolkit/moz.configure
 | 
				
			||||||
+++ b/toolkit/moz.configure
 | 
					+++ b/toolkit/moz.configure
 | 
				
			||||||
@@ -22,6 +22,7 @@ def check_moz_app_id(moz_app_id, build_project):
 | 
					@@ -22,6 +22,7 @@ def check_moz_app_id(moz_app_id, build_project):
 | 
				
			||||||
@@ -33,7 +33,7 @@ index 09b3065c214ecceacb6f264cdacbb777252f33ea..97ee12093d6330ae9da4aa1bea2ecd5b
 | 
				
			|||||||
     help="Set distribution-specific id",
 | 
					     help="Set distribution-specific id",
 | 
				
			||||||
 )
 | 
					 )
 | 
				
			||||||
 set_config("MOZ_DISTRIBUTION_ID", depends("--with-distribution-id")(lambda v: v[0]))
 | 
					 set_config("MOZ_DISTRIBUTION_ID", depends("--with-distribution-id")(lambda v: v[0]))
 | 
				
			||||||
@@ -881,9 +886,9 @@ set_config("MOZ_SYSTEM_AV1", True, when="--with-system-av1")
 | 
					@@ -932,9 +937,9 @@ set_config("MOZ_SYSTEM_AV1", True, when="--with-system-av1")
 | 
				
			||||||
 option("--disable-jxl", help="Disable jxl image support")
 | 
					 option("--disable-jxl", help="Disable jxl image support")
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -46,7 +46,7 @@ index 09b3065c214ecceacb6f264cdacbb777252f33ea..97ee12093d6330ae9da4aa1bea2ecd5b
 | 
				
			|||||||
         return True
 | 
					         return True
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -2019,7 +2024,7 @@ set_define("A11Y_LOG", True, when=a11y_log)
 | 
					@@ -2060,7 +2065,7 @@ set_define("A11Y_LOG", True, when=a11y_log)
 | 
				
			||||||
 # ==============================================================
 | 
					 # ==============================================================
 | 
				
			||||||
 @depends(milestone)
 | 
					 @depends(milestone)
 | 
				
			||||||
 def require_signing(milestone):
 | 
					 def require_signing(milestone):
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/toolkit/mozapps/extensions/AddonManager.sys.mjs b/toolkit/mozapps/extensions/AddonManager.sys.mjs
 | 
					diff --git a/toolkit/mozapps/extensions/AddonManager.sys.mjs b/toolkit/mozapps/extensions/AddonManager.sys.mjs
 | 
				
			||||||
index 883e8389eec97815adfdb8c62fc15482f6d7f0e7..234c956ba799666a3cba6fd6dcdad774ffc6b79e 100644
 | 
					index e09ea87de86b06d1b505e59d4f0c4a090533ca71..9e8291ee5a83a686f3a129c3c6872bb7c84fdcd9 100644
 | 
				
			||||||
--- a/toolkit/mozapps/extensions/AddonManager.sys.mjs
 | 
					--- a/toolkit/mozapps/extensions/AddonManager.sys.mjs
 | 
				
			||||||
+++ b/toolkit/mozapps/extensions/AddonManager.sys.mjs
 | 
					+++ b/toolkit/mozapps/extensions/AddonManager.sys.mjs
 | 
				
			||||||
@@ -1221,12 +1221,12 @@ var AddonManagerInternal = {
 | 
					@@ -1221,12 +1221,12 @@ var AddonManagerInternal = {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
diff --git a/toolkit/mozapps/extensions/content/aboutaddons.html b/toolkit/mozapps/extensions/content/aboutaddons.html
 | 
					diff --git a/toolkit/mozapps/extensions/content/aboutaddons.html b/toolkit/mozapps/extensions/content/aboutaddons.html
 | 
				
			||||||
index 67808c799aca92a0c71731ab0c345bb478522368..5ddcbcecd43b2b04eb4c0e5b86eebd69b142a5a3 100644
 | 
					index 77702576f03cc8db7ec85bd871e6366fef935d54..edd5f27303802091c84572a7a2d3933c03cf09d9 100644
 | 
				
			||||||
--- a/toolkit/mozapps/extensions/content/aboutaddons.html
 | 
					--- a/toolkit/mozapps/extensions/content/aboutaddons.html
 | 
				
			||||||
+++ b/toolkit/mozapps/extensions/content/aboutaddons.html
 | 
					+++ b/toolkit/mozapps/extensions/content/aboutaddons.html
 | 
				
			||||||
@@ -82,6 +82,7 @@
 | 
					@@ -86,6 +86,7 @@
 | 
				
			||||||
       type="module"
 | 
					       type="module"
 | 
				
			||||||
       src="chrome://global/content/elements/moz-five-star.mjs"
 | 
					       src="chrome://global/content/elements/moz-five-star.mjs"
 | 
				
			||||||
     ></script>
 | 
					     ></script>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/toolkit/profile/nsToolkitProfileService.cpp b/toolkit/profile/nsToolkitProfileService.cpp
 | 
					diff --git a/toolkit/profile/nsToolkitProfileService.cpp b/toolkit/profile/nsToolkitProfileService.cpp
 | 
				
			||||||
index e6722fb8f379c3032301fc3c1c49d894a566c28a..f6c560bb3f2ffdba4eaed876f7679245235fde8c 100644
 | 
					index 4ebdcd3bd8739955972eab938f1f394e928503d2..f731ff5667bc5f615bb6a780c1cb6a6fb1cb6b48 100644
 | 
				
			||||||
--- a/toolkit/profile/nsToolkitProfileService.cpp
 | 
					--- a/toolkit/profile/nsToolkitProfileService.cpp
 | 
				
			||||||
+++ b/toolkit/profile/nsToolkitProfileService.cpp
 | 
					+++ b/toolkit/profile/nsToolkitProfileService.cpp
 | 
				
			||||||
@@ -82,6 +82,8 @@ using namespace mozilla;
 | 
					@@ -82,6 +82,8 @@ using namespace mozilla;
 | 
				
			||||||
@@ -11,7 +11,7 @@ index e6722fb8f379c3032301fc3c1c49d894a566c28a..f6c560bb3f2ffdba4eaed876f7679245
 | 
				
			|||||||
 struct KeyValue {
 | 
					 struct KeyValue {
 | 
				
			||||||
   KeyValue(const char* aKey, const char* aValue) : key(aKey), value(aValue) {}
 | 
					   KeyValue(const char* aKey, const char* aValue) : key(aKey), value(aValue) {}
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -1404,7 +1406,7 @@ nsresult nsToolkitProfileService::CreateDefaultProfile(
 | 
					@@ -1391,7 +1393,7 @@ nsresult nsToolkitProfileService::CreateDefaultProfile(
 | 
				
			||||||
   if (mUseDevEditionProfile) {
 | 
					   if (mUseDevEditionProfile) {
 | 
				
			||||||
     name.AssignLiteral(DEV_EDITION_NAME);
 | 
					     name.AssignLiteral(DEV_EDITION_NAME);
 | 
				
			||||||
   } else if (mUseDedicatedProfile) {
 | 
					   } else if (mUseDedicatedProfile) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,12 +0,0 @@
 | 
				
			|||||||
diff --git a/toolkit/themes/linux/global/menu.css b/toolkit/themes/linux/global/menu.css
 | 
					 | 
				
			||||||
index da47f78790a251bb573d992476dc5dac9a870857..6c7d6cbdaf3f0bd35a52c80785577a6bc0d55e29 100644
 | 
					 | 
				
			||||||
--- a/toolkit/themes/linux/global/menu.css
 | 
					 | 
				
			||||||
+++ b/toolkit/themes/linux/global/menu.css
 | 
					 | 
				
			||||||
@@ -52,7 +52,6 @@ menulist > menupopup > :is(menuitem, menucaption, menu) {
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 .menu-text {
 | 
					 | 
				
			||||||
   /* This is (18 + the size of end-padding on .menu-iconic-left)px */
 | 
					 | 
				
			||||||
-  margin-inline-start: 21px;
 | 
					 | 
				
			||||||
 }
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 .menu-accel,
 | 
					 | 
				
			||||||
@@ -1,19 +0,0 @@
 | 
				
			|||||||
diff --git a/toolkit/themes/shared/menu-shared.css b/toolkit/themes/shared/menu-shared.css
 | 
					 | 
				
			||||||
index 40b4fdd66cf54f9d16be2c78be1b003abbd91e60..6be265511e625f78551c07cf21234f47fba9ed1d 100644
 | 
					 | 
				
			||||||
--- a/toolkit/themes/shared/menu-shared.css
 | 
					 | 
				
			||||||
+++ b/toolkit/themes/shared/menu-shared.css
 | 
					 | 
				
			||||||
@@ -100,13 +100,7 @@ menucaption {
 | 
					 | 
				
			||||||
   list-style-image: none;
 | 
					 | 
				
			||||||
   max-width: 42em;
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
-  @media (-moz-platform: linux) {
 | 
					 | 
				
			||||||
-    padding: 4px 6px;
 | 
					 | 
				
			||||||
-  }
 | 
					 | 
				
			||||||
-
 | 
					 | 
				
			||||||
-  @media (-moz-platform: macos) {
 | 
					 | 
				
			||||||
-    padding: 3px 9px;
 | 
					 | 
				
			||||||
-  }
 | 
					 | 
				
			||||||
+  padding: 6px 5px;
 | 
					 | 
				
			||||||
 }
 | 
					 | 
				
			||||||
 
 | 
					 | 
				
			||||||
 menu,
 | 
					 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/toolkit/themes/shared/popup.css b/toolkit/themes/shared/popup.css
 | 
					diff --git a/toolkit/themes/shared/popup.css b/toolkit/themes/shared/popup.css
 | 
				
			||||||
index 5701d305fdfc0407ead51aa52eefee38e7429de8..642325e981e9597eaaefefa725852a49b49ee6dc 100644
 | 
					index efc623e403b9517ffe4ec557e7c777274c350a7a..14400c90334be37e53dfbb5e07efa983ef8fef40 100644
 | 
				
			||||||
--- a/toolkit/themes/shared/popup.css
 | 
					--- a/toolkit/themes/shared/popup.css
 | 
				
			||||||
+++ b/toolkit/themes/shared/popup.css
 | 
					+++ b/toolkit/themes/shared/popup.css
 | 
				
			||||||
@@ -22,8 +22,8 @@ panel {
 | 
					@@ -22,8 +22,8 @@ panel {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/tools/signing/macos/mach_commands.py b/tools/signing/macos/mach_commands.py
 | 
					diff --git a/tools/signing/macos/mach_commands.py b/tools/signing/macos/mach_commands.py
 | 
				
			||||||
index a513ad723805459c194d27b42dac68e9babba468..3a08bb0987f9d6cf01c05f8ebb56efa91a5b9d0e 100644
 | 
					index 454a9bbc35802fbf811065e8e1ca592674016bb3..d6b0cf119664e0534a3898f72ffbcd3aade9c89d 100644
 | 
				
			||||||
--- a/tools/signing/macos/mach_commands.py
 | 
					--- a/tools/signing/macos/mach_commands.py
 | 
				
			||||||
+++ b/tools/signing/macos/mach_commands.py
 | 
					+++ b/tools/signing/macos/mach_commands.py
 | 
				
			||||||
@@ -37,7 +37,6 @@ from mozbuild.base import MachCommandConditions as conditions
 | 
					@@ -37,7 +37,6 @@ from mozbuild.base import MachCommandConditions as conditions
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
diff --git a/xpfe/appshell/AppWindow.cpp b/xpfe/appshell/AppWindow.cpp
 | 
					diff --git a/xpfe/appshell/AppWindow.cpp b/xpfe/appshell/AppWindow.cpp
 | 
				
			||||||
index a5e57d3086c57c4307b2c93b2814064d752d08ed..d0a83dd574ed03028ad3e79f8f0fba868bb5bec1 100644
 | 
					index 22dbf9028167d5555a91c7087040a1909a27e2a2..356b9722a1a4815f5fdde0ff13bf8f89d7f26f87 100644
 | 
				
			||||||
--- a/xpfe/appshell/AppWindow.cpp
 | 
					--- a/xpfe/appshell/AppWindow.cpp
 | 
				
			||||||
+++ b/xpfe/appshell/AppWindow.cpp
 | 
					+++ b/xpfe/appshell/AppWindow.cpp
 | 
				
			||||||
@@ -1866,7 +1866,7 @@ nsresult AppWindow::MaybeSaveEarlyWindowPersistentValues(
 | 
					@@ -1866,7 +1866,7 @@ nsresult AppWindow::MaybeSaveEarlyWindowPersistentValues(
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								src/zen/@types/lib.gecko.darwin.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								src/zen/@types/lib.gecko.darwin.d.ts
									
									
									
									
										vendored
									
									
								
							@@ -1,3 +1,6 @@
 | 
				
			|||||||
 | 
					// This Source Code Form is subject to the terms of the Mozilla Public
 | 
				
			||||||
 | 
					// License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
				
			||||||
 | 
					// file, You can obtain one at http://mozilla.org/MPL/2.0/.
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * NOTE: Do not modify this file by hand.
 | 
					 * NOTE: Do not modify this file by hand.
 | 
				
			||||||
 * Content was generated from source XPCOM .idl files.
 | 
					 * Content was generated from source XPCOM .idl files.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								src/zen/@types/lib.gecko.dom.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								src/zen/@types/lib.gecko.dom.d.ts
									
									
									
									
										vendored
									
									
								
							@@ -1,3 +1,6 @@
 | 
				
			|||||||
 | 
					// This Source Code Form is subject to the terms of the Mozilla Public
 | 
				
			||||||
 | 
					// License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
				
			||||||
 | 
					// file, You can obtain one at http://mozilla.org/MPL/2.0/.
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * NOTE: Do not modify this file by hand.
 | 
					 * NOTE: Do not modify this file by hand.
 | 
				
			||||||
 * Content was generated from source .webidl files.
 | 
					 * Content was generated from source .webidl files.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								src/zen/@types/lib.gecko.glean.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								src/zen/@types/lib.gecko.glean.d.ts
									
									
									
									
										vendored
									
									
								
							@@ -1,3 +1,6 @@
 | 
				
			|||||||
 | 
					// This Source Code Form is subject to the terms of the Mozilla Public
 | 
				
			||||||
 | 
					// License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
				
			||||||
 | 
					// file, You can obtain one at http://mozilla.org/MPL/2.0/.
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * NOTE: Do not modify this file by hand.
 | 
					 * NOTE: Do not modify this file by hand.
 | 
				
			||||||
 * Content was generated from source metrics.yaml files.
 | 
					 * Content was generated from source metrics.yaml files.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								src/zen/@types/lib.gecko.linux.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								src/zen/@types/lib.gecko.linux.d.ts
									
									
									
									
										vendored
									
									
								
							@@ -1,3 +1,6 @@
 | 
				
			|||||||
 | 
					// This Source Code Form is subject to the terms of the Mozilla Public
 | 
				
			||||||
 | 
					// License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
				
			||||||
 | 
					// file, You can obtain one at http://mozilla.org/MPL/2.0/.
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * NOTE: Do not modify this file by hand.
 | 
					 * NOTE: Do not modify this file by hand.
 | 
				
			||||||
 * Content was generated from source XPCOM .idl files.
 | 
					 * Content was generated from source XPCOM .idl files.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								src/zen/@types/lib.gecko.modules.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								src/zen/@types/lib.gecko.modules.d.ts
									
									
									
									
										vendored
									
									
								
							@@ -1,3 +1,6 @@
 | 
				
			|||||||
 | 
					// This Source Code Form is subject to the terms of the Mozilla Public
 | 
				
			||||||
 | 
					// License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
				
			||||||
 | 
					// file, You can obtain one at http://mozilla.org/MPL/2.0/.
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * NOTE: Do not modify this file by hand.
 | 
					 * NOTE: Do not modify this file by hand.
 | 
				
			||||||
 * Content was generated by running "mach ts paths".
 | 
					 * Content was generated by running "mach ts paths".
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								src/zen/@types/lib.gecko.nsresult.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								src/zen/@types/lib.gecko.nsresult.d.ts
									
									
									
									
										vendored
									
									
								
							@@ -1,3 +1,6 @@
 | 
				
			|||||||
 | 
					// This Source Code Form is subject to the terms of the Mozilla Public
 | 
				
			||||||
 | 
					// License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
				
			||||||
 | 
					// file, You can obtain one at http://mozilla.org/MPL/2.0/.
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * NOTE: Do not modify this file by hand.
 | 
					 * NOTE: Do not modify this file by hand.
 | 
				
			||||||
 * Content was generated from xpc.msg and error_list.json.
 | 
					 * Content was generated from xpc.msg and error_list.json.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										3
									
								
								src/zen/@types/lib.gecko.services.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								src/zen/@types/lib.gecko.services.d.ts
									
									
									
									
										vendored
									
									
								
							@@ -1,3 +1,6 @@
 | 
				
			|||||||
 | 
					// This Source Code Form is subject to the terms of the Mozilla Public
 | 
				
			||||||
 | 
					// License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
				
			||||||
 | 
					// file, You can obtain one at http://mozilla.org/MPL/2.0/.
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * NOTE: Do not modify this file by hand.
 | 
					 * NOTE: Do not modify this file by hand.
 | 
				
			||||||
 * Content was generated from services.json.
 | 
					 * Content was generated from services.json.
 | 
				
			||||||
 
 | 
				
			|||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user