mirror of
				https://github.com/zen-browser/desktop.git
				synced 2025-11-04 01:34:35 +00:00 
			
		
		
		
	Compare commits
	
		
			367 Commits
		
	
	
		
			1.12b
			...
			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 | ||
| 
						 | 
					f40b780b95 | ||
| 
						 | 
					0f37364586 | ||
| 
						 | 
					8cfff0e0bd | ||
| 
						 | 
					e61963454c | ||
| 
						 | 
					eac698d846 | ||
| 
						 | 
					b536f98d94 | ||
| 
						 | 
					469f94bddf | ||
| 
						 | 
					7af0c64c30 | ||
| 
						 | 
					8e6808ea61 | ||
| 
						 | 
					153c0e2fc5 | ||
| 
						 | 
					b18e946869 | ||
| 
						 | 
					e3a341c88d | ||
| 
						 | 
					7671266633 | ||
| 
						 | 
					1e1f02c764 | ||
| 
						 | 
					d3ec41d73f | ||
| 
						 | 
					9982b1af34 | ||
| 
						 | 
					133cce8bf8 | ||
| 
						 | 
					bb78fc165b | ||
| 
						 | 
					adfc235865 | ||
| 
						 | 
					0392d60352 | ||
| 
						 | 
					53ea662ef7 | ||
| 
						 | 
					7a846fa458 | ||
| 
						 | 
					273d7ce5d5 | ||
| 
						 | 
					c378bf3842 | ||
| 
						 | 
					e4de07d773 | ||
| 
						 | 
					6dfb05e242 | ||
| 
						 | 
					3e9d98233c | ||
| 
						 | 
					8536634fa4 | ||
| 
						 | 
					23b17b2635 | ||
| 
						 | 
					afcf49b25d | ||
| 
						 | 
					c54ad93db6 | ||
| 
						 | 
					8d99a97a9e | ||
| 
						 | 
					66003832b2 | ||
| 
						 | 
					32b7af5834 | ||
| 
						 | 
					b4f61e48de | ||
| 
						 | 
					97e76a9cf2 | ||
| 
						 | 
					52bfac98be | ||
| 
						 | 
					0ebe4b4f0a | ||
| 
						 | 
					1561525d47 | ||
| 
						 | 
					d9c9e74cc8 | ||
| 
						 | 
					e3193c54f4 | ||
| 
						 | 
					90b0849308 | ||
| 
						 | 
					01e3cc1374 | ||
| 
						 | 
					e5294908ec | ||
| 
						 | 
					3ed15335fe | ||
| 
						 | 
					094fbb4ec8 | ||
| 
						 | 
					190f1f0cb5 | ||
| 
						 | 
					d908700a9c | ||
| 
						 | 
					b669f81926 | ||
| 
						 | 
					76c22cc896 | ||
| 
						 | 
					d0d78d2953 | ||
| 
						 | 
					8b5e26759f | ||
| 
						 | 
					e4eb6d6fdd | ||
| 
						 | 
					1a0ce0df7c | ||
| 
						 | 
					c95f0fce88 | ||
| 
						 | 
					2abd23b344 | ||
| 
						 | 
					ccb1bc521c | ||
| 
						 | 
					26163c62da | ||
| 
						 | 
					8818d45d05 | ||
| 
						 | 
					46941fe25a | ||
| 
						 | 
					44ffc842d3 | ||
| 
						 | 
					4641b8b590 | ||
| 
						 | 
					148a5eebc2 | ||
| 
						 | 
					523c1fadbc | ||
| 
						 | 
					820652bd5e | ||
| 
						 | 
					246e3b25a4 | ||
| 
						 | 
					fe0e5a9101 | ||
| 
						 | 
					d9a6bb5b2d | ||
| 
						 | 
					c9f632c1b8 | ||
| 
						 | 
					ab69ab8f80 | ||
| 
						 | 
					297a95986c | ||
| 
						 | 
					7c1bdbfa68 | ||
| 
						 | 
					e712e8204d | ||
| 
						 | 
					8e28e1a630 | ||
| 
						 | 
					6d1742761c | ||
| 
						 | 
					1c84a32a3c | ||
| 
						 | 
					b07824489b | ||
| 
						 | 
					619a8d39be | ||
| 
						 | 
					9b8195d666 | ||
| 
						 | 
					22d04ad729 | ||
| 
						 | 
					bac3e38318 | ||
| 
						 | 
					1d8e0fc3d7 | ||
| 
						 | 
					086d1633df | ||
| 
						 | 
					b260942e22 | ||
| 
						 | 
					d7bf8b24fd | ||
| 
						 | 
					0ded78eb06 | ||
| 
						 | 
					c2d484a725 | ||
| 
						 | 
					7ca3a9e377 | ||
| 
						 | 
					2bd548fe41 | ||
| 
						 | 
					d9d3076e2e | ||
| 
						 | 
					b8254fdd36 | ||
| 
						 | 
					562274a161 | ||
| 
						 | 
					19f96241e5 | ||
| 
						 | 
					d735a1fa91 | ||
| 
						 | 
					40baf2627c | ||
| 
						 | 
					5880636b3a | ||
| 
						 | 
					531f569f3a | ||
| 
						 | 
					00fcd74552 | ||
| 
						 | 
					f594a0b5c0 | ||
| 
						 | 
					94779133ec | ||
| 
						 | 
					a2b1b38e0c | ||
| 
						 | 
					cd3823f180 | ||
| 
						 | 
					8451a71af7 | ||
| 
						 | 
					455a2c005b | ||
| 
						 | 
					4ad29e0ca5 | ||
| 
						 | 
					52b19fc137 | ||
| 
						 | 
					7958417f96 | ||
| 
						 | 
					744618ac25 | ||
| 
						 | 
					07296f19a6 | ||
| 
						 | 
					db271db087 | ||
| 
						 | 
					d30a24e768 | ||
| 
						 | 
					2b359ea451 | ||
| 
						 | 
					8af3faea16 | ||
| 
						 | 
					0c5716fb81 | ||
| 
						 | 
					d19a484cb0 | ||
| 
						 | 
					38bf9bebc8 | ||
| 
						 | 
					d79b89f79b | ||
| 
						 | 
					7855d657fd | ||
| 
						 | 
					67a52ae02c | ||
| 
						 | 
					4b14c1e2f8 | ||
| 
						 | 
					fc908f9d4a | ||
| 
						 | 
					77bc3ced5d | ||
| 
						 | 
					34dc835631 | ||
| 
						 | 
					81b279be5f | ||
| 
						 | 
					828c7bea19 | ||
| 
						 | 
					b4a49636d7 | ||
| 
						 | 
					1caa6d9aa5 | ||
| 
						 | 
					ecc6df3301 | ||
| 
						 | 
					0310e89c39 | ||
| 
						 | 
					252af87d9b | ||
| 
						 | 
					6732a69c2b | ||
| 
						 | 
					3868f8e30f | ||
| 
						 | 
					937408f3f6 | ||
| 
						 | 
					e53a95e297 | ||
| 
						 | 
					b74153290b | ||
| 
						 | 
					0021c3522f | ||
| 
						 | 
					367ad74fba | ||
| 
						 | 
					0abf17cb6b | ||
| 
						 | 
					be76e751e7 | ||
| 
						 | 
					f8a893e6de | ||
| 
						 | 
					89dfc86bfb | ||
| 
						 | 
					bc894f8beb | ||
| 
						 | 
					20120ecf27 | ||
| 
						 | 
					a9c344d385 | ||
| 
						 | 
					3cbfae7a8f | ||
| 
						 | 
					90876532b9 | ||
| 
						 | 
					641d4d0f87 | ||
| 
						 | 
					7c12ad72b8 | ||
| 
						 | 
					66e0dde1ed | ||
| 
						 | 
					5a4877a141 | ||
| 
						 | 
					f9b0f8c436 | ||
| 
						 | 
					6552ec5f02 | ||
| 
						 | 
					337b1aec53 | ||
| 
						 | 
					33fff9e19b | ||
| 
						 | 
					2cdaf4850d | ||
| 
						 | 
					561da4b6ef | ||
| 
						 | 
					3a8767ea5f | ||
| 
						 | 
					4947b4c9a3 | ||
| 
						 | 
					0f140b706e | ||
| 
						 | 
					b4812e8182 | ||
| 
						 | 
					7d94cad876 | ||
| 
						 | 
					866e6987a2 | ||
| 
						 | 
					524f34a461 | ||
| 
						 | 
					949d93d546 | ||
| 
						 | 
					bd638022df | ||
| 
						 | 
					26e6d704f5 | ||
| 
						 | 
					1be8b20b64 | ||
| 
						 | 
					c8150ccdcc | ||
| 
						 | 
					77bac52b07 | ||
| 
						 | 
					3566289cb5 | ||
| 
						 | 
					0b34cc3033 | ||
| 
						 | 
					fdb71c6b0e | ||
| 
						 | 
					ffea12305d | ||
| 
						 | 
					e90f20e1d4 | ||
| 
						 | 
					f58dbd71b6 | ||
| 
						 | 
					b4c7a64631 | ||
| 
						 | 
					e496655953 | ||
| 
						 | 
					fea0e9b864 | ||
| 
						 | 
					7a7fb01928 | ||
| 
						 | 
					d4575841df | ||
| 
						 | 
					d7e634fcfd | ||
| 
						 | 
					b1e3df783d | ||
| 
						 | 
					80dfcf5eaa | ||
| 
						 | 
					c0d66ee649 | ||
| 
						 | 
					93e8f6bbd6 | ||
| 
						 | 
					cdbdaac913 | ||
| 
						 | 
					9bec7a88fe | ||
| 
						 | 
					50342e945d | ||
| 
						 | 
					c087493f38 | ||
| 
						 | 
					df3c554f27 | ||
| 
						 | 
					e81994a748 | ||
| 
						 | 
					0d1d75588d | ||
| 
						 | 
					5ddedbbd50 | ||
| 
						 | 
					fcc823c33a | ||
| 
						 | 
					1a7f9d9ee0 | ||
| 
						 | 
					1a2b527070 | ||
| 
						 | 
					39a357fa57 | ||
| 
						 | 
					d2c50df0ab | ||
| 
						 | 
					5dc30c44ff | ||
| 
						 | 
					01d705a3b5 | ||
| 
						 | 
					fff86fd068 | ||
| 
						 | 
					0fb9b51cc9 | ||
| 
						 | 
					bda91cd9d5 | ||
| 
						 | 
					0343430611 | ||
| 
						 | 
					1df7da7836 | ||
| 
						 | 
					dc018561a0 | ||
| 
						 | 
					520b41215c | ||
| 
						 | 
					3537680e45 | ||
| 
						 | 
					d236035b72 | ||
| 
						 | 
					e2e742aba2 | ||
| 
						 | 
					3d8fc203f9 | ||
| 
						 | 
					7b99f227cd | ||
| 
						 | 
					1f68a45417 | ||
| 
						 | 
					cc1619ab5d | ||
| 
						 | 
					5c30c83341 | ||
| 
						 | 
					d788ac4ad6 | ||
| 
						 | 
					826802df21 | ||
| 
						 | 
					3b4f96ab2f | ||
| 
						 | 
					5a59eb6902 | ||
| 
						 | 
					64293af6f7 | ||
| 
						 | 
					8afd08a3d9 | ||
| 
						 | 
					6a21a6fdb1 | ||
| 
						 | 
					3e53787a62 | ||
| 
						 | 
					9823353d8b | ||
| 
						 | 
					d189221f10 | ||
| 
						 | 
					271fa03cfc | ||
| 
						 | 
					1fc2299801 | ||
| 
						 | 
					7df278f7ed | ||
| 
						 | 
					2f68f77f87 | ||
| 
						 | 
					49a3974b34 | ||
| 
						 | 
					7a00f3c67c | ||
| 
						 | 
					e079732686 | ||
| 
						 | 
					71f2680eef | ||
| 
						 | 
					808a376c65 | ||
| 
						 | 
					eff7cfc5fe | ||
| 
						 | 
					bbb6ba4078 | ||
| 
						 | 
					c10131aca8 | ||
| 
						 | 
					49159a6d5c | ||
| 
						 | 
					d80ba6b058 | ||
| 
						 | 
					f2e188a86c | ||
| 
						 | 
					2f03446c37 | ||
| 
						 | 
					039b7ca85c | ||
| 
						 | 
					507b27dbda | ||
| 
						 | 
					78f54895e2 | ||
| 
						 | 
					4ca172d40f | ||
| 
						 | 
					81774ad352 | ||
| 
						 | 
					ad32b31904 | ||
| 
						 | 
					414bafde9c | ||
| 
						 | 
					be1d8ec408 | ||
| 
						 | 
					7f4effe4b6 | ||
| 
						 | 
					7ca3396c8b | ||
| 
						 | 
					853c204746 | ||
| 
						 | 
					a22c5085d9 | ||
| 
						 | 
					1021a78f46 | ||
| 
						 | 
					637747ab53 | ||
| 
						 | 
					15b8385e49 | ||
| 
						 | 
					27d3b903d3 | ||
| 
						 | 
					70b9f66f4c | ||
| 
						 | 
					019779e425 | ||
| 
						 | 
					951ff28688 | ||
| 
						 | 
					d394702606 | ||
| 
						 | 
					6f88c5d2d1 | ||
| 
						 | 
					53332937c2 | ||
| 
						 | 
					a79678a0cb | ||
| 
						 | 
					f16b0526af | ||
| 
						 | 
					808e186dae | ||
| 
						 | 
					0a39cdef7c | ||
| 
						 | 
					8a042cb110 | ||
| 
						 | 
					2942ab3c08 | ||
| 
						 | 
					1d269e9203 | ||
| 
						 | 
					def0ed7a52 | ||
| 
						 | 
					9d7c33228f | ||
| 
						 | 
					54d5a747ba | ||
| 
						 | 
					3b4c2f6d76 | ||
| 
						 | 
					7968b79039 | ||
| 
						 | 
					4c02f76187 | ||
| 
						 | 
					ec90027c5e | ||
| 
						 | 
					0588dbfd64 | ||
| 
						 | 
					293c6b1de2 | ||
| 
						 | 
					3f2dd0a60c | ||
| 
						 | 
					89404cc649 | ||
| 
						 | 
					2ade4030c8 | ||
| 
						 | 
					7c81063b90 | ||
| 
						 | 
					786903d57c | ||
| 
						 | 
					395cc0a19d | ||
| 
						 | 
					cc2c9044f3 | ||
| 
						 | 
					d816bca7e0 | ||
| 
						 | 
					87bcd7ccfb | ||
| 
						 | 
					a9f136ae8a | ||
| 
						 | 
					ef3b61ded7 | ||
| 
						 | 
					c9d8623e4a | ||
| 
						 | 
					13923b84f2 | ||
| 
						 | 
					05df28ae72 | ||
| 
						 | 
					f75e74b678 | ||
| 
						 | 
					123cbfa644 | ||
| 
						 | 
					5cc13cf77f | ||
| 
						 | 
					56275abbaf | ||
| 
						 | 
					6ccbdcbdfa | ||
| 
						 | 
					ebbec7f0b2 | ||
| 
						 | 
					a7d0719877 | ||
| 
						 | 
					1831e3e2fa | ||
| 
						 | 
					fc2c119b94 | ||
| 
						 | 
					163b276f7e | ||
| 
						 | 
					72ab38b9af | ||
| 
						 | 
					991437ab2f | ||
| 
						 | 
					57679238de | ||
| 
						 | 
					2550b2fe41 | 
							
								
								
									
										2
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							@@ -1,2 +1,4 @@
 | 
			
		||||
*.patch linguist-language=C++
 | 
			
		||||
*.d.ts linguist-language=TypeScript
 | 
			
		||||
 | 
			
		||||
src/zen/tests/*.js linguist-language=Test
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										16
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							@@ -475,7 +475,18 @@ jobs:
 | 
			
		||||
    if: ${{ inputs.create_release || inputs.update_branch == 'twilight' }}
 | 
			
		||||
    permissions: write-all
 | 
			
		||||
    name: Release
 | 
			
		||||
    needs: [build-data, linux, windows-step-3, check-release, mac-uni, appimage, source, lint, stop-self-hosted]
 | 
			
		||||
    needs:
 | 
			
		||||
      [
 | 
			
		||||
        build-data,
 | 
			
		||||
        linux,
 | 
			
		||||
        windows-step-3,
 | 
			
		||||
        check-release,
 | 
			
		||||
        mac-uni,
 | 
			
		||||
        appimage,
 | 
			
		||||
        source,
 | 
			
		||||
        lint,
 | 
			
		||||
        stop-self-hosted,
 | 
			
		||||
      ]
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    environment:
 | 
			
		||||
      name: ${{ inputs.update_branch == 'release' && 'Deploy-Release' || 'Deploy-Twilight' }}
 | 
			
		||||
@@ -490,9 +501,6 @@ jobs:
 | 
			
		||||
      - name: Download artifact
 | 
			
		||||
        uses: actions/download-artifact@v4
 | 
			
		||||
 | 
			
		||||
      - name: List
 | 
			
		||||
        run: find .
 | 
			
		||||
 | 
			
		||||
      - name: Checkout updates repository
 | 
			
		||||
        uses: actions/checkout@v4
 | 
			
		||||
        with:
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,9 @@ on:
 | 
			
		||||
    - cron: '59 4 * * 2'
 | 
			
		||||
  workflow_dispatch:
 | 
			
		||||
 | 
			
		||||
permissions:
 | 
			
		||||
  contents: read
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  check_candidates:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								.github/workflows/code-linter.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/code-linter.yml
									
									
									
									
										vendored
									
									
								
							@@ -10,6 +10,9 @@ on:
 | 
			
		||||
    branches:
 | 
			
		||||
      - dev
 | 
			
		||||
 | 
			
		||||
permissions:
 | 
			
		||||
  contents: read
 | 
			
		||||
 | 
			
		||||
jobs:
 | 
			
		||||
  lint:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								.github/workflows/issue-metrics.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								.github/workflows/issue-metrics.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,4 +1,7 @@
 | 
			
		||||
name: Monthly issue metrics
 | 
			
		||||
permissions:
 | 
			
		||||
  contents: write
 | 
			
		||||
  issues: read
 | 
			
		||||
on:
 | 
			
		||||
  workflow_dispatch:
 | 
			
		||||
  schedule:
 | 
			
		||||
@@ -59,6 +62,6 @@ jobs:
 | 
			
		||||
      - name: Commit changes
 | 
			
		||||
        uses: stefanzweifel/git-auto-commit-action@v5
 | 
			
		||||
        with:
 | 
			
		||||
          commit_message: 'Update monthly issue metrics'
 | 
			
		||||
          commit_message: 'docs: Update monthly issue metrics, b=(no bug), c={docs}'
 | 
			
		||||
          commit_user_name: Zen Browser Robot
 | 
			
		||||
          commit_user_email: zen-browser-auto@users.noreply.github.com
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								.github/workflows/macos-release-build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/macos-release-build.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,4 +1,6 @@
 | 
			
		||||
name: macOS Release Build
 | 
			
		||||
permissions:
 | 
			
		||||
  contents: read
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  workflow_call:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								.github/workflows/pr-test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/pr-test.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,4 +1,6 @@
 | 
			
		||||
name: Pull request test
 | 
			
		||||
permissions:
 | 
			
		||||
  contents: read
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  pull_request:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								.github/workflows/windows-profile-build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/windows-profile-build.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,5 +1,8 @@
 | 
			
		||||
name: Windows PGO Builds
 | 
			
		||||
 | 
			
		||||
permissions:
 | 
			
		||||
  contents: read
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  workflow_call:
 | 
			
		||||
    inputs:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								.github/workflows/windows-release-build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.github/workflows/windows-release-build.yml
									
									
									
									
										vendored
									
									
								
							@@ -1,5 +1,8 @@
 | 
			
		||||
name: Windows Release Build
 | 
			
		||||
 | 
			
		||||
permissions:
 | 
			
		||||
  contents: read
 | 
			
		||||
 | 
			
		||||
on:
 | 
			
		||||
  workflow_call:
 | 
			
		||||
    inputs:
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,8 @@ engine/
 | 
			
		||||
 | 
			
		||||
**/*.svg
 | 
			
		||||
 | 
			
		||||
**/*.inc.css
 | 
			
		||||
 | 
			
		||||
surfer.json
 | 
			
		||||
 | 
			
		||||
src/browser/app/profile/*.js
 | 
			
		||||
@@ -26,4 +28,6 @@ src/zen/tabs/zen-tabs.css
 | 
			
		||||
src/zen/compact-mode/zen-compact-mode.css
 | 
			
		||||
src/zen/common/ZenEmojies.mjs
 | 
			
		||||
 | 
			
		||||
src/zen/workspaces/zen-workspaces.css
 | 
			
		||||
 | 
			
		||||
*.inc
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,6 @@
 | 
			
		||||
  "useTabs": false,
 | 
			
		||||
  "jsxSingleQuote": false,
 | 
			
		||||
  "semi": true,
 | 
			
		||||
  "printWidth": 128,
 | 
			
		||||
  "printWidth": 100,
 | 
			
		||||
  "plugins": ["prettier-plugin-sh"]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										31
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										31
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							@@ -1,31 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "files.associations": {
 | 
			
		||||
    "*.inc": "cpp",
 | 
			
		||||
    "typeindex": "cpp",
 | 
			
		||||
    "typeinfo": "cpp",
 | 
			
		||||
    "functional": "cpp",
 | 
			
		||||
    "array": "cpp",
 | 
			
		||||
    "*.tcc": "cpp",
 | 
			
		||||
    "memory": "cpp",
 | 
			
		||||
    "future": "cpp",
 | 
			
		||||
    "istream": "cpp",
 | 
			
		||||
    "tuple": "cpp",
 | 
			
		||||
    "utility": "cpp",
 | 
			
		||||
    "variant": "cpp",
 | 
			
		||||
    "compare": "cpp",
 | 
			
		||||
    "thread": "cpp",
 | 
			
		||||
    "string": "cpp",
 | 
			
		||||
    "string_view": "cpp",
 | 
			
		||||
    "span": "cpp",
 | 
			
		||||
    "vector": "cpp",
 | 
			
		||||
    "charconv": "cpp",
 | 
			
		||||
    "chrono": "cpp",
 | 
			
		||||
    "optional": "cpp",
 | 
			
		||||
    "format": "cpp",
 | 
			
		||||
    "ratio": "cpp",
 | 
			
		||||
    "system_error": "cpp",
 | 
			
		||||
    "regex": "cpp",
 | 
			
		||||
    "type_traits": "cpp"
 | 
			
		||||
  },
 | 
			
		||||
  "git.ignoreLimitWarning": true
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								.well-known/funding-manifest-urls
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.well-known/funding-manifest-urls
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
https://zen-browser.app/funding.json
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
<!-- TODO: Get a job -->
 | 
			
		||||
<img src="./docs/assets/zen-dark.svg" width="100px" align="left">
 | 
			
		||||
 | 
			
		||||
### `Zen Browser`
 | 
			
		||||
@@ -28,9 +29,9 @@
 | 
			
		||||
 | 
			
		||||
## 🖥️ Compatibility
 | 
			
		||||
 | 
			
		||||
Zen is currently built using Firefox version `138.0.1`! 🚀
 | 
			
		||||
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.1`!
 | 
			
		||||
- [`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)!
 | 
			
		||||
- 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!
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								SECURITY.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								SECURITY.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
# Security Policy
 | 
			
		||||
 | 
			
		||||
## Reporting a Vulnerability
 | 
			
		||||
 | 
			
		||||
Please report security vulnerabilities [here](https://github.com/zen-browser/desktop/security/advisories/new)
 | 
			
		||||
@@ -1 +1 @@
 | 
			
		||||
8113a66aeeec42dca9739c7b742a3408cb5b7cf7
 | 
			
		||||
da30619f3ea895b356ded705b8dff9e4f271198f
 | 
			
		||||
@@ -30,8 +30,8 @@ Start-Job -Name "DownloadGitl10n" -ScriptBlock {
 | 
			
		||||
Start-Job -Name "SurferInit" -ScriptBlock {
 | 
			
		||||
    param($PWD)
 | 
			
		||||
    cd $PWD
 | 
			
		||||
    surfer -- ci --brand release
 | 
			
		||||
    npm run import -- --verbose
 | 
			
		||||
    npm run surfer -- ci --brand release
 | 
			
		||||
} -Verbose -ArgumentList $PWD -Debug
 | 
			
		||||
 | 
			
		||||
echo "Downloading artifacts info"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								l10n
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								l10n
									
									
									
									
									
								
							 Submodule l10n updated: 9a673b4339...ebecb32da8
									
								
							
							
								
								
									
										524
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										524
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -9,7 +9,7 @@
 | 
			
		||||
      "version": "1.0.0",
 | 
			
		||||
      "license": "MPL-2.0",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@zen-browser/surfer": "^1.11.11"
 | 
			
		||||
        "@zen-browser/surfer": "^1.11.13"
 | 
			
		||||
      },
 | 
			
		||||
      "devDependencies": {
 | 
			
		||||
        "@babel/preset-typescript": "^7.27.0",
 | 
			
		||||
@@ -817,14 +817,14 @@
 | 
			
		||||
      "license": "MIT"
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/@zen-browser/surfer": {
 | 
			
		||||
      "version": "1.11.11",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.11.11.tgz",
 | 
			
		||||
      "integrity": "sha512-n5t25jjG77/rg1HETQBloriCc4GVlHaGWDTNdOxU35Y2qqokcSU+3mPP2cy8u/GBfF0AS6YQmCjE2636tbZkRA==",
 | 
			
		||||
      "version": "1.11.13",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.11.13.tgz",
 | 
			
		||||
      "integrity": "sha512-D0TyunAWYtTdJkuUkYeOc6VBXzE9aoDs58kWu/Oi/aU3vd8IbqXPbZZfYwj5FWPWDReMrJUNkkKAEdbL44y9aw==",
 | 
			
		||||
      "license": "MPL-2.0",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@resvg/resvg-js": "^1.4.0",
 | 
			
		||||
        "async-icns": "^1.0.2",
 | 
			
		||||
        "axios": "^0.21.1",
 | 
			
		||||
        "axios": "^0.30.0",
 | 
			
		||||
        "chalk": "^4.1.0",
 | 
			
		||||
        "cli-progress": "^3.9.1",
 | 
			
		||||
        "commander": "^6.2.1",
 | 
			
		||||
@@ -841,7 +841,7 @@
 | 
			
		||||
        "prompts": "^2.4.1",
 | 
			
		||||
        "rustic": "^1.2.1",
 | 
			
		||||
        "semver": "^7.3.7",
 | 
			
		||||
        "sharp": "^0.30.7",
 | 
			
		||||
        "sharp": "^0.32.6",
 | 
			
		||||
        "tiny-glob": "^0.2.9",
 | 
			
		||||
        "xmlbuilder2": "^3.0.2"
 | 
			
		||||
      },
 | 
			
		||||
@@ -942,13 +942,99 @@
 | 
			
		||||
        "node": "^12.20.0 || >=14"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/asynckit": {
 | 
			
		||||
      "version": "0.4.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
 | 
			
		||||
      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
 | 
			
		||||
      "license": "MIT"
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/axios": {
 | 
			
		||||
      "version": "0.21.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
 | 
			
		||||
      "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
 | 
			
		||||
      "version": "0.30.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/axios/-/axios-0.30.0.tgz",
 | 
			
		||||
      "integrity": "sha512-Z4F3LjCgfjZz8BMYalWdMgAQUnEtKDmpwNHjh/C8pQZWde32TF64cqnSeyL3xD/aTIASRU30RHTNzRiV/NpGMg==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "follow-redirects": "^1.14.0"
 | 
			
		||||
        "follow-redirects": "^1.15.4",
 | 
			
		||||
        "form-data": "^4.0.0",
 | 
			
		||||
        "proxy-from-env": "^1.1.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/b4a": {
 | 
			
		||||
      "version": "1.6.7",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz",
 | 
			
		||||
      "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==",
 | 
			
		||||
      "license": "Apache-2.0"
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/bare-events": {
 | 
			
		||||
      "version": "2.5.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz",
 | 
			
		||||
      "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==",
 | 
			
		||||
      "license": "Apache-2.0",
 | 
			
		||||
      "optional": true
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/bare-fs": {
 | 
			
		||||
      "version": "4.1.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.4.tgz",
 | 
			
		||||
      "integrity": "sha512-r8+26Voz8dGX3AYpJdFb1ZPaUSM8XOLCZvy+YGpRTmwPHIxA7Z3Jov/oMPtV7hfRQbOnH8qGlLTzQAbgtdNN0Q==",
 | 
			
		||||
      "license": "Apache-2.0",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "bare-events": "^2.5.4",
 | 
			
		||||
        "bare-path": "^3.0.0",
 | 
			
		||||
        "bare-stream": "^2.6.4"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "bare": ">=1.16.0"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependencies": {
 | 
			
		||||
        "bare-buffer": "*"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependenciesMeta": {
 | 
			
		||||
        "bare-buffer": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/bare-os": {
 | 
			
		||||
      "version": "3.6.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz",
 | 
			
		||||
      "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==",
 | 
			
		||||
      "license": "Apache-2.0",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "bare": ">=1.14.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/bare-path": {
 | 
			
		||||
      "version": "3.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz",
 | 
			
		||||
      "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==",
 | 
			
		||||
      "license": "Apache-2.0",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "bare-os": "^3.0.1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/bare-stream": {
 | 
			
		||||
      "version": "2.6.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz",
 | 
			
		||||
      "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==",
 | 
			
		||||
      "license": "Apache-2.0",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "streamx": "^2.21.0"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependencies": {
 | 
			
		||||
        "bare-buffer": "*",
 | 
			
		||||
        "bare-events": "*"
 | 
			
		||||
      },
 | 
			
		||||
      "peerDependenciesMeta": {
 | 
			
		||||
        "bare-buffer": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        },
 | 
			
		||||
        "bare-events": {
 | 
			
		||||
          "optional": true
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/base64-js": {
 | 
			
		||||
@@ -1111,6 +1197,19 @@
 | 
			
		||||
      "integrity": "sha512-LdUw/JMZyKN+EBDbOHqynYtOLXDjgo+uf5vCUhfO5hVsU2chvbqyexizvxUMaU4ipYZy9MiQyIFwMeIgsb6nBA==",
 | 
			
		||||
      "license": "(MIT OR Apache-2.0)"
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/call-bind-apply-helpers": {
 | 
			
		||||
      "version": "1.0.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
 | 
			
		||||
      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "es-errors": "^1.3.0",
 | 
			
		||||
        "function-bind": "^1.1.2"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.4"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/call-once-fn": {
 | 
			
		||||
      "version": "1.0.15",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/call-once-fn/-/call-once-fn-1.0.15.tgz",
 | 
			
		||||
@@ -1282,6 +1381,18 @@
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "license": "MIT"
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/combined-stream": {
 | 
			
		||||
      "version": "1.0.8",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
 | 
			
		||||
      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "delayed-stream": "~1.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.8"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/commander": {
 | 
			
		||||
      "version": "6.2.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
 | 
			
		||||
@@ -1384,15 +1495,38 @@
 | 
			
		||||
        "node": ">=4.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/delayed-stream": {
 | 
			
		||||
      "version": "1.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
 | 
			
		||||
      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=0.4.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/detect-libc": {
 | 
			
		||||
      "version": "2.0.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
 | 
			
		||||
      "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
 | 
			
		||||
      "version": "2.0.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
 | 
			
		||||
      "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==",
 | 
			
		||||
      "license": "Apache-2.0",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=8"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/dunder-proto": {
 | 
			
		||||
      "version": "1.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
 | 
			
		||||
      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "call-bind-apply-helpers": "^1.0.1",
 | 
			
		||||
        "es-errors": "^1.3.0",
 | 
			
		||||
        "gopd": "^1.2.0"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.4"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/duplexify": {
 | 
			
		||||
      "version": "4.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz",
 | 
			
		||||
@@ -1455,6 +1589,51 @@
 | 
			
		||||
        "url": "https://github.com/sponsors/sindresorhus"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/es-define-property": {
 | 
			
		||||
      "version": "1.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
 | 
			
		||||
      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.4"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/es-errors": {
 | 
			
		||||
      "version": "1.3.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
 | 
			
		||||
      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.4"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/es-object-atoms": {
 | 
			
		||||
      "version": "1.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
 | 
			
		||||
      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "es-errors": "^1.3.0"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.4"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/es-set-tostringtag": {
 | 
			
		||||
      "version": "2.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "es-errors": "^1.3.0",
 | 
			
		||||
        "get-intrinsic": "^1.2.6",
 | 
			
		||||
        "has-tostringtag": "^1.0.2",
 | 
			
		||||
        "hasown": "^2.0.2"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.4"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/escalade": {
 | 
			
		||||
      "version": "3.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
 | 
			
		||||
@@ -1577,6 +1756,12 @@
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/fast-fifo": {
 | 
			
		||||
      "version": "1.3.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
 | 
			
		||||
      "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
 | 
			
		||||
      "license": "MIT"
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/fifo": {
 | 
			
		||||
      "version": "2.4.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/fifo/-/fifo-2.4.1.tgz",
 | 
			
		||||
@@ -1640,6 +1825,21 @@
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/form-data": {
 | 
			
		||||
      "version": "4.0.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
 | 
			
		||||
      "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "asynckit": "^0.4.0",
 | 
			
		||||
        "combined-stream": "^1.0.8",
 | 
			
		||||
        "es-set-tostringtag": "^2.1.0",
 | 
			
		||||
        "mime-types": "^2.1.12"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 6"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/formal-git": {
 | 
			
		||||
      "version": "1.1.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/formal-git/-/formal-git-1.1.5.tgz",
 | 
			
		||||
@@ -1671,6 +1871,15 @@
 | 
			
		||||
        "node": ">=12"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/function-bind": {
 | 
			
		||||
      "version": "1.1.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
 | 
			
		||||
      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://github.com/sponsors/ljharb"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/gensync": {
 | 
			
		||||
      "version": "1.0.0-beta.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
 | 
			
		||||
@@ -1704,6 +1913,43 @@
 | 
			
		||||
        "url": "https://github.com/sponsors/sindresorhus"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/get-intrinsic": {
 | 
			
		||||
      "version": "1.3.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
 | 
			
		||||
      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "call-bind-apply-helpers": "^1.0.2",
 | 
			
		||||
        "es-define-property": "^1.0.1",
 | 
			
		||||
        "es-errors": "^1.3.0",
 | 
			
		||||
        "es-object-atoms": "^1.1.1",
 | 
			
		||||
        "function-bind": "^1.1.2",
 | 
			
		||||
        "get-proto": "^1.0.1",
 | 
			
		||||
        "gopd": "^1.2.0",
 | 
			
		||||
        "has-symbols": "^1.1.0",
 | 
			
		||||
        "hasown": "^2.0.2",
 | 
			
		||||
        "math-intrinsics": "^1.1.0"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.4"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://github.com/sponsors/ljharb"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/get-proto": {
 | 
			
		||||
      "version": "1.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
 | 
			
		||||
      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "dunder-proto": "^1.0.1",
 | 
			
		||||
        "es-object-atoms": "^1.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.4"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/get-stream": {
 | 
			
		||||
      "version": "6.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
 | 
			
		||||
@@ -1744,6 +1990,18 @@
 | 
			
		||||
      "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
 | 
			
		||||
      "license": "MIT"
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/gopd": {
 | 
			
		||||
      "version": "1.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
 | 
			
		||||
      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.4"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://github.com/sponsors/ljharb"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/graceful-fs": {
 | 
			
		||||
      "version": "4.2.11",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
 | 
			
		||||
@@ -1759,12 +2017,51 @@
 | 
			
		||||
        "node": ">=8"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/has-symbols": {
 | 
			
		||||
      "version": "1.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.4"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://github.com/sponsors/ljharb"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/has-tostringtag": {
 | 
			
		||||
      "version": "1.0.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
 | 
			
		||||
      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "has-symbols": "^1.0.3"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.4"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://github.com/sponsors/ljharb"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/hash-string": {
 | 
			
		||||
      "version": "1.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/hash-string/-/hash-string-1.0.0.tgz",
 | 
			
		||||
      "integrity": "sha512-dtNNyxXobzHavayZwOwRWhBTqS9GX4jDjIMsGc0fDyaN2A+4zMn5Ua9ODDCggN6w3Spma6mAHL3ImmW3BkWDmQ==",
 | 
			
		||||
      "license": "ISC"
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/hasown": {
 | 
			
		||||
      "version": "2.0.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
 | 
			
		||||
      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "function-bind": "^1.1.2"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.4"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/human-signals": {
 | 
			
		||||
      "version": "2.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
 | 
			
		||||
@@ -2339,6 +2636,15 @@
 | 
			
		||||
        "yallist": "^3.0.2"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/math-intrinsics": {
 | 
			
		||||
      "version": "1.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.4"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/merge-stream": {
 | 
			
		||||
      "version": "2.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
 | 
			
		||||
@@ -2359,6 +2665,27 @@
 | 
			
		||||
        "node": ">=8.6"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/mime-db": {
 | 
			
		||||
      "version": "1.52.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
 | 
			
		||||
      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.6"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/mime-types": {
 | 
			
		||||
      "version": "2.1.35",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
 | 
			
		||||
      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "mime-db": "1.52.0"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 0.6"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/mimic-fn": {
 | 
			
		||||
      "version": "2.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
 | 
			
		||||
@@ -2477,9 +2804,9 @@
 | 
			
		||||
      "license": "ISC"
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/node-abi": {
 | 
			
		||||
      "version": "3.74.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz",
 | 
			
		||||
      "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==",
 | 
			
		||||
      "version": "3.75.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz",
 | 
			
		||||
      "integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "semver": "^7.3.5"
 | 
			
		||||
@@ -2489,9 +2816,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/node-addon-api": {
 | 
			
		||||
      "version": "5.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==",
 | 
			
		||||
      "version": "6.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==",
 | 
			
		||||
      "license": "MIT"
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/node-releases": {
 | 
			
		||||
@@ -2666,6 +2993,59 @@
 | 
			
		||||
        "node": ">=10"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/prebuild-install/node_modules/bl": {
 | 
			
		||||
      "version": "4.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "buffer": "^5.5.0",
 | 
			
		||||
        "inherits": "^2.0.4",
 | 
			
		||||
        "readable-stream": "^3.4.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/prebuild-install/node_modules/readable-stream": {
 | 
			
		||||
      "version": "3.6.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
 | 
			
		||||
      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "inherits": "^2.0.3",
 | 
			
		||||
        "string_decoder": "^1.1.1",
 | 
			
		||||
        "util-deprecate": "^1.0.1"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 6"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/prebuild-install/node_modules/tar-fs": {
 | 
			
		||||
      "version": "2.1.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz",
 | 
			
		||||
      "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "chownr": "^1.1.1",
 | 
			
		||||
        "mkdirp-classic": "^0.5.2",
 | 
			
		||||
        "pump": "^3.0.0",
 | 
			
		||||
        "tar-stream": "^2.1.4"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/prebuild-install/node_modules/tar-stream": {
 | 
			
		||||
      "version": "2.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
 | 
			
		||||
      "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "bl": "^4.0.3",
 | 
			
		||||
        "end-of-stream": "^1.4.1",
 | 
			
		||||
        "fs-constants": "^1.0.0",
 | 
			
		||||
        "inherits": "^2.0.3",
 | 
			
		||||
        "readable-stream": "^3.1.1"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=6"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/prettier": {
 | 
			
		||||
      "version": "3.5.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz",
 | 
			
		||||
@@ -2740,6 +3120,12 @@
 | 
			
		||||
        "node": ">=6"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/proxy-from-env": {
 | 
			
		||||
      "version": "1.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
 | 
			
		||||
      "license": "MIT"
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/pump": {
 | 
			
		||||
      "version": "3.0.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz",
 | 
			
		||||
@@ -2937,9 +3323,9 @@
 | 
			
		||||
      "license": "MIT"
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/semver": {
 | 
			
		||||
      "version": "7.7.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
 | 
			
		||||
      "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
 | 
			
		||||
      "version": "7.7.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
 | 
			
		||||
      "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
 | 
			
		||||
      "license": "ISC",
 | 
			
		||||
      "bin": {
 | 
			
		||||
        "semver": "bin/semver.js"
 | 
			
		||||
@@ -2965,23 +3351,23 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/sharp": {
 | 
			
		||||
      "version": "0.30.7",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.30.7.tgz",
 | 
			
		||||
      "integrity": "sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==",
 | 
			
		||||
      "version": "0.32.6",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz",
 | 
			
		||||
      "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==",
 | 
			
		||||
      "hasInstallScript": true,
 | 
			
		||||
      "license": "Apache-2.0",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "color": "^4.2.3",
 | 
			
		||||
        "detect-libc": "^2.0.1",
 | 
			
		||||
        "node-addon-api": "^5.0.0",
 | 
			
		||||
        "detect-libc": "^2.0.2",
 | 
			
		||||
        "node-addon-api": "^6.1.0",
 | 
			
		||||
        "prebuild-install": "^7.1.1",
 | 
			
		||||
        "semver": "^7.3.7",
 | 
			
		||||
        "semver": "^7.5.4",
 | 
			
		||||
        "simple-get": "^4.0.1",
 | 
			
		||||
        "tar-fs": "^2.1.1",
 | 
			
		||||
        "tar-fs": "^3.0.4",
 | 
			
		||||
        "tunnel-agent": "^0.6.0"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=12.13.0"
 | 
			
		||||
        "node": ">=14.15.0"
 | 
			
		||||
      },
 | 
			
		||||
      "funding": {
 | 
			
		||||
        "url": "https://opencollective.com/libvips"
 | 
			
		||||
@@ -3152,6 +3538,19 @@
 | 
			
		||||
      "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==",
 | 
			
		||||
      "license": "MIT"
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/streamx": {
 | 
			
		||||
      "version": "2.22.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz",
 | 
			
		||||
      "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "fast-fifo": "^1.3.2",
 | 
			
		||||
        "text-decoder": "^1.1.0"
 | 
			
		||||
      },
 | 
			
		||||
      "optionalDependencies": {
 | 
			
		||||
        "bare-events": "^2.2.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/string_decoder": {
 | 
			
		||||
      "version": "1.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
 | 
			
		||||
@@ -3268,15 +3667,17 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tar-fs": {
 | 
			
		||||
      "version": "2.1.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz",
 | 
			
		||||
      "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==",
 | 
			
		||||
      "version": "3.0.8",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz",
 | 
			
		||||
      "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "chownr": "^1.1.1",
 | 
			
		||||
        "mkdirp-classic": "^0.5.2",
 | 
			
		||||
        "pump": "^3.0.0",
 | 
			
		||||
        "tar-stream": "^2.1.4"
 | 
			
		||||
        "tar-stream": "^3.1.5"
 | 
			
		||||
      },
 | 
			
		||||
      "optionalDependencies": {
 | 
			
		||||
        "bare-fs": "^4.0.1",
 | 
			
		||||
        "bare-path": "^3.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tar-iterator": {
 | 
			
		||||
@@ -3299,19 +3700,14 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tar-stream": {
 | 
			
		||||
      "version": "2.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
 | 
			
		||||
      "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
 | 
			
		||||
      "version": "3.1.7",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
 | 
			
		||||
      "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "bl": "^4.0.3",
 | 
			
		||||
        "end-of-stream": "^1.4.1",
 | 
			
		||||
        "fs-constants": "^1.0.0",
 | 
			
		||||
        "inherits": "^2.0.3",
 | 
			
		||||
        "readable-stream": "^3.1.1"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=6"
 | 
			
		||||
        "b4a": "^1.6.4",
 | 
			
		||||
        "fast-fifo": "^1.2.0",
 | 
			
		||||
        "streamx": "^2.15.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tar-stream-compat": {
 | 
			
		||||
@@ -3341,31 +3737,6 @@
 | 
			
		||||
        "safe-buffer": "^5.1.1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tar-stream/node_modules/bl": {
 | 
			
		||||
      "version": "4.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "buffer": "^5.5.0",
 | 
			
		||||
        "inherits": "^2.0.4",
 | 
			
		||||
        "readable-stream": "^3.4.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/tar-stream/node_modules/readable-stream": {
 | 
			
		||||
      "version": "3.6.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
 | 
			
		||||
      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "inherits": "^2.0.3",
 | 
			
		||||
        "string_decoder": "^1.1.1",
 | 
			
		||||
        "util-deprecate": "^1.0.1"
 | 
			
		||||
      },
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 6"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/temp-suffix": {
 | 
			
		||||
      "version": "0.1.14",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/temp-suffix/-/temp-suffix-0.1.14.tgz",
 | 
			
		||||
@@ -3378,6 +3749,15 @@
 | 
			
		||||
        "node": ">=0.8"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/text-decoder": {
 | 
			
		||||
      "version": "1.2.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz",
 | 
			
		||||
      "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==",
 | 
			
		||||
      "license": "Apache-2.0",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "b4a": "^1.6.4"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/through": {
 | 
			
		||||
      "version": "2.3.8",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,9 @@
 | 
			
		||||
    "lint": "npx prettier . --check && autopep8 --diff scripts/ src/",
 | 
			
		||||
    "prepare": "husky",
 | 
			
		||||
    "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": {
 | 
			
		||||
    "type": "git",
 | 
			
		||||
@@ -40,7 +42,7 @@
 | 
			
		||||
  },
 | 
			
		||||
  "homepage": "https://github.com/zen-browser/desktop#readme",
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@zen-browser/surfer": "^1.11.11"
 | 
			
		||||
    "@zen-browser/surfer": "^1.11.13"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@babel/preset-typescript": "^7.27.0",
 | 
			
		||||
 
 | 
			
		||||
@@ -38,7 +38,7 @@ def get_rc_response() -> Optional[str]:
 | 
			
		||||
    for tag_dict in data["tags"]:
 | 
			
		||||
      tag = tag_dict["tag"]
 | 
			
		||||
      if (tag.startswith("FIREFOX") and tag.endswith("_BUILD1")
 | 
			
		||||
              and "ESR" not in tag and "b" not in tag):
 | 
			
		||||
              and "ESR" not in tag and "b" not in tag and "ANDROID" not in tag):
 | 
			
		||||
        return (tag.replace("FIREFOX_", "").replace("_BUILD1",
 | 
			
		||||
                                                    "").replace("_", "."))
 | 
			
		||||
  except (FileNotFoundError, json.JSONDecodeError) as e:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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
 | 
			
		||||
index 38508fffccbce801a02d4a4211f368674307c4d3..5ce56c36da2e242ad81621c2032eb68dcd26e960 100644
 | 
			
		||||
index f7ebed9b2a71da90c5751cfd5d5f018cc8b73612..96e881c7782198f1e58be2578f167c7079a8191e 100644
 | 
			
		||||
--- a/Cargo.lock
 | 
			
		||||
+++ b/Cargo.lock
 | 
			
		||||
@@ -3931,8 +3931,6 @@ dependencies = [
 | 
			
		||||
@@ -4014,8 +4014,6 @@ dependencies = [
 | 
			
		||||
 [[package]]
 | 
			
		||||
 name = "mime_guess"
 | 
			
		||||
 version = "2.0.4"
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
diff --git a/Cargo.toml b/Cargo.toml
 | 
			
		||||
index d3d529b487f80d4b4f3bfa13cdd3f62946352db8..b35a9e0e3339d48d1cd0cab7b22d030f330e40d1 100644
 | 
			
		||||
index 8c6b99bc629ec26e01ab3746f2ae46174bfaa0b1..5791c7470923c7c15986089b40357ce80365e942 100644
 | 
			
		||||
--- a/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.*
 | 
			
		||||
 plist = { path = "third_party/rust/plist" }
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
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
 | 
			
		||||
+++ b/browser/actors/WebRTCParent.sys.mjs
 | 
			
		||||
@@ -152,6 +152,7 @@ export class WebRTCParent extends JSWindowActorParent {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								src/browser/app/profile/ai.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/browser/app/profile/ai.inc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
 | 
			
		||||
pref("browser.ml.chat.enabled", false);
 | 
			
		||||
pref("browser.ml.chat.shortcuts", false);
 | 
			
		||||
pref("browser.ml.chat.shortcuts.custom", false);
 | 
			
		||||
pref("browser.ml.chat.sidebar", false);
 | 
			
		||||
pref("browser.ml.enable", false);
 | 
			
		||||
							
								
								
									
										52
									
								
								src/browser/app/profile/browser.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								src/browser/app/profile/browser.inc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Restore session on startup
 | 
			
		||||
pref("browser.startup.page", 3);
 | 
			
		||||
pref("browser.sessionstore.restore_pinned_tabs_on_demand", true);
 | 
			
		||||
 | 
			
		||||
// Toolbars
 | 
			
		||||
pref("browser.tabs.closeWindowWithLastTab", false);
 | 
			
		||||
pref("browser.tabs.loadBookmarksInTabs", false);
 | 
			
		||||
pref("browser.tabs.hoverPreview.enabled", false);
 | 
			
		||||
pref("browser.tabs.dragdrop.moveOverThresholdPercent", 50);
 | 
			
		||||
pref("browser.tabs.unloadTabInContextMenu", true);
 | 
			
		||||
pref("browser.tabs.fadeOutExplicitlyUnloadedTabs", true);
 | 
			
		||||
 | 
			
		||||
pref('browser.toolbars.bookmarks.visibility', 'never');
 | 
			
		||||
pref("browser.bookmarks.openInTabClosesMenu", false);
 | 
			
		||||
pref("browser.menu.showViewImageInfo", true);
 | 
			
		||||
pref("findbar.highlightAll", true);
 | 
			
		||||
 | 
			
		||||
pref("layout.word_select.eat_space_to_next_word", false);
 | 
			
		||||
 | 
			
		||||
// Better Windows theming
 | 
			
		||||
pref("widget.non-native-theme.scrollbar.style", 2);
 | 
			
		||||
pref("widget.non-native-theme.use-theme-accent", true);
 | 
			
		||||
 | 
			
		||||
// for the new layout:
 | 
			
		||||
pref('browser.download.autohideButton', false);
 | 
			
		||||
 | 
			
		||||
// Disable Firefox's revamp
 | 
			
		||||
pref("sidebar.revamp", false, locked);
 | 
			
		||||
pref("sidebar.verticalTabs", false, locked);
 | 
			
		||||
 | 
			
		||||
// Enable experimental settings page (Used for Zen Labs)
 | 
			
		||||
pref('browser.preferences.experimental', true);
 | 
			
		||||
 | 
			
		||||
// Downloads
 | 
			
		||||
pref("browser.download.manager.addToRecentDocs", false);
 | 
			
		||||
pref('browser.download.open_pdf_attachments_inline', true);
 | 
			
		||||
pref('browser.download.alwaysOpenPanel', false);
 | 
			
		||||
 | 
			
		||||
// Updates
 | 
			
		||||
#ifdef MOZILLA_OFFICIAL
 | 
			
		||||
pref("app.update.checkInstallTime.days", 6);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include fullscreen.inc
 | 
			
		||||
#include ai.inc
 | 
			
		||||
#include disablemozilla.inc
 | 
			
		||||
 | 
			
		||||
// TODO: Check this out!
 | 
			
		||||
pref("browser.profiles.enabled", false);
 | 
			
		||||
pref("browser.tabs.groups.enabled", false);
 | 
			
		||||
							
								
								
									
										11
									
								
								src/browser/app/profile/disablemozilla.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/browser/app/profile/disablemozilla.inc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
 | 
			
		||||
// Common UI changes
 | 
			
		||||
pref("browser.privatebrowsing.vpnpromourl", "", locked);
 | 
			
		||||
pref("extensions.getAddons.showPane", false);
 | 
			
		||||
pref("extensions.htmlaboutaddons.recommendations.enabled", false);
 | 
			
		||||
pref("browser.discovery.enabled", false);
 | 
			
		||||
pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons", false);
 | 
			
		||||
pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features", false);
 | 
			
		||||
pref("browser.preferences.moreFromMozilla", false, locked);
 | 
			
		||||
pref("browser.aboutwelcome.enabled", false);
 | 
			
		||||
pref("browser.contentblocking.report.show_mobile_app", false, locked);
 | 
			
		||||
							
								
								
									
										5
									
								
								src/browser/app/profile/extensions.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/browser/app/profile/extensions.inc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
 | 
			
		||||
// security: They must enable this themselves, to avoid people downloading malware
 | 
			
		||||
pref('xpinstall.signatures.required', true);
 | 
			
		||||
pref("extensions.pocket.enabled", false);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										142
									
								
								src/browser/app/profile/features.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								src/browser/app/profile/features.inc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,142 @@
 | 
			
		||||
 | 
			
		||||
pref('zen.welcome-screen.seen', false, sticky);
 | 
			
		||||
 | 
			
		||||
pref('zen.tabs.vertical', true);
 | 
			
		||||
pref('zen.tabs.vertical.right-side', false);
 | 
			
		||||
pref('zen.tabs.rename-tabs', true);
 | 
			
		||||
pref('zen.tabs.show-newtab-vertical', true);
 | 
			
		||||
 | 
			
		||||
pref('zen.ctrlTab.show-pending-tabs', false);
 | 
			
		||||
 | 
			
		||||
pref('zen.theme.accent-color', "#ffb787");
 | 
			
		||||
pref('zen.theme.content-element-separation', 8); // In pixels
 | 
			
		||||
pref('zen.theme.gradient', true);
 | 
			
		||||
pref('zen.theme.gradient.show-custom-colors', false);
 | 
			
		||||
pref('zen.theme.essentials-favicon-bg', true);
 | 
			
		||||
 | 
			
		||||
pref('zen.view.show-newtab-button-border-top', false);
 | 
			
		||||
pref('zen.view.show-newtab-button-top', true);
 | 
			
		||||
 | 
			
		||||
pref('zen.mediacontrols.enabled', true);
 | 
			
		||||
 | 
			
		||||
// Exposure:
 | 
			
		||||
pref('zen.haptic-feedback.enabled', true);
 | 
			
		||||
 | 
			
		||||
pref('zen.mods.auto-update-days', 20); // In days
 | 
			
		||||
#ifdef MOZILLA_OFFICIAL
 | 
			
		||||
pref('zen.mods.auto-update', true);
 | 
			
		||||
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);
 | 
			
		||||
#else
 | 
			
		||||
pref('zen.mods.auto-update', false);
 | 
			
		||||
pref('zen.rice.api.url', "http://localhost", locked);
 | 
			
		||||
pref('zen.injections.match-urls', 'http://localhost/*', locked);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
pref('zen.rice.share.notice.accepted', false);
 | 
			
		||||
 | 
			
		||||
#ifdef XP_MACOSX
 | 
			
		||||
pref('zen.theme.border-radius', 10); // In pixels
 | 
			
		||||
#else
 | 
			
		||||
pref('zen.theme.border-radius', 8); // In pixels
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef XP_MACOSX
 | 
			
		||||
pref('zen.theme.acrylic-elements', false);
 | 
			
		||||
#else
 | 
			
		||||
pref('zen.theme.acrylic-elements', false);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
pref('zen.theme.color-prefs.use-workspace-colors', true);
 | 
			
		||||
 | 
			
		||||
pref('zen.view.compact.hide-tabbar', true);
 | 
			
		||||
pref('zen.view.compact.hide-toolbar', false);
 | 
			
		||||
pref('zen.view.compact.toolbar-flash-popup', false);
 | 
			
		||||
pref('zen.view.compact.toolbar-flash-popup.duration', 800);
 | 
			
		||||
pref('zen.view.compact.toolbar-hide-after-hover.duration', 1000);
 | 
			
		||||
pref('zen.view.compact.color-toolbar', true);
 | 
			
		||||
pref('zen.view.compact.color-sidebar', true);
 | 
			
		||||
pref('zen.view.compact.animate-sidebar', true);
 | 
			
		||||
pref('zen.view.compact.show-sidebar-and-toolbar-on-hover', true);
 | 
			
		||||
pref('zen.view.compact.show-background-tab-toast', true);
 | 
			
		||||
 | 
			
		||||
pref('zen.urlbar.replace-newtab', true);
 | 
			
		||||
pref('zen.urlbar.show-protections-icon', false);
 | 
			
		||||
pref('zen.urlbar.behavior', 'floating-on-type'); // default, floating-on-type, float
 | 
			
		||||
pref('zen.urlbar.wait-to-clear', 45000); // in ms (default 45s)
 | 
			
		||||
pref('zen.urlbar.show-domain-only-in-sidebar', true);
 | 
			
		||||
pref('zen.urlbar.hide-one-offs', true);
 | 
			
		||||
pref('zen.urlbar.enable-overrides', false);
 | 
			
		||||
 | 
			
		||||
// Glance
 | 
			
		||||
pref('zen.glance.enabled', true);
 | 
			
		||||
pref('zen.glance.hold-duration', 300); // in ms
 | 
			
		||||
pref('zen.glance.open-essential-external-links', true);
 | 
			
		||||
pref('zen.glance.activation-method', 'alt'); // ctrl, alt, shift, none, hold
 | 
			
		||||
 | 
			
		||||
pref('zen.view.sidebar-height-throttle', 200); // in ms
 | 
			
		||||
pref('zen.view.sidebar-expanded.max-width', 500);
 | 
			
		||||
 | 
			
		||||
#ifdef XP_MACOSX
 | 
			
		||||
pref('zen.view.mac.show-three-dot-menu', false);
 | 
			
		||||
pref('zen.widget.mac.mono-window-controls', true);
 | 
			
		||||
#endif
 | 
			
		||||
pref('zen.view.use-single-toolbar', true);
 | 
			
		||||
pref('zen.view.sidebar-expanded', true);
 | 
			
		||||
pref('zen.view.sidebar-collapsed.hide-mute-button', true);
 | 
			
		||||
pref('zen.view.experimental-force-window-controls-left', false);
 | 
			
		||||
 | 
			
		||||
#ifdef XP_MACOSX
 | 
			
		||||
pref('zen.view.grey-out-inactive-windows', false);
 | 
			
		||||
#else
 | 
			
		||||
pref('zen.view.grey-out-inactive-windows', true);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
pref('zen.view.hide-window-controls', true);
 | 
			
		||||
pref('zen.view.experimental-no-window-controls', false);
 | 
			
		||||
 | 
			
		||||
pref('zen.keyboard.shortcuts.enabled', true);
 | 
			
		||||
pref('zen.keyboard.shortcuts.version', 0); // Empty string means default shortcuts
 | 
			
		||||
pref('zen.keyboard.shortcuts.disable-mainkeyset-clear', false); // for debugging
 | 
			
		||||
 | 
			
		||||
pref('zen.themes.updated-value-observer', 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.close-shortcut-behavior', 'reset-unload-switch');
 | 
			
		||||
 | 
			
		||||
#ifdef MOZILLA_OFFICIAL
 | 
			
		||||
pref('zen.watermark.enabled', true, sticky);
 | 
			
		||||
#else
 | 
			
		||||
pref('zen.watermark.enabled', false, sticky);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Startup flags
 | 
			
		||||
pref('zen.startup.smooth-scroll-in-tabs', true);
 | 
			
		||||
 | 
			
		||||
// Zen Workspaces
 | 
			
		||||
pref('zen.workspaces.continue-where-left-off', false);
 | 
			
		||||
pref('zen.workspaces.hide-default-container-indicator', true);
 | 
			
		||||
pref('zen.workspaces.force-container-workspace', false);
 | 
			
		||||
pref('zen.workspaces.open-new-tab-if-last-unpinned-tab-is-closed', false);
 | 
			
		||||
pref('zen.workspaces.swipe-actions', true);
 | 
			
		||||
pref('zen.workspaces.wrap-around-navigation', true);
 | 
			
		||||
pref('zen.workspaces.natural-scroll', false);
 | 
			
		||||
pref('zen.workspaces.scroll-modifier-key','ctrl'); // can be ctrl, alt, shift, or a meta key
 | 
			
		||||
pref('services.sync.engine.workspaces', false);
 | 
			
		||||
pref('zen.workspaces.container-specific-essentials-enabled', false);
 | 
			
		||||
 | 
			
		||||
#ifdef MOZILLA_OFFICIAL
 | 
			
		||||
pref('zen.workspaces.debug', false);
 | 
			
		||||
#else
 | 
			
		||||
pref('zen.workspaces.debug', true);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Zen Split View
 | 
			
		||||
pref('zen.splitView.enable-tab-drop', true);
 | 
			
		||||
pref('zen.splitView.min-resize-width', 7);
 | 
			
		||||
pref('zen.splitView.rearrange-hover-size', 24);
 | 
			
		||||
 | 
			
		||||
// Zen Download Animations
 | 
			
		||||
pref('zen.downloads.download-animation', true);
 | 
			
		||||
pref('zen.downloads.download-animation-duration', 1000); // ms
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js
 | 
			
		||||
index 89b8b830e8f53582dd9910b0172098d31a8d8967..51bdc847823cb95f811b7e9d2d864b9aacf0e364 100644
 | 
			
		||||
index beced8067e6c8b5c8cf8e3f6060ba259ec9a294d..33a264e7f9cf97944da3888bdb957fa6e7c4c346 100644
 | 
			
		||||
--- a/browser/app/profile/firefox.js
 | 
			
		||||
+++ b/browser/app/profile/firefox.js
 | 
			
		||||
@@ -3375,3 +3375,5 @@ pref("toolkit.contentRelevancy.enabled", false);
 | 
			
		||||
@@ -3398,3 +3398,5 @@ pref("toolkit.contentRelevancy.enabled", false);
 | 
			
		||||
 pref("toolkit.contentRelevancy.ingestEnabled", false);
 | 
			
		||||
 // Pref to enable extra logging for the content relevancy feature
 | 
			
		||||
 pref("toolkit.contentRelevancy.log", false);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								src/browser/app/profile/fullscreen.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/browser/app/profile/fullscreen.inc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
 | 
			
		||||
pref("full-screen-api.transition-duration.enter", "0 0");
 | 
			
		||||
pref("full-screen-api.transition-duration.leave", "0 0");
 | 
			
		||||
pref("full-screen-api.warning.delay", -1);
 | 
			
		||||
pref("full-screen-api.warning.timeout", 0);
 | 
			
		||||
							
								
								
									
										11
									
								
								src/browser/app/profile/linux.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/browser/app/profile/linux.inc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
 | 
			
		||||
pref("widget.gtk.rounded-bottom-corners.enabled", true);
 | 
			
		||||
 | 
			
		||||
// Enable transparent background for linux
 | 
			
		||||
#ifdef MOZ_WIDGET_GTK
 | 
			
		||||
pref('zen.widget.linux.transparency', false);
 | 
			
		||||
 | 
			
		||||
// VAAPI/FFMPEG is Linux only
 | 
			
		||||
pref('media.ffmpeg.vaapi.enabled', true);
 | 
			
		||||
pref('media.ffmpeg.encoder.enabled', true);
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										11
									
								
								src/browser/app/profile/macos.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/browser/app/profile/macos.inc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
 | 
			
		||||
// Enable transparent background for macos
 | 
			
		||||
pref('widget.macos.titlebar-blend-mode.behind-window', true);
 | 
			
		||||
// 1. hudWindow
 | 
			
		||||
// 2. fullScreenUI
 | 
			
		||||
// 3. popover
 | 
			
		||||
// 4. menu
 | 
			
		||||
// 5. toolTip
 | 
			
		||||
// 6. headerView
 | 
			
		||||
// 7. underlay
 | 
			
		||||
pref('zen.widget.macos.window-material', 3);
 | 
			
		||||
							
								
								
									
										6
									
								
								src/browser/app/profile/media.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/browser/app/profile/media.inc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
 | 
			
		||||
pref('image.jxl.enabled', true, locked);
 | 
			
		||||
pref("svg.context-properties.content.enabled", true);
 | 
			
		||||
pref("image.avif.enabled", true, locked);
 | 
			
		||||
 | 
			
		||||
pref("media.eme.enabled", true);
 | 
			
		||||
							
								
								
									
										9
									
								
								src/browser/app/profile/newtab.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/browser/app/profile/newtab.inc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
 | 
			
		||||
pref('browser.newtabpage.activity-stream.feeds.topsites', false);
 | 
			
		||||
pref('browser.newtabpage.activity-stream.feeds.section.topstories', false);
 | 
			
		||||
pref("browser.topsites.contile.enabled", false);
 | 
			
		||||
pref('browser.newtabpage.activity-stream.system.showWeather', false);
 | 
			
		||||
 | 
			
		||||
pref('browser.newtabpage.activity-stream.newtabWallpapers.enabled', true);
 | 
			
		||||
pref('browser.newtabpage.activity-stream.newtabWallpapers.v2.enabled', true);
 | 
			
		||||
pref('browser.translations.newSettingsUI.enable', true);
 | 
			
		||||
							
								
								
									
										4
									
								
								src/browser/app/profile/pdf.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								src/browser/app/profile/pdf.inc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
			
		||||
 | 
			
		||||
pref('pdfjs.enableHighlightEditor', true);
 | 
			
		||||
pref('pdfjs.enableHighlightFloatingButton', true);
 | 
			
		||||
pref("pdfjs.enableScripting", false);
 | 
			
		||||
							
								
								
									
										41
									
								
								src/browser/app/profile/performance.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								src/browser/app/profile/performance.inc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
 | 
			
		||||
// ---- Experimental settings to try make zen faster
 | 
			
		||||
pref("media.memory_cache_max_size", 1048576);
 | 
			
		||||
pref("media.cache_readahead_limit", 9000);
 | 
			
		||||
pref("media.cache_resume_threshold", 3600);
 | 
			
		||||
pref("media.memory_caches_combined_limit_kb", 2560000);
 | 
			
		||||
 | 
			
		||||
pref("image.mem.decode_bytes_at_a_time", 32768);
 | 
			
		||||
 | 
			
		||||
// Enable GPU by default
 | 
			
		||||
pref("gfx.canvas.accelerated", true);
 | 
			
		||||
pref("media.hardware-video-decoding.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:
 | 
			
		||||
pref("network.dns.disablePrefetch", false);
 | 
			
		||||
pref("network.prefetch-next", true);
 | 
			
		||||
pref("network.dns.disablePrefetchFromHTTPS", false);
 | 
			
		||||
pref("network.predictor.enable-hover-on-ssl", true);
 | 
			
		||||
pref("network.http.rcwn.enabled", false);
 | 
			
		||||
 | 
			
		||||
// Experimental Zen Features
 | 
			
		||||
// Strategy to use for bytecode cache (Thanks https://github.com/gunir)
 | 
			
		||||
pref('dom.script_loader.bytecode_cache.strategy', 2);
 | 
			
		||||
pref("layout.css.grid-template-masonry-value.enabled", true);
 | 
			
		||||
 | 
			
		||||
// No Proxy should be default, Use system proxy allows antivirus, virus or system proxy to MITM or slowing down Zen
 | 
			
		||||
pref("network.proxy.type", 0);
 | 
			
		||||
							
								
								
									
										4
									
								
								src/browser/app/profile/pip.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								src/browser/app/profile/pip.inc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
			
		||||
 | 
			
		||||
pref("media.videocontrols.picture-in-picture.video-toggle.enabled", true);
 | 
			
		||||
// TODO: Enable once we have a proper settings page
 | 
			
		||||
pref("media.videocontrols.picture-in-picture.enable-when-switching-tabs.enabled", false);
 | 
			
		||||
							
								
								
									
										44
									
								
								src/browser/app/profile/privacy.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/browser/app/profile/privacy.inc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
 | 
			
		||||
pref("datareporting.policy.dataSubmissionEnabled", false, locked);
 | 
			
		||||
pref("datareporting.healthreport.uploadEnabled", false, locked);
 | 
			
		||||
pref("toolkit.telemetry.unified", false, locked);
 | 
			
		||||
pref("toolkit.telemetry.enabled", false, locked);
 | 
			
		||||
pref("toolkit.telemetry.server", "data:,", locked);
 | 
			
		||||
pref("toolkit.telemetry.archive.enabled", false, locked);
 | 
			
		||||
pref("toolkit.telemetry.newProfilePing.enabled", false, locked);
 | 
			
		||||
pref("toolkit.telemetry.shutdownPingSender.enabled", false, locked);
 | 
			
		||||
pref("toolkit.telemetry.updatePing.enabled", false, locked);
 | 
			
		||||
pref("toolkit.telemetry.bhrPing.enabled", false, locked);
 | 
			
		||||
pref("toolkit.telemetry.firstShutdownPing.enabled", false, locked);
 | 
			
		||||
pref("toolkit.telemetry.coverage.opt-out", true, locked);
 | 
			
		||||
pref("toolkit.coverage.opt-out", true, locked);
 | 
			
		||||
pref("toolkit.coverage.endpoint.base", "", locked);
 | 
			
		||||
pref("browser.newtabpage.activity-stream.feeds.telemetry", false, locked);
 | 
			
		||||
pref("browser.newtabpage.activity-stream.telemetry", false, locked);
 | 
			
		||||
pref("browser.ping-centre.telemetry", false);
 | 
			
		||||
pref("browser.attribution.enabled", false);
 | 
			
		||||
pref("toolkit.telemetry.pioneer-new-studies-available", false);
 | 
			
		||||
pref("app.shield.optoutstudies.enabled", false, locked);
 | 
			
		||||
pref("app.normandy.enabled", false);
 | 
			
		||||
pref("app.normandy.api_url", "", locked);
 | 
			
		||||
 | 
			
		||||
// Crash reports
 | 
			
		||||
pref("breakpad.reportURL", "");
 | 
			
		||||
pref("browser.tabs.crashReporting.sendReport", false);
 | 
			
		||||
pref("browser.crashReports.unsubmittedCheck.autoSubmit2", false);
 | 
			
		||||
 | 
			
		||||
// Other privacy
 | 
			
		||||
pref("extensions.getAddons.cache.enabled", false);
 | 
			
		||||
 | 
			
		||||
// Disable cache for private browsing
 | 
			
		||||
pref("browser.privatebrowsing.forceMediaMemoryCache", true);
 | 
			
		||||
 | 
			
		||||
// Tracking protection
 | 
			
		||||
pref("browser.helperApps.deleteTempFileOnExit", true);
 | 
			
		||||
pref("browser.uitour.enabled", false);
 | 
			
		||||
 | 
			
		||||
pref("privacy.globalprivacycontrol.enabled", true);
 | 
			
		||||
 | 
			
		||||
// Contextual identity
 | 
			
		||||
pref('privacy.userContext.enabled', true);
 | 
			
		||||
pref('privacy.userContext.ui.enabled', true);
 | 
			
		||||
							
								
								
									
										14
									
								
								src/browser/app/profile/smoothscroll.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/browser/app/profile/smoothscroll.inc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
 | 
			
		||||
pref("apz.overscroll.enabled", true);
 | 
			
		||||
pref("general.smoothScroll", true);
 | 
			
		||||
pref("general.smoothScroll.msdPhysics.enabled", true);
 | 
			
		||||
pref("general.smoothScroll.currentVelocityWeighting", "0.15");
 | 
			
		||||
pref("general.smoothScroll.stopDecelerationWeighting", "0.6");
 | 
			
		||||
pref("mousewheel.min_line_scroll_amount", 10);
 | 
			
		||||
pref("general.smoothScroll.mouseWheel.durationMinMS", 80);
 | 
			
		||||
pref("general.smoothScroll.msdPhysics.continuousMotionMaxDeltaMS", 12);
 | 
			
		||||
pref("general.smoothScroll.msdPhysics.motionBeginSpringConstant", 600);
 | 
			
		||||
pref("general.smoothScroll.msdPhysics.regularSpringConstant", 650);
 | 
			
		||||
pref("general.smoothScroll.msdPhysics.slowdownMinDeltaMS", 25);
 | 
			
		||||
pref("general.smoothScroll.msdPhysics.slowdownSpringConstant", 250);
 | 
			
		||||
pref("mousewheel.default.delta_multiplier_y", 200);
 | 
			
		||||
							
								
								
									
										32
									
								
								src/browser/app/profile/urlbar.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/browser/app/profile/urlbar.inc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
 | 
			
		||||
pref('browser.urlbar.unitConversion.enabled', true);
 | 
			
		||||
pref('browser.urlbar.trending.featureGate', false);
 | 
			
		||||
pref('browser.urlbar.weather.featureGate', false);
 | 
			
		||||
pref('browser.urlbar.quickactions.enabled', true);
 | 
			
		||||
pref('browser.urlbar.clipboard.featureGate', true);
 | 
			
		||||
pref('browser.urlbar.suggest.calculator', true);
 | 
			
		||||
 | 
			
		||||
pref("browser.urlbar.trimHttps", true);
 | 
			
		||||
pref("browser.urlbar.untrimOnUserInteraction.featureGate", true);
 | 
			
		||||
 | 
			
		||||
// Keep in sync with browser/components/topsites/constants.mjs
 | 
			
		||||
pref("browser.urlbar.maxRichResults", 7);
 | 
			
		||||
 | 
			
		||||
// Enable private suggestions
 | 
			
		||||
pref('browser.search.suggest.enabled', false);
 | 
			
		||||
pref('browser.search.suggest.enabled.private', false);
 | 
			
		||||
 | 
			
		||||
pref("browser.urlbar.trimHttps", true);
 | 
			
		||||
pref("browser.search.separatePrivateDefault.ui.enabled", true);
 | 
			
		||||
pref("browser.urlbar.update2.engineAliasRefresh", true);
 | 
			
		||||
pref("browser.urlbar.quicksuggest.enabled", false, locked);
 | 
			
		||||
pref("browser.urlbar.suggest.quicksuggest.sponsored", false, locked);
 | 
			
		||||
pref("browser.urlbar.suggest.quicksuggest.nonsponsored", false, locked);
 | 
			
		||||
pref("browser.urlbar.groupLabels.enabled", false);
 | 
			
		||||
pref("browser.urlbar.keepPanelOpenDuringImeComposition", true); // IMPORTANT: Fixes closing the urlbar when on some languages
 | 
			
		||||
pref("browser.formfill.enable", false);
 | 
			
		||||
pref("security.insecure_connection_text.enabled", true);
 | 
			
		||||
pref("security.insecure_connection_text.pbmode.enabled", true);
 | 
			
		||||
pref("network.IDN_show_punycode", true);
 | 
			
		||||
 | 
			
		||||
pref("browser.urlbar.suggest.topsites", true, locked);
 | 
			
		||||
							
								
								
									
										7
									
								
								src/browser/app/profile/windows.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								src/browser/app/profile/windows.inc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
 | 
			
		||||
// Mica
 | 
			
		||||
pref("widget.windows.mica", true);
 | 
			
		||||
pref("widget.windows.mica.popups", true);
 | 
			
		||||
pref("widget.windows.mica.toplevel-backdrop", 2);
 | 
			
		||||
 | 
			
		||||
pref("dom.ipc.processPriorityManager.backgroundUsesEcoQoS", false);
 | 
			
		||||
@@ -8,459 +8,37 @@
 | 
			
		||||
  #endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
pref("browser.tabs.hoverPreview.enabled", false);
 | 
			
		||||
 | 
			
		||||
#ifdef MOZ_UPDATE_CHANNEL
 | 
			
		||||
pref("devtools.debugger.prompt-connection", true);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Dont download the multilingual dictionary
 | 
			
		||||
pref("intl.multilingual.downloadEnabled", false);
 | 
			
		||||
 | 
			
		||||
// Restore session on startup
 | 
			
		||||
pref("browser.startup.page", 3);
 | 
			
		||||
pref("browser.sessionstore.restore_pinned_tabs_on_demand", true);
 | 
			
		||||
 | 
			
		||||
// Theme
 | 
			
		||||
pref('toolkit.legacyUserProfileCustomizations.stylesheets', true);
 | 
			
		||||
pref('browser.compactmode.show', true);
 | 
			
		||||
 | 
			
		||||
#ifdef XP_WIN
 | 
			
		||||
pref("browser.privateWindowSeparation.enabled", false);
 | 
			
		||||
 | 
			
		||||
// Mica
 | 
			
		||||
pref("widget.windows.mica", true);
 | 
			
		||||
pref("widget.windows.mica.popups", true);
 | 
			
		||||
pref("widget.windows.mica.toplevel-backdrop", 2);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
pref('browser.newtabpage.activity-stream.newtabWallpapers.enabled', true);
 | 
			
		||||
pref('browser.newtabpage.activity-stream.newtabWallpapers.v2.enabled', true);
 | 
			
		||||
pref('browser.translations.newSettingsUI.enable', true);
 | 
			
		||||
 | 
			
		||||
pref('privacy.userContext.enabled', true);
 | 
			
		||||
pref('privacy.userContext.ui.enabled', true);
 | 
			
		||||
 | 
			
		||||
pref("browser.urlbar.trimHttps", true);
 | 
			
		||||
pref("browser.urlbar.untrimOnUserInteraction.featureGate", true);
 | 
			
		||||
 | 
			
		||||
// Url bar
 | 
			
		||||
pref('browser.urlbar.unitConversion.enabled', true);
 | 
			
		||||
pref('browser.urlbar.trending.featureGate', false);
 | 
			
		||||
pref('browser.urlbar.weather.featureGate', true);
 | 
			
		||||
pref('browser.urlbar.quickactions.enabled', true);
 | 
			
		||||
pref('browser.urlbar.clipboard.featureGate', true);
 | 
			
		||||
pref('browser.urlbar.suggest.calculator', true);
 | 
			
		||||
 | 
			
		||||
// new tab page
 | 
			
		||||
pref('browser.newtabpage.activity-stream.feeds.topsites', false);
 | 
			
		||||
pref('browser.newtabpage.activity-stream.feeds.section.topstories', false);
 | 
			
		||||
pref("browser.topsites.contile.enabled", true);
 | 
			
		||||
 | 
			
		||||
// Pdf
 | 
			
		||||
pref('pdfjs.enableHighlightEditor', true);
 | 
			
		||||
pref('pdfjs.enableHighlightFloatingButton', true);
 | 
			
		||||
 | 
			
		||||
pref("alerts.showFavicons", true);
 | 
			
		||||
 | 
			
		||||
// Toolbars
 | 
			
		||||
pref("browser.tabs.closeWindowWithLastTab", false);
 | 
			
		||||
pref("browser.tabs.loadBookmarksInTabs", false);
 | 
			
		||||
pref("browser.tabs.dragdrop.moveOverThresholdPercent", 50);
 | 
			
		||||
pref('browser.toolbars.bookmarks.visibility', 'never');
 | 
			
		||||
pref("browser.bookmarks.openInTabClosesMenu", false);
 | 
			
		||||
pref("browser.menu.showViewImageInfo", true);
 | 
			
		||||
pref("findbar.highlightAll", true);
 | 
			
		||||
pref("layout.word_select.eat_space_to_next_word", false);
 | 
			
		||||
 | 
			
		||||
// TODO:
 | 
			
		||||
pref("browser.tabs.groups.enabled", false);
 | 
			
		||||
 | 
			
		||||
// Enable Do Not Track and GPC by default.
 | 
			
		||||
pref("privacy.donottrackheader.enabled", false);
 | 
			
		||||
pref("privacy.globalprivacycontrol.enabled", true);
 | 
			
		||||
 | 
			
		||||
pref("app.update.checkInstallTime.days", 6);
 | 
			
		||||
 | 
			
		||||
// CUSTOM ZEN PREFS
 | 
			
		||||
 | 
			
		||||
pref('zen.welcome-screen.seen', false, sticky);
 | 
			
		||||
 | 
			
		||||
pref('zen.tabs.vertical', true);
 | 
			
		||||
pref('zen.tabs.vertical.right-side', false);
 | 
			
		||||
pref('zen.tabs.rename-tabs', true);
 | 
			
		||||
pref('zen.theme.accent-color', "#ffb787");
 | 
			
		||||
pref('zen.theme.content-element-separation', 8); // In pixels
 | 
			
		||||
pref('zen.theme.gradient', true);
 | 
			
		||||
pref('zen.theme.gradient.show-custom-colors', false);
 | 
			
		||||
pref('zen.theme.essentials-favicon-bg', true);
 | 
			
		||||
 | 
			
		||||
pref('zen.tabs.show-newtab-vertical', true);
 | 
			
		||||
pref('zen.view.show-newtab-button-border-top', false);
 | 
			
		||||
pref('zen.view.show-newtab-button-top', true);
 | 
			
		||||
 | 
			
		||||
pref('zen.mediacontrols.enabled', true);
 | 
			
		||||
 | 
			
		||||
#ifdef MOZILLA_OFFICIAL
 | 
			
		||||
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);
 | 
			
		||||
#else
 | 
			
		||||
pref('zen.rice.api.url', "http://localhost", locked);
 | 
			
		||||
pref('zen.injections.match-urls', 'http://localhost/*', locked);
 | 
			
		||||
#endif
 | 
			
		||||
pref('zen.rice.share.notice.accepted', false);
 | 
			
		||||
 | 
			
		||||
#ifdef XP_MACOSX
 | 
			
		||||
pref('zen.theme.border-radius', 10); // In pixels
 | 
			
		||||
#else
 | 
			
		||||
pref('zen.theme.border-radius', 8); // In pixels
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
pref('zen.theme.color-prefs.use-workspace-colors', true);
 | 
			
		||||
 | 
			
		||||
pref('zen.view.compact.hide-tabbar', true);
 | 
			
		||||
pref('zen.view.compact.hide-toolbar', false);
 | 
			
		||||
pref('zen.view.compact.toolbar-flash-popup', false);
 | 
			
		||||
pref('zen.view.compact.toolbar-flash-popup.duration', 800);
 | 
			
		||||
pref('zen.view.compact.toolbar-hide-after-hover.duration', 1000);
 | 
			
		||||
pref('zen.view.compact.color-toolbar', true);
 | 
			
		||||
pref('zen.view.compact.color-sidebar', true);
 | 
			
		||||
pref('zen.view.compact.animate-sidebar', true);
 | 
			
		||||
pref('zen.view.compact.show-sidebar-and-toolbar-on-hover', true);
 | 
			
		||||
 | 
			
		||||
pref('zen.urlbar.replace-newtab', true);
 | 
			
		||||
pref('zen.urlbar.show-protections-icon', false);
 | 
			
		||||
pref('zen.urlbar.behavior', 'floating-on-type'); // default, floating-on-type, float
 | 
			
		||||
pref('zen.urlbar.wait-to-clear', 45000); // in ms (default 45s)
 | 
			
		||||
pref('zen.urlbar.show-domain-only-in-sidebar', true);
 | 
			
		||||
pref('zen.urlbar.hide-one-offs', true);
 | 
			
		||||
 | 
			
		||||
#ifdef XP_MACOSX
 | 
			
		||||
// Disable for macos in the meantime until @HarryHeres finds a solution for hight DPI screens
 | 
			
		||||
pref('zen.view.experimental-rounded-view', false);
 | 
			
		||||
#else
 | 
			
		||||
pref('zen.view.experimental-rounded-view', true);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Glance
 | 
			
		||||
pref('zen.glance.enabled', true);
 | 
			
		||||
pref('zen.glance.hold-duration', 300); // in ms
 | 
			
		||||
pref('zen.glance.open-essential-external-links', true);
 | 
			
		||||
pref('zen.glance.activation-method', 'alt'); // ctrl, alt, shift, none, hold
 | 
			
		||||
 | 
			
		||||
pref('zen.view.sidebar-height-throttle', 200); // in ms
 | 
			
		||||
pref('zen.view.sidebar-expanded.max-width', 500);
 | 
			
		||||
 | 
			
		||||
#ifdef XP_MACOSX
 | 
			
		||||
pref('zen.view.mac.show-three-dot-menu', false);
 | 
			
		||||
pref('zen.widget.mac.mono-window-controls', true);
 | 
			
		||||
#endif
 | 
			
		||||
pref('zen.view.use-single-toolbar', true);
 | 
			
		||||
pref('zen.view.sidebar-expanded', true);
 | 
			
		||||
pref('zen.view.sidebar-collapsed.hide-mute-button', true);
 | 
			
		||||
pref('zen.view.experimental-force-window-controls-left', false);
 | 
			
		||||
 | 
			
		||||
#ifdef XP_MACOSX
 | 
			
		||||
pref('zen.view.grey-out-inactive-windows', false);
 | 
			
		||||
#else
 | 
			
		||||
pref('zen.view.grey-out-inactive-windows', true);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
pref('zen.view.hide-window-controls', true);
 | 
			
		||||
pref('zen.view.experimental-no-window-controls', false);
 | 
			
		||||
 | 
			
		||||
pref('zen.tabs.dim-pending', true);
 | 
			
		||||
 | 
			
		||||
pref('zen.keyboard.shortcuts.enabled', true);
 | 
			
		||||
pref('zen.keyboard.shortcuts.version', 0); // Empty string means default shortcuts
 | 
			
		||||
pref('zen.keyboard.shortcuts.disable-mainkeyset-clear', false); // for debugging
 | 
			
		||||
 | 
			
		||||
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.restore-pinned-tabs-to-pinned-url', false);
 | 
			
		||||
pref('zen.pinned-tab-manager.close-shortcut-behavior', 'reset-unload-switch');
 | 
			
		||||
 | 
			
		||||
// TODO: Check this out!
 | 
			
		||||
pref("browser.profiles.enabled", false);
 | 
			
		||||
 | 
			
		||||
// Zen Split View
 | 
			
		||||
pref('zen.splitView.enable-tab-drop', true);
 | 
			
		||||
pref('zen.splitView.min-resize-width', 7);
 | 
			
		||||
pref('zen.splitView.rearrange-hover-size', 24);
 | 
			
		||||
 | 
			
		||||
// Zen Download Animations
 | 
			
		||||
pref('zen.downloads.download-animation', true);
 | 
			
		||||
pref('zen.downloads.download-animation-duration', 1000); // ms
 | 
			
		||||
 | 
			
		||||
// Startup flags
 | 
			
		||||
pref('zen.startup.smooth-scroll-in-tabs', true);
 | 
			
		||||
 | 
			
		||||
// Zen Workspaces
 | 
			
		||||
pref('zen.workspaces.hide-default-container-indicator', true);
 | 
			
		||||
pref('zen.workspaces.force-container-workspace', false);
 | 
			
		||||
pref('zen.workspaces.open-new-tab-if-last-unpinned-tab-is-closed', false);
 | 
			
		||||
pref('zen.workspaces.show-workspace-indicator', true);
 | 
			
		||||
pref('zen.workspaces.swipe-actions', true);
 | 
			
		||||
pref('zen.workspaces.wrap-around-navigation', true);
 | 
			
		||||
pref('zen.workspaces.natural-scroll', false);
 | 
			
		||||
pref('zen.workspaces.scroll-modifier-key','ctrl'); // can be ctrl, alt, shift, or a meta key
 | 
			
		||||
pref('services.sync.engine.workspaces', false);
 | 
			
		||||
pref('zen.workspaces.container-specific-essentials-enabled', false);
 | 
			
		||||
 | 
			
		||||
// Essentials
 | 
			
		||||
pref('zen.essentials.enabled', true);
 | 
			
		||||
 | 
			
		||||
// Zen Watermark
 | 
			
		||||
#ifdef MOZILLA_OFFICIAL
 | 
			
		||||
pref('zen.watermark.enabled', true, sticky);
 | 
			
		||||
#else
 | 
			
		||||
pref('zen.watermark.enabled', false, sticky);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Privacy
 | 
			
		||||
pref('dom.private-attribution.submission.enabled', false);
 | 
			
		||||
pref('dom.security.https_only_mode', true);
 | 
			
		||||
 | 
			
		||||
// Crash reports
 | 
			
		||||
pref("breakpad.reportURL", "");
 | 
			
		||||
pref("browser.tabs.crashReporting.sendReport", false);
 | 
			
		||||
pref("browser.crashReports.unsubmittedCheck.autoSubmit2", false);
 | 
			
		||||
 | 
			
		||||
// TLS / SSL
 | 
			
		||||
pref("security.ssl.treat_unsafe_negotiation_as_broken", true);
 | 
			
		||||
pref("browser.xul.error_pages.expert_bad_cert", true);
 | 
			
		||||
pref("security.tls.enable_0rtt_data", false);
 | 
			
		||||
pref("network.http.http3.enable_0rtt", false);
 | 
			
		||||
 | 
			
		||||
// Network
 | 
			
		||||
pref("network.http.max-urgent-start-excessive-connections-per-host", 5);
 | 
			
		||||
pref("network.dnsCacheExpiration", 3600);
 | 
			
		||||
pref("network.http.max-persistent-connections-per-proxy", 48); // default=32
 | 
			
		||||
pref("network.websocket.max-connections", 400); // default=200
 | 
			
		||||
pref("network.ssl_tokens_cache_capacity", 32768);
 | 
			
		||||
 | 
			
		||||
// Enable importers for other browsers
 | 
			
		||||
pref('browser.migrate.vivaldi.enabled', true);
 | 
			
		||||
pref('browser.migrate.opera-gx.enabled', true);
 | 
			
		||||
pref('browser.migrate.opera.enabled', true);
 | 
			
		||||
 | 
			
		||||
// DNS
 | 
			
		||||
// pref('network.trr.mode', 5);
 | 
			
		||||
 | 
			
		||||
// security: They must enable this themselves, to avoid people downloading malware
 | 
			
		||||
pref('xpinstall.signatures.required', true);
 | 
			
		||||
 | 
			
		||||
// Experimental Zen Features
 | 
			
		||||
// Strategy to use for bytecode cache (Thanks https://github.com/gunir)
 | 
			
		||||
pref('dom.script_loader.bytecode_cache.strategy', 2);
 | 
			
		||||
pref("dom.text_fragments.enabled", true);
 | 
			
		||||
 | 
			
		||||
pref("layout.css.grid-template-masonry-value.enabled", true);
 | 
			
		||||
pref("dom.security.sanitizer.enabled", true);
 | 
			
		||||
 | 
			
		||||
// Pocket
 | 
			
		||||
pref("extensions.pocket.enabled", false);
 | 
			
		||||
 | 
			
		||||
// MIXED CONTENT + CROSS-SITE
 | 
			
		||||
pref("pdfjs.enableScripting", false);
 | 
			
		||||
pref("extensions.postDownloadThirdPartyPrompt", false);
 | 
			
		||||
 | 
			
		||||
// Downloads
 | 
			
		||||
pref("browser.download.manager.addToRecentDocs", false);
 | 
			
		||||
pref('browser.download.open_pdf_attachments_inline', true);
 | 
			
		||||
pref('browser.download.alwaysOpenPanel', false);
 | 
			
		||||
 | 
			
		||||
// Tracking protection
 | 
			
		||||
pref("browser.helperApps.deleteTempFileOnExit", true);
 | 
			
		||||
pref("browser.uitour.enabled", false);
 | 
			
		||||
 | 
			
		||||
// Disable cache for private browsing
 | 
			
		||||
pref("browser.privatebrowsing.forceMediaMemoryCache", true);
 | 
			
		||||
 | 
			
		||||
// Enable private suggestions
 | 
			
		||||
pref('browser.search.suggest.enabled', true);
 | 
			
		||||
pref('browser.search.suggest.enabled.private', true);
 | 
			
		||||
 | 
			
		||||
pref("extensions.enabledScopes", 5); // [HIDDEN PREF]
 | 
			
		||||
 | 
			
		||||
// Media codecs
 | 
			
		||||
pref('image.jxl.enabled', true, locked);
 | 
			
		||||
pref("svg.context-properties.content.enabled", true);
 | 
			
		||||
pref("image.avif.enabled", true, locked);
 | 
			
		||||
 | 
			
		||||
// Smooth scrolling
 | 
			
		||||
#ifndef XP_MACOSX
 | 
			
		||||
pref("apz.overscroll.enabled", true);
 | 
			
		||||
pref("general.smoothScroll", true);
 | 
			
		||||
pref("general.smoothScroll.msdPhysics.enabled", true);
 | 
			
		||||
pref("general.smoothScroll.currentVelocityWeighting", "0.15");
 | 
			
		||||
pref("general.smoothScroll.stopDecelerationWeighting", "0.6");
 | 
			
		||||
pref("mousewheel.min_line_scroll_amount", 10);
 | 
			
		||||
pref("general.smoothScroll.mouseWheel.durationMinMS", 80);
 | 
			
		||||
pref("general.smoothScroll.msdPhysics.continuousMotionMaxDeltaMS", 12);
 | 
			
		||||
pref("general.smoothScroll.msdPhysics.motionBeginSpringConstant", 600);
 | 
			
		||||
pref("general.smoothScroll.msdPhysics.regularSpringConstant", 650);
 | 
			
		||||
pref("general.smoothScroll.msdPhysics.slowdownMinDeltaMS", 25);
 | 
			
		||||
pref("general.smoothScroll.msdPhysics.slowdownSpringConstant", 250);
 | 
			
		||||
pref("mousewheel.default.delta_multiplier_y", 200);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(XP_WIN)
 | 
			
		||||
pref("dom.ipc.processPriorityManager.backgroundUsesEcoQoS", false);
 | 
			
		||||
#include windows.inc
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef UNIX_BUT_NOT_MAC
 | 
			
		||||
pref("widget.gtk.rounded-bottom-corners.enabled", true);
 | 
			
		||||
#include linux.inc
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
pref('browser.newtabpage.activity-stream.system.showWeather', false);
 | 
			
		||||
 | 
			
		||||
// Enable experimental settings page (Used for Zen Labs)
 | 
			
		||||
pref('browser.preferences.experimental', true);
 | 
			
		||||
 | 
			
		||||
// Prefetching:
 | 
			
		||||
pref("network.dns.disablePrefetch", false);
 | 
			
		||||
pref("network.prefetch-next", true);
 | 
			
		||||
pref("network.dns.disablePrefetchFromHTTPS", false);
 | 
			
		||||
pref("network.predictor.enable-hover-on-ssl", true);
 | 
			
		||||
pref("network.http.rcwn.enabled", false);
 | 
			
		||||
 | 
			
		||||
// Disable Firefox's revamp
 | 
			
		||||
pref("sidebar.revamp", false, locked);
 | 
			
		||||
pref("sidebar.verticalTabs", false, locked);
 | 
			
		||||
 | 
			
		||||
// Better Windows theming
 | 
			
		||||
pref("widget.non-native-theme.scrollbar.style", 2);
 | 
			
		||||
pref("widget.non-native-theme.use-theme-accent", true);
 | 
			
		||||
 | 
			
		||||
// Expose Letterboxing https://github.com/zen-browser/desktop/issues/475
 | 
			
		||||
pref("privacy.resistFingerprinting.letterboxing", false);
 | 
			
		||||
pref("privacy.resistFingerprinting.letterboxing.dimensions", "");
 | 
			
		||||
 | 
			
		||||
// Remove Inspect Accessibity Properties menu
 | 
			
		||||
pref("devtools.accessibility.enabled", false);
 | 
			
		||||
 | 
			
		||||
// Enable GPU by default
 | 
			
		||||
// pref('gfx.webrender.all', true);
 | 
			
		||||
 | 
			
		||||
// VAAPI/FFMPEG is Linux only
 | 
			
		||||
#ifdef MOZ_WIDGET_GTK
 | 
			
		||||
pref('media.ffmpeg.vaapi.enabled', true);
 | 
			
		||||
pref('media.ffmpeg.encoder.enabled', true);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Fix buffering issues: Youtube, Archive bugzilla.mozilla.org/show_bug.cgi?id=1854077
 | 
			
		||||
pref("network.fetchpriority.enabled", true);
 | 
			
		||||
 | 
			
		||||
// No Proxy should be default, Use system proxy allows antivirus, virus or system proxy to MITM or slowing down Zen
 | 
			
		||||
pref("network.proxy.type", 0);
 | 
			
		||||
 | 
			
		||||
// for the new layout:
 | 
			
		||||
pref('browser.download.autohideButton', false);
 | 
			
		||||
 | 
			
		||||
// Enable transparent background for macos
 | 
			
		||||
#ifdef XP_MACOSX
 | 
			
		||||
pref('widget.macos.titlebar-blend-mode.behind-window', true);
 | 
			
		||||
// 1. hudWindow
 | 
			
		||||
// 2. fullScreenUI
 | 
			
		||||
// 3. popover
 | 
			
		||||
// 4. menu
 | 
			
		||||
// 5. toolTip
 | 
			
		||||
// 6. headerView
 | 
			
		||||
// 7. underlay
 | 
			
		||||
pref('zen.widget.macos.window-material', 3);
 | 
			
		||||
#include macos.inc
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Enable transparent background for linux
 | 
			
		||||
#ifdef MOZ_WIDGET_GTK
 | 
			
		||||
pref('zen.widget.linux.transparency', false);
 | 
			
		||||
#include urlbar.inc
 | 
			
		||||
#include newtab.inc
 | 
			
		||||
#include pdf.inc
 | 
			
		||||
#include extensions.inc
 | 
			
		||||
#include privacy.inc
 | 
			
		||||
#include media.inc
 | 
			
		||||
#include browser.inc
 | 
			
		||||
 | 
			
		||||
#include features.inc
 | 
			
		||||
 | 
			
		||||
#ifndef XP_MACOSX
 | 
			
		||||
#include smoothscroll.inc
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Urlbar and autocomplete
 | 
			
		||||
pref("browser.urlbar.maxRichResults", 8);
 | 
			
		||||
pref("browser.urlbar.trimHttps", true);
 | 
			
		||||
pref("browser.search.separatePrivateDefault.ui.enabled", true);
 | 
			
		||||
pref("browser.urlbar.update2.engineAliasRefresh", true);
 | 
			
		||||
pref("browser.search.suggest.enabled", false);
 | 
			
		||||
pref("browser.urlbar.quicksuggest.enabled", false, locked);
 | 
			
		||||
pref("browser.urlbar.suggest.quicksuggest.sponsored", false, locked);
 | 
			
		||||
pref("browser.urlbar.suggest.quicksuggest.nonsponsored", false, locked);
 | 
			
		||||
pref("browser.urlbar.groupLabels.enabled", false);
 | 
			
		||||
pref("browser.urlbar.keepPanelOpenDuringImeComposition", true); // IMPORTANT: Fixes closing the urlbar when on some languages
 | 
			
		||||
pref("browser.formfill.enable", false);
 | 
			
		||||
pref("security.insecure_connection_text.enabled", true);
 | 
			
		||||
pref("security.insecure_connection_text.pbmode.enabled", true);
 | 
			
		||||
pref("network.IDN_show_punycode", true);
 | 
			
		||||
 | 
			
		||||
// Telemetry
 | 
			
		||||
pref("datareporting.policy.dataSubmissionEnabled", false, locked);
 | 
			
		||||
pref("datareporting.healthreport.uploadEnabled", false, locked);
 | 
			
		||||
pref("toolkit.telemetry.unified", false, locked);
 | 
			
		||||
pref("toolkit.telemetry.enabled", false, locked);
 | 
			
		||||
pref("toolkit.telemetry.server", "data:,", locked);
 | 
			
		||||
pref("toolkit.telemetry.archive.enabled", false, locked);
 | 
			
		||||
pref("toolkit.telemetry.newProfilePing.enabled", false, locked);
 | 
			
		||||
pref("toolkit.telemetry.shutdownPingSender.enabled", false, locked);
 | 
			
		||||
pref("toolkit.telemetry.updatePing.enabled", false, locked);
 | 
			
		||||
pref("toolkit.telemetry.bhrPing.enabled", false, locked);
 | 
			
		||||
pref("toolkit.telemetry.firstShutdownPing.enabled", false, locked);
 | 
			
		||||
pref("toolkit.telemetry.coverage.opt-out", true, locked);
 | 
			
		||||
pref("toolkit.coverage.opt-out", true, locked);
 | 
			
		||||
pref("toolkit.coverage.endpoint.base", "", locked);
 | 
			
		||||
pref("browser.newtabpage.activity-stream.feeds.telemetry", false, locked);
 | 
			
		||||
pref("browser.newtabpage.activity-stream.telemetry", false, locked);
 | 
			
		||||
pref("browser.ping-centre.telemetry", false);
 | 
			
		||||
pref("browser.attribution.enabled", false);
 | 
			
		||||
pref("toolkit.telemetry.pioneer-new-studies-available", false);
 | 
			
		||||
pref("app.shield.optoutstudies.enabled", false, locked);
 | 
			
		||||
pref("app.normandy.enabled", false, locked);
 | 
			
		||||
pref("app.normandy.api_url", "", locked);
 | 
			
		||||
 | 
			
		||||
// Fullscreen notice
 | 
			
		||||
pref("full-screen-api.transition-duration.enter", "0 0");
 | 
			
		||||
pref("full-screen-api.transition-duration.leave", "0 0");
 | 
			
		||||
pref("full-screen-api.warning.delay", -1);
 | 
			
		||||
pref("full-screen-api.warning.timeout", 0);
 | 
			
		||||
 | 
			
		||||
// Common UI changes
 | 
			
		||||
pref("browser.privatebrowsing.vpnpromourl", "", locked);
 | 
			
		||||
pref("extensions.getAddons.showPane", false);
 | 
			
		||||
pref("extensions.htmlaboutaddons.recommendations.enabled", false);
 | 
			
		||||
pref("browser.discovery.enabled", false);
 | 
			
		||||
pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons", false);
 | 
			
		||||
pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features", false);
 | 
			
		||||
pref("browser.preferences.moreFromMozilla", false, locked);
 | 
			
		||||
pref("browser.aboutwelcome.enabled", false);
 | 
			
		||||
 | 
			
		||||
// AI/ML stuff
 | 
			
		||||
pref("browser.ml.chat.enabled", false);
 | 
			
		||||
pref("browser.ml.chat.shortcuts", false);
 | 
			
		||||
pref("browser.ml.chat.shortcuts.custom", false);
 | 
			
		||||
pref("browser.ml.chat.sidebar", false);
 | 
			
		||||
pref("browser.ml.enable", false);
 | 
			
		||||
 | 
			
		||||
// ---- Experimental settings to try make zen faster
 | 
			
		||||
pref("media.memory_cache_max_size", 1048576);
 | 
			
		||||
pref("media.cache_readahead_limit", 9000);
 | 
			
		||||
pref("media.cache_resume_threshold", 3600);
 | 
			
		||||
pref("media.memory_caches_combined_limit_kb", 2560000);
 | 
			
		||||
 | 
			
		||||
pref("image.mem.decode_bytes_at_a_time", 32768);
 | 
			
		||||
 | 
			
		||||
// Enable GPU by default
 | 
			
		||||
pref("gfx.canvas.accelerated", true);
 | 
			
		||||
pref("media.hardware-video-decoding.enabled", true);
 | 
			
		||||
pref("layers.gpu-process.enabled", true);
 | 
			
		||||
 | 
			
		||||
// Picture-in-picture
 | 
			
		||||
pref("media.videocontrols.picture-in-picture.video-toggle.enabled", true);
 | 
			
		||||
// TODO: Enable once we have a proper settings page
 | 
			
		||||
pref("media.videocontrols.picture-in-picture.enable-when-switching-tabs.enabled", false);
 | 
			
		||||
 | 
			
		||||
// More Privacy
 | 
			
		||||
pref("extensions.getAddons.cache.enabled", false);
 | 
			
		||||
#include performance.inc
 | 
			
		||||
#include pip.inc
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
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
 | 
			
		||||
+++ b/browser/base/content/aboutDialog.js
 | 
			
		||||
@@ -52,7 +52,7 @@ function init() {
 | 
			
		||||
@@ -20,3 +20,18 @@ index f6e1391baf12abb91c85a95107bb3923118746c0..76c7b75a4e29056110f1631a50047c4d
 | 
			
		||||
     versionIdKey += "-nightly";
 | 
			
		||||
     let buildID = Services.appinfo.appBuildID;
 | 
			
		||||
     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
 | 
			
		||||
index c64980810570fcea84e33fdc2d66ac42a79f4e46..b7198e810a7510fa82cc6801cfd01c88a08d42c1 100644
 | 
			
		||||
index c64980810570fcea84e33fdc2d66ac42a79f4e46..6ef9bf4b88f0a0539d833f662c4dd890fd1fde93 100644
 | 
			
		||||
--- a/browser/base/content/aboutDialog.xhtml
 | 
			
		||||
+++ b/browser/base/content/aboutDialog.xhtml
 | 
			
		||||
@@ -35,6 +35,7 @@
 | 
			
		||||
@@ -10,7 +10,18 @@ index c64980810570fcea84e33fdc2d66ac42a79f4e46..b7198e810a7510fa82cc6801cfd01c88
 | 
			
		||||
   </linkset>
 | 
			
		||||
 
 | 
			
		||||
   <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>
 | 
			
		||||
           </vbox>
 | 
			
		||||
           <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" useoriginprincipal="true" href="about:credits" data-l10n-name="community-creditsLink"/>
 | 
			
		||||
           </description>
 | 
			
		||||
+#if 0
 | 
			
		||||
           <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://www.mozilla.org/contribute/?utm_source=firefox-browser&utm_medium=firefox-desktop&utm_campaign=about-dialog" data-l10n-name="helpus-getInvolvedLink"/>
 | 
			
		||||
           </description>
 | 
			
		||||
+#endif
 | 
			
		||||
-          <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://www.mozilla.org/contribute/?utm_source=firefox-browser&utm_medium=firefox-desktop&utm_campaign=about-dialog" data-l10n-name="helpus-getInvolvedLink"/>
 | 
			
		||||
-          </description>
 | 
			
		||||
         </vbox>
 | 
			
		||||
       </vbox>
 | 
			
		||||
     </hbox>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +0,0 @@
 | 
			
		||||
diff --git a/browser/base/content/appmenu-viewcache.inc.xhtml b/browser/base/content/appmenu-viewcache.inc.xhtml
 | 
			
		||||
index 3c5c4f29b1de25a4ce17089502f2251a27e5c7f5..dfa3260ed3c2bb6067745696fbf103c7e56c639a 100644
 | 
			
		||||
--- a/browser/base/content/appmenu-viewcache.inc.xhtml
 | 
			
		||||
+++ b/browser/base/content/appmenu-viewcache.inc.xhtml
 | 
			
		||||
@@ -421,6 +421,10 @@
 | 
			
		||||
                      class="subviewbutton"
 | 
			
		||||
                      data-l10n-id="appmenu-customizetoolbar"
 | 
			
		||||
                      command="cmd_CustomizeToolbars"/>
 | 
			
		||||
+      <toolbarbutton id="appmenu-zen-share-rice"
 | 
			
		||||
+        class="subviewbutton"
 | 
			
		||||
+        data-l10n-id="appmenu-zen-share-rice"
 | 
			
		||||
+        oncommand="gZenThemePicker.shareTheme()" />
 | 
			
		||||
       <toolbarseparator/>
 | 
			
		||||
       <html:h2 id="appmenu-developer-tools"
 | 
			
		||||
           data-l10n-id="appmenu-developer-tools-subheader"
 | 
			
		||||
@@ -1,8 +1,35 @@
 | 
			
		||||
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
 | 
			
		||||
+++ 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);
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +1,15 @@
 | 
			
		||||
diff --git a/browser/base/content/browser-box.inc.xhtml b/browser/base/content/browser-box.inc.xhtml
 | 
			
		||||
index 7d7e8697f02f90d4f336c9ab0a73a89848e0c21c..d113b439888d26629ce5f6b5d35f8fa12249774b 100644
 | 
			
		||||
index 7d7e8697f02f90d4f336c9ab0a73a89848e0c21c..64e950106dd05b443ce72107613ac9cc405d56ea 100644
 | 
			
		||||
--- a/browser/base/content/browser-box.inc.xhtml
 | 
			
		||||
+++ b/browser/base/content/browser-box.inc.xhtml
 | 
			
		||||
@@ -23,7 +23,13 @@
 | 
			
		||||
@@ -23,7 +23,15 @@
 | 
			
		||||
     <browser id="sidebar" autoscroll="false" disablehistory="true" disablefullscreen="true" tooltip="aHTMLTooltip"/>
 | 
			
		||||
   </vbox>
 | 
			
		||||
   <splitter id="sidebar-splitter" class="chromeclass-extrachrome sidebar-splitter" resizebefore="sibling" resizeafter="none" hidden="true"/>
 | 
			
		||||
+<vbox flex="1" id="zen-appcontent-wrapper">
 | 
			
		||||
+  <html:div id="zen-appcontent-navbar-container"></html:div>
 | 
			
		||||
+  <html:div id="zen-appcontent-navbar-wrapper">
 | 
			
		||||
+    <html:div id="zen-appcontent-navbar-container"></html:div>
 | 
			
		||||
+  </html:div>
 | 
			
		||||
+  <hbox id="zen-tabbox-wrapper" flex="1">
 | 
			
		||||
   <tabbox id="tabbrowser-tabbox" flex="1" tabcontainer="tabbrowser-tabs">
 | 
			
		||||
+#include zen-tabbrowser-elements.inc.xhtml
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@ index 3d5173315812589c0b79beec5f0419fc37cb8868..c4216db9e414fbbaead6ecd89b40366b
 | 
			
		||||
     TelemetryTimestamps.add("delayedStartupStarted");
 | 
			
		||||
 
 | 
			
		||||
     this._cancelDelayedStartup();
 | 
			
		||||
+    ZenWorkspaces.afterLoadInit();
 | 
			
		||||
+    gZenWorkspaces.afterLoadInit();
 | 
			
		||||
 
 | 
			
		||||
     gBrowser.addEventListener(
 | 
			
		||||
       "PermissionStateChange",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
 | 
			
		||||
index ea79d296e7dd0f8fd812b0677a252af5cf7ad26e..bd95ef5d6b99399c859af1cf71d9d62477f4ac2b 100644
 | 
			
		||||
index 6d664917a5a3bb1cea8a747e42e8bc0065ec999e..5059293ebfa29d646455b7a3505bd6eae408ba64 100644
 | 
			
		||||
--- a/browser/base/content/browser.js
 | 
			
		||||
+++ b/browser/base/content/browser.js
 | 
			
		||||
@@ -33,6 +33,7 @@ ChromeUtils.defineESModuleGetters(this, {
 | 
			
		||||
@@ -10,33 +10,32 @@ index ea79d296e7dd0f8fd812b0677a252af5cf7ad26e..bd95ef5d6b99399c859af1cf71d9d624
 | 
			
		||||
   DevToolsSocketStatus:
 | 
			
		||||
     "resource://devtools/shared/security/DevToolsSocketStatus.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);
 | 
			
		||||
     TranslationsParent.onLocationChange(gBrowser.selectedBrowser);
 | 
			
		||||
 
 | 
			
		||||
+    gZenViewSplitter.onLocationChange(gBrowser.selectedBrowser);
 | 
			
		||||
+    ZenWorkspaces.onLocationChange(gBrowser.selectedBrowser);
 | 
			
		||||
+    gZenTabUnloader.onLocationChange(gBrowser.selectedBrowser);
 | 
			
		||||
+    gZenWorkspaces.onLocationChange(gBrowser.selectedBrowser);
 | 
			
		||||
+    gZenPinnedTabManager.onLocationChange(gBrowser.selectedBrowser);
 | 
			
		||||
+
 | 
			
		||||
     PictureInPicture.updateUrlbarToggle(gBrowser.selectedBrowser);
 | 
			
		||||
 
 | 
			
		||||
     if (!gMultiProcessBrowser) {
 | 
			
		||||
@@ -4814,7 +4820,7 @@ function switchToTabHavingURI(
 | 
			
		||||
@@ -4816,7 +4821,7 @@ function switchToTabHavingURI(
 | 
			
		||||
       ignoreQueryString || replaceQueryString,
 | 
			
		||||
       ignoreFragmentWhenComparing
 | 
			
		||||
     );
 | 
			
		||||
-    let browsers = aWindow.gBrowser.browsers;
 | 
			
		||||
+    let browsers = aWindow.ZenWorkspaces.allUsedBrowsers;
 | 
			
		||||
+    let browsers = aWindow.gZenWorkspaces.allUsedBrowsers;
 | 
			
		||||
     for (let i = 0; i < browsers.length; i++) {
 | 
			
		||||
       let browser = browsers[i];
 | 
			
		||||
       let browserCompare = cleanURL(
 | 
			
		||||
@@ -4857,7 +4863,7 @@ function switchToTabHavingURI(
 | 
			
		||||
@@ -4859,7 +4864,7 @@ function switchToTabHavingURI(
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
         if (!doAdopt) {
 | 
			
		||||
-          aWindow.gBrowser.tabContainer.selectedIndex = i;
 | 
			
		||||
+          aWindow.ZenWorkspaces.switchIfNeeded(browser, i);
 | 
			
		||||
+          aWindow.gZenWorkspaces.switchIfNeeded(browser, i);
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
         return true;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml
 | 
			
		||||
index 51a25aaa5558e6e17246d54a7ed95d5ddf3ecdab..b49984c8711fc9f5f19f0cf6ecca07a8cca0d125 100644
 | 
			
		||||
index 8f8c5536cb6e54300897180ca3f950974c60e930..79305485631f14712d8b2674f477b641ec53fcd6 100644
 | 
			
		||||
--- a/browser/base/content/browser.xhtml
 | 
			
		||||
+++ b/browser/base/content/browser.xhtml
 | 
			
		||||
@@ -26,6 +26,7 @@
 | 
			
		||||
@@ -10,7 +10,7 @@ index 51a25aaa5558e6e17246d54a7ed95d5ddf3ecdab..b49984c8711fc9f5f19f0cf6ecca07a8
 | 
			
		||||
         persist="screenX screenY width height sizemode"
 | 
			
		||||
         data-l10n-sync="true">
 | 
			
		||||
 <head>
 | 
			
		||||
@@ -104,8 +105,11 @@
 | 
			
		||||
@@ -105,8 +106,11 @@
 | 
			
		||||
 
 | 
			
		||||
   <title data-l10n-id="browser-main-window-default-title"></title>
 | 
			
		||||
 
 | 
			
		||||
@@ -22,12 +22,11 @@ index 51a25aaa5558e6e17246d54a7ed95d5ddf3ecdab..b49984c8711fc9f5f19f0cf6ecca07a8
 | 
			
		||||
 </head>
 | 
			
		||||
 <html:body xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 | 
			
		||||
 # All sets except for popupsets (commands, keys, and stringbundles)
 | 
			
		||||
@@ -127,9 +131,12 @@
 | 
			
		||||
@@ -128,9 +132,11 @@
 | 
			
		||||
     </vbox>
 | 
			
		||||
   </html:template>
 | 
			
		||||
 
 | 
			
		||||
+<hbox id="zen-main-app-wrapper" flex="1" persist="zen-compact-mode">
 | 
			
		||||
+  <vbox id="zen-toast-container"></vbox>
 | 
			
		||||
 #include navigator-toolbox.inc.xhtml
 | 
			
		||||
 
 | 
			
		||||
 #include browser-box.inc.xhtml
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
diff --git a/browser/base/content/navigator-toolbox.inc.xhtml b/browser/base/content/navigator-toolbox.inc.xhtml
 | 
			
		||||
index 00c8976d3e258c0875d7da2f3ec823d8907a84c9..b5735712aaa7c2ae2baa4b858e735413b130ca94 100644
 | 
			
		||||
index 00c8976d3e258c0875d7da2f3ec823d8907a84c9..cc61d5a845b5ce22a61f5a1aab8b280b2bcdf101 100644
 | 
			
		||||
--- a/browser/base/content/navigator-toolbox.inc.xhtml
 | 
			
		||||
+++ b/browser/base/content/navigator-toolbox.inc.xhtml
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
@@ -22,27 +22,24 @@ index 00c8976d3e258c0875d7da2f3ec823d8907a84c9..b5735712aaa7c2ae2baa4b858e735413
 | 
			
		||||
   <toolbar id="TabsToolbar"
 | 
			
		||||
            class="browser-toolbar browser-titlebar"
 | 
			
		||||
            fullscreentoolbar="true"
 | 
			
		||||
@@ -50,6 +50,10 @@
 | 
			
		||||
@@ -50,6 +50,8 @@
 | 
			
		||||
               tooltip="tabbrowser-tab-tooltip"
 | 
			
		||||
               orient="horizontal"
 | 
			
		||||
               stopwatchid="tabClick">
 | 
			
		||||
+<html:div id="zen-essentials-wrapper" skipintoolbarset="true"></html:div>
 | 
			
		||||
+<hbox id="zen-current-workspace-indicator-container"></hbox>
 | 
			
		||||
+<html:div id="zen-essentials" skipintoolbarset="true"></html:div>
 | 
			
		||||
+<html:div id="zen-tabs-wrapper">
 | 
			
		||||
+<html:div id="zen-browser-tabs-container">
 | 
			
		||||
           <hbox class="tab-drop-indicator" hidden="true"/>
 | 
			
		||||
           <html:span id="tab-drag-empty-feedback" role="presentation"/>
 | 
			
		||||
 # If the name (tabbrowser-arrowscrollbox) or structure of this changes
 | 
			
		||||
@@ -76,6 +80,8 @@
 | 
			
		||||
@@ -76,6 +78,7 @@
 | 
			
		||||
                               tooltip="dynamic-shortcut-tooltip"
 | 
			
		||||
                               data-l10n-id="tabs-toolbar-new-tab"/>
 | 
			
		||||
           <html:span id="tabbrowser-tab-a11y-desc" hidden="true"/>
 | 
			
		||||
+</html:div>
 | 
			
		||||
+</html:div>
 | 
			
		||||
         </tabs>
 | 
			
		||||
 
 | 
			
		||||
         <toolbarbutton id="new-tab-button"
 | 
			
		||||
@@ -101,9 +107,10 @@
 | 
			
		||||
@@ -101,9 +104,10 @@
 | 
			
		||||
 #include private-browsing-indicator.inc.xhtml
 | 
			
		||||
     <toolbarbutton class="content-analysis-indicator toolbarbutton-1 content-analysis-indicator-icon"/>
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -29,19 +29,15 @@
 | 
			
		||||
</linkset>
 | 
			
		||||
 | 
			
		||||
# Scripts used all over the browser
 | 
			
		||||
<script>
 | 
			
		||||
Services.scriptloader.loadSubScript("chrome://browser/content/ZenUIManager.mjs", this);
 | 
			
		||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenFolders.mjs", this);
 | 
			
		||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenThemesCommon.mjs", this);
 | 
			
		||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenThemesImporter.mjs", this);
 | 
			
		||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenCompactMode.mjs", this);
 | 
			
		||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenTabUnloader.mjs", this);
 | 
			
		||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenPinnedTabsStorage.mjs", this);
 | 
			
		||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenWorkspacesStorage.mjs", this);
 | 
			
		||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenPinnedTabManager.mjs", this);
 | 
			
		||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenGradientGenerator.mjs", this);
 | 
			
		||||
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenViewSplitter.mjs", this);
 | 
			
		||||
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>
 | 
			
		||||
<script src="chrome://browser/content/ZenUIManager.mjs"></script>
 | 
			
		||||
<script src="chrome://browser/content/zen-components/ZenFolders.mjs"></script>
 | 
			
		||||
<script src="chrome://browser/content/zen-components/ZenMods.mjs"></script>
 | 
			
		||||
<script src="chrome://browser/content/zen-components/ZenCompactMode.mjs"></script>
 | 
			
		||||
<script src="chrome://browser/content/zen-components/ZenPinnedTabsStorage.mjs"></script>
 | 
			
		||||
<script src="chrome://browser/content/zen-components/ZenWorkspacesStorage.mjs"></script>
 | 
			
		||||
<script src="chrome://browser/content/zen-components/ZenPinnedTabManager.mjs"></script>
 | 
			
		||||
<script src="chrome://browser/content/zen-components/ZenGradientGenerator.mjs"></script>
 | 
			
		||||
<script src="chrome://browser/content/zen-components/ZenViewSplitter.mjs"></script>
 | 
			
		||||
<script src="chrome://browser/content/zen-components/ZenGlanceManager.mjs"></script>
 | 
			
		||||
<script src="chrome://browser/content/zen-components/ZenMediaController.mjs"></script>
 | 
			
		||||
<script src="chrome://browser/content/zen-components/ZenDownloadAnimation.mjs"></script>
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,7 @@
 | 
			
		||||
        content/browser/ZenCustomizableUI.sys.mjs                               (../../zen/common/ZenCustomizableUI.sys.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/ZenSessionStore.mjs                      (../../zen/common/ZenSessionStore.mjs)
 | 
			
		||||
 | 
			
		||||
        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)
 | 
			
		||||
@@ -34,21 +35,19 @@
 | 
			
		||||
        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-components/ZenThemesCommon.mjs                      (../../zen/mods/ZenThemesCommon.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/ZenMods.mjs                      (../../zen/mods/ZenMods.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/ZenWorkspaces.mjs                        (../../zen/workspaces/ZenWorkspaces.mjs)
 | 
			
		||||
        content/browser/zen-components/ZenWorkspacesStorage.mjs                 (../../zen/workspaces/ZenWorkspacesStorage.mjs)
 | 
			
		||||
        content/browser/zen-components/ZenWorkspacesSync.mjs                    (../../zen/workspaces/ZenWorkspacesSync.mjs)
 | 
			
		||||
        content/browser/zen-components/ZenGradientGenerator.mjs                 (../../zen/workspaces/ZenGradientGenerator.mjs)
 | 
			
		||||
        content/browser/zen-styles/zen-workspaces.css                           (../../zen/workspaces/zen-workspaces.css)
 | 
			
		||||
*       content/browser/zen-styles/zen-workspaces.css                           (../../zen/workspaces/zen-workspaces.css)
 | 
			
		||||
        content/browser/zen-styles/zen-gradient-generator.css                   (../../zen/workspaces/zen-gradient-generator.css)
 | 
			
		||||
 | 
			
		||||
        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/ZenPinnedTabManager.mjs                  (../../zen/tabs/ZenPinnedTabManager.mjs)
 | 
			
		||||
*       content/browser/zen-styles/zen-tabs.css                                 (../../zen/tabs/zen-tabs.css)
 | 
			
		||||
@@ -56,8 +55,6 @@
 | 
			
		||||
 | 
			
		||||
        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-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-styles/zen-folders.css                              (../../zen/folders/zen-folders.css)
 | 
			
		||||
@@ -73,7 +70,7 @@
 | 
			
		||||
        content/browser/zen-styles/zen-download-box-animation.css               (../../zen/downloads/zen-download-box-animation.css)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        # Images                
 | 
			
		||||
        # Images
 | 
			
		||||
        content/browser/zen-images/gradient.png                                 (../../zen/images/gradient.png)
 | 
			
		||||
        content/browser/zen-images/brand-header.svg                             (../../zen/images/brand-header.svg)
 | 
			
		||||
        content/browser/zen-images/layouts/collapsed.png                        (../../zen/images/layouts/collapsed.png)
 | 
			
		||||
@@ -85,7 +82,7 @@
 | 
			
		||||
        content/browser/zen-images/downloads/download.svg                       (../../zen/images/downloads/download.svg)
 | 
			
		||||
        content/browser/zen-images/downloads/archive.svg                       (../../zen/images/downloads/archive.svg)
 | 
			
		||||
 | 
			
		||||
        # Fonts         
 | 
			
		||||
        # Fonts
 | 
			
		||||
        content/browser/zen-fonts/JunicodeVF-Italic.woff2                       (../../zen/fonts/JunicodeVF-Italic.woff2)
 | 
			
		||||
        content/browser/zen-fonts/JunicodeVF-Roman.woff2                        (../../zen/fonts/JunicodeVF-Roman.woff2)
 | 
			
		||||
 | 
			
		||||
@@ -103,4 +100,4 @@
 | 
			
		||||
        content/browser/zen-images/favicons/slack.ico                             (../../zen/images/favicons/slack.ico)
 | 
			
		||||
        content/browser/zen-images/favicons/reddit.ico                            (../../zen/images/favicons/reddit.ico)
 | 
			
		||||
        content/browser/zen-images/favicons/x.ico                                 (../../zen/images/favicons/x.ico)
 | 
			
		||||
        content/browser/zen-images/favicons/trello.ico                            (../../zen/images/favicons/trello.ico)
 | 
			
		||||
        content/browser/zen-images/favicons/trello.ico                            (../../zen/images/favicons/trello.ico)
 | 
			
		||||
 
 | 
			
		||||
@@ -43,10 +43,6 @@
 | 
			
		||||
 | 
			
		||||
  <command id="cmd_zenCopyCurrentURL" />
 | 
			
		||||
  <command id="cmd_zenCopyCurrentURLMarkdown" />
 | 
			
		||||
 | 
			
		||||
  <command id="cmd_zenUnloadTab" />
 | 
			
		||||
  <command id="cmd_zenPreventUnloadTab" />
 | 
			
		||||
  <command id="cmd_zenIgnoreUnloadTab" />
 | 
			
		||||
</commandset>
 | 
			
		||||
 | 
			
		||||
<keyset id="zenKeyset"></keyset>
 | 
			
		||||
 
 | 
			
		||||
@@ -45,7 +45,7 @@
 | 
			
		||||
          <label data-l10n-id="zen-panel-ui-gradient-generator-custom-color"></label>
 | 
			
		||||
          <hbox>
 | 
			
		||||
            <html:input type="text" placeholder="#000000" id="PanelUI-zen-gradient-generator-custom-input" />
 | 
			
		||||
            <toolbarbutton id="PanelUI-zen-gradient-generator-color-custom-add" class="subviewbutton" data-l10n-id="zen-panel-ui-gradient-generator-custom-color-add">
 | 
			
		||||
            <toolbarbutton id="PanelUI-zen-gradient-generator-color-custom-add" class="subviewbutton">
 | 
			
		||||
              <image></image>
 | 
			
		||||
            </toolbarbutton>
 | 
			
		||||
          </hbox>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,13 @@
 | 
			
		||||
# This needs to be here, before all the other scripts, because it's used before
 | 
			
		||||
# the window is fully loaded.
 | 
			
		||||
# Make sure they are loaded before the global-scripts.inc file.
 | 
			
		||||
<script type="text/javascript">
 | 
			
		||||
  Services.scriptloader.loadSubScript("chrome://browser/content/zen-sets.js", this);
 | 
			
		||||
  Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenCommonUtils.mjs", this);
 | 
			
		||||
  Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenKeyboardShortcuts.mjs", this);
 | 
			
		||||
  Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenWorkspaces.mjs", this);
 | 
			
		||||
  Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenWorkspacesSync.mjs", this);
 | 
			
		||||
  Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenActorsManager.mjs", this);
 | 
			
		||||
</script>
 | 
			
		||||
<script type="text/javascript" src="chrome://browser/content/zen-sets.js"></script>                                  
 | 
			
		||||
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenCommonUtils.mjs"></script>
 | 
			
		||||
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenKeyboardShortcuts.mjs"></script>
 | 
			
		||||
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenWorkspaceIcons.mjs"></script>
 | 
			
		||||
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenWorkspace.mjs"></script>
 | 
			
		||||
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenWorkspaces.mjs"></script>
 | 
			
		||||
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenWorkspacesSync.mjs"></script>
 | 
			
		||||
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenActorsManager.mjs"></script>
 | 
			
		||||
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenSessionStore.mjs"></script>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2,12 +2,12 @@
 | 
			
		||||
<toolbar brighttext="true"
 | 
			
		||||
  id="zen-sidebar-bottom-buttons"
 | 
			
		||||
  fullscreentoolbar="true"
 | 
			
		||||
  class="browser-toolbar customization-target zen-dont-hide-on-fullscreen"
 | 
			
		||||
  class="browser-toolbar customization-target"
 | 
			
		||||
  data-l10n-id="tabs-toolbar"
 | 
			
		||||
  customizable="true"
 | 
			
		||||
  skipintoolbarset="true"
 | 
			
		||||
  context="toolbar-context-menu"
 | 
			
		||||
  mode="icons">
 | 
			
		||||
  <toolbarbutton removable="true" class="chromeclass-toolbar-additional toolbarbutton-1 zen-sidebar-action-button" id="zen-expand-sidebar-button" command="cmd_zenToggleSidebar" data-l10n-id="sidebar-zen-expand" cui-areatype="toolbar"></toolbarbutton>
 | 
			
		||||
  <toolbarbutton id="zen-workspaces-button" class="chromeclass-toolbar-additional" overflows="false" removable="false"></toolbarbutton>
 | 
			
		||||
  <toolbarbutton removable="true" class="chromeclass-toolbar-additional toolbarbutton-1 zen-sidebar-action-button" id="zen-expand-sidebar-button" command="cmd_zenToggleSidebar" data-l10n-id="sidebar-zen-expand"></toolbarbutton>
 | 
			
		||||
  <zen-workspace-icons id="zen-workspaces-button" overflows="false" removable="false"></zen-workspace-icons>
 | 
			
		||||
</toolbar>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,2 +1,4 @@
 | 
			
		||||
<vbox id="zen-toast-container"></vbox>
 | 
			
		||||
 | 
			
		||||
#include ../../../zen/split-view/zen-splitview-overlay.inc.xhtml
 | 
			
		||||
#include ../../../zen/glance/zen-glance.inc.xhtml
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
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
 | 
			
		||||
+++ b/browser/base/moz.build
 | 
			
		||||
@@ -87,3 +87,5 @@ if CONFIG["MOZ_WIDGET_TOOLKIT"] in ("windows", "gtk"):
 | 
			
		||||
     DEFINES["MENUBAR_CAN_AUTOHIDE"] = 1
 | 
			
		||||
@@ -81,3 +81,5 @@ DEFINES["MOZ_APP_VERSION_DISPLAY"] = CONFIG["MOZ_APP_VERSION_DISPLAY"]
 | 
			
		||||
 DEFINES["APP_LICENSE_BLOCK"] = "%s/content/overrides/app-license.html" % SRCDIR
 | 
			
		||||
 
 | 
			
		||||
 JAR_MANIFESTS += ["jar.mn"]
 | 
			
		||||
+
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
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
 | 
			
		||||
+++ b/browser/components/BrowserContentHandler.sys.mjs
 | 
			
		||||
@@ -1270,6 +1270,7 @@ function maybeRecordToHandleTelemetry(uri, isLaunch) {
 | 
			
		||||
@@ -1281,6 +1281,7 @@ function maybeRecordToHandleTelemetry(uri, isLaunch) {
 | 
			
		||||
       ".avif",
 | 
			
		||||
       ".htm",
 | 
			
		||||
       ".html",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
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
 | 
			
		||||
+++ b/browser/components/BrowserGlue.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",
 | 
			
		||||
   AboutNewTab: "resource:///modules/AboutNewTab.sys.mjs",
 | 
			
		||||
   AWToolbarButton: "resource:///modules/aboutwelcome/AWToolbarUtils.sys.mjs",
 | 
			
		||||
@@ -1886,6 +1887,7 @@ BrowserGlue.prototype = {
 | 
			
		||||
@@ -881,6 +882,7 @@ BrowserGlue.prototype = {
 | 
			
		||||
 
 | 
			
		||||
     lazy.ProcessHangMonitor.init();
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
diff --git a/browser/components/customizableui/CustomizableUI.sys.mjs b/browser/components/customizableui/CustomizableUI.sys.mjs
 | 
			
		||||
index 91088fab1759b9af908912648d28daa5938a29c9..3f52ee8cd77ac171fd2cbf355ade1371e57d0db5 100644
 | 
			
		||||
index 5bb6be19f7f855b129aac921af1ed5cfc63d732b..41230a61f3088a234903dcc10abd361efac34729 100644
 | 
			
		||||
--- a/browser/components/customizableui/CustomizableUI.sys.mjs
 | 
			
		||||
+++ b/browser/components/customizableui/CustomizableUI.sys.mjs
 | 
			
		||||
@@ -13,6 +13,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
 | 
			
		||||
@@ -10,22 +10,19 @@ index 91088fab1759b9af908912648d28daa5938a29c9..3f52ee8cd77ac171fd2cbf355ade1371
 | 
			
		||||
   HomePage: "resource:///modules/HomePage.sys.mjs",
 | 
			
		||||
   PanelMultiView: "resource:///modules/PanelMultiView.sys.mjs",
 | 
			
		||||
   PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs",
 | 
			
		||||
@@ -25,7 +26,7 @@ ChromeUtils.defineLazyGetter(lazy, "gWidgetsBundle", function () {
 | 
			
		||||
   return Services.strings.createBundle(kUrl);
 | 
			
		||||
 });
 | 
			
		||||
 
 | 
			
		||||
-const kDefaultThemeID = "default-theme@mozilla.org";
 | 
			
		||||
+const kDefaultThemeID = "firefox-compact-dark@mozilla.org";
 | 
			
		||||
 
 | 
			
		||||
 const kSpecialWidgetPfx = "customizableui-special-";
 | 
			
		||||
 
 | 
			
		||||
@@ -338,13 +339,11 @@ var CustomizableUIInternal = {
 | 
			
		||||
@@ -331,20 +332,14 @@ var CustomizableUIInternal = {
 | 
			
		||||
       "back-button",
 | 
			
		||||
       "forward-button",
 | 
			
		||||
       "stop-reload-button",
 | 
			
		||||
-      Services.policies.isAllowed("removeHomeButtonByDefault")
 | 
			
		||||
-        ? null
 | 
			
		||||
-        : "home-button",
 | 
			
		||||
       "spring",
 | 
			
		||||
       "vertical-spacer",
 | 
			
		||||
       "urlbar-container",
 | 
			
		||||
       "spring",
 | 
			
		||||
-      "save-to-pocket-button",
 | 
			
		||||
-      "downloads-button",
 | 
			
		||||
+//    "downloads-button",
 | 
			
		||||
       AppConstants.MOZ_DEV_EDITION ? "developer-button" : null,
 | 
			
		||||
-      "fxa-toolbar-menu-button",
 | 
			
		||||
       lazy.resetPBMToolbarButtonEnabled ? "reset-pbm-toolbar-button" : null,
 | 
			
		||||
@@ -35,15 +32,16 @@ index 91088fab1759b9af908912648d28daa5938a29c9..3f52ee8cd77ac171fd2cbf355ade1371
 | 
			
		||||
     this.registerArea(
 | 
			
		||||
       CustomizableUI.AREA_NAVBAR,
 | 
			
		||||
       {
 | 
			
		||||
@@ -352,7 +351,6 @@ var CustomizableUIInternal = {
 | 
			
		||||
@@ -352,8 +347,6 @@ var CustomizableUIInternal = {
 | 
			
		||||
         overflowable: true,
 | 
			
		||||
         defaultPlacements: navbarPlacements,
 | 
			
		||||
         verticalTabsDefaultPlacements: [
 | 
			
		||||
-          "firefox-view-button",
 | 
			
		||||
           "alltabs-button",
 | 
			
		||||
-          "alltabs-button",
 | 
			
		||||
         ],
 | 
			
		||||
         defaultCollapsed: false,
 | 
			
		||||
@@ -377,10 +375,7 @@ var CustomizableUIInternal = {
 | 
			
		||||
       },
 | 
			
		||||
@@ -377,10 +370,7 @@ var CustomizableUIInternal = {
 | 
			
		||||
       {
 | 
			
		||||
         type: CustomizableUI.TYPE_TOOLBAR,
 | 
			
		||||
         defaultPlacements: [
 | 
			
		||||
@@ -54,7 +52,7 @@ index 91088fab1759b9af908912648d28daa5938a29c9..3f52ee8cd77ac171fd2cbf355ade1371
 | 
			
		||||
         ],
 | 
			
		||||
         verticalTabsDefaultPlacements: [],
 | 
			
		||||
         defaultCollapsed: null,
 | 
			
		||||
@@ -462,6 +457,7 @@ var CustomizableUIInternal = {
 | 
			
		||||
@@ -462,6 +452,7 @@ var CustomizableUIInternal = {
 | 
			
		||||
       CustomizableUI.AREA_NAVBAR,
 | 
			
		||||
       CustomizableUI.AREA_BOOKMARKS,
 | 
			
		||||
       CustomizableUI.AREA_TABSTRIP,
 | 
			
		||||
@@ -62,7 +60,7 @@ index 91088fab1759b9af908912648d28daa5938a29c9..3f52ee8cd77ac171fd2cbf355ade1371
 | 
			
		||||
     ]);
 | 
			
		||||
     if (AppConstants.platform != "macosx") {
 | 
			
		||||
       toolbars.add(CustomizableUI.AREA_MENUBAR);
 | 
			
		||||
@@ -1262,6 +1258,9 @@ var CustomizableUIInternal = {
 | 
			
		||||
@@ -1262,6 +1253,9 @@ var CustomizableUIInternal = {
 | 
			
		||||
         placements = gPlacements.get(area);
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
@@ -72,7 +70,7 @@ index 91088fab1759b9af908912648d28daa5938a29c9..3f52ee8cd77ac171fd2cbf355ade1371
 | 
			
		||||
       // For toolbars that need it, mark as dirty.
 | 
			
		||||
       let defaultPlacements = areaProperties.get("defaultPlacements");
 | 
			
		||||
       if (
 | 
			
		||||
@@ -1769,7 +1768,7 @@ var CustomizableUIInternal = {
 | 
			
		||||
@@ -1769,7 +1763,7 @@ var CustomizableUIInternal = {
 | 
			
		||||
         lazy.log.info(
 | 
			
		||||
           "Widget " + aWidgetId + " not found, unable to remove from " + aArea
 | 
			
		||||
         );
 | 
			
		||||
@@ -81,7 +79,7 @@ index 91088fab1759b9af908912648d28daa5938a29c9..3f52ee8cd77ac171fd2cbf355ade1371
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
       this.notifyDOMChange(widgetNode, null, container, true, () => {
 | 
			
		||||
@@ -1779,7 +1778,7 @@ var CustomizableUIInternal = {
 | 
			
		||||
@@ -1779,7 +1773,7 @@ var CustomizableUIInternal = {
 | 
			
		||||
         // We also need to remove the panel context menu if it's there:
 | 
			
		||||
         this.ensureButtonContextMenu(widgetNode);
 | 
			
		||||
         if (gPalette.has(aWidgetId) || this.isSpecialWidget(aWidgetId)) {
 | 
			
		||||
@@ -90,7 +88,7 @@ index 91088fab1759b9af908912648d28daa5938a29c9..3f52ee8cd77ac171fd2cbf355ade1371
 | 
			
		||||
         } else {
 | 
			
		||||
           window.gNavToolbox.palette.appendChild(widgetNode);
 | 
			
		||||
         }
 | 
			
		||||
@@ -1947,16 +1946,16 @@ var CustomizableUIInternal = {
 | 
			
		||||
@@ -1947,16 +1941,16 @@ var CustomizableUIInternal = {
 | 
			
		||||
         elem.setAttribute("skipintoolbarset", "true");
 | 
			
		||||
       }
 | 
			
		||||
     }
 | 
			
		||||
@@ -110,7 +108,7 @@ index 91088fab1759b9af908912648d28daa5938a29c9..3f52ee8cd77ac171fd2cbf355ade1371
 | 
			
		||||
     // Handle initial state of vertical tabs.
 | 
			
		||||
     if (isVerticalTabs) {
 | 
			
		||||
       // Show the vertical tabs toolbar
 | 
			
		||||
@@ -2198,6 +2197,10 @@ var CustomizableUIInternal = {
 | 
			
		||||
@@ -2198,6 +2192,10 @@ var CustomizableUIInternal = {
 | 
			
		||||
    *   The identifier string of the area that aNode is being inserted into.
 | 
			
		||||
    */
 | 
			
		||||
   insertWidgetBefore(aNode, aNextNode, aContainer, aAreaId) {
 | 
			
		||||
@@ -121,7 +119,7 @@ index 91088fab1759b9af908912648d28daa5938a29c9..3f52ee8cd77ac171fd2cbf355ade1371
 | 
			
		||||
     this.notifyDOMChange(aNode, aNextNode, aContainer, false, () => {
 | 
			
		||||
       this.setLocationAttributes(aNode, aAreaId);
 | 
			
		||||
       aContainer.insertBefore(aNode, aNextNode);
 | 
			
		||||
@@ -3321,7 +3324,6 @@ var CustomizableUIInternal = {
 | 
			
		||||
@@ -3321,7 +3319,6 @@ var CustomizableUIInternal = {
 | 
			
		||||
     if (!this.isWidgetRemovable(aWidgetId)) {
 | 
			
		||||
       return;
 | 
			
		||||
     }
 | 
			
		||||
@@ -129,7 +127,7 @@ index 91088fab1759b9af908912648d28daa5938a29c9..3f52ee8cd77ac171fd2cbf355ade1371
 | 
			
		||||
     let placements = gPlacements.get(oldPlacement.area);
 | 
			
		||||
     let position = placements.indexOf(aWidgetId);
 | 
			
		||||
     if (position != -1) {
 | 
			
		||||
@@ -4556,7 +4558,7 @@ var CustomizableUIInternal = {
 | 
			
		||||
@@ -4556,7 +4553,7 @@ var CustomizableUIInternal = {
 | 
			
		||||
    * For all registered areas, builds those areas to reflect the current
 | 
			
		||||
    * placement state of all widgets.
 | 
			
		||||
    */
 | 
			
		||||
@@ -138,7 +136,7 @@ index 91088fab1759b9af908912648d28daa5938a29c9..3f52ee8cd77ac171fd2cbf355ade1371
 | 
			
		||||
     for (let [areaId, areaNodes] of gBuildAreas) {
 | 
			
		||||
       let placements = gPlacements.get(areaId);
 | 
			
		||||
       let isFirstChangedToolbar = true;
 | 
			
		||||
@@ -4567,7 +4569,7 @@ var CustomizableUIInternal = {
 | 
			
		||||
@@ -4567,7 +4564,7 @@ var CustomizableUIInternal = {
 | 
			
		||||
         if (area.get("type") == CustomizableUI.TYPE_TOOLBAR) {
 | 
			
		||||
           let defaultCollapsed = area.get("defaultCollapsed");
 | 
			
		||||
           let win = areaNode.ownerGlobal;
 | 
			
		||||
@@ -147,7 +145,7 @@ index 91088fab1759b9af908912648d28daa5938a29c9..3f52ee8cd77ac171fd2cbf355ade1371
 | 
			
		||||
             win.setToolbarVisibility(
 | 
			
		||||
               areaNode,
 | 
			
		||||
               typeof defaultCollapsed == "string"
 | 
			
		||||
@@ -5858,6 +5860,7 @@ export var CustomizableUI = {
 | 
			
		||||
@@ -5858,6 +5855,7 @@ export var CustomizableUI = {
 | 
			
		||||
   unregisterArea(aName, aDestroyPlacements) {
 | 
			
		||||
     CustomizableUIInternal.unregisterArea(aName, aDestroyPlacements);
 | 
			
		||||
   },
 | 
			
		||||
@@ -155,7 +153,7 @@ index 91088fab1759b9af908912648d28daa5938a29c9..3f52ee8cd77ac171fd2cbf355ade1371
 | 
			
		||||
   /**
 | 
			
		||||
    * Add a widget to an area.
 | 
			
		||||
    * If the area to which you try to add is not known to CustomizableUI,
 | 
			
		||||
@@ -7905,11 +7908,11 @@ class OverflowableToolbar {
 | 
			
		||||
@@ -7905,11 +7903,11 @@ class OverflowableToolbar {
 | 
			
		||||
         parseFloat(style.paddingLeft) -
 | 
			
		||||
         parseFloat(style.paddingRight) -
 | 
			
		||||
         toolbarChildrenWidth;
 | 
			
		||||
@@ -169,7 +167,7 @@ index 91088fab1759b9af908912648d28daa5938a29c9..3f52ee8cd77ac171fd2cbf355ade1371
 | 
			
		||||
     });
 | 
			
		||||
 
 | 
			
		||||
     lazy.log.debug(
 | 
			
		||||
@@ -7919,7 +7922,8 @@ class OverflowableToolbar {
 | 
			
		||||
@@ -7919,7 +7917,8 @@ class OverflowableToolbar {
 | 
			
		||||
     // If the target has min-width: 0, their children might actually overflow
 | 
			
		||||
     // it, so check for both cases explicitly.
 | 
			
		||||
     let targetContentWidth = Math.max(targetWidth, targetChildrenWidth);
 | 
			
		||||
@@ -179,7 +177,7 @@ index 91088fab1759b9af908912648d28daa5938a29c9..3f52ee8cd77ac171fd2cbf355ade1371
 | 
			
		||||
     return { isOverflowing, targetContentWidth, totalAvailWidth };
 | 
			
		||||
   }
 | 
			
		||||
 
 | 
			
		||||
@@ -8013,7 +8017,7 @@ class OverflowableToolbar {
 | 
			
		||||
@@ -8013,7 +8012,7 @@ class OverflowableToolbar {
 | 
			
		||||
         }
 | 
			
		||||
       }
 | 
			
		||||
       if (!inserted) {
 | 
			
		||||
@@ -188,7 +186,7 @@ index 91088fab1759b9af908912648d28daa5938a29c9..3f52ee8cd77ac171fd2cbf355ade1371
 | 
			
		||||
       }
 | 
			
		||||
       child.removeAttribute("cui-anchorid");
 | 
			
		||||
       child.removeAttribute("overflowedItem");
 | 
			
		||||
@@ -8358,7 +8362,7 @@ class OverflowableToolbar {
 | 
			
		||||
@@ -8358,7 +8357,7 @@ class OverflowableToolbar {
 | 
			
		||||
         break;
 | 
			
		||||
       }
 | 
			
		||||
       case "mousedown": {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
diff --git a/browser/components/customizableui/CustomizeMode.sys.mjs b/browser/components/customizableui/CustomizeMode.sys.mjs
 | 
			
		||||
index 619bb2af5a3a0995fc93fa040696dd2854848ab5..bbc6bad906e9ccaf668ca99f4a0411f564ef1e56 100644
 | 
			
		||||
index 619bb2af5a3a0995fc93fa040696dd2854848ab5..14ad5f6122971a0a0dc20d22acdc073f84965dad 100644
 | 
			
		||||
--- a/browser/components/customizableui/CustomizeMode.sys.mjs
 | 
			
		||||
+++ b/browser/components/customizableui/CustomizeMode.sys.mjs
 | 
			
		||||
@@ -500,7 +500,7 @@ export class CustomizeMode {
 | 
			
		||||
@@ -20,7 +20,15 @@ index 619bb2af5a3a0995fc93fa040696dd2854848ab5..bbc6bad906e9ccaf668ca99f4a0411f5
 | 
			
		||||
     customizer.hidden = true;
 | 
			
		||||
     browser.hidden = false;
 | 
			
		||||
 
 | 
			
		||||
@@ -3125,6 +3125,20 @@ export class CustomizeMode {
 | 
			
		||||
@@ -1173,6 +1173,7 @@ export class CustomizeMode {
 | 
			
		||||
     return (
 | 
			
		||||
       aNode.localName == "toolbarbutton" ||
 | 
			
		||||
       aNode.localName == "toolbaritem" ||
 | 
			
		||||
+      aNode.localName == "zen-workspace-icons" ||
 | 
			
		||||
       aNode.localName == "toolbarseparator" ||
 | 
			
		||||
       aNode.localName == "toolbarspring" ||
 | 
			
		||||
       aNode.localName == "toolbarspacer"
 | 
			
		||||
@@ -3125,6 +3126,20 @@ export class CustomizeMode {
 | 
			
		||||
         if (makeSpaceImmediately) {
 | 
			
		||||
           aDraggedOverItem.setAttribute("notransition", "true");
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
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
 | 
			
		||||
+++ 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("context", "");
 | 
			
		||||
@@ -12,7 +12,7 @@ index ec52437dba30633a374299a46c856e1df05dec0e..48617e32d56c3b3f525557ddeac62975
 | 
			
		||||
         .appendChild(tempPanel);
 | 
			
		||||
 
 | 
			
		||||
       let multiView = document.createXULElement("panelmultiview");
 | 
			
		||||
@@ -957,7 +956,7 @@ const PanelUI = {
 | 
			
		||||
@@ -959,7 +958,7 @@ const PanelUI = {
 | 
			
		||||
         el.removeAttribute("data-lazy-l10n-id");
 | 
			
		||||
       });
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
diff --git a/browser/components/extensions/parent/ext-tabs.js b/browser/components/extensions/parent/ext-tabs.js
 | 
			
		||||
index b47f0510e32d788dfe7c3109474c4512c9900d4a..49697125a2998bbd50d87c54e2c5974baaf9a7e2 100644
 | 
			
		||||
index 517ea0079c12941a844a4f9e4ba694c6411887ee..510ab14dfa2178c332c9862d6a01b75bd12dfe3b 100644
 | 
			
		||||
--- a/browser/components/extensions/parent/ext-tabs.js
 | 
			
		||||
+++ b/browser/components/extensions/parent/ext-tabs.js
 | 
			
		||||
@@ -468,6 +468,7 @@ this.tabs = class extends ExtensionAPIPersistent {
 | 
			
		||||
@@ -482,6 +482,7 @@ this.tabs = class extends ExtensionAPIPersistent {
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
         let tab = tabManager.getWrapper(event.originalTarget);
 | 
			
		||||
@@ -10,3 +10,11 @@ index b47f0510e32d788dfe7c3109474c4512c9900d4a..49697125a2998bbd50d87c54e2c5974b
 | 
			
		||||
 
 | 
			
		||||
         let changeInfo = {};
 | 
			
		||||
         for (let prop of needed) {
 | 
			
		||||
@@ -836,6 +837,7 @@ this.tabs = class extends ExtensionAPIPersistent {
 | 
			
		||||
               });
 | 
			
		||||
             }
 | 
			
		||||
 
 | 
			
		||||
+            window.gZenCompactModeManager._nextTimeWillBeActive = active;
 | 
			
		||||
             let nativeTab = window.gBrowser.addTab(url, options);
 | 
			
		||||
 
 | 
			
		||||
             if (active) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
diff --git a/browser/components/places/PlacesUIUtils.sys.mjs b/browser/components/places/PlacesUIUtils.sys.mjs
 | 
			
		||||
index 1f5e163bae58f3f1cac750ca32846cc8a80bd2ca..16034842b4ca5295aa3c9237db55035ecc4016d2 100644
 | 
			
		||||
index c7c5c28e1ea6d05094ed9fe751c6b50ab9645370..72f1038aa37b0951a1e78331ee317f714e5b6e8b 100644
 | 
			
		||||
--- a/browser/components/places/PlacesUIUtils.sys.mjs
 | 
			
		||||
+++ b/browser/components/places/PlacesUIUtils.sys.mjs
 | 
			
		||||
@@ -59,6 +59,7 @@ class BookmarkState {
 | 
			
		||||
@@ -157,20 +157,12 @@ index 1f5e163bae58f3f1cac750ca32846cc8a80bd2ca..16034842b4ca5295aa3c9237db55035e
 | 
			
		||||
   /**
 | 
			
		||||
    * Append transactions to update tags by given information.
 | 
			
		||||
    *
 | 
			
		||||
@@ -903,8 +1012,15 @@ export var PlacesUIUtils = {
 | 
			
		||||
@@ -903,7 +1012,7 @@ export var PlacesUIUtils = {
 | 
			
		||||
     aNode,
 | 
			
		||||
     aWhere,
 | 
			
		||||
     aWindow,
 | 
			
		||||
-    { aPrivate = false, userContextId = 0 } = {}
 | 
			
		||||
+    { aPrivate = false, userContextId = undefined } = {}
 | 
			
		||||
   ) {
 | 
			
		||||
+    if (typeof userContextId == "undefined") {
 | 
			
		||||
+      try {
 | 
			
		||||
+        let browserWindow = getBrowserWindow(aWindow);
 | 
			
		||||
+        userContextId = browserWindow.ZenWorkspaces.getDefaultContainer();
 | 
			
		||||
+      } catch {}
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
     if (
 | 
			
		||||
       aNode &&
 | 
			
		||||
       lazy.PlacesUtils.nodeIsURI(aNode) &&
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
diff --git a/browser/components/places/content/browserPlacesViews.js b/browser/components/places/content/browserPlacesViews.js
 | 
			
		||||
index ad138a38340e8e8510d395f46c30ec4121d731bb..9294f05633acbe560df003333b7ef7d9a12a2a11 100644
 | 
			
		||||
index ad138a38340e8e8510d395f46c30ec4121d731bb..52beaa66395e2b240a7122936cd4d2452b386724 100644
 | 
			
		||||
--- a/browser/components/places/content/browserPlacesViews.js
 | 
			
		||||
+++ b/browser/components/places/content/browserPlacesViews.js
 | 
			
		||||
@@ -330,12 +330,23 @@ class PlacesViewBase {
 | 
			
		||||
@@ -13,7 +13,7 @@ index ad138a38340e8e8510d395f46c30ec4121d731bb..9294f05633acbe560df003333b7ef7d9
 | 
			
		||||
+      let child = resultNode.getChild(i);
 | 
			
		||||
+      // Skip nodes that don't belong in current workspace
 | 
			
		||||
+      if (PlacesUtils.nodeIsURI(child) || PlacesUtils.containerTypes.includes(child.type)) {
 | 
			
		||||
+        if (typeof ZenWorkspaces !== 'undefined' && ZenWorkspaces.isBookmarkInAnotherWorkspace(child)) {
 | 
			
		||||
+        if (typeof gZenWorkspaces !== 'undefined' && gZenWorkspaces.isBookmarkInAnotherWorkspace(child)) {
 | 
			
		||||
+          continue;
 | 
			
		||||
+        }
 | 
			
		||||
+      }
 | 
			
		||||
@@ -52,7 +52,7 @@ index ad138a38340e8e8510d395f46c30ec4121d731bb..9294f05633acbe560df003333b7ef7d9
 | 
			
		||||
+    for (let i = 0; i < cc; i++) {
 | 
			
		||||
+      let child = this._resultNode.getChild(i);
 | 
			
		||||
+      if (PlacesUtils.nodeIsURI(child) || PlacesUtils.containerTypes.includes(child.type)) {
 | 
			
		||||
+        if (!(typeof ZenWorkspaces !== 'undefined' && ZenWorkspaces.isBookmarkInAnotherWorkspace(child))) {
 | 
			
		||||
+        if (!(typeof gZenWorkspaces !== 'undefined' && gZenWorkspaces.isBookmarkInAnotherWorkspace(child))) {
 | 
			
		||||
+          visibleNodes.push(child);
 | 
			
		||||
+        }
 | 
			
		||||
+      } else {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,18 @@
 | 
			
		||||
diff --git a/browser/components/preferences/main.inc.xhtml b/browser/components/preferences/main.inc.xhtml
 | 
			
		||||
index cdcf50ec1bc4a54c69f5baf4a6d40ab0c63a8121..87603323c2b0b9ea0c847a8a06e293a16c1252b8 100644
 | 
			
		||||
index f9129fb171362e81369056923bf25acbb87d2ad8..924bcd2cd66a5dfcf9c45aac0c63cd0257c21a2c 100644
 | 
			
		||||
--- a/browser/components/preferences/main.inc.xhtml
 | 
			
		||||
+++ b/browser/components/preferences/main.inc.xhtml
 | 
			
		||||
@@ -183,6 +183,7 @@
 | 
			
		||||
@@ -29,6 +29,9 @@
 | 
			
		||||
   <vbox id="startupPageBox">
 | 
			
		||||
     <checkbox id="browserRestoreSession"
 | 
			
		||||
               data-l10n-id="startup-restore-windows-and-tabs"/>
 | 
			
		||||
+    <checkbox id="zenWorkspaceContinueWhereLeftOff"
 | 
			
		||||
+            data-l10n-id="zen-workspace-continue-where-left-off"
 | 
			
		||||
+            preference="zen.workspaces.continue-where-left-off"/>
 | 
			
		||||
 #ifdef XP_WIN
 | 
			
		||||
     <hbox id="windowsLaunchOnLoginBox" align="center" hidden="true">
 | 
			
		||||
       <checkbox id="windowsLaunchOnLogin"
 | 
			
		||||
@@ -186,6 +189,7 @@
 | 
			
		||||
 </groupbox>
 | 
			
		||||
 
 | 
			
		||||
 <!-- Browser layout -->
 | 
			
		||||
@@ -10,7 +20,7 @@ index cdcf50ec1bc4a54c69f5baf4a6d40ab0c63a8121..87603323c2b0b9ea0c847a8a06e293a1
 | 
			
		||||
 <groupbox data-category="paneGeneral"
 | 
			
		||||
           data-subcategory="layout"
 | 
			
		||||
           hidden="true">
 | 
			
		||||
@@ -198,6 +199,7 @@
 | 
			
		||||
@@ -201,6 +205,7 @@
 | 
			
		||||
             preference="sidebar.revamp"/>
 | 
			
		||||
   <description class="indent" data-l10n-id="browser-layout-show-sidebar-desc"></description>
 | 
			
		||||
 </groupbox>
 | 
			
		||||
@@ -18,7 +28,7 @@ index cdcf50ec1bc4a54c69f5baf4a6d40ab0c63a8121..87603323c2b0b9ea0c847a8a06e293a1
 | 
			
		||||
 
 | 
			
		||||
 <hbox id="languageAndAppearanceCategory"
 | 
			
		||||
       class="subcategory"
 | 
			
		||||
@@ -411,6 +413,7 @@
 | 
			
		||||
@@ -421,6 +426,7 @@
 | 
			
		||||
               languages-customize-add.label,
 | 
			
		||||
             " />
 | 
			
		||||
   </hbox>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
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
 | 
			
		||||
+++ b/browser/components/preferences/main.js
 | 
			
		||||
@@ -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
 | 
			
		||||
index e4746e3408e68273126e6d2baf5afcf80721674b..e478aaf6bfefa6acd9062aeb3e4709ca0d5d779c 100644
 | 
			
		||||
index 6a575e3148de0c73f7ab7ff9afbd3ff179bce313..b7c2f2818358b7b6b6fc62b298dc67a66ebd9e3b 100644
 | 
			
		||||
--- a/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: [
 | 
			
		||||
         "chrome://browser/skin/preferences/dialog.css",
 | 
			
		||||
         "chrome://browser/skin/preferences/preferences.css",
 | 
			
		||||
@@ -10,7 +10,7 @@ index e4746e3408e68273126e6d2baf5afcf80721674b..e478aaf6bfefa6acd9062aeb3e4709ca
 | 
			
		||||
       ],
 | 
			
		||||
       resizeCallback: async ({ title, frame }) => {
 | 
			
		||||
         // 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("panePrivacy", gPrivacyPane);
 | 
			
		||||
   register_module("paneContainers", gContainersPane);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
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
 | 
			
		||||
+++ b/browser/components/preferences/preferences.xhtml
 | 
			
		||||
@@ -44,6 +44,8 @@
 | 
			
		||||
@@ -11,7 +11,7 @@ index 43be2b6ac84827bd13723e0211a3ade401934591..513584d7e720451efdb87350ac07d8b2
 | 
			
		||||
   <link rel="localization" href="branding/brand.ftl"/>
 | 
			
		||||
   <link rel="localization" href="browser/browser.ftl"/>
 | 
			
		||||
     <!-- Used by fontbuilder.js -->
 | 
			
		||||
@@ -105,6 +107,11 @@
 | 
			
		||||
@@ -104,6 +106,11 @@
 | 
			
		||||
   <hbox flex="1">
 | 
			
		||||
 
 | 
			
		||||
     <vbox class="navigation">
 | 
			
		||||
@@ -23,7 +23,7 @@ index 43be2b6ac84827bd13723e0211a3ade401934591..513584d7e720451efdb87350ac07d8b2
 | 
			
		||||
       <!-- category list -->
 | 
			
		||||
       <richlistbox id="categories" data-l10n-id="category-list" data-l10n-attrs="aria-label">
 | 
			
		||||
         <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>
 | 
			
		||||
         </richlistitem>
 | 
			
		||||
 
 | 
			
		||||
@@ -74,7 +74,7 @@ index 43be2b6ac84827bd13723e0211a3ade401934591..513584d7e720451efdb87350ac07d8b2
 | 
			
		||||
         <richlistitem id="category-home"
 | 
			
		||||
                       class="category"
 | 
			
		||||
                       value="paneHome"
 | 
			
		||||
@@ -228,11 +279,6 @@
 | 
			
		||||
@@ -227,11 +278,6 @@
 | 
			
		||||
                 <html:a href="about:policies" target="_blank" data-l10n-id="managed-notice"/>
 | 
			
		||||
               </hbox>
 | 
			
		||||
             </hbox>
 | 
			
		||||
@@ -86,7 +86,7 @@ index 43be2b6ac84827bd13723e0211a3ade401934591..513584d7e720451efdb87350ac07d8b2
 | 
			
		||||
           </hbox>
 | 
			
		||||
         </hbox>
 | 
			
		||||
         <vbox id="mainPrefPane">
 | 
			
		||||
@@ -246,6 +292,10 @@
 | 
			
		||||
@@ -245,6 +291,10 @@
 | 
			
		||||
 #include sync.inc.xhtml
 | 
			
		||||
 #include experimental.inc.xhtml
 | 
			
		||||
 #include moreFromMozilla.inc.xhtml
 | 
			
		||||
 
 | 
			
		||||
@@ -14,30 +14,37 @@ var gZenMarketplaceManager = {
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!window.gZenMods) {
 | 
			
		||||
      window.gZenMods = ZenMultiWindowFeature.currentBrowser.gZenMods;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    header.appendChild(this._initDisableAll());
 | 
			
		||||
 | 
			
		||||
    this._initImportExport();
 | 
			
		||||
 | 
			
		||||
    this.__hasInitializedEvents = true;
 | 
			
		||||
 | 
			
		||||
    await this._buildThemesList();
 | 
			
		||||
    await this._buildModsList();
 | 
			
		||||
 | 
			
		||||
    Services.prefs.addObserver(this.updatePref, this);
 | 
			
		||||
    Services.prefs.addObserver(gZenMods.updatePref, this);
 | 
			
		||||
 | 
			
		||||
    const checkForUpdateClick = (event) => {
 | 
			
		||||
      if (event.target === checkForUpdates) {
 | 
			
		||||
        event.preventDefault();
 | 
			
		||||
 | 
			
		||||
        this._checkForThemeUpdates(event);
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    checkForUpdates.addEventListener('click', checkForUpdateClick);
 | 
			
		||||
 | 
			
		||||
    document.addEventListener('ZenThemeMarketplace:CheckForUpdatesFinished', (event) => {
 | 
			
		||||
    document.addEventListener('ZenModsMarketplace:CheckForUpdatesFinished', (event) => {
 | 
			
		||||
      checkForUpdates.disabled = false;
 | 
			
		||||
 | 
			
		||||
      const updates = event.detail.updates;
 | 
			
		||||
      const success = document.getElementById('zenThemeMarketplaceUpdatesSuccess');
 | 
			
		||||
      const error = document.getElementById('zenThemeMarketplaceUpdatesFailure');
 | 
			
		||||
 | 
			
		||||
      if (updates) {
 | 
			
		||||
        success.hidden = false;
 | 
			
		||||
        error.hidden = true;
 | 
			
		||||
@@ -48,13 +55,16 @@ var gZenMarketplaceManager = {
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    window.addEventListener('unload', () => {
 | 
			
		||||
      Services.prefs.removeObserver(this.updatePref, this);
 | 
			
		||||
      Services.prefs.removeObserver(gZenMods.updatePref, this);
 | 
			
		||||
      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);
 | 
			
		||||
      this.themesList.innerHTML = '';
 | 
			
		||||
      this._doNotRebuildThemesList = false;
 | 
			
		||||
 | 
			
		||||
      this.modsList.innerHTML = '';
 | 
			
		||||
      this._doNotRebuildModsList = false;
 | 
			
		||||
    });
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
@@ -63,121 +73,98 @@ var gZenMarketplaceManager = {
 | 
			
		||||
    const exportButton = document.getElementById('zenThemeMarketplaceExport');
 | 
			
		||||
 | 
			
		||||
    if (importButton) {
 | 
			
		||||
      importButton.addEventListener('click', async () => {
 | 
			
		||||
        await this._importThemes();
 | 
			
		||||
      });
 | 
			
		||||
      importButton.addEventListener('click', this._importThemes.bind(this));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (exportButton) {
 | 
			
		||||
      exportButton.addEventListener('click', async () => {
 | 
			
		||||
        await this._exportThemes();
 | 
			
		||||
      });
 | 
			
		||||
      exportButton.addEventListener('click', this._exportThemes.bind(this));
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  _initDisableAll() {
 | 
			
		||||
    const areThemesDisabled = Services.prefs.getBoolPref('zen.themes.disable-all', false);
 | 
			
		||||
    const browser = ZenThemesCommon.currentBrowser;
 | 
			
		||||
    const areModsDisabled = Services.prefs.getBoolPref('zen.themes.disable-all', false);
 | 
			
		||||
    const browser = ZenMultiWindowFeature.currentBrowser;
 | 
			
		||||
    const mozToggle = document.createElement('moz-toggle');
 | 
			
		||||
 | 
			
		||||
    mozToggle.className = 'zenThemeMarketplaceItemPreferenceToggle zenThemeMarketplaceDisableAllToggle';
 | 
			
		||||
    mozToggle.pressed = !areThemesDisabled;
 | 
			
		||||
    mozToggle.className =
 | 
			
		||||
      'zenThemeMarketplaceItemPreferenceToggle zenThemeMarketplaceDisableAllToggle';
 | 
			
		||||
    mozToggle.pressed = !areModsDisabled;
 | 
			
		||||
 | 
			
		||||
    browser.document.l10n.setAttributes(mozToggle, `zen-theme-disable-all-${!areThemesDisabled ? 'enabled' : 'disabled'}`);
 | 
			
		||||
    browser.document.l10n.setAttributes(
 | 
			
		||||
      mozToggle,
 | 
			
		||||
      `zen-theme-disable-all-${!areModsDisabled ? 'enabled' : 'disabled'}`
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    mozToggle.addEventListener('toggle', async (event) => {
 | 
			
		||||
      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);
 | 
			
		||||
      browser.document.l10n.setAttributes(mozToggle, `zen-theme-disable-all-${pressed ? 'enabled' : 'disabled'}`);
 | 
			
		||||
      browser.document.l10n.setAttributes(
 | 
			
		||||
        mozToggle,
 | 
			
		||||
        `zen-theme-disable-all-${pressed ? 'enabled' : 'disabled'}`
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    if (areThemesDisabled) {
 | 
			
		||||
      this.themesList.style.display = 'none';
 | 
			
		||||
    if (areModsDisabled) {
 | 
			
		||||
      this.modsList.style.display = 'none';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return mozToggle;
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  async observe() {
 | 
			
		||||
    ZenThemesCommon.resetThemesCache();
 | 
			
		||||
    await this._buildThemesList();
 | 
			
		||||
    await this._buildModsList();
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  _checkForThemeUpdates(event) {
 | 
			
		||||
    // Send a message to the child to check for theme updates.
 | 
			
		||||
    event.target.disabled = true;
 | 
			
		||||
    // send an event that will be listened by the child process.
 | 
			
		||||
    document.dispatchEvent(new CustomEvent('ZenCheckForThemeUpdates'));
 | 
			
		||||
    document.dispatchEvent(new CustomEvent('ZenCheckForModUpdates'));
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  get updatePref() {
 | 
			
		||||
    return 'zen.themes.updated-value-observer';
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  triggerThemeUpdate() {
 | 
			
		||||
    Services.prefs.setBoolPref(this.updatePref, !Services.prefs.getBoolPref(this.updatePref));
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  get themesList() {
 | 
			
		||||
    if (!this._themesList) {
 | 
			
		||||
      this._themesList = document.getElementById('zenThemeMarketplaceList');
 | 
			
		||||
  get modsList() {
 | 
			
		||||
    if (!this._modsList) {
 | 
			
		||||
      this._modsList = document.getElementById('zenThemeMarketplaceList');
 | 
			
		||||
    }
 | 
			
		||||
    return this._themesList;
 | 
			
		||||
    return this._modsList;
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  async removeTheme(themeId) {
 | 
			
		||||
    const themePath = ZenThemesCommon.getThemeFolder(themeId);
 | 
			
		||||
  async removeMod(modId) {
 | 
			
		||||
    await gZenMods.removeMod(modId);
 | 
			
		||||
 | 
			
		||||
    console.info(`[ZenThemeMarketplaceParent:settings]: Removing theme ${themePath}`);
 | 
			
		||||
 | 
			
		||||
    await IOUtils.remove(themePath, { recursive: true, ignoreAbsent: true });
 | 
			
		||||
 | 
			
		||||
    const themes = await ZenThemesCommon.getThemes();
 | 
			
		||||
    delete themes[themeId];
 | 
			
		||||
    await IOUtils.writeJSON(ZenThemesCommon.themesDataFile, themes);
 | 
			
		||||
 | 
			
		||||
    this.triggerThemeUpdate();
 | 
			
		||||
    gZenMods.triggerModsUpdate();
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  async disableTheme(themeId) {
 | 
			
		||||
    const themes = await ZenThemesCommon.getThemes();
 | 
			
		||||
    const theme = themes[themeId];
 | 
			
		||||
  async disableMod(modId) {
 | 
			
		||||
    await gZenMods.disableMod(modId);
 | 
			
		||||
 | 
			
		||||
    console.log(`[ZenThemeMarketplaceParent:settings]: Disabling theme ${theme.name}`);
 | 
			
		||||
 | 
			
		||||
    theme.enabled = false;
 | 
			
		||||
 | 
			
		||||
    await IOUtils.writeJSON(ZenThemesCommon.themesDataFile, themes);
 | 
			
		||||
    this._doNotRebuildThemesList = true;
 | 
			
		||||
    this.triggerThemeUpdate();
 | 
			
		||||
    this._doNotRebuildModsList = true;
 | 
			
		||||
    gZenMods.triggerModsUpdate();
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  async enableTheme(themeId) {
 | 
			
		||||
    const themes = await ZenThemesCommon.getThemes();
 | 
			
		||||
    const theme = themes[themeId];
 | 
			
		||||
  async enableMod(modId) {
 | 
			
		||||
    await gZenMods.enableMod(modId);
 | 
			
		||||
 | 
			
		||||
    console.log(`[ZenThemeMarketplaceParent:settings]: Enabling theme ${theme.name}`);
 | 
			
		||||
 | 
			
		||||
    theme.enabled = true;
 | 
			
		||||
 | 
			
		||||
    await IOUtils.writeJSON(ZenThemesCommon.themesDataFile, themes);
 | 
			
		||||
    this._doNotRebuildThemesList = true;
 | 
			
		||||
    this.triggerThemeUpdate();
 | 
			
		||||
    this._doNotRebuildModsList = true;
 | 
			
		||||
    gZenMods.triggerModsUpdate();
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  _triggerBuildUpdateWithoutRebuild() {
 | 
			
		||||
    this._doNotRebuildThemesList = true;
 | 
			
		||||
    this.triggerThemeUpdate();
 | 
			
		||||
    this._doNotRebuildModsList = true;
 | 
			
		||||
    gZenMods.triggerModsUpdate();
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  async _importThemes() {
 | 
			
		||||
    const errorBox = document.getElementById('zenThemeMarketplaceImportFailure');
 | 
			
		||||
    const successBox = document.getElementById('zenThemeMarketplaceImportSuccess');
 | 
			
		||||
 | 
			
		||||
    successBox.hidden = true;
 | 
			
		||||
    errorBox.hidden = true;
 | 
			
		||||
 | 
			
		||||
    const input = document.createElement('input');
 | 
			
		||||
 | 
			
		||||
    input.type = 'file';
 | 
			
		||||
    input.accept = '.json';
 | 
			
		||||
    input.style.display = 'none';
 | 
			
		||||
@@ -185,45 +172,52 @@ var gZenMarketplaceManager = {
 | 
			
		||||
    input.setAttribute('accept', '.json');
 | 
			
		||||
 | 
			
		||||
    let timeout;
 | 
			
		||||
 | 
			
		||||
    const filePromise = new Promise((resolve) => {
 | 
			
		||||
      input.addEventListener('change', (event) => {
 | 
			
		||||
        if (timeout) clearTimeout(timeout);
 | 
			
		||||
        if (timeout) {
 | 
			
		||||
          clearTimeout(timeout);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const file = event.target.files[0];
 | 
			
		||||
        resolve(file);
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      timeout = setTimeout(() => {
 | 
			
		||||
        console.warn('[ZenThemeMarketplaceParent:settings]: Import timeout reached, aborting.');
 | 
			
		||||
        console.warn('[ZenSettings:ZenMods]: Import timeout reached, aborting.');
 | 
			
		||||
        resolve(null);
 | 
			
		||||
      }, 60000);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    input.addEventListener('cancel', () => {
 | 
			
		||||
      console.warn('[ZenSettings:ZenMods]: Import cancelled by user.');
 | 
			
		||||
      clearTimeout(timeout);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    input.click();
 | 
			
		||||
 | 
			
		||||
    try {
 | 
			
		||||
      const file = await filePromise;
 | 
			
		||||
 | 
			
		||||
      if (!file) {
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      const content = await file.text();
 | 
			
		||||
 | 
			
		||||
      const themes = JSON.parse(content);
 | 
			
		||||
      const existingThemes = await ZenThemesCommon.getThemes();
 | 
			
		||||
      const uniqueThemes = { ...themes, ...existingThemes };
 | 
			
		||||
      const mods = JSON.parse(content);
 | 
			
		||||
 | 
			
		||||
      console.log(`[ZenThemeMarketplaceParent:settings]: Importing ${Object.keys(themes).length} themes`);
 | 
			
		||||
      await IOUtils.writeJSON(ZenThemesCommon.themesDataFile, uniqueThemes);
 | 
			
		||||
      this.triggerThemeUpdate();
 | 
			
		||||
      successBox.hidden = false;
 | 
			
		||||
 | 
			
		||||
      let buttonIndex = await confirmRestartPrompt(true, 1, true, true);
 | 
			
		||||
      if (buttonIndex == CONFIRM_RESTART_PROMPT_RESTART_NOW) {
 | 
			
		||||
        Services.startup.quit(Ci.nsIAppStartup.eAttemptQuit | Ci.nsIAppStartup.eRestart);
 | 
			
		||||
      for (const mod of Object.values(mods)) {
 | 
			
		||||
        mod.modId = mod.id;
 | 
			
		||||
        await window.ZenInstallMod(mod);
 | 
			
		||||
      }
 | 
			
		||||
    } catch (error) {
 | 
			
		||||
      console.error('[ZenThemeMarketplaceParent:settings]: Error while importing themes:', error);
 | 
			
		||||
      console.error('[ZenSettings:ZenMods]: Error while importing mods:', error);
 | 
			
		||||
      errorBox.hidden = false;
 | 
			
		||||
    } finally {
 | 
			
		||||
      if (input) input.remove();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (input) {
 | 
			
		||||
      input.remove();
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
@@ -234,51 +228,54 @@ var gZenMarketplaceManager = {
 | 
			
		||||
    successBox.hidden = true;
 | 
			
		||||
    errorBox.hidden = true;
 | 
			
		||||
 | 
			
		||||
    let a, url;
 | 
			
		||||
    let temporalAnchor, temporalUrl;
 | 
			
		||||
    try {
 | 
			
		||||
      const themes = await ZenThemesCommon.getThemes();
 | 
			
		||||
      const themesJson = JSON.stringify(themes, null, 2);
 | 
			
		||||
      const blob = new Blob([themesJson], { type: 'application/json' });
 | 
			
		||||
      url = URL.createObjectURL(blob);
 | 
			
		||||
      // Creating a link to download the JSON file
 | 
			
		||||
      a = document.createElement('a');
 | 
			
		||||
      a.href = url;
 | 
			
		||||
      a.download = 'zen-themes-export.json';
 | 
			
		||||
      const mods = await gZenMods.getMods();
 | 
			
		||||
      const modsJson = JSON.stringify(mods, null, 2);
 | 
			
		||||
      const blob = new Blob([modsJson], { type: 'application/json' });
 | 
			
		||||
 | 
			
		||||
      temporalUrl = URL.createObjectURL(blob);
 | 
			
		||||
      // Creating a link to download the JSON file
 | 
			
		||||
      temporalAnchor = document.createElement('a');
 | 
			
		||||
      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;
 | 
			
		||||
    } catch (error) {
 | 
			
		||||
      console.error('[ZenThemeMarketplaceParent:settings]: Error while exporting themes:', error);
 | 
			
		||||
      console.error('[ZenSettings:ZenMods]: Error while exporting mods:', error);
 | 
			
		||||
      errorBox.hidden = false;
 | 
			
		||||
    } finally {
 | 
			
		||||
      if (a) {
 | 
			
		||||
        a.remove();
 | 
			
		||||
      }
 | 
			
		||||
      if (url) {
 | 
			
		||||
        URL.revokeObjectURL(url);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (temporalAnchor) {
 | 
			
		||||
      temporalAnchor.remove();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (temporalUrl) {
 | 
			
		||||
      URL.revokeObjectURL(temporalUrl);
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  async _buildThemesList() {
 | 
			
		||||
    if (!this.themesList) {
 | 
			
		||||
  async _buildModsList() {
 | 
			
		||||
    if (!this.modsList) {
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (this._doNotRebuildThemesList) {
 | 
			
		||||
      this._doNotRebuildThemesList = false;
 | 
			
		||||
    if (this._doNotRebuildModsList) {
 | 
			
		||||
      this._doNotRebuildModsList = false;
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const themes = await ZenThemesCommon.getThemes();
 | 
			
		||||
    const mods = await gZenMods.getMods();
 | 
			
		||||
    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))) {
 | 
			
		||||
      const sanitizedName = `theme-${theme.name?.replaceAll(/\s/g, '-')?.replaceAll(/[^A-z_-]+/g, '')}`;
 | 
			
		||||
      const isThemeEnabled = theme.enabled === undefined || theme.enabled;
 | 
			
		||||
    for (const mod of Object.values(mods).sort((a, b) => a.name.localeCompare(b.name))) {
 | 
			
		||||
      const sanitizedName = gZenMods.sanitizeModName(mod.name);
 | 
			
		||||
      const isModEnabled = mod.enabled === undefined || mod.enabled;
 | 
			
		||||
      const fragment = window.MozXULElement.parseXULToFragment(`
 | 
			
		||||
        <vbox class="zenThemeMarketplaceItem">
 | 
			
		||||
          <vbox class="zenThemeMarketplaceItemContent">
 | 
			
		||||
@@ -288,14 +285,14 @@ var gZenMarketplaceManager = {
 | 
			
		||||
            <description class="description-deemphasized zenThemeMarketplaceItemDescription"></description>
 | 
			
		||||
          </vbox>
 | 
			
		||||
          <hbox class="zenThemeMarketplaceItemActions">
 | 
			
		||||
            ${theme.preferences ? `<button id="zenThemeMarketplaceItemConfigureButton-${sanitizedName}" class="zenThemeMarketplaceItemConfigureButton" hidden="true"></button>` : ''}
 | 
			
		||||
            ${theme.homepage ? `<button id="zenThemeMarketplaceItemHomePageLink-${sanitizedName}" class="zenThemeMarketplaceItemHomepageButton" zen-theme-id="${theme.id}"></button>` : ''}
 | 
			
		||||
            <button class="zenThemeMarketplaceItemUninstallButton" data-l10n-id="zen-theme-marketplace-remove-button" zen-theme-id="${theme.id}"></button>
 | 
			
		||||
            ${mod.preferences ? `<button id="zenThemeMarketplaceItemConfigureButton-${sanitizedName}" class="zenThemeMarketplaceItemConfigureButton" hidden="true"></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-mod-id="${mod.id}"></button>
 | 
			
		||||
          </hbox>
 | 
			
		||||
        </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 baseHeader = fragment.querySelector('#zenThemeMarketplaceItemContentHeader');
 | 
			
		||||
@@ -310,7 +307,7 @@ var gZenMarketplaceManager = {
 | 
			
		||||
 | 
			
		||||
      mainDialogDiv.className = 'zenThemeMarketplaceItemPreferenceDialog';
 | 
			
		||||
      headerDiv.className = 'zenThemeMarketplaceItemPreferenceDialogTopBar';
 | 
			
		||||
      headerTitle.textContent = themeName;
 | 
			
		||||
      headerTitle.textContent = modName;
 | 
			
		||||
      browser.document.l10n.setAttributes(headerTitle, 'zen-theme-marketplace-theme-header-title', {
 | 
			
		||||
        name: sanitizedName,
 | 
			
		||||
      });
 | 
			
		||||
@@ -321,10 +318,10 @@ var gZenMarketplaceManager = {
 | 
			
		||||
      contentDiv.className = 'zenThemeMarketplaceItemPreferenceDialogContent';
 | 
			
		||||
      mozToggle.className = 'zenThemeMarketplaceItemPreferenceToggle';
 | 
			
		||||
 | 
			
		||||
      mozToggle.pressed = isThemeEnabled;
 | 
			
		||||
      mozToggle.pressed = isModEnabled;
 | 
			
		||||
      browser.document.l10n.setAttributes(
 | 
			
		||||
        mozToggle,
 | 
			
		||||
        `zen-theme-marketplace-toggle-${isThemeEnabled ? 'enabled' : 'disabled'}-button`
 | 
			
		||||
        `zen-theme-marketplace-toggle-${isModEnabled ? 'enabled' : 'disabled'}-button`
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
      baseHeader.appendChild(mozToggle);
 | 
			
		||||
@@ -342,27 +339,37 @@ var gZenMarketplaceManager = {
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      mozToggle.addEventListener('toggle', async (event) => {
 | 
			
		||||
        const themeId = event.target
 | 
			
		||||
        const modId = event.target
 | 
			
		||||
          .closest('.zenThemeMarketplaceItem')
 | 
			
		||||
          .querySelector('.zenThemeMarketplaceItemUninstallButton')
 | 
			
		||||
          .getAttribute('zen-theme-id');
 | 
			
		||||
          .getAttribute('zen-mod-id');
 | 
			
		||||
        event.target.setAttribute('disabled', true);
 | 
			
		||||
 | 
			
		||||
        if (!event.target.hasAttribute('pressed')) {
 | 
			
		||||
          await this.disableTheme(themeId);
 | 
			
		||||
          await this.disableMod(modId);
 | 
			
		||||
 | 
			
		||||
          browser.document.l10n.setAttributes(mozToggle, 'zen-theme-marketplace-toggle-disabled-button');
 | 
			
		||||
          browser.document.l10n.setAttributes(
 | 
			
		||||
            mozToggle,
 | 
			
		||||
            'zen-theme-marketplace-toggle-disabled-button'
 | 
			
		||||
          );
 | 
			
		||||
 | 
			
		||||
          if (theme.preferences) {
 | 
			
		||||
            document.getElementById(`zenThemeMarketplaceItemConfigureButton-${sanitizedName}`).setAttribute('hidden', true);
 | 
			
		||||
          if (mod.preferences) {
 | 
			
		||||
            document
 | 
			
		||||
              .getElementById(`zenThemeMarketplaceItemConfigureButton-${sanitizedName}`)
 | 
			
		||||
              .setAttribute('hidden', true);
 | 
			
		||||
          }
 | 
			
		||||
        } else {
 | 
			
		||||
          await this.enableTheme(themeId);
 | 
			
		||||
          await this.enableMod(modId);
 | 
			
		||||
 | 
			
		||||
          browser.document.l10n.setAttributes(mozToggle, 'zen-theme-marketplace-toggle-enabled-button');
 | 
			
		||||
          browser.document.l10n.setAttributes(
 | 
			
		||||
            mozToggle,
 | 
			
		||||
            'zen-theme-marketplace-toggle-enabled-button'
 | 
			
		||||
          );
 | 
			
		||||
 | 
			
		||||
          if (theme.preferences) {
 | 
			
		||||
            document.getElementById(`zenThemeMarketplaceItemConfigureButton-${sanitizedName}`).removeAttribute('hidden');
 | 
			
		||||
          if (mod.preferences) {
 | 
			
		||||
            document
 | 
			
		||||
              .getElementById(`zenThemeMarketplaceItemConfigureButton-${sanitizedName}`)
 | 
			
		||||
              .removeAttribute('hidden');
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        setTimeout(() => {
 | 
			
		||||
@@ -371,39 +378,47 @@ var gZenMarketplaceManager = {
 | 
			
		||||
        }, 400);
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      fragment.querySelector('.zenThemeMarketplaceItemTitle').textContent = themeName;
 | 
			
		||||
      fragment.querySelector('.zenThemeMarketplaceItemDescription').textContent = theme.description;
 | 
			
		||||
      fragment.querySelector('.zenThemeMarketplaceItemUninstallButton').addEventListener('click', async (event) => {
 | 
			
		||||
        const [msg] = await document.l10n.formatValues([{ id: 'zen-theme-marketplace-remove-confirmation' }]);
 | 
			
		||||
      fragment.querySelector('.zenThemeMarketplaceItemTitle').textContent = modName;
 | 
			
		||||
      fragment.querySelector('.zenThemeMarketplaceItemDescription').textContent = mod.description;
 | 
			
		||||
      fragment
 | 
			
		||||
        .querySelector('.zenThemeMarketplaceItemUninstallButton')
 | 
			
		||||
        .addEventListener('click', async (event) => {
 | 
			
		||||
          const [msg] = await document.l10n.formatValues([
 | 
			
		||||
            { id: 'zen-theme-marketplace-remove-confirmation' },
 | 
			
		||||
          ]);
 | 
			
		||||
 | 
			
		||||
        if (!confirm(msg)) {
 | 
			
		||||
          return;
 | 
			
		||||
        }
 | 
			
		||||
          if (!confirm(msg)) {
 | 
			
		||||
            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');
 | 
			
		||||
        homepageButton.addEventListener('click', () => {
 | 
			
		||||
          // open the homepage url in a new tab
 | 
			
		||||
          const url = theme.homepage;
 | 
			
		||||
          const url = mod.homepage;
 | 
			
		||||
 | 
			
		||||
          window.open(url, '_blank');
 | 
			
		||||
        });
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (theme.preferences) {
 | 
			
		||||
        fragment.querySelector('.zenThemeMarketplaceItemConfigureButton').addEventListener('click', () => {
 | 
			
		||||
          dialog.showModal();
 | 
			
		||||
        });
 | 
			
		||||
      if (mod.preferences) {
 | 
			
		||||
        fragment
 | 
			
		||||
          .querySelector('.zenThemeMarketplaceItemConfigureButton')
 | 
			
		||||
          .addEventListener('click', () => {
 | 
			
		||||
            dialog.showModal();
 | 
			
		||||
          });
 | 
			
		||||
 | 
			
		||||
        if (isThemeEnabled) {
 | 
			
		||||
          fragment.querySelector('.zenThemeMarketplaceItemConfigureButton').removeAttribute('hidden');
 | 
			
		||||
        if (isModEnabled) {
 | 
			
		||||
          fragment
 | 
			
		||||
            .querySelector('.zenThemeMarketplaceItemConfigureButton')
 | 
			
		||||
            .removeAttribute('hidden');
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      const preferences = await ZenThemesCommon.getThemePreferences(theme);
 | 
			
		||||
      const preferences = await gZenMods.getModPreferences(mod);
 | 
			
		||||
 | 
			
		||||
      if (preferences.length > 0) {
 | 
			
		||||
        const preferencesWrapper = document.createXULElement('vbox');
 | 
			
		||||
@@ -440,7 +455,10 @@ var gZenMarketplaceManager = {
 | 
			
		||||
              if (placeholder) {
 | 
			
		||||
                defaultItem.setAttribute('label', placeholder || '-');
 | 
			
		||||
              } else {
 | 
			
		||||
                browser.document.l10n.setAttributes(defaultItem, 'zen-theme-marketplace-dropdown-default-label');
 | 
			
		||||
                browser.document.l10n.setAttributes(
 | 
			
		||||
                  defaultItem,
 | 
			
		||||
                  'zen-theme-marketplace-dropdown-default-label'
 | 
			
		||||
                );
 | 
			
		||||
              }
 | 
			
		||||
 | 
			
		||||
              menupopup.appendChild(defaultItem);
 | 
			
		||||
@@ -452,7 +470,7 @@ var gZenMarketplaceManager = {
 | 
			
		||||
 | 
			
		||||
                if (!['string', 'number'].includes(valueType)) {
 | 
			
		||||
                  console.log(
 | 
			
		||||
                    `[ZenThemeMarketplaceParent:settings]: Warning, invalid data type received (${valueType}), skipping.`
 | 
			
		||||
                    `[ZenSettings:ZenMods]: Warning, invalid data type received (${valueType}), skipping.`
 | 
			
		||||
                  );
 | 
			
		||||
                  continue;
 | 
			
		||||
                }
 | 
			
		||||
@@ -508,7 +526,9 @@ var gZenMarketplaceManager = {
 | 
			
		||||
                </hbox>
 | 
			
		||||
              `);
 | 
			
		||||
 | 
			
		||||
              const checkboxElement = checkbox.querySelector('.zenThemeMarketplaceItemPreferenceCheckbox');
 | 
			
		||||
              const checkboxElement = checkbox.querySelector(
 | 
			
		||||
                '.zenThemeMarketplaceItemPreferenceCheckbox'
 | 
			
		||||
              );
 | 
			
		||||
              checkboxElement.setAttribute('label', label);
 | 
			
		||||
              checkboxElement.setAttribute('tooltiptext', property);
 | 
			
		||||
              checkboxElement.setAttribute('zen-pref', property);
 | 
			
		||||
@@ -554,21 +574,28 @@ var gZenMarketplaceManager = {
 | 
			
		||||
              if (placeholder) {
 | 
			
		||||
                input.setAttribute('placeholder', placeholder || '-');
 | 
			
		||||
              } else {
 | 
			
		||||
                browser.document.l10n.setAttributes(input, 'zen-theme-marketplace-input-default-placeholder');
 | 
			
		||||
                browser.document.l10n.setAttributes(
 | 
			
		||||
                  input,
 | 
			
		||||
                  'zen-theme-marketplace-input-default-placeholder'
 | 
			
		||||
                );
 | 
			
		||||
              }
 | 
			
		||||
 | 
			
		||||
              input.addEventListener(
 | 
			
		||||
                'input',
 | 
			
		||||
                ZenThemesCommon.debounce((event) => {
 | 
			
		||||
                'change',
 | 
			
		||||
                gZenMods.debounce((event) => {
 | 
			
		||||
                  const value = event.target.value;
 | 
			
		||||
 | 
			
		||||
                  Services.prefs.setStringPref(property, value);
 | 
			
		||||
                  this._triggerBuildUpdateWithoutRebuild();
 | 
			
		||||
 | 
			
		||||
                  if (value === '') {
 | 
			
		||||
                    browser.document.querySelector(':root').style.removeProperty(`--${sanitizedProperty}`);
 | 
			
		||||
                    browser.document
 | 
			
		||||
                      .querySelector(':root')
 | 
			
		||||
                      .style.removeProperty(`--${sanitizedProperty}`);
 | 
			
		||||
                  } else {
 | 
			
		||||
                    browser.document.querySelector(':root').style.setProperty(`--${sanitizedProperty}`, value);
 | 
			
		||||
                    browser.document
 | 
			
		||||
                      .querySelector(':root')
 | 
			
		||||
                      .style.setProperty(`--${sanitizedProperty}`, value);
 | 
			
		||||
                  }
 | 
			
		||||
                }, 500)
 | 
			
		||||
              );
 | 
			
		||||
@@ -589,18 +616,18 @@ var gZenMarketplaceManager = {
 | 
			
		||||
 | 
			
		||||
            default:
 | 
			
		||||
              console.log(
 | 
			
		||||
                `[ZenThemeMarketplaceParent:settings]: Warning, unknown preference type received (${type}), skipping.`
 | 
			
		||||
                `[ZenSettings:ZenMods]: Warning, unknown preference type received (${type}), skipping.`
 | 
			
		||||
              );
 | 
			
		||||
              continue;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        contentDiv.appendChild(preferencesWrapper);
 | 
			
		||||
      }
 | 
			
		||||
      themeList.appendChild(fragment);
 | 
			
		||||
      modList.appendChild(fragment);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.themesList.replaceChildren(...themeList.children);
 | 
			
		||||
    themeList.remove();
 | 
			
		||||
    this.modsList.replaceChildren(...modList.children);
 | 
			
		||||
    modList.remove();
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -608,6 +635,19 @@ const kZenExtendedSidebar = 'zen.view.sidebar-expanded';
 | 
			
		||||
const kZenSingleToolbar = 'zen.view.use-single-toolbar';
 | 
			
		||||
 | 
			
		||||
var gZenLooksAndFeel = {
 | 
			
		||||
  kZenColors: [
 | 
			
		||||
    '#aac7ff',
 | 
			
		||||
    '#74d7cb',
 | 
			
		||||
    '#a0d490',
 | 
			
		||||
    '#dec663',
 | 
			
		||||
    '#ffb787',
 | 
			
		||||
    '#dec1b1',
 | 
			
		||||
    '#ffb1c0',
 | 
			
		||||
    '#ddbfc3',
 | 
			
		||||
    '#f6b0ea',
 | 
			
		||||
    '#d4bbff',
 | 
			
		||||
  ],
 | 
			
		||||
 | 
			
		||||
  init() {
 | 
			
		||||
    if (this.__hasInitialized) return;
 | 
			
		||||
    this.__hasInitialized = true;
 | 
			
		||||
@@ -638,7 +678,11 @@ var gZenLooksAndFeel = {
 | 
			
		||||
      layout.classList.remove('selected');
 | 
			
		||||
      if (layout.getAttribute('layout') == 'single' && isSingleToolbar) {
 | 
			
		||||
        layout.classList.add('selected');
 | 
			
		||||
      } else if (layout.getAttribute('layout') == 'multiple' && !isSingleToolbar && isExtendedSidebar) {
 | 
			
		||||
      } else if (
 | 
			
		||||
        layout.getAttribute('layout') == 'multiple' &&
 | 
			
		||||
        !isSingleToolbar &&
 | 
			
		||||
        isExtendedSidebar
 | 
			
		||||
      ) {
 | 
			
		||||
        layout.classList.add('selected');
 | 
			
		||||
      } else if (layout.getAttribute('layout') == 'collapsed' && !isExtendedSidebar) {
 | 
			
		||||
        layout.classList.add('selected');
 | 
			
		||||
@@ -658,7 +702,10 @@ var gZenLooksAndFeel = {
 | 
			
		||||
 | 
			
		||||
        layout.classList.add('selected');
 | 
			
		||||
 | 
			
		||||
        Services.prefs.setBoolPref(kZenExtendedSidebar, layout.getAttribute('layout') != 'collapsed');
 | 
			
		||||
        Services.prefs.setBoolPref(
 | 
			
		||||
          kZenExtendedSidebar,
 | 
			
		||||
          layout.getAttribute('layout') != 'collapsed'
 | 
			
		||||
        );
 | 
			
		||||
        Services.prefs.setBoolPref(kZenSingleToolbar, layout.getAttribute('layout') == 'single');
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
@@ -702,7 +749,8 @@ var gZenLooksAndFeel = {
 | 
			
		||||
  _initializeColorPicker(accentColor) {
 | 
			
		||||
    let elem = document.getElementById('zenLooksAndFeelColorOptions');
 | 
			
		||||
    elem.innerHTML = '';
 | 
			
		||||
    for (let color of ZenThemesCommon.kZenColors) {
 | 
			
		||||
 | 
			
		||||
    for (let color of this.kZenColors) {
 | 
			
		||||
      let colorElemParen = document.createElement('div');
 | 
			
		||||
      let colorElem = document.createElement('div');
 | 
			
		||||
      colorElemParen.classList.add('zenLooksAndFeelColorOptionParen');
 | 
			
		||||
@@ -726,7 +774,7 @@ var gZenLooksAndFeel = {
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  _getInitialAccentColor() {
 | 
			
		||||
    return Services.prefs.getStringPref('zen.theme.accent-color', ZenThemesCommon.kZenColors[0]);
 | 
			
		||||
    return Services.prefs.getStringPref('zen.theme.accent-color', this.kZenColors[0]);
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -742,13 +790,19 @@ var gZenWorkspacesSettings = {
 | 
			
		||||
    };
 | 
			
		||||
    Services.prefs.addObserver('zen.tab-unloader.enabled', tabsUnloaderPrefListener);
 | 
			
		||||
    Services.prefs.addObserver('zen.glance.enabled', tabsUnloaderPrefListener); // We can use the same listener for both prefs
 | 
			
		||||
    Services.prefs.addObserver('zen.workspaces.container-specific-essentials-enabled', tabsUnloaderPrefListener);
 | 
			
		||||
    Services.prefs.addObserver(
 | 
			
		||||
      'zen.workspaces.container-specific-essentials-enabled',
 | 
			
		||||
      tabsUnloaderPrefListener
 | 
			
		||||
    );
 | 
			
		||||
    Services.prefs.addObserver('zen.glance.activation-method', tabsUnloaderPrefListener);
 | 
			
		||||
    window.addEventListener('unload', () => {
 | 
			
		||||
      Services.prefs.removeObserver('zen.tab-unloader.enabled', tabsUnloaderPrefListener);
 | 
			
		||||
      Services.prefs.removeObserver('zen.glance.enabled', tabsUnloaderPrefListener);
 | 
			
		||||
      Services.prefs.removeObserver('zen.glance.activation-method', tabsUnloaderPrefListener);
 | 
			
		||||
      Services.prefs.removeObserver('zen.workspaces.container-specific-essentials-enabled', tabsUnloaderPrefListener);
 | 
			
		||||
      Services.prefs.removeObserver(
 | 
			
		||||
        'zen.workspaces.container-specific-essentials-enabled',
 | 
			
		||||
        tabsUnloaderPrefListener
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
@@ -808,6 +862,11 @@ var zenMissingKeyboardShortcutL10n = {
 | 
			
		||||
  key_accessibility: 'zen-devtools-toggle-accessibility-shortcut',
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var zenIgnoreKeyboardShortcutL10n = [
 | 
			
		||||
  'zen-full-zoom-reduce-shortcut-alt-b',
 | 
			
		||||
  'zen-full-zoom-reduce-shortcut-alt-a',
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
var gZenCKSSettings = {
 | 
			
		||||
  async init() {
 | 
			
		||||
    await this._initializeCKS();
 | 
			
		||||
@@ -871,6 +930,10 @@ var gZenCKSSettings = {
 | 
			
		||||
 | 
			
		||||
      const labelValue = zenMissingKeyboardShortcutL10n[keyID] ?? l10nID;
 | 
			
		||||
 | 
			
		||||
      if (zenIgnoreKeyboardShortcutL10n.includes(labelValue)) {
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      let fragment = window.MozXULElement.parseXULToFragment(`
 | 
			
		||||
        <hbox class="${ZEN_CKS_CLASS_BASE}">
 | 
			
		||||
          <label class="${ZEN_CKS_LABEL_CLASS}" for="${ZEN_CKS_CLASS_BASE}-${keyID}"></label>
 | 
			
		||||
@@ -930,6 +993,9 @@ var gZenCKSSettings = {
 | 
			
		||||
            sibling.remove();
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        if (target.classList.contains(`${ZEN_CKS_INPUT_FIELD_CLASS}-not-set`)) {
 | 
			
		||||
          target.label = 'Not set';
 | 
			
		||||
        }
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      const groupElem = wrapper.querySelector(`[data-group="${ZEN_CKS_GROUP_PREFIX}-${group}"]`);
 | 
			
		||||
@@ -966,8 +1032,16 @@ var gZenCKSSettings = {
 | 
			
		||||
 | 
			
		||||
    event.preventDefault();
 | 
			
		||||
 | 
			
		||||
    let input = document.querySelector(`.${ZEN_CKS_INPUT_FIELD_CLASS}[${KEYBIND_ATTRIBUTE_KEY}="${this._currentActionID}"]`);
 | 
			
		||||
    const modifiers = new KeyShortcutModifiers(event.ctrlKey, event.altKey, event.shiftKey, event.metaKey, false);
 | 
			
		||||
    let input = document.querySelector(
 | 
			
		||||
      `.${ZEN_CKS_INPUT_FIELD_CLASS}[${KEYBIND_ATTRIBUTE_KEY}="${this._currentActionID}"]`
 | 
			
		||||
    );
 | 
			
		||||
    const modifiers = new KeyShortcutModifiers(
 | 
			
		||||
      event.ctrlKey,
 | 
			
		||||
      event.altKey,
 | 
			
		||||
      event.shiftKey,
 | 
			
		||||
      event.metaKey,
 | 
			
		||||
      false
 | 
			
		||||
    );
 | 
			
		||||
    const modifiersActive = modifiers.areAnyActive();
 | 
			
		||||
 | 
			
		||||
    input.classList.remove(`${ZEN_CKS_INPUT_FIELD_CLASS}-not-set`);
 | 
			
		||||
@@ -979,6 +1053,7 @@ var gZenCKSSettings = {
 | 
			
		||||
    shortcut = shortcut.replace(/Ctrl|Control|Shift|Alt|Option|Cmd|Meta/, ''); // Remove all modifiers
 | 
			
		||||
 | 
			
		||||
    if (shortcut == 'Tab' && !modifiersActive) {
 | 
			
		||||
      input.classList.remove(`${ZEN_CKS_INPUT_FIELD_CLASS}-not-set`);
 | 
			
		||||
      input.classList.remove(`${ZEN_CKS_INPUT_FIELD_CLASS}-editing`);
 | 
			
		||||
      this._latestValidKey = null;
 | 
			
		||||
      return;
 | 
			
		||||
@@ -1006,6 +1081,9 @@ var gZenCKSSettings = {
 | 
			
		||||
        input.classList.remove(`${ZEN_CKS_INPUT_FIELD_CLASS}-editing`);
 | 
			
		||||
 | 
			
		||||
        this._editDone(this._latestValidKey, this._latestModifier);
 | 
			
		||||
        if (this.name == 'Not set') {
 | 
			
		||||
          input.classList.add(`${ZEN_CKS_INPUT_FIELD_CLASS}-not-set`);
 | 
			
		||||
        }
 | 
			
		||||
        this._latestValidKey = null;
 | 
			
		||||
        this._latestModifier = null;
 | 
			
		||||
        input.classList.remove(`${ZEN_CKS_INPUT_FIELD_CLASS}-invalid`);
 | 
			
		||||
@@ -1027,6 +1105,10 @@ var gZenCKSSettings = {
 | 
			
		||||
      this._latestValidKey = null;
 | 
			
		||||
      this._latestModifier = null;
 | 
			
		||||
      this._hasSafed = true;
 | 
			
		||||
      const sibling = input.nextElementSibling;
 | 
			
		||||
      if (sibling && sibling.classList.contains(`${ZEN_CKS_CLASS_BASE}-conflict`)) {
 | 
			
		||||
        sibling.remove();
 | 
			
		||||
      }
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1120,11 +1202,6 @@ Preferences.addAll([
 | 
			
		||||
    type: 'bool',
 | 
			
		||||
    default: true,
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    id: 'zen.essentials.enabled',
 | 
			
		||||
    type: 'bool',
 | 
			
		||||
    default: true,
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    id: 'zen.workspaces.container-specific-essentials-enabled',
 | 
			
		||||
    type: 'bool',
 | 
			
		||||
@@ -1150,4 +1227,14 @@ Preferences.addAll([
 | 
			
		||||
    type: 'bool',
 | 
			
		||||
    default: true,
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    id: 'zen.workspaces.continue-where-left-off',
 | 
			
		||||
    type: 'bool',
 | 
			
		||||
    default: false,
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    id: 'zen.mods.auto-update',
 | 
			
		||||
    type: 'bool',
 | 
			
		||||
    default: true,
 | 
			
		||||
  },
 | 
			
		||||
]);
 | 
			
		||||
 
 | 
			
		||||
@@ -78,9 +78,6 @@
 | 
			
		||||
</hbox>
 | 
			
		||||
 | 
			
		||||
<groupbox id="zenThemeGroup" data-category="paneZenLooks" hidden="true" class="highlighting-group">
 | 
			
		||||
      <label><html:h2 data-l10n-id="zen-look-and-feel-urlbar-header"/></label>
 | 
			
		||||
      <description class="description-deemphasized" data-l10n-id="zen-look-and-feel-urlbar-description" />
 | 
			
		||||
 | 
			
		||||
      <label><html:h2 data-l10n-id="zen-look-and-feel-compact-view-header"/></label>
 | 
			
		||||
      <description class="description-deemphasized" data-l10n-id="zen-look-and-feel-compact-view-description" />
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
<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">
 | 
			
		||||
<hbox id="ZenMarketplaceCategory"
 | 
			
		||||
      class="subcategory"
 | 
			
		||||
@@ -21,6 +20,10 @@
 | 
			
		||||
            <button id="zenThemeMarketplaceCheckForUpdates" data-l10n-id="zen-theme-marketplace-check-for-updates-button" />
 | 
			
		||||
      </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-failure" hidden="true" id="zenThemeMarketplaceUpdatesFailure" />
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@
 | 
			
		||||
      class="subcategory"
 | 
			
		||||
      hidden="true"
 | 
			
		||||
      data-category="paneZenTabManagement">
 | 
			
		||||
<html:h1 data-l10n-id="pane-workspaces-title"/>
 | 
			
		||||
</hbox>
 | 
			
		||||
 | 
			
		||||
<hbox id="zenTabManagementCategory"
 | 
			
		||||
@@ -32,26 +31,6 @@
 | 
			
		||||
<html:h1 data-l10n-id="pane-zen-tabs-unloader-title"/>
 | 
			
		||||
</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"
 | 
			
		||||
      class="subcategory"
 | 
			
		||||
      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,8 +1,28 @@
 | 
			
		||||
diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs
 | 
			
		||||
index 5633e5032f5d50c70512187d27e045b579978927..dd7aa4827eaa809dadc7e1fe6cdd1083e79f383a 100644
 | 
			
		||||
index 8c6047e1ada5a22e57e1e665965237c9e22641d7..8d0585e738a5a758ebbddfa0787c71d634dadd4d 100644
 | 
			
		||||
--- a/browser/components/sessionstore/SessionStore.sys.mjs
 | 
			
		||||
+++ b/browser/components/sessionstore/SessionStore.sys.mjs
 | 
			
		||||
@@ -3202,7 +3202,7 @@ var SessionStoreInternal = {
 | 
			
		||||
@@ -2088,7 +2088,6 @@ var SessionStoreInternal = {
 | 
			
		||||
       if (closedWindowState) {
 | 
			
		||||
         let newWindowState;
 | 
			
		||||
         if (
 | 
			
		||||
-          AppConstants.platform == "macosx" ||
 | 
			
		||||
           !lazy.SessionStartup.willRestore()
 | 
			
		||||
         ) {
 | 
			
		||||
           // We want to split the window up into pinned tabs and unpinned tabs.
 | 
			
		||||
@@ -2303,11 +2302,9 @@ var SessionStoreInternal = {
 | 
			
		||||
           tabbrowser.selectedTab.label;
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
-      if (AppConstants.platform != "macosx") {
 | 
			
		||||
         // Until we decide otherwise elsewhere, this window is part of a series
 | 
			
		||||
         // of closing windows to quit.
 | 
			
		||||
         winData._shouldRestore = true;
 | 
			
		||||
-      }
 | 
			
		||||
 
 | 
			
		||||
       // 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
 | 
			
		||||
@@ -3216,7 +3213,7 @@ var SessionStoreInternal = {
 | 
			
		||||
     if (!isPrivateWindow && tabState.isPrivate) {
 | 
			
		||||
       return;
 | 
			
		||||
     }
 | 
			
		||||
@@ -11,22 +31,33 @@ index 5633e5032f5d50c70512187d27e045b579978927..dd7aa4827eaa809dadc7e1fe6cdd1083
 | 
			
		||||
       return;
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
@@ -3911,6 +3911,9 @@ var SessionStoreInternal = {
 | 
			
		||||
@@ -3925,6 +3922,11 @@ var SessionStoreInternal = {
 | 
			
		||||
         Math.min(tabState.index, tabState.entries.length)
 | 
			
		||||
       );
 | 
			
		||||
       tabState.pinned = false;
 | 
			
		||||
+      tabState.zenEssential = false;
 | 
			
		||||
+      tabState.zenPinnedId = null;
 | 
			
		||||
+      tabState.zenIsGlance = false;
 | 
			
		||||
+      tabState.zenGlanceId = null;
 | 
			
		||||
+      tabState.zenHasStaticLabel = false;
 | 
			
		||||
 
 | 
			
		||||
       if (inBackground === false) {
 | 
			
		||||
         aWindow.gBrowser.selectedTab = newTab;
 | 
			
		||||
@@ -5416,14 +5419,15 @@ var SessionStoreInternal = {
 | 
			
		||||
@@ -5239,7 +5241,7 @@ var SessionStoreInternal = {
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     let workspaceID = aWindow.getWorkspaceID();
 | 
			
		||||
-    if (workspaceID) {
 | 
			
		||||
+    if (workspaceID && !(this.isLastRestorableWindow() && AppConstants.platform == "macosx")) {
 | 
			
		||||
       winData.workspaceID = workspaceID;
 | 
			
		||||
     }
 | 
			
		||||
   },
 | 
			
		||||
@@ -5430,14 +5432,15 @@ var SessionStoreInternal = {
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     let tabbrowser = aWindow.gBrowser;
 | 
			
		||||
-    let tabs = tabbrowser.tabs;
 | 
			
		||||
+    let tabs = aWindow.ZenWorkspaces.allStoredTabs;
 | 
			
		||||
+    let tabs = aWindow.gZenWorkspaces.allStoredTabs;
 | 
			
		||||
     /** @type {WindowStateData} */
 | 
			
		||||
     let winData = this._windows[aWindow.__SSi];
 | 
			
		||||
     let tabsData = (winData.tabs = []);
 | 
			
		||||
@@ -39,16 +70,29 @@ index 5633e5032f5d50c70512187d27e045b579978927..dd7aa4827eaa809dadc7e1fe6cdd1083
 | 
			
		||||
         continue;
 | 
			
		||||
       }
 | 
			
		||||
       let tabData = lazy.TabState.collect(tab, TAB_CUSTOM_VALUES.get(tab));
 | 
			
		||||
@@ -5442,7 +5446,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
 | 
			
		||||
     // a window is closed, point to the first item in the tab strip instead (it will never be the Firefox View tab,
 | 
			
		||||
     // since it's only inserted into the tab strip after it's selected).
 | 
			
		||||
-    if (aWindow.FirefoxViewHandler.tab?.selected) {
 | 
			
		||||
-      selectedIndex = 1;
 | 
			
		||||
+    if (aWindow.FirefoxViewHandler.tab?.selected || tabbrowser.selectedTab.hasAttribute("zen-empty-tab")) {
 | 
			
		||||
       selectedIndex = 1;
 | 
			
		||||
+      selectedIndex = 0;
 | 
			
		||||
       winData.title = tabbrowser.tabs[0].label;
 | 
			
		||||
     }
 | 
			
		||||
@@ -5599,6 +5603,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.groups ?? []
 | 
			
		||||
       );
 | 
			
		||||
@@ -56,12 +100,13 @@ index 5633e5032f5d50c70512187d27e045b579978927..dd7aa4827eaa809dadc7e1fe6cdd1083
 | 
			
		||||
       this._log.debug(
 | 
			
		||||
         `restoreWindow, createTabsForSessionRestore returned ${tabs.length} tabs`
 | 
			
		||||
       );
 | 
			
		||||
@@ -6148,8 +6153,23 @@ var SessionStoreInternal = {
 | 
			
		||||
@@ -6162,6 +6166,22 @@ var SessionStoreInternal = {
 | 
			
		||||
 
 | 
			
		||||
     // Most of tabData has been restored, now continue with restoring
 | 
			
		||||
     // attributes that may trigger external events.
 | 
			
		||||
+    if (tabData.zenEssential) {
 | 
			
		||||
+      tab.setAttribute("zen-essential", "true");
 | 
			
		||||
+      tabData.pinned = true; // Essential tabs are always pinned.
 | 
			
		||||
+    }
 | 
			
		||||
+    if (tabData.zenIsEmpty) {
 | 
			
		||||
+      tab.setAttribute("zen-empty-tab", "true");
 | 
			
		||||
@@ -76,8 +121,5 @@ index 5633e5032f5d50c70512187d27e045b579978927..dd7aa4827eaa809dadc7e1fe6cdd1083
 | 
			
		||||
+      tab.setAttribute("zenDefaultUserContextId", true);
 | 
			
		||||
+    }
 | 
			
		||||
 
 | 
			
		||||
-    if (tabData.pinned) {
 | 
			
		||||
+    if (tabData.pinned || tabData.zenEssential) {
 | 
			
		||||
     if (tabData.pinned) {
 | 
			
		||||
       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
 | 
			
		||||
index 8f7ed557e6aa61e7e16ed4a8d785ad5fe651b3d8..254849e13f7566029dc780c45e376e0f0d427cb5 100644
 | 
			
		||||
index 8f7ed557e6aa61e7e16ed4a8d785ad5fe651b3d8..76f4cf5aef30cb580ef0295fe6928b5a6a362f4b 100644
 | 
			
		||||
--- a/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;
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,8 @@ index 8f7ed557e6aa61e7e16ed4a8d785ad5fe651b3d8..254849e13f7566029dc780c45e376e0f
 | 
			
		||||
+    tabData.zenPinnedIcon = tab.getAttribute("zen-pinned-icon");
 | 
			
		||||
+    tabData.zenIsEmpty = tab.hasAttribute("zen-empty-tab");
 | 
			
		||||
+    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);
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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,17 +1,18 @@
 | 
			
		||||
diff --git a/browser/components/tabbrowser/content/browser-ctrlTab.js b/browser/components/tabbrowser/content/browser-ctrlTab.js
 | 
			
		||||
index 6753641cb579032306453be3f5054d7bc7661e8c..436ee8940c8a73d238a7aed10768a0a752a3f119 100644
 | 
			
		||||
index 6753641cb579032306453be3f5054d7bc7661e8c..bf21f6c14f825fbe2d322900595cd34456fe1231 100644
 | 
			
		||||
--- a/browser/components/tabbrowser/content/browser-ctrlTab.js
 | 
			
		||||
+++ b/browser/components/tabbrowser/content/browser-ctrlTab.js
 | 
			
		||||
@@ -252,7 +252,7 @@ var ctrlTab = {
 | 
			
		||||
@@ -252,7 +252,8 @@ var ctrlTab = {
 | 
			
		||||
   },
 | 
			
		||||
 
 | 
			
		||||
   get tabList() {
 | 
			
		||||
-    return this._recentlyUsedTabs;
 | 
			
		||||
+    return this._recentlyUsedTabs.filter(tab => !tab.hasAttribute("pending"));
 | 
			
		||||
+    const canShowPending = Services.prefs.getBoolPref("zen.ctrlTab.show-pending-tabs", false);
 | 
			
		||||
+    return this._recentlyUsedTabs.filter(tab => !tab.hasAttribute("pending") || canShowPending);
 | 
			
		||||
   },
 | 
			
		||||
 
 | 
			
		||||
   init: function ctrlTab_init() {
 | 
			
		||||
@@ -459,7 +459,7 @@ var ctrlTab = {
 | 
			
		||||
@@ -459,7 +460,7 @@ var ctrlTab = {
 | 
			
		||||
     // If the tab is hidden, don't add it to the list unless it's selected
 | 
			
		||||
     // (Normally hidden tabs would be unhidden when selected, but that doesn't
 | 
			
		||||
     // happen for Firefox View).
 | 
			
		||||
@@ -20,7 +21,7 @@ index 6753641cb579032306453be3f5054d7bc7661e8c..436ee8940c8a73d238a7aed10768a0a7
 | 
			
		||||
       return;
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
@@ -483,7 +483,7 @@ var ctrlTab = {
 | 
			
		||||
@@ -483,7 +484,7 @@ var ctrlTab = {
 | 
			
		||||
   },
 | 
			
		||||
 
 | 
			
		||||
   open: function ctrlTab_open() {
 | 
			
		||||
@@ -29,7 +30,7 @@ index 6753641cb579032306453be3f5054d7bc7661e8c..436ee8940c8a73d238a7aed10768a0a7
 | 
			
		||||
       return;
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
@@ -761,7 +761,7 @@ var ctrlTab = {
 | 
			
		||||
@@ -761,7 +762,7 @@ var ctrlTab = {
 | 
			
		||||
   _initRecentlyUsedTabs() {
 | 
			
		||||
     this._recentlyUsedTabs = Array.prototype.filter.call(
 | 
			
		||||
       gBrowser.tabs,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
diff --git a/browser/components/tabbrowser/content/tab.js b/browser/components/tabbrowser/content/tab.js
 | 
			
		||||
index dc92771ebc65095dfebbddc238ee6d4fffd897bf..ae9120f7cc8989cf625ac101d053d82582e32009 100644
 | 
			
		||||
index f43ab1cf6257ff1a9c9aa522a0180fd9bbfe4036..d9714c46de860243b06af7e8343d36b107efb855 100644
 | 
			
		||||
--- a/browser/components/tabbrowser/content/tab.js
 | 
			
		||||
+++ b/browser/components/tabbrowser/content/tab.js
 | 
			
		||||
@@ -21,6 +21,7 @@
 | 
			
		||||
@@ -21,7 +21,7 @@ index dc92771ebc65095dfebbddc238ee6d4fffd897bf..ae9120f7cc8989cf625ac101d053d825
 | 
			
		||||
         </hbox>
 | 
			
		||||
       </stack>
 | 
			
		||||
       `;
 | 
			
		||||
@@ -175,7 +178,7 @@
 | 
			
		||||
@@ -180,7 +183,7 @@
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     set _visuallySelected(val) {
 | 
			
		||||
@@ -30,7 +30,7 @@ index dc92771ebc65095dfebbddc238ee6d4fffd897bf..ae9120f7cc8989cf625ac101d053d825
 | 
			
		||||
         return;
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
@@ -211,7 +214,7 @@
 | 
			
		||||
@@ -216,7 +219,7 @@
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     get visible() {
 | 
			
		||||
@@ -39,7 +39,7 @@ index dc92771ebc65095dfebbddc238ee6d4fffd897bf..ae9120f7cc8989cf625ac101d053d825
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     get hidden() {
 | 
			
		||||
@@ -282,7 +285,7 @@
 | 
			
		||||
@@ -287,7 +290,7 @@
 | 
			
		||||
         return false;
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
@@ -48,7 +48,7 @@ index dc92771ebc65095dfebbddc238ee6d4fffd897bf..ae9120f7cc8989cf625ac101d053d825
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     get lastAccessed() {
 | 
			
		||||
@@ -454,6 +457,8 @@
 | 
			
		||||
@@ -459,6 +462,8 @@
 | 
			
		||||
         this.style.MozUserFocus = "ignore";
 | 
			
		||||
       } else if (
 | 
			
		||||
         event.target.classList.contains("tab-close-button") ||
 | 
			
		||||
@@ -57,7 +57,18 @@ index dc92771ebc65095dfebbddc238ee6d4fffd897bf..ae9120f7cc8989cf625ac101d053d825
 | 
			
		||||
         event.target.classList.contains("tab-icon-overlay") ||
 | 
			
		||||
         event.target.classList.contains("tab-audio-button")
 | 
			
		||||
       ) {
 | 
			
		||||
@@ -554,6 +559,7 @@
 | 
			
		||||
@@ -513,6 +518,10 @@
 | 
			
		||||
       this.style.MozUserFocus = "";
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
+    get glanceTab() {
 | 
			
		||||
+      return this.querySelector("tab[zen-glance-tab]");
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
     on_click(event) {
 | 
			
		||||
       if (event.button != 0) {
 | 
			
		||||
         return;
 | 
			
		||||
@@ -559,6 +568,7 @@
 | 
			
		||||
             telemetrySource: lazy.TabMetrics.METRIC_SOURCE.TAB_STRIP,
 | 
			
		||||
           });
 | 
			
		||||
         } else {
 | 
			
		||||
@@ -65,7 +76,7 @@ index dc92771ebc65095dfebbddc238ee6d4fffd897bf..ae9120f7cc8989cf625ac101d053d825
 | 
			
		||||
           gBrowser.removeTab(this, {
 | 
			
		||||
             animate: true,
 | 
			
		||||
             triggeringEvent: event,
 | 
			
		||||
@@ -564,6 +570,14 @@
 | 
			
		||||
@@ -569,6 +579,14 @@
 | 
			
		||||
         // (see tabbrowser-tabs 'click' handler).
 | 
			
		||||
         gBrowser.tabContainer._blockDblClick = true;
 | 
			
		||||
       }
 | 
			
		||||
@@ -80,7 +91,7 @@ index dc92771ebc65095dfebbddc238ee6d4fffd897bf..ae9120f7cc8989cf625ac101d053d825
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     on_dblclick(event) {
 | 
			
		||||
@@ -587,6 +601,8 @@
 | 
			
		||||
@@ -592,6 +610,8 @@
 | 
			
		||||
           animate: true,
 | 
			
		||||
           triggeringEvent: event,
 | 
			
		||||
         });
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,11 @@
 | 
			
		||||
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
 | 
			
		||||
index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c352b425006 100644
 | 
			
		||||
index d5aa64842a35c6697263c63fd3a0571b64b01344..14f5bc046f2e54109bd3fd0402a8f8b598a513c2 100644
 | 
			
		||||
--- a/browser/components/tabbrowser/content/tabbrowser.js
 | 
			
		||||
+++ b/browser/components/tabbrowser/content/tabbrowser.js
 | 
			
		||||
@@ -415,11 +415,58 @@
 | 
			
		||||
@@ -413,11 +413,41 @@
 | 
			
		||||
       return this.tabContainer.visibleTabs;
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
+    zenInsertTabAtIndex(...args) {
 | 
			
		||||
+      return this.#insertTabAtElementIndex(...args);
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
+    get _numVisiblePinTabsWithoutCollapsed() {
 | 
			
		||||
+      let i = 0;
 | 
			
		||||
+      for (let item of this.tabContainer.ariaFocusableItems) {
 | 
			
		||||
@@ -37,19 +33,6 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
+      }
 | 
			
		||||
+      return i;
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
+    get _numZenVisibleEssentials() {
 | 
			
		||||
+      let i = 0;
 | 
			
		||||
+      for (let tab of this.tabs) {
 | 
			
		||||
+        if (!tab.hasAttribute("zen-essential") && !tab.hasAttribute("zen-glance-tab")) {
 | 
			
		||||
+          break;
 | 
			
		||||
+        }
 | 
			
		||||
+        if (!tab.hidden) {
 | 
			
		||||
+          i += !tab.hasAttribute("zen-glance-tab");
 | 
			
		||||
+        }
 | 
			
		||||
+      }
 | 
			
		||||
+      return i;
 | 
			
		||||
+    }
 | 
			
		||||
+
 | 
			
		||||
     get pinnedTabCount() {
 | 
			
		||||
-      for (var i = 0; i < this.tabs.length; i++) {
 | 
			
		||||
@@ -63,15 +46,15 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
       }
 | 
			
		||||
       return i;
 | 
			
		||||
     }
 | 
			
		||||
@@ -571,6 +618,7 @@
 | 
			
		||||
@@ -569,6 +599,7 @@
 | 
			
		||||
       this.tabpanels.appendChild(panel);
 | 
			
		||||
 
 | 
			
		||||
       let tab = this.tabs[0];
 | 
			
		||||
+      ZenWorkspaces.handleInitialTab(tab, (!remoteType || remoteType === E10SUtils.PRIVILEGEDABOUT_REMOTE_TYPE) && !gZenUIManager.testingEnabled);
 | 
			
		||||
+      gZenWorkspaces.handleInitialTab(tab, (!remoteType || remoteType === E10SUtils.PRIVILEGEDABOUT_REMOTE_TYPE) && !gZenUIManager.testingEnabled);
 | 
			
		||||
       tab.linkedPanel = uniqueId;
 | 
			
		||||
       this._selectedTab = tab;
 | 
			
		||||
       this._selectedBrowser = browser;
 | 
			
		||||
@@ -836,11 +884,13 @@
 | 
			
		||||
@@ -834,11 +865,13 @@
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
       this.showTab(aTab);
 | 
			
		||||
@@ -81,14 +64,14 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
+      if (this.tabContainer.verticalMode && !handled) {
 | 
			
		||||
         this.#handleTabMove(aTab, () =>
 | 
			
		||||
-          this.verticalPinnedTabsContainer.appendChild(aTab)
 | 
			
		||||
+          aTab.hasAttribute("zen-essential") ? ZenWorkspaces.getEssentialsSection(aTab).appendChild(aTab) : this.verticalPinnedTabsContainer.insertBefore(aTab, this.verticalPinnedTabsContainer.lastChild)
 | 
			
		||||
+          aTab.hasAttribute("zen-essential") ? gZenWorkspaces.getEssentialsSection(aTab).appendChild(aTab) : this.verticalPinnedTabsContainer.insertBefore(aTab, this.verticalPinnedTabsContainer.lastChild)
 | 
			
		||||
         );
 | 
			
		||||
-      } else {
 | 
			
		||||
+      } else if (!handled) {
 | 
			
		||||
         this.moveTabTo(aTab, {
 | 
			
		||||
           tabIndex: this.pinnedTabCount,
 | 
			
		||||
           forceUngrouped: true,
 | 
			
		||||
@@ -857,12 +907,15 @@
 | 
			
		||||
@@ -855,12 +888,15 @@
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
       if (this.tabContainer.verticalMode) {
 | 
			
		||||
@@ -100,12 +83,12 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
           aTab.removeAttribute("pinned");
 | 
			
		||||
-          this.tabContainer.arrowScrollbox.prepend(aTab);
 | 
			
		||||
+          if (!handled) {
 | 
			
		||||
+            ZenWorkspaces.activeWorkspaceStrip.prepend(aTab);
 | 
			
		||||
+            gZenWorkspaces.activeWorkspaceStrip.prepend(aTab);
 | 
			
		||||
+          }
 | 
			
		||||
         });
 | 
			
		||||
       } else {
 | 
			
		||||
         this.moveTabTo(aTab, {
 | 
			
		||||
@@ -1046,6 +1099,8 @@
 | 
			
		||||
@@ -1044,6 +1080,8 @@
 | 
			
		||||
 
 | 
			
		||||
       let LOCAL_PROTOCOLS = ["chrome:", "about:", "resource:", "data:"];
 | 
			
		||||
 
 | 
			
		||||
@@ -114,7 +97,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
       if (
 | 
			
		||||
         aIconURL &&
 | 
			
		||||
         !aLoadingPrincipal &&
 | 
			
		||||
@@ -1056,6 +1111,9 @@
 | 
			
		||||
@@ -1054,6 +1092,9 @@
 | 
			
		||||
         );
 | 
			
		||||
         return;
 | 
			
		||||
       }
 | 
			
		||||
@@ -124,7 +107,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
 
 | 
			
		||||
       let browser = this.getBrowserForTab(aTab);
 | 
			
		||||
       browser.mIconURL = aIconURL;
 | 
			
		||||
@@ -1305,6 +1363,7 @@
 | 
			
		||||
@@ -1303,6 +1344,7 @@
 | 
			
		||||
       if (!this._previewMode) {
 | 
			
		||||
         newTab.recordTimeFromUnloadToReload();
 | 
			
		||||
         newTab.updateLastAccessed();
 | 
			
		||||
@@ -132,7 +115,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
         oldTab.updateLastAccessed();
 | 
			
		||||
         // if this is the foreground window, update the last-seen timestamps.
 | 
			
		||||
         if (this.ownerGlobal == BrowserWindowTracker.getTopWindow()) {
 | 
			
		||||
@@ -1457,6 +1516,9 @@
 | 
			
		||||
@@ -1455,6 +1497,9 @@
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
       let activeEl = document.activeElement;
 | 
			
		||||
@@ -142,7 +125,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
       // If focus is on the old tab, move it to the new tab.
 | 
			
		||||
       if (activeEl == oldTab) {
 | 
			
		||||
         newTab.focus();
 | 
			
		||||
@@ -1780,7 +1842,8 @@
 | 
			
		||||
@@ -1778,7 +1823,8 @@
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     _setTabLabel(aTab, aLabel, { beforeTabOpen, isContentTitle, isURL } = {}) {
 | 
			
		||||
@@ -152,7 +135,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
         return false;
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
@@ -1888,7 +1951,7 @@
 | 
			
		||||
@@ -1886,7 +1932,7 @@
 | 
			
		||||
         newIndex = this.selectedTab._tPos + 1;
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
@@ -161,7 +144,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
         if (this.isTabGroupLabel(targetTab)) {
 | 
			
		||||
           throw new Error(
 | 
			
		||||
             "Replacing a tab group label with a tab is not supported"
 | 
			
		||||
@@ -2152,6 +2215,7 @@
 | 
			
		||||
@@ -2150,6 +2196,7 @@
 | 
			
		||||
       uriIsAboutBlank,
 | 
			
		||||
       userContextId,
 | 
			
		||||
       skipLoad,
 | 
			
		||||
@@ -169,7 +152,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
     } = {}) {
 | 
			
		||||
       let b = document.createXULElement("browser");
 | 
			
		||||
       // Use the JSM global to create the permanentKey, so that if the
 | 
			
		||||
@@ -2225,8 +2289,7 @@
 | 
			
		||||
@@ -2223,8 +2270,7 @@
 | 
			
		||||
         // we use a different attribute name for this?
 | 
			
		||||
         b.setAttribute("name", name);
 | 
			
		||||
       }
 | 
			
		||||
@@ -179,7 +162,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
         b.setAttribute("transparent", "true");
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
@@ -2391,7 +2454,7 @@
 | 
			
		||||
@@ -2389,7 +2435,7 @@
 | 
			
		||||
 
 | 
			
		||||
       let panel = this.getPanel(browser);
 | 
			
		||||
       let uniqueId = this._generateUniquePanelID();
 | 
			
		||||
@@ -188,7 +171,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
       aTab.linkedPanel = uniqueId;
 | 
			
		||||
 
 | 
			
		||||
       // Inject the <browser> into the DOM if necessary.
 | 
			
		||||
@@ -2450,8 +2513,8 @@
 | 
			
		||||
@@ -2448,8 +2494,8 @@
 | 
			
		||||
       // If we transitioned from one browser to two browsers, we need to set
 | 
			
		||||
       // hasSiblings=false on both the existing browser and the new browser.
 | 
			
		||||
       if (this.tabs.length == 2) {
 | 
			
		||||
@@ -199,7 +182,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
       } else {
 | 
			
		||||
         aTab.linkedBrowser.browsingContext.hasSiblings = this.tabs.length > 1;
 | 
			
		||||
       }
 | 
			
		||||
@@ -2679,6 +2742,7 @@
 | 
			
		||||
@@ -2680,6 +2726,7 @@
 | 
			
		||||
         schemelessInput,
 | 
			
		||||
         hasValidUserGestureActivation = false,
 | 
			
		||||
         textDirectiveUserActivation = false,
 | 
			
		||||
@@ -207,20 +190,20 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
       } = {}
 | 
			
		||||
     ) {
 | 
			
		||||
       // all callers of addTab that pass a params object need to pass
 | 
			
		||||
@@ -2689,6 +2753,12 @@
 | 
			
		||||
@@ -2690,6 +2737,12 @@
 | 
			
		||||
         );
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
+      let hasZenDefaultUserContextId = false;
 | 
			
		||||
+      let zenForcedWorkspaceId = undefined;
 | 
			
		||||
+      if (typeof ZenWorkspaces !== "undefined" && !_forZenEmptyTab) {
 | 
			
		||||
+        [userContextId, hasZenDefaultUserContextId, zenForcedWorkspaceId] = ZenWorkspaces.getContextIdIfNeeded(userContextId, fromExternal, allowInheritPrincipal);
 | 
			
		||||
+      if (typeof gZenWorkspaces !== "undefined" && !_forZenEmptyTab) {
 | 
			
		||||
+        [userContextId, hasZenDefaultUserContextId, zenForcedWorkspaceId] = gZenWorkspaces.getContextIdIfNeeded(userContextId, fromExternal, allowInheritPrincipal);
 | 
			
		||||
+      }
 | 
			
		||||
+
 | 
			
		||||
       if (!UserInteraction.running("browser.tabs.opening", window)) {
 | 
			
		||||
         UserInteraction.start("browser.tabs.opening", "initting", window);
 | 
			
		||||
       }
 | 
			
		||||
@@ -2752,6 +2822,16 @@
 | 
			
		||||
@@ -2753,6 +2806,16 @@
 | 
			
		||||
           noInitialLabel,
 | 
			
		||||
           skipBackgroundNotify,
 | 
			
		||||
         });
 | 
			
		||||
@@ -235,9 +218,9 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
+          t.setAttribute("zen-empty-tab", "true");
 | 
			
		||||
+        }
 | 
			
		||||
         if (insertTab) {
 | 
			
		||||
           if (typeof index == "number") {
 | 
			
		||||
             elementIndex = this.#tabIndexToElementIndex(index);
 | 
			
		||||
@@ -2779,6 +2859,7 @@
 | 
			
		||||
           // Insert the tab into the tab container in the correct position.
 | 
			
		||||
           // For now, we support `index` as an alias for `tabIndex`.
 | 
			
		||||
@@ -2783,6 +2846,7 @@
 | 
			
		||||
           openWindowInfo,
 | 
			
		||||
           skipLoad,
 | 
			
		||||
           triggeringRemoteType,
 | 
			
		||||
@@ -245,45 +228,35 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
         }));
 | 
			
		||||
 
 | 
			
		||||
         if (focusUrlBar) {
 | 
			
		||||
@@ -2898,6 +2979,9 @@
 | 
			
		||||
@@ -2902,6 +2966,12 @@
 | 
			
		||||
         }
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
+      if (typeof window.gZenVerticalTabsManager !== "undefined") {
 | 
			
		||||
+        gZenVerticalTabsManager.animateTab(t);
 | 
			
		||||
+      }
 | 
			
		||||
+      if (typeof window.gZenCompactModeManager !== "undefined" && !skipLoad && insertTab) {
 | 
			
		||||
+        gZenCompactModeManager._onTabOpen(t, inBackground);
 | 
			
		||||
+      }
 | 
			
		||||
       // Additionally send pinned tab events
 | 
			
		||||
       if (pinned) {
 | 
			
		||||
         this._notifyPinnedStatus(t);
 | 
			
		||||
@@ -2945,12 +3029,15 @@
 | 
			
		||||
      * @param {string} [label=]
 | 
			
		||||
      * @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,6 +3080,7 @@
 | 
			
		||||
         insertBefore = null,
 | 
			
		||||
@@ -2990,10 +3060,10 @@
 | 
			
		||||
         isAdoptingGroup = false,
 | 
			
		||||
         isUserTriggered = false,
 | 
			
		||||
         telemetryUserCreateSource = "unknown",
 | 
			
		||||
+        forSplitView = false,
 | 
			
		||||
       } = {}
 | 
			
		||||
     ) {
 | 
			
		||||
       if (!tabs?.length) {
 | 
			
		||||
@@ -3011,7 +3099,12 @@
 | 
			
		||||
         id = `${Date.now()}-${Math.round(Math.random() * 100)}`;
 | 
			
		||||
-        throw new Error("Cannot create tab group with zero tabs");
 | 
			
		||||
       }
 | 
			
		||||
       let group = this._createTabGroup(id, color, false, label);
 | 
			
		||||
 
 | 
			
		||||
       if (!color) {
 | 
			
		||||
@@ -3014,7 +3084,12 @@
 | 
			
		||||
         label,
 | 
			
		||||
         isAdoptingGroup
 | 
			
		||||
       );
 | 
			
		||||
-      this.tabContainer.insertBefore(
 | 
			
		||||
+      if (forSplitView) {
 | 
			
		||||
+        group.setAttribute('split-view-group', true);
 | 
			
		||||
@@ -294,7 +267,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
         group,
 | 
			
		||||
         insertBefore?.group ?? insertBefore
 | 
			
		||||
       );
 | 
			
		||||
@@ -3342,6 +3435,7 @@
 | 
			
		||||
@@ -3303,6 +3378,7 @@
 | 
			
		||||
         openWindowInfo,
 | 
			
		||||
         skipLoad,
 | 
			
		||||
         triggeringRemoteType,
 | 
			
		||||
@@ -302,7 +275,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
       }
 | 
			
		||||
     ) {
 | 
			
		||||
       // If we don't have a preferred remote type (or it is `NOT_REMOTE`), and
 | 
			
		||||
@@ -3411,6 +3505,7 @@
 | 
			
		||||
@@ -3372,6 +3448,7 @@
 | 
			
		||||
           openWindowInfo,
 | 
			
		||||
           name,
 | 
			
		||||
           skipLoad,
 | 
			
		||||
@@ -310,64 +283,26 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
         });
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
@@ -3589,6 +3684,27 @@
 | 
			
		||||
         ) {
 | 
			
		||||
           tabWasReused = true;
 | 
			
		||||
           tab = this.selectedTab;
 | 
			
		||||
+          if (tabData.zenWorkspace) {
 | 
			
		||||
+            tab.setAttribute("zen-workspace-id", tabData.zenWorkspace);
 | 
			
		||||
+          }
 | 
			
		||||
+          if (tabData.zenIsEmpty) {
 | 
			
		||||
+            tab.setAttribute("zen-empty-tab", "true");
 | 
			
		||||
+          }
 | 
			
		||||
+          if (tabData.zenHasStaticLabel) {
 | 
			
		||||
+            tab.setAttribute("zen-has-static-label", "true");
 | 
			
		||||
+          }
 | 
			
		||||
+          if (tabData.zenPinnedId) {
 | 
			
		||||
+            tab.setAttribute("zen-pin-id", tabData.zenPinnedId);
 | 
			
		||||
+          }
 | 
			
		||||
+          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 (!tabData.pinned) {
 | 
			
		||||
             this.unpinTab(tab);
 | 
			
		||||
           } else {
 | 
			
		||||
@@ -3637,7 +3753,27 @@
 | 
			
		||||
@@ -3560,7 +3637,7 @@
 | 
			
		||||
         // Add a new tab if needed.
 | 
			
		||||
         if (!tab) {
 | 
			
		||||
           let createLazyBrowser =
 | 
			
		||||
-            restoreTabsLazily && !select && !tabData.pinned;
 | 
			
		||||
+            restoreTabsLazily && !tabData.pinned;
 | 
			
		||||
 
 | 
			
		||||
           let url = "about:blank";
 | 
			
		||||
           if (tabData.entries?.length) {
 | 
			
		||||
@@ -3598,7 +3675,8 @@
 | 
			
		||||
             skipLoad: true,
 | 
			
		||||
             preferredRemoteType,
 | 
			
		||||
           });
 | 
			
		||||
-
 | 
			
		||||
+          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);
 | 
			
		||||
+          }
 | 
			
		||||
+          tab._originalUrl = url;
 | 
			
		||||
+          gZenSessionStore.restoreInitialTabData(tab, tabData);
 | 
			
		||||
           if (select) {
 | 
			
		||||
             tabToSelect = tab;
 | 
			
		||||
           }
 | 
			
		||||
@@ -3661,7 +3797,8 @@
 | 
			
		||||
@@ -3622,7 +3700,8 @@
 | 
			
		||||
             // needs calling:
 | 
			
		||||
             shouldUpdateForPinnedTabs = true;
 | 
			
		||||
           }
 | 
			
		||||
@@ -377,7 +312,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
           let { groupId } = tabData;
 | 
			
		||||
           const tabGroup = tabGroupWorkingData.get(groupId);
 | 
			
		||||
           // if a tab refers to a tab group we don't know, skip any group
 | 
			
		||||
@@ -3675,7 +3812,10 @@
 | 
			
		||||
@@ -3636,7 +3715,10 @@
 | 
			
		||||
                 tabGroup.stateData.id,
 | 
			
		||||
                 tabGroup.stateData.color,
 | 
			
		||||
                 tabGroup.stateData.collapsed,
 | 
			
		||||
@@ -389,47 +324,64 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
               );
 | 
			
		||||
               tabsFragment.appendChild(tabGroup.node);
 | 
			
		||||
             }
 | 
			
		||||
@@ -3723,8 +3863,15 @@
 | 
			
		||||
@@ -3684,8 +3766,16 @@
 | 
			
		||||
       // to remove the old selected tab.
 | 
			
		||||
       if (tabToSelect) {
 | 
			
		||||
         let leftoverTab = this.selectedTab;
 | 
			
		||||
+        if (tabToSelect.pinned) {
 | 
			
		||||
+        ZenWorkspaces._tabToRemoveForEmpty = leftoverTab;
 | 
			
		||||
+        } else {
 | 
			
		||||
         this.selectedTab = tabToSelect;
 | 
			
		||||
         this.removeTab(leftoverTab);
 | 
			
		||||
-        this.selectedTab = tabToSelect;
 | 
			
		||||
-        this.removeTab(leftoverTab);
 | 
			
		||||
+        gZenWorkspaces._tabToRemoveForEmpty = leftoverTab;
 | 
			
		||||
+        if (Services.prefs.getBoolPref("zen.workspaces.continue-where-left-off")) {
 | 
			
		||||
+          gZenWorkspaces._tabToSelect = selectTab - 1;
 | 
			
		||||
+        }
 | 
			
		||||
+        if (gZenWorkspaces._initialTab && !gZenVerticalTabsManager._canReplaceNewTab) {
 | 
			
		||||
+          gZenWorkspaces._initialTab._shouldRemove = true;
 | 
			
		||||
+        }
 | 
			
		||||
+      }
 | 
			
		||||
+      else {
 | 
			
		||||
+        this.selectedTab._possiblyEmpty = this.selectedTab.isEmpty; // Not needed, but just in case.
 | 
			
		||||
+        gZenWorkspaces._tabToRemoveForEmpty = this.selectedTab;
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
       if (tabs.length > 1 || !tabs[0].selected) {
 | 
			
		||||
@@ -3912,7 +4059,7 @@
 | 
			
		||||
@@ -3881,7 +3971,7 @@
 | 
			
		||||
       // 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.
 | 
			
		||||
-        index = Infinity;
 | 
			
		||||
+        index = Services.prefs.getBoolPref("zen.view.show-newtab-button-top") ? this.pinnedTabCount : Infinity;
 | 
			
		||||
-        elementIndex = Infinity;
 | 
			
		||||
+        elementIndex = Services.prefs.getBoolPref("zen.view.show-newtab-button-top") ? this._numVisiblePinTabsWithoutCollapsed : Infinity;
 | 
			
		||||
         if (
 | 
			
		||||
           !bulkOrderedOpen &&
 | 
			
		||||
           ((openerTab &&
 | 
			
		||||
@@ -3958,18 +4105,18 @@
 | 
			
		||||
 
 | 
			
		||||
@@ -3904,7 +3994,7 @@
 | 
			
		||||
           ) {
 | 
			
		||||
             elementIndex = Infinity;
 | 
			
		||||
           } else if (previousTab.visible) {
 | 
			
		||||
-            elementIndex = previousTab.elementIndex + 1;
 | 
			
		||||
+            elementIndex = (typeof previousTab.elementIndex === 'undefined') ? index : (previousTab.elementIndex + 1);
 | 
			
		||||
           } else if (previousTab == FirefoxViewHandler.tab) {
 | 
			
		||||
             elementIndex = 0;
 | 
			
		||||
           }
 | 
			
		||||
@@ -3932,14 +4022,14 @@
 | 
			
		||||
       }
 | 
			
		||||
       // Ensure index is within bounds.
 | 
			
		||||
       if (tab.pinned) {
 | 
			
		||||
-        index = Math.max(index, 0);
 | 
			
		||||
-        index = Math.min(index, this.pinnedTabCount);
 | 
			
		||||
+        index = Math.max(index, tab.hasAttribute("zen-essential") ? 0 : this._numZenEssentials);
 | 
			
		||||
+        index = Math.min(index, tab.hasAttribute("zen-essential") ? this._numZenEssentials : this.pinnedTabCount);
 | 
			
		||||
+        index = Math.min(index, tab.hasAttribute("zen-essential") ? this._numZenEssentials : this._numVisiblePinTabsWithoutCollapsed);
 | 
			
		||||
       } else {
 | 
			
		||||
         index = Math.max(index, this.pinnedTabCount);
 | 
			
		||||
         index = Math.min(index, this.tabContainer.ariaFocusableItems.length);
 | 
			
		||||
-        index = Math.max(index, this.pinnedTabCount);
 | 
			
		||||
+        index = Math.max(index, this._numVisiblePinTabsWithoutCollapsed);
 | 
			
		||||
         index = Math.min(index, allItems.length);
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
       /** @type {MozTabbrowserTab|undefined} */
 | 
			
		||||
-      let itemAfter = this.tabContainer.ariaFocusableItems.at(index);
 | 
			
		||||
+      let itemAfter = this.tabContainer.ariaFocusableItems.filter(tab => !tab.hasAttribute("zen-glance-tab")).at(index);
 | 
			
		||||
-      let itemAfter = allItems.at(index);
 | 
			
		||||
+      let itemAfter = gZenGlanceManager.getTabOrGlanceParent(allItems.at(index));
 | 
			
		||||
 
 | 
			
		||||
       // Prevent a flash of unstyled content by setting up the tab content
 | 
			
		||||
       // and inherited attributes before appending it (see Bug 1592054):
 | 
			
		||||
@@ -3947,7 +4037,7 @@
 | 
			
		||||
 
 | 
			
		||||
       this.tabContainer._invalidateCachedTabs();
 | 
			
		||||
 
 | 
			
		||||
-      if (tabGroup) {
 | 
			
		||||
@@ -437,7 +389,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
         if (this.isTab(itemAfter) && itemAfter.group == tabGroup) {
 | 
			
		||||
           // Place at the front of, or between tabs in, the same tab group
 | 
			
		||||
           this.tabContainer.insertBefore(tab, itemAfter);
 | 
			
		||||
@@ -4290,6 +4437,9 @@
 | 
			
		||||
@@ -4268,6 +4358,9 @@
 | 
			
		||||
         return;
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
@@ -447,7 +399,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
       this.removeTabs(selectedTabs, { telemetrySource });
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
@@ -4542,6 +4692,7 @@
 | 
			
		||||
@@ -4520,6 +4613,7 @@
 | 
			
		||||
         telemetrySource,
 | 
			
		||||
       } = {}
 | 
			
		||||
     ) {
 | 
			
		||||
@@ -455,7 +407,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
       // When 'closeWindowWithLastTab' pref is enabled, closing all tabs
 | 
			
		||||
       // can be considered equivalent to closing the window.
 | 
			
		||||
       if (
 | 
			
		||||
@@ -4626,6 +4777,7 @@
 | 
			
		||||
@@ -4604,6 +4698,7 @@
 | 
			
		||||
         if (lastToClose) {
 | 
			
		||||
           this.removeTab(lastToClose, aParams);
 | 
			
		||||
         }
 | 
			
		||||
@@ -463,20 +415,12 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
       } catch (e) {
 | 
			
		||||
         console.error(e);
 | 
			
		||||
       }
 | 
			
		||||
@@ -4650,6 +4802,7 @@
 | 
			
		||||
         telemetrySource,
 | 
			
		||||
       } = {}
 | 
			
		||||
     ) {
 | 
			
		||||
+      gZenUIManager.saveScrollbarState();
 | 
			
		||||
       if (UserInteraction.running("browser.tabs.opening", window)) {
 | 
			
		||||
         UserInteraction.finish("browser.tabs.opening", window);
 | 
			
		||||
       }
 | 
			
		||||
@@ -4663,6 +4816,12 @@
 | 
			
		||||
@@ -4641,6 +4736,12 @@
 | 
			
		||||
         aTab._closeTimeNoAnimTimerId = Glean.browserTabclose.timeNoAnim.start();
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
+      if (ZenWorkspaces.workspaceEnabled) {
 | 
			
		||||
+        let newTab = ZenWorkspaces.handleTabBeforeClose(aTab);
 | 
			
		||||
+      if (gZenWorkspaces.workspaceEnabled) {
 | 
			
		||||
+        let newTab = gZenWorkspaces.handleTabBeforeClose(aTab, closeWindowWithLastTab);
 | 
			
		||||
+        if (newTab) {
 | 
			
		||||
+          this.selectedTab = newTab;
 | 
			
		||||
+        }
 | 
			
		||||
@@ -484,7 +428,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
       // Handle requests for synchronously removing an already
 | 
			
		||||
       // asynchronously closing tab.
 | 
			
		||||
       if (!animate && aTab.closing) {
 | 
			
		||||
@@ -4677,7 +4836,9 @@
 | 
			
		||||
@@ -4655,7 +4756,9 @@
 | 
			
		||||
       // frame created for it (for example, by updating the visually selected
 | 
			
		||||
       // state).
 | 
			
		||||
       let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width;
 | 
			
		||||
@@ -495,97 +439,86 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
       if (
 | 
			
		||||
         !this._beginRemoveTab(aTab, {
 | 
			
		||||
           closeWindowFastpath: true,
 | 
			
		||||
@@ -4840,7 +5001,7 @@
 | 
			
		||||
@@ -4821,7 +4924,7 @@
 | 
			
		||||
           closeWindowWithLastTab != null
 | 
			
		||||
             ? closeWindowWithLastTab
 | 
			
		||||
             : !window.toolbar.visible ||
 | 
			
		||||
-              Services.prefs.getBoolPref("browser.tabs.closeWindowWithLastTab");
 | 
			
		||||
+            Services.prefs.getBoolPref("browser.tabs.closeWindowWithLastTab") && !ZenWorkspaces._isClosingWindow && !ZenWorkspaces._removedByStartupPage;
 | 
			
		||||
+            Services.prefs.getBoolPref("browser.tabs.closeWindowWithLastTab") && !gZenWorkspaces._isClosingWindow && !gZenWorkspaces._removedByStartupPage;
 | 
			
		||||
 
 | 
			
		||||
         if (closeWindow) {
 | 
			
		||||
           // We've already called beforeunload on all the relevant tabs if we get here,
 | 
			
		||||
@@ -4864,6 +5025,7 @@
 | 
			
		||||
@@ -4845,6 +4948,7 @@
 | 
			
		||||
 
 | 
			
		||||
         newTab = true;
 | 
			
		||||
       }
 | 
			
		||||
+      ZenWorkspaces._removedByStartupPage = false;
 | 
			
		||||
+      gZenWorkspaces._removedByStartupPage = false;
 | 
			
		||||
       aTab._endRemoveArgs = [closeWindow, newTab];
 | 
			
		||||
 
 | 
			
		||||
       // swapBrowsersAndCloseOther will take care of closing the window without animation.
 | 
			
		||||
@@ -4903,9 +5065,7 @@
 | 
			
		||||
@@ -4885,9 +4989,7 @@
 | 
			
		||||
       aTab._mouseleave();
 | 
			
		||||
 
 | 
			
		||||
       if (newTab) {
 | 
			
		||||
-        this.addTrustedTab(BROWSER_NEW_TAB_URL, {
 | 
			
		||||
-          skipAnimation: true,
 | 
			
		||||
-        });
 | 
			
		||||
+        ZenWorkspaces.selectEmptyTab(BROWSER_NEW_TAB_URL);
 | 
			
		||||
+        gZenWorkspaces.selectEmptyTab(BROWSER_NEW_TAB_URL);
 | 
			
		||||
       } else {
 | 
			
		||||
         TabBarVisibility.update();
 | 
			
		||||
       }
 | 
			
		||||
@@ -5034,6 +5194,8 @@
 | 
			
		||||
@@ -5016,6 +5118,8 @@
 | 
			
		||||
         this.tabs[i]._tPos = i;
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
+      ZenWorkspaces.updateTabsContainers();
 | 
			
		||||
+      gZenWorkspaces.updateTabsContainers();
 | 
			
		||||
+
 | 
			
		||||
       if (!this._windowIsClosing) {
 | 
			
		||||
         if (wasPinned) {
 | 
			
		||||
           this.tabContainer._positionPinnedTabs();
 | 
			
		||||
@@ -5159,8 +5321,8 @@
 | 
			
		||||
       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 +5410,7 @@
 | 
			
		||||
@@ -5230,6 +5334,7 @@
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
       let excludeTabs = new Set(aExcludeTabs);
 | 
			
		||||
+      ZenWorkspaces.getTabsToExclude(aTab).forEach(tab => excludeTabs.add(tab));
 | 
			
		||||
+      gZenWorkspaces.getTabsToExclude(aTab).forEach(tab => excludeTabs.add(tab));
 | 
			
		||||
 
 | 
			
		||||
       // If this tab has a successor, it should be selectable, since
 | 
			
		||||
       // hiding or closing a tab removes that tab as a successor.
 | 
			
		||||
@@ -5260,13 +5423,13 @@
 | 
			
		||||
@@ -5242,13 +5347,13 @@
 | 
			
		||||
         !excludeTabs.has(aTab.owner) &&
 | 
			
		||||
         Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose")
 | 
			
		||||
       ) {
 | 
			
		||||
-        return aTab.owner;
 | 
			
		||||
+        return ZenWorkspaces.findTabToBlur(aTab.owner);
 | 
			
		||||
+        return gZenWorkspaces.findTabToBlur(aTab.owner);
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
       // Try to find a remaining tab that comes after the given tab
 | 
			
		||||
       let remainingTabs = Array.prototype.filter.call(
 | 
			
		||||
         this.visibleTabs,
 | 
			
		||||
-        tab => !excludeTabs.has(tab)
 | 
			
		||||
+        tab => !excludeTabs.has(tab) && ZenWorkspaces._shouldChangeToTab(tab)
 | 
			
		||||
+        tab => !excludeTabs.has(tab) && gZenWorkspaces._shouldChangeToTab(tab)
 | 
			
		||||
       );
 | 
			
		||||
 
 | 
			
		||||
       let tab = this.tabContainer.findNextTab(aTab, {
 | 
			
		||||
@@ -5282,7 +5445,7 @@
 | 
			
		||||
@@ -5264,7 +5369,7 @@
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
       if (tab) {
 | 
			
		||||
-        return tab;
 | 
			
		||||
+        return ZenWorkspaces.findTabToBlur(tab);
 | 
			
		||||
+        return gZenWorkspaces.findTabToBlur(tab);
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
       // If no qualifying visible tab was found, see if there is a tab in
 | 
			
		||||
@@ -5303,7 +5466,7 @@
 | 
			
		||||
@@ -5285,7 +5390,7 @@
 | 
			
		||||
         });
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
-      return tab;
 | 
			
		||||
+      return ZenWorkspaces.findTabToBlur(tab);
 | 
			
		||||
+      return gZenWorkspaces.findTabToBlur(tab);
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     _blurTab(aTab) {
 | 
			
		||||
@@ -5704,10 +5867,10 @@
 | 
			
		||||
@@ -5686,10 +5791,10 @@
 | 
			
		||||
       SessionStore.deleteCustomTabValue(aTab, "hiddenBy");
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
@@ -598,21 +531,22 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
         aTab.selected ||
 | 
			
		||||
         aTab.closing ||
 | 
			
		||||
         // Tabs that are sharing the screen, microphone or camera cannot be hidden.
 | 
			
		||||
@@ -6001,7 +6164,7 @@
 | 
			
		||||
@@ -5986,7 +6091,7 @@
 | 
			
		||||
 
 | 
			
		||||
       // Don't allow mixing pinned and unpinned tabs.
 | 
			
		||||
       if (this.isTab(element) && element.pinned) {
 | 
			
		||||
-        tabIndex = Math.min(tabIndex, this.pinnedTabCount - 1);
 | 
			
		||||
+        tabIndex = element.hasAttribute('zen-essential') ? Math.min(tabIndex, this._numZenEssentials - 1) : Math.min(tabIndex, this.pinnedTabCount - 1);
 | 
			
		||||
+        tabIndex = element.hasAttribute('zen-essential') ? Math.min(tabIndex, this._numZenEssentials - 1) : Math.min(Math.max(tabIndex, this._numZenEssentials), this.pinnedTabCount - 1);
 | 
			
		||||
       } else {
 | 
			
		||||
         tabIndex = Math.max(tabIndex, this.pinnedTabCount);
 | 
			
		||||
       }
 | 
			
		||||
@@ -6028,9 +6191,16 @@
 | 
			
		||||
@@ -6012,10 +6117,16 @@
 | 
			
		||||
       this.#handleTabMove(
 | 
			
		||||
         element,
 | 
			
		||||
         () => {
 | 
			
		||||
           let neighbor = this.tabs[tabIndex];
 | 
			
		||||
-          if (forceUngrouped && neighbor.group) {
 | 
			
		||||
+          const _tPos = element._tPos;
 | 
			
		||||
-          let neighbor = this.tabs[tabIndex];
 | 
			
		||||
-          if (forceUngrouped && neighbor?.group) {
 | 
			
		||||
+          let neighbor = gZenGlanceManager.getTabOrGlanceParent(this.tabs[tabIndex]);
 | 
			
		||||
+          if ((forceUngrouped && neighbor?.group) || neighbor?.group?.hasAttribute("split-view-group")) {
 | 
			
		||||
             neighbor = neighbor.group;
 | 
			
		||||
           }
 | 
			
		||||
@@ -625,7 +559,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
           if (neighbor && this.isTab(element) && tabIndex > element._tPos) {
 | 
			
		||||
             neighbor.after(element);
 | 
			
		||||
           } else {
 | 
			
		||||
@@ -6099,7 +6269,9 @@
 | 
			
		||||
@@ -6084,17 +6195,29 @@
 | 
			
		||||
           targetElement = targetElement.group;
 | 
			
		||||
         }
 | 
			
		||||
       }
 | 
			
		||||
@@ -634,23 +568,32 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
+        element = element.group;
 | 
			
		||||
+      }
 | 
			
		||||
       // Don't allow mixing pinned and unpinned tabs.
 | 
			
		||||
       if (element.pinned && !targetElement?.pinned) {
 | 
			
		||||
         targetElement = this.tabs[this.pinnedTabCount - 1];
 | 
			
		||||
@@ -6109,7 +6281,13 @@
 | 
			
		||||
-      if (element.pinned && !targetElement?.pinned) {
 | 
			
		||||
-        targetElement = this.tabs[this.pinnedTabCount - 1];
 | 
			
		||||
+      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;
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
+      if (targetElement?.group?.hasAttribute("split-view-group")) {
 | 
			
		||||
+        targetElement = targetElement.group;
 | 
			
		||||
+      }
 | 
			
		||||
+      targetElement = gZenGlanceManager.getTabOrGlanceParent(targetElement);
 | 
			
		||||
       let getContainer = () => {
 | 
			
		||||
+        if (element.hasAttribute("zen-essential")) {
 | 
			
		||||
+          return ZenWorkspaces.getEssentialsSection(element);
 | 
			
		||||
+          return gZenWorkspaces.getEssentialsSection(element);
 | 
			
		||||
+        }
 | 
			
		||||
         if (element.pinned && this.tabContainer.verticalMode) {
 | 
			
		||||
           return this.tabContainer.verticalPinnedTabsContainer;
 | 
			
		||||
         }
 | 
			
		||||
@@ -6169,7 +6347,7 @@
 | 
			
		||||
@@ -6154,7 +6277,7 @@
 | 
			
		||||
       if (!this.isTab(aTab)) {
 | 
			
		||||
         throw new Error("Can only move a tab into a tab group");
 | 
			
		||||
       }
 | 
			
		||||
@@ -659,27 +602,27 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
         return;
 | 
			
		||||
       }
 | 
			
		||||
       if (aTab.group && aTab.group.id === aGroup.id) {
 | 
			
		||||
@@ -6263,6 +6441,10 @@
 | 
			
		||||
@@ -6248,6 +6371,10 @@
 | 
			
		||||
 
 | 
			
		||||
       moveActionCallback();
 | 
			
		||||
 
 | 
			
		||||
+      ZenWorkspaces._makeSureEmptyTabIsLast();
 | 
			
		||||
+      gZenWorkspaces._makeSureEmptyTabIsLast();
 | 
			
		||||
+      gZenViewSplitter._maybeRemoveFakeBrowser(false);
 | 
			
		||||
+      gZenViewSplitter._canDrop = false;
 | 
			
		||||
+
 | 
			
		||||
       // Clear tabs cache after moving nodes because the order of tabs may have
 | 
			
		||||
       // changed.
 | 
			
		||||
       this.tabContainer._invalidateCachedTabs();
 | 
			
		||||
@@ -7080,7 +7262,7 @@
 | 
			
		||||
@@ -7145,7 +7272,7 @@
 | 
			
		||||
             // preventDefault(). It will still raise the window if appropriate.
 | 
			
		||||
             break;
 | 
			
		||||
           }
 | 
			
		||||
-          this.selectedTab = tab;
 | 
			
		||||
+          ZenWorkspaces.switchTabIfNeeded(tab);
 | 
			
		||||
+          gZenWorkspaces.switchTabIfNeeded(tab);
 | 
			
		||||
           window.focus();
 | 
			
		||||
           aEvent.preventDefault();
 | 
			
		||||
           break;
 | 
			
		||||
@@ -7981,6 +8163,7 @@
 | 
			
		||||
@@ -8044,6 +8171,7 @@
 | 
			
		||||
             aWebProgress.isTopLevel
 | 
			
		||||
           ) {
 | 
			
		||||
             this.mTab.setAttribute("busy", "true");
 | 
			
		||||
@@ -687,7 +630,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
             gBrowser._tabAttrModified(this.mTab, ["busy"]);
 | 
			
		||||
             this.mTab._notselectedsinceload = !this.mTab.selected;
 | 
			
		||||
           }
 | 
			
		||||
@@ -8954,7 +9137,7 @@ var TabContextMenu = {
 | 
			
		||||
@@ -9009,7 +9137,7 @@ var TabContextMenu = {
 | 
			
		||||
     );
 | 
			
		||||
     contextUnpinSelectedTabs.hidden =
 | 
			
		||||
       !this.contextTab.pinned || !this.multiselected;
 | 
			
		||||
@@ -696,7 +639,7 @@ index 6dece2b9d0462d90a28e75350ce983d87816ef73..4cc07f008d99138a76c8e9813c857c35
 | 
			
		||||
     // Move Tab items
 | 
			
		||||
     let contextMoveTabOptions = document.getElementById(
 | 
			
		||||
       "context_moveTabOptions"
 | 
			
		||||
@@ -9223,6 +9406,7 @@ var TabContextMenu = {
 | 
			
		||||
@@ -9278,6 +9406,7 @@ var TabContextMenu = {
 | 
			
		||||
         telemetrySource: gBrowser.TabMetrics.METRIC_SOURCE.TAB_STRIP,
 | 
			
		||||
       });
 | 
			
		||||
     } 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
 | 
			
		||||
index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f86275ada 100644
 | 
			
		||||
index 84d633471c89230b981d8a07babef4e0c76c0338..de8b1ecf7cb844f6cf3e66a41b6024c574dfc103 100644
 | 
			
		||||
--- a/browser/components/tabbrowser/content/tabs.js
 | 
			
		||||
+++ b/browser/components/tabbrowser/content/tabs.js
 | 
			
		||||
@@ -83,7 +83,7 @@
 | 
			
		||||
@@ -11,33 +11,33 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
         }
 | 
			
		||||
         return true;
 | 
			
		||||
       };
 | 
			
		||||
@@ -342,7 +342,7 @@
 | 
			
		||||
@@ -293,6 +293,7 @@
 | 
			
		||||
     on_TabGroupCollapse(event) {
 | 
			
		||||
       this._invalidateCachedVisibleTabs();
 | 
			
		||||
       this._unlockTabSizing();
 | 
			
		||||
+      return;
 | 
			
		||||
 
 | 
			
		||||
       // If the user's selected tab is in the collapsing group, kick them off
 | 
			
		||||
       // the tab. If no tabs exist outside the group, create a new one and
 | 
			
		||||
@@ -349,7 +350,7 @@
 | 
			
		||||
       // and we're not hitting the scroll buttons.
 | 
			
		||||
       if (
 | 
			
		||||
         event.button != 0 ||
 | 
			
		||||
-        event.target != this.arrowScrollbox ||
 | 
			
		||||
+        event.target != document.getElementById("zen-tabs-wrapper") ||
 | 
			
		||||
+        !event.target.classList.contains("zen-workspace-normal-tabs-section") ||
 | 
			
		||||
         event.composedTarget.localName == "toolbarbutton"
 | 
			
		||||
       ) {
 | 
			
		||||
         return;
 | 
			
		||||
@@ -391,6 +391,7 @@
 | 
			
		||||
             // Reset the "ignored click" flag
 | 
			
		||||
             target._ignoredCloseButtonClicks = false;
 | 
			
		||||
           }
 | 
			
		||||
+          gZenUIManager.saveScrollbarState();
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
         /* Protects from close-tab-button errant doubleclick:
 | 
			
		||||
@@ -692,7 +693,7 @@
 | 
			
		||||
@@ -699,7 +700,7 @@
 | 
			
		||||
       if (this.#isContainerVerticalPinnedGrid(tab)) {
 | 
			
		||||
         // In expanded vertical mode, the max number of pinned tabs per row is dynamic
 | 
			
		||||
         // Set this before adjusting dragged tab's position
 | 
			
		||||
-        let pinnedTabs = this.visibleTabs.slice(0, gBrowser.pinnedTabCount);
 | 
			
		||||
+        let pinnedTabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(0, gBrowser._numZenVisibleEssentials);
 | 
			
		||||
+        let pinnedTabs = this.ariaFocusableItems.slice(0, gBrowser._numZenEssentials);
 | 
			
		||||
         let tabsPerRow = 0;
 | 
			
		||||
         let position = 0;
 | 
			
		||||
         for (let pinnedTab of pinnedTabs) {
 | 
			
		||||
@@ -764,7 +765,7 @@
 | 
			
		||||
@@ -772,7 +773,7 @@
 | 
			
		||||
         } else if (isTabGroupLabel(tab) && !tab.group.collapsed) {
 | 
			
		||||
           this._lockTabSizing();
 | 
			
		||||
           this.#keepTabSizeLocked = true;
 | 
			
		||||
@@ -46,7 +46,16 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
           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);
 | 
			
		||||
@@ -57,7 +66,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
       if (
 | 
			
		||||
         (effects == "move" || effects == "copy") &&
 | 
			
		||||
         document == draggedTab.ownerDocument &&
 | 
			
		||||
@@ -1069,6 +1074,18 @@
 | 
			
		||||
@@ -1077,6 +1082,18 @@
 | 
			
		||||
 
 | 
			
		||||
       this._tabDropIndicator.hidden = true;
 | 
			
		||||
       event.stopPropagation();
 | 
			
		||||
@@ -76,32 +85,38 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
       if (draggedTab && dropEffect == "copy") {
 | 
			
		||||
         let duplicatedDraggedTab;
 | 
			
		||||
         let duplicatedTabs = [];
 | 
			
		||||
@@ -1108,10 +1125,11 @@
 | 
			
		||||
@@ -1116,10 +1133,11 @@
 | 
			
		||||
           }
 | 
			
		||||
         } else {
 | 
			
		||||
           let isPinned = draggedTab.pinned;
 | 
			
		||||
-          let numPinned = gBrowser.pinnedTabCount;
 | 
			
		||||
-          let tabs = this.ariaFocusableItems.slice(
 | 
			
		||||
-            isPinned ? 0 : numPinned,
 | 
			
		||||
-            isPinned ? numPinned : undefined
 | 
			
		||||
+          let numPinned = gBrowser._numVisiblePinTabsWithoutCollapsed;
 | 
			
		||||
+          let essential = draggedTab.hasAttribute("zen-essential");
 | 
			
		||||
+          let tabs = this.ariaFocusableItems.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(
 | 
			
		||||
+            isPinned ? (essential ? 0 : gBrowser._numZenVisibleEssentials) : numPinned,
 | 
			
		||||
+            isPinned ? (essential ? gBrowser._numZenVisibleEssentials : numPinned) : undefined
 | 
			
		||||
           let tabs = this.ariaFocusableItems.slice(
 | 
			
		||||
-            isPinned ? 0 : numPinned,
 | 
			
		||||
-            isPinned ? numPinned : undefined
 | 
			
		||||
+            isPinned ? (essential ? 0 : gBrowser._numZenEssentials) : numPinned,
 | 
			
		||||
+            isPinned ? (essential ? gBrowser._numZenEssentials : numPinned) : undefined
 | 
			
		||||
           );
 | 
			
		||||
           let size = this.verticalMode ? "height" : "width";
 | 
			
		||||
           let screenAxis = this.verticalMode ? "screenY" : "screenX";
 | 
			
		||||
@@ -1203,7 +1221,7 @@
 | 
			
		||||
                 item.removeAttribute("tabdrop-samewindow");
 | 
			
		||||
                 resolve();
 | 
			
		||||
               };
 | 
			
		||||
-              if (gReduceMotion) {
 | 
			
		||||
+              if (true || gReduceMotion) {
 | 
			
		||||
                 postTransitionCleanup();
 | 
			
		||||
               } else {
 | 
			
		||||
                 let onTransitionEnd = transitionendEvent => {
 | 
			
		||||
@@ -1327,6 +1345,7 @@
 | 
			
		||||
@@ -1135,8 +1153,14 @@
 | 
			
		||||
             (lastMovingTabScreen + tabSize);
 | 
			
		||||
 
 | 
			
		||||
           if (this.verticalMode) {
 | 
			
		||||
+            if (oldTranslateY > 0 && translateOffsetY > tabHeight / 2) {
 | 
			
		||||
+              newTranslateY += tabHeight;
 | 
			
		||||
+            }
 | 
			
		||||
+            if (oldTranslateY < 0 && -translateOffsetY > tabHeight / 2) {
 | 
			
		||||
+              newTranslateY -= tabHeight;
 | 
			
		||||
+            }
 | 
			
		||||
             newTranslateY = Math.min(
 | 
			
		||||
-              Math.max(oldTranslateY, firstBound),
 | 
			
		||||
+              Math.max(newTranslateY, firstBound),
 | 
			
		||||
               lastBound
 | 
			
		||||
             );
 | 
			
		||||
           } else {
 | 
			
		||||
@@ -1337,6 +1361,7 @@
 | 
			
		||||
 
 | 
			
		||||
           let nextItem = this.ariaFocusableItems[newIndex];
 | 
			
		||||
           let tabGroup = isTab(nextItem) && nextItem.group;
 | 
			
		||||
@@ -109,7 +124,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
           gBrowser.loadTabs(urls, {
 | 
			
		||||
             inBackground,
 | 
			
		||||
             replace,
 | 
			
		||||
@@ -1359,6 +1378,17 @@
 | 
			
		||||
@@ -1369,6 +1394,17 @@
 | 
			
		||||
 
 | 
			
		||||
       this.finishMoveTogetherSelectedTabs(draggedTab);
 | 
			
		||||
       this.finishAnimateTabMove();
 | 
			
		||||
@@ -127,21 +142,21 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
       this.#expandGroupOnDrop(draggedTab);
 | 
			
		||||
 
 | 
			
		||||
       if (
 | 
			
		||||
@@ -1582,7 +1612,7 @@
 | 
			
		||||
@@ -1597,7 +1633,7 @@
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     get newTabButton() {
 | 
			
		||||
-      return this.querySelector("#tabs-newtab-button");
 | 
			
		||||
+      return ZenWorkspaces.activeWorkspaceStrip.querySelector("#tabs-newtab-button");
 | 
			
		||||
+      return gZenWorkspaces.activeWorkspaceStrip.querySelector("#tabs-newtab-button");
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     get verticalMode() {
 | 
			
		||||
@@ -1606,29 +1636,41 @@
 | 
			
		||||
@@ -1621,29 +1657,54 @@
 | 
			
		||||
       if (this.#allTabs) {
 | 
			
		||||
         return this.#allTabs;
 | 
			
		||||
       }
 | 
			
		||||
-      let children = Array.from(this.arrowScrollbox.children);
 | 
			
		||||
+      let children = ZenWorkspaces.tabboxChildren;
 | 
			
		||||
+      let children = gZenWorkspaces.tabboxChildren;
 | 
			
		||||
       // remove arrowScrollbox periphery element
 | 
			
		||||
       children.pop();
 | 
			
		||||
 
 | 
			
		||||
@@ -151,51 +166,55 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
-      for (let i = children.length - 1; i >= 0; i--) {
 | 
			
		||||
-        if (children[i].tagName == "tab-group") {
 | 
			
		||||
-          children.splice(i, 1, ...children[i].tabs);
 | 
			
		||||
-        }
 | 
			
		||||
-      }
 | 
			
		||||
 
 | 
			
		||||
       this.#allTabs = [
 | 
			
		||||
+      const pinnedTabs = [...gZenWorkspaces.getCurrentEssentialsContainer().children, ...this.verticalPinnedTabsContainer.children];
 | 
			
		||||
+      const expandTabs = (tabs) => {
 | 
			
		||||
+        for (let i = tabs.length - 1; i >= 0; i--) {
 | 
			
		||||
+          const tab = tabs[i];
 | 
			
		||||
+          if (isTabGroup(tab)) {
 | 
			
		||||
+            // remove the group from the list
 | 
			
		||||
+            tabs.splice(i, 1);
 | 
			
		||||
+            // add the tabs in the group to the list
 | 
			
		||||
+            tabs.splice(i, 0, ...tab.tabs);
 | 
			
		||||
+          }
 | 
			
		||||
         }
 | 
			
		||||
       }
 | 
			
		||||
-
 | 
			
		||||
-      this.#allTabs = [
 | 
			
		||||
-        ...this.verticalPinnedTabsContainer.children,
 | 
			
		||||
+        ...ZenWorkspaces.getCurrentEssentialsContainer().children, ...this.verticalPinnedTabsContainer.children,
 | 
			
		||||
+      expandTabs(pinnedTabs);
 | 
			
		||||
+      expandTabs(children);
 | 
			
		||||
+      const allTabs = [
 | 
			
		||||
+        ...pinnedTabs,
 | 
			
		||||
         ...children,
 | 
			
		||||
       ];
 | 
			
		||||
+      const lastPinnedTabIdx = gBrowser.pinnedTabCount;
 | 
			
		||||
+      for (let i = 0; i < this.#allTabs.length; i++) {
 | 
			
		||||
+      const lastPinnedTabIdx = pinnedTabs.length - 1;
 | 
			
		||||
+      let i = 0;
 | 
			
		||||
+      for (const tab of [...allTabs]) {
 | 
			
		||||
+        // add glance tabs (tabs inside tabs) to the list
 | 
			
		||||
+        const glanceTab = this.#allTabs[i].querySelector("tab[zen-glance-tab]");
 | 
			
		||||
+        const glanceTab = tab.glanceTab;
 | 
			
		||||
+        if (glanceTab) {
 | 
			
		||||
+          // 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
 | 
			
		||||
+          this.#allTabs.splice(Math.max(i + 1, lastPinnedTabIdx), 0, glanceTab);
 | 
			
		||||
+          i++;
 | 
			
		||||
+        } else if (this.#allTabs[i].classList.contains("vertical-pinned-tabs-container-separator")) {
 | 
			
		||||
+          allTabs.splice(Math.max(i++ + 1, lastPinnedTabIdx), 0, glanceTab);
 | 
			
		||||
+        } else if (tab.classList.contains("vertical-pinned-tabs-container-separator")) {
 | 
			
		||||
+          // remove the separator from the list
 | 
			
		||||
+          this.#allTabs.splice(i, 1);
 | 
			
		||||
+          allTabs.splice(i, 1);
 | 
			
		||||
+          i--;
 | 
			
		||||
+        } else if (this.#allTabs[i].tagName == "tab-group") {
 | 
			
		||||
+          this.#allTabs.splice(i, 1, ...this.#allTabs[i].tabs);
 | 
			
		||||
+        }
 | 
			
		||||
+        i++;
 | 
			
		||||
+      }
 | 
			
		||||
+      this.#allTabs = allTabs;
 | 
			
		||||
       return this.#allTabs;
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     get allGroups() {
 | 
			
		||||
       let children = Array.from(this.arrowScrollbox.children);
 | 
			
		||||
-      return children.filter(node => node.tagName == "tab-group");
 | 
			
		||||
+      return ZenWorkspaces.allTabGroups;
 | 
			
		||||
+      return gZenWorkspaces.allTabGroups;
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     /**
 | 
			
		||||
@@ -1648,7 +1690,7 @@
 | 
			
		||||
      */
 | 
			
		||||
     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,23 +1725,18 @@
 | 
			
		||||
@@ -1698,23 +1759,18 @@
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
       let elementIndex = 0;
 | 
			
		||||
@@ -207,11 +226,11 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
-      }
 | 
			
		||||
-      let children = Array.from(this.arrowScrollbox.children);
 | 
			
		||||
+      let verticalPinnedTabsContainer = this.verticalPinnedTabsContainer
 | 
			
		||||
+      let children = ZenWorkspaces.tabboxChildrenWithoutEmpty;
 | 
			
		||||
+      let children = gZenWorkspaces.tabboxChildrenWithoutEmpty;
 | 
			
		||||
 
 | 
			
		||||
       let focusableItems = [];
 | 
			
		||||
-      for (let child of children) {
 | 
			
		||||
+      for (let child of [...ZenWorkspaces.getCurrentEssentialsContainer().children, ...verticalPinnedTabsContainer.children, ...children]) {
 | 
			
		||||
+      for (let child of [...gZenWorkspaces.getCurrentEssentialsContainer().children, ...verticalPinnedTabsContainer.children, ...children]) {
 | 
			
		||||
         if (isTab(child) && child.visible) {
 | 
			
		||||
           child.elementIndex = elementIndex++;
 | 
			
		||||
           focusableItems.push(child);
 | 
			
		||||
@@ -223,15 +242,8 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
             let visibleTabsInGroup = child.tabs.filter(tab => tab.visible);
 | 
			
		||||
             visibleTabsInGroup.forEach(tab => {
 | 
			
		||||
               tab.elementIndex = elementIndex++;
 | 
			
		||||
@@ -1707,12 +1744,14 @@
 | 
			
		||||
             focusableItems.push(...visibleTabsInGroup);
 | 
			
		||||
           }
 | 
			
		||||
@@ -1724,10 +1780,7 @@
 | 
			
		||||
         }
 | 
			
		||||
+        let glanceTab = child.querySelector("tab[zen-glance-tab]");
 | 
			
		||||
+        if (isTab(child) && glanceTab) {
 | 
			
		||||
+          glanceTab.elementIndex = elementIndex++;
 | 
			
		||||
+          focusableItems.push(glanceTab);
 | 
			
		||||
+        }
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
-      this.#focusableItems = [
 | 
			
		||||
@@ -242,15 +254,15 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
 
 | 
			
		||||
       return this.#focusableItems;
 | 
			
		||||
     }
 | 
			
		||||
@@ -1720,6 +1759,7 @@
 | 
			
		||||
@@ -1735,6 +1788,7 @@
 | 
			
		||||
     _invalidateCachedTabs() {
 | 
			
		||||
       this.#allTabs = null;
 | 
			
		||||
       this._invalidateCachedVisibleTabs();
 | 
			
		||||
+      ZenWorkspaces._allStoredTabs = null;
 | 
			
		||||
+      gZenWorkspaces._allStoredTabs = null;
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     _invalidateCachedVisibleTabs() {
 | 
			
		||||
@@ -1734,8 +1774,8 @@
 | 
			
		||||
@@ -1749,8 +1803,8 @@
 | 
			
		||||
     #isContainerVerticalPinnedGrid(tab) {
 | 
			
		||||
       return (
 | 
			
		||||
         this.verticalMode &&
 | 
			
		||||
@@ -261,25 +273,25 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
         !this.expandOnHover
 | 
			
		||||
       );
 | 
			
		||||
     }
 | 
			
		||||
@@ -1751,7 +1791,7 @@
 | 
			
		||||
@@ -1766,7 +1820,7 @@
 | 
			
		||||
 
 | 
			
		||||
       if (node == null) {
 | 
			
		||||
         // We have a container for non-tab elements at the end of the scrollbox.
 | 
			
		||||
-        node = this.arrowScrollbox.lastChild;
 | 
			
		||||
+        node = ZenWorkspaces.activeWorkspaceStrip.lastChild;
 | 
			
		||||
+        node = gZenWorkspaces.activeWorkspaceStrip.lastChild;
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
       node.before(tab);
 | 
			
		||||
@@ -1846,7 +1886,7 @@
 | 
			
		||||
@@ -1861,7 +1915,7 @@
 | 
			
		||||
           // There are separate "new tab" buttons for horizontal tabs toolbar, vertical tabs and
 | 
			
		||||
           // for when the tab strip is overflowed (which is shared by vertical and horizontal tabs);
 | 
			
		||||
           // Attach the long click popup to all of them.
 | 
			
		||||
-          const newTab = document.getElementById("new-tab-button");
 | 
			
		||||
+          const newTab = ZenWorkspaces.activeWorkspaceStrip.querySelector("#tabs-newtab-button");
 | 
			
		||||
+          const newTab = gZenWorkspaces.activeWorkspaceStrip.querySelector("#tabs-newtab-button");
 | 
			
		||||
           const newTab2 = this.newTabButton;
 | 
			
		||||
           const newTabVertical = document.getElementById(
 | 
			
		||||
             "vertical-tabs-newtab-button"
 | 
			
		||||
@@ -1941,10 +1981,12 @@
 | 
			
		||||
@@ -1956,10 +2010,12 @@
 | 
			
		||||
 
 | 
			
		||||
     _handleTabSelect(aInstant) {
 | 
			
		||||
       let selectedTab = this.selectedItem;
 | 
			
		||||
@@ -292,91 +304,55 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
       selectedTab._notselectedsinceload = false;
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
@@ -2085,16 +2127,15 @@
 | 
			
		||||
       // 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 (!ZenWorkspaces._hasInitializedTabsStrip) return;
 | 
			
		||||
+      let count = ZenWorkspaces.makeSurePinTabIsInCorrectPosition();
 | 
			
		||||
+      if (gBrowser.pinnedTabCount !== (verticalTabsContainer.children.length - count - 1 + ZenWorkspaces.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") ? ZenWorkspaces.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 +2143,7 @@
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     _resetVerticalPinnedTabs() {
 | 
			
		||||
-      let verticalTabsContainer = document.getElementById(
 | 
			
		||||
-        "vertical-pinned-tabs-container"
 | 
			
		||||
-      );
 | 
			
		||||
+      let verticalTabsContainer = this.verticalPinnedTabsContainer;
 | 
			
		||||
 
 | 
			
		||||
       if (!verticalTabsContainer.children.length) {
 | 
			
		||||
         return;
 | 
			
		||||
@@ -2117,7 +2156,7 @@
 | 
			
		||||
@@ -2132,6 +2188,7 @@
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     _positionPinnedTabs() {
 | 
			
		||||
-      let tabs = this.visibleTabs;
 | 
			
		||||
+      let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab"));
 | 
			
		||||
+      if (true) return;
 | 
			
		||||
       let tabs = this.visibleTabs;
 | 
			
		||||
       let numPinned = gBrowser.pinnedTabCount;
 | 
			
		||||
       let absPositionHorizontalTabs =
 | 
			
		||||
         this.overflowing && tabs.length > numPinned && numPinned > 0;
 | 
			
		||||
@@ -2127,7 +2166,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 +2230,7 @@
 | 
			
		||||
@@ -2206,7 +2263,7 @@
 | 
			
		||||
         return;
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
-      let tabs = this.visibleTabs.slice(0, gBrowser.pinnedTabCount);
 | 
			
		||||
+      let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(0, gBrowser._numZenVisibleEssentials);
 | 
			
		||||
+      let tabs = this.ariaFocusableItems.slice(0, gBrowser._numZenEssentials);
 | 
			
		||||
 
 | 
			
		||||
       let directionX = screenX > dragData.animLastScreenX;
 | 
			
		||||
       let directionY = screenY > dragData.animLastScreenY;
 | 
			
		||||
@@ -2199,7 +2238,7 @@
 | 
			
		||||
       dragData.animLastScreenX = screenX;
 | 
			
		||||
@@ -2215,6 +2272,8 @@
 | 
			
		||||
 
 | 
			
		||||
       let { width: tabWidth, height: tabHeight } =
 | 
			
		||||
-        draggedTab.getBoundingClientRect();
 | 
			
		||||
+        (draggedTab.group?.hasAttribute("split-view-group") ? draggedTab.group : draggedTab).getBoundingClientRect();
 | 
			
		||||
         draggedTab.getBoundingClientRect();
 | 
			
		||||
+      tabWidth += 4; // Add 4px to account for the gap
 | 
			
		||||
+      tabHeight += 4;
 | 
			
		||||
       let shiftSizeX = tabWidth * movingTabs.length;
 | 
			
		||||
       let shiftSizeY = tabHeight;
 | 
			
		||||
       dragData.tabWidth = tabWidth;
 | 
			
		||||
@@ -2374,12 +2413,16 @@
 | 
			
		||||
@@ -2244,7 +2303,7 @@
 | 
			
		||||
       let translateX = screenX - dragData.screenX;
 | 
			
		||||
       let translateY = screenY - dragData.screenY;
 | 
			
		||||
       translateY +=
 | 
			
		||||
-        this.verticalPinnedTabsContainer.scrollPosition - dragData.scrollPos;
 | 
			
		||||
+        dragData.scrollPos;
 | 
			
		||||
       let firstBoundX = firstTabInRow.screenX - firstMovingTabScreenX;
 | 
			
		||||
       let firstBoundY = firstTabInRow.screenY - firstMovingTabScreenY;
 | 
			
		||||
       let lastBoundX =
 | 
			
		||||
@@ -2389,12 +2448,16 @@
 | 
			
		||||
 
 | 
			
		||||
       this.#clearDragOverCreateGroupTimer();
 | 
			
		||||
 
 | 
			
		||||
-      let isPinned = draggedTab.pinned;
 | 
			
		||||
-      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 numPinned = gBrowser._numVisiblePinTabsWithoutCollapsed;
 | 
			
		||||
+      let essential = draggedTab.hasAttribute("zen-essential");
 | 
			
		||||
+      let tabs = this.ariaFocusableItems.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(
 | 
			
		||||
+        isPinned ? (essential ? 0 : gBrowser._numZenVisibleEssentials) : numPinned,
 | 
			
		||||
+        isPinned ? (essential ? gBrowser._numZenVisibleEssentials : numPinned) : undefined
 | 
			
		||||
       let tabs = this.ariaFocusableItems.slice(
 | 
			
		||||
-        isPinned ? 0 : numPinned,
 | 
			
		||||
-        isPinned ? numPinned : undefined
 | 
			
		||||
+        isPinned ? (essential ? 0 : gBrowser._numZenEssentials) : numPinned,
 | 
			
		||||
+        isPinned ? (essential ? gBrowser._numZenEssentials : numPinned) : undefined
 | 
			
		||||
       );
 | 
			
		||||
+      if (draggedTab.group?.hasAttribute("split-view-group")) {
 | 
			
		||||
+        draggedTab = draggedTab.group.labelElement;
 | 
			
		||||
@@ -384,7 +360,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
 
 | 
			
		||||
       if (this.#rtlMode) {
 | 
			
		||||
         tabs.reverse();
 | 
			
		||||
@@ -2393,7 +2436,7 @@
 | 
			
		||||
@@ -2408,7 +2471,7 @@
 | 
			
		||||
       let size = this.verticalMode ? "height" : "width";
 | 
			
		||||
       let translateAxis = this.verticalMode ? "translateY" : "translateX";
 | 
			
		||||
       let scrollDirection = this.verticalMode ? "scrollTop" : "scrollLeft";
 | 
			
		||||
@@ -393,7 +369,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
       let translateX = event.screenX - dragData.screenX;
 | 
			
		||||
       let translateY = event.screenY - dragData.screenY;
 | 
			
		||||
 
 | 
			
		||||
@@ -2407,10 +2450,19 @@
 | 
			
		||||
@@ -2422,12 +2485,21 @@
 | 
			
		||||
       let lastTab = tabs.at(-1);
 | 
			
		||||
       let lastMovingTab = movingTabs.at(-1);
 | 
			
		||||
       let firstMovingTab = movingTabs[0];
 | 
			
		||||
@@ -411,9 +387,12 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
+        shiftSize += 5; // A hack to allow more space for the group
 | 
			
		||||
+      }
 | 
			
		||||
       let translate = screen - dragData[screenAxis];
 | 
			
		||||
       if (!isPinned) {
 | 
			
		||||
-      if (!isPinned) {
 | 
			
		||||
+      if (true) {
 | 
			
		||||
         translate +=
 | 
			
		||||
@@ -2431,6 +2483,9 @@
 | 
			
		||||
           this.arrowScrollbox.scrollbox[scrollDirection] - dragData.scrollPos;
 | 
			
		||||
       } else if (isPinned && this.verticalMode) {
 | 
			
		||||
@@ -2446,6 +2518,9 @@
 | 
			
		||||
           // Shift the `.tab-group-label-container` to shift the label element.
 | 
			
		||||
           item = item.parentElement;
 | 
			
		||||
         }
 | 
			
		||||
@@ -423,7 +402,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
         item.style.transform = `${translateAxis}(${translate}px)`;
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
@@ -2568,6 +2623,9 @@
 | 
			
		||||
@@ -2583,6 +2658,9 @@
 | 
			
		||||
             break;
 | 
			
		||||
           }
 | 
			
		||||
           let element = tabs[mid];
 | 
			
		||||
@@ -433,7 +412,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
           let elementForSize = isTabGroupLabel(element)
 | 
			
		||||
             ? element.parentElement
 | 
			
		||||
             : element;
 | 
			
		||||
@@ -2590,6 +2648,10 @@
 | 
			
		||||
@@ -2605,6 +2683,10 @@
 | 
			
		||||
       if (!dropElement) {
 | 
			
		||||
         dropElement = this.ariaFocusableItems[oldDropElementIndex];
 | 
			
		||||
       }
 | 
			
		||||
@@ -444,7 +423,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
       let newDropElementIndex = dropElement
 | 
			
		||||
         ? dropElement.elementIndex
 | 
			
		||||
         : oldDropElementIndex;
 | 
			
		||||
@@ -2598,7 +2660,7 @@
 | 
			
		||||
@@ -2613,7 +2695,7 @@
 | 
			
		||||
       let shouldCreateGroupOnDrop;
 | 
			
		||||
       let dropBefore;
 | 
			
		||||
       if (dropElement) {
 | 
			
		||||
@@ -453,7 +432,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
           ? dropElement.parentElement
 | 
			
		||||
           : dropElement;
 | 
			
		||||
 
 | 
			
		||||
@@ -2660,12 +2722,12 @@
 | 
			
		||||
@@ -2675,12 +2757,12 @@
 | 
			
		||||
         }
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
@@ -468,7 +447,16 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
           dropElement != draggedTab &&
 | 
			
		||||
           isTab(dropElement) &&
 | 
			
		||||
           !dropElement?.group &&
 | 
			
		||||
@@ -2735,7 +2797,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
 | 
			
		||||
       // would currently be dropped.
 | 
			
		||||
       for (let item of tabs) {
 | 
			
		||||
@@ -477,7 +465,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
           continue;
 | 
			
		||||
         }
 | 
			
		||||
 
 | 
			
		||||
@@ -2744,6 +2806,9 @@
 | 
			
		||||
@@ -2759,6 +2841,9 @@
 | 
			
		||||
         if (isTabGroupLabel(item)) {
 | 
			
		||||
           // Shift the `.tab-group-label-container` to shift the label element.
 | 
			
		||||
           item = item.parentElement;
 | 
			
		||||
@@ -487,7 +475,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
         }
 | 
			
		||||
         item.style.transform = transform;
 | 
			
		||||
       }
 | 
			
		||||
@@ -2796,8 +2861,9 @@
 | 
			
		||||
@@ -2811,8 +2896,9 @@
 | 
			
		||||
       );
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
@@ -499,7 +487,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
         return;
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
@@ -2809,6 +2875,12 @@
 | 
			
		||||
@@ -2824,6 +2910,12 @@
 | 
			
		||||
           item = item.parentElement;
 | 
			
		||||
         }
 | 
			
		||||
         item.style.transform = "";
 | 
			
		||||
@@ -512,7 +500,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
         item.removeAttribute("dragover-createGroup");
 | 
			
		||||
       }
 | 
			
		||||
       this.removeAttribute("movingtab-createGroup");
 | 
			
		||||
@@ -2855,7 +2927,7 @@
 | 
			
		||||
@@ -2870,7 +2962,7 @@
 | 
			
		||||
         let postTransitionCleanup = () => {
 | 
			
		||||
           movingTab._moveTogetherSelectedTabsData.animate = false;
 | 
			
		||||
         };
 | 
			
		||||
@@ -521,7 +509,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
           postTransitionCleanup();
 | 
			
		||||
         } else {
 | 
			
		||||
           let onTransitionEnd = transitionendEvent => {
 | 
			
		||||
@@ -3028,7 +3100,7 @@
 | 
			
		||||
@@ -3043,7 +3135,7 @@
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     _notifyBackgroundTab(aTab) {
 | 
			
		||||
@@ -530,7 +518,7 @@ index ef9c0389ec926e6bc01c0dc3b883beceaf1f7d43..2885d896c4026278dfcb309f12230d6f
 | 
			
		||||
         return;
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
@@ -3154,6 +3226,9 @@
 | 
			
		||||
@@ -3169,6 +3261,9 @@
 | 
			
		||||
           return null;
 | 
			
		||||
         }
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
diff --git a/browser/components/urlbar/UrlbarInput.sys.mjs b/browser/components/urlbar/UrlbarInput.sys.mjs
 | 
			
		||||
index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..8d1a80e97fa711352d4b725f2d299a073dbae4db 100644
 | 
			
		||||
index 0c5145c3d31862bd2c6b5ed2faa88f02425ffde1..1cf86995514b2c00360f6ed681f0c640dac8ab56 100644
 | 
			
		||||
--- a/browser/components/urlbar/UrlbarInput.sys.mjs
 | 
			
		||||
+++ b/browser/components/urlbar/UrlbarInput.sys.mjs
 | 
			
		||||
@@ -68,6 +68,13 @@ XPCOMUtils.defineLazyPreferenceGetter(
 | 
			
		||||
@@ -16,24 +16,24 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..8d1a80e97fa711352d4b725f2d299a07
 | 
			
		||||
 const DEFAULT_FORM_HISTORY_NAME = "searchbar-history";
 | 
			
		||||
 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"
 | 
			
		||||
     // event but does not set the primary selection.
 | 
			
		||||
     this._suppressPrimaryAdjustment = true;
 | 
			
		||||
+    const zenToolbox = this.document.getElementById("navigator-toolbox");
 | 
			
		||||
+    zenToolbox.setAttribute("supress-primary-adjustment", !(
 | 
			
		||||
+    this.window.document.documentElement.setAttribute("supress-primary-adjustment", !(
 | 
			
		||||
+      zenToolbox.hasAttribute("zen-has-hover") ||
 | 
			
		||||
+      zenToolbox.hasAttribute("zen-has-empty-tab") ||
 | 
			
		||||
+      zenToolbox.hasAttribute("zen-user-show")
 | 
			
		||||
+    ));
 | 
			
		||||
     this.inputField.select();
 | 
			
		||||
+    this.document.ownerGlobal.setTimeout(() => {
 | 
			
		||||
+      zenToolbox.removeAttribute("supress-primary-adjustment");
 | 
			
		||||
+    }, 1000);
 | 
			
		||||
+      this.window.document.documentElement.removeAttribute("supress-primary-adjustment");
 | 
			
		||||
+    }, 0);
 | 
			
		||||
     this._suppressPrimaryAdjustment = false;
 | 
			
		||||
   }
 | 
			
		||||
 
 | 
			
		||||
@@ -425,6 +441,10 @@ export class UrlbarInput {
 | 
			
		||||
@@ -431,6 +447,10 @@ export class UrlbarInput {
 | 
			
		||||
     hideSearchTerms = false,
 | 
			
		||||
     isSameDocument = false
 | 
			
		||||
   ) {
 | 
			
		||||
@@ -44,25 +44,25 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..8d1a80e97fa711352d4b725f2d299a07
 | 
			
		||||
     // We only need to update the searchModeUI on tab switch conditionally
 | 
			
		||||
     // as we only persist searchMode with ScotchBonnet enabled.
 | 
			
		||||
     if (
 | 
			
		||||
@@ -698,8 +718,16 @@ export class UrlbarInput {
 | 
			
		||||
@@ -735,8 +755,16 @@ export class UrlbarInput {
 | 
			
		||||
         return;
 | 
			
		||||
       }
 | 
			
		||||
     }
 | 
			
		||||
-
 | 
			
		||||
+    const zenToolbox = this.document.getElementById("navigator-toolbox");
 | 
			
		||||
+    zenToolbox.setAttribute("supress-primary-adjustment", !(
 | 
			
		||||
+    this.window.document.documentElement.setAttribute("supress-primary-adjustment", !(
 | 
			
		||||
+      zenToolbox.hasAttribute("zen-has-hover") ||
 | 
			
		||||
+      zenToolbox.hasAttribute("zen-has-empty-tab") ||
 | 
			
		||||
+      zenToolbox.hasAttribute("zen-user-show")
 | 
			
		||||
+    ));
 | 
			
		||||
     this.handleNavigation({ event });
 | 
			
		||||
+    this.document.ownerGlobal.setTimeout(() => {
 | 
			
		||||
+      zenToolbox.removeAttribute("supress-primary-adjustment");
 | 
			
		||||
+    }, 1000);
 | 
			
		||||
+      this.window.document.documentElement.removeAttribute("supress-primary-adjustment");
 | 
			
		||||
+    }, 0);
 | 
			
		||||
   }
 | 
			
		||||
 
 | 
			
		||||
   /**
 | 
			
		||||
@@ -1093,7 +1121,11 @@ export class UrlbarInput {
 | 
			
		||||
@@ -1142,7 +1170,11 @@ export class UrlbarInput {
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     if (!this.#providesSearchMode(result)) {
 | 
			
		||||
@@ -74,8 +74,8 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..8d1a80e97fa711352d4b725f2d299a07
 | 
			
		||||
+      }
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     this.controller.recordSelectedResult(event, result);
 | 
			
		||||
@@ -2125,6 +2157,10 @@ export class UrlbarInput {
 | 
			
		||||
     if (isCanonized) {
 | 
			
		||||
@@ -2191,6 +2223,10 @@ export class UrlbarInput {
 | 
			
		||||
     await this.#updateLayoutBreakoutDimensions();
 | 
			
		||||
   }
 | 
			
		||||
 
 | 
			
		||||
@@ -86,21 +86,20 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..8d1a80e97fa711352d4b725f2d299a07
 | 
			
		||||
   startLayoutExtend() {
 | 
			
		||||
     if (!this.#allowBreakout || this.hasAttribute("breakout-extend")) {
 | 
			
		||||
       // Do not expand if the Urlbar does not support being expanded or it is
 | 
			
		||||
@@ -2147,6 +2183,13 @@ export class UrlbarInput {
 | 
			
		||||
@@ -2205,6 +2241,12 @@ export class UrlbarInput {
 | 
			
		||||
 
 | 
			
		||||
     this.setAttribute("breakout-extend", "true");
 | 
			
		||||
 
 | 
			
		||||
+    if (lazy.ZEN_URLBAR_BEHAVIOR == 'float' || (lazy.ZEN_URLBAR_BEHAVIOR == 'floating-on-type' && !this.focusedViaMousedown)) {
 | 
			
		||||
+      this.setAttribute("zen-floating-urlbar", "true");
 | 
			
		||||
+      // Divide the window by 2 and subtract the urlbar height to get the top
 | 
			
		||||
+      this.textbox.style.setProperty("--zen-urlbar-top", `${(this.window.innerHeight / 6)}px`);
 | 
			
		||||
+      this.window.gZenUIManager.onFloatingURLBarOpen();
 | 
			
		||||
+    } else {
 | 
			
		||||
+      this.removeAttribute("zen-floating-urlbar");
 | 
			
		||||
+    }
 | 
			
		||||
     // Enable the animation only after the first extend call to ensure it
 | 
			
		||||
     // doesn't run when opening a new window.
 | 
			
		||||
     if (!this.hasAttribute("breakout-extend-animate")) {
 | 
			
		||||
@@ -2166,6 +2209,24 @@ export class UrlbarInput {
 | 
			
		||||
@@ -2224,6 +2266,24 @@ export class UrlbarInput {
 | 
			
		||||
       return;
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
@@ -110,22 +109,22 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..8d1a80e97fa711352d4b725f2d299a07
 | 
			
		||||
+    
 | 
			
		||||
+    // Arc like URLbar: Blur the input on exit
 | 
			
		||||
+    const zenToolbox = this.document.getElementById("navigator-toolbox");
 | 
			
		||||
+    zenToolbox.setAttribute("supress-primary-adjustment", !(
 | 
			
		||||
+    this.window.document.documentElement.setAttribute("supress-primary-adjustment", !(
 | 
			
		||||
+      zenToolbox.hasAttribute("zen-has-hover") ||
 | 
			
		||||
+      zenToolbox.hasAttribute("zen-has-empty-tab") ||
 | 
			
		||||
+      zenToolbox.hasAttribute("zen-user-show")
 | 
			
		||||
+    ));
 | 
			
		||||
+    this.window.gBrowser.selectedBrowser.focus();
 | 
			
		||||
+    this.document.ownerGlobal.setTimeout(() => {
 | 
			
		||||
+      zenToolbox.removeAttribute("supress-primary-adjustment");
 | 
			
		||||
+    }, 1000);
 | 
			
		||||
+      this.window.document.documentElement.removeAttribute("supress-primary-adjustment");
 | 
			
		||||
+    }, 0);
 | 
			
		||||
+    
 | 
			
		||||
+    this.removeAttribute("zen-floating-urlbar");
 | 
			
		||||
+
 | 
			
		||||
     this.removeAttribute("breakout-extend");
 | 
			
		||||
     this.#updateTextboxPosition();
 | 
			
		||||
   }
 | 
			
		||||
@@ -2485,7 +2546,7 @@ export class UrlbarInput {
 | 
			
		||||
@@ -2553,7 +2613,7 @@ export class UrlbarInput {
 | 
			
		||||
 
 | 
			
		||||
         this.textbox.parentNode.style.setProperty(
 | 
			
		||||
           "--urlbar-container-height",
 | 
			
		||||
@@ -134,7 +133,15 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..8d1a80e97fa711352d4b725f2d299a07
 | 
			
		||||
         );
 | 
			
		||||
         this.textbox.style.setProperty(
 | 
			
		||||
           "--urlbar-height",
 | 
			
		||||
@@ -2998,7 +3059,7 @@ export class UrlbarInput {
 | 
			
		||||
@@ -2968,6 +3028,7 @@ export class UrlbarInput {
 | 
			
		||||
   }
 | 
			
		||||
 
 | 
			
		||||
   _toggleActionOverride(event) {
 | 
			
		||||
+    if (!Services.prefs.getBoolPref("zen.urlbar.enable-overrides")) return;
 | 
			
		||||
     if (
 | 
			
		||||
       event.keyCode == KeyEvent.DOM_VK_SHIFT ||
 | 
			
		||||
       event.keyCode == KeyEvent.DOM_VK_ALT ||
 | 
			
		||||
@@ -3069,7 +3130,7 @@ export class UrlbarInput {
 | 
			
		||||
    */
 | 
			
		||||
   _trimValue(val) {
 | 
			
		||||
     let trimmedValue = lazy.UrlbarPrefs.get("trimURLs")
 | 
			
		||||
@@ -143,7 +150,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..8d1a80e97fa711352d4b725f2d299a07
 | 
			
		||||
       : val;
 | 
			
		||||
     // Only trim value if the directionality doesn't change to RTL and we're not
 | 
			
		||||
     // showing a strikeout https protocol.
 | 
			
		||||
@@ -3368,6 +3429,10 @@ export class UrlbarInput {
 | 
			
		||||
@@ -3439,6 +3500,10 @@ export class UrlbarInput {
 | 
			
		||||
       }
 | 
			
		||||
       reuseEmpty = true;
 | 
			
		||||
     }
 | 
			
		||||
@@ -154,7 +161,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..8d1a80e97fa711352d4b725f2d299a07
 | 
			
		||||
     if (
 | 
			
		||||
       where == "tab" &&
 | 
			
		||||
       reuseEmpty &&
 | 
			
		||||
@@ -3375,6 +3440,9 @@ export class UrlbarInput {
 | 
			
		||||
@@ -3446,6 +3511,9 @@ export class UrlbarInput {
 | 
			
		||||
     ) {
 | 
			
		||||
       where = "current";
 | 
			
		||||
     }
 | 
			
		||||
@@ -164,7 +171,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..8d1a80e97fa711352d4b725f2d299a07
 | 
			
		||||
     return where;
 | 
			
		||||
   }
 | 
			
		||||
 
 | 
			
		||||
@@ -3632,6 +3700,7 @@ export class UrlbarInput {
 | 
			
		||||
@@ -3703,6 +3771,7 @@ export class UrlbarInput {
 | 
			
		||||
       this.setResultForCurrentValue(null);
 | 
			
		||||
       this.handleCommand();
 | 
			
		||||
       this.controller.clearLastQueryContextCache();
 | 
			
		||||
@@ -172,7 +179,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..8d1a80e97fa711352d4b725f2d299a07
 | 
			
		||||
 
 | 
			
		||||
       this._suppressStartQuery = false;
 | 
			
		||||
     });
 | 
			
		||||
@@ -3639,7 +3708,6 @@ export class UrlbarInput {
 | 
			
		||||
@@ -3710,7 +3779,6 @@ export class UrlbarInput {
 | 
			
		||||
     contextMenu.addEventListener("popupshowing", () => {
 | 
			
		||||
       // Close the results pane when the input field contextual menu is open,
 | 
			
		||||
       // because paste and go doesn't want a result selection.
 | 
			
		||||
@@ -180,7 +187,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..8d1a80e97fa711352d4b725f2d299a07
 | 
			
		||||
 
 | 
			
		||||
       let controller =
 | 
			
		||||
         this.document.commandDispatcher.getControllerForCommand("cmd_paste");
 | 
			
		||||
@@ -4053,6 +4121,11 @@ export class UrlbarInput {
 | 
			
		||||
@@ -4136,6 +4204,11 @@ export class UrlbarInput {
 | 
			
		||||
   }
 | 
			
		||||
 
 | 
			
		||||
   _on_click(event) {
 | 
			
		||||
@@ -192,7 +199,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..8d1a80e97fa711352d4b725f2d299a07
 | 
			
		||||
     if (
 | 
			
		||||
       event.target == this.inputField ||
 | 
			
		||||
       event.target == this._inputContainer ||
 | 
			
		||||
@@ -4124,7 +4197,7 @@ export class UrlbarInput {
 | 
			
		||||
@@ -4207,7 +4280,7 @@ export class UrlbarInput {
 | 
			
		||||
       }
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
@@ -201,7 +208,7 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..8d1a80e97fa711352d4b725f2d299a07
 | 
			
		||||
       this.view.autoOpen({ event });
 | 
			
		||||
     } else {
 | 
			
		||||
       if (this._untrimOnFocusAfterKeydown) {
 | 
			
		||||
@@ -4164,9 +4237,12 @@ export class UrlbarInput {
 | 
			
		||||
@@ -4247,9 +4320,16 @@ export class UrlbarInput {
 | 
			
		||||
   }
 | 
			
		||||
 
 | 
			
		||||
   _on_mousedown(event) {
 | 
			
		||||
@@ -209,24 +216,28 @@ index 4b69136aa31bfef3a1d3b57ad0c75fe07fa26be0..8d1a80e97fa711352d4b725f2d299a07
 | 
			
		||||
+    switch (event.zenOriginalTarget || event.currentTarget) {
 | 
			
		||||
       case this.textbox: {
 | 
			
		||||
         this._mousedownOnUrlbarDescendant = true;
 | 
			
		||||
+        if (event.type != "click") {
 | 
			
		||||
+        const isProbablyFloating =
 | 
			
		||||
+          (lazy.ZEN_URLBAR_BEHAVIOR == "floating-on-type" &&
 | 
			
		||||
+          this.hasAttribute("breakout-extend") && !this.focusedViaMousedown) ||
 | 
			
		||||
+          (lazy.ZEN_URLBAR_BEHAVIOR == "float") || this.window.gZenVerticalTabsManager._hasSetSingleToolbar;
 | 
			
		||||
+        if (event.type != "click" && isProbablyFloating || event.type == "click" && !isProbablyFloating) {
 | 
			
		||||
+          return true;
 | 
			
		||||
+        }
 | 
			
		||||
 
 | 
			
		||||
         if (
 | 
			
		||||
           event.target != this.inputField &&
 | 
			
		||||
@@ -4176,8 +4252,8 @@ export class UrlbarInput {
 | 
			
		||||
           break;
 | 
			
		||||
         }
 | 
			
		||||
@@ -4261,6 +4341,10 @@ export class UrlbarInput {
 | 
			
		||||
 
 | 
			
		||||
-        this.focusedViaMousedown = !this.focused;
 | 
			
		||||
-        this._preventClickSelectsAll = this.focused;
 | 
			
		||||
+        this.focusedViaMousedown = !(lazy.ZEN_URLBAR_BEHAVIOR === 'default' ? this.focused : this.hasAttribute("breakout-extend"));
 | 
			
		||||
+        this._preventClickSelectsAll = lazy.ZEN_URLBAR_BEHAVIOR === 'default' ? this.focused : this.hasAttribute("breakout-extend");
 | 
			
		||||
         this.focusedViaMousedown = !this.focused;
 | 
			
		||||
         this._preventClickSelectsAll = this.focused;
 | 
			
		||||
+        if (isProbablyFloating) {
 | 
			
		||||
+          this.focusedViaMousedown = !this.hasAttribute("breakout-extend");
 | 
			
		||||
+          this._preventClickSelectsAll = this.hasAttribute("breakout-extend");
 | 
			
		||||
+        }
 | 
			
		||||
 
 | 
			
		||||
         // Keep the focus status, since the attribute may be changed
 | 
			
		||||
         // upon calling this.focus().
 | 
			
		||||
@@ -4218,7 +4294,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
 | 
			
		||||
         // view open on tab switch, and the TabSelect event arrived earlier.
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,12 @@
 | 
			
		||||
diff --git a/browser/components/urlbar/UrlbarMuxerUnifiedComplete.sys.mjs b/browser/components/urlbar/UrlbarMuxerUnifiedComplete.sys.mjs
 | 
			
		||||
index dcf1af43d62979d3226d7f704c51a2f0bb935cc0..8879d657b99cb20cd657c2e4841738ffaa09c658 100644
 | 
			
		||||
--- a/browser/components/urlbar/UrlbarMuxerUnifiedComplete.sys.mjs
 | 
			
		||||
+++ b/browser/components/urlbar/UrlbarMuxerUnifiedComplete.sys.mjs
 | 
			
		||||
@@ -794,6 +794,7 @@ class MuxerUnifiedComplete extends UrlbarMuxer {
 | 
			
		||||
     }
 | 
			
		||||
 
 | 
			
		||||
     if (result.providerName == lazy.UrlbarProviderTabToSearch.name) {
 | 
			
		||||
+      return false;
 | 
			
		||||
       // Discard the result if a tab-to-search result was added already.
 | 
			
		||||
       if (!state.canAddTabToSearch) {
 | 
			
		||||
         return false;
 | 
			
		||||
@@ -0,0 +1,56 @@
 | 
			
		||||
diff --git a/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs b/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs
 | 
			
		||||
index 899e808c5f8cf14577404e3d1766fe967b32b065..82854a04edc21ac4552d06d6ba45c4714b5ef5cb 100644
 | 
			
		||||
--- a/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs
 | 
			
		||||
+++ b/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs
 | 
			
		||||
@@ -35,6 +35,8 @@ const QUERYINDEX_SWITCHTAB = 9;
 | 
			
		||||
 const QUERYINDEX_FRECENCY = 10;
 | 
			
		||||
 const QUERYINDEX_USERCONTEXTID = 11;
 | 
			
		||||
 const QUERYINDEX_LASTVIST = 12;
 | 
			
		||||
+const QUERYINDEX_PINNEDTITLE = 13;
 | 
			
		||||
+const QUERYINDEX_PINNEDURL = 14;
 | 
			
		||||
 
 | 
			
		||||
 // This SQL query fragment provides the following:
 | 
			
		||||
 //   - whether the entry is bookmarked (QUERYINDEX_BOOKMARKED)
 | 
			
		||||
@@ -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.
 | 
			
		||||
 function defaultQuery(conditions = "") {
 | 
			
		||||
   let query = `SELECT :query_type, h.url, h.title, ${SQL_BOOKMARK_TAGS_FRAGMENT},
 | 
			
		||||
-            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, ${lazy.PAGES_FRECENCY_FIELD}, t.userContextId, h.last_visit_date,
 | 
			
		||||
+            zp.title AS pinned_title, zp.url AS pinned_url
 | 
			
		||||
      FROM moz_places h
 | 
			
		||||
      LEFT JOIN moz_openpages_temp t
 | 
			
		||||
             ON t.url = h.url
 | 
			
		||||
             AND (t.userContextId = :userContextId OR (t.userContextId <> -1 AND :userContextId IS NULL))
 | 
			
		||||
+     LEFT JOIN zen_pins zp
 | 
			
		||||
+            ON zp.url = h.url
 | 
			
		||||
      WHERE (
 | 
			
		||||
         (:switchTabsEnabled AND t.open_count > 0) OR
 | 
			
		||||
         ${lazy.PAGES_FRECENCY_FIELD} <> 0
 | 
			
		||||
@@ -74,7 +79,7 @@ function defaultQuery(conditions = "") {
 | 
			
		||||
                               :matchBehavior, :searchBehavior, NULL)
 | 
			
		||||
          ELSE
 | 
			
		||||
            AUTOCOMPLETE_MATCH(:searchString, h.url,
 | 
			
		||||
-                              h.title, '',
 | 
			
		||||
+                              IFNULL(zp.title, h.title), '',
 | 
			
		||||
                               h.visit_count, h.typed,
 | 
			
		||||
                               0, t.open_count,
 | 
			
		||||
                               :matchBehavior, :searchBehavior, NULL)
 | 
			
		||||
@@ -1130,11 +1135,14 @@ Search.prototype = {
 | 
			
		||||
     let lastVisit = lastVisitPRTime
 | 
			
		||||
       ? lazy.PlacesUtils.toDate(lastVisitPRTime).getTime()
 | 
			
		||||
       : undefined;
 | 
			
		||||
-
 | 
			
		||||
+    let pinnedTitle = row.getResultByIndex(QUERYINDEX_PINNEDTITLE);
 | 
			
		||||
+    let pinnedUrl = row.getResultByIndex(QUERYINDEX_PINNEDURL);
 | 
			
		||||
+    
 | 
			
		||||
+    
 | 
			
		||||
     let match = {
 | 
			
		||||
       placeId,
 | 
			
		||||
-      value: url,
 | 
			
		||||
-      comment: bookmarkTitle || historyTitle,
 | 
			
		||||
+      value: pinnedUrl || url,
 | 
			
		||||
+      comment: pinnedTitle || bookmarkTitle || historyTitle,
 | 
			
		||||
       icon: UrlbarUtils.getIconForUrl(url),
 | 
			
		||||
       frecency: frecency || FRECENCY_DEFAULT,
 | 
			
		||||
       userContextId,
 | 
			
		||||
@@ -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
 | 
			
		||||
index d5382623595de8daed8cd13ea2eb2de329a4bd92..3b33e083c40f70a97d153934f2eb6ba73bf986b5 100644
 | 
			
		||||
index e17f3d34367d6567c89f632b6d1ce537608a6829..7528dfb0abc8ea8d9315591cd529a341b4c3962a 100644
 | 
			
		||||
--- a/browser/components/urlbar/UrlbarView.sys.mjs
 | 
			
		||||
+++ b/browser/components/urlbar/UrlbarView.sys.mjs
 | 
			
		||||
@@ -609,7 +609,7 @@ export class UrlbarView {
 | 
			
		||||
@@ -11,6 +11,15 @@ index d5382623595de8daed8cd13ea2eb2de329a4bd92..3b33e083c40f70a97d153934f2eb6ba7
 | 
			
		||||
         // Try to reuse the cached top-sites context. If it's not cached, then
 | 
			
		||||
         // there will be a gap of time between when the input is focused and
 | 
			
		||||
         // when the view opens that can be perceived as flicker.
 | 
			
		||||
@@ -1325,7 +1325,7 @@ export class UrlbarView {
 | 
			
		||||
           includeHiddenExposures: true,
 | 
			
		||||
         });
 | 
			
		||||
       let canBeVisible =
 | 
			
		||||
-        newSpanCount <= this.#queryContext.maxResults && !seenMisplacedResult;
 | 
			
		||||
+        newSpanCount < this.#queryContext.maxResults && !seenMisplacedResult;
 | 
			
		||||
       if (result.isHiddenExposure) {
 | 
			
		||||
         if (canBeVisible) {
 | 
			
		||||
           this.controller.engagementEvent.addExposure(
 | 
			
		||||
@@ -2975,7 +2975,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
 | 
			
		||||
index 14183ad7165dc91126b4409b26f669409c4e9905..be979225b89b193b9e9c8903de5740dc04a8999f 100644
 | 
			
		||||
index a00011de585a40b91d33364a04c6bf5c86145ecd..f98b6d11519a80aff307513fd77361179f9914a4 100644
 | 
			
		||||
--- a/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",
 | 
			
		||||
     {
 | 
			
		||||
       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
 | 
			
		||||
index a9dc6fb90caa50a9ba9ec63a6cd90b4d8dcc2bc0..48d11c0c5a3b926d2d29c30d1ca8630941514210 100644
 | 
			
		||||
index 8c33192e589de1d819cbb21c31cec0480ed4c85e..9db296363303c153dc05ad9e85493f1197bb1efd 100644
 | 
			
		||||
--- a/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_CLEANUP=A Little Housekeeping…
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
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
 | 
			
		||||
+++ b/browser/modules/ExtensionsUI.sys.mjs
 | 
			
		||||
@@ -436,7 +436,7 @@ export var ExtensionsUI = {
 | 
			
		||||
@@ -466,7 +466,7 @@ export var ExtensionsUI = {
 | 
			
		||||
         eventCallback,
 | 
			
		||||
         removeOnDismissal: true,
 | 
			
		||||
         popupOptions: {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
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
 | 
			
		||||
+++ 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/",
 | 
			
		||||
     },
 | 
			
		||||
   ],
 | 
			
		||||
@@ -13,6 +13,4 @@ index 081187147736f56abfe5866a69e00ac13a8dd940..9a980fe858c1a77af7634037aebc332d
 | 
			
		||||
-      path: "resource://builtin-themes/alpenglow/",
 | 
			
		||||
-    },
 | 
			
		||||
-  ],
 | 
			
		||||
   [
 | 
			
		||||
     "2022red-colorway@mozilla.org",
 | 
			
		||||
     {
 | 
			
		||||
 ]);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,22 +0,0 @@
 | 
			
		||||
diff --git a/browser/themes/BuiltInThemes.sys.mjs b/browser/themes/BuiltInThemes.sys.mjs
 | 
			
		||||
index cc7f6cf93e04d339fb79a028b1e5ac6e79eae9c3..85e0d653f9a6d577bdea2a1c9d53018dd45684fa 100644
 | 
			
		||||
--- a/browser/themes/BuiltInThemes.sys.mjs
 | 
			
		||||
+++ b/browser/themes/BuiltInThemes.sys.mjs
 | 
			
		||||
@@ -74,7 +74,7 @@ class _BuiltInThemes {
 | 
			
		||||
   maybeInstallActiveBuiltInTheme() {
 | 
			
		||||
     const activeThemeID = Services.prefs.getStringPref(
 | 
			
		||||
       kActiveThemePref,
 | 
			
		||||
-      "default-theme@mozilla.org"
 | 
			
		||||
+      "firefox-compact-dark@mozilla.org"
 | 
			
		||||
     );
 | 
			
		||||
     let activeBuiltInTheme = this.builtInThemeMap.get(activeThemeID);
 | 
			
		||||
 
 | 
			
		||||
@@ -166,7 +166,7 @@ class _BuiltInThemes {
 | 
			
		||||
   async _uninstallExpiredThemes() {
 | 
			
		||||
     const activeThemeID = Services.prefs.getStringPref(
 | 
			
		||||
       kActiveThemePref,
 | 
			
		||||
-      "default-theme@mozilla.org"
 | 
			
		||||
+      "firefox-compact-dark@mozilla.org"
 | 
			
		||||
     );
 | 
			
		||||
     const now = new Date();
 | 
			
		||||
     const expiredThemes = Array.from(this.builtInThemeMap.entries()).filter(
 | 
			
		||||
@@ -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,20 +1,18 @@
 | 
			
		||||
diff --git a/browser/themes/linux/browser.css b/browser/themes/linux/browser.css
 | 
			
		||||
index 5c9891e5ed4b865ed4ecc98d794a239b0f96a8f9..e13bf7277edeb49ebbb12cf9359ac6193bb47ebd 100644
 | 
			
		||||
index 195cf888a61893cc9b0015e07e27bce94ec9d409..5f4cb6a1922730e8a0f1e9ad04169fb092917938 100644
 | 
			
		||||
--- a/browser/themes/linux/browser.css
 | 
			
		||||
+++ b/browser/themes/linux/browser.css
 | 
			
		||||
@@ -42,21 +42,25 @@
 | 
			
		||||
@@ -42,7 +42,8 @@
 | 
			
		||||
     -moz-default-appearance: -moz-window-decorations;
 | 
			
		||||
     appearance: auto;
 | 
			
		||||
 
 | 
			
		||||
-    #navigator-toolbox,
 | 
			
		||||
-    dialog::backdrop {
 | 
			
		||||
+    #zen-main-app-wrapper,
 | 
			
		||||
+    dialog::backdrop,
 | 
			
		||||
+    #browser::after,
 | 
			
		||||
+    #browser::before {
 | 
			
		||||
+    #zen-browser-background,
 | 
			
		||||
     dialog::backdrop {
 | 
			
		||||
       border-top-left-radius: env(-moz-gtk-csd-titlebar-radius);
 | 
			
		||||
       border-top-right-radius: env(-moz-gtk-csd-titlebar-radius);
 | 
			
		||||
     }
 | 
			
		||||
@@ -50,13 +51,14 @@
 | 
			
		||||
 
 | 
			
		||||
     /* stylelint-disable-next-line media-query-no-invalid */
 | 
			
		||||
     @media -moz-pref("widget.gtk.rounded-bottom-corners.enabled") {
 | 
			
		||||
@@ -27,8 +25,7 @@ index 5c9891e5ed4b865ed4ecc98d794a239b0f96a8f9..e13bf7277edeb49ebbb12cf9359ac619
 | 
			
		||||
       body,
 | 
			
		||||
-      dialog::backdrop {
 | 
			
		||||
+      dialog::backdrop,
 | 
			
		||||
+      #browser::after,
 | 
			
		||||
+      #browser::before {
 | 
			
		||||
+      #zen-browser-background {
 | 
			
		||||
         /* Use an uniform clip to allow WebRender to optimize it better */
 | 
			
		||||
         border-radius: env(-moz-gtk-csd-titlebar-radius);
 | 
			
		||||
       }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
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
 | 
			
		||||
+++ b/browser/themes/osx/browser.css
 | 
			
		||||
@@ -38,7 +38,7 @@
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user