Compare commits

...

78 Commits

Author SHA1 Message Date
mr. m
04e7db5d3a gh-15384: Sync upstream Firefox to version 156.0 (gh-15409) 2026-09-15 23:06:35 +02:00
mr. m
644bf48b6c gh-13196: Fixed sidebar not hiding if the urlbar is open (gh-15403) 2026-09-14 20:56:36 +02:00
Kyle Montag
d2acc61a88 gh-15402: Add archived:false to github live folder queries (gh-14854)
Signed-off-by: Kyle Montag <KMontag42@users.noreply.github.com>
2026-09-14 19:52:56 +02:00
mr. m
f84278317f gh-15400: Fixed duplicate paste and go items (gh-15401) 2026-09-14 15:03:58 +02:00
Alain Stulz
4980f3ce18 gh-10577: Add various requested url bar actions (gh-15376)
Co-authored-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>
Signed-off-by: Alain Stulz <ast3150@gmail.com>
2026-09-14 09:42:23 +02:00
Patrick Wozniak
5362ddbccd gh-14171: Fix cross-space routing tab lifecycle races (gh-14832)
Co-authored-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>
2026-09-14 09:27:31 +02:00
mr. m
6c32eaad68 gh-15384: Fix windows builds for Firefox 156.0 (gh-15399) 2026-09-14 02:33:15 +02:00
mr. m
610e7bfbae gh-15384: Sync upstream Firefox to version 156.0 (gh-15385) 2026-09-14 01:33:43 +02:00
doruk
b43785de65 gh-15387: Fix #writeToDom crash when mod has checkbox preferences (gh-15388) 2026-09-14 01:33:21 +02:00
Ashvin Jangid
787f9c5e02 gh-15393: Remove corner-shape from loading-progress-bar and statuspanel (gh-15394) 2026-09-13 13:19:49 +02:00
doruk
22961e97d8 gh-15363: Fix boost font shuffle off-by-one index (gh-15365) 2026-09-11 14:35:24 +02:00
mr. m
cb6a607c67 gh-15362: Prevent window captions appearing as squircles (gh-15364) 2026-09-11 14:25:26 +02:00
mr. m
267c9aabe1 gh-15353: Prevent popups from being too rounded on linux (gh-15354) 2026-09-11 09:37:47 +02:00
doruk
d54e12359c gh-15355: Fix folder unload TypeError by using String.includes (gh-15347) 2026-09-11 09:37:37 +02:00
mr. m
c89645a787 gh-15344: Fixed restoring tabs with static icons being cleared (gh-15345) 2026-09-11 01:23:58 +02:00
mr. m
0a548c7572 gh-15329: Prevent split view preview from opening for multiple tabs (gh-15340) 2026-09-10 22:20:12 +02:00
mr. m
6d158223b5 gh-15123: Fixed not spawining any native messaging host (gh-15328) 2026-09-10 10:47:35 +02:00
mr. m
76fcd5c822 gh-15026: Revert "Improve scrolling performance" (gh-15327) 2026-09-10 10:32:48 +02:00
Brandon Quon
ed6900d762 gh-14938: Fix CWLO for only pinned/essential tabs (gh-15324) 2026-09-10 10:27:53 +02:00
mr. m
2e9aecd41b gh-6302: Remove corner shape for browser stack rendering (gh-15318) 2026-09-09 19:35:46 +02:00
mr. m
da995e8653 gh-15313: Make sure to bootstrap before doing release builds (gh-15314) 2026-09-09 13:15:17 +02:00
mr. m
64d73ab3e3 gh-14956: Check if the closing tab exists on the tab list before switching (gh-15312) 2026-09-09 13:13:40 +02:00
Brandon Quon
9551444c61 gh-15260: Fix essentials appearing during workspace creation (gh-15307)
Co-authored-by: mr. m <mr.m@tuta.com>
2026-09-09 08:34:59 +02:00
mr. m
fdf9588b7b gh-15026: Improve scrolling performance (gh-15306) 2026-09-09 02:13:38 +02:00
mr. m
b07b17c87e gh-15304: Revert urlbar when searching with an alias (gh-15305) 2026-09-09 01:39:13 +02:00
mr. m
c9d3cb3dc9 gh-15297: Fixed synced tabs losing their icon when they are unloaded (gh-15298) 2026-09-08 20:14:23 +02:00
KiKaraage
2c030369c5 gh-15288: add missing margin for space selector in BMPanel (gh-15286)
Signed-off-by: KiKaraage <kikaraage@tuta.io>
2026-09-08 18:48:07 +02:00
Brandon Quon
88a90206ce gh-14755: fix duplicated owned tabs leaving folders (gh-15285) 2026-09-08 18:24:10 +02:00
Andrey Bochkarev
6d398dec63 gh-15295: Correct tab index calculation for CWLO (gh-15293) 2026-09-08 18:22:23 +02:00
mr. m
243a8791a0 gh-15279: Wait for all windows to be restored before syncing (gh-15294) 2026-09-08 18:13:33 +02:00
Brandon Quon
412731f37e gh-15155: Fix tab moving to bottom of tab list (gh-15246) 2026-09-07 22:54:02 +02:00
mr. m
7a78848177 gh-15266: Add support for sharing spaces, folders and split views (gh-15283) 2026-09-07 22:28:09 +02:00
mr. m
a323036995 gh-15266: Add support for sharing spaces, folders and split views (gh-15267) 2026-09-07 01:11:02 +02:00
Harsh Varshney
abc69a1fcb gh-15188: Fixed invisible download progress bar in Library when unselected (gh-15251)
Signed-off-by: Harsh Varshney <92783708+Iron0utlaw@users.noreply.github.com>
2026-09-06 17:52:30 +02:00
mr. m
8df45e5c9a gh-15247: Add support for cross-device normal tabs (gh-15250) 2026-09-06 02:42:59 +02:00
mr. m
58e83c137f gh-15244: Fixed creatin a new space not selecting the empty tab (gh-15245) 2026-09-05 20:25:24 +02:00
mr. m
4f3bcb2f32 gh-15237: Sync upstream Firefox to version 155.0.1 (gh-15238) 2026-09-04 20:06:45 +02:00
mr. m
c209ea72c1 gh-15234: Fixed issues live folders not loading (gh-15235) 2026-09-04 17:51:08 +02:00
mr. m
55b71754f3 gh-15232: Fixed syncing themes not updating the color scheme (gh-15233) 2026-09-04 12:57:47 +02:00
mr. m
6af79fd621 gh-15226: Fixed Windows build failures (gh-15227) 2026-09-04 01:58:03 +02:00
mr. m
57196c1464 gh-15144: Add flag to skip update windows certs (gh-15225) 2026-09-03 22:09:18 +02:00
mr. m
43d47ac537 gh-14470: Make sure sidebar is initialized before syncing (gh-15219) 2026-09-03 11:17:28 +02:00
mr. m
a8a94c14a4 gh-15202: Sync upstream Firefox to version 155.0 (gh-15201) 2026-09-03 01:35:51 +02:00
mr. m
3655afbe13 gh-15089: Prevent folder expansion on sync (gh-15197) 2026-09-02 02:29:59 +02:00
mr. m
bb023ac5b1 gh-15191: Fixed collapse indicator still showing when deleting a folder (gh-15192) 2026-09-01 13:51:06 +02:00
mr. m
faafff667e gh-15144: Fixed installing updates does not updating registries (gh-15181) 2026-09-01 02:07:53 +02:00
Nikola Hristov
8b632c9b05 gh-15182: Fix tab changing when handling tab close when group collapses (gh-15183) 2026-08-31 20:52:19 +02:00
mr. m
67b6daaa0e gh-15177: Improve on-boarding experience and new space form UX (gh-15178) 2026-08-31 02:52:10 +02:00
mr. m
e89bd7796e gh-15154: Fixed stale containers trying to sync across devices (gh-15166) 2026-08-30 00:42:45 +02:00
mr. m
66c5931a29 gh-15163: Sync upstream Firefox to version 155.0 RC (gh-15164) 2026-08-30 00:26:45 +02:00
Fernando Omori
a5585c5619 gh-14380: Fix sidebar width getting stuck when toggling layout on the right side (gh-15092) 2026-08-29 12:35:31 +02:00
mr. m
2326d2b56b gh-15157: Add support for squircles on the Chrome UI (gh-14009) 2026-08-29 12:35:17 +02:00
mr. m
9ef1d96c00 Revert "gh-15144: Update windows registry on update" (gh-15153) 2026-08-29 01:34:29 +02:00
Nikola Hristov
432f93770f gh-15146: Fix bad current view index after removing a group (gh-15147) 2026-08-28 19:58:05 +02:00
mr. m
f28e0688fb gh-15144: Update windows registry on update (gh-15145) 2026-08-28 11:55:40 +02:00
Nikola Hristov
8df6fef1ac gh-15115: Tests for urlbar close and split view (gh-15118)
Co-authored-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>
2026-08-27 23:45:37 +02:00
mr. m
4746d36699 gh-15088: Prevent sync if engine is already applying (gh-15137) 2026-08-27 23:38:47 +02:00
Nikola Hristov
9e0c790602 gh-15134: Fixes tab removed from group getting focused (gh-15135)
Closes https://github.com/zen-browser/desktop/issues/15134

Fix video:

https://github.com/user-attachments/assets/1c06ea7f-d482-4d4a-8bbe-df41daa27616
2026-08-27 22:40:43 +02:00
mr. m
3d53b37e8b gh-15119: Update windows registry with old certificates (gh-15120) 2026-08-26 17:51:09 +02:00
Nikola Hristov
e7ddfb52db gh-15115: Fix creating empty split view with url bar open (gh-15116) 2026-08-26 13:16:13 +02:00
mr. m
ba70449bdd gh-15088: Add debug log for space sync (gh-15117) 2026-08-26 12:23:52 +02:00
mr. m
bf40c31149 gh-14710: Fixed minimizing PiP window failing to collapse into the sidebar (gh-15111) 2026-08-26 08:30:00 +02:00
mr. m
7a093beae4 gh-15084: Fixed incoming tab icons applying to active tabs (gh-15107) 2026-08-25 22:31:50 +02:00
mr. m
03b4e934fe gh-15091: Fixed race condition when syncing new space and container (gh-15106) 2026-08-25 22:21:19 +02:00
mr. m
b93d19b873 gh-15088: Fixed syncing essentials with different containers (gh-15105) 2026-08-25 22:05:54 +02:00
mr. m
b9c4000fe2 gh-15101: Sync upstream Firefox to version 154.0.1 (gh-15100) 2026-08-25 19:37:07 +02:00
mr. m
0b7687ec6d gh-14990: Prevent policyContainer from bloating the session file (gh-15098) 2026-08-25 13:41:10 +02:00
mr. m
d70b3d902c gh-15085: Import mochitests for remote settings (gh-15086) 2026-08-24 22:52:33 +02:00
mr. m
f9f8f2f372 gh-15075: Fixed syncing new tabs not using static labels (gh-15079)
Fixes https://github.com/zen-browser/desktop/issues/15075
2026-08-24 18:27:50 +02:00
mr. m
99dca42723 gh-14470: Prevent state override if url changed (gh-15070) 2026-08-23 16:40:30 +02:00
Henrik Nyh
ed0a6fd447 gh-15039: Use Title Case for split view labels (gh-15059) 2026-08-23 12:21:34 +02:00
CocoLng
88c6611f1e gh-15039: Fix New Blank Window menu entry not in Title Case (gh-15056) 2026-08-22 10:08:37 +02:00
mr. m
e66e763e63 gh-14470: Fixed wrong data image being used for sync (gh-15048) 2026-08-21 09:44:49 +02:00
mr. m
721135f576 gh-14470: Fixed moz-remote-urls not being synced correctly (gh-15043) 2026-08-21 01:24:25 +02:00
mr. m
d8a934d2ec gh-15029: Fixed urlbar suggestion context not working (gh-15037) 2026-08-20 21:57:35 +02:00
mr. m
91a1d4d2ca gh-14470: Run sweep animation on first sync (gh-15036) 2026-08-20 21:38:09 +02:00
mr. m
97577dac26 gh-15031: Fixed duplicate separator on tab context menu (gh-15035) 2026-08-20 21:18:13 +02:00
Kristijan Ribarić
5723a89bcd gh-14470: Add tab and folder sync support (gh-13984)
Co-authored-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>
2026-08-20 19:16:13 +02:00
768 changed files with 93971 additions and 4350 deletions

2
.gitattributes vendored
View File

@@ -5,4 +5,4 @@
*.patch linguist-language=C++
*.d.ts linguist-language=TypeScript
src/zen/tests/*.js linguist-language=Test
src/zen/tests/** linguist-language=C++

View File

@@ -26,6 +26,11 @@ on:
required: true
type: "boolean"
default: false
disable-pgo:
description: "Build without PGO (skips the profile generation stages)"
required: false
type: "boolean"
default: false
workflow_call:
inputs:
create_release:
@@ -48,6 +53,11 @@ on:
required: true
type: "boolean"
default: false
disable-pgo:
description: "Build without PGO (skips the profile generation stages)"
required: false
type: "boolean"
default: false
jobs:
buildid:
@@ -73,6 +83,7 @@ jobs:
echo "create_release: ${{ inputs.create_release }}"
echo "update_version: ${{ inputs.update_version }}"
echo "use sccache: ${{ inputs.use-sccache }}"
echo "disable-pgo: ${{ inputs.disable-pgo }}"
echo "update_branch: ${{ inputs.update_branch }}"
echo "GITHUB_REPOSITORY: ${{ github.repository }}"
echo "GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }}"
@@ -102,14 +113,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Download aws-cli
if: ${{ inputs.create_release && inputs.update_branch == 'release' }}
if: ${{ inputs.update_branch == 'release' }}
run: |
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install --update
- name: Start self-hosted runner
if: ${{ inputs.create_release && inputs.update_branch == 'release' }}
if: ${{ inputs.update_branch == 'release' }}
run: |
echo "Starting self-hosted runner"
echo "${{ secrets.SELF_HOSTED_RUNNER_START_SCRIPT }}" | base64 -d > start.sh
@@ -117,7 +128,7 @@ jobs:
bash ./start.sh
- name: Remove self-hosted runner script
if: always() && ${{ inputs.create_release && inputs.update_branch == 'release' }}
if: always() && ${{ inputs.update_branch == 'release' }}
run: |
echo "Removing self-hosted runner script"
rm start.sh || true
@@ -280,6 +291,7 @@ jobs:
windows-step-1:
name: Windows build step 1 (PGO build)
uses: ./.github/workflows/windows-release-build.yml
if: ${{ !inputs.disable-pgo }}
needs: [build-data, buildid]
permissions:
contents: write
@@ -295,6 +307,7 @@ jobs:
windows-step-2:
name: Windows build step 2 (Generate profile data)
uses: ./.github/workflows/windows-profile-build.yml
if: ${{ !inputs.disable-pgo }}
permissions:
contents: write
secrets: inherit
@@ -310,10 +323,13 @@ jobs:
permissions:
contents: write
secrets: inherit
# windows-step-2 is skipped when PGO is disabled, so don't inherit its skip
if: ${{ !failure() && !cancelled() }}
needs: [build-data, windows-step-2, start-self-host, buildid]
with:
build-version: ${{ needs.build-data.outputs.version }}
generate-pgo: false
disable-pgo: ${{ inputs.disable-pgo }}
release-branch: ${{ inputs.update_branch }}
MOZ_BUILD_DATE: ${{needs.buildid.outputs.buildids}}
use-sccache: ${{ inputs.use-sccache }}
@@ -330,10 +346,12 @@ jobs:
release-branch: ${{ inputs.update_branch }}
MOZ_BUILD_DATE: ${{needs.buildid.outputs.buildids}}
use-sccache: ${{ inputs.use-sccache }}
disable-pgo: ${{ inputs.disable-pgo }}
mac-step-1:
name: macOS build step 1 (PGO build)
uses: ./.github/workflows/macos-release-build.yml
if: ${{ !inputs.disable-pgo }}
needs: [build-data, buildid]
permissions:
contents: write
@@ -348,6 +366,7 @@ jobs:
mac-step-2:
name: macOS build step 2 (Generate profile data)
uses: ./.github/workflows/macos-profile-build.yml
if: ${{ !inputs.disable-pgo }}
permissions:
contents: write
secrets: inherit
@@ -362,10 +381,13 @@ jobs:
permissions:
contents: write
secrets: inherit
# mac-step-2 is skipped when PGO is disabled, so don't inherit its skip
if: ${{ !failure() && !cancelled() }}
needs: [build-data, mac-step-2, start-self-host, buildid]
with:
build-version: ${{ needs.build-data.outputs.version }}
generate-pgo: false
disable-pgo: ${{ inputs.disable-pgo }}
release-branch: ${{ inputs.update_branch }}
MOZ_BUILD_DATE: ${{needs.buildid.outputs.buildids}}
use-sccache: ${{ inputs.use-sccache }}
@@ -470,14 +492,14 @@ jobs:
if: always()
steps:
- name: Download aws-cli
if: ${{ inputs.create_release && inputs.update_branch == 'release' }}
if: ${{ inputs.update_branch == 'release' }}
run: |
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install --update
- name: Stop self-hosted runner
if: ${{ inputs.create_release && inputs.update_branch == 'release' }}
if: ${{ inputs.update_branch == 'release' }}
run: |
echo "Stopping self-hosted runner"
echo "${{ secrets.SELF_HOSTED_RUNNER_STOP_SCRIPT }}" | base64 -d > stop.sh
@@ -485,13 +507,12 @@ jobs:
bash ./stop.sh > /dev/null
- name: Remove self-hosted runner script
if: always() && ${{ inputs.create_release && inputs.update_branch == 'release' }}
if: always() && ${{ inputs.update_branch == 'release' }}
run: |
echo "Removing self-hosted runner script"
rm stop.sh || true
release:
if: ${{ inputs.create_release || inputs.update_branch == 'twilight' }}
permissions: write-all
name: Release
needs:
@@ -585,6 +606,7 @@ jobs:
- name: Commit
uses: stefanzweifel/git-auto-commit-action@v5
if: ${{ inputs.create_release || inputs.update_branch == 'twilight' }}
with:
commit_message: 🚀 Update update manifests
commit_user_name: Zen Browser Robot
@@ -628,9 +650,22 @@ jobs:
env:
GITHUB_REPOSITORY: ${{ github.repository }}
- name: Upload signed MAR files to workflow artifacts
if: ${{ inputs.update_branch == 'release' && !inputs.create_release }}
uses: actions/upload-artifact@v4
with:
retention-days: 5
name: signed-mar-files
path: |
./linux.mar/*
./linux-aarch64.mar/*
./.github/workflows/object/windows-x64-signed-x86_64/windows.mar
./.github/workflows/object/windows-x64-signed-arm64/windows-arm64.mar
./macos.mar/*
- name: Release
uses: softprops/action-gh-release@v2.2.2
if: ${{ inputs.update_branch == 'release' }}
if: ${{ inputs.update_branch == 'release' && inputs.create_release }}
with:
token: ${{ secrets.DEPLOY_KEY }}
tag_name: ${{ needs.build-data.outputs.version }}

View File

@@ -20,6 +20,11 @@ on:
required: true
type: boolean
default: false
disable-pgo:
description: "Build without PGO at all"
required: false
type: boolean
default: false
jobs:
build-linux:
@@ -105,6 +110,8 @@ jobs:
SURFER_COMPAT: ${{ matrix.arch }}
SURFER_CERT_PATCH_ISSUER: ${{ secrets.SURFER_CERT_PATCH_ISSUER }}
SURFER_CERT_PATCH_NAME: ${{ secrets.SURFER_CERT_PATCH_NAME }}
SURFER_CERT_PATCH_NAME_PREV: ${{ secrets.SURFER_CERT_PATCH_NAME_PREV }}
SURFER_CERT_PATCH_ISSUER_PREV: ${{ secrets.SURFER_CERT_PATCH_ISSUER_PREV }}
run: |
. "$HOME/.cargo/env"
npm run import
@@ -120,7 +127,7 @@ jobs:
cd ..
- name: Build (PGO stage 1 - generate)
if: ${{ matrix.arch == 'x86_64' }}
if: ${{ matrix.arch == 'x86_64' && !inputs.disable-pgo }}
env:
SURFER_COMPAT: ${{ matrix.arch }}
ZEN_RELEASE_BRANCH: ${{ inputs.release-branch }}
@@ -137,7 +144,7 @@ jobs:
bash .github/workflows/src/release-build.sh
- name: Generate PGO profile data
if: ${{ matrix.arch == 'x86_64' }}
if: ${{ matrix.arch == 'x86_64' && !inputs.disable-pgo }}
run: |
set -x
export DISPLAY=:2
@@ -155,6 +162,7 @@ jobs:
env:
SURFER_COMPAT: ${{ matrix.arch }}
ZEN_RELEASE_BRANCH: ${{ inputs.release-branch }}
ZEN_GA_DISABLE_PGO: ${{ inputs.disable-pgo && '1' || '' }}
ZEN_SAFEBROWSING_API_KEY: ${{ secrets.ZEN_SAFEBROWSING_API_KEY }}
ZEN_MOZILLA_API_KEY: ${{ secrets.ZEN_MOZILLA_API_KEY }}
ZEN_GOOGLE_LOCATION_SERVICE_API_KEY: ${{ secrets.ZEN_GOOGLE_LOCATION_SERVICE_API_KEY }}

View File

@@ -23,7 +23,6 @@ jobs:
fail-fast: false
matrix:
arch: [x86_64, aarch64]
runs-on: ${{ matrix.arch == 'x86_64' && 'macos-15-intel' || 'macos-26' }}
steps:

View File

@@ -10,6 +10,11 @@ on:
required: true
type: boolean
default: false
disable-pgo:
description: "Build without PGO at all"
required: false
type: boolean
default: false
build-version:
description: "The version to build"
required: true
@@ -122,6 +127,8 @@ jobs:
SURFER_COMPAT: ${{ matrix.arch }}
SURFER_CERT_PATCH_ISSUER: ${{ secrets.SURFER_CERT_PATCH_ISSUER }}
SURFER_CERT_PATCH_NAME: ${{ secrets.SURFER_CERT_PATCH_NAME }}
SURFER_CERT_PATCH_NAME_PREV: ${{ secrets.SURFER_CERT_PATCH_NAME_PREV }}
SURFER_CERT_PATCH_ISSUER_PREV: ${{ secrets.SURFER_CERT_PATCH_ISSUER_PREV }}
SURFER_PLATFORM: darwin
run: |
. "$HOME/.cargo/env"
@@ -138,13 +145,13 @@ jobs:
- name: Download artifact (if use profdata)
uses: actions/download-artifact@v4
if: ${{ !inputs.generate-pgo }}
if: ${{ !inputs.generate-pgo && !inputs.disable-pgo }}
with:
path: ~/artifact
name: macos-profdata-${{ matrix.arch }}
- name: Show artifact info
if: ${{ !inputs.generate-pgo }}
if: ${{ !inputs.generate-pgo && !inputs.disable-pgo }}
run: |
ls ~/artifact
ls ~/artifact/en-US.log
@@ -164,6 +171,9 @@ jobs:
if test ${{ inputs.generate-pgo }} = true; then
export ZEN_GA_GENERATE_PROFILE=1
fi
if test ${{ inputs.disable-pgo }} = true; then
export ZEN_GA_DISABLE_PGO=1
fi
if [[ -n ${{ inputs.MOZ_BUILD_DATE }} ]];then
export MOZ_BUILD_DATE=${{ inputs.MOZ_BUILD_DATE }}
fi

View File

@@ -27,7 +27,6 @@ jobs:
fail-fast: false
matrix:
arch: [x86_64, aarch64]
runs-on: ${{ inputs.release-branch == 'release' && 'windows-latest' || 'windows-latest' }}
steps:

View File

@@ -10,6 +10,11 @@ on:
required: true
type: boolean
default: false
disable-pgo:
description: "Build without PGO at all"
required: false
type: boolean
default: false
build-version:
description: "The version to build"
required: true
@@ -166,6 +171,8 @@ jobs:
SURFER_COMPAT: ${{ matrix.arch }}
SURFER_CERT_PATCH_ISSUER: ${{ secrets.SURFER_CERT_PATCH_ISSUER }}
SURFER_CERT_PATCH_NAME: ${{ secrets.SURFER_CERT_PATCH_NAME }}
SURFER_CERT_PATCH_NAME_PREV: ${{ secrets.SURFER_CERT_PATCH_NAME_PREV }}
SURFER_CERT_PATCH_ISSUER_PREV: ${{ secrets.SURFER_CERT_PATCH_ISSUER_PREV }}
run: |
. "$HOME/.cargo/env"
npm run import -- --verbose
@@ -200,8 +207,10 @@ jobs:
fi
# Stored in build/windows/.windows-rs-version
WINDOWS_RS_VERSION=$(cat build/windows/.windows-rs-version)
curl -fsSL "https://static.crates.io/crates/cargo-download/cargo-download-0.1.2.crate" | tar xz -C /tmp
(cd /tmp/cargo-download-0.1.2 && cargo generate-lockfile && cargo update tinyvec --precise 1.12.0)
RUSTFLAGS="--cap-lints=allow" cargo install --path /tmp/cargo-download-0.1.2 --locked
cd engine/
cargo install cargo-download --locked
cargo download -x windows=$WINDOWS_RS_VERSION
export CARGO_INCREMENTAL=0
echo "" >> ../configs/common/mozconfig
@@ -213,13 +222,13 @@ jobs:
- name: Download artifact (if use profdata)
uses: actions/download-artifact@v4
if: ${{ !inputs.generate-pgo && matrix.arch == 'x86_64' }}
if: ${{ !inputs.generate-pgo && !inputs.disable-pgo && matrix.arch == 'x86_64' }}
with:
path: ~/artifact
name: windows-profdata-${{ matrix.arch == 'aarch64' && 'arm64' || matrix.arch }}
- name: Show artifact info
if: ${{ !inputs.generate-pgo && matrix.arch == 'x86_64' }}
if: ${{ !inputs.generate-pgo && !inputs.disable-pgo && matrix.arch == 'x86_64' }}
run: |
ls ~/artifact
ls ~/artifact/en-US.log
@@ -244,6 +253,9 @@ jobs:
if test ${{ inputs.generate-pgo }} = true; then
export ZEN_GA_GENERATE_PROFILE=1
fi
if test ${{ inputs.disable-pgo }} = true; then
export ZEN_GA_DISABLE_PGO=1
fi
if [[ -n ${{ inputs.MOZ_BUILD_DATE }} ]];then
export MOZ_BUILD_DATE=${{ inputs.MOZ_BUILD_DATE }}
fi

View File

@@ -1 +1 @@
1.94.1
1.95.0

View File

@@ -34,8 +34,8 @@ Zen is a firefox-based browser with the aim of pushing your productivity to a ne
### Firefox Versions
- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `154.0`! 🚀
- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 154.0`!
- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `156.0`!
- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 156.0`!
### Contributing

View File

@@ -1 +1 @@
1fb0703fa9723fd9c400ad60d18e64ee4f9bf125
07c99209a6e4c794752e9a242215199ad3ea10f6

View File

@@ -3,8 +3,6 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
param(
[string][Parameter(Mandatory=$true)]$SignIdentity,
[string][Parameter(Mandatory=$true)]$SignIdentityIssuer,
[string][Parameter(Mandatory=$true)]$GithubRunId
)
@@ -24,11 +22,15 @@ mkdir windsign-temp -ErrorAction SilentlyContinue
# echo "Downloaded git objects repo to"
#} -Verbose -ArgumentList $PWD -Debug
$token = gh auth token
$env:SURFER_MOZCONFIG_ONLY="1"
$env:SURFER_SIGNING_MODE=""
$env:SURFER_CERT_PATCH_ISSUER=$SignIdentityIssuer
$env:SURFER_CERT_PATCH_NAME=$SignIdentity
get-content "$PSScriptRoot/../.env" | foreach {
$name, $value = $_.split('=')
set-content env:\$name $value
}
Start-Job -Name "DownloadGitl10n" -ScriptBlock {
param($PWD)
@@ -46,7 +48,6 @@ npm run build
echo "Downloading artifacts info"
$artifactsInfo=gh api repos/zen-browser/desktop/actions/runs/$GithubRunId/artifacts
$token = gh auth token
function New-TemporaryDirectory {
$tmp = [System.IO.Path]::GetTempPath() # Not $env:TEMP, see https://stackoverflow.com/a/946017
@@ -146,9 +147,9 @@ function SignAndPackage($name) {
$env:ZEN_SETUP_EXE_PATH="$PWD\windsign-temp\windows-x64-obj-$name\browser\installer\windows\instgen\setup.exe"
if ($name -eq "arm64") {
$env:WIN32_REDIST_DIR="$PWD\win-cross\vs2026\VC\Redist\MSVC\14.50.35710\arm64\Microsoft.VC145.CRT"
$env:WIN32_REDIST_DIR="$PWD\win-cross\vs2026\VC\Redist\MSVC\14.51.36231\arm64\Microsoft.VC145.CRT"
} else {
$env:WIN32_REDIST_DIR="$PWD\win-cross\vs2026\VC\Redist\MSVC\14.50.35710\x64\Microsoft.VC145.CRT"
$env:WIN32_REDIST_DIR="$PWD\win-cross\vs2026\VC\Redist\MSVC\14.51.36231\x64\Microsoft.VC145.CRT"
}
$env:MAR="..\\build\\windows\\mar.exe"

View File

@@ -53,7 +53,10 @@ fi
if test "$ZEN_RELEASE"; then
ac_add_options --enable-clang-plugin
ac_add_options --enable-bootstrap=-sccache
if ! test "$ZEN_DISABLE_BOOTSTRAP"; then
ac_add_options --enable-bootstrap=-sccache
fi
ac_add_options --enable-optimize
@@ -69,16 +72,11 @@ if test "$ZEN_RELEASE"; then
ac_add_options --disable-geckodriver
ac_add_options --disable-rust-tests
if ! test "$ZEN_DISABLE_LTO"; then
# only enable full LTO when ZEN_RELEASE_BRANCH is 'release'
if test "$ZEN_RELEASE_BRANCH" = "release"; then
# TODO: make it "full" once we have the resources to build it
export MOZ_LTO=cross,full
ac_add_options --enable-lto=cross,full
else
export MOZ_LTO=cross,thin
ac_add_options --enable-lto=cross,thin
fi
if test "$ZEN_DISABLE_LTO"; then
ac_add_options --disable-lto
else
export MOZ_LTO=cross,thin
ac_add_options --enable-lto=cross,thin
fi
mk_add_options MOZILLA_OFFICIAL=1

View File

@@ -9,6 +9,9 @@ if test "$ZEN_RELEASE"; then
# Enable Profile Guided Optimization
if ! test "$ZEN_GA_DISABLE_PGO"; then
export MOZ_LTO=cross,full
ac_add_options --enable-lto=cross,full
if test "$ZEN_GA_GENERATE_PROFILE"; then
mk_add_options "export MOZ_AUTOMATION_PACKAGE_GENERATED_SOURCES=0"
ac_add_options --enable-profile-generate=cross

View File

@@ -15,9 +15,9 @@ if test "$ZEN_CROSS_COMPILING"; then
CROSS_COMPILE=1
if test "$SURFER_COMPAT" = "aarch64"; then
export WIN32_REDIST_DIR="$WINSYSROOT/VC/Redist/MSVC/14.50.35710/arm64/Microsoft.VC145.CRT"
export WIN32_REDIST_DIR="$WINSYSROOT/VC/Redist/MSVC/14.51.36231/arm64/Microsoft.VC145.CRT"
else
export WIN32_REDIST_DIR="$WINSYSROOT/VC/Redist/MSVC/14.50.35710/x64/Microsoft.VC145.CRT"
export WIN32_REDIST_DIR="$WINSYSROOT/VC/Redist/MSVC/14.51.36231/x64/Microsoft.VC145.CRT"
fi
fi
@@ -45,6 +45,9 @@ if test "$ZEN_CROSS_COMPILING"; then
ac_add_options --enable-profile-use=cross
ac_add_options --with-pgo-profile-path=$(echo ~)/artifact/merged.profdata
ac_add_options --with-pgo-jarlog=$(echo ~)/artifact/en-US.log
export MOZ_LTO=cross,full
ac_add_options --enable-lto=cross,full
fi
fi
fi

View File

@@ -26,3 +26,5 @@ files:
translation: browser/browser/zen-space-routing.ftl
- source: en-US/browser/browser/zen-command-palette.ftl
translation: browser/browser/zen-command-palette.ftl
- source: en-US/browser/browser/zen-share.ftl
translation: browser/browser/zen-share.ftl

View File

@@ -64,6 +64,14 @@ zen-tabs-select-recently-used-on-close =
zen-tabs-close-on-back-with-no-history =
.label = Close tab and switch to its owner tab (or most recently used tab) when going back with no history
zen-settings-workspaces-sync =
.label = Sync your sidebar across devices
.description = Keep your workspaces, pinned tabs and folders in sync on all your devices through your Mozilla account.
zen-settings-normal-tabs-sync =
.label = Include unpinned tabs
.description = Also sync the regular tabs of each space, not just your pinned tabs and folders.
zen-settings-workspaces-sync-unpinned-tabs =
.label = Sync only pinned tabs in workspaces

View File

@@ -5,6 +5,8 @@
zen-action-toggle-compact-mode = Toggle Compact Mode
zen-action-open-theme-picker = Open Theme Picker
zen-action-new-split-view = New Split View
zen-action-unsplit-view = Expand current view
zen-action-new-space = New Space
zen-action-new-folder = New Folder
zen-action-copy-current-url = Copy Current URL
zen-action-settings = Settings
@@ -18,6 +20,9 @@ zen-action-new-boost = New Boost
zen-action-next-space = Next Space
zen-action-previous-space = Previous Space
zen-action-close-tab = Close Tab
zen-action-reopen-closed-tab = Reopen Closed Tab
zen-action-duplicate-tab = Duplicate Current Tab
zen-action-reset-pinned-tab = Reset Pinned Tab
zen-action-reload-tab = Reload Tab
zen-action-reload-tab-without-cache = Reload Tab Without Cache
zen-action-next-tab = Next Tab

View File

@@ -164,5 +164,5 @@ zen-window-sync-migration-dialog-learn-more = Learn More
zen-window-sync-migration-dialog-accept = Got It
zen-appmenu-new-blank-window =
.label = New blank window
.label = New Blank Window

View File

@@ -0,0 +1,43 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
zen-share-space =
.label = Share Space…
zen-share-folder =
.label = Share Folder…
zen-share-split-view =
.label = Share Split View…
zen-share-link-copied-toast = Share link copied!
zen-share-link-expires-description = Anyone with the link can open it until { $date }
zen-share-link-permanent-description = Anyone with the link can open it
zen-share-error-toast = Couldn't create a share link
zen-share-error-auth-description = The share server rejected your key
zen-share-error-too-large-description = This share is too big to upload
zen-share-error-rate-limited-description = You're sharing too fast, try again in a minute
zen-share-error-network-description = Couldn't reach the share server
zen-share-error-empty-description = There's nothing shareable here
zen-share-error-server-description = The share server returned an error
zen-share-overlay-loading = Loading shared tabs…
zen-share-overlay-from-space = A Space from { $name }
zen-share-overlay-from-folder = A Folder from { $name }
zen-share-overlay-shared-with-you = Shared with you
zen-share-overlay-add-space = Add Space to Zen
zen-share-overlay-add-folder = Add Folder to Zen
zen-share-imported-toast = Added to your browser!
zen-share-import-error-toast = Couldn't import this share
zen-share-import-error-dead-description = The link has expired or doesn't exist
zen-share-import-error-invalid-description = The shared data is invalid
zen-share-confirm-title = Share link
zen-share-confirm-dialog =
.buttonlabelaccept = Share
zen-share-confirm-description = Zen uploads a copy of these tabs to the share server and copies a link anyone can open. The link expires after 30 days.
zen-share-confirm-anonymous = Sharing is anonymous unless you add a name.
zen-share-confirm-name-input =
.placeholder = Your name (optional)
zen-share-confirm-dont-ask =
.label = Don't ask me again

View File

@@ -5,14 +5,14 @@
tab-zen-split-tabs =
.label =
{ $tabCount ->
[-1] Split out tab
[1] Add split view...
[-1] Split Out Tab
[1] Add Split View...
*[other] Join { $tabCount } Tabs
}
.accesskey = S
zen-split-link =
.label = Split link to new tab
.label = Split Link to New Tab
.accesskey = S
zen-split-view-modifier-header = Split View

View File

@@ -5,29 +5,33 @@
zen-welcome-title-line1 = Welcome to
zen-welcome-title-line2 = a calmer internet
zen-welcome-import-title = A Fresh Start, Same Bookmarks
zen-welcome-import-description-1 = Your bookmarks, history, and passwords are like a trail of breadcrumbs through the internet—dont leave them behind!
zen-welcome-import-description-2 = Easily bring them over from another browser and pick up right where you left off.
zen-welcome-import-button = Import now
zen-welcome-back = Back
zen-welcome-skip = Skip for now
zen-welcome-set-default-browser = Set { -brand-short-name } as your default browser
zen-welcome-dont-set-default-browser = DONT set { -brand-short-name } as your default browser
zen-welcome-import-title = Bring your stuff along.
zen-welcome-import-description = Import your bookmarks, history and passwords from another browser and pick up right where you left off.
zen-welcome-import-yes = <strong>YES</strong>, import from another browser.
zen-welcome-import-no = <strong>NO</strong>, start fresh.
zen-welcome-initial-essentials-title = Your Key Tabs, Always Within Reach
zen-welcome-initial-essentials-description-1 = Keep your most important tabs easily accessible and always at hand, no matter how many you open.
zen-welcome-initial-essentials-description-2 = Essential tabs are always visible, no matter what workspace you are in.
zen-welcome-default-browser-title = Make { -brand-short-name } your default?
zen-welcome-default-browser-description = Links from other apps will open in { -brand-short-name }. You can always change this later.
zen-welcome-set-default-browser = <strong>YES</strong>, make { -brand-short-name } default.
zen-welcome-dont-set-default-browser = <strong>NO</strong>, still exploring my options.
zen-welcome-workspace-colors-title = Your Workspaces, Your Colors
zen-welcome-workspace-colors-description = Personalize your browser by giving each workspace its own unique color identity.
zen-welcome-start-browsing-title = All set?<br/>
Lets get rolling!
zen-welcome-start-browsing-description-1 = Youre all set up and ready to go. Click the button below to start browsing with { -brand-short-name }.
zen-welcome-start-browsing = Dive in!
zen-welcome-default-search-title = Your Default Search Engine
zen-welcome-default-search-title = Pick your search engine.
zen-welcome-default-search-description = Choose your default search engine. You can always change it later!
zen-welcome-skip-button = Skip
zen-welcome-essentials-title = Choose the apps you use most.
zen-welcome-essentials-description = Select your favorite apps to keep them handy in your sidebar.
zen-welcome-finished = Your Zen has been set up correctly!
zen-welcome-block-ads-title = Block ads and trackers?
zen-welcome-block-ads-description = { -brand-short-name } can install uBlock Origin for you, so pages load cleaner and faster. You can remove it any time.
zen-welcome-block-ads-yes = <strong>YES</strong>, block ads for me.
zen-welcome-block-ads-no = <strong>NO</strong>, show me everything.
zen-welcome-workspace-colors-title = Your space, your colors.
zen-welcome-workspace-colors-description = Personalize your browser by giving each space its own unique color identity.
zen-welcome-start-browsing-title = All set? Lets get rolling!
zen-welcome-start-browsing-description-1 = Youre all set up and ready to go. Click the button below to start browsing with { -brand-short-name }.
zen-welcome-start-browsing = Dive in!

View File

@@ -86,6 +86,8 @@ zen-workspace-default-profile = Default
zen-workspaces-delete-workspace-title = Delete Space?
zen-workspaces-delete-workspace-body = Are you sure you want to delete { $name }? This action cannot be undone.
zen-workspaces-remote-delete-title = Delete Synced Space?
zen-workspaces-remote-delete-body = { $name } was deleted on another device. Delete it here too? Keeping it will restore it on your other devices.
# Note that the html tag MUST not be changed or removed, as it is used to better
# display the shortcut in the toast notification.

8
package-lock.json generated
View File

@@ -11,7 +11,7 @@
"devDependencies": {
"@babel/preset-typescript": "^7.27.0",
"@zen-browser/prettier": "^3.9.3",
"@zen-browser/surfer": "^1.14.7",
"@zen-browser/surfer": "^1.14.9",
"formal-git": "^1.2.9",
"globals": "^16.3.0",
"husky": "^9.1.7",
@@ -860,9 +860,9 @@
}
},
"node_modules/@zen-browser/surfer": {
"version": "1.14.7",
"resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.14.7.tgz",
"integrity": "sha512-Ui2Chqvr4/+FmHM54eKOv7cQu8DRAK/uCX9o1GNi81hszxo/RSQwaw71eNW43Qcj7giK4U4x0IdCMht98iQ0rA==",
"version": "1.14.9",
"resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.14.9.tgz",
"integrity": "sha512-XbMzG4GHSRoGzKR/DkpyywcbTYemieDRD1A6qgJ8CaVDixenj/uzMhp6HXAUksRTeh1u9j3lzNcVrI99axcZLw==",
"dev": true,
"license": "MPL-2.0",
"dependencies": {

View File

@@ -49,7 +49,7 @@
"devDependencies": {
"@babel/preset-typescript": "^7.27.0",
"@zen-browser/prettier": "^3.9.3",
"@zen-browser/surfer": "^1.14.7",
"@zen-browser/surfer": "^1.14.9",
"formal-git": "^1.2.9",
"globals": "^16.3.0",
"husky": "^9.1.7",

View File

@@ -95,6 +95,9 @@
- name: browser.search.widget.new
value: true
- name: layout.css.corner-shape.enabled
value: true
# Disabled from https://searchfox.org/firefox-main/rev/d6bfff43852356ca98af848b4705d37f8d41856f/modules/libpref/init/StaticPrefList.yaml#2008
# Only enabled for windows, doesn't really fit inside Zen.
- name: browser.startup.preXulSkeletonUI

View File

@@ -2,5 +2,18 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
- name: zen.share.enabled
- name: zen.share.base-url
value: "https://share.zen-browser.app"
- name: zen.share.secret-key
value: ""
- name: zen.share.display-name
value: ""
# Allow zen.share.display-name to be synced across devices.
- name: services.sync.prefs.sync.zen.share.display-name
value: true
- name: zen.share.dont-ask-before-sharing
value: false

View File

@@ -3,10 +3,14 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
- name: services.sync.engine.spaces
value: true
value: "@cond"
condition: "@IS_TWILIGHT@"
- name: services.sync.engine.spaces
- name: zen.spaces-sync.debug
value: false
locked: true
condition: "!@IS_TWILIGHT@"
- name: zen.spaces-sync.normal-tabs
value: false
- name: services.sync.prefs.sync.zen.spaces-sync.normal-tabs
value: true

View File

@@ -20,6 +20,9 @@
- name: zen.theme.acrylic-elements
value: "@IS_TWILIGHT@"
- name: zen.theme.squircle-browser-view
value: "@IS_TWILIGHT@"
- name: zen.theme.disable-lightweight
value: true

View File

@@ -8,4 +8,4 @@ packaging==24.2
pathspec==0.12.1
platformdirs==4.3.6
pycodestyle==2.12.1
requests==2.33.0
requests==2.34.2

View File

@@ -1,8 +1,8 @@
diff --git a/.prettierignore b/.prettierignore
index 949896ff064ae0b54b6a657ea074bc88e12820f7..5249f420972667bece4d85fe8d35073afaebeb8a 100644
index bd8ab46ff7175f5039b69b04c1afe53ab8efe746..7ae12a1ff3724e99aeec2e93518640a2fa9611e6 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -1803,3 +1803,12 @@ tools/ts/test/baselines/
@@ -1807,3 +1807,12 @@ tools/ts/test/baselines/
try_task_config.json
xpcom/idl-parser/xpidl/fixtures/xpctest.d.json
**/package-lock.json
@@ -12,6 +12,6 @@ index 949896ff064ae0b54b6a657ea074bc88e12820f7..5249f420972667bece4d85fe8d35073a
+*.min.js
+*.min.mjs
+*.inc
+*/mochitests/*
+**/mochitests/**
+*.svg
+

View File

@@ -1,5 +1,5 @@
diff --git a/.stylelintrc.js b/.stylelintrc.js
index b484bf6600a7e1b8ad2aed8c8b7fe5e84cc3d023..f89712e2c13dfa0bcb48e55cd3872c67f5c98dad 100644
index b5f8245fa04ffb8fc82240261d63f893f4629f19..1b6ead24adbe69fcb5aeb95cfd3e7fa9662d89d8 100644
--- a/.stylelintrc.js
+++ b/.stylelintrc.js
@@ -67,7 +67,7 @@ module.exports = {
@@ -11,10 +11,10 @@ index b484bf6600a7e1b8ad2aed8c8b7fe5e84cc3d023..f89712e2c13dfa0bcb48e55cd3872c67
{
ignore: ["blockless-at-rules"],
},
@@ -280,7 +280,7 @@ module.exports = {
"media-query-no-invalid": null,
@@ -281,7 +281,7 @@ module.exports = {
"stylelint-plugin-mozilla/media-query-no-invalid": true,
"stylelint-plugin-mozilla/no-base-design-tokens": true,
"stylelint-plugin-mozilla/no-has-selector": true,
- "stylelint-plugin-mozilla/use-design-tokens": true,
+ "stylelint-plugin-mozilla/use-design-tokens": false,
},

View File

@@ -1,5 +1,5 @@
diff --git a/browser/base/content/navigator-toolbox.inc.xhtml b/browser/base/content/navigator-toolbox.inc.xhtml
index dd2f391096968564086911c532f696dc7ffb8ae1..3de617bf4fb7fa35f7d4d7b618e4673b72b953ee 100644
index a76bb7aae7636c07989a4acb35281777d3103505..c5eafbdad5270cd9926ed4f1d850d134440d775b 100644
--- a/browser/base/content/navigator-toolbox.inc.xhtml
+++ b/browser/base/content/navigator-toolbox.inc.xhtml
@@ -2,7 +2,7 @@
@@ -19,14 +19,14 @@ index dd2f391096968564086911c532f696dc7ffb8ae1..3de617bf4fb7fa35f7d4d7b618e4673b
</toolbar>
+<hbox id="titlebar">
+ <html:div id="zen-toolbar-background" class="zen-toolbar-background zen-browser-generic-background">
+ <html:div id="zen-toolbar-background" class="zen-toolbar-background zen-squircle-before zen-squircle-after zen-browser-generic-background">
+ <html:div class="zen-browser-grain" />
+ </html:div>
+ <box id="zen-overflow-extensions-list" skipintoolbarset="true" contextmenu="toolbar-context-menu" />
<toolbar id="TabsToolbar"
class="browser-toolbar browser-titlebar"
fullscreentoolbar="true"
@@ -54,6 +58,8 @@
@@ -56,6 +60,8 @@
<html:sidebar-pins-promo id="drag-to-pin-promo-card"></html:sidebar-pins-promo>
<arrowscrollbox id="pinned-tabs-container" orient="horizontal" clicktoscroll=""></arrowscrollbox>
<splitter orient="vertical" id="vertical-pinned-tabs-splitter" resizebefore="sibling" resizeafter="none" hidden="true"/>
@@ -35,7 +35,7 @@ index dd2f391096968564086911c532f696dc7ffb8ae1..3de617bf4fb7fa35f7d4d7b618e4673b
<hbox class="tab-drop-indicator" hidden="true"/>
<arrowscrollbox id="tabbrowser-arrowscrollbox" orient="horizontal" flex="1" clicktoscroll="" scrolledtostart="" scrolledtoend="">
<tab is="tabbrowser-tab" class="tabbrowser-tab" selected="" visuallyselected="" fadein=""/>
@@ -73,6 +79,7 @@
@@ -75,6 +81,7 @@
tooltip="dynamic-shortcut-tooltip"
data-l10n-id="tabs-toolbar-new-tab"/>
<html:span id="tabbrowser-tab-a11y-desc" hidden="true"/>
@@ -43,7 +43,7 @@ index dd2f391096968564086911c532f696dc7ffb8ae1..3de617bf4fb7fa35f7d4d7b618e4673b
</tabs>
<toolbarbutton id="new-tab-button"
@@ -99,9 +106,10 @@
@@ -102,9 +109,10 @@
<toolbarbutton class="content-analysis-indicator toolbarbutton-1 content-analysis-indicator-icon"/>
@@ -54,4 +54,4 @@ index dd2f391096968564086911c532f696dc7ffb8ae1..3de617bf4fb7fa35f7d4d7b618e4673b
+</hbox>
<toolbar id="nav-bar"
class="browser-toolbar chromeclass-location"
class="browser-toolbar"

View File

@@ -21,3 +21,4 @@
#include ../../../zen/boosts/jar.inc.mn
#include ../../../zen/live-folders/jar.inc.mn
#include ../../../zen/space-routing/jar.inc.mn
#include ../../../zen/share/jar.inc.mn

View File

@@ -16,6 +16,7 @@
<command id="cmd_zenSplitViewUnsplit" />
<command id="cmd_zenSplitViewLinkInNewTab" />
<command id="cmd_zenSplitViewContextMenu" />
<command id="cmd_zenCtxShareSplitView" />
<command id="cmd_zenNewEmptySplit" />
<!-- Workspace commands -->
@@ -40,6 +41,7 @@
<command id="cmd_contextZenRemoveFromEssentials" />
<command id="cmd_zenCtxDeleteWorkspace" />
<command id="cmd_zenCtxShareWorkspace" />
<command id="cmd_zenUnloadWorkspace" />
<command id="cmd_zenUnloadAllOtherWorkspace" />
<command id="cmd_zenOpenSpaceRoutingSettings" />

View File

@@ -12,4 +12,5 @@
<link rel="localization" href="browser/zen-boosts.ftl"/>
<link rel="localization" href="browser/zen-live-folders.ftl"/>
<link rel="localization" href="browser/zen-space-routing.ftl"/>
<link rel="localization" href="browser/zen-share.ftl"/>
</linkset>

View File

@@ -32,6 +32,7 @@
<menuitem id="context_zenUnloadAllOtherWorkspace" data-l10n-id="zen-workspaces-panel-unload-others" command="cmd_zenUnloadAllOtherWorkspace"/>
<menuseparator/>
<menuitem data-l10n-id="zen-panel-ui-workspaces-create" command="cmd_zenOpenWorkspaceCreation"/>
<menuitem id="context_zenShareWorkspace" data-l10n-id="zen-share-space" command="cmd_zenCtxShareWorkspace"/>
<menuitem id="context_zenDeleteWorkspace" data-l10n-id="zen-workspaces-panel-context-delete" command="cmd_zenCtxDeleteWorkspace"/>
<menuseparator/>
<menuitem id="context_zenSpaceRoutingSettings" data-l10n-id="zen-space-routing-settings" command="cmd_zenOpenSpaceRoutingSettings"/>
@@ -55,6 +56,7 @@
<menupopup />
</menu>
<menuitem id="context_zenFolderToSpace" data-l10n-id="zen-folders-panel-convert-folder-to-space" />
<menuitem id="context_zenShareFolder" data-l10n-id="zen-share-folder"/>
<menuseparator />
<menuitem id="context_zenFolderUnpack" data-l10n-id="zen-folders-panel-unpack-folder"/>
<menuitem id="context_zenFolderDelete" data-l10n-id="zen-folders-panel-delete-folder"/>

View File

@@ -15,19 +15,23 @@
mainview-with-header="true">
<hbox id="zen-site-data-header">
<toolbarbutton id="zen-site-data-header-share"
class="zen-squircle-before"
data-l10n-id="zen-site-data-header-share"
flex="1"
closemenu="none" />
<toolbarbutton id="zen-site-data-header-reader-mode"
class="zen-squircle-before"
data-l10n-id="zen-site-data-header-reader-mode"
command="View:ReaderView"
tooltip="dynamic-shortcut-tooltip"
flex="1" />
<toolbarbutton id="zen-site-data-header-screenshot"
class="zen-squircle-before"
data-l10n-id="zen-site-data-header-screenshot"
command="Browser:Screenshot"
flex="1" />
<toolbarbutton id="zen-site-data-header-bookmark"
class="zen-squircle-before"
data-l10n-id="zen-site-data-header-bookmark"
command="Browser:AddBookmarkAs"
flex="1" />

View File

@@ -14,14 +14,14 @@
<panelview id="PanelUI-zen-gradient-generator-view" class="PanelUI-subView zen-theme-picker" role="document" mainview-with-header="true" has-custom-header="true">
<hbox class="zen-theme-picker-gradient">
<hbox id="PanelUI-zen-gradient-generator-scheme">
<button id="PanelUI-zen-gradient-generator-scheme-auto" class="subviewbutton"/>
<button id="PanelUI-zen-gradient-generator-scheme-light" class="subviewbutton"/>
<button id="PanelUI-zen-gradient-generator-scheme-dark" class="subviewbutton"/>
<button id="PanelUI-zen-gradient-generator-scheme-auto" class="no-squircles subviewbutton"/>
<button id="PanelUI-zen-gradient-generator-scheme-light" class="no-squircles subviewbutton"/>
<button id="PanelUI-zen-gradient-generator-scheme-dark" class="no-squircles subviewbutton"/>
</hbox>
<hbox id="PanelUI-zen-gradient-generator-color-actions">
<button id="PanelUI-zen-gradient-generator-color-add" class="subviewbutton" />
<button id="PanelUI-zen-gradient-generator-color-remove" class="subviewbutton" />
<button id="PanelUI-zen-gradient-generator-color-toggle-algo" class="subviewbutton" />
<button id="PanelUI-zen-gradient-generator-color-add" class="no-squircles subviewbutton" />
<button id="PanelUI-zen-gradient-generator-color-remove" class="no-squircles subviewbutton" />
<button id="PanelUI-zen-gradient-generator-color-toggle-algo" class="no-squircles subviewbutton" />
</hbox>
<label data-l10n-id="zen-panel-ui-gradient-click-to-add" id="PanelUI-zen-gradient-generator-color-click-to-add"></label>
</hbox>
@@ -29,82 +29,82 @@
<toolbarbutton id="PanelUI-zen-gradient-generator-color-page-left" class="toolbarbutton-1" disabled="true" />
<hbox id="PanelUI-zen-gradient-generator-color-pages">
<hbox>
<box data-lightness="90" data-algo="float" data-num-dots="1" data-position="240,240" style="background: #f4efdf;"></box>
<box data-lightness="80" data-algo="float" data-num-dots="1" data-position="233,157" style="background: #f0b8cd;"></box>
<box data-lightness="80" data-algo="float" data-num-dots="1" data-position="236,111" style="background: #e9c3e3;"></box>
<box data-lightness="70" data-algo="float" data-num-dots="1" data-position="234,173" style="background: #da7682;"></box>
<box data-lightness="70" data-algo="float" data-num-dots="1" data-position="220,187" style="background: #eb8570;"></box>
<box data-lightness="60" data-algo="float" data-num-dots="1" data-position="225,237" style="background: #dcce7f;"></box>
<box data-lightness="60" data-algo="float" data-num-dots="1" data-position="147,195" style="background: #5becad;"></box>
<box data-lightness="50" data-algo="float" data-num-dots="1" data-position="81,84" style="background: #919bb5;"></box>
<box class="no-squircles" data-lightness="90" data-algo="float" data-num-dots="1" data-position="240,240" style="background: #f4efdf;"></box>
<box class="no-squircles" data-lightness="80" data-algo="float" data-num-dots="1" data-position="233,157" style="background: #f0b8cd;"></box>
<box class="no-squircles" data-lightness="80" data-algo="float" data-num-dots="1" data-position="236,111" style="background: #e9c3e3;"></box>
<box class="no-squircles" data-lightness="70" data-algo="float" data-num-dots="1" data-position="234,173" style="background: #da7682;"></box>
<box class="no-squircles" data-lightness="70" data-algo="float" data-num-dots="1" data-position="220,187" style="background: #eb8570;"></box>
<box class="no-squircles" data-lightness="60" data-algo="float" data-num-dots="1" data-position="225,237" style="background: #dcce7f;"></box>
<box class="no-squircles" data-lightness="60" data-algo="float" data-num-dots="1" data-position="147,195" style="background: #5becad;"></box>
<box class="no-squircles" data-lightness="50" data-algo="float" data-num-dots="1" data-position="81,84" style="background: #919bb5;"></box>
</hbox>
<hbox>
<box data-lightness="90" data-algo="analogous" data-num-dots="3" data-position="240,240"
<box class="no-squircles" data-lightness="90" data-algo="analogous" data-num-dots="3" data-position="240,240"
style="--c1: rgb(245, 237, 214); --c2: rgb(221, 243, 216); --c3: rgb(243, 216, 225);" />
<box data-lightness="85" data-algo="analogous" data-num-dots="3" data-position="233,157"
<box class="no-squircles" data-lightness="85" data-algo="analogous" data-num-dots="3" data-position="233,157"
style="--c1: rgb(243, 190, 222); --c2: rgb(247, 222, 186); --c3: rgb(223, 195, 238);" />
<box data-lightness="80" data-algo="analogous" data-num-dots="3" data-position="236,111"
<box class="no-squircles" data-lightness="80" data-algo="analogous" data-num-dots="3" data-position="236,111"
style="--c1: rgb(229, 179, 228); --c2: rgb(236, 172, 178); --c3: rgb(197, 185, 223);" />
<box data-lightness="70" data-algo="analogous" data-num-dots="3" data-position="234,173"
<box class="no-squircles" data-lightness="70" data-algo="analogous" data-num-dots="3" data-position="234,173"
style="--c1: rgb(235, 122, 159); --c2: rgb(239, 239, 118); --c3: rgb(210, 133, 224);" />
<box data-lightness="70" data-algo="analogous" data-num-dots="3" data-position="220,187"
<box class="no-squircles" data-lightness="70" data-algo="analogous" data-num-dots="3" data-position="220,187"
style="--c1: rgb(242, 115, 123); --c2: rgb(175, 242, 115); --c3: rgb(230, 125, 232);" />
<box data-lightness="60" data-algo="analogous" data-num-dots="3" data-position="225,237"
<box class="no-squircles" data-lightness="60" data-algo="analogous" data-num-dots="3" data-position="225,237"
style="--c1: rgb(221, 205, 85); --c2: rgb(97, 212, 94); --c3: rgb(215, 91, 124);" />
<box data-lightness="60" data-algo="analogous" data-num-dots="3" data-position="147,195"
<box class="no-squircles" data-lightness="60" data-algo="analogous" data-num-dots="3" data-position="147,195"
style="--c1: rgb(75, 231, 210); --c2: rgb(84, 175, 222); --c3: rgb(62, 244, 112);" />
<box data-lightness="55" data-algo="analogous" data-num-dots="3" data-position="81,84"
<box class="no-squircles" data-lightness="55" data-algo="analogous" data-num-dots="3" data-position="81,84"
style="--c1: rgb(122, 132, 158); --c2: rgb(137, 117, 164); --c3: rgb(116, 162, 164);" />
</hbox>
<hbox>
<box data-lightness="10" data-algo="float" data-num-dots="1" data-position="171,72" style="background:rgb(93, 86, 106);"></box>
<box data-lightness="40" data-algo="float" data-num-dots="1" data-position="265,79" style="background: #997096;"></box>
<box data-lightness="35" data-algo="float" data-num-dots="1" data-position="301,176" style="background: #956066;"></box>
<box data-lightness="30" data-algo="float" data-num-dots="1" data-position="237,210" style="background: #9c6645;"></box>
<box data-lightness="30" data-algo="float" data-num-dots="1" data-position="91,228" style="background: #517b6c;"></box>
<box data-lightness="25" data-algo="float" data-num-dots="1" data-position="67,159" style="background: #576e75;"></box>
<box data-lightness="20" data-algo="float" data-num-dots="1" data-position="314,235" style="background:rgb(131, 109, 95);"></box>
<box data-lightness="20" data-algo="float" data-num-dots="1" data-position="118,215" style="background: #447464;"></box>
<box class="no-squircles" data-lightness="10" data-algo="float" data-num-dots="1" data-position="171,72" style="background:rgb(93, 86, 106);"></box>
<box class="no-squircles" data-lightness="40" data-algo="float" data-num-dots="1" data-position="265,79" style="background: #997096;"></box>
<box class="no-squircles" data-lightness="35" data-algo="float" data-num-dots="1" data-position="301,176" style="background: #956066;"></box>
<box class="no-squircles" data-lightness="30" data-algo="float" data-num-dots="1" data-position="237,210" style="background: #9c6645;"></box>
<box class="no-squircles" data-lightness="30" data-algo="float" data-num-dots="1" data-position="91,228" style="background: #517b6c;"></box>
<box class="no-squircles" data-lightness="25" data-algo="float" data-num-dots="1" data-position="67,159" style="background: #576e75;"></box>
<box class="no-squircles" data-lightness="20" data-algo="float" data-num-dots="1" data-position="314,235" style="background:rgb(131, 109, 95);"></box>
<box class="no-squircles" data-lightness="20" data-algo="float" data-num-dots="1" data-position="118,215" style="background: #447464;"></box>
</hbox>
<hbox>
<box data-lightness="10" data-algo="analogous" data-num-dots="3" data-position="171,72"
<box class="no-squircles" data-lightness="10" data-algo="analogous" data-num-dots="3" data-position="171,72"
style="--c1: rgb(23, 17, 34); --c2: rgb(37, 14, 35); --c3: rgb(18, 22, 33);" />
<box data-lightness="40" data-algo="analogous" data-num-dots="3" data-position="265,79"
<box class="no-squircles" data-lightness="40" data-algo="analogous" data-num-dots="3" data-position="265,79"
style="--c1: rgb(128, 76, 124); --c2: rgb(141, 63, 66); --c3: rgb(97, 88, 116);" />
<box data-lightness="35" data-algo="analogous" data-num-dots="3" data-position="301,176"
<box class="no-squircles" data-lightness="35" data-algo="analogous" data-num-dots="3" data-position="301,176"
style="--c1: rgb(122, 56, 64); --c2: rgb(126, 121, 52); --c3: rgb(111, 68, 110);" />
<box data-lightness="30" data-algo="analogous" data-num-dots="3" data-position="237,210"
<box class="no-squircles" data-lightness="30" data-algo="analogous" data-num-dots="3" data-position="237,210"
style="--c1: rgb(131, 65, 22); --c2: rgb(64, 128, 25); --c3: rgb(122, 31, 91);" />
<box data-lightness="30" data-algo="analogous" data-num-dots="3" data-position="91,228"
<box class="no-squircles" data-lightness="30" data-algo="analogous" data-num-dots="3" data-position="91,228"
style="--c1: rgb(45, 108, 85); --c2: rgb(52, 85, 101); --c3: rgb(52, 118, 35);" />
<box data-lightness="25" data-algo="analogous" data-num-dots="3" data-position="67,159"
<box class="no-squircles" data-lightness="25" data-algo="analogous" data-num-dots="3" data-position="67,159"
style="--c1: rgb(45, 74, 83); --c2: rgb(46, 50, 81); --c3: rgb(38, 90, 65);" />
<box data-lightness="20" data-algo="analogous" data-num-dots="3" data-position="314,235"
<box class="no-squircles" data-lightness="20" data-algo="analogous" data-num-dots="3" data-position="314,235"
style="--c1: rgb(64, 47, 38); --c2: rgb(55, 64, 38); --c3: rgb(59, 43, 52);" />
<box data-lightness="20" data-algo="analogous" data-num-dots="3" data-position="118,215"
<box class="no-squircles" data-lightness="20" data-algo="analogous" data-num-dots="3" data-position="118,215"
style="--c1: rgb(22, 80, 61); --c2: rgb(26, 60, 76); --c3: rgb(27, 87, 15);" />
</hbox>
<hbox>
# Start from black to white in a span on 8 steps and.
# They must all go from the middle to the right side. They must always stay verically centered.
# And reach to 180 on the right side, meaning we must divide the width in 16 segments.
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
<box class="no-squircles" data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="340,180" style="background: rgb(224, 224, 224);"></box>
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
<box class="no-squircles" data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="337.5,180" style="background: rgb(224, 224, 224);"></box>
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
<box class="no-squircles" data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="315,180" style="background: rgb(192, 192, 192);"></box>
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
<box class="no-squircles" data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="292.5,180" style="background: rgb(160, 160, 160);"></box>
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
<box class="no-squircles" data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="270,180" style="background: rgb(128, 128, 128);"></box>
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
<box class="no-squircles" data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="247.5,180" style="background: rgb(96, 96, 96);"></box>
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
<box class="no-squircles" data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="225,180" style="background: rgb(64, 64, 64);"></box>
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
<box class="no-squircles" data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="202.5,180" style="background: rgb(32, 32, 32);"></box>
<box data-type="explicit-black-white" data-algo="float" data-num-dots="1"
<box class="no-squircles" data-type="explicit-black-white" data-algo="float" data-num-dots="1"
data-position="180,180" style="background: rgb(0, 0, 0);"></box>
</hbox>
</hbox>
@@ -131,10 +131,10 @@
</box>
<html:input type="range" value="0.4" step="0.001" id="PanelUI-zen-gradient-generator-opacity"
#ifdef XP_MACOSX
max="0.9"
max="0.8"
min="0.30"
#else
max="0.9"
max="0.8"
min="0.25"
#endif
/>

View File

@@ -0,0 +1,21 @@
diff --git a/browser/components/contextualidentity/content/ContainerCreationPanel.mjs b/browser/components/contextualidentity/content/ContainerCreationPanel.mjs
index e04d7a4738192703e8f7f8555f50aaf0a619a5bd..b86e4853c421856f84ad8e017062f0d611b88aad 100644
--- a/browser/components/contextualidentity/content/ContainerCreationPanel.mjs
+++ b/browser/components/contextualidentity/content/ContainerCreationPanel.mjs
@@ -4,7 +4,7 @@
import { ContainerEditor } from "chrome://browser/content/usercontext/ContainerEditor.mjs";
-const ANCHOR_ID = "userContext-icons";
+const ANCHOR_ID = "navigator-toolbox";
const ANCHOR_PINNED_CLASS = "container-anchor-pinned";
const lazy = {};
@@ -95,6 +95,6 @@ export const ContainerCreationPanel = {
anchor.hidden = false;
}
- panel.openPopup(anchor, "bottomright topright");
+ panel.openPopup(anchor, win.gZenUIManager.panelUIPosition());
},
};

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/customizableui/CustomizableUI.sys.mjs b/browser/components/customizableui/CustomizableUI.sys.mjs
index 491161e48044f75167a8e8a0348779cfa22fc40e..867d51b8a6b74f841afc6d84dcdfd8f2681652e5 100644
index 875f8b03d979353ef44a57c15ef1ae09d33ab730..3d6e092e7ed126cdee8c32229df2cfa13303d3a3 100644
--- a/browser/components/customizableui/CustomizableUI.sys.mjs
+++ b/browser/components/customizableui/CustomizableUI.sys.mjs
@@ -13,6 +13,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
@@ -10,7 +10,7 @@ index 491161e48044f75167a8e8a0348779cfa22fc40e..867d51b8a6b74f841afc6d84dcdfd8f2
HomePage: "resource:///modules/HomePage.sys.mjs",
PanelMultiView:
"moz-src:///browser/components/customizableui/PanelMultiView.sys.mjs",
@@ -348,7 +349,7 @@ var CustomizableUIInternal = {
@@ -352,7 +353,7 @@ var CustomizableUIInternal = {
{
type: CustomizableUI.TYPE_PANEL,
defaultPlacements: [],
@@ -19,7 +19,7 @@ index 491161e48044f75167a8e8a0348779cfa22fc40e..867d51b8a6b74f841afc6d84dcdfd8f2
},
false
);
@@ -358,27 +359,23 @@ var CustomizableUIInternal = {
@@ -362,20 +363,15 @@ var CustomizableUIInternal = {
"back-button",
"forward-button",
"stop-reload-button",
@@ -41,26 +41,29 @@ index 491161e48044f75167a8e8a0348779cfa22fc40e..867d51b8a6b74f841afc6d84dcdfd8f2
this.registerArea(
CustomizableUI.AREA_NAVBAR,
{
type: CustomizableUI.TYPE_TOOLBAR,
@@ -383,9 +379,6 @@ var CustomizableUIInternal = {
overflowable: true,
defaultPlacements: navbarPlacements,
- verticalTabsDefaultPlacements: ["alltabs-button", "ai-window-toggle"],
+ verticalTabsDefaultPlacements: [
+ ],
verticalTabsDefaultPlacements: [
- "alltabs-button",
- "smartwindow-group-tabs-button",
- "ai-window-toggle",
],
defaultCollapsed: false,
},
true
@@ -402,9 +399,6 @@ var CustomizableUIInternal = {
@@ -410,11 +403,6 @@ var CustomizableUIInternal = {
type: CustomizableUI.TYPE_TOOLBAR,
defaultPlacements: [
"tabbrowser-tabs",
- "new-tab-button",
- "spring",
- "alltabs-button",
- "smartwindow-group-tabs-button",
- "ai-window-toggle",
],
verticalTabsDefaultPlacements: [],
defaultCollapsed: null,
@@ -484,6 +478,7 @@ var CustomizableUIInternal = {
@@ -507,6 +495,7 @@ var CustomizableUIInternal = {
CustomizableUI.AREA_NAVBAR,
CustomizableUI.AREA_BOOKMARKS,
CustomizableUI.AREA_TABSTRIP,
@@ -68,7 +71,7 @@ index 491161e48044f75167a8e8a0348779cfa22fc40e..867d51b8a6b74f841afc6d84dcdfd8f2
]);
if (AppConstants.platform != "macosx") {
toolbars.add(CustomizableUI.AREA_MENUBAR);
@@ -1285,6 +1280,9 @@ var CustomizableUIInternal = {
@@ -1339,6 +1328,9 @@ var CustomizableUIInternal = {
placements = gPlacements.get(area);
}
@@ -78,7 +81,7 @@ index 491161e48044f75167a8e8a0348779cfa22fc40e..867d51b8a6b74f841afc6d84dcdfd8f2
// For toolbars that need it, mark as dirty.
let defaultPlacements = areaProperties.get("defaultPlacements");
if (
@@ -1793,7 +1791,6 @@ var CustomizableUIInternal = {
@@ -1847,7 +1839,6 @@ var CustomizableUIInternal = {
lazy.log.info(
"Widget " + aWidgetId + " not found, unable to remove from " + aArea
);
@@ -86,7 +89,7 @@ index 491161e48044f75167a8e8a0348779cfa22fc40e..867d51b8a6b74f841afc6d84dcdfd8f2
}
this.notifyDOMChange(widgetNode, null, container, true, () => {
@@ -1803,7 +1800,7 @@ var CustomizableUIInternal = {
@@ -1857,7 +1848,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)) {
@@ -95,7 +98,7 @@ index 491161e48044f75167a8e8a0348779cfa22fc40e..867d51b8a6b74f841afc6d84dcdfd8f2
} else {
window.gNavToolbox.palette.appendChild(widgetNode);
}
@@ -1971,16 +1968,16 @@ var CustomizableUIInternal = {
@@ -2025,16 +2016,16 @@ var CustomizableUIInternal = {
elem.setAttribute("skipintoolbarset", "true");
}
}
@@ -115,7 +118,7 @@ index 491161e48044f75167a8e8a0348779cfa22fc40e..867d51b8a6b74f841afc6d84dcdfd8f2
// Handle initial state of vertical tabs.
if (isVerticalTabs) {
// Show the vertical tabs toolbar
@@ -2222,6 +2219,10 @@ var CustomizableUIInternal = {
@@ -2276,6 +2267,10 @@ var CustomizableUIInternal = {
* The identifier string of the area that aNode is being inserted into.
*/
insertWidgetBefore(aNode, aNextNode, aContainer, aAreaId) {
@@ -126,7 +129,7 @@ index 491161e48044f75167a8e8a0348779cfa22fc40e..867d51b8a6b74f841afc6d84dcdfd8f2
this.notifyDOMChange(aNode, aNextNode, aContainer, false, () => {
this.setLocationAttributes(aNode, aAreaId);
aContainer.insertBefore(aNode, aNextNode);
@@ -4592,7 +4593,7 @@ var CustomizableUIInternal = {
@@ -4652,7 +4647,7 @@ var CustomizableUIInternal = {
* For all registered areas, builds those areas to reflect the current
* placement state of all widgets.
*/
@@ -135,7 +138,7 @@ index 491161e48044f75167a8e8a0348779cfa22fc40e..867d51b8a6b74f841afc6d84dcdfd8f2
for (let [areaId, areaNodes] of gBuildAreas) {
let placements = gPlacements.get(areaId);
let isFirstChangedToolbar = true;
@@ -4603,7 +4604,7 @@ var CustomizableUIInternal = {
@@ -4663,7 +4658,7 @@ var CustomizableUIInternal = {
if (area.get("type") == CustomizableUI.TYPE_TOOLBAR) {
let defaultCollapsed = area.get("defaultCollapsed");
let win = areaNode.documentGlobal;
@@ -144,7 +147,7 @@ index 491161e48044f75167a8e8a0348779cfa22fc40e..867d51b8a6b74f841afc6d84dcdfd8f2
win.setToolbarVisibility(
areaNode,
typeof defaultCollapsed == "string"
@@ -5899,6 +5900,7 @@ export var CustomizableUI = {
@@ -5976,6 +5971,7 @@ export var CustomizableUI = {
unregisterArea(aName, aDestroyPlacements) {
CustomizableUIInternal.unregisterArea(aName, aDestroyPlacements);
},
@@ -152,7 +155,7 @@ index 491161e48044f75167a8e8a0348779cfa22fc40e..867d51b8a6b74f841afc6d84dcdfd8f2
/**
* Add a widget to an area.
* If the area to which you try to add is not known to CustomizableUI,
@@ -7869,7 +7871,9 @@ class OverflowableToolbar {
@@ -7951,7 +7947,9 @@ class OverflowableToolbar {
);
if (webExtList && CustomizableUI.isWebExtensionWidget(child.id)) {
@@ -162,16 +165,27 @@ index 491161e48044f75167a8e8a0348779cfa22fc40e..867d51b8a6b74f841afc6d84dcdfd8f2
webExtList.insertBefore(child, webExtList.firstElementChild);
} else {
child.setAttribute("cui-anchorid", this.#defaultListButton.id);
@@ -7929,7 +7933,7 @@ class OverflowableToolbar {
@@ -8000,6 +7998,7 @@ class OverflowableToolbar {
return aElement.getBoundingClientRect().width;
}
+ let toolbar = this.#toolbar;
function sumChildrenInlineSize(aParent, aExceptChild = null) {
let sum = 0;
for (let child of aParent.children) {
@@ -8011,7 +8010,10 @@ class OverflowableToolbar {
) {
continue;
}
- sum += parseFloat(style.marginLeft) + parseFloat(style.marginRight);
+ sum += parseFloat(style.marginLeft) + (win.gZenVerticalTabsManager._hasSetSingleToolbar ? Math.max(0, parseFloat(style.marginRight)) : parseFloat(style.marginRight));
+ if (toolbar.id == 'zen-sidebar-top-buttons' && toolbar.hasAttribute("overflowing")) {
+ sum += 2; // Add extra padding that we remove from the CSS
+ }
if (child != aExceptChild) {
sum += getInlineSize(child);
}
@@ -7953,11 +7957,11 @@ class OverflowableToolbar {
@@ -8035,11 +8037,11 @@ class OverflowableToolbar {
parseFloat(style.paddingLeft) -
parseFloat(style.paddingRight) -
toolbarChildrenWidth;
@@ -185,7 +199,7 @@ index 491161e48044f75167a8e8a0348779cfa22fc40e..867d51b8a6b74f841afc6d84dcdfd8f2
});
lazy.log.debug(
@@ -7972,7 +7976,39 @@ class OverflowableToolbar {
@@ -8054,7 +8056,39 @@ class OverflowableToolbar {
Math.max(targetWidth, targetChildrenWidth)
);
totalAvailWidth = Math.ceil(totalAvailWidth);
@@ -226,7 +240,7 @@ index 491161e48044f75167a8e8a0348779cfa22fc40e..867d51b8a6b74f841afc6d84dcdfd8f2
return { isOverflowing, targetContentWidth, totalAvailWidth };
}
@@ -8033,7 +8069,11 @@ class OverflowableToolbar {
@@ -8115,7 +8149,11 @@ class OverflowableToolbar {
return;
}
}
@@ -239,7 +253,7 @@ index 491161e48044f75167a8e8a0348779cfa22fc40e..867d51b8a6b74f841afc6d84dcdfd8f2
lazy.log.debug(
`Need ${minSize} but width is ${totalAvailWidth} so bailing`
);
@@ -8066,7 +8106,7 @@ class OverflowableToolbar {
@@ -8148,7 +8186,7 @@ class OverflowableToolbar {
}
}
if (!inserted) {
@@ -248,7 +262,7 @@ index 491161e48044f75167a8e8a0348779cfa22fc40e..867d51b8a6b74f841afc6d84dcdfd8f2
}
child.removeAttribute("cui-anchorid");
child.removeAttribute("overflowedItem");
@@ -8192,6 +8232,9 @@ class OverflowableToolbar {
@@ -8274,6 +8312,9 @@ class OverflowableToolbar {
* if no such list exists.
*/
get #webExtList() {
@@ -258,7 +272,7 @@ index 491161e48044f75167a8e8a0348779cfa22fc40e..867d51b8a6b74f841afc6d84dcdfd8f2
if (!this.#webExtListRef) {
let targetID = this.#toolbar.getAttribute("addon-webext-overflowtarget");
if (!targetID) {
@@ -8203,6 +8246,9 @@ class OverflowableToolbar {
@@ -8285,6 +8326,9 @@ class OverflowableToolbar {
let win = this.#toolbar.documentGlobal;
let { panel } = win.gUnifiedExtensions;
this.#webExtListRef = panel.querySelector(`#${targetID}`);
@@ -268,7 +282,7 @@ index 491161e48044f75167a8e8a0348779cfa22fc40e..867d51b8a6b74f841afc6d84dcdfd8f2
}
return this.#webExtListRef;
}
@@ -8411,7 +8457,7 @@ class OverflowableToolbar {
@@ -8493,7 +8537,7 @@ class OverflowableToolbar {
break;
}
case "mousedown": {

View File

@@ -1,16 +1,17 @@
diff --git a/browser/components/preferences/config/account-sync.mjs b/browser/components/preferences/config/account-sync.mjs
index b503987a08e2ce64bfc01c4e3a21e5e19ef834f0..b1c03a0b219fd3eddd93c1deaeb18ab79c85f168 100644
index b01fd4bb163ad53139fcbd8e79e12ef994d1fa13..7e3c2f6852b77192b4505bb3d5a7b58586da6548 100644
--- a/browser/components/preferences/config/account-sync.mjs
+++ b/browser/components/preferences/config/account-sync.mjs
@@ -42,6 +42,7 @@ Preferences.addAll([
@@ -46,6 +46,8 @@ Preferences.addAll([
{ id: "services.sync.engine.creditcards", type: "bool" },
{ id: "services.sync.engine.addons", type: "bool" },
{ id: "services.sync.engine.prefs", type: "bool" },
+ { id: "services.sync.engine.spaces", type: "bool" },
+ { id: "zen.spaces-sync.normal-tabs", type: "bool" },
]);
/**
@@ -546,6 +547,7 @@ const SYNC_ENGINE_SETTINGS = [
@@ -557,6 +559,7 @@ const SYNC_ENGINE_SETTINGS = [
type: "payments",
},
{ id: "syncAddons", pref: "services.sync.engine.addons", type: "addons" },
@@ -18,3 +19,50 @@ index b503987a08e2ce64bfc01c4e3a21e5e19ef834f0..b1c03a0b219fd3eddd93c1deaeb18ab7
{ id: "syncSettings", pref: "services.sync.engine.prefs", type: "settings" },
];
@@ -564,6 +567,18 @@ SYNC_ENGINE_SETTINGS.forEach(({ id, pref }) => {
Preferences.addSetting({ id, pref });
});
+Preferences.addSetting({ id: "zenSyncWorkspacesGroup" });
+Preferences.addSetting({
+ id: "zenSyncWorkspaces",
+ pref: "services.sync.engine.spaces",
+});
+Preferences.addSetting({
+ id: "zenSyncNormalTabs",
+ pref: "zen.spaces-sync.normal-tabs",
+ deps: ["zenSyncWorkspaces"],
+ visible: deps => !!deps.zenSyncWorkspaces.value,
+});
+
Preferences.addSetting({
id: "syncEngines",
deps: SYNC_ENGINE_SETTINGS.map(({ id }) => id),
@@ -995,6 +1010,27 @@ SettingGroupManager.registerGroups({
id: "syncEnginesList",
control: "sync-engines-list",
},
+ {
+ id: "zenSyncWorkspacesGroup",
+ control: "moz-box-item",
+ items: [
+ {
+ id: "zenSyncWorkspaces",
+ l10nId: "zen-settings-workspaces-sync",
+ control: "moz-toggle",
+ controlAttrs: {
+ inputlayout: "inline-end",
+ },
+ items: [
+ {
+ id: "zenSyncNormalTabs",
+ l10nId: "zen-settings-normal-tabs-sync",
+ control: "moz-checkbox",
+ },
+ ],
+ },
+ ],
+ },
{
id: "syncChangeOptions",
control: "moz-box-button",

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/preferences/main.js b/browser/components/preferences/main.js
index 88675d1bcbf000b10d85a9c0980bc6069d88052c..ed3a1e809eb0fcccc5a957be7affb77be8978e32 100644
index 5a56d348146c1c37c088ced60327fffebcf8fac0..abd65594d365fbc0a74af3953c71f410301898ad 100644
--- a/browser/components/preferences/main.js
+++ b/browser/components/preferences/main.js
@@ -528,6 +528,11 @@ function createStartupConfig(hidden = false) {
@@ -529,6 +529,11 @@ function createStartupConfig(hidden = false) {
},
],
},
@@ -14,7 +14,7 @@ index 88675d1bcbf000b10d85a9c0980bc6069d88052c..ed3a1e809eb0fcccc5a957be7affb77b
{
id: "windowsLaunchOnLogin",
l10nId: "windows-launch-on-login",
@@ -575,7 +580,7 @@ function createStartupConfig(hidden = false) {
@@ -576,7 +581,7 @@ function createStartupConfig(hidden = false) {
SettingGroupManager.registerGroups({
defaultBrowser: createDefaultBrowserConfig(),
startup: createStartupConfig(
@@ -23,7 +23,7 @@ index 88675d1bcbf000b10d85a9c0980bc6069d88052c..ed3a1e809eb0fcccc5a957be7affb77b
),
});
@@ -628,7 +633,7 @@ function getBundleForLocales(newLocales) {
@@ -636,7 +641,7 @@ function getBundleForLocales(newLocales) {
])
);
return new Localization(

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/preferences/preferences.js b/browser/components/preferences/preferences.js
index c76a0647e14bac806d9428483bb565b3e10c31e7..2188f7808aca090f92574c7f5c55a28a9c5bb3f8 100644
index 94612d8e28af58fcb04914440348b899a0a1e08f..da3b1ffd09745d09589283356d1001dbfb76a468 100644
--- a/browser/components/preferences/preferences.js
+++ b/browser/components/preferences/preferences.js
@@ -131,6 +131,7 @@ ChromeUtils.defineLazyGetter(this, "gSubDialog", function () {
@@ -132,6 +132,7 @@ ChromeUtils.defineLazyGetter(this, "gSubDialog", function () {
styleSheets: [
"chrome://browser/skin/preferences/dialog.css",
"chrome://browser/skin/preferences/preferences.css",
@@ -10,7 +10,7 @@ index c76a0647e14bac806d9428483bb565b3e10c31e7..2188f7808aca090f92574c7f5c55a28a
],
resizeCallback: async ({ title, frame }) => {
// Search within main document and highlight matched keyword.
@@ -437,6 +438,8 @@ const CONFIG_PANES = Object.freeze({
@@ -471,6 +472,8 @@ const CONFIG_PANES = Object.freeze({
tabsBrowsing: {
l10nId: "tabs-browsing-section",
groupIds: [
@@ -19,7 +19,7 @@ index c76a0647e14bac806d9428483bb565b3e10c31e7..2188f7808aca090f92574c7f5c55a28a
"browserLayout",
"tabs",
"pageNavigation",
@@ -483,7 +486,7 @@ function register_module(categoryName, categoryObject) {
@@ -518,7 +521,7 @@ function register_module(categoryName, categoryObject) {
}
this._initted = true;
let template = document.getElementById("template-" + categoryName);
@@ -28,7 +28,7 @@ index c76a0647e14bac806d9428483bb565b3e10c31e7..2188f7808aca090f92574c7f5c55a28a
// Replace the template element with the nodes inside of it.
template.replaceWith(template.content);
@@ -527,6 +530,10 @@ function init_all() {
@@ -562,6 +565,10 @@ function init_all() {
register_module("paneHome", gHomePane);
register_module("paneSearch", gSearchPane);
register_module("panePrivacy", gPrivacyPane);
@@ -39,15 +39,3 @@ index c76a0647e14bac806d9428483bb565b3e10c31e7..2188f7808aca090f92574c7f5c55a28a
// Restore the cached Firefox Labs nav button visibility so it shows
// immediately when recipes are expected to be available, before
@@ -656,9 +663,9 @@ async function gotoPref(
let redesignEnabled = srdSectionPrefs.all;
let categories = document.getElementById("categories");
const kDefaultCategoryInternalName = redesignEnabled
- ? "paneSync"
+ ? "paneTabsBrowsing"
: "paneGeneral";
- const kDefaultCategory = redesignEnabled ? "sync" : "general";
+ const kDefaultCategory = redesignEnabled ? "tabsBrowsing" : "general";
let hash = document.location.hash;
let category = aCategory || hash.substring(1) || kDefaultCategoryInternalName;

View File

@@ -27,7 +27,7 @@ index 1b8c38159314b6edee9e6f455beb2b63db1ad3f0..1308345db640dba6b2848b49ef7c1181
+ </html:moz-page-nav-button>
+ <html:moz-page-nav-button id="category-zen-CKS"
+ view="paneZenCKS"
+ iconsrc="chrome://browser/skin/quickactions.svg"
+ iconsrc="chrome://browser/skin/preferences/category-accessibility.svg"
+ data-l10n-id="pane-zen-CKS-title">
+ </html:moz-page-nav-button>
+ <html:moz-page-nav-button id="category-zen-marketplace"

View File

@@ -0,0 +1,15 @@
diff --git a/browser/components/preferences/widgets/sync-engine-list/sync-engines-list.mjs b/browser/components/preferences/widgets/sync-engine-list/sync-engines-list.mjs
index 9359a485ed6212c7df49a8d4b1e4a8febbc1c9b6..132fea440cfa535e78b35f706e7ef2d6881f9ba6 100644
--- a/browser/components/preferences/widgets/sync-engine-list/sync-engines-list.mjs
+++ b/browser/components/preferences/widgets/sync-engine-list/sync-engines-list.mjs
@@ -50,6 +50,10 @@ const engineTypeToMetadata = {
iconSrc: "chrome://global/skin/icons/settings.svg",
l10nId: "sync-currently-syncing-settings",
},
+ workspaces: {
+ iconSrc: "chrome://devtools/skin/images/tool-storage.svg",
+ l10nId: "sync-currently-syncing-workspaces",
+ },
};
/**

View File

@@ -38,9 +38,16 @@ var gZenMarketplaceManager = {
this.__hasInitializedEvents = true;
await this._buildModsList();
Services.prefs.addObserver(gZenMods.updatePref, this);
window.addEventListener(
"unload",
() => {
Services.prefs.removeObserver(gZenMods.updatePref, this);
},
{ once: true }
);
await this._buildModsList();
const checkForUpdateClick = (event) => {
if (event.target === checkForUpdates) {
@@ -69,7 +76,6 @@ var gZenMarketplaceManager = {
});
window.addEventListener("unload", () => {
Services.prefs.removeObserver(gZenMods.updatePref, this);
this.__hasInitializedEvents = false;
document.removeEventListener("ZenModsMarketplace:CheckForUpdatesFinished", this);
@@ -735,7 +741,6 @@ var gZenWorkspacesSettings = {
Services.prefs.addObserver("zen.glance.enabled", tabsUnloaderPrefListener); // We can use the same listener for both prefs
Services.prefs.addObserver("zen.workspaces.separate-essentials", tabsUnloaderPrefListener);
Services.prefs.addObserver("zen.glance.activation-method", tabsUnloaderPrefListener);
Services.prefs.addObserver("zen.window-sync.sync-only-pinned-tabs", tabsUnloaderPrefListener);
Services.prefs.addObserver(
"zen.tabs.ctrl-tab.ignore-essential-tabs",
@@ -744,7 +749,6 @@ var gZenWorkspacesSettings = {
Services.prefs.addObserver("browser.ctrlTab.sortByRecentlyUsed", toggleZenCycleByAttrWarning);
window.addEventListener("unload", () => {
Services.prefs.removeObserver("zen.glance.enabled", tabsUnloaderPrefListener);
Services.prefs.removeObserver("zen.glance.activation-method", tabsUnloaderPrefListener);
Services.prefs.removeObserver("zen.workspaces.separate-essentials", tabsUnloaderPrefListener);
Services.prefs.removeObserver(
"zen.window-sync.sync-only-pinned-tabs",

View File

@@ -1,16 +1,16 @@
diff --git a/browser/components/sessionstore/SessionFile.sys.mjs b/browser/components/sessionstore/SessionFile.sys.mjs
index 5580838acd72bf0e1189d367984859529d89f5b4..e5fa6076a9cc6ada016ccc4e129cad455010a522 100644
index 370e5c105c3d9bee05c2d9d7b63d0ee45b8331e1..1c37c19794ebe863a25f780e9a74d63526b929d7 100644
--- a/browser/components/sessionstore/SessionFile.sys.mjs
+++ b/browser/components/sessionstore/SessionFile.sys.mjs
@@ -22,6 +22,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
RunState: "resource:///modules/sessionstore/RunState.sys.mjs",
SessionStore: "resource:///modules/sessionstore/SessionStore.sys.mjs",
SessionWriter: "resource:///modules/sessionstore/SessionWriter.sys.mjs",
@@ -25,6 +25,7 @@ const lazy = XPCOMUtils.declareLazy({
"moz-src:///browser/components/sessionstore/SessionStore.sys.mjs",
SessionWriter:
"moz-src:///browser/components/sessionstore/SessionWriter.sys.mjs",
+ ZenSessionStore: "resource:///modules/zen/ZenSessionManager.sys.mjs",
});
const PREF_UPGRADE_BACKUP = "browser.sessionstore.upgradeBackup.latestBuildID";
@@ -381,7 +382,7 @@ var SessionFileInternal = {
@@ -384,7 +385,7 @@ var SessionFileInternal = {
this._readOrigin = result.origin;
result.noFilesFound = noFilesFound;

View File

@@ -1,11 +1,11 @@
diff --git a/browser/components/sessionstore/SessionSaver.sys.mjs b/browser/components/sessionstore/SessionSaver.sys.mjs
index 9141793550f7c7ff6aa63d4c85bf571b4499e2d0..6906fd9be7ae6ca4316133e0d6552b797c54a7ec 100644
index 1f26bc5fdb83f55bdf0b9b7d01fafe1cd37f77f4..5916f741d0fa04c392dcdd10f843e595fe5e058c 100644
--- a/browser/components/sessionstore/SessionSaver.sys.mjs
+++ b/browser/components/sessionstore/SessionSaver.sys.mjs
@@ -20,6 +20,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
SessionFile: "resource:///modules/sessionstore/SessionFile.sys.mjs",
SessionStore: "resource:///modules/sessionstore/SessionStore.sys.mjs",
sessionStoreLogger: "resource:///modules/sessionstore/SessionLogger.sys.mjs",
@@ -20,6 +20,7 @@ const lazy = XPCOMUtils.declareLazy({
"moz-src:///browser/components/sessionstore/SessionStore.sys.mjs",
sessionStoreLogger:
"moz-src:///browser/components/sessionstore/SessionLogger.sys.mjs",
+ ZenSessionStore: "resource:///modules/zen/ZenSessionManager.sys.mjs",
});

View File

@@ -1,16 +1,16 @@
diff --git a/browser/components/sessionstore/SessionStartup.sys.mjs b/browser/components/sessionstore/SessionStartup.sys.mjs
index 86600ffb5178599ab23270a964064ca657a3283f..70d7b5c7d69d3700475d663b595052264c67d351 100644
index 919d4536c5462603346684bbe26794ae9279b517..5a8fae0708e4a9a82c5e85f8a473ebaeafebe71f 100644
--- a/browser/components/sessionstore/SessionStartup.sys.mjs
+++ b/browser/components/sessionstore/SessionStartup.sys.mjs
@@ -40,6 +40,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
StartupPerformance:
"resource:///modules/sessionstore/StartupPerformance.sys.mjs",
sessionStoreLogger: "resource:///modules/sessionstore/SessionLogger.sys.mjs",
@@ -41,6 +41,7 @@ const lazy = XPCOMUtils.declareLazy({
"moz-src:///browser/components/sessionstore/StartupPerformance.sys.mjs",
sessionStoreLogger:
"moz-src:///browser/components/sessionstore/SessionLogger.sys.mjs",
+ ZenSessionStore: "resource:///modules/zen/ZenSessionManager.sys.mjs",
});
const STATE_RUNNING_STR = "running";
@@ -85,7 +86,7 @@ export var SessionStartup = {
@@ -86,7 +87,7 @@ export var SessionStartup = {
}
// do not need to initialize anything in auto-started private browsing sessions
@@ -19,7 +19,7 @@ index 86600ffb5178599ab23270a964064ca657a3283f..70d7b5c7d69d3700475d663b59505226
this._initialized = true;
gOnceInitializedDeferred.resolve();
return;
@@ -179,6 +180,8 @@ export var SessionStartup = {
@@ -180,6 +181,8 @@ export var SessionStartup = {
this._initialState = parsed;
}
@@ -28,7 +28,7 @@ index 86600ffb5178599ab23270a964064ca657a3283f..70d7b5c7d69d3700475d663b59505226
if (this._initialState == null) {
// No valid session found.
this._sessionType = this.NO_SESSION;
@@ -276,6 +279,8 @@ export var SessionStartup = {
@@ -277,6 +280,8 @@ export var SessionStartup = {
`Previous shutdown ok? ${this._previousSessionCrashed}, reason: ${previousSessionCrashedReason}`
);
@@ -37,7 +37,7 @@ index 86600ffb5178599ab23270a964064ca657a3283f..70d7b5c7d69d3700475d663b59505226
Services.obs.addObserver(this, "sessionstore-windows-restored", true);
if (this.sessionType == this.NO_SESSION) {
@@ -336,12 +341,7 @@ export var SessionStartup = {
@@ -337,12 +342,7 @@ export var SessionStartup = {
isAutomaticRestoreEnabled() {
if (this._resumeSessionEnabled === null) {
this._resumeSessionEnabled =
@@ -51,7 +51,7 @@ index 86600ffb5178599ab23270a964064ca657a3283f..70d7b5c7d69d3700475d663b59505226
}
return this._resumeSessionEnabled;
@@ -354,8 +354,7 @@ export var SessionStartup = {
@@ -355,8 +355,7 @@ export var SessionStartup = {
*/
willRestore() {
return (

View File

@@ -1,27 +1,52 @@
diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs
index 11191a82a0f0dc6eee60f9de52a63bc6085c3981..f995c3b297c53aa6ee2219bfc09515ee4aa3be28 100644
index 52fc803050cd257d6de52b1e4a92f3211cbaba88..a9841832ddce540dc0f9b14c29e5eadac7510935 100644
--- a/browser/components/sessionstore/SessionStore.sys.mjs
+++ b/browser/components/sessionstore/SessionStore.sys.mjs
@@ -129,6 +129,9 @@ const TAB_EVENTS = [
@@ -111,6 +111,11 @@ const TAB_EVENTS = [
"TabSplitViewActivate",
"SplitViewRemoved",
"SplitViewCreated",
+ "TabAddedToEssentials",
+ "TabRemovedFromEssentials",
+ "TabMove",
+ "TabGroupMoved",
+ "ZenWorkspaceDataChanged",
];
const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
@@ -201,6 +204,8 @@ ChromeUtils.defineESModuleGetters(lazy, {
TabStateCache: "resource:///modules/sessionstore/TabStateCache.sys.mjs",
TabStateFlusher: "resource:///modules/sessionstore/TabStateFlusher.sys.mjs",
@@ -185,6 +190,8 @@ const lazy = XPCOMUtils.declareLazy({
TabStateFlusher:
"moz-src:///browser/components/sessionstore/TabStateFlusher.sys.mjs",
setTimeout: "resource://gre/modules/Timer.sys.mjs",
+ ZenSessionStore: "resource:///modules/zen/ZenSessionManager.sys.mjs",
+ ZenWindowSync: "resource:///modules/zen/ZenWindowSync.sys.mjs",
});
blankURI: () => Services.io.newURI("about:blank"),
gRestoreWindowsToVirtualDesktop: {
pref: "browser.sessionstore.restore_windows_to_virtual_desktop",
@@ -348,6 +355,22 @@ class _SessionStore {
return this.#shouldRestoreLastSession;
}
ChromeUtils.defineLazyGetter(lazy, "blankURI", () => {
@@ -1300,10 +1305,7 @@ var SessionStoreInternal = {
+ get _windows() {
+ return this.#windows;
+ }
+
+ get _browserWindows() {
+ return this.#browserWindows;
+ }
+
+ set _deferredInitialState(aState) {
+ this.#deferredInitialState = aState;
+ }
+
+ initializeWindow(aWindow, aInitialState) {
+ this.#initializeWindow(aWindow, aInitialState);
+ }
+
// whether we will potentially be restoring the session
// more than once without Firefox restarting in between
#restoreWithoutRestart = false;
@@ -515,10 +538,7 @@ class _SessionStore {
*/
get willAutoRestore() {
return (
@@ -31,56 +56,58 @@ index 11191a82a0f0dc6eee60f9de52a63bc6085c3981..f995c3b297c53aa6ee2219bfc09515ee
- BROWSER_STARTUP_RESUME_SESSION)
+ true
);
},
}
@@ -1990,6 +1992,9 @@ var SessionStoreInternal = {
@@ -1215,6 +1235,11 @@ class _SessionStore {
case "TabPinned":
case "TabUnpinned":
case "SwapDocShells":
+ case "TabRemovedFromEssentials":
+ case "TabAddedToEssentials":
+ case "TabMove":
+ case "TabGroupMoved":
+ case "ZenWorkspaceDataChanged":
this.saveStateDelayed(win);
this.#saveStateDelayed(win);
break;
case "TabGroupCreate":
@@ -2099,6 +2104,10 @@ var SessionStoreInternal = {
this._windows[aWindow.__SSi].isTaskbarTab = true;
@@ -1341,6 +1366,10 @@ class _SessionStore {
this.#windows[aWindow.__SSi].isTaskbarTab = true;
}
+ if (aWindow.document.documentElement.hasAttribute("zen-unsynced-window")) {
+ this._windows[aWindow.__SSi].isZenUnsynced = true;
+ this.#windows[aWindow.__SSi].isZenUnsynced = true;
+ }
+
if (lazy.AIWindow.isAIWindowActiveAndEnabled(aWindow)) {
this._windows[aWindow.__SSi].isAIWindow = true;
this.#windows[aWindow.__SSi].isAIWindow = true;
}
@@ -2135,7 +2144,7 @@ var SessionStoreInternal = {
let isTaskbarTab = this._windows[aWindow.__SSi].isTaskbarTab;
@@ -1377,7 +1406,7 @@ class _SessionStore {
let isTaskbarTab = this.#windows[aWindow.__SSi].isTaskbarTab;
// A regular window is not a private window, taskbar tab window, or popup window
let isRegularWindow =
- !isPrivateWindow && !isTaskbarTab && aWindow.toolbar.visible;
+ !isPrivateWindow && !isTaskbarTab && aWindow.toolbar.visible && !this._windows[aWindow.__SSi].isZenUnsynced;
+ !isPrivateWindow && !isTaskbarTab && aWindow.toolbar.visible && !this.#windows[aWindow.__SSi].isZenUnsynced;
// perform additional initialization when the first window is loading
if (lazy.RunState.isStopped) {
@@ -2147,7 +2156,7 @@ var SessionStoreInternal = {
@@ -1389,7 +1418,7 @@ class _SessionStore {
// to disk to NOW() to enforce a full interval before the next write.
lazy.SessionSaver.updateLastSaveTime();
- if (isPrivateWindow || isTaskbarTab) {
+ if (isPrivateWindow || isTaskbarTab || aWindow.document.documentElement.hasAttribute("zen-unsynced-window")) {
this._log.debug(
this.#log.debug(
"initializeWindow, the window is private or a web app. Saving SessionStartup.state for possibly restoring later"
);
@@ -2191,6 +2200,7 @@ var SessionStoreInternal = {
@@ -1433,6 +1462,7 @@ class _SessionStore {
null,
"sessionstore-one-or-no-tab-restored"
);
+ lazy.ZenSessionStore.onNewEmptySession(aWindow);
this._deferredAllWindowsRestored.resolve();
this.#deferredAllWindowsRestored.resolve();
}
// this window was opened by _openWindowWithState
@@ -2240,7 +2250,6 @@ var SessionStoreInternal = {
// this window was opened by #openWindowWithState
@@ -1482,7 +1512,6 @@ class _SessionStore {
if (closedWindowState) {
let newWindowState;
if (
@@ -88,25 +115,25 @@ index 11191a82a0f0dc6eee60f9de52a63bc6085c3981..f995c3b297c53aa6ee2219bfc09515ee
!lazy.SessionStartup.willRestore()
) {
// We want to split the window up into pinned tabs and unpinned tabs.
@@ -2276,6 +2285,7 @@ var SessionStoreInternal = {
@@ -1518,6 +1547,7 @@ class _SessionStore {
}
if (newWindowState) {
+ lazy.ZenSessionStore.onRestoringClosedWindow(newWindowState);
// Ensure that the window state isn't hidden
this._restoreCount = 1;
this.#restoreCount = 1;
let state = { windows: [newWindowState] };
@@ -2312,6 +2322,9 @@ var SessionStoreInternal = {
@@ -1554,6 +1584,9 @@ class _SessionStore {
});
this._shouldRestoreLastSession = false;
this.#shouldRestoreLastSession = false;
}
+ else if (!aInitialState && isRegularWindow) {
+ lazy.ZenSessionStore.restoreNewWindow(aWindow, this);
+ }
if (this._restoreLastWindow && aWindow.toolbar.visible) {
if (this.#restoreLastWindow && aWindow.toolbar.visible) {
// always reset (if not a popup window)
@@ -2462,7 +2475,7 @@ var SessionStoreInternal = {
@@ -1704,7 +1737,7 @@ class _SessionStore {
var tabbrowser = aWindow.gBrowser;
@@ -115,56 +142,56 @@ index 11191a82a0f0dc6eee60f9de52a63bc6085c3981..f995c3b297c53aa6ee2219bfc09515ee
TAB_EVENTS.forEach(function (aEvent) {
tabbrowser.tabContainer.removeEventListener(aEvent, this, true);
@@ -2513,7 +2526,7 @@ var SessionStoreInternal = {
@@ -1755,7 +1788,7 @@ class _SessionStore {
let isLastRegularWindow =
Object.values(this._windows).filter(
Object.values(this.#windows).filter(
- wData => !wData.isPrivate && !wData.isTaskbarTab
+ wData => !wData.isPrivate && !wData.isTaskbarTab && !wData.isZenUnsynced
).length == 1;
this._log.debug(
this.#log.debug(
`onClose, closing window isLastRegularWindow? ${isLastRegularWindow}`
@@ -2570,8 +2583,8 @@ var SessionStoreInternal = {
@@ -1812,8 +1845,8 @@ class _SessionStore {
// 2) Flush the window.
// 3) When the flush is complete, revisit our decision to store the window
// in _closedWindows, and add/remove as necessary.
// in #closedWindows, and add/remove as necessary.
- if (!winData.isPrivate && !winData.isTaskbarTab) {
- this.maybeSaveClosedWindow(winData, isLastWindow);
- this.#maybeSaveClosedWindow(winData, isLastWindow);
+ if (!winData.isPrivate && !winData.isTaskbarTab && !winData.isZenUnsynced) {
+ this.maybeSaveClosedWindow(winData, isLastWindow, isLastRegularWindow);
+ this.#maybeSaveClosedWindow(winData, isLastWindow, isLastRegularWindow);
}
completionPromise = lazy.TabStateFlusher.flushWindow(aWindow).then(() => {
@@ -2591,8 +2604,9 @@ var SessionStoreInternal = {
@@ -1833,8 +1866,9 @@ class _SessionStore {
// Save non-private windows if they have at
// least one saveable tab or are the last window.
- if (!winData.isPrivate && !winData.isTaskbarTab) {
- this.maybeSaveClosedWindow(winData, isLastWindow);
- this.#maybeSaveClosedWindow(winData, isLastWindow);
+ lazy.ZenWindowSync.on_WindowCloseAndBrowserFlushed(browsers);
+ if (!winData.isPrivate && !winData.isTaskbarTab && !winData.isZenUnsynced) {
+ this.maybeSaveClosedWindow(winData, isLastWindow, isLastRegularWindow);
+ this.#maybeSaveClosedWindow(winData, isLastWindow, isLastRegularWindow);
if (!isLastWindow && winData.closedId > -1) {
this._addClosedAction(
@@ -2668,7 +2682,7 @@ var SessionStoreInternal = {
this.#addClosedAction(
@@ -1910,7 +1944,7 @@ class _SessionStore {
* to call this method again asynchronously (for example, after
* a window flush).
*/
- maybeSaveClosedWindow(winData, isLastWindow) {
+ maybeSaveClosedWindow(winData, isLastWindow, isLastRegularWindow = false) {
- #maybeSaveClosedWindow(winData, isLastWindow) {
+ #maybeSaveClosedWindow(winData, isLastWindow, isLastRegularWindow = false) {
// Make sure SessionStore is still running, and make sure that we
// haven't chosen to forget this window.
if (
@@ -2685,6 +2699,7 @@ var SessionStoreInternal = {
// _closedWindows from a previous call to this function.
let winIndex = this._closedWindows.indexOf(winData);
@@ -1927,6 +1961,7 @@ class _SessionStore {
// #closedWindows from a previous call to this function.
let winIndex = this.#closedWindows.indexOf(winData);
let alreadyStored = winIndex != -1;
+ lazy.ZenSessionStore.maybeSaveClosedWindow(winData, isLastRegularWindow);
// If sidebar command is truthy, i.e. sidebar is open, store sidebar settings
let shouldStore = hasSaveableTabs || isLastWindow;
@@ -3507,7 +3522,7 @@ var SessionStoreInternal = {
@@ -2744,7 +2779,7 @@ class _SessionStore {
if (!isPrivateWindow && tabState.isPrivate) {
return;
}
@@ -173,10 +200,14 @@ index 11191a82a0f0dc6eee60f9de52a63bc6085c3981..f995c3b297c53aa6ee2219bfc09515ee
return;
}
@@ -4246,6 +4261,12 @@ var SessionStoreInternal = {
@@ -3511,7 +3546,15 @@ class _SessionStore {
1,
Math.min(tabState.index, tabState.entries.length)
);
tabState.pinned = false;
- tabState.pinned = false;
+ tabState.pinned =
+ newTab.group?.isZenFolder === true &&
+ Services.prefs.getBoolPref("zen.folders.owned-tabs-in-folder");
+ tabState.zenEssential = false;
+ tabState.zenSyncId = null;
+ tabState.zenIsGlance = false;
@@ -186,7 +217,7 @@ index 11191a82a0f0dc6eee60f9de52a63bc6085c3981..f995c3b297c53aa6ee2219bfc09515ee
if (inBackground === false) {
aWindow.gBrowser.selectedTab = newTab;
@@ -4679,6 +4700,8 @@ var SessionStoreInternal = {
@@ -4036,6 +4079,8 @@ class _SessionStore {
// Append the tab if we're opening into a different window,
tabIndex: aSource == aTargetWindow ? pos : Infinity,
pinned: state.pinned,
@@ -195,7 +226,7 @@ index 11191a82a0f0dc6eee60f9de52a63bc6085c3981..f995c3b297c53aa6ee2219bfc09515ee
userContextId: state.userContextId,
skipLoad: true,
preferredRemoteType,
@@ -5176,9 +5199,10 @@ var SessionStoreInternal = {
@@ -4608,9 +4653,10 @@ class _SessionStore {
if (activePageData.title && activePageData.title != activePageData.url) {
win.gBrowser.setInitialTabTitle(tab, activePageData.title, {
isContentTitle: true,
@@ -207,7 +238,7 @@ index 11191a82a0f0dc6eee60f9de52a63bc6085c3981..f995c3b297c53aa6ee2219bfc09515ee
}
}
@@ -5543,7 +5567,7 @@ var SessionStoreInternal = {
@@ -4982,7 +5028,7 @@ class _SessionStore {
for (let i = tabbrowser.pinnedTabCount; i < tabbrowser.tabs.length; i++) {
let tab = tabbrowser.tabs[i];
@@ -216,30 +247,30 @@ index 11191a82a0f0dc6eee60f9de52a63bc6085c3981..f995c3b297c53aa6ee2219bfc09515ee
removableTabs.push(tab);
}
}
@@ -5656,7 +5680,7 @@ var SessionStoreInternal = {
@@ -5095,7 +5141,7 @@ class _SessionStore {
// collect the data for all windows
for (ix in this._windows) {
- if (this._windows[ix]._restoring || this._windows[ix].isTaskbarTab) {
+ if (this._windows[ix]._restoring || this._windows[ix].isTaskbarTab && !this._windows[ix].isZenUnsynced) {
// window data is still in _statesToRestore
for (ix in this.#windows) {
- if (this.#windows[ix]._restoring || this.#windows[ix].isTaskbarTab) {
+ if (this.#windows[ix]._restoring || this.#windows[ix].isTaskbarTab && !this.#windows[ix].isZenUnsynced) {
// window data is still in #statesToRestore
continue;
}
@@ -5800,11 +5824,12 @@ var SessionStoreInternal = {
@@ -5239,11 +5285,12 @@ class _SessionStore {
}
let tabbrowser = aWindow.gBrowser;
- let tabs = tabbrowser.tabs;
+ let tabs = aWindow.gZenWorkspaces.allStoredTabs;
/** @type {WindowStateData} */
let winData = this._windows[aWindow.__SSi];
let winData = this.#windows[aWindow.__SSi];
let tabsData = (winData.tabs = []);
+ winData.splitViewData = aWindow.gZenViewSplitter?.storeDataForSessionStore();
// update the internal state data for this window
for (let tab of tabs) {
if (tab == aWindow.FirefoxViewHandler.tab) {
@@ -5815,6 +5840,9 @@ var SessionStoreInternal = {
@@ -5254,6 +5301,9 @@ class _SessionStore {
tabsData.push(tabData);
}
@@ -249,7 +280,7 @@ index 11191a82a0f0dc6eee60f9de52a63bc6085c3981..f995c3b297c53aa6ee2219bfc09515ee
// update tab group state for this window
winData.groups = [];
for (let tabGroup of aWindow.gBrowser.tabGroups) {
@@ -5831,7 +5859,7 @@ var SessionStoreInternal = {
@@ -5270,7 +5320,7 @@ class _SessionStore {
// 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) {
@@ -258,7 +289,7 @@ index 11191a82a0f0dc6eee60f9de52a63bc6085c3981..f995c3b297c53aa6ee2219bfc09515ee
winData.title = tabbrowser.tabs[0].label;
}
winData.selected = selectedIndex;
@@ -6033,8 +6061,8 @@ var SessionStoreInternal = {
@@ -5472,8 +5522,8 @@ class _SessionStore {
// selectTab represents.
let selectTab = 0;
if (overwriteTabs) {
@@ -269,7 +300,7 @@ index 11191a82a0f0dc6eee60f9de52a63bc6085c3981..f995c3b297c53aa6ee2219bfc09515ee
selectTab = Math.min(selectTab, winData.tabs.length);
}
@@ -6056,6 +6084,7 @@ var SessionStoreInternal = {
@@ -5495,6 +5545,7 @@ class _SessionStore {
if (overwriteTabs) {
for (let i = tabbrowser.browsers.length - 1; i >= 0; i--) {
if (!tabbrowser.tabs[i].selected) {
@@ -277,7 +308,7 @@ index 11191a82a0f0dc6eee60f9de52a63bc6085c3981..f995c3b297c53aa6ee2219bfc09515ee
tabbrowser.removeTab(tabbrowser.tabs[i]);
}
}
@@ -6090,6 +6119,12 @@ var SessionStoreInternal = {
@@ -5529,6 +5580,12 @@ class _SessionStore {
savedTabGroup => !openTabGroupIdsInWindow.has(savedTabGroup.id)
);
}
@@ -290,7 +321,7 @@ index 11191a82a0f0dc6eee60f9de52a63bc6085c3981..f995c3b297c53aa6ee2219bfc09515ee
// Move the originally open tabs to the end.
if (initialTabs) {
@@ -6656,6 +6691,25 @@ var SessionStoreInternal = {
@@ -6098,6 +6155,25 @@ class _SessionStore {
// Most of tabData has been restored, now continue with restoring
// attributes that may trigger external events.
@@ -316,17 +347,25 @@ index 11191a82a0f0dc6eee60f9de52a63bc6085c3981..f995c3b297c53aa6ee2219bfc09515ee
if (tabData.pinned) {
tabbrowser.pinTab(tab);
@@ -6838,6 +6892,9 @@ var SessionStoreInternal = {
@@ -6272,6 +6348,9 @@ class _SessionStore {
aWindow.gURLBar.readOnly = false;
}
}
+ if (aWinData.isZenUnsynced) {
+ this._windows[aWindow.__SSi].isZenUnsynced = true;
+ this.#windows[aWindow.__SSi].isZenUnsynced = true;
+ }
let promiseParts = Promise.withResolvers();
aWindow.setTimeout(() => {
@@ -7633,7 +7690,7 @@ var SessionStoreInternal = {
const wasMinimized = aWindow.windowState == aWindow.STATE_MINIMIZED;
@@ -6774,6 +6853,7 @@ class _SessionStore {
*/
#isCmdLineEmpty(aWindow, aState) {
var pinnedOnly =
+ !Services.prefs.getBoolPref("zen.workspaces.continue-where-left-off") &&
aState.windows &&
aState.windows.every(win => win.tabs.every(tab => tab.pinned));
@@ -7116,7 +7196,7 @@ class _SessionStore {
let groupsToSave = new Map();
for (let tIndex = 0; tIndex < window.tabs.length; ) {
@@ -335,7 +374,7 @@ index 11191a82a0f0dc6eee60f9de52a63bc6085c3981..f995c3b297c53aa6ee2219bfc09515ee
// Adjust window.selected
if (tIndex + 1 < window.selected) {
window.selected -= 1;
@@ -7648,7 +7705,7 @@ var SessionStoreInternal = {
@@ -7131,7 +7211,7 @@ class _SessionStore {
);
// We don't want to increment tIndex here.
continue;
@@ -344,15 +383,15 @@ index 11191a82a0f0dc6eee60f9de52a63bc6085c3981..f995c3b297c53aa6ee2219bfc09515ee
// Convert any open groups into saved groups.
let groupStateToSave = window.groups.find(
groupState => groupState.id == window.tabs[tIndex].groupId
@@ -8193,7 +8250,6 @@ var SessionStoreInternal = {
@@ -7691,7 +7771,6 @@ class _SessionStore {
timer.initWithCallback(
function () {
() => {
if (beats <= 0) {
- this._log.debug(`looseTimer of ${delay} timed out`);
- this.#log.debug(`looseTimer of ${delay} timed out`);
Glean.sessionRestore.shutdownFlushAllOutcomes.timed_out.add(1);
deferred.resolve();
}
@@ -8671,6 +8727,7 @@ var SessionStoreInternal = {
@@ -8174,6 +8253,7 @@ class _SessionStore {
if (
!savedTabGroupState.tabs.length ||
this.getSavedTabGroup(savedTabGroupState.id)

View File

@@ -1,16 +1,16 @@
diff --git a/browser/components/sessionstore/TabState.sys.mjs b/browser/components/sessionstore/TabState.sys.mjs
index a33deeb5b587d6a950960a1a4781176e4e730ad7..e96cfb9a5ffbe4feccdffa8b6d18ececb48d4c52 100644
index bb7bd8c7ca88f776188fce64e0c85beb5ceb27a5..bdec77ba26172fe1b41369b1d45d5a6f9d52ae25 100644
--- a/browser/components/sessionstore/TabState.sys.mjs
+++ b/browser/components/sessionstore/TabState.sys.mjs
@@ -8,6 +8,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
PrivacyFilter: "resource://gre/modules/sessionstore/PrivacyFilter.sys.mjs",
TabAttributes: "resource:///modules/sessionstore/TabAttributes.sys.mjs",
TabStateCache: "resource:///modules/sessionstore/TabStateCache.sys.mjs",
@@ -10,6 +10,7 @@ const lazy = XPCOMUtils.declareLazy({
"moz-src:///browser/components/sessionstore/TabAttributes.sys.mjs",
TabStateCache:
"moz-src:///browser/components/sessionstore/TabStateCache.sys.mjs",
+ UrlbarShared: "chrome://browser/content/urlbar/UrlbarShared.mjs",
sessionStoreLogger: "resource:///modules/sessionstore/SessionLogger.sys.mjs",
sessionStoreLogger:
"moz-src:///browser/components/sessionstore/SessionLogger.sys.mjs",
});
@@ -103,10 +104,28 @@ class _TabState {
@@ -106,10 +107,28 @@ class _TabState {
}
}
@@ -39,3 +39,14 @@ index a33deeb5b587d6a950960a1a4781176e4e730ad7..e96cfb9a5ffbe4feccdffa8b6d18ecec
tabData.userContextId = tab.userContextId || 0;
@@ -135,6 +154,10 @@ class _TabState {
tabData.image = tabbrowser.getIcon(tab);
}
+ if (tab.zenStaticIcon) {
+ tabData.image = tab.zenStaticIcon;
+ }
+
// If there is a userTypedValue set, then either the user has typed something
// in the URL bar, or a new tab was opened with a URI to load.
// If so, we also track whether we were still in the process of loading something.

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/tabbrowser/content/drag-and-drop.js b/browser/components/tabbrowser/content/drag-and-drop.js
index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b15a030046 100644
index f9623f82499e516050d523068e70ebaa4fe9a66a..95bcc078a86b4ec4b35f5916b7e4a5e305afba9e 100644
--- a/browser/components/tabbrowser/content/drag-and-drop.js
+++ b/browser/components/tabbrowser/content/drag-and-drop.js
@@ -35,6 +35,9 @@
@@ -42,6 +42,9 @@
* @returns {MozTabbrowserTab|vbox}
*/
const elementToMove = element => {
@@ -12,7 +12,7 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
if (isTab(element) || isSplitViewWrapper(element)) {
return element;
}
@@ -118,6 +121,9 @@
@@ -140,6 +143,9 @@
}
let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0);
@@ -22,15 +22,15 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
if (
(dropEffect == "move" || dropEffect == "copy") &&
document == draggedTab.ownerDocument &&
@@ -138,6 +144,7 @@
!draggedTab.group.collapsed
@@ -161,6 +167,7 @@
) {
draggedTab.group.collapsedByDrag = true;
draggedTab.group.collapsed = true;
+ gZenFolders.animateGroupMove(draggedTab.group);
}
if (dropEffect == "move") {
@@ -145,10 +152,6 @@
@@ -168,10 +175,6 @@
// Pinned tabs in expanded vertical mode are on a grid format and require
// different logic to drag and drop.
@@ -41,7 +41,7 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
this._animateTabMove(event);
return;
}
@@ -287,6 +290,10 @@
@@ -310,6 +313,10 @@
this._tabDropIndicator.hidden = true;
event.stopPropagation();
@@ -52,7 +52,7 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
if (draggedTab && dropEffect == "copy") {
let duplicatedDraggedTab;
let duplicatedTabs = [];
@@ -312,12 +319,16 @@
@@ -337,12 +344,16 @@
let translateOffsetY = oldTranslateY % tabHeight;
let newTranslateX = oldTranslateX - translateOffsetX;
let newTranslateY = oldTranslateY - translateOffsetY;
@@ -73,7 +73,7 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
if (this._tabbrowserTabs.isContainerVerticalPinnedGrid(draggedTab)) {
// Update both translate axis for pinned vertical expanded tabs
@@ -392,11 +403,13 @@
@@ -417,11 +428,13 @@
this._dragToPinPromoCard,
];
let shouldPin =
@@ -87,15 +87,15 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
isTab(draggedTab) &&
draggedTab.pinned &&
this._tabbrowserTabs.arrowScrollbox.contains(event.target);
@@ -466,6 +479,7 @@
@@ -492,6 +505,7 @@
}
}
+ shouldTranslate = false;
if (shouldTranslate) {
this.#dropAnimationEndTime = Date.now() + DROP_ANIMATION_GRACE_MS;
let translationPromises = [];
for (let item of movingTabs) {
@@ -477,7 +491,7 @@
@@ -504,7 +518,7 @@
item.removeAttribute("tabdrop-samewindow");
resolve();
};
@@ -104,7 +104,7 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
postTransitionCleanup();
} else {
let onTransitionEnd = transitionendEvent => {
@@ -552,7 +566,7 @@
@@ -595,7 +609,7 @@
if (tab.selected) {
selectedTab = tab;
indexForSelectedTab = newIndex;
@@ -113,7 +113,7 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
const droppedIntoPinnedArea = dropIndex < gBrowser.pinnedTabCount;
const newSplitView = gBrowser.adoptSplitView(tab, {
elementIndex: droppedIntoPinnedArea
@@ -577,7 +591,7 @@
@@ -620,7 +634,7 @@
}
}
}
@@ -122,7 +122,7 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
const newTab = gBrowser.adoptTab(selectedTab, {
elementIndex: indexForSelectedTab,
selectTab: selectedTab == draggedTab,
@@ -611,10 +625,6 @@
@@ -654,10 +668,6 @@
this._tabbrowserTabs.dragAndDropElements[
gBrowser.pinnedTabCount + unpinnedSplitViews.length - 1
];
@@ -133,7 +133,7 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
}
}
} else {
@@ -664,6 +674,7 @@
@@ -717,6 +727,7 @@
let nextItem = this._tabbrowserTabs.dragAndDropElements[newIndex];
let tabGroup = isTab(nextItem) && nextItem.group;
@@ -141,12 +141,15 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
gBrowser.loadTabs(urls, {
inBackground,
replace,
@@ -705,7 +716,16 @@
@@ -758,6 +769,22 @@
this._expandGroupOnDrop(draggedTab);
}
this._resetTabsAfterDrop(draggedTab.ownerDocument);
-
+ if (!dt.mozUserCancelled && dt.dropEffect == "none" && !this._isCustomizing) {
this._resetTabsAfterDrop(draggedTab);
+ if (
+ !dt.mozUserCancelled &&
+ dt.dropEffect == "none" &&
+ !this._tabbrowserTabs._isCustomizing
+ ) {
+ const moved = gZenViewSplitter.moveTabToSplitView(event, draggedTab);
+ if (moved) {
+ delete draggedTab._dragData;
@@ -154,12 +157,14 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
+ }
+ } else if (dt.mozUserCancelled) {
+ gZenViewSplitter.onBrowserDragEndToSplit(event, true);
+ if (gZenViewSplitter._lastOpenedTab) gZenViewSplitter._lastOpenedTab._visuallySelected = false;
+ if (gZenViewSplitter._lastOpenedTab) {
+ gZenViewSplitter._lastOpenedTab._visuallySelected = false;
+ }
+ }
if (
dt.mozUserCancelled ||
dt.dropEffect != "none" ||
@@ -927,11 +947,10 @@
@@ -1088,11 +1115,10 @@
return this.#getHorizontalScrollboxDragTarget(event, ignoreSides);
}
while (target) {
@@ -175,7 +180,7 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
break;
}
target = target.parentNode;
@@ -961,6 +980,9 @@
@@ -1122,6 +1148,9 @@
return null;
}
}
@@ -185,17 +190,43 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
return target;
}
@@ -1014,7 +1036,8 @@
isTabGroupLabel(draggedTab) &&
draggedTab._dragData?.expandGroupOnDrop
) {
- draggedTab.group.collapsed = false;
+ draggedTab.group.collapsed = draggedTab.group.hasAttribute("has-active");
+ gZenFolders.animateGroupMove(draggedTab.group, true);
}
@@ -1188,17 +1217,24 @@
let periphery = draggedTab.ownerDocument.getElementById(
"tabbrowser-arrowscrollbox-periphery"
);
- // The group's tabs animate back to their full size, so hold on to the
- // space reserved for them until they get there.
- group.addEventListener(
- "TabGroupAnimationComplete",
- () => {
- group.collapsedByDrag = false;
- this.#releaseSpaceInScrolledContent(periphery);
- },
- { once: true }
- );
- group.collapsed = false;
+ const expand = !group.hasAttribute("has-active");
+ if (expand) {
+ // The group's tabs animate back to their full size, so hold on to the
+ // space reserved for them until they get there.
+ group.addEventListener(
+ "TabGroupAnimationComplete",
+ () => {
+ group.collapsedByDrag = false;
+ this.#releaseSpaceInScrolledContent(periphery);
+ },
+ { once: true }
+ );
+ } else {
+ group.collapsedByDrag = false;
+ this.#releaseSpaceInScrolledContent(periphery);
+ }
+ group.collapsed = !expand;
+ gZenFolders.animateGroupMove(group, true);
}
@@ -1206,7 +1229,6 @@
/**
@@ -1380,7 +1416,6 @@
// using updateDragImage. On Linux, we can use a panel.
if (platform == "win" || platform == "macosx") {
captureListener = function () {
@@ -203,7 +234,7 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
};
} else {
// Create a panel to use it in setDragImage
@@ -1244,7 +1266,6 @@
@@ -1418,7 +1453,6 @@
);
dragImageOffset = dragImageOffset * scale;
}
@@ -211,7 +242,7 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
// _dragData.offsetX/Y give the coordinates that the mouse should be
// positioned relative to the corner of the new window created upon
@@ -1263,7 +1284,7 @@
@@ -1437,7 +1471,7 @@
let dropEffect = this.getDropEffectForTabDrag(event);
let isMovingInTabStrip = !fromTabList && dropEffect == "move";
let collapseTabGroupDuringDrag =
@@ -220,7 +251,7 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
tab._dragData = {
offsetX: this._tabbrowserTabs.verticalMode
@@ -1273,7 +1294,7 @@
@@ -1447,7 +1481,7 @@
? event.screenY - window.screenY - tabOffset
: event.screenY - window.screenY,
scrollPos:
@@ -229,7 +260,7 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
? this._tabbrowserTabs.pinnedTabsContainer.scrollPosition
: this._tabbrowserTabs.arrowScrollbox.scrollPosition,
screenX: event.screenX,
@@ -1320,6 +1341,7 @@
@@ -1540,6 +1574,7 @@
if (tabStripItemElement.hasAttribute("dragtarget")) {
return;
}
@@ -237,7 +268,7 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
let isPinned = tab.pinned;
let dragAndDropElements = this._tabbrowserTabs.dragAndDropElements;
let isGrid = this._tabbrowserTabs.isContainerVerticalPinnedGrid(tab);
@@ -1686,23 +1708,6 @@
@@ -1913,23 +1948,6 @@
// Slide the relevant tabs to their new position.
// non-moving tabs adjust for RTL
@@ -261,7 +292,7 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
// moving tabs don't adjust for RTL
for (let item of selectedElements) {
if (
@@ -1751,7 +1756,6 @@
@@ -1978,7 +1996,6 @@
for (let item of this._tabbrowserTabs.dragAndDropElements) {
delete item._moveTogetherSelectedTabsData;
item = elementToMove(item);
@@ -269,7 +300,7 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
item.removeAttribute("multiselected-move-together");
}
}
@@ -2598,7 +2602,6 @@
@@ -2830,7 +2847,6 @@
tab.style.top = "";
tab.style.maxWidth = "";
tab.style.pointerEvents = "";
@@ -277,7 +308,7 @@ index 8bb1219962a1368f50b53c61041f135c68e35f31..8e72441d26883cbef7a352b00c0fe2b1
tab.removeAttribute("small-stack");
tab.removeAttribute("big-stack");
}
@@ -2607,11 +2610,9 @@
@@ -2839,11 +2855,9 @@
)) {
label.style.width = "";
label.style.maxWidth = "";

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/tabbrowser/content/tab-context-menu.js b/browser/components/tabbrowser/content/tab-context-menu.js
index 4a7cb33a4d9067d469bbe09d4cd8844581642f7a..2e2404b78deb428e57d01b8b929231f675a21323 100644
index 4a7cb33a4d9067d469bbe09d4cd8844581642f7a..d7f75471a207cccac6ca3dec49037ac30dd76163 100644
--- a/browser/components/tabbrowser/content/tab-context-menu.js
+++ b/browser/components/tabbrowser/content/tab-context-menu.js
@@ -839,7 +839,8 @@ var TabContextMenu = {
@@ -839,13 +839,15 @@ var TabContextMenu = {
);
contextUnpinSelectedTabs.hidden =
!this.contextTab.pinned || !this.multiselected;
@@ -12,3 +12,10 @@ index 4a7cb33a4d9067d469bbe09d4cd8844581642f7a..2e2404b78deb428e57d01b8b929231f6
// Build Ask Chat items. The classic layout shows the full ask-chat submenu
// (#context_askChat); the alt layout shows only a flat "Summarize Page" item
// (#context_askChatSummarize). Hide whichever one this layout doesn't use so
// a pref toggle reverses cleanly.
if (!this._altTabContextMenu) {
document.getElementById("context_askChatSummarize").hidden = true;
+ document.getElementById("context_aiSeparator").hidden = true;
TabContextMenu.GenAI.buildTabMenu(
document.getElementById("context_askChat"),
this

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/tabgroup.js b/browser/components/tabbrowser/content/tabgroup.js
index 237950fb2c449ce088c204d33a70b1d95dae549b..af200a043dcd2e24393fcefe32493e356c9f8c6f 100644
index 237950fb2c449ce088c204d33a70b1d95dae549b..635f9dbc5c79b6bb869b4ab4ec2d4b4e226b4672 100644
--- a/browser/components/tabbrowser/content/tabgroup.js
+++ b/browser/components/tabbrowser/content/tabgroup.js
@@ -14,11 +14,11 @@
@@ -101,7 +101,7 @@ index 237950fb2c449ce088c204d33a70b1d95dae549b..af200a043dcd2e24393fcefe32493e35
resetDefaultGroupName = () => {
this.#defaultGroupName = "";
@@ -175,10 +198,15 @@
@@ -175,10 +198,18 @@
if (!this.#tabChangeObserver) {
this.#tabChangeObserver = new window.MutationObserver(mutations => {
if (!this.tabs.length) {
@@ -112,12 +112,15 @@ index 237950fb2c449ce088c204d33a70b1d95dae549b..af200a043dcd2e24393fcefe32493e35
new CustomEvent("TabGroupRemoved", { bubbles: true })
);
+ gZenVerticalTabsManager.animateItemClose(this).then(() => {
+ this.dispatchEvent(
+ new CustomEvent("TabGroupRemovedFromDOM", { bubbles: true })
+ );
this.remove();
+ });
Services.obs.notifyObservers(
this,
"browser-tabgroup-removed-from-dom"
@@ -223,7 +251,10 @@
@@ -223,7 +254,10 @@
}
});
}
@@ -129,7 +132,7 @@ index 237950fb2c449ce088c204d33a70b1d95dae549b..af200a043dcd2e24393fcefe32493e35
}
get color() {
@@ -330,6 +361,9 @@
@@ -330,6 +364,9 @@
}
set collapsed(val) {
@@ -139,7 +142,7 @@ index 237950fb2c449ce088c204d33a70b1d95dae549b..af200a043dcd2e24393fcefe32493e35
if (!!val == this.collapsed) {
return;
}
@@ -416,7 +450,6 @@
@@ -416,7 +453,6 @@
tabGroupName,
})
.then(result => {
@@ -147,7 +150,7 @@ index 237950fb2c449ce088c204d33a70b1d95dae549b..af200a043dcd2e24393fcefe32493e35
});
}
@@ -491,13 +524,68 @@
@@ -491,13 +527,68 @@
* @returns {MozTabbrowserTab[]}
*/
get tabs() {
@@ -162,9 +165,8 @@ index 237950fb2c449ce088c204d33a70b1d95dae549b..af200a043dcd2e24393fcefe32493e35
+ tabsCollect.push(item);
+ if (gBrowser.isTabGroup(item)) {
+ tabsCollect.push(...item.tabs);
}
}
- return childrenArray.filter(node => node.matches("tab"));
+ }
+ }
+ return tabsCollect.filter(node => node.matches("tab"));
+ }
+
@@ -208,8 +210,9 @@ index 237950fb2c449ce088c204d33a70b1d95dae549b..af200a043dcd2e24393fcefe32493e35
+ currentGroup = currentGroup?.group;
+ if (currentGroup.collapsed) {
+ return false;
+ }
+ }
}
}
- return childrenArray.filter(node => node.matches("tab"));
+ if (this.pinned && gZenWorkspaces.activeWorkspaceElement?.hasCollapsedPinnedTabs) {
+ return false;
+ }
@@ -221,7 +224,7 @@ index 237950fb2c449ce088c204d33a70b1d95dae549b..af200a043dcd2e24393fcefe32493e35
}
/**
@@ -617,9 +705,6 @@
@@ -617,9 +708,6 @@
});
} else {
if (tabOrSplitView.pinned) {
@@ -231,7 +234,7 @@ index 237950fb2c449ce088c204d33a70b1d95dae549b..af200a043dcd2e24393fcefe32493e35
}
let tabToMove =
this.documentGlobal === tabOrSplitView.documentGlobal
@@ -682,7 +767,7 @@
@@ -682,7 +770,7 @@
*/
on_click(event) {
let isToggleElement =
@@ -240,7 +243,7 @@ index 237950fb2c449ce088c204d33a70b1d95dae549b..af200a043dcd2e24393fcefe32493e35
event.target === this.#overflowCountLabel;
if (isToggleElement && event.button === 0) {
event.preventDefault();
@@ -761,5 +846,6 @@
@@ -761,5 +849,6 @@
}
}

View File

@@ -1,8 +1,18 @@
diff --git a/browser/components/urlbar/UrlbarPrefs.sys.mjs b/browser/components/urlbar/UrlbarPrefs.sys.mjs
index 2d21248256c6c2bfb8dac958133c10e3251ef564..f788bd10ec2c08e4b27b77cd3bb0489fb04e8b7a 100644
index e48f0295d803ba9eac5ab9d01ebb3b3dacbc9d4b..cb78b74230f63a47479404767b5ab5883278dfba 100644
--- a/browser/components/urlbar/UrlbarPrefs.sys.mjs
+++ b/browser/components/urlbar/UrlbarPrefs.sys.mjs
@@ -462,6 +462,7 @@ const PREF_URLBAR_DEFAULTS = /** @type {PreferenceDefinition[]} */ ([
@@ -161,6 +161,9 @@ const PREF_URLBAR_DEFAULTS = /** @type {PreferenceDefinition[]} */ ([
// Feature gate pref for flight status suggestions in the urlbar.
["flightStatus.featureGate", false],
+ // Whether to close the urlbar when blurring the window while the urlbar is focused.
+ ["closeOnWindowBlur", true],
+
// The minimum prefix length of a flight status keyword the user must type to
// trigger the suggestion. 0 means the min length should be taken from Nimbus
// or remote settings.
@@ -486,6 +489,7 @@ const PREF_URLBAR_DEFAULTS = /** @type {PreferenceDefinition[]} */ ([
["shortcuts.tabs", true],
["shortcuts.history", true],
["shortcuts.actions", true],
@@ -10,12 +20,12 @@ index 2d21248256c6c2bfb8dac958133c10e3251ef564..f788bd10ec2c08e4b27b77cd3bb0489f
// Boolean to determine if the providers defined in `exposureResults`
// should be displayed in search results. This can be set by a
@@ -799,6 +800,8 @@ function makeDefaultResultGroups({ showSearchSuggestionsFirst }) {
@@ -854,6 +858,8 @@ function makeDefaultResultGroups({
*/
let rootGroup = {
children: [
+ { children: [{ group: lazy.UrlbarUtils.RESULT_GROUP.ZEN_ACTION }] },
+ { children: [{ group: lazy.UrlbarUtils.RESULT_GROUP.ZEN_WORKSPACE }] },
+ { children: [{ group: lazy.UrlbarShared.RESULT_GROUP.ZEN_ACTION }] },
+ { children: [{ group: lazy.UrlbarShared.RESULT_GROUP.ZEN_WORKSPACE }] },
// heuristic
{
maxResultCount: 1,

View File

@@ -1,15 +1,15 @@
diff --git a/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs b/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs
index f611d8e44af518aa1adc7505c5021235f55b49de..0eca20cb869626dfa6ace02acc00cad84462d54f 100644
index e32b02941a6019703212cede4660a24b88845120..5cb363ed20d49c1ae8abedecc3b08540406b7a1b 100644
--- a/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs
+++ b/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs
@@ -78,22 +78,26 @@ export class UrlbarProviderHeuristicFallback extends UrlbarProvider {
@@ -76,22 +76,26 @@ export class UrlbarProviderHeuristicFallback extends UrlbarProvider {
// Since we can't tell if this is a real URL and whether the user wants
// to visit or search for it, we provide an alternative searchengine
// match if the string looks like an alphanumeric origin or an e-mail.
- let str = queryContext.searchString;
- if (!URL.canParse(str)) {
- if (
- lazy.UrlbarPrefs.get("keyword.enabled") &&
- queryContext.keywordEnabled &&
- (lazy.UrlUtils.looksLikeOrigin(str, {
- noIp: true,
- noPort: true,
@@ -17,14 +17,14 @@ index f611d8e44af518aa1adc7505c5021235f55b49de..0eca20cb869626dfa6ace02acc00cad8
- lazy.UrlUtils.REGEXP_COMMON_EMAIL.test(str))
- ) {
+ let trimmedSearchString = queryContext.trimmedSearchString;
+ let [searchCandidate] = UrlbarUtils.stripPrefixAndTrim(
+ let [searchCandidate] = lazy.UrlbarShared.stripPrefixAndTrim(
+ trimmedSearchString,
+ {
+ trimSlash: true,
+ }
+ );
+ if (
+ lazy.UrlbarPrefs.get("keyword.enabled") &&
+ queryContext.keywordEnabled &&
+ (lazy.UrlUtils.looksLikeUrl(searchCandidate) ||
+ lazy.UrlUtils.looksLikeOrigin(searchCandidate, {
+ allowPartialNumericalTLDs: true,

View File

@@ -1,41 +0,0 @@
diff --git a/browser/components/urlbar/UrlbarUtils.sys.mjs b/browser/components/urlbar/UrlbarUtils.sys.mjs
index 78c76bde00b6b581184cee1cd0e1756e5f2da6a4..94c713470b1240729ef2350d090b0449f3801af4 100644
--- a/browser/components/urlbar/UrlbarUtils.sys.mjs
+++ b/browser/components/urlbar/UrlbarUtils.sys.mjs
@@ -126,6 +126,8 @@ export var UrlbarUtils = {
SEMANTIC_HISTORY: "semanticHistory",
SUGGESTED_INDEX: "suggestedIndex",
TAIL_SUGGESTION: "tailSuggestion",
+ ZEN_ACTION: "zenAction",
+ ZEN_WORKSPACE: "zenWorkspace",
}),
// Defines provider types.
@@ -274,6 +276,14 @@ export var UrlbarUtils = {
telemetryLabel: "actions",
uiLabel: "urlbar-searchmode-actions3",
},
+ {
+ source: UrlbarShared.RESULT_SOURCE.WORKSPACES,
+ restrict: UrlbarShared.RESTRICT_TOKENS.WORKSPACE,
+ icon: "chrome://browser/skin/zen-icons/selectable/layers.svg",
+ pref: "shortcuts.workspaces",
+ telemetryLabel: "workspaces",
+ uiLabel: "urlbar-search-mode-workspaces",
+ },
]);
},
@@ -566,6 +576,12 @@ export var UrlbarUtils = {
return this.RESULT_GROUP.HEURISTIC_FALLBACK;
case "UrlbarProviderHistoryUrlHeuristic":
return this.RESULT_GROUP.HEURISTIC_HISTORY_URL;
+ case "ZenUrlbarProviderGlobalActions":
+ if (result.source == UrlbarShared.RESULT_SOURCE.WORKSPACES) {
+ return this.RESULT_GROUP.ZEN_WORKSPACE;
+ } else {
+ return this.RESULT_GROUP.ZEN_ACTION;
+ }
case "UrlbarProviderOmnibox":
return this.RESULT_GROUP.HEURISTIC_OMNIBOX;
case "UrlbarProviderRestrictKeywordsAutofill":

View File

@@ -1,16 +1,16 @@
diff --git a/browser/components/urlbar/content/UrlbarChildController.mjs b/browser/components/urlbar/content/UrlbarChildController.mjs
index a8e9d3093d046612650a17970330a8279f55833f..063a3e8adf009d6c0ddc60430bc0e7485e812b8a 100644
index 52ed36deac35d3de9f7f537313159fb4debe98a6..3bbc612a2e10eedafdabdaa8e17cf36831a6a27c 100644
--- a/browser/components/urlbar/content/UrlbarChildController.mjs
+++ b/browser/components/urlbar/content/UrlbarChildController.mjs
@@ -258,7 +258,6 @@ export class UrlbarChildController {
const isMac = AppConstants.platform == "macosx";
@@ -446,7 +446,6 @@ export class UrlbarChildController {
const isMac = UrlbarContentUtils.getPlatform() == "macosx";
// Handle readline/emacs-style navigation bindings on Mac.
if (
- isMac &&
this.view.isOpen &&
event.ctrlKey &&
(event.key == "n" || event.key == "p")
@@ -450,6 +449,8 @@ export class UrlbarChildController {
@@ -644,6 +643,8 @@ export class UrlbarChildController {
});
}
event.preventDefault();
@@ -19,3 +19,25 @@ index a8e9d3093d046612650a17970330a8279f55833f..063a3e8adf009d6c0ddc60430bc0e748
}
break;
}
@@ -905,6 +906,10 @@ export class UrlbarChildController {
}
reuseEmpty = true;
}
+ if (this.#input.hasAttribute?.("zen-newtab")) {
+ where = "tab";
+ reuseEmpty = true;
+ }
// The browser window exists only in chrome; a content-process input has no
// tab to reuse, so `gBrowser` is absent and the reuse is skipped.
if (
@@ -914,6 +919,10 @@ export class UrlbarChildController {
) {
where = "current";
}
+ if (this.window.gBrowser?.selectedTab.hasAttribute("zen-empty-tab")) {
+ // Always open in a new tab if the current tab is our empty tab.
+ return "tab";
+ }
return where;
}

View File

@@ -1,22 +1,21 @@
diff --git a/browser/components/urlbar/content/UrlbarInput.mjs b/browser/components/urlbar/content/UrlbarInput.mjs
index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a6182579cbaf4d 100644
--- a/browser/components/urlbar/content/UrlbarInput.mjs
+++ b/browser/components/urlbar/content/UrlbarInput.mjs
@@ -101,6 +101,13 @@ const lazy = XPCOMUtils.declareLazy({
logger: () => UrlbarShared.getLogger({ prefix: "Input" }),
});
diff --git a/browser/components/urlbar/content/UrlbarInputBase.mjs b/browser/components/urlbar/content/UrlbarInputBase.mjs
index 8be35b58c5369e123ca69426e852e3849bf75513..170cffbdd12a72dab15976cdab9207dc4292d4e6 100644
--- a/browser/components/urlbar/content/UrlbarInputBase.mjs
+++ b/browser/components/urlbar/content/UrlbarInputBase.mjs
@@ -83,6 +83,12 @@ if (lazy) {
Ci.nsIURLQueryStringStripper,
],
});
+ XPCOMUtils.defineLazyPreferenceGetter(
+ lazy,
+ "ZEN_URLBAR_BEHAVIOR",
+ "zen.urlbar.behavior",
+ 'default'
+ );
}
+XPCOMUtils.defineLazyPreferenceGetter(
+ lazy,
+ "ZEN_URLBAR_BEHAVIOR",
+ "zen.urlbar.behavior",
+ 'default'
+);
+
const UNLIMITED_MAX_RESULTS = 99;
let getBoundsWithoutFlushing = element =>
@@ -769,7 +776,16 @@ ${
const logger = () => UrlbarShared.getLogger({ prefix: "Input" });
@@ -917,7 +923,16 @@ ${
// See _on_select(). HTMLInputElement.select() dispatches a "select"
// event but does not set the primary selection.
this._suppressPrimaryAdjustment = true;
@@ -33,7 +32,7 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
this._suppressPrimaryAdjustment = false;
}
@@ -843,6 +859,10 @@ ${
@@ -992,6 +1007,10 @@ ${
hideSearchTerms = false,
isSameDocument = false,
} = {}) {
@@ -44,7 +43,7 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
if (!this.#isAddressbar) {
throw new Error(
"Cannot set URI for UrlbarInput that is not an address bar"
@@ -1137,7 +1157,16 @@ ${
@@ -1289,7 +1308,16 @@ ${
this.searchModeSwitcher?.updateSearchIcon();
}
@@ -61,7 +60,17 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
}
/**
@@ -1626,7 +1655,11 @@ ${
@@ -1401,6 +1429,9 @@ ${
where,
query: searchString,
});
+ if (where != "current" && this.sapName != "searchbar") {
+ this.handleRevert();
+ }
this.controller.openSERP(
engine.id,
searchString,
@@ -1884,7 +1915,11 @@ ${
openParams.avoidBrowserFocus = keepViewOpen;
if (!this.#providesSearchMode(result) && !keepViewOpen) {
@@ -74,12 +83,12 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
}
if (isCanonized) {
@@ -2974,6 +3007,42 @@ ${
@@ -3181,6 +3216,42 @@ ${
await this.#updateLayoutBreakoutDimensions();
}
+ zenFormatURLValue() {
+ return this.#lazy.valueFormatter._formatURL();
+ return this.#getValueFormatter().update();
+ }
+
+ get zenUrlbarBehavior() {
@@ -117,7 +126,7 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
startLayoutExtend() {
if (!this.#allowBreakout || this.hasAttribute("breakout-extend")) {
// Do not expand if the Urlbar does not support being expanded or it is
@@ -2988,6 +3057,13 @@ ${
@@ -3195,6 +3266,13 @@ ${
this.toggleAttribute("breakout-extend", true);
this.#updateTextboxPosition();
@@ -131,7 +140,7 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
// 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")) {
@@ -3011,6 +3087,29 @@ ${
@@ -3218,6 +3296,29 @@ ${
return;
}
@@ -161,7 +170,7 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
this.toggleAttribute("breakout-extend", false);
this.#updateTextboxPosition();
}
@@ -3049,7 +3148,7 @@ ${
@@ -3256,7 +3357,7 @@ ${
forceUnifiedSearchButtonAvailable = false
) {
let prevState = this.getAttribute("pageproxystate");
@@ -170,20 +179,20 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
this.setAttribute("pageproxystate", state);
this._inputContainer.setAttribute("pageproxystate", state);
this._identityBox?.setAttribute("pageproxystate", state);
@@ -3332,10 +3431,12 @@ ${
@@ -3533,7 +3634,11 @@ ${
return;
}
this.style.top = px(
- this.style.top = px(getUntransformedTop(this.parentNode));
+ this.style.top = px(
+ this.window.gZenVerticalTabsManager._hasSetSingleToolbar ?
this.parentNode.getBoxQuads({
ignoreTransforms: true,
flush: false,
})[0].p1.y
+ : (AppConstants.platform == "macosx" ? -2 : -5)
);
+ getUntransformedTop(this.parentNode)
+ : (UrlbarContentUtils.getPlatform() == "macosx" ? -2 : -5)
+ );
}
@@ -3394,9 +3495,10 @@ ${
#updateTextboxPositionNextFrame() {
@@ -3591,9 +3696,10 @@ ${
return;
}
@@ -193,9 +202,9 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
- px(getBoundsWithoutFlushing(this.parentNode).height)
+ px(getBoundsWithoutFlushing(this.parentNode).height + 8)
);
this.style.setProperty(
"--urlbar-height",
@@ -3902,6 +4004,7 @@ ${
if (this.#breakoutBlockerCount) {
@@ -4108,6 +4214,7 @@ ${
}
_toggleActionOverride(event) {
@@ -203,63 +212,49 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
if (
event.keyCode == KeyEvent.DOM_VK_SHIFT ||
event.keyCode == KeyEvent.DOM_VK_ALT ||
@@ -4014,8 +4117,8 @@ ${
@@ -4206,9 +4313,10 @@ ${
if (!this.#isAddressbar) {
return val;
}
- let trimmedValue = lazy.UrlbarPrefs.get("trimURLs")
- let trimmedValue = UrlbarPrefs.get("trimURLs")
- ? lazy.BrowserUIUtils.trimURL(val)
+ let trimmedValue = lazy.UrlbarPrefs.get("trimURLs") && this._zenTrimURL
+ ? this._zenTrimURL(val)
: val;
- : val;
+ let trimmedValue =
+ UrlbarPrefs.get("trimURLs") && this._zenTrimURL
+ ? this._zenTrimURL(val)
+ : val;
// Only trim value if the directionality doesn't change to RTL and we're not
// showing a strikeout https protocol.
@@ -4317,6 +4420,7 @@ ${
browser = this.window.gBrowser.selectedBrowser,
keepViewOpen = false
) {
+ openUILinkWhere = this.window.gZenUIManager.getOpenUILinkWhere(url, browser, openUILinkWhere);
if (this.#isAddressbar) {
this.#prepareAddressbarLoad(
url,
@@ -4430,6 +4534,10 @@ ${
}
reuseEmpty = true;
}
+ if (this.hasAttribute("zen-newtab")) {
+ where = "tab";
+ reuseEmpty = true;
+ }
return UrlbarContentUtils.isTextDirectionRTL(trimmedValue, window) ||
@@ -4410,6 +4518,11 @@ ${
keepViewOpen = false,
browserId = null,
}) {
+ where = this.window.gZenUIManager.getOpenUILinkWhere(
+ loadRequest.urlLoad?.url ?? "",
+ this.window.gBrowser.selectedBrowser,
+ where
+ );
let keyDownEnterDeferred;
if (
where == "tab" &&
reuseEmpty &&
@@ -4437,6 +4545,9 @@ ${
) {
where = "current";
}
+ if (this.window.gBrowser.selectedTab.hasAttribute("zen-empty-tab")) {
+ return "tab"; // Always open in a new tab if the current tab is "our empty tab".
+ }
return where;
}
this._keyDownEnterDeferred &&
@@ -4731,6 +4844,7 @@ ${
this.setResultForCurrentValue(null);
this.handleCommand();
this.controller.clearLastQueryContextCache();
+ this.view.close();
@@ -4691,6 +4802,7 @@ ${
this.setResultForCurrentValue(null);
this.handleCommand();
this.controller.clearLastQueryContextCache();
+ this.view.close();
this._suppressStartQuery = false;
});
@@ -4742,7 +4856,6 @@ ${
// Close the results pane, because paste and go doesn't want a result
// selection. This has to happen before the menu opens: ending
// breakout-extend once it's open keeps it from showing (bug 2037468).
- this.view.close();
this._suppressStartQuery = false;
});
@@ -4698,7 +4810,6 @@ ${
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.
- this.view.close();
let controller =
this.document.commandDispatcher.getControllerForCommand("cmd_paste");
@@ -4979,7 +5090,11 @@ ${
let controller =
this.document.commandDispatcher.getControllerForCommand("cmd_paste");
@@ -5025,7 +5138,11 @@ ${
if (!engineName && !source && !this.hasAttribute("searchmode")) {
return;
}
@@ -272,7 +267,7 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
if (this._searchModeIndicatorTitle) {
this._searchModeIndicatorTitle.textContent = "";
this._searchModeIndicatorTitle.removeAttribute("data-l10n-id");
@@ -5297,6 +5412,7 @@ ${
@@ -5335,6 +5452,7 @@ ${
this.document.l10n.setAttributes(
this.inputField,
@@ -280,7 +275,20 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
l10nId,
l10nId == "urlbar-placeholder-with-name"
? { name: engineName }
@@ -5424,6 +5540,11 @@ ${
@@ -5385,6 +5503,12 @@ ${
}
logger().debug("Blur Event");
+ if (
+ this.document.commandDispatcher.focusedElement == this.inputField &&
+ !UrlbarPrefs.get("closeOnWindowBlur")
+ ) {
+ return;
+ }
// We cannot count every blur events after a missed engagement as abandoment
// because the user may have clicked on some view element that executes
// a command causing a focus change. For example opening preferences from
@@ -5464,6 +5588,11 @@ ${
}
_on_click(event) {
@@ -292,7 +300,7 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
switch (event.target) {
case this.inputField:
case this._inputContainer:
@@ -5513,10 +5634,11 @@ ${
@@ -5558,10 +5687,11 @@ ${
}
if (untrim) {
this.setValue(this._untrimmedValue);
@@ -305,7 +313,7 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
this.view.autoOpen({ event });
} else {
if (this._untrimOnFocusAfterKeydown) {
@@ -5556,9 +5678,16 @@ ${
@@ -5605,9 +5735,16 @@ ${
}
_on_mousedown(event) {
@@ -323,7 +331,7 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
if (
event.composedTarget != this.inputField &&
event.composedTarget != this._inputContainer
@@ -5568,6 +5697,10 @@ ${
@@ -5617,6 +5754,10 @@ ${
this.focusedViaMousedown = !this.focused;
this.#preventClickSelectsAll = this.focused;
@@ -334,7 +342,7 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
// Keep the focus status, since the attribute may be changed
// upon calling this.focus().
@@ -5605,7 +5738,7 @@ ${
@@ -5654,7 +5795,7 @@ ${
// view open on tab switch, and the TabSelect event arrived earlier.
// Also ignore mousedown on the urlbarView context menu: opening/closing the
// view is already handled by the result opening flow.
@@ -343,12 +351,12 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
break;
}
@@ -5894,7 +6027,7 @@ ${
@@ -5948,7 +6089,7 @@ ${
// When we are in actions search mode we can show more results so
// increase the limit.
let maxResults =
- this.searchMode?.source != UrlbarShared.RESULT_SOURCE.ACTIONS
+ this.searchMode?.source != UrlbarShared.RESULT_SOURCE.ZEN_ACTIONS
? lazy.UrlbarPrefs.get("maxRichResults")
? UrlbarPrefs.get("maxRichResults")
: UNLIMITED_MAX_RESULTS;
let options = {

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/urlbar/content/UrlbarShared.mjs b/browser/components/urlbar/content/UrlbarShared.mjs
index 5b45afb747bfcdbd06782186737669aa2c4c634d..f68bd009f70415b5fb513abdfe19b4427ceefbfc 100644
index 0ac5330223c84fbb98880a5c2d83ae58a8f3079e..f9d3d27333f5552404bd8a1138fb1e5d6150a3d8 100644
--- a/browser/components/urlbar/content/UrlbarShared.mjs
+++ b/browser/components/urlbar/content/UrlbarShared.mjs
@@ -47,6 +47,7 @@ export const UrlbarShared = {
@@ -158,6 +158,7 @@ export const UrlbarShared = {
// `looksLikeOrigin()` returned `LOOKS_LIKE_ORIGIN.OTHER` for this token.
// It may or may not be an origin.
POSSIBLE_ORIGIN_BUT_SEARCH_ALLOWED: 12,
@@ -10,7 +10,7 @@ index 5b45afb747bfcdbd06782186737669aa2c4c634d..f68bd009f70415b5fb513abdfe19b442
}),
/**
@@ -67,6 +68,7 @@ export const UrlbarShared = {
@@ -178,6 +179,7 @@ export const UrlbarShared = {
TITLE: "#",
URL: "$",
ACTION: ">",
@@ -18,7 +18,7 @@ index 5b45afb747bfcdbd06782186737669aa2c4c634d..f68bd009f70415b5fb513abdfe19b442
}),
// Defines UrlbarResult types.
@@ -112,6 +114,8 @@ export const UrlbarShared = {
@@ -223,6 +225,8 @@ export const UrlbarShared = {
OTHER_NETWORK: 6,
ADDON: 7,
ACTIONS: 8,
@@ -26,12 +26,48 @@ index 5b45afb747bfcdbd06782186737669aa2c4c634d..f68bd009f70415b5fb513abdfe19b442
+ WORKSPACES: 10,
}),
/**
@@ -128,6 +132,7 @@ export const UrlbarShared = {
if (lazy.UrlbarPrefs.get("scotchBonnet.enableOverride")) {
// Results are categorized into groups to help the muxer compose them. See
@@ -258,6 +262,8 @@ export const UrlbarShared = {
SEMANTIC_HISTORY: "semanticHistory",
SUGGESTED_INDEX: "suggestedIndex",
TAIL_SUGGESTION: "tailSuggestion",
+ ZEN_ACTION: "zenAction",
+ ZEN_WORKSPACE: "zenWorkspace",
}),
// Defines provider types.
@@ -443,6 +449,14 @@ export const UrlbarShared = {
telemetryLabel: "actions",
uiLabel: "urlbar-searchmode-actions3",
},
+ {
+ source: this.RESULT_SOURCE.WORKSPACES,
+ restrict: this.RESTRICT_TOKENS.WORKSPACE,
+ icon: "chrome://browser/skin/zen-icons/selectable/layers.svg",
+ pref: "shortcuts.workspaces",
+ telemetryLabel: "workspaces",
+ uiLabel: "urlbar-search-mode-workspaces",
+ },
]);
},
@@ -460,6 +474,7 @@ export const UrlbarShared = {
if (UrlbarPrefs.get("scotchBonnet.enableOverride")) {
keys.push(this.RESTRICT_TOKENS.ACTION);
}
+ keys.push(this.RESTRICT_TOKENS.WORKSPACE);
return new Set(keys);
},
@@ -1032,6 +1047,11 @@ export const UrlbarShared = {
return UrlbarShared.RESULT_GROUP.HEURISTIC_FALLBACK;
case "UrlbarProviderHistoryUrlHeuristic":
return UrlbarShared.RESULT_GROUP.HEURISTIC_HISTORY_URL;
+ case "ZenUrlbarProviderGlobalActions":
+ if (result.source == UrlbarShared.RESULT_SOURCE.WORKSPACES) {
+ return UrlbarShared.RESULT_GROUP.ZEN_WORKSPACE;
+ }
+ return UrlbarShared.RESULT_GROUP.ZEN_ACTION;
case "UrlbarProviderOmnibox":
return UrlbarShared.RESULT_GROUP.HEURISTIC_OMNIBOX;
case "UrlbarProviderRestrictKeywordsAutofill":

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/urlbar/content/UrlbarView.mjs b/browser/components/urlbar/content/UrlbarView.mjs
index 8afb2bf4a757b3ef7902f5a6e6eed6b70ca2845e..440dea1e66540ca1998cb7464b6695ac823fedcb 100644
index 9a2c787cfa4d70bd587d49e017075f905c90f626..1c3b341e5d520ec9541c4021aaedce98751b6993 100644
--- a/browser/components/urlbar/content/UrlbarView.mjs
+++ b/browser/components/urlbar/content/UrlbarView.mjs
@@ -674,7 +674,7 @@ export class UrlbarView {
@@ -822,7 +822,7 @@ export class UrlbarView {
!this.input.value ||
this.input.getAttribute("pageproxystate") == "valid"
) {
@@ -11,7 +11,7 @@ index 8afb2bf4a757b3ef7902f5a6e6eed6b70ca2845e..440dea1e66540ca1998cb7464b6695ac
// 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.
@@ -812,10 +812,6 @@ export class UrlbarView {
@@ -963,10 +963,6 @@ export class UrlbarView {
}
// If search mode isn't active, close the view.
@@ -22,7 +22,7 @@ index 8afb2bf4a757b3ef7902f5a6e6eed6b70ca2845e..440dea1e66540ca1998cb7464b6695ac
// Search mode is active. If the one-offs should be shown, make sure they
// are enabled and show the view.
@@ -3031,6 +3027,8 @@ export class UrlbarView {
@@ -3306,6 +3302,8 @@ export class UrlbarView {
if (row?.hasAttribute("row-selectable")) {
row?.toggleAttribute("selected", true);
}
@@ -31,7 +31,7 @@ index 8afb2bf4a757b3ef7902f5a6e6eed6b70ca2845e..440dea1e66540ca1998cb7464b6695ac
if (element != row) {
row?.toggleAttribute("descendant-selected", true);
}
@@ -3544,7 +3542,7 @@ export class UrlbarView {
@@ -3972,7 +3970,7 @@ export class UrlbarView {
}
#enableOrDisableRowWrap() {
@@ -40,3 +40,16 @@ index 8afb2bf4a757b3ef7902f5a6e6eed6b70ca2845e..440dea1e66540ca1998cb7464b6695ac
this.#rows.toggleAttribute("wrap", wrap);
this.oneOffSearchButtons?.container.toggleAttribute("wrap", wrap);
}
@@ -4387,6 +4385,12 @@ export class UrlbarView {
}
on_blur() {
+ if (
+ this.document.commandDispatcher.focusedElement == this.input.inputField &&
+ !UrlbarPrefs.get("closeOnWindowBlur")
+ ) {
+ return;
+ }
// If the view is open without the input being focused, it will not close
// automatically when the window loses focus. We might be in this state
// after a Search Tip is shown on an engine homepage.

View File

@@ -0,0 +1,13 @@
diff --git a/browser/extensions/newtab/lib/AboutPreferences.sys.mjs b/browser/extensions/newtab/lib/AboutPreferences.sys.mjs
index 4562efc05b76d5dddd35bda79bd7d5d98a51ffc9..ad9b6f55f5e77065ce74535daf6457a5c4b44058 100644
--- a/browser/extensions/newtab/lib/AboutPreferences.sys.mjs
+++ b/browser/extensions/newtab/lib/AboutPreferences.sys.mjs
@@ -355,7 +355,7 @@ export class AboutPreferences {
// Firefox 155+ registers `homepage` and `customHomepage` in
// components/preferences. They can't be registered twice, so skip them
// on 155+. Drop this condition once 155 reaches Release.
- if (Services.vc.compare(AppConstants.MOZ_APP_VERSION, "155.0a1") < 0) {
+ if (false) {
groups.homepage = this._setupHomepageGroup(window);
groups.customHomepage = this._setupCustomHomepageGroup(window);
}

View File

@@ -0,0 +1,124 @@
diff --git a/browser/installer/windows/nsis/shared.nsh b/browser/installer/windows/nsis/shared.nsh
index b81c7ef59be0d25f67668215028008a451860df2..fa0ab8947e011289d25158cab17ff9388b5cab0d 100755
--- a/browser/installer/windows/nsis/shared.nsh
+++ b/browser/installer/windows/nsis/shared.nsh
@@ -873,50 +873,87 @@ FunctionEnd
!ifdef MOZ_MAINTENANCE_SERVICE
; Adds maintenance service certificate keys for the install dir.
; For the cert to work, it must also be signed by a trusted cert for the user.
+; Writes this application's allowed certificate values into _KEY, which must be
+; a maintenance service registry path such as the one returned by
+; ServicesHelper::PathToUniqueRegistryPath.
+!macro AddMaintCertKeyValues _KEY
+ ; PrefetchProcessName was originally used to experiment with deleting
+ ; Windows prefetch as a speed optimization. It is no longer used though.
+ DeleteRegValue HKLM "${_KEY}" "prefetchProcessName"
+
+ ; Setting the Attempted value will ensure that a new Maintenance Service
+ ; install will never be attempted again after this from updates. The value
+ ; is used only to see if updates should attempt new service installs.
+ WriteRegDWORD HKLM "Software\Mozilla\MaintenanceService" "Attempted" 1
+
+ ; More than one certificate can be specified in a different subfolder
+ ; for example: ${_KEY}\1, but each individual binary can be signed
+ ; with at most one certificate. A fallback certificate can only be used
+ ; if the binary is replaced with a different certificate.
+ WriteRegStr HKLM "${_KEY}\0" "name" "${CERTIFICATE_NAME}"
+ WriteRegStr HKLM "${_KEY}\0" "issuer" "${CERTIFICATE_ISSUER}"
+ ; These values associate the allowed certificates for the previous
+ ; installation, so that we can update from it cleanly using the
+ ; old updater.exe (which will still have this signature).
+ WriteRegStr HKLM "${_KEY}\1" "name" "${CERTIFICATE_NAME_PREVIOUS}"
+ WriteRegStr HKLM "${_KEY}\1" "issuer" "${CERTIFICATE_ISSUER_PREVIOUS}"
+ ClearErrors
+!macroend
+
!macro AddMaintCertKeys
Push $R0
; Allow main Mozilla cert information for updates
; This call will push the needed key on the stack
ServicesHelper::PathToUniqueRegistryPath "$INSTDIR"
Pop $R0
+ Push $R1
+ Push $R2
+ Push $R3
+ ; We always use the 64bit registry for certs.
+ ${If} ${RunningX64}
+ ${OrIf} ${IsNativeARM64}
+ SetRegView 64
+ ${EndIf}
+
${If} $R0 != ""
- ; More than one certificate can be specified in a different subfolder
- ; for example: $R0\1, but each individual binary can be signed
- ; with at most one certificate. A fallback certificate can only be used
- ; if the binary is replaced with a different certificate.
- ; We always use the 64bit registry for certs.
- ${If} ${RunningX64}
- ${OrIf} ${IsNativeARM64}
- SetRegView 64
- ${EndIf}
+ !insertmacro AddMaintCertKeyValues "$R0"
+ ${Else}
+ ; ServicesHelper could not be loaded. This happens when PostUpdate is run
+ ; by the updater, which launches it with an environment too minimal for
+ ; NSIS to load its plugins, leaving the unique registry path uncomputable.
+ ; Fall back to refreshing every key that already records one of our own
+ ; certificate names, so that any installation of this application is kept
+ ; current rather than only the first one found. Keys belonging to other
+ ; applications record a different name and are left alone.
+ StrCpy $R1 0
+ ${Do}
+ EnumRegKey $R2 HKLM "Software\Mozilla\MaintenanceService" $R1
+ ${If} $R2 == ""
+ ${ExitDo}
+ ${EndIf}
+ ReadRegStr $R3 HKLM "Software\Mozilla\MaintenanceService\$R2\0" "name"
+ ${If} $R3 == "${CERTIFICATE_NAME}"
+ ${OrIf} $R3 == "${CERTIFICATE_NAME_PREVIOUS}"
+ StrCpy $R0 "Software\Mozilla\MaintenanceService\$R2"
+ !insertmacro AddMaintCertKeyValues "$R0"
+ ${EndIf}
+ IntOp $R1 $R1 + 1
+ ${Loop}
+ StrCpy $R0 ""
+ ${EndIf}
- ; PrefetchProcessName was originally used to experiment with deleting
- ; Windows prefetch as a speed optimization. It is no longer used though.
- DeleteRegValue HKLM "$R0" "prefetchProcessName"
-
- ; Setting the Attempted value will ensure that a new Maintenance Service
- ; install will never be attempted again after this from updates. The value
- ; is used only to see if updates should attempt new service installs.
- WriteRegDWORD HKLM "Software\Mozilla\MaintenanceService" "Attempted" 1
-
- ; These values associate the allowed certificates for the current
- ; installation.
- WriteRegStr HKLM "$R0\0" "name" "${CERTIFICATE_NAME}"
- WriteRegStr HKLM "$R0\0" "issuer" "${CERTIFICATE_ISSUER}"
- ; These values associate the allowed certificates for the previous
- ; installation, so that we can update from it cleanly using the
- ; old updater.exe (which will still have this signature).
- WriteRegStr HKLM "$R0\1" "name" "${CERTIFICATE_NAME_PREVIOUS}"
- WriteRegStr HKLM "$R0\1" "issuer" "${CERTIFICATE_ISSUER_PREVIOUS}"
- ${If} ${RunningX64}
- ${OrIf} ${IsNativeARM64}
- SetRegView lastused
- ${EndIf}
- ClearErrors
+ ${If} ${RunningX64}
+ ${OrIf} ${IsNativeARM64}
+ SetRegView lastused
${EndIf}
+
+ Pop $R3
+ Pop $R2
+ Pop $R1
; Restore the previously used value back
Pop $R0
!macroend
+
!define AddMaintCertKeys "!insertmacro AddMaintCertKeys"
!endif

View File

@@ -1,9 +1,18 @@
diff --git a/browser/installer/windows/nsis/uninstaller.nsi b/browser/installer/windows/nsis/uninstaller.nsi
old mode 100755
new mode 100644
index becbb0f70c84eb7f2d9bff5a3aedcbb7a78a61cf..05835d2088ab631316a25a9f0728898bd7998d8d
index becbb0f70c84eb7f2d9bff5a3aedcbb7a78a61cf..a23a8a1b160932368377fc841b501df9355918db
--- a/browser/installer/windows/nsis/uninstaller.nsi
+++ b/browser/installer/windows/nsis/uninstaller.nsi
@@ -150,7 +150,7 @@ OutFile "helper.exe"
!endif
ShowUnInstDetails nevershow
-!define URLUninstallSurvey "https://qsurvey.mozilla.com/s3/FF-Desktop-Post-Uninstall?channel=${UpdateChannel}&version=${AppVersion}&osversion="
+!define URLUninstallSurvey "https://links.zen-browser.app/uninstall-feedback?osversion="
; Support for the profile refresh feature
!define URLProfileRefreshHelp "https://support.mozilla.org/kb/refresh-firefox-reset-add-ons-and-settings"
@@ -516,6 +516,7 @@ Section "Uninstall"
${un.RegCleanFileHandler} ".svg" "FirefoxHTML-$AppUserModelID"
${un.RegCleanFileHandler} ".webp" "FirefoxHTML-$AppUserModelID"

View File

@@ -1,10 +1,10 @@
diff --git a/browser/modules/ExtensionsUI.sys.mjs b/browser/modules/ExtensionsUI.sys.mjs
index 95a4b6e40bd568c3ea5003b648b0acbf96bbb725..6ab8a658721aa6470d482dc958e4b3ac78f49f44 100644
index 73ef024602cb4554a024de4ddef83f492adc33ef..959c3403a48a3e4294ad5d2f72bad0e5d4fbfd75 100644
--- a/browser/modules/ExtensionsUI.sys.mjs
+++ b/browser/modules/ExtensionsUI.sys.mjs
@@ -502,7 +502,7 @@ export var ExtensionsUI = {
eventCallback,
removeOnDismissal: true,
@@ -507,7 +507,7 @@ export var ExtensionsUI = {
// right after the panel opens can't accidentally grant permissions).
autofocus: true,
popupOptions: {
- position: "bottomright topright",
+ position: window.gZenUIManager.panelUIPosition(),

View File

@@ -1,11 +1,11 @@
diff --git a/browser/themes/linux/browser.css b/browser/themes/linux/browser.css
index e735ec80b56e1a2da4bc5bec29136ce60353277b..330ea62d220d9acd96a95a605888839388e97452 100644
index f276db1d456703493ee713370691352985021708..619ee6724eec1e6a25adcb257af0d02eb7a29d34 100644
--- a/browser/themes/linux/browser.css
+++ b/browser/themes/linux/browser.css
@@ -14,7 +14,6 @@
@media (-moz-gtk-theme-family) {
--tabs-navbar-separator-style: none;
@media (prefers-color-scheme: light) and (not -moz-pref("browser.nova.enabled")) {
@media (prefers-color-scheme: light) {
- --urlbar-box-background-color: #fafafa;
}
}

View File

@@ -40,7 +40,7 @@ html|dialog {
}
groupbox button {
border-radius: 5px !important;
border-radius: calc(5px * var(--zen-squircle-value)) !important;
}
groupbox button,

View File

@@ -1,16 +1,16 @@
diff --git a/browser/themes/shared/tabbrowser/content-area.css b/browser/themes/shared/tabbrowser/content-area.css
index 3acdec2b8e043fe27919cfa54e73f4d3c491bfc8..267a1087134464a8193a824a2d7f8ac15ff8ad60 100644
index 86400b643c8b2af4207d226fbd6d91e5e74548b9..3044e4ab87b7ebcfaa2ac624680da1cc5653c861 100644
--- a/browser/themes/shared/tabbrowser/content-area.css
+++ b/browser/themes/shared/tabbrowser/content-area.css
@@ -157,7 +157,6 @@
min-height: 0;
@@ -166,7 +166,6 @@
min-width: 0;
/* We want to be able to show the frame color behind the clipped radiused corner */
- background: var(--tabpanel-background-color);
@media -moz-pref("sidebar.revamp") {
outline: 0.01px solid var(--chrome-content-separator-color);
@@ -216,7 +215,6 @@
display: grid;
/**
@@ -355,7 +354,6 @@
}
browser:is([blank], [pendingpaint]) {
@@ -18,16 +18,16 @@ index 3acdec2b8e043fe27919cfa54e73f4d3c491bfc8..267a1087134464a8193a824a2d7f8ac1
}
/* Exclude browsers with smartwindow-content attribute which inherit
@@ -553,7 +551,7 @@ split-view-footer {
@@ -735,7 +733,7 @@ split-view-footer {
.dialogStack {
z-index: var(--browser-stack-z-index-dialog-stack);
- position: absolute;
+ position: fixed;
inset: 0;
/* --browser-with-dialog set on browser[tabDialogShowing], we want to position the overlay
only on the top of the <browser> element so it doesn't overlap the DevTools toolbox */
@@ -718,7 +716,7 @@ split-view-footer {
@@ -909,7 +907,7 @@ split-view-footer {
.dialogOverlay[topmost="true"],
#window-modal-dialog::backdrop {

View File

@@ -1,17 +1,17 @@
diff --git a/browser/themes/shared/tabbrowser/tabs.css b/browser/themes/shared/tabbrowser/tabs.css
index 0820fa040642ee05c2a24f5d2cfa58da5c926647..2d93abcce1729744e5963f1c6ad47f253804576e 100644
index 61c0b8382c78f63ad9113af55a6236c4a29bc45b..0ab463c768d4fb3f45d22e753f408c46b61c0480 100644
--- a/browser/themes/shared/tabbrowser/tabs.css
+++ b/browser/themes/shared/tabbrowser/tabs.css
@@ -45,7 +45,7 @@
@@ -46,7 +46,7 @@
--tab-group-line-thickness: 2px;
--tab-group-line-toolbar-border-distance: 1px;
/* Collapsed tabs should be square, so set width to match the min height */
- --tab-collapsed-background-width: var(--tab-min-height);
+ --tab-collapsed-background-width: 48px;
--tab-collapsed-width: calc(var(--tab-collapsed-background-width) + 2 * var(--tab-inner-inline-margin));
--tab-collapsed-split-pill-offset: 0px;
--tab-pinned-min-width-expanded: calc(var(--tab-pinned-expanded-background-width) + 2 * var(--tab-pinned-margin-inline-expanded));
--tab-note-icon-end-margin: var(--dimension-4);
@@ -295,7 +295,6 @@ tab-split-view-wrapper[dragtarget] {
@@ -308,7 +308,6 @@ tab-split-view-wrapper[dragtarget] {
}
:root:not([uidensity="compact"], [sidebar-expand-on-hover]) &[pinned] {
@@ -19,7 +19,7 @@ index 0820fa040642ee05c2a24f5d2cfa58da5c926647..2d93abcce1729744e5963f1c6ad47f25
}
&:is([selected], [multiselected]) {
@@ -309,6 +308,7 @@ tab-split-view-wrapper[dragtarget] {
@@ -322,6 +321,7 @@ tab-split-view-wrapper[dragtarget] {
border-radius: inherit;
position: relative;
overflow: hidden;
@@ -27,7 +27,7 @@ index 0820fa040642ee05c2a24f5d2cfa58da5c926647..2d93abcce1729744e5963f1c6ad47f25
&::before {
position: absolute;
@@ -506,10 +506,6 @@ tab-split-view-wrapper[dragtarget] {
@@ -519,10 +519,6 @@ tab-split-view-wrapper[dragtarget] {
@media -moz-pref("browser.tabs.fadeOutUnloadedTabs") {
&[pending] {
@@ -38,7 +38,7 @@ index 0820fa040642ee05c2a24f5d2cfa58da5c926647..2d93abcce1729744e5963f1c6ad47f25
opacity: 0.5;
/* Fade the favicon out */
transition-property: filter, opacity;
@@ -525,10 +521,6 @@ tab-split-view-wrapper[dragtarget] {
@@ -538,10 +534,6 @@ tab-split-view-wrapper[dragtarget] {
@media -moz-pref("browser.tabs.fadeOutExplicitlyUnloadedTabs") {
&[pending][discarded] {
@@ -49,7 +49,7 @@ index 0820fa040642ee05c2a24f5d2cfa58da5c926647..2d93abcce1729744e5963f1c6ad47f25
opacity: 0.5;
/* Fade the favicon out */
transition-property: filter, opacity;
@@ -602,7 +594,7 @@ tab-split-view-wrapper[dragtarget] {
@@ -615,7 +607,7 @@ tab-split-view-wrapper[dragtarget] {
}
#tabbrowser-tabs[orient="vertical"] & {
@@ -58,7 +58,7 @@ index 0820fa040642ee05c2a24f5d2cfa58da5c926647..2d93abcce1729744e5963f1c6ad47f25
}
&[crashed] {
@@ -610,7 +602,7 @@ tab-split-view-wrapper[dragtarget] {
@@ -623,7 +615,7 @@ tab-split-view-wrapper[dragtarget] {
}
#tabbrowser-tabs[orient="vertical"]:not([expanded]) &:not([crashed]),
@@ -67,7 +67,7 @@ index 0820fa040642ee05c2a24f5d2cfa58da5c926647..2d93abcce1729744e5963f1c6ad47f25
&[soundplaying] {
list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio-playing-small.svg");
}
@@ -664,7 +656,7 @@ tab-split-view-wrapper[dragtarget] {
@@ -677,7 +669,7 @@ tab-split-view-wrapper[dragtarget] {
}
}
@@ -76,7 +76,7 @@ index 0820fa040642ee05c2a24f5d2cfa58da5c926647..2d93abcce1729744e5963f1c6ad47f25
&[crashed] {
display: revert;
}
@@ -824,7 +816,7 @@ tab-split-view-wrapper[dragtarget] {
@@ -837,7 +829,7 @@ tab-split-view-wrapper[dragtarget] {
has not been added to root. There are certain scenarios when that attribute is temporarily
removed from root such as when toggling the sidebar to expand with the toolbar button. */
#tabbrowser-tabs[orient="horizontal"] &:not([pinned]):not([crashed]),
@@ -85,7 +85,7 @@ index 0820fa040642ee05c2a24f5d2cfa58da5c926647..2d93abcce1729744e5963f1c6ad47f25
&:is([soundplaying], [muted], [activemedia-blocked]) {
display: flex;
}
@@ -1044,7 +1036,6 @@ tab-split-view-wrapper[dragtarget] {
@@ -1151,7 +1143,6 @@ tab-split-view-wrapper[dragtarget] {
.tabbrowser-tab:is([image], [pinned]) > .tab-stack > .tab-content[attention]:not([selected]),
.tabbrowser-tab > .tab-stack > .tab-content[pinned][titlechanged]:not([selected]),
#tabbrowser-tabs[orient="vertical"] .tabbrowser-tab > .tab-stack > .tab-content[titlechanged]:not([selected]) {
@@ -93,7 +93,7 @@ index 0820fa040642ee05c2a24f5d2cfa58da5c926647..2d93abcce1729744e5963f1c6ad47f25
background-position: center bottom 6.5px;
background-size: 4px 4px;
background-repeat: no-repeat;
@@ -1797,7 +1788,7 @@ tab-group {
@@ -1904,7 +1895,7 @@ tab-group {
}
#tabbrowser-tabs[orient="vertical"][expanded] {
@@ -102,7 +102,7 @@ index 0820fa040642ee05c2a24f5d2cfa58da5c926647..2d93abcce1729744e5963f1c6ad47f25
&[movingtab][movingtab-addToGroup]:not([movingtab-group], [movingtab-ungroup]) .tabbrowser-tab:is(:active, [multiselected]) {
margin-inline-start: var(--space-medium);
}
@@ -2351,7 +2342,7 @@ tab-group {
@@ -2504,7 +2495,7 @@ tab-group {
}
}
@@ -111,8 +111,8 @@ index 0820fa040642ee05c2a24f5d2cfa58da5c926647..2d93abcce1729744e5963f1c6ad47f25
#vertical-tabs-newtab-button {
appearance: none;
min-height: var(--tab-min-height);
@@ -2362,7 +2353,7 @@ tab-group {
margin-inline: var(--tab-inner-inline-margin);
@@ -2524,7 +2515,7 @@ tab-group {
}
#tabbrowser-tabs[orient="vertical"]:not([expanded]) & > .toolbarbutton-text {
- display: none;
@@ -120,7 +120,7 @@ index 0820fa040642ee05c2a24f5d2cfa58da5c926647..2d93abcce1729744e5963f1c6ad47f25
}
&:hover {
@@ -2386,7 +2377,7 @@ tab-group {
@@ -2548,7 +2539,7 @@ tab-group {
* flex container. #tabs-newtab-button is a child of the arrowscrollbox where
* we don't want a gap (between tabs), so we have to add some margin.
*/
@@ -129,7 +129,7 @@ index 0820fa040642ee05c2a24f5d2cfa58da5c926647..2d93abcce1729744e5963f1c6ad47f25
margin-block: var(--tab-margin-block);
}
@@ -2576,7 +2567,6 @@ tab-group {
@@ -2740,7 +2731,6 @@ tab-group {
&:not([expanded]) {
.tabbrowser-tab[pinned] {
@@ -137,7 +137,7 @@ index 0820fa040642ee05c2a24f5d2cfa58da5c926647..2d93abcce1729744e5963f1c6ad47f25
}
.tab-background {
@@ -2615,8 +2605,8 @@ tab-group {
@@ -2779,8 +2769,8 @@ tab-group {
display: block;
position: absolute;
inset: auto;
@@ -148,7 +148,7 @@ index 0820fa040642ee05c2a24f5d2cfa58da5c926647..2d93abcce1729744e5963f1c6ad47f25
&:-moz-window-inactive {
background-image:
@@ -2714,9 +2704,6 @@ tab-group {
@@ -2878,9 +2868,6 @@ tab-group {
~ #tabbrowser-tabs[orient="horizontal"]::before {
display: flex;
content: "";
@@ -158,7 +158,7 @@ index 0820fa040642ee05c2a24f5d2cfa58da5c926647..2d93abcce1729744e5963f1c6ad47f25
}
}
@@ -2749,7 +2736,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button {
@@ -2913,7 +2900,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button {
list-style-image: url(chrome://global/skin/icons/plus.svg);
}

View File

@@ -1,5 +1,5 @@
diff --git a/browser/themes/shared/toolbarbuttons.css b/browser/themes/shared/toolbarbuttons.css
index 94b1a2a841d8fd47a491616d52e5bf544f0c0bf9..9e98266b98c6b66fed26fec12fa3391fc5fcc79b 100644
index bbf906c7bf1d6f0d71744953aeeb750c5181639a..dd116e22c38dc376c9c6b34dfa569bf4661a8971 100644
--- a/browser/themes/shared/toolbarbuttons.css
+++ b/browser/themes/shared/toolbarbuttons.css
@@ -13,20 +13,6 @@
@@ -23,7 +23,7 @@ index 94b1a2a841d8fd47a491616d52e5bf544f0c0bf9..9e98266b98c6b66fed26fec12fa3391f
&:where([uidensity="compact"]) {
--toolbarbutton-padding-inner: var(--toolbarbutton-padding-inner-compact);
--bookmark-block-padding: 1px;
@@ -123,9 +109,7 @@
@@ -119,9 +105,7 @@
#TabsToolbar {
/* Override the inner padding to ensure the dimensions match the tabs, but also making sure
different types of buttons (combined-buttons-dropmarker or text) still look correct. */
@@ -33,18 +33,16 @@ index 94b1a2a841d8fd47a491616d52e5bf544f0c0bf9..9e98266b98c6b66fed26fec12fa3391f
}
/* Primary toolbar buttons */
@@ -205,8 +189,8 @@ toolbar .toolbarbutton-1 {
@@ -174,7 +158,7 @@
> .toolbarbutton-icon {
/* horizontal padding + actual icon width */
- width: calc(2 * var(--toolbarbutton-padding-inner) + 16px);
- height: calc(2 * var(--toolbarbutton-padding-inner) + 16px);
+ width: calc(2 * var(--toolbarbutton-padding-inner) + var(--zen-toolbar-button-size, 16px));
+ height: calc(2 * var(--toolbarbutton-padding-inner) + var(--zen-toolbar-button-size, 16px));
}
toolbar .toolbarbutton-1 {
/* horizontal padding + actual icon width */
- --toolbarbutton-icon-size: calc(2 * var(--toolbarbutton-padding-inner) + 16px);
+ --toolbarbutton-icon-size: calc(2 * var(--toolbarbutton-padding-inner) + var(--zen-toolbar-button-size, 16px));
> .toolbarbutton-text {
@@ -216,7 +200,7 @@ toolbar .toolbarbutton-1 {
appearance: none;
margin: 0;
@@ -214,7 +198,7 @@ toolbar .toolbarbutton-1 {
* height as the button icons and the same vertical padding, but as a minimum,
* because otherwise an increase in text sizes would break things.
*/
@@ -62,7 +60,7 @@ index 94b1a2a841d8fd47a491616d52e5bf544f0c0bf9..9e98266b98c6b66fed26fec12fa3391f
display: none;
}
@@ -536,7 +520,7 @@ toolbarbutton.bookmark-item:not(.subviewbutton) {
@@ -427,7 +411,7 @@ toolbarbutton.bookmark-item:not(.subviewbutton) {
*/
align-items: stretch;
> .toolbarbutton-icon {

View File

@@ -1,19 +1,19 @@
diff --git a/browser/themes/shared/urlbar-searchbar.css b/browser/themes/shared/urlbar-searchbar.css
index 22d624d718a289dd7b84ffc2f04dd35893dfbe95..4f57f7853f3043e3ad01d893aa928b9d2e6f3c16 100644
--- a/browser/themes/shared/urlbar-searchbar.css
+++ b/browser/themes/shared/urlbar-searchbar.css
@@ -19,8 +19,8 @@
diff --git a/browser/themes/shared/urlbar.css b/browser/themes/shared/urlbar.css
index 06183c82e2869290a5fb476c47fb7db92bbef57f..c64cde1eef50d3457fb1c540d95fe3b8aa087294 100644
--- a/browser/themes/shared/urlbar.css
+++ b/browser/themes/shared/urlbar.css
@@ -24,8 +24,8 @@
@media not -moz-pref("browser.nova.enabled") {
--urlbar-basic-component-size: calc(var(--urlbar-min-height) - 2 * (var(--urlbar-input-container-border-width) + var(--urlbar-input-container-padding)));
- --urlbar-icon-padding: calc((var(--urlbar-min-height) - 2px /* border */ - 2px /* padding */ - 16px /* icon */) / 2);
--urlbar-basic-component-size: calc(var(--urlbar-height) - 2 * (var(--urlbar-input-container-border-width) + var(--urlbar-input-container-padding)));
- --urlbar-icon-padding: calc((var(--urlbar-height) - 2px /* border */ - 2px /* padding */ - 16px /* icon */) / 2);
- --urlbar-input-container-padding: round(up, 1px, env(hairline));
+ --urlbar-icon-padding: calc((var(--urlbar-min-height) - 2px /* border */ - 14px /* icon */) / 2);
+ --urlbar-icon-padding: calc((var(--urlbar-height) - 2px /* border */ - 14px /* icon */) / 2);
+ --urlbar-input-container-padding: 2px;
}
@media (max-width: 770px) {
--urlbar-container-min-width: 240px;
@@ -126,7 +126,7 @@ toolbar[inactive="true"] .urlbar,
@@ -143,7 +143,7 @@ toolbar[inactive="true"] .urlbar,
.urlbar:not([usertyping]) > .urlbar-input-container > .urlbar-go-button,
.urlbar:not(#searchbar-new, [focused]) > .urlbar-input-container > .urlbar-go-button,
#urlbar-revert-button-container {
@@ -22,7 +22,7 @@ index 22d624d718a289dd7b84ffc2f04dd35893dfbe95..4f57f7853f3043e3ad01d893aa928b9d
}
/* Document Picture-in-Picture API window */
@@ -403,6 +403,10 @@ toolbar[inactive="true"] .urlbar,
@@ -434,6 +434,10 @@ toolbar[inactive="true"] .urlbar,
.urlbar:not([focused])[textoverflow="left"][domaindir="rtl"] > .urlbar-input-container > .urlbar-input-box > & {
mask-image: linear-gradient(to right, transparent var(--urlbar-scheme-size), black calc(var(--urlbar-scheme-size) + 3ch));
}
@@ -33,16 +33,18 @@ index 22d624d718a289dd7b84ffc2f04dd35893dfbe95..4f57f7853f3043e3ad01d893aa928b9d
}
#urlbar-scheme {
@@ -492,10 +496,14 @@ toolbar[inactive="true"] .urlbar,
@@ -505,10 +509,15 @@ toolbar[inactive="true"] .urlbar,
}
.urlbar[breakout][breakout-extend] {
height: auto;
- margin-left: calc(-1 * var(--urlbar-margin-inline));
+ align-items: center;
+ :root:not([zen-single-toolbar='true']) & {
margin-left: calc(-1 * var(--urlbar-margin-inline));
+ }
width: calc(var(--urlbar-width) + 2 * var(--urlbar-margin-inline));
+ :root:not([zen-single-toolbar="true"]) & {
+ margin-left: calc(-1 * var(--urlbar-margin-inline));
+ }
+
> .urlbar-input-container {
+ align-items: center;
height: var(--urlbar-container-height);

View File

@@ -435,10 +435,6 @@
list-style-image: url("arrow-left.svg") !important;
}
#appmenu-moreTools-button {
list-style-image: url("customize.svg") !important;
}
#zen-copy-current-url-button,
#share-tab-button,
#zen-site-data-header-share {
@@ -812,7 +808,8 @@
#toolbar-context-toggle-vertical-tabs,
#toolbar-context-customize-sidebar,
#sidebarRevampSeparator {
#sidebarRevampSeparator,
.fxa-menu-sign-in-promo-image {
display: none !important;
}
@@ -879,7 +876,7 @@
border-radius: var(--tab-border-radius);
&:hover {
background: var(--toolbarbutton-hover-background);
background: var(--toolbarbutton-background-color-hover);
}
& image {

View File

@@ -14,8 +14,8 @@
* skin/classic/browser/zen-icons/autoplay-media-fill.svg (../shared/zen-icons/nucleo/autoplay-media-fill.svg)
* skin/classic/browser/zen-icons/autoplay-media.svg (../shared/zen-icons/nucleo/autoplay-media.svg)
* skin/classic/browser/zen-icons/back.svg (../shared/zen-icons/nucleo/back.svg)
* skin/classic/browser/zen-icons/blocked-element.svg (../shared/zen-icons/nucleo/blocked-element.svg)
* skin/classic/browser/zen-icons/block.svg (../shared/zen-icons/nucleo/block.svg)
* skin/classic/browser/zen-icons/blocked-element.svg (../shared/zen-icons/nucleo/blocked-element.svg)
* skin/classic/browser/zen-icons/bolt.svg (../shared/zen-icons/nucleo/bolt.svg)
* skin/classic/browser/zen-icons/bookmark-hollow.svg (../shared/zen-icons/nucleo/bookmark-hollow.svg)
* skin/classic/browser/zen-icons/bookmark-star-on-tray.svg (../shared/zen-icons/nucleo/bookmark-star-on-tray.svg)
@@ -104,26 +104,27 @@
* skin/classic/browser/zen-icons/popup-fill.svg (../shared/zen-icons/nucleo/popup-fill.svg)
* skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/nucleo/popup.svg)
* skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/nucleo/print.svg)
* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/nucleo/privateBrowsing.svg)
* skin/classic/browser/zen-icons/private-window-small.svg (../shared/zen-icons/nucleo/private-window-small.svg)
* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/nucleo/private-window.svg)
* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/nucleo/privateBrowsing.svg)
* skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/nucleo/reader-mode.svg)
* skin/classic/browser/zen-icons/reload.svg (../shared/zen-icons/nucleo/reload.svg)
* skin/classic/browser/zen-icons/save.svg (../shared/zen-icons/nucleo/save.svg)
* skin/classic/browser/zen-icons/screen-blocked.svg (../shared/zen-icons/nucleo/screen-blocked.svg)
* skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/nucleo/screenshot.svg)
* skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/nucleo/screen.svg)
* skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/nucleo/screenshot.svg)
* skin/classic/browser/zen-icons/search-glass.svg (../shared/zen-icons/nucleo/search-glass.svg)
* skin/classic/browser/zen-icons/search-page.svg (../shared/zen-icons/nucleo/search-page.svg)
* skin/classic/browser/zen-icons/security-broken.svg (../shared/zen-icons/nucleo/security-broken.svg)
* skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/nucleo/security.svg)
* skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/nucleo/security-warning.svg)
* skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/nucleo/security.svg)
* skin/classic/browser/zen-icons/send-to-device.svg (../shared/zen-icons/nucleo/send-to-device.svg)
* skin/classic/browser/zen-icons/settings-fill.svg (../shared/zen-icons/nucleo/settings-fill.svg)
* skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/nucleo/settings.svg)
* skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/nucleo/share.svg)
* skin/classic/browser/zen-icons/sidebar-right.svg (../shared/zen-icons/nucleo/sidebar-right.svg)
* skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/nucleo/sidebars-right.svg)
* skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/nucleo/sidebar.svg)
* skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/nucleo/sidebars-right.svg)
* skin/classic/browser/zen-icons/sliders.svg (../shared/zen-icons/nucleo/sliders.svg)
* skin/classic/browser/zen-icons/sparkles.svg (../shared/zen-icons/nucleo/sparkles.svg)
* skin/classic/browser/zen-icons/spell-check.svg (../shared/zen-icons/nucleo/spell-check.svg)
@@ -164,8 +165,8 @@
* skin/classic/browser/zen-icons/autoplay-media-fill.svg (../shared/zen-icons/nucleo/autoplay-media-fill.svg)
* skin/classic/browser/zen-icons/autoplay-media.svg (../shared/zen-icons/nucleo/autoplay-media.svg)
* skin/classic/browser/zen-icons/back.svg (../shared/zen-icons/nucleo/back.svg)
* skin/classic/browser/zen-icons/blocked-element.svg (../shared/zen-icons/nucleo/blocked-element.svg)
* skin/classic/browser/zen-icons/block.svg (../shared/zen-icons/nucleo/block.svg)
* skin/classic/browser/zen-icons/blocked-element.svg (../shared/zen-icons/nucleo/blocked-element.svg)
* skin/classic/browser/zen-icons/bolt.svg (../shared/zen-icons/nucleo/bolt.svg)
* skin/classic/browser/zen-icons/bookmark-hollow.svg (../shared/zen-icons/nucleo/bookmark-hollow.svg)
* skin/classic/browser/zen-icons/bookmark-star-on-tray.svg (../shared/zen-icons/nucleo/bookmark-star-on-tray.svg)
@@ -254,26 +255,27 @@
* skin/classic/browser/zen-icons/popup-fill.svg (../shared/zen-icons/nucleo/popup-fill.svg)
* skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/nucleo/popup.svg)
* skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/nucleo/print.svg)
* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/nucleo/privateBrowsing.svg)
* skin/classic/browser/zen-icons/private-window-small.svg (../shared/zen-icons/nucleo/private-window-small.svg)
* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/nucleo/private-window.svg)
* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/nucleo/privateBrowsing.svg)
* skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/nucleo/reader-mode.svg)
* skin/classic/browser/zen-icons/reload.svg (../shared/zen-icons/nucleo/reload.svg)
* skin/classic/browser/zen-icons/save.svg (../shared/zen-icons/nucleo/save.svg)
* skin/classic/browser/zen-icons/screen-blocked.svg (../shared/zen-icons/nucleo/screen-blocked.svg)
* skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/nucleo/screenshot.svg)
* skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/nucleo/screen.svg)
* skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/nucleo/screenshot.svg)
* skin/classic/browser/zen-icons/search-glass.svg (../shared/zen-icons/nucleo/search-glass.svg)
* skin/classic/browser/zen-icons/search-page.svg (../shared/zen-icons/nucleo/search-page.svg)
* skin/classic/browser/zen-icons/security-broken.svg (../shared/zen-icons/nucleo/security-broken.svg)
* skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/nucleo/security.svg)
* skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/nucleo/security-warning.svg)
* skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/nucleo/security.svg)
* skin/classic/browser/zen-icons/send-to-device.svg (../shared/zen-icons/nucleo/send-to-device.svg)
* skin/classic/browser/zen-icons/settings-fill.svg (../shared/zen-icons/nucleo/settings-fill.svg)
* skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/nucleo/settings.svg)
* skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/nucleo/share.svg)
* skin/classic/browser/zen-icons/sidebar-right.svg (../shared/zen-icons/nucleo/sidebar-right.svg)
* skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/nucleo/sidebars-right.svg)
* skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/nucleo/sidebar.svg)
* skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/nucleo/sidebars-right.svg)
* skin/classic/browser/zen-icons/sliders.svg (../shared/zen-icons/nucleo/sliders.svg)
* skin/classic/browser/zen-icons/sparkles.svg (../shared/zen-icons/nucleo/sparkles.svg)
* skin/classic/browser/zen-icons/spell-check.svg (../shared/zen-icons/nucleo/spell-check.svg)
@@ -314,8 +316,8 @@
* skin/classic/browser/zen-icons/autoplay-media-fill.svg (../shared/zen-icons/nucleo/autoplay-media-fill.svg)
* skin/classic/browser/zen-icons/autoplay-media.svg (../shared/zen-icons/nucleo/autoplay-media.svg)
* skin/classic/browser/zen-icons/back.svg (../shared/zen-icons/nucleo/back.svg)
* skin/classic/browser/zen-icons/blocked-element.svg (../shared/zen-icons/nucleo/blocked-element.svg)
* skin/classic/browser/zen-icons/block.svg (../shared/zen-icons/nucleo/block.svg)
* skin/classic/browser/zen-icons/blocked-element.svg (../shared/zen-icons/nucleo/blocked-element.svg)
* skin/classic/browser/zen-icons/bolt.svg (../shared/zen-icons/nucleo/bolt.svg)
* skin/classic/browser/zen-icons/bookmark-hollow.svg (../shared/zen-icons/nucleo/bookmark-hollow.svg)
* skin/classic/browser/zen-icons/bookmark-star-on-tray.svg (../shared/zen-icons/nucleo/bookmark-star-on-tray.svg)
@@ -404,26 +406,27 @@
* skin/classic/browser/zen-icons/popup-fill.svg (../shared/zen-icons/nucleo/popup-fill.svg)
* skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/nucleo/popup.svg)
* skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/nucleo/print.svg)
* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/nucleo/privateBrowsing.svg)
* skin/classic/browser/zen-icons/private-window-small.svg (../shared/zen-icons/nucleo/private-window-small.svg)
* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/nucleo/private-window.svg)
* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/nucleo/privateBrowsing.svg)
* skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/nucleo/reader-mode.svg)
* skin/classic/browser/zen-icons/reload.svg (../shared/zen-icons/nucleo/reload.svg)
* skin/classic/browser/zen-icons/save.svg (../shared/zen-icons/nucleo/save.svg)
* skin/classic/browser/zen-icons/screen-blocked.svg (../shared/zen-icons/nucleo/screen-blocked.svg)
* skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/nucleo/screenshot.svg)
* skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/nucleo/screen.svg)
* skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/nucleo/screenshot.svg)
* skin/classic/browser/zen-icons/search-glass.svg (../shared/zen-icons/nucleo/search-glass.svg)
* skin/classic/browser/zen-icons/search-page.svg (../shared/zen-icons/nucleo/search-page.svg)
* skin/classic/browser/zen-icons/security-broken.svg (../shared/zen-icons/nucleo/security-broken.svg)
* skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/nucleo/security.svg)
* skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/nucleo/security-warning.svg)
* skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/nucleo/security.svg)
* skin/classic/browser/zen-icons/send-to-device.svg (../shared/zen-icons/nucleo/send-to-device.svg)
* skin/classic/browser/zen-icons/settings-fill.svg (../shared/zen-icons/nucleo/settings-fill.svg)
* skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/nucleo/settings.svg)
* skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/nucleo/share.svg)
* skin/classic/browser/zen-icons/sidebar-right.svg (../shared/zen-icons/nucleo/sidebar-right.svg)
* skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/nucleo/sidebars-right.svg)
* skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/nucleo/sidebar.svg)
* skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/nucleo/sidebars-right.svg)
* skin/classic/browser/zen-icons/sliders.svg (../shared/zen-icons/nucleo/sliders.svg)
* skin/classic/browser/zen-icons/sparkles.svg (../shared/zen-icons/nucleo/sparkles.svg)
* skin/classic/browser/zen-icons/spell-check.svg (../shared/zen-icons/nucleo/spell-check.svg)
@@ -459,8 +462,8 @@
* skin/classic/browser/zen-icons/selectable/basket.svg (../shared/zen-icons/common/selectable/basket.svg)
* skin/classic/browser/zen-icons/selectable/bed.svg (../shared/zen-icons/common/selectable/bed.svg)
* skin/classic/browser/zen-icons/selectable/bell.svg (../shared/zen-icons/common/selectable/bell.svg)
* skin/classic/browser/zen-icons/selectable/bookmark.svg (../shared/zen-icons/common/selectable/bookmark.svg)
* skin/classic/browser/zen-icons/selectable/book.svg (../shared/zen-icons/common/selectable/book.svg)
* skin/classic/browser/zen-icons/selectable/bookmark.svg (../shared/zen-icons/common/selectable/bookmark.svg)
* skin/classic/browser/zen-icons/selectable/briefcase.svg (../shared/zen-icons/common/selectable/briefcase.svg)
* skin/classic/browser/zen-icons/selectable/brush.svg (../shared/zen-icons/common/selectable/brush.svg)
* skin/classic/browser/zen-icons/selectable/bug.svg (../shared/zen-icons/common/selectable/bug.svg)
@@ -522,8 +525,8 @@
* skin/classic/browser/zen-icons/selectable/shapes.svg (../shared/zen-icons/common/selectable/shapes.svg)
* skin/classic/browser/zen-icons/selectable/shirt.svg (../shared/zen-icons/common/selectable/shirt.svg)
* skin/classic/browser/zen-icons/selectable/skull.svg (../shared/zen-icons/common/selectable/skull.svg)
* skin/classic/browser/zen-icons/selectable/squares.svg (../shared/zen-icons/common/selectable/squares.svg)
* skin/classic/browser/zen-icons/selectable/square.svg (../shared/zen-icons/common/selectable/square.svg)
* skin/classic/browser/zen-icons/selectable/squares.svg (../shared/zen-icons/common/selectable/squares.svg)
* skin/classic/browser/zen-icons/selectable/star-1.svg (../shared/zen-icons/common/selectable/star-1.svg)
* skin/classic/browser/zen-icons/selectable/star.svg (../shared/zen-icons/common/selectable/star.svg)
* skin/classic/browser/zen-icons/selectable/stats-chart.svg (../shared/zen-icons/common/selectable/stats-chart.svg)

View File

@@ -0,0 +1,5 @@
#filter dumbComments emptyLines substitution
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="context-fill" fill-opacity="context-fill-opacity" viewBox="0 -1 20 20"><path d="M12.75 10.5a3.25 3.25 0 1 1-3.19 2.632 1.25 1.25 0 0 0-1.119 0q.059.3.059.618a3.25 3.25 0 1 1-3.25-3.25 3.24 3.24 0 0 1 2.571 1.268 2.74 2.74 0 0 1 2.357 0A3.24 3.24 0 0 1 12.75 10.5M5.25 12a1.75 1.75 0 1 0 0 3.5 1.75 1.75 0 0 0 0-3.5m7.5 0a1.75 1.75 0 1 0 0 3.5 1.75 1.75 0 0 0 0-3.5m-.867-11c.87 0 1.61.64 1.732 1.503l.34 2.393L16.78 7.72A.75.75 0 0 1 16.25 9H1.75a.751.751 0 0 1-.53-1.28l2.823-2.824.342-2.393A1.75 1.75 0 0 1 6.117 1zM3.56 7.5h10.88L12.94 6H5.06zm2.557-5a.25.25 0 0 0-.237.17l-.011.045L5.614 4.5h6.772l-.255-1.785a.25.25 0 0 0-.248-.215z"/></svg>

View File

@@ -1,5 +1,5 @@
diff --git a/build/moz.configure/lto-pgo.configure b/build/moz.configure/lto-pgo.configure
index df2b0bf0081edfdc2c7bccaefc780d2b0c6555ff..53a3b55de7650799e3730372e72ad7b4bb2eea03 100644
index c72af5ed5f88fc80c810ef626e57a8b991dee514..53a3b55de7650799e3730372e72ad7b4bb2eea03 100644
--- a/build/moz.configure/lto-pgo.configure
+++ b/build/moz.configure/lto-pgo.configure
@@ -234,6 +234,7 @@ def moz_pgo_rust(pgo, profile_use, profile_generate, c_compiler):
@@ -14,7 +14,7 @@ index df2b0bf0081edfdc2c7bccaefc780d2b0c6555ff..53a3b55de7650799e3730372e72ad7b4
help="Indicate that ld64 is free of symbol aliasing bugs",
)
-imply_option("MOZ_LD64_KNOWN_GOOD", moz_automation)
-imply_option("MOZ_LD64_KNOWN_GOOD", True, when=moz_automation)
use_fat_lto = cxx_compiler.try_link(
ldflags=depends(stlport_libs)(

View File

@@ -1,76 +0,0 @@
diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -411,10 +411,13 @@
pref("browser.urlbar.maxRichResults", 10);
// The maximum number of historical search results to show.
pref("browser.urlbar.maxHistoricalSearchSuggestions", 2);
+// Whether to close the urlbar when blurring the window while the urlbar is focused.
+pref("browser.urlbar.closeOnWindowBlur", true);
+
// The default behavior for the urlbar can be configured to use any combination
// of the match filters with each additional filter adding more results (union).
pref("browser.urlbar.suggest.bookmark", true);
pref("browser.urlbar.suggest.clipboard", true);
pref("browser.urlbar.suggest.history", true);
diff --git a/browser/components/urlbar/UrlbarPrefs.sys.mjs b/browser/components/urlbar/UrlbarPrefs.sys.mjs
--- a/browser/components/urlbar/UrlbarPrefs.sys.mjs
+++ b/browser/components/urlbar/UrlbarPrefs.sys.mjs
@@ -152,10 +152,13 @@
["filter.javascript", true],
// Feature gate pref for flight status suggestions in the urlbar.
["flightStatus.featureGate", false],
+ // Whether to close the urlbar when blurring the window while the urlbar is focused.
+ ["closeOnWindowBlur", true],
+
// The minimum prefix length of a flight status keyword the user must type to
// trigger the suggestion. 0 means the min length should be taken from Nimbus
// or remote settings.
["flightStatus.minKeywordLength", 0],
diff --git a/browser/components/urlbar/content/UrlbarView.mjs b/browser/components/urlbar/content/UrlbarView.mjs
--- a/browser/components/urlbar/content/UrlbarView.mjs
+++ b/browser/components/urlbar/content/UrlbarView.mjs
@@ -3909,10 +3909,16 @@
}
}
}
on_blur() {
+ if (
+ this.document.commandDispatcher.focusedElement == this.input.inputField &&
+ !lazy.UrlbarPrefs.get("closeOnWindowBlur")
+ ) {
+ return;
+ }
// If the view is open without the input being focused, it will not close
// automatically when the window loses focus. We might be in this state
// after a Search Tip is shown on an engine homepage.
if (!lazy.UrlbarPrefs.get("ui.popup.disable_autohide")) {
this.close();
diff --git a/browser/components/urlbar/content/UrlbarInput.mjs b/browser/components/urlbar/content/UrlbarInput.mjs
--- a/browser/components/urlbar/content/UrlbarInput.mjs
+++ b/browser/components/urlbar/content/UrlbarInput.mjs
@@ -5460,11 +5460,17 @@
_on_blur(event) {
if (this.view.resultMenu.hasAttribute("open")) {
return;
}
lazy.logger.debug("Blur Event");
+ if (
+ this.document.commandDispatcher.focusedElement == this.inputField &&
+ !lazy.UrlbarPrefs.get("closeOnWindowBlur")
+ ) {
+ return;
+ }
// We cannot count every blur events after a missed engagement as abandoment
// because the user may have clicked on some view element that executes
// a command causing a focus change. For example opening preferences from
// the oneoff settings button.
// For now we detect that case by discarding the event on command, but we
// may want to figure out a more robust way to detect abandonment.

View File

@@ -31,12 +31,13 @@ diff --git a/gfx/webrender_bindings/src/bindings.rs b/gfx/webrender_bindings/src
// Ensure the WR profiler callbacks are hooked up to the Gecko profiler.
set_profiler_hooks(Some(&PROFILER_HOOKS));
@@ -2164,10 +2165,11 @@
@@ -2164,11 +2165,12 @@
texture_cache_config,
reject_software_rasterizer,
low_quality_pinch_zoom,
max_shared_surface_size,
enable_dithering,
enable_shared_instance_buffer,
+ opaque_backdrop_fallback,
..Default::default()
};
@@ -73,8 +74,9 @@ diff --git a/gfx/wr/webrender/src/renderer/init.rs b/gfx/wr/webrender/src/render
+ /// See explanation of `gfx.webrender.opaque-backdrop-fallback`.
+ pub opaque_backdrop_fallback: bool,
}
@@ -277,9 +279,10 @@
@@ -277,10 +279,11 @@
enable_instancing: true,
enable_shared_instance_buffer: false,
reject_software_rasterizer: false,
low_quality_pinch_zoom: false,
max_shared_surface_size: 2048,
@@ -84,12 +86,13 @@ diff --git a/gfx/wr/webrender/src/renderer/init.rs b/gfx/wr/webrender/src/render
}
}
@@ -802,10 +805,11 @@
@@ -802,11 +805,12 @@
allocated_native_surfaces: FastHashSet::default(),
debug_overlay_state: DebugOverlayState::new(),
buffer_damage_tracker: BufferDamageTracker::default(),
max_primitive_instance_count,
enable_instancing: options.enable_instancing,
use_shared_instance_buffer,
+ opaque_backdrop_fallback: options.opaque_backdrop_fallback,
consecutive_oom_frames: 0,
target_frame_publish_id: None,
@@ -99,11 +102,14 @@ diff --git a/gfx/wr/webrender/src/renderer/init.rs b/gfx/wr/webrender/src/render
diff --git a/gfx/wr/webrender/src/renderer/mod.rs b/gfx/wr/webrender/src/renderer/mod.rs
--- a/gfx/wr/webrender/src/renderer/mod.rs
+++ b/gfx/wr/webrender/src/renderer/mod.rs
@@ -867,10 +867,12 @@
@@ -867,13 +867,15 @@
buffer_damage_tracker: BufferDamageTracker,
max_primitive_instance_count: usize,
enable_instancing: bool,
/// If true, stream instance data into large buffers shared by multiple
/// draws, rather than allocating a new instance buffer for each draw.
use_shared_instance_buffer: bool,
+ opaque_backdrop_fallback: bool,
+

View File

@@ -0,0 +1,162 @@
diff --git a/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs b/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs
--- a/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs
+++ b/toolkit/components/pictureinpicture/PictureInPicture.sys.mjs
@@ -39,10 +39,16 @@
const TOGGLE_POSITION_PREF =
"media.videocontrols.picture-in-picture.video-toggle.position";
const TOGGLE_POSITION_RIGHT = "right";
const TOGGLE_POSITION_LEFT = "left";
const RESIZE_MARGIN_PX = 16;
+// Close reasons that should suppress auto-toggle when the originating tab is backgrounded
+const DELIBERATE_CLOSE_REASONS = [
+ "CloseButton",
+ "ClosePlayerShortcut",
+ "Shortcut",
+];
XPCOMUtils.defineLazyPreferenceGetter(
lazy,
"PIP_ENABLED",
"media.videocontrols.picture-in-picture.enabled",
@@ -119,10 +125,19 @@
}
case "PictureInPicture:VideoTabHidden": {
if (!lazy.PIP_ENABLED || !lazy.PIP_WHEN_SWITCHING_TABS) {
break;
}
+
+ // Suppress auto-toggle if the user deliberately closed this PiP window
+ if (
+ PictureInPicture.weakAutoPipBrowserClosedDeliberately.has(browser)
+ ) {
+ PictureInPicture.weakAutoPipBrowserClosedDeliberately.delete(browser);
+ break;
+ }
+
// If the tab is still selected, then we can ignore this event
if (browser.documentGlobal.gBrowser.selectedBrowser == browser) {
break;
}
let actor = browsingContext.currentWindowGlobal.getActor(
@@ -261,10 +276,13 @@
maxConcurrentPlayerCount: 0,
// Maps auto pip browser to PictureInPictureParent actor
weakAutoPipBrowserToParent: new WeakMap(),
+ // Browsers with deliberately closed PiP windows; suppresses auto-toggle.
+ weakAutoPipBrowserClosedDeliberately: new WeakSet(),
+
/**
* Returns the player window if one exists and if it hasn't yet been closed.
*
* @param {PictureInPictureParent} pipActorRef
* Reference to the calling PictureInPictureParent actor
@@ -441,10 +459,20 @@
},
onPipSwappedBrowsers(event) {
let otherTab = event.detail;
if (otherTab) {
+ if (
+ this.weakAutoPipBrowserClosedDeliberately.has(
+ event.target.linkedBrowser
+ )
+ ) {
+ this.weakAutoPipBrowserClosedDeliberately.add(otherTab.linkedBrowser);
+ this.weakAutoPipBrowserClosedDeliberately.delete(
+ event.target.linkedBrowser
+ );
+ }
for (let win of Services.wm.getEnumerator(WINDOW_TYPE)) {
if (this.weakWinToBrowser.get(win) === event.target.linkedBrowser) {
this.weakWinToBrowser.set(win, otherTab.linkedBrowser);
this.removePiPBrowserFromWeakMap(event.target.linkedBrowser);
this.removeOriginatingWinFromWeakMap(event.target.linkedBrowser);
@@ -899,10 +927,20 @@
const { reason, actorRef } = closeData;
const win = this.getWeakPipPlayer(actorRef);
if (!win) {
return;
}
+
+ const browser = this.weakWinToBrowser.get(win);
+
+ if (browser && DELIBERATE_CLOSE_REASONS.includes(reason)) {
+ const tabbrowser = browser.getTabBrowser();
+ if (tabbrowser && tabbrowser.selectedBrowser != browser) {
+ PictureInPicture.weakAutoPipBrowserClosedDeliberately.add(browser);
+ }
+ }
+
this.removePiPBrowserFromWeakMap(this.weakWinToBrowser.get(win));
this.weakAutoPipBrowserToParent.delete(this.weakWinToBrowser.get(win));
Glean.pictureinpicture["closedMethod" + reason].record();
await this.closePipWindow(win);
diff --git a/toolkit/components/pictureinpicture/tests/browser_autotoggle.js b/toolkit/components/pictureinpicture/tests/browser_autotoggle.js
--- a/toolkit/components/pictureinpicture/tests/browser_autotoggle.js
+++ b/toolkit/components/pictureinpicture/tests/browser_autotoggle.js
@@ -297,5 +297,61 @@
await new Promise(resolve => setTimeout(resolve, 2000));
assertNoPiPWindowsOpen();
}
);
});
+
+/**
+ * Tests that closing a PiP window deliberately (via Shift+ESC) while the tab is backgrounded
+ * suppresses auto-toggle, but auto-toggle works normally on the next background.
+ */
+add_task(async function autopip_suppress_on_deliberate_close() {
+ await SpecialPowers.pushPrefEnv({
+ set: [[ALWAYS_SHOW_PREF, true]],
+ });
+
+ // Open a new window and save a handle for the first tab
+ let win1 = await BrowserTestUtils.openNewBrowserWindow();
+ let firstTab = win1.gBrowser.selectedTab;
+
+ // Open a new tab containing a video
+ let pipTab = await BrowserTestUtils.openNewForegroundTab(
+ win1.gBrowser,
+ TEST_PAGE
+ );
+ let browser = pipTab.linkedBrowser;
+
+ // Ensure the video is playing
+ let videoID = "with-controls";
+ await ensureVideosReady(browser);
+ await SpecialPowers.spawn(browser, [videoID], async videoID => {
+ await content.document.getElementById(videoID).play();
+ });
+
+ // Switch from the video tab to the first tab and check if the PiP window opened
+ let domWindowOpened = BrowserTestUtils.domWindowOpenedAndLoaded(null);
+ await BrowserTestUtils.switchTab(win1.gBrowser, firstTab);
+ let pipWin = await domWindowOpened;
+ ok(pipWin, "PiP window automatically opened.");
+
+ // Close the PiP window deliberately while the tab is backgrounded and check that it doesn't reopen
+ domWindowOpened = BrowserTestUtils.domWindowOpenedAndLoaded(null);
+ // A short delay is needed to make the test more robust
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ await new Promise(resolve => setTimeout(resolve, 2000));
+ EventUtils.synthesizeKey("KEY_Escape", { shiftKey: true }, pipWin);
+ let reopened = await Promise.race([
+ domWindowOpened.then(() => true),
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ new Promise(resolve => setTimeout(() => resolve(false), 2000)),
+ ]);
+ ok(!reopened, "PiP window should not reopen after deliberate close");
+
+ // Switch to the video tab and back to the first tab, which should automatically open the PiP window
+ domWindowOpened = BrowserTestUtils.domWindowOpenedAndLoaded(null);
+ await BrowserTestUtils.switchTab(win1.gBrowser, pipTab);
+ await BrowserTestUtils.switchTab(win1.gBrowser, firstTab);
+ pipWin = await domWindowOpened;
+ ok(pipWin, "PiP window automatically opened.");
+
+ await BrowserTestUtils.closeWindow(win1);
+});

View File

@@ -0,0 +1,131 @@
diff --git a/toolkit/modules/subprocess/subprocess_shared_unix.js b/toolkit/modules/subprocess/subprocess_shared_unix.js
--- a/toolkit/modules/subprocess/subprocess_shared_unix.js
+++ b/toolkit/modules/subprocess/subprocess_shared_unix.js
@@ -57,11 +57,11 @@
fcntl: [
ctypes.default_abi,
ctypes.int,
ctypes.int /* fildes */,
ctypes.int /* cmd */,
- ctypes.int /* ... */,
+ "...",
],
getcwd: [
ctypes.default_abi,
ctypes.char.ptr,
diff --git a/toolkit/modules/subprocess/subprocess_unix.sys.mjs b/toolkit/modules/subprocess/subprocess_unix.sys.mjs
--- a/toolkit/modules/subprocess/subprocess_unix.sys.mjs
+++ b/toolkit/modules/subprocess/subprocess_unix.sys.mjs
@@ -34,13 +34,13 @@
throw new Error("Unable to create pipe");
}
this.signalFd = fds[1];
- libc.fcntl(fds[0], LIBC.F_SETFL, LIBC.O_NONBLOCK);
- libc.fcntl(fds[0], LIBC.F_SETFD, LIBC.FD_CLOEXEC);
- libc.fcntl(fds[1], LIBC.F_SETFD, LIBC.FD_CLOEXEC);
+ libc.fcntl(fds[0], LIBC.F_SETFL, ctypes.int(LIBC.O_NONBLOCK));
+ libc.fcntl(fds[0], LIBC.F_SETFD, ctypes.int(LIBC.FD_CLOEXEC));
+ libc.fcntl(fds[1], LIBC.F_SETFD, ctypes.int(LIBC.FD_CLOEXEC));
this.call("init", [{ signalFd: fds[0] }]);
}
closePipe() {
diff --git a/toolkit/modules/subprocess/subprocess_unix.worker.js b/toolkit/modules/subprocess/subprocess_unix.worker.js
--- a/toolkit/modules/subprocess/subprocess_unix.worker.js
+++ b/toolkit/modules/subprocess/subprocess_unix.worker.js
@@ -349,13 +349,13 @@
our_pipes.push(new InputPipe(this, fds[1]));
} else {
our_pipes.push(new OutputPipe(this, fds[1]));
}
- libc.fcntl(fds[0], LIBC.F_SETFD, LIBC.FD_CLOEXEC);
- libc.fcntl(fds[1], LIBC.F_SETFD, LIBC.FD_CLOEXEC);
- libc.fcntl(fds[1], LIBC.F_SETFL, LIBC.O_NONBLOCK);
+ libc.fcntl(fds[0], LIBC.F_SETFD, ctypes.int(LIBC.FD_CLOEXEC));
+ libc.fcntl(fds[1], LIBC.F_SETFD, ctypes.int(LIBC.FD_CLOEXEC));
+ libc.fcntl(fds[1], LIBC.F_SETFL, ctypes.int(LIBC.O_NONBLOCK));
return fds[0];
};
their_pipes.set(0, pipe(false));
diff --git a/toolkit/modules/subprocess/test/xpcshell/test_subprocess_pipe_flags.js b/toolkit/modules/subprocess/test/xpcshell/test_subprocess_pipe_flags.js
new file mode 100644
--- /dev/null
+++ b/toolkit/modules/subprocess/test/xpcshell/test_subprocess_pipe_flags.js
@@ -0,0 +1,56 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+// fcntl commands for reading the flags set by the subprocess modules. The
+// values are the same on Linux and macOS but are not exposed by
+// ChromeUtils.getLibcConstants().
+const F_GETFD = 1;
+const F_GETFL = 3;
+
+add_task(async function test_subprocess_pipe_flags() {
+ const { getSubprocessImplForTest } = ChromeUtils.importESModule(
+ "resource://gre/modules/Subprocess.sys.mjs"
+ );
+ const { libc } = ChromeUtils.importESModule(
+ "resource://gre/modules/subprocess/subprocess_unix.sys.mjs"
+ );
+ const { FD_CLOEXEC, O_NONBLOCK } = ChromeUtils.getLibcConstants();
+
+ const worker = getSubprocessImplForTest().Process.getWorker();
+ equal(
+ libc.fcntl(worker.signalFd, F_GETFD),
+ FD_CLOEXEC,
+ "The main-thread signal pipe has exactly FD_CLOEXEC set"
+ );
+
+ const proc = await Subprocess.call({
+ command: await Subprocess.pathSearch("cat"),
+ stderr: "pipe",
+ });
+ const fds = await worker.call("getFds", [proc.id]);
+ ok(
+ fds.every(Number.isInteger),
+ "The worker owns the stdin, stdout and stderr pipes"
+ );
+ for (const fd of fds) {
+ equal(
+ libc.fcntl(fd, F_GETFD),
+ FD_CLOEXEC,
+ "Worker pipes have exactly FD_CLOEXEC set"
+ );
+ equal(
+ libc.fcntl(fd, F_GETFL) & O_NONBLOCK,
+ O_NONBLOCK,
+ "Worker pipes are nonblocking"
+ );
+ }
+
+ const output = proc.stdout.readString(5);
+ await proc.stdin.write("hello");
+ equal(await output, "hello", "The subprocess pipes transfer data");
+ await proc.stdin.close();
+ equal((await proc.wait()).exitCode, 0, "The subprocess exits cleanly");
+});
diff --git a/toolkit/modules/subprocess/test/xpcshell/xpcshell.toml b/toolkit/modules/subprocess/test/xpcshell/xpcshell.toml
--- a/toolkit/modules/subprocess/test/xpcshell/xpcshell.toml
+++ b/toolkit/modules/subprocess/test/xpcshell/xpcshell.toml
@@ -25,6 +25,9 @@
["test_subprocess_pathSearch.js"]
["test_subprocess_perf.js"]
requesttimeoutfactor = 2 # Slow on Windows
+["test_subprocess_pipe_flags.js"]
+skip-if = ["os == 'win'"]
+
["test_subprocess_polling.js"]

View File

@@ -1,9 +1,8 @@
diff --git a/toolkit/themes/shared/global-shared.css b/toolkit/themes/shared/global-shared.css
--- a/toolkit/themes/shared/global-shared.css
+++ b/toolkit/themes/shared/global-shared.css
@@ -80,11 +80,10 @@
@@ -80,10 +80,9 @@
background-color: transparent;
--panel-background: transparent;
--panel-box-shadow: none;
--panel-border-color: transparent;
--panel-box-shadow-margin: 0px;

View File

@@ -0,0 +1,32 @@
diff --git a/toolkit/mozapps/update/common/registrycertificates.cpp b/toolkit/mozapps/update/common/registrycertificates.cpp
index f7f5acdfa08879a0ff3095e15eebf7b436cf5092..5915141b3f4a6d3536841cc1040e70afe033e058 100644
--- a/toolkit/mozapps/update/common/registrycertificates.cpp
+++ b/toolkit/mozapps/update/common/registrycertificates.cpp
@@ -33,9 +33,21 @@
*
* @return TRUE if the binary matches any of the allowed certificates.
*/
+// TEMPORARY: accept any binary without consulting the allowed-certificate
+// values. Those values are only ever written by an installer run, so after a
+// signing certificate change every existing install still names the previous
+// certificate, the maintenance service refuses the newly signed binaries, and
+// updates fall back to prompting for elevation every time. Remove this define
+// and the block below once installs have been migrated.
+#define ZEN_SKIP_ALLOWED_CERTIFICATE_CHECK 1
+
BOOL DoesBinaryMatchAllowedCertificates(LPCWSTR basePathForUpdate,
LPCWSTR filePath,
BOOL allowFallbackKeySkip) {
+#ifdef ZEN_SKIP_ALLOWED_CERTIFICATE_CHECK
+ LOG(("Skipping the allowed certificate check for \"%ls\"", filePath));
+ return TRUE;
+#else
#ifdef DISABLE_UPDATER_AUTHENTICODE_CHECK
if (allowFallbackKeySkip) {
LOG_WARN(("Skipping authenticode check"));
@@ -163,4 +175,5 @@ BOOL DoesBinaryMatchAllowedCertificates(LPCWSTR basePathForUpdate,
RegCloseKey(baseKey);
// No certificates match, :'(
return FALSE;
+#endif // ZEN_SKIP_ALLOWED_CERTIFICATE_CHECK
}

View File

@@ -9,11 +9,8 @@
},
{
"type": "phabricator",
"id": "D284404",
"name": "Add urlbar closeOnWindowBlur preference",
"replaces": {
"\n\n": "\n // may want to figure out a more robust way to detect abandonment."
}
"id": "D323933",
"name": "Issue 15123"
},
{
"type": "local",
@@ -48,5 +45,14 @@
"this._lastJsonLength = uncompressedBytes;": "this._lastJsonLength = uncompressedBytes.jsonLength;",
" jsonLengthHint,": " lengthHint: jsonLengthHint,"
}
},
{
"type": "phabricator",
"id": "D321446",
"name": "Issue 14710"
},
{
"type": "local",
"path": "firefox/override_cert_checks_temp.patch"
}
]

View File

@@ -1,8 +1,8 @@
diff --git a/layout/painting/nsImageRenderer.cpp b/layout/painting/nsImageRenderer.cpp
index 6e464b48c90174b8954aad8a79bae30a7a30cbc9..9ea9a4963ceae679f092e014ac24a0d24fb106ce 100644
index 7ddc4f7e259272e7b905f44aff7316c1ba540c22..277a92e5d10e6a04b12373854ffe6791d562215e 100644
--- a/layout/painting/nsImageRenderer.cpp
+++ b/layout/painting/nsImageRenderer.cpp
@@ -90,7 +90,7 @@ static already_AddRefed<imgIContainer> GetSymbolicIconImage(nsAtom* aName,
@@ -95,7 +95,7 @@ static already_AddRefed<imgIContainer> GetSymbolicIconImage(nsAtom* aName,
if (NS_WARN_IF(!XRE_IsParentProcess())) {
return nullptr;
}
@@ -11,7 +11,7 @@ index 6e464b48c90174b8954aad8a79bae30a7a30cbc9..9ea9a4963ceae679f092e014ac24a0d2
auto key = std::make_tuple(aName, aScale, fg);
auto* cache = aFrame->GetOrCreateDeletableProperty(SymbolicImageCacheProp());
auto lookup = cache->Lookup(key);
@@ -575,7 +575,7 @@ ImgDrawResult nsImageRenderer::Draw(nsPresContext* aPresContext,
@@ -580,7 +580,7 @@ ImgDrawResult nsImageRenderer::Draw(nsPresContext* aPresContext,
}
case StyleImage::Tag::Gradient: {
nsCSSGradientRenderer renderer = nsCSSGradientRenderer::Create(
@@ -20,7 +20,7 @@ index 6e464b48c90174b8954aad8a79bae30a7a30cbc9..9ea9a4963ceae679f092e014ac24a0d2
renderer.Paint(*ctx, aDest, aFill, aRepeatSize, aSrc, aDirtyRect,
aOpacity);
@@ -652,7 +652,7 @@ ImgDrawResult nsImageRenderer::BuildWebRenderDisplayItems(
@@ -657,7 +657,7 @@ ImgDrawResult nsImageRenderer::BuildWebRenderDisplayItems(
switch (mType) {
case StyleImage::Tag::Gradient: {
nsCSSGradientRenderer renderer = nsCSSGradientRenderer::Create(
@@ -29,16 +29,16 @@ index 6e464b48c90174b8954aad8a79bae30a7a30cbc9..9ea9a4963ceae679f092e014ac24a0d2
renderer.BuildWebRenderDisplayItems(aBuilder, aSc, aDest, aFill,
aRepeatSize, aSrc,
@@ -678,6 +678,8 @@ ImgDrawResult nsImageRenderer::BuildWebRenderDisplayItems(
nsPresContext::AppUnitsToIntCSSPixels(aDest.height)};
@@ -679,6 +679,8 @@ ImgDrawResult nsImageRenderer::BuildWebRenderDisplayItems(
}
SVGImageContext svgContext(Some(destCSSSize));
SVGImageContext svgContext(Some(CSSSize::FromAppUnits(aDest.Size())));
+ SVGImageContext::MaybeStoreZenBoosts(svgContext,
+ *mForFrame->PresContext());
Maybe<ImageIntRegion> region;
const int32_t appUnitsPerDevPixel = aPresContext->AppUnitsPerDevPixel();
@@ -1092,7 +1094,7 @@ ImgDrawResult nsImageRenderer::DrawShapeImage(nsPresContext* aPresContext,
@@ -1098,7 +1100,7 @@ ImgDrawResult nsImageRenderer::DrawShapeImage(nsPresContext* aPresContext,
if (mImage->IsGradient()) {
nsCSSGradientRenderer renderer = nsCSSGradientRenderer::Create(

View File

@@ -1,16 +1,16 @@
diff --git a/layout/style/StyleColor.cpp b/layout/style/StyleColor.cpp
index bbee32af30f35525730a10d0b242c0e8a8fe4695..a590fff105b30bc96fa7a0d8a8d3b1d5aa997e08 100644
index f922f7fdacc7e1a14beb8da77b48aef3f6ae0b2b..47d19242baaf2a1f25ee07c6e210c839cc7b5089 100644
--- a/layout/style/StyleColor.cpp
+++ b/layout/style/StyleColor.cpp
@@ -9,6 +9,7 @@
#include "mozilla/dom/BindingDeclarations.h"
@@ -8,6 +8,7 @@
#include "mozilla/StyleColorInlines.h"
#include "nsIFrame.h"
#include "nsStyleStruct.h"
+#include "mozilla/nsZenBoostsBackend.h"
#include "nsStyleUtil.h"
namespace mozilla {
@@ -96,23 +97,24 @@ StyleAbsoluteColor StyleColor::ResolveColor(
@@ -98,23 +99,24 @@ StyleAbsoluteColor StyleColor::ResolveColor(
template <>
nscolor StyleColor::CalcColor(nscolor aColor) const {
@@ -40,7 +40,7 @@ index bbee32af30f35525730a10d0b242c0e8a8fe4695..a590fff105b30bc96fa7a0d8a8d3b1d5
}
StyleAbsoluteColor StyleAbsoluteColor::ToColorSpace(
@@ -120,7 +122,7 @@ StyleAbsoluteColor StyleAbsoluteColor::ToColorSpace(
@@ -122,7 +124,7 @@ StyleAbsoluteColor StyleAbsoluteColor::ToColorSpace(
return Servo_ConvertColorSpace(this, aColorSpace);
}
@@ -49,7 +49,7 @@ index bbee32af30f35525730a10d0b242c0e8a8fe4695..a590fff105b30bc96fa7a0d8a8d3b1d5
constexpr StyleColorSpace DEST_COLOR_SPACE = StyleColorSpace::Srgb;
constexpr float MIN = 0.0f;
@@ -162,11 +164,13 @@ nscolor StyleAbsoluteColor::ToColor() const {
@@ -164,11 +166,13 @@ nscolor StyleAbsoluteColor::ToColor() const {
}
}

View File

@@ -1,8 +1,8 @@
diff --git a/layout/svg/SVGGradientFrame.cpp b/layout/svg/SVGGradientFrame.cpp
index b0d38b0fab01797328af0b1f1f48af8fb5eebe4d..953feffdc96143dc2d8f8e57f8bb4a6aeb33f0c5 100644
index eebcced86ec1e9010b761d5df4a92684dde44009..4dc018a73a979f50ac7842e4a3f3fcf9d0071b56 100644
--- a/layout/svg/SVGGradientFrame.cpp
+++ b/layout/svg/SVGGradientFrame.cpp
@@ -229,8 +229,9 @@ class MOZ_STACK_CLASS SVGColorStopInterpolator
@@ -228,8 +228,9 @@ class MOZ_STACK_CLASS SVGColorStopInterpolator
SVGColorStopInterpolator(
gfxPattern* aGradient, const nsTArray<ColorStop>& aStops,
const StyleColorInterpolationMethod& aStyleColorInterpolationMethod,
@@ -14,8 +14,8 @@ index b0d38b0fab01797328af0b1f1f48af8fb5eebe4d..953feffdc96143dc2d8f8e57f8bb4a6a
mGradient(aGradient) {}
void CreateStop(float aPosition, DeviceColor aColor) {
@@ -270,7 +271,8 @@ already_AddRefed<gfxPattern> SVGGradientFrame::GetPaintServerPattern(
if (nStops == 1 || GradientVectorLengthIsZero()) {
@@ -269,7 +270,8 @@ already_AddRefed<gfxPattern> SVGGradientFrame::GetPaintServerPattern(
if (nStops == 1 || GradientVectorLengthIsZero(gradientUnits)) {
// The gradient paints a single colour, using the stop-color of the last
// gradient step if there are more than one.
- return MakeAndAddRef<gfxPattern>(ToDeviceColor(stops.LastElement().mColor));

View File

@@ -1,5 +1,5 @@
diff --git a/layout/svg/SVGImageContext.h b/layout/svg/SVGImageContext.h
index b1f811989697966e30859610f4fc07579d0385ab..f6f4cd5a45fc49b416111d980fab4e612788903e 100644
index 63f3c4926cfdb8b12e9e4a38016fc66f50cf3129..5ba3f2c07f521905a086ee6eea87975d5a3441ec 100644
--- a/layout/svg/SVGImageContext.h
+++ b/layout/svg/SVGImageContext.h
@@ -6,6 +6,7 @@
@@ -7,10 +7,10 @@ index b1f811989697966e30859610f4fc07579d0385ab..f6f4cd5a45fc49b416111d980fab4e61
#include "Units.h"
+#include "nsColor.h"
#include "mozilla/Casting.h"
#include "mozilla/Maybe.h"
#include "mozilla/SVGContextPaint.h"
#include "mozilla/SVGPreserveAspectRatio.h"
@@ -63,6 +64,11 @@ class SVGImageContext {
@@ -64,6 +65,11 @@ class SVGImageContext {
nsISVGPaintContext* aPaintContext,
imgIContainer* aImgContainer);
@@ -19,10 +19,10 @@ index b1f811989697966e30859610f4fc07579d0385ab..f6f4cd5a45fc49b416111d980fab4e61
+ static void MaybeStoreZenBoosts(SVGImageContext& aContext,
+ const nsPresContext& aPresContext);
+
const Maybe<CSSIntSize>& GetViewportSize() const { return mViewportSize; }
const Maybe<CSSSize>& GetViewportSize() const { return mViewportSize; }
void SetViewportSize(const Maybe<CSSIntSize>& aSize) {
@@ -75,6 +81,21 @@ class SVGImageContext {
void SetViewportSize(const Maybe<CSSSize>& aSize) { mViewportSize = aSize; }
@@ -74,6 +80,21 @@ class SVGImageContext {
mColorScheme = aScheme;
}
@@ -44,7 +44,7 @@ index b1f811989697966e30859610f4fc07579d0385ab..f6f4cd5a45fc49b416111d980fab4e61
const Maybe<SVGPreserveAspectRatio>& GetPreserveAspectRatio() const {
return mPreserveAspectRatio;
}
@@ -116,7 +137,11 @@ class SVGImageContext {
@@ -109,7 +130,11 @@ class SVGImageContext {
return contextPaintIsEqual && mViewportSize == aOther.mViewportSize &&
mPreserveAspectRatio == aOther.mPreserveAspectRatio &&
mColorScheme == aOther.mColorScheme &&
@@ -56,18 +56,18 @@ index b1f811989697966e30859610f4fc07579d0385ab..f6f4cd5a45fc49b416111d980fab4e61
+ mZenBoostsInverted == aOther.mZenBoostsInverted;
}
bool operator!=(const SVGImageContext&) const = default;
@@ -129,7 +154,8 @@ class SVGImageContext {
return HashGeneric(hash, mViewportSize.map(HashSize).valueOr(0),
mPreserveAspectRatio.map(HashPAR).valueOr(0),
mColorScheme.map(HashColorScheme).valueOr(0),
- HashLinkParameters(mLinkParameters));
+ HashLinkParameters(mLinkParameters), mZenBoostsAccent,
+ mZenBoostsComplementaryRotation, mZenBoostsInverted);
PLDHashNumber Hash() const {
@@ -120,7 +145,8 @@ class SVGImageContext {
return AddToHash(hash, mViewportSize.map(HashSize).valueOr(0),
mPreserveAspectRatio.map(HashPAR).valueOr(0),
mColorScheme.map(HashColorScheme).valueOr(0),
- HashLinkParameters(mLinkParameters));
+ HashLinkParameters(mLinkParameters), mZenBoostsAccent,
+ mZenBoostsComplementaryRotation, mZenBoostsInverted);
}
private:
@@ -167,6 +193,9 @@ class SVGImageContext {
@@ -154,6 +180,9 @@ class SVGImageContext {
Maybe<SVGPreserveAspectRatio> mPreserveAspectRatio;
Maybe<ColorScheme> mColorScheme;
StyleLinkParameters mLinkParameters;

View File

@@ -1,5 +1,5 @@
diff --git a/services/sync/modules/service.sys.mjs b/services/sync/modules/service.sys.mjs
index 4f4efe572909441abdd81909282936702c225621..81ab06a9414ed656b644a21b40b683f06a4f8dbf 100644
index 4f4efe572909441abdd81909282936702c225621..2b47a2c9e97cf87641a0be9814f9a6be4d43f6ea 100644
--- a/services/sync/modules/service.sys.mjs
+++ b/services/sync/modules/service.sys.mjs
@@ -99,6 +99,10 @@ function getEngineModules() {
@@ -7,8 +7,8 @@ index 4f4efe572909441abdd81909282936702c225621..81ab06a9414ed656b644a21b40b683f0
whenFalse: "ExtensionStorageEngineBridge",
};
+ result.Spaces = {
+ module: "resource:///modules/zen/ZenWorkspacesSync.sys.mjs",
+ symbol: "ZenWorkspacesEngine",
+ module: "resource:///modules/zen/ZenSpacesSync.sys.mjs",
+ symbol: "ZenSpacesSyncEngine",
+ };
return result;
}

View File

@@ -0,0 +1,14 @@
diff --git a/testing/xpcshell/runxpcshelltests.py b/testing/xpcshell/runxpcshelltests.py
index 403401613189ffb758037850dc6bbb1d55f194ab..cad28e245155eb54775e551885532026e56c5fa9 100755
--- a/testing/xpcshell/runxpcshelltests.py
+++ b/testing/xpcshell/runxpcshelltests.py
@@ -2275,6 +2275,9 @@ class XPCShellTests:
appDirKey = None
if "appname" in self.mozInfo:
appDirKey = self.mozInfo["appname"] + "-appdir"
+ if appDirKey == "zen-appdir":
+ # Inherited manifests use firefox-appdir.
+ appDirKey = "firefox-appdir"
# We have to do this before we run tests that depend on having the node
# http/2 server.

View File

@@ -1,37 +0,0 @@
diff --git a/toolkit/components/contextualidentity/ContextualIdentityService.sys.mjs b/toolkit/components/contextualidentity/ContextualIdentityService.sys.mjs
index 5702ff28cc22206f5ce16584dac8a78d816562ce..3d08ecc97ce5995b30d8a4af0c33df329b428008 100644
--- a/toolkit/components/contextualidentity/ContextualIdentityService.sys.mjs
+++ b/toolkit/components/contextualidentity/ContextualIdentityService.sys.mjs
@@ -270,11 +270,29 @@ _ContextualIdentityService.prototype = {
});
},
- create(name, icon, color) {
+ create(name, icon, color, id = null) {
this.ensureDataReady();
- // Retrieve the next userContextId available.
- let userContextId = ++this._lastUserContextId;
+ if (id !== null) {
+ id = typeof id == "string" ? Number(id) : id;
+ if (!Number.isSafeInteger(id) || id <= 0) {
+ throw new Error(`Invalid userContextId '${id}'`);
+ }
+ }
+
+ let userContextId;
+ if (
+ id !== null &&
+ !this._identities.some(identity => identity.userContextId === id)
+ ) {
+ userContextId = id;
+ this._lastUserContextId = Math.max(
+ this._lastUserContextId,
+ userContextId
+ );
+ } else {
+ userContextId = ++this._lastUserContextId;
+ }
// Throw an error if the next userContextId available is invalid (the one associated to
// MAX_USER_CONTEXT_ID is already reserved to "userContextIdInternal.webextStorageLocal", which

View File

@@ -1,5 +1,5 @@
diff --git a/toolkit/content/widgets/moz-toggle/moz-toggle.tokens.css b/toolkit/content/widgets/moz-toggle/moz-toggle.tokens.css
index 6247d7a3923a6fedd4ec9911aba309ce565cd498..744e670eccc936dde664aa07df3e87bdcafd5e48 100644
index c0976c54418a28046802443931042bd285aefbde..2adb18d25edbb8aac4e396fcfc64a4a664607836 100644
--- a/toolkit/content/widgets/moz-toggle/moz-toggle.tokens.css
+++ b/toolkit/content/widgets/moz-toggle/moz-toggle.tokens.css
@@ -13,8 +13,8 @@
@@ -11,5 +11,5 @@ index 6247d7a3923a6fedd4ec9911aba309ce565cd498..744e670eccc936dde664aa07df3e87bd
+ --toggle-background-color-pressed: var(--zen-primary-color);
+ --toggle-background-color-pressed-hover: var(--zen-colors-hover-bg);
--toggle-background-color-pressed-active: var(--color-accent-primary-active);
--toggle-border-color: var(--border-color-interactive);
--toggle-border-color: light-dark(var(--color-gray-70), var(--border-color-interactive));
--toggle-border-color-hover: var(--toggle-border-color);

View File

@@ -1,5 +1,5 @@
diff --git a/toolkit/themes/shared/design-system/dist/tokens-shared.css b/toolkit/themes/shared/design-system/dist/tokens-shared.css
index 15c0d98a18b4f19e7f2e03d2b78066b0353f416a..b32f6244c7a07e93894bab422691a605456034a1 100644
index b0f8fa146de335c53e73d46853f45dda9b15cc73..1b7592c0e9ca12fd9d1f8a555633fd39c2efb537 100644
--- a/toolkit/themes/shared/design-system/dist/tokens-shared.css
+++ b/toolkit/themes/shared/design-system/dist/tokens-shared.css
@@ -7,6 +7,8 @@
@@ -8,10 +8,25 @@ index 15c0d98a18b4f19e7f2e03d2b78066b0353f416a..b32f6244c7a07e93894bab422691a605
+@import url("chrome://browser/content/zen-styles/zen-theme.css");
+
@layer tokens-foundation {
:root,
:host(.anonymous-content-host) {
@@ -424,8 +426,8 @@
:root,
:host(.anonymous-content-host) {
@layer tokens-foundation {
@@ -28,10 +30,10 @@
--border-color-selected: var(--color-accent-primary);
--border-color-transparent: transparent;
--border-radius-circle: 9999px;
- --border-radius-xsmall: 2px;
- --border-radius-small: 4px;
- --border-radius-medium: 8px;
- --border-radius-large: 16px;
+ --border-radius-xsmall: calc(2px * var(--zen-squircle-value));
+ --border-radius-small: calc(4px * var(--zen-squircle-value));
+ --border-radius-medium: calc(8px * var(--zen-squircle-value));
+ --border-radius-large: calc(16px * var(--zen-squircle-value));
--border-width: 1px;
/** box-shadow **/
@@ -477,8 +479,8 @@
--panel-background-color-dimmed-further: var(--background-color-dimmed-further);
--panel-border-color: light-dark(rgb(240, 240, 244), rgb(82, 82, 94));
--panel-border-radius: var(--border-radius-medium);

View File

@@ -1,8 +1,8 @@
diff --git a/widget/cocoa/nsCocoaWindow.h b/widget/cocoa/nsCocoaWindow.h
index 312011c1c2ac41e78affecbdef25d72766a7c882..e5865c7d6259f0a3df48edf7a26b1b75a23cdb3a 100644
index 22a2a7ef3a5e9257c8bb00ba6a55e8d39d2abbd9..6d8353fd11921585f7101f5717bdb3dd8f2a5eae 100644
--- a/widget/cocoa/nsCocoaWindow.h
+++ b/widget/cocoa/nsCocoaWindow.h
@@ -462,6 +462,10 @@ class nsCocoaWindow final : public nsIWidget {
@@ -461,6 +461,10 @@ class nsCocoaWindow final : public nsIWidget {
void SetHideTitlebarSeparator(bool) override;
bool IsMacTitlebarDirectionRTL() override;
void SetCustomTitlebar(bool) override;
@@ -13,9 +13,9 @@ index 312011c1c2ac41e78affecbdef25d72766a7c882..e5865c7d6259f0a3df48edf7a26b1b75
void UpdateThemeGeometries(
const nsTArray<ThemeGeometry>& aThemeGeometries) override;
void LockAspectRatio(bool aShouldLock) override;
@@ -672,6 +676,7 @@ class nsCocoaWindow final : public nsIWidget {
bool mAspectRatioLocked = false;
bool mIsAlert = false; // True if this is an non-native alert window.
@@ -674,6 +678,7 @@ class nsCocoaWindow final : public nsIWidget {
// show (e.g. a window created by detaching a tab from a fullscreen window).
bool mIsInitialFullscreenSuppressed = false;
bool mWasShown = false;
+ bool mIsBrowserWindow = false;

View File

@@ -1,16 +1,17 @@
diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm
index 2efd02e4a92433fd29bbfdb707aa81cfec45031e..3b763c3927f07e529c826f8e4f62bc80a324b247 100644
index 887e4c052d5dd2b73d4c2059463529fb4b09dcab..36da18e19018b1b216576c299f938e75093546d3 100644
--- a/widget/cocoa/nsCocoaWindow.mm
+++ b/widget/cocoa/nsCocoaWindow.mm
@@ -86,6 +86,7 @@
@@ -86,6 +86,8 @@
#include "mozilla/StaticPrefs_gfx.h"
#include "mozilla/StaticPrefs_ui.h"
#include "mozilla/StaticPrefs_widget.h"
+#include "mozilla/StaticPrefs_zen.h"
+#include "mozilla/nsZenDragAndDrop.h"
#include "mozilla/WritingModes.h"
#include "mozilla/dom/Document.h"
#include "mozilla/layers/CompositorBridgeChild.h"
@@ -1332,6 +1333,110 @@ - (NSRect)_opaqueRectForWindowMoveWhenInTitlebar {
@@ -1332,6 +1334,110 @@ - (NSRect)_opaqueRectForWindowMoveWhenInTitlebar {
}
@end
@@ -121,7 +122,28 @@ index 2efd02e4a92433fd29bbfdb707aa81cfec45031e..3b763c3927f07e529c826f8e4f62bc80
void nsCocoaWindow::UpdateWindowDraggingRegion(
const LayoutDeviceIntRegion& aRegion) {
// mChildView returns YES from mouseDownCanMoveWindow, so we need to put
@@ -4919,6 +5024,10 @@ - (BOOL)wantsBestResolutionOpenGLSurface {
@@ -3858,7 +3964,9 @@ - (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender {
// NSDraggingDestination
- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender {
MOZ_LOG(sCocoaLog, LogLevel::Info, ("ChildView draggingUpdated: entered\n"));
- return [self doDragAction:eDragOver sender:sender];
+ NSDragOperation operation = [self doDragAction:eDragOver sender:sender];
+ zen::PrepareDropLanding(sender);
+ return operation;
}
// NSDraggingDestination
@@ -3874,6 +3982,9 @@ - (void)draggingExited:(id<NSDraggingInfo>)sender {
- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
nsAutoRetainCocoaObject kungFuDeathGrip(self);
BOOL handled = [self doDragAction:eDrop sender:sender] != NSDragOperationNone;
+ if (handled) {
+ zen::LandDrop(sender);
+ }
NS_IF_RELEASE(mDragService);
return handled;
}
@@ -4919,6 +5030,10 @@ - (BOOL)wantsBestResolutionOpenGLSurface {
nsCocoaWindow::~nsCocoaWindow() {
NS_OBJC_BEGIN_TRY_IGNORE_BLOCK;

View File

@@ -1,5 +1,5 @@
diff --git a/widget/cocoa/nsDragService.mm b/widget/cocoa/nsDragService.mm
index 340a9ad81c5cb23bb7e5f927d11d5cffdde7ce70..32fc707ccfa56fa8c307860868d092c4a9050419 100644
index 340a9ad81c5cb23bb7e5f927d11d5cffdde7ce70..ba597ba4373ba3ace7455ce0859f2339349ffc06 100644
--- a/widget/cocoa/nsDragService.mm
+++ b/widget/cocoa/nsDragService.mm
@@ -10,6 +10,7 @@
@@ -45,3 +45,112 @@ index 340a9ad81c5cb23bb7e5f927d11d5cffdde7ce70..32fc707ccfa56fa8c307860868d092c4
#endif
src += 4;
dest += 4;
@@ -249,12 +254,44 @@
[[[NSDraggingItem alloc] initWithPasteboardWriter:pbItem] autorelease];
[dragItem setDraggingFrame:localDragRect contents:image];
+ NSMutableArray* dragItems = [NSMutableArray arrayWithObject:dragItem];
+ auto zenDragAndDrop = zen::nsZenDragAndDrop::GetZenDragAndDropInstance();
+ const nsTArray<nsCOMPtr<nsINode>> noExtraImages;
+ @try {
+ for (const auto& extraImageNode :
+ zenDragAndDrop ? zenDragAndDrop->DragImages() : noExtraImages) {
+ nsCOMPtr<nsINode> mainImage = std::move(mImage);
+ mImage = extraImageNode;
+ NSPoint extraPoint;
+ NSImage* extraImage = ConstructDragImage(mSourceNode, aRegion, &extraPoint);
+ mImage = std::move(mainImage);
+ if (!extraImage) {
+ continue;
+ }
+ NSRect extraRect = extraImage.alignmentRect;
+ extraRect.origin.x = extraPoint.x;
+ extraRect.origin.y = extraPoint.y - extraRect.size.height;
+ NSPasteboardItem* extraPbItem = [[NSPasteboardItem new] autorelease];
+ [extraPbItem setData:[NSData data]
+ forType:[UTIHelper stringFromPboardType:kMozWildcardPboardType]];
+ NSDraggingItem* extraItem = [[[NSDraggingItem alloc]
+ initWithPasteboardWriter:extraPbItem] autorelease];
+ [extraItem setDraggingFrame:extraRect contents:extraImage];
+ [dragItems addObject:extraItem];
+ }
+ } @catch (NSException* e) {
+ dragItems = [NSMutableArray arrayWithObject:dragItem];
+ }
+
OpenDragPopup();
mNSDraggingSession = [mNativeDragView
- beginDraggingSessionWithItems:[NSArray arrayWithObject:dragItem]
+ beginDraggingSessionWithItems:dragItems
event:mNativeDragEvent
source:mNativeDragView];
+ if (dragItems.count > 1) {
+ mNSDraggingSession.draggingFormation = NSDraggingFormationStack;
+ }
mNSDraggingSession.animatesToStartingPositionsOnCancelOrFail =
!mDataTransfer || mDataTransfer->MozShowFailAnimation();
@@ -455,29 +492,44 @@
}
if (pc) {
+ nsPoint pt = LayoutDevicePixel::ToAppUnits(
+ devPoint, pc->DeviceContext()->AppUnitsPerDevPixel());
+ CSSIntPoint screenPoint =
+ CSSIntPoint(nsPresContext::AppUnitsToIntCSSPixels(pt.x),
+ nsPresContext::AppUnitsToIntCSSPixels(pt.y));
+
+ NSMutableArray* images = [NSMutableArray array];
+ NSMutableArray* rects = [NSMutableArray array];
+ auto render = [&]() {
+ LayoutDeviceIntRect newRect;
+ NSImage* image =
+ ConstructDragImage(mSourceNode, Nothing(), screenPoint, &newRect);
+ [images addObject:image ? (id)image : (id)[NSNull null]];
+ [rects addObject:[NSValue valueWithRect:
+ image ? nsCocoaUtils::GeckoRectToCocoaRectDevPix(
+ newRect, scaleFactor)
+ : NSZeroRect]];
+ };
+ render();
+ if (auto zenDragAndDrop = zen::nsZenDragAndDrop::GetZenDragAndDropInstance()) {
+ for (const auto& extraImageNode : zenDragAndDrop->DragImages()) {
+ nsCOMPtr<nsINode> mainImage = std::move(mImage);
+ mImage = extraImageNode;
+ render();
+ mImage = std::move(mainImage);
+ }
+ }
+
void (^changeImageBlock)(NSDraggingItem*, NSInteger, BOOL*) = ^(
NSDraggingItem* draggingItem, NSInteger idx, BOOL* stop) {
- // We never add more than one item right now, but check just in case.
- if (idx > 0) {
+ if ((NSUInteger)idx >= images.count || images[idx] == [NSNull null]) {
return;
}
-
- nsPoint pt = LayoutDevicePixel::ToAppUnits(
- devPoint, pc->DeviceContext()->AppUnitsPerDevPixel());
- CSSIntPoint screenPoint =
- CSSIntPoint(nsPresContext::AppUnitsToIntCSSPixels(pt.x),
- nsPresContext::AppUnitsToIntCSSPixels(pt.y));
-
- // Create a new image; if one isn't returned don't change the current
- // one.
- LayoutDeviceIntRect newRect;
- NSImage* image =
- ConstructDragImage(mSourceNode, Nothing(), screenPoint, &newRect);
- if (image) {
- NSRect draggingRect =
- nsCocoaUtils::GeckoRectToCocoaRectDevPix(newRect, scaleFactor);
- [draggingItem setDraggingFrame:draggingRect contents:image];
+ NSRect frame = [rects[idx] rectValue];
+ if (idx > 0) {
+ frame.origin = draggingItem.draggingFrame.origin;
}
+ [draggingItem setDraggingFrame:frame contents:images[idx]];
};
[mNSDraggingSession

View File

@@ -0,0 +1,29 @@
diff --git a/widget/gtk/nsDragSessionSource.cpp b/widget/gtk/nsDragSessionSource.cpp
index a5f67d700f8c80d513f08cc25405b57cf28a2a9a..58186470bcbb7b1eda34ee20a19e29d540ab052a 100644
--- a/widget/gtk/nsDragSessionSource.cpp
+++ b/widget/gtk/nsDragSessionSource.cpp
@@ -13,6 +13,7 @@
#include "mozilla/Services.h"
#include "mozilla/StaticPrefs_widget.h"
#include "mozilla/WidgetUtilsGtk.h"
+#include "mozilla/nsZenDragAndDrop.h"
#include "nsAppShell.h"
#include "nsArrayUtils.h"
#include "nsCRT.h"
@@ -1196,11 +1197,15 @@ bool nsDragSessionSource::SetAlphaPixmap(SourceSurface* aSurface,
cairo_image_surface_get_stride(surf), SurfaceFormat::B8G8R8A8);
if (!dt) return false;
+ auto drag_translucency = DRAG_IMAGE_ALPHA_LEVEL;
+ if (auto zenDragAndDrop = zen::nsZenDragAndDrop::GetZenDragAndDropInstance()) {
+ drag_translucency = zenDragAndDrop->GetDragImageOpacity();
+ }
dt->ClearRect(Rect(0, 0, dragRect.width, dragRect.height));
dt->DrawSurface(
aSurface, Rect(0, 0, dragRect.width, dragRect.height),
Rect(0, 0, dragRect.width, dragRect.height), DrawSurfaceOptions(),
- DrawOptions(DRAG_IMAGE_ALPHA_LEVEL, CompositionOp::OP_SOURCE));
+ DrawOptions(drag_translucency, CompositionOp::OP_SOURCE));
cairo_surface_mark_dirty(surf);
cairo_surface_set_device_offset(surf, -aXOffset, -aYOffset);

View File

@@ -1521,7 +1521,7 @@ ${cssSelector} {
shuffleBoost() {
const availFonts = this.fetchFontList();
const commonFonts = this.commonFonts;
let font = commonFonts[Math.round(Math.random() * commonFonts.length)];
let font = commonFonts[Math.floor(Math.random() * commonFonts.length)];
if (availFonts.includes(font)) {
this.currentBoostData.fontFamily = font;
}

View File

@@ -649,9 +649,10 @@ class nsZenBoostsManager {
);
// Close the editor if the tab is switched
const onTabSelect = editor.close.bind(editor);
parentWindow.gBrowser.tabContainer.addEventListener(
"TabSelect",
editor.close.bind(editor),
onTabSelect,
{
once: true,
}
@@ -661,13 +662,24 @@ class nsZenBoostsManager {
onLocationChange: webProgress => {
if (webProgress.isTopLevel) {
editor.close();
parentWindow.gBrowser.removeTabsProgressListener(progressListener);
}
},
};
parentWindow.gBrowser.addProgressListener(progressListener);
editor.addEventListener(
"unload",
() => {
parentWindow.gBrowser.tabContainer.removeEventListener(
"TabSelect",
onTabSelect
);
parentWindow.gBrowser.removeProgressListener(progressListener);
},
{ once: true }
);
// Give the domain
editor.domain = domain;
editor.openerWindow = parentWindow;

View File

@@ -70,8 +70,10 @@ export class ZenBoostsChild extends JSWindowActorChild {
static PREVENTABLE_SET = new Set(ZenBoostsChild.PREVENTABLE_EVENTS);
actorCreated() {
this.#applyBoostForPageIfAvailable();
handleEvent(event) {
if (event.type === "DOMDocElementInserted") {
this.#applyBoostForPageIfAvailable();
}
}
didDestroy() {
@@ -330,6 +332,22 @@ export class ZenBoostsChild extends JSWindowActorChild {
return this.sendQuery("ZenBoost:GetBoostForDomain", domain);
}
/**
* Sets a synced BrowsingContext field only when its value changes. Every
* setter commits a transaction that is broadcast to the whole browsing
* context group, even when the value is unchanged, so this avoids three
* such broadcasts on every page load that has no boost.
*
* @param {BrowsingContext} browsingContext
* @param {string} field - The synced field name.
* @param {number | boolean} value
*/
#setSyncedField(browsingContext, field, value) {
if (browsingContext[field] !== value) {
browsingContext[field] = value;
}
}
/**
* Applies the boost settings for the current page if available.
*
@@ -360,7 +378,11 @@ export class ZenBoostsChild extends JSWindowActorChild {
sizeOverride: boostData.sizeOverride,
});
browsingContext.isZenBoostsInverted = boostData.smartInvert;
this.#setSyncedField(
browsingContext,
"isZenBoostsInverted",
!!boostData.smartInvert
);
if (boostData.enableColorBoost) {
let primaryColor;
if (boostData.autoTheme) {
@@ -396,18 +418,21 @@ export class ZenBoostsChild extends JSWindowActorChild {
boostData
);
}
browsingContext.zenBoostsData = primaryColor;
this.#setSyncedField(browsingContext, "zenBoostsData", primaryColor);
// The complementary accent is derived in the backend by rotating the
// primary accent's hue by this delta (in degrees).
browsingContext.zenBoostsComplementaryRotation =
boostData.secondaryDotAngleDegDelta ?? 0;
this.#setSyncedField(
browsingContext,
"zenBoostsComplementaryRotation",
boostData.secondaryDotAngleDegDelta ?? 0
);
return;
}
} else {
browsingContext.isZenBoostsInverted = false;
this.#setSyncedField(browsingContext, "isZenBoostsInverted", false);
}
browsingContext.zenBoostsData = 0;
browsingContext.zenBoostsComplementaryRotation = 0;
this.#setSyncedField(browsingContext, "zenBoostsData", 0);
this.#setSyncedField(browsingContext, "zenBoostsComplementaryRotation", 0);
}
/**

Some files were not shown because too many files have changed in this diff Show More