mirror of
https://github.com/zen-browser/desktop.git
synced 2026-09-24 13:16:26 +00:00
Compare commits
98 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4c92731b2d | ||
|
|
be04ad6d50 | ||
|
|
f0f21cdade | ||
|
|
e68b5e5c26 | ||
|
|
7545e5a870 | ||
|
|
b3467c0ff2 | ||
|
|
303b6e39ed | ||
|
|
7debd15013 | ||
|
|
450aeeccd3 | ||
|
|
8645a5b9c8 | ||
|
|
031b5d8d0a | ||
|
|
2804ba8350 | ||
|
|
5e5926e708 | ||
|
|
a65f96c3b8 | ||
|
|
4b4a659c7b | ||
|
|
5ff06e4274 | ||
|
|
f31f99e507 | ||
|
|
2ee1275f28 | ||
|
|
45b9cfe37f | ||
|
|
f800d550cb | ||
|
|
04e7db5d3a | ||
|
|
644bf48b6c | ||
|
|
d2acc61a88 | ||
|
|
f84278317f | ||
|
|
4980f3ce18 | ||
|
|
5362ddbccd | ||
|
|
6c32eaad68 | ||
|
|
610e7bfbae | ||
|
|
b43785de65 | ||
|
|
787f9c5e02 | ||
|
|
22961e97d8 | ||
|
|
cb6a607c67 | ||
|
|
267c9aabe1 | ||
|
|
d54e12359c | ||
|
|
c89645a787 | ||
|
|
0a548c7572 | ||
|
|
6d158223b5 | ||
|
|
76fcd5c822 | ||
|
|
ed6900d762 | ||
|
|
2e9aecd41b | ||
|
|
da995e8653 | ||
|
|
64d73ab3e3 | ||
|
|
9551444c61 | ||
|
|
fdf9588b7b | ||
|
|
b07b17c87e | ||
|
|
c9d3cb3dc9 | ||
|
|
2c030369c5 | ||
|
|
88a90206ce | ||
|
|
6d398dec63 | ||
|
|
243a8791a0 | ||
|
|
412731f37e | ||
|
|
7a78848177 | ||
|
|
a323036995 | ||
|
|
abc69a1fcb | ||
|
|
8df45e5c9a | ||
|
|
58e83c137f | ||
|
|
4f3bcb2f32 | ||
|
|
c209ea72c1 | ||
|
|
55b71754f3 | ||
|
|
6af79fd621 | ||
|
|
57196c1464 | ||
|
|
43d47ac537 | ||
|
|
a8a94c14a4 | ||
|
|
3655afbe13 | ||
|
|
bb023ac5b1 | ||
|
|
faafff667e | ||
|
|
8b632c9b05 | ||
|
|
67b6daaa0e | ||
|
|
e89bd7796e | ||
|
|
66c5931a29 | ||
|
|
a5585c5619 | ||
|
|
2326d2b56b | ||
|
|
9ef1d96c00 | ||
|
|
432f93770f | ||
|
|
f28e0688fb | ||
|
|
8df6fef1ac | ||
|
|
4746d36699 | ||
|
|
9e0c790602 | ||
|
|
3d53b37e8b | ||
|
|
e7ddfb52db | ||
|
|
ba70449bdd | ||
|
|
bf40c31149 | ||
|
|
7a093beae4 | ||
|
|
03b4e934fe | ||
|
|
b93d19b873 | ||
|
|
b9c4000fe2 | ||
|
|
0b7687ec6d | ||
|
|
d70b3d902c | ||
|
|
f9f8f2f372 | ||
|
|
99dca42723 | ||
|
|
ed0a6fd447 | ||
|
|
88c6611f1e | ||
|
|
e66e763e63 | ||
|
|
721135f576 | ||
|
|
d8a934d2ec | ||
|
|
91a1d4d2ca | ||
|
|
97577dac26 | ||
|
|
5723a89bcd |
2
.gitattributes
vendored
2
.gitattributes
vendored
@@ -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++
|
||||
|
||||
51
.github/workflows/build.yml
vendored
51
.github/workflows/build.yml
vendored
@@ -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 }}
|
||||
|
||||
12
.github/workflows/linux-release-build.yml
vendored
12
.github/workflows/linux-release-build.yml
vendored
@@ -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 }}
|
||||
|
||||
1
.github/workflows/macos-profile-build.yml
vendored
1
.github/workflows/macos-profile-build.yml
vendored
@@ -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:
|
||||
|
||||
14
.github/workflows/macos-release-build.yml
vendored
14
.github/workflows/macos-release-build.yml
vendored
@@ -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
|
||||
|
||||
1
.github/workflows/windows-profile-build.yml
vendored
1
.github/workflows/windows-profile-build.yml
vendored
@@ -27,7 +27,6 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
arch: [x86_64, aarch64]
|
||||
|
||||
runs-on: ${{ inputs.release-branch == 'release' && 'windows-latest' || 'windows-latest' }}
|
||||
|
||||
steps:
|
||||
|
||||
18
.github/workflows/windows-release-build.yml
vendored
18
.github/workflows/windows-release-build.yml
vendored
@@ -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
|
||||
|
||||
@@ -1 +1 @@
|
||||
1.94.1
|
||||
1.95.0
|
||||
@@ -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.1`!
|
||||
- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 156.0.1`!
|
||||
|
||||
### Contributing
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
1fb0703fa9723fd9c400ad60d18e64ee4f9bf125
|
||||
782b15a7c771795a323e9403340c029e7c8d7629
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -34,3 +39,4 @@ zen-action-switch-to-dark-mode = Switch to Dark Mode
|
||||
zen-action-print = Print
|
||||
zen-action-focus-on = Focus on
|
||||
zen-action-extension = Extension
|
||||
zen-action-open = Open
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
112
locales/en-US/browser/browser/zen-library.ftl
Normal file
112
locales/en-US/browser/browser/zen-library.ftl
Normal file
@@ -0,0 +1,112 @@
|
||||
# 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-library-button =
|
||||
.label = Library
|
||||
.tooltiptext = Library
|
||||
|
||||
library-footer-close-button =
|
||||
.tooltiptext = Close library
|
||||
library-footer-donate-button =
|
||||
.tooltiptext = Donate to Zen
|
||||
|
||||
library-history-section-title = History
|
||||
library-downloads-section-title = Downloads
|
||||
library-boosts-section-title = Boosts
|
||||
library-media-section-title = Media
|
||||
library-spaces-section-title = Spaces
|
||||
|
||||
library-filter-button = Filter
|
||||
library-filter-done = Done
|
||||
|
||||
library-history-filter-title = Filter History…
|
||||
library-history-filter-when = When was it visited?
|
||||
library-filter-today = Today
|
||||
library-filter-week = This Week
|
||||
library-filter-month = This Month
|
||||
library-history-filter-sort = Sort by
|
||||
library-history-sort-date = By Date
|
||||
library-history-sort-site = By Site
|
||||
library-history-sort-most-visited = By Most Visited
|
||||
library-history-sort-last-visited = By Last Visited
|
||||
library-history-site-other = Other
|
||||
library-history-search-placeholder =
|
||||
.placeholder = Search History…
|
||||
library-history-empty = No history found
|
||||
library-media-empty = No media found
|
||||
library-media-search-placeholder =
|
||||
.placeholder = Search Media…
|
||||
library-media-loading = Looking for media…
|
||||
library-media-opt-in-title = Your Media in the Library
|
||||
library-media-opt-in-body = Quickly grab screenshots, images and videos from your computer by showing them in the Zen Library.
|
||||
library-media-opt-in-button = Show Media
|
||||
library-media-opt-in-note = Media never leaves your computer and is not viewable by anyone but you.
|
||||
library-media-filter-title = Filter Media…
|
||||
library-media-filter-folders = Where to look
|
||||
library-media-open-in = Open in { $app }
|
||||
library-media-close =
|
||||
.title = Close
|
||||
library-media-previous =
|
||||
.title = Previous
|
||||
library-media-next =
|
||||
.title = Next
|
||||
library-media-more =
|
||||
.title = More options
|
||||
library-media-menu-open =
|
||||
.label = Open
|
||||
library-media-menu-copy =
|
||||
.label = Copy
|
||||
library-history-forget-button =
|
||||
.title = Remove from history
|
||||
library-history-reopen-button =
|
||||
.title = Reopen page
|
||||
|
||||
library-downloads-empty = No downloads found
|
||||
library-downloads-more-button =
|
||||
.title = More options
|
||||
library-downloads-menu-open =
|
||||
.label = Open { $name }
|
||||
library-downloads-menu-copy =
|
||||
.label = Copy { $name }
|
||||
library-downloads-menu-hide =
|
||||
.label = Hide from Zen
|
||||
library-downloads-menu-trash =
|
||||
.label = Move to Trash
|
||||
library-downloads-opening-in = { PLATFORM() ->
|
||||
[macos] Opening in Finder…
|
||||
[windows] Opening in File Explorer…
|
||||
*[other] Opening in file manager…
|
||||
}
|
||||
library-downloads-cancel-button =
|
||||
.title = Cancel download
|
||||
library-downloads-filter-title = Filter Downloads…
|
||||
library-downloads-filter-type = File type
|
||||
library-downloads-filter-when = When was it downloaded?
|
||||
library-downloads-type-images = Images
|
||||
library-downloads-type-video = Video
|
||||
library-downloads-type-audio = Audio
|
||||
library-downloads-type-documents = Documents
|
||||
library-downloads-type-archives = Archives
|
||||
library-downloads-type-apps = Apps
|
||||
library-downloads-retry-button =
|
||||
.title = Retry download
|
||||
|
||||
library-spaces-theme-button =
|
||||
.title = Change theme
|
||||
library-spaces-move-button =
|
||||
.title = Drag to reorder
|
||||
library-spaces-actions-button =
|
||||
.tooltiptext = More options
|
||||
library-spaces-icon-button =
|
||||
.title = Change icon
|
||||
library-spaces-name-button =
|
||||
.title = Rename space
|
||||
|
||||
library-boosts-search-placeholder =
|
||||
.placeholder = Search Boosts…
|
||||
library-boosts-empty = No boosts yet
|
||||
library-boosts-toggle =
|
||||
.aria-label = Enable boost
|
||||
library-boosts-menu-edit =
|
||||
.label = Edit Boost
|
||||
43
locales/en-US/browser/browser/zen-share.ftl
Normal file
43
locales/en-US/browser/browser/zen-share.ftl
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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—don’t 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 = DON’T 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/>
|
||||
Let’s get rolling!
|
||||
zen-welcome-start-browsing-description-1 = You’re 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? Let’s get rolling!
|
||||
zen-welcome-start-browsing-description-1 = You’re all set up and ready to go. Click the button below to start browsing with { -brand-short-name }.
|
||||
zen-welcome-start-browsing = Dive in!
|
||||
|
||||
@@ -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
8
package-lock.json
generated
@@ -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": {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
15
prefs/zen/library.yaml
Normal file
15
prefs/zen/library.yaml
Normal file
@@ -0,0 +1,15 @@
|
||||
# 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/.
|
||||
|
||||
- name: zen.library.enabled
|
||||
value: "@IS_TWILIGHT@"
|
||||
|
||||
- name: zen.library.last-tab
|
||||
value: "history"
|
||||
|
||||
- name: zen.library.media.enabled
|
||||
value: false
|
||||
|
||||
- name: zen.library.media.folders
|
||||
value: "downloads,documents,pictures"
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
- name: zen.theme.acrylic-elements
|
||||
value: "@IS_TWILIGHT@"
|
||||
|
||||
|
||||
- name: zen.theme.disable-lightweight
|
||||
value: true
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
+
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
diff --git a/.stylelintignore b/.stylelintignore
|
||||
index 185490999507b8a5032977237af50f5e61c71df1..77c1635d90c6480af4ebd3c6e3ec49780eaca571 100644
|
||||
index 185490999507b8a5032977237af50f5e61c71df1..4b1b1dc76d316f38f60c90e6cbd74d9569800d04 100644
|
||||
--- a/.stylelintignore
|
||||
+++ b/.stylelintignore
|
||||
@@ -106,3 +106,19 @@ build/pgo/blueprint/**/*.css
|
||||
@@ -106,3 +106,20 @@ build/pgo/blueprint/**/*.css
|
||||
# under our control or we don't want to modify at this point:
|
||||
testing/web-platform/mozilla/
|
||||
testing/web-platform/tests/
|
||||
@@ -20,5 +20,6 @@ index 185490999507b8a5032977237af50f5e61c71df1..77c1635d90c6480af4ebd3c6e3ec4978
|
||||
+zen/split-view/zen-split-view.css
|
||||
+zen/spaces/zen-workspaces.css
|
||||
+zen/common/styles/zen-toolbar.css
|
||||
+zen/common/styles/zen-single-components.css
|
||||
+
|
||||
+*.inc
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
|
||||
@@ -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..d35aa0457307e95ad00464861fcee2827325193e 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,12 @@ index dd2f391096968564086911c532f696dc7ffb8ae1..3de617bf4fb7fa35f7d4d7b618e4673b
|
||||
+</hbox>
|
||||
|
||||
<toolbar id="nav-bar"
|
||||
class="browser-toolbar chromeclass-location"
|
||||
class="browser-toolbar"
|
||||
@@ -180,7 +188,6 @@
|
||||
<toolbartabstop/>
|
||||
<html:moz-urlbar id="urlbar"
|
||||
class="urlbar"
|
||||
- popover="manual"
|
||||
pageproxystate="invalid"
|
||||
unifiedsearchbutton-available=""
|
||||
sap-name="urlbar">
|
||||
|
||||
@@ -21,3 +21,5 @@
|
||||
#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
|
||||
#include ../../../zen/library/jar.inc.mn
|
||||
|
||||
@@ -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" />
|
||||
@@ -70,4 +72,6 @@
|
||||
<command id="cmd_zenNewLiveFolder" />
|
||||
|
||||
<command id="cmd_zenDuplicateTab" />
|
||||
|
||||
<command id="cmd_zenToggleLibrary" />
|
||||
</commandset>
|
||||
|
||||
@@ -12,4 +12,6 @@
|
||||
<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"/>
|
||||
<link rel="localization" href="browser/zen-library.ftl"/>
|
||||
</linkset>
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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
|
||||
/>
|
||||
|
||||
@@ -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());
|
||||
},
|
||||
};
|
||||
@@ -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": {
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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",
|
||||
+ },
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -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",
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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",
|
||||
});
|
||||
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
1211
src/browser/components/tabbrowser/Tabbrowser-sys-mjs.patch
Normal file
1211
src/browser/components/tabbrowser/Tabbrowser-sys-mjs.patch
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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 = "";
|
||||
|
||||
@@ -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
@@ -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 @@
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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":
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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..778d8aecce4da6748ecbf8b86a38c2da6e01bec5 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,8 +126,11 @@ 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 @@ ${
|
||||
@@ -3193,8 +3264,16 @@ ${
|
||||
}
|
||||
|
||||
this.toggleAttribute("breakout-extend", true);
|
||||
+ this.#showBreakoutPopover();
|
||||
this.#updateTextboxPosition();
|
||||
|
||||
+ this.window.gZenUIManager.onUrlbarOpen();
|
||||
@@ -131,7 +143,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,7 +3297,33 @@ ${
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -159,9 +171,13 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
|
||||
+ this.removeAttribute("zen-floating-urlbar");
|
||||
+
|
||||
this.toggleAttribute("breakout-extend", false);
|
||||
+ if (this.#isAddressbar) {
|
||||
+ this.#hideBreakoutPopover();
|
||||
+ }
|
||||
this.#updateTextboxPosition();
|
||||
}
|
||||
@@ -3049,7 +3148,7 @@ ${
|
||||
|
||||
@@ -3256,7 +3361,7 @@ ${
|
||||
forceUnifiedSearchButtonAvailable = false
|
||||
) {
|
||||
let prevState = this.getAttribute("pageproxystate");
|
||||
@@ -170,20 +186,51 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
|
||||
this.setAttribute("pageproxystate", state);
|
||||
this._inputContainer.setAttribute("pageproxystate", state);
|
||||
this._identityBox?.setAttribute("pageproxystate", state);
|
||||
@@ -3332,10 +3431,12 @@ ${
|
||||
@@ -3533,7 +3638,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() {
|
||||
@@ -3553,12 +3662,29 @@ ${
|
||||
this.removeAttribute("breakout");
|
||||
this.parentNode.removeAttribute("breakout");
|
||||
this.style.top = "";
|
||||
+ this.#hideBreakoutPopover();
|
||||
+ this._layoutBreakoutUpdateKey = {};
|
||||
+ }
|
||||
+
|
||||
+ #showBreakoutPopover() {
|
||||
+ if (this.#isAddressbar) {
|
||||
+ this.setAttribute("popover", "manual");
|
||||
+ }
|
||||
+ if (!this.matches(":popover-open")) {
|
||||
+ this.showPopover();
|
||||
+ }
|
||||
+ this.#fixAddressbarSearchbarOrder();
|
||||
+ }
|
||||
+
|
||||
+ #hideBreakoutPopover() {
|
||||
try {
|
||||
this.hidePopover();
|
||||
} catch (ex) {
|
||||
// No big deal if not a popover already.
|
||||
}
|
||||
- this._layoutBreakoutUpdateKey = {};
|
||||
+ if (this.#isAddressbar) {
|
||||
+ this.removeAttribute("popover");
|
||||
+ }
|
||||
}
|
||||
|
||||
incrementBreakoutBlockerCount() {
|
||||
@@ -3591,9 +3717,10 @@ ${
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -193,9 +240,21 @@ 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) {
|
||||
@@ -3602,8 +3729,9 @@ ${
|
||||
|
||||
this.setAttribute("breakout", "true");
|
||||
this.parentNode.setAttribute("breakout", "true");
|
||||
- this.showPopover();
|
||||
- this.#fixAddressbarSearchbarOrder();
|
||||
+ if (!this.#isAddressbar || this.hasAttribute("breakout-extend")) {
|
||||
+ this.#showBreakoutPopover();
|
||||
+ }
|
||||
this.#updateTextboxPosition();
|
||||
|
||||
resolve();
|
||||
@@ -4108,6 +4236,7 @@ ${
|
||||
}
|
||||
|
||||
_toggleActionOverride(event) {
|
||||
@@ -203,63 +262,49 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
|
||||
if (
|
||||
event.keyCode == KeyEvent.DOM_VK_SHIFT ||
|
||||
event.keyCode == KeyEvent.DOM_VK_ALT ||
|
||||
@@ -4014,8 +4117,8 @@ ${
|
||||
@@ -4206,9 +4335,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 +4540,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 +4866,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 +4878,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 +5160,11 @@ ${
|
||||
if (!engineName && !source && !this.hasAttribute("searchmode")) {
|
||||
return;
|
||||
}
|
||||
@@ -272,7 +317,7 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
|
||||
if (this._searchModeIndicatorTitle) {
|
||||
this._searchModeIndicatorTitle.textContent = "";
|
||||
this._searchModeIndicatorTitle.removeAttribute("data-l10n-id");
|
||||
@@ -5297,6 +5412,7 @@ ${
|
||||
@@ -5335,6 +5474,7 @@ ${
|
||||
|
||||
this.document.l10n.setAttributes(
|
||||
this.inputField,
|
||||
@@ -280,7 +325,20 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
|
||||
l10nId,
|
||||
l10nId == "urlbar-placeholder-with-name"
|
||||
? { name: engineName }
|
||||
@@ -5424,6 +5540,11 @@ ${
|
||||
@@ -5385,6 +5525,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 +5610,11 @@ ${
|
||||
}
|
||||
|
||||
_on_click(event) {
|
||||
@@ -292,7 +350,7 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
|
||||
switch (event.target) {
|
||||
case this.inputField:
|
||||
case this._inputContainer:
|
||||
@@ -5513,10 +5634,11 @@ ${
|
||||
@@ -5558,10 +5709,11 @@ ${
|
||||
}
|
||||
if (untrim) {
|
||||
this.setValue(this._untrimmedValue);
|
||||
@@ -305,7 +363,7 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
|
||||
this.view.autoOpen({ event });
|
||||
} else {
|
||||
if (this._untrimOnFocusAfterKeydown) {
|
||||
@@ -5556,9 +5678,16 @@ ${
|
||||
@@ -5605,9 +5757,16 @@ ${
|
||||
}
|
||||
|
||||
_on_mousedown(event) {
|
||||
@@ -323,7 +381,7 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
|
||||
if (
|
||||
event.composedTarget != this.inputField &&
|
||||
event.composedTarget != this._inputContainer
|
||||
@@ -5568,6 +5697,10 @@ ${
|
||||
@@ -5617,6 +5776,10 @@ ${
|
||||
|
||||
this.focusedViaMousedown = !this.focused;
|
||||
this.#preventClickSelectsAll = this.focused;
|
||||
@@ -334,21 +392,21 @@ index e7e9495e56076cd112beafb8297dece4ae4cea58..330104d245ddd0956b95377082a61825
|
||||
|
||||
// Keep the focus status, since the attribute may be changed
|
||||
// upon calling this.focus().
|
||||
@@ -5605,7 +5738,7 @@ ${
|
||||
@@ -5654,7 +5817,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.
|
||||
- if (event.target.closest?.("tab, #urlbarView-context-menu")) {
|
||||
+ if (event.target.closest?.("tab, #urlbarView-context-menu") || event.target.closest?.("#tabs-newtab-button")) {
|
||||
+ if (event.target.closest?.("tab, #urlbarView-context-menu") || event.target.closest?.("menupopup") || event.target.closest?.("#tabs-newtab-button")) {
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -5894,7 +6027,7 @@ ${
|
||||
@@ -5948,7 +6111,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 = {
|
||||
@@ -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..ff488cf5a2c8b7857a8e145e40aaf861cfa655ec 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,56 @@ 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":
|
||||
@@ -1060,6 +1080,7 @@ export const UrlbarShared = {
|
||||
case "UrlbarProviderAboutPages":
|
||||
return UrlbarShared.RESULT_GROUP.ABOUT_PAGES;
|
||||
case "UrlbarProviderInputHistory":
|
||||
+ case "ZenUrlbarProviderSidebar":
|
||||
return UrlbarShared.RESULT_GROUP.INPUT_HISTORY;
|
||||
case "UrlbarProviderQuickSuggest":
|
||||
return UrlbarShared.RESULT_GROUP.GENERAL_PARENT;
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
124
src/browser/installer/windows/nsis/shared-nsh.patch
Normal file
124
src/browser/installer/windows/nsis/shared-nsh.patch
Normal 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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ html|dialog {
|
||||
}
|
||||
|
||||
groupbox button {
|
||||
border-radius: 5px !important;
|
||||
border-radius: calc(5px * var(--zen-squircle-value)) !important;
|
||||
}
|
||||
|
||||
groupbox button,
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,37 @@
|
||||
#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="24" height="24" fill="context-fill" fill-opacity="context-fill-opacity" class="zen-library-icon" viewBox="4 4 24 24"><style>@property --zen-triangle-anim { syntax: '<number>'; initial-value: 1; inherits: false; }
|
||||
@property --zen-circle-anim { syntax: '<number>'; initial-value: 1; inherits: false; }
|
||||
@keyframes StarBackward {
|
||||
0% { transform: rotate(120deg); }
|
||||
100% { transform: rotate(0deg); }
|
||||
}
|
||||
@keyframes TriangleBackward {
|
||||
0% { --zen-triangle-anim: 1; }
|
||||
100% { --zen-triangle-anim: 0; }
|
||||
}
|
||||
@keyframes CircleBackward {
|
||||
0% { --zen-circle-anim: 1; }
|
||||
100% { --zen-circle-anim: 0; }
|
||||
}
|
||||
@keyframes GlowBackward {
|
||||
0% { opacity: 0.4; }
|
||||
100% { opacity: 0; }
|
||||
}
|
||||
@keyframes GlowElementsBackward {
|
||||
0% { opacity: 0.5; }
|
||||
100% { opacity: 0; }
|
||||
}
|
||||
.zen-library-star { transform-origin: 10px 10.2px; animation: StarBackward 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; }
|
||||
.zen-library-triangle-group { transform-origin: 17px 9.2px; animation: TriangleBackward 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; transform: translate(calc(var(--zen-triangle-anim) * 2px), 0px) rotate(calc(var(--zen-triangle-anim) * 365deg)) scale(max(1 - var(--zen-triangle-anim) / 0.65, (var(--zen-triangle-anim) - 0.65) / 0.35)); }
|
||||
.zen-library-circle { transform-origin: 0px 0px; animation: CircleBackward 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; transform: translate(calc(var(--zen-circle-anim) * 1px), calc(var(--zen-circle-anim) * -1.5px)) scale(max(0, max((var(--zen-circle-anim) - 0.75) / 0.25, min(1, 1 - (var(--zen-circle-anim) - 0.3) / 0.35)))); }
|
||||
.zen-library-glow { filter: blur(2px); animation: GlowBackward 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; }
|
||||
.zen-library-glow-element { filter: blur(2px); animation: GlowElementsBackward 0.4s cubic-bezier(0.4, 0, 0.2, 1) forwards; }
|
||||
.zen-library-glow-bg, .zen-library-glow-element { fill: transparent !important; stroke: none !important; }
|
||||
.zen-library-glow-rays { stroke: transparent !important; fill: none !important; }
|
||||
@media (prefers-color-scheme: dark) {
|
||||
.zen-library-glow-bg, .zen-library-glow-element { fill: white !important; }
|
||||
.zen-library-glow-rays { stroke: white !important; }
|
||||
}</style><defs><mask id="zen-library-box-mask"><rect width="40" height="40" x="-10" y="-10" fill="#fff"/><rect width="40" height="40" x="-10" y="11.635" fill="#000"/></mask></defs><g fill-rule="evenodd"><g mask="url(#zen-library-box-mask)"><path d="M7.773 11.635c.363.228.467.44.445.659l-.182 1.788a.579.579 0 0 0 .946.503l1.38-1.153a.58.58 0 0 1 .604-.085l1.644.725a.578.578 0 0 0 .77-.745l-.679-1.692a.58.58 0 0 1 .115-.577l1.198-1.34a.578.578 0 0 0-.47-.962l-1.794.121a.58.58 0 0 1-.539-.286l-.904-1.553a.578.578 0 0 0-1.06.15l-.439 1.743a.58.58 0 0 1-.438.424l-1.757.38a.578.578 0 0 0-.186 1.055z" class="zen-library-star zen-library-glow-element"/><path d="M7.773 11.635c.363.228.467.44.445.659l-.182 1.788a.579.579 0 0 0 .946.503l1.38-1.153a.58.58 0 0 1 .604-.085l1.644.725a.578.578 0 0 0 .77-.745l-.679-1.692a.58.58 0 0 1 .115-.577l1.198-1.34a.578.578 0 0 0-.47-.962l-1.794.121a.58.58 0 0 1-.539-.286l-.904-1.553a.578.578 0 0 0-1.06.15l-.439 1.743a.58.58 0 0 1-.438.424l-1.757.38a.578.578 0 0 0-.186 1.055z" class="zen-library-star"/></g><g transform="translate(14, 6.2)"><circle r="1.4" class="zen-library-circle zen-library-glow-element"/><circle r="1" class="zen-library-circle"/></g><g class="zen-library-triangle-group"><g transform="translate(17, 9.2)"><path d="M-1.1 1.8c-.3.2-.6 0-.6-.3v-3c0-.3.3-.5.6-.3L1.4-.4c.3.2.3.6 0 .8Z" class="zen-library-triangle zen-library-glow-element"/><path d="M-1.1 1.8c-.3.2-.6 0-.6-.3v-3c0-.3.3-.5.6-.3L1.4-.4c.3.2.3.6 0 .8Z" class="zen-library-triangle"/></g></g><g class="zen-library-glow"><path d="m6.6 6.6 1.44 6.1h9.92l1.44-6.1Z" class="zen-library-glow-bg"/><path d="m6.1 6.6 1.94 6.1h9.92l1.94-6.1" class="zen-library-glow-rays"/></g><path d="M7.218 13.287c0-.456.37-.826.826-.826h9.913c.457 0 .826.37.826.826v4.131a3.304 3.304 0 0 1-3.304 3.304h-4.956a3.305 3.305 0 0 1-3.305-3.304zm3.391 1.239c0-.456.37-.826.826-.826h3.304a.826.826 0 1 1 0 1.652h-3.304a.826.826 0 0 1-.826-.826" class="zen-library-box"/></g></svg>
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
@@ -142,6 +143,7 @@
|
||||
* skin/classic/browser/zen-icons/tracking-protection.svg (../shared/zen-icons/nucleo/tracking-protection.svg)
|
||||
* skin/classic/browser/zen-icons/translations.svg (../shared/zen-icons/nucleo/translations.svg)
|
||||
* skin/classic/browser/zen-icons/trash.svg (../shared/zen-icons/nucleo/trash.svg)
|
||||
* skin/classic/browser/zen-icons/u-turn-to-left.svg (../shared/zen-icons/nucleo/u-turn-to-left.svg)
|
||||
* skin/classic/browser/zen-icons/unpin.svg (../shared/zen-icons/nucleo/unpin.svg)
|
||||
* skin/classic/browser/zen-icons/video-blocked-fill.svg (../shared/zen-icons/nucleo/video-blocked-fill.svg)
|
||||
* skin/classic/browser/zen-icons/video-fill.svg (../shared/zen-icons/nucleo/video-fill.svg)
|
||||
@@ -164,8 +166,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 +256,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)
|
||||
@@ -292,6 +295,7 @@
|
||||
* skin/classic/browser/zen-icons/tracking-protection.svg (../shared/zen-icons/nucleo/tracking-protection.svg)
|
||||
* skin/classic/browser/zen-icons/translations.svg (../shared/zen-icons/nucleo/translations.svg)
|
||||
* skin/classic/browser/zen-icons/trash.svg (../shared/zen-icons/nucleo/trash.svg)
|
||||
* skin/classic/browser/zen-icons/u-turn-to-left.svg (../shared/zen-icons/nucleo/u-turn-to-left.svg)
|
||||
* skin/classic/browser/zen-icons/unpin.svg (../shared/zen-icons/nucleo/unpin.svg)
|
||||
* skin/classic/browser/zen-icons/video-blocked-fill.svg (../shared/zen-icons/nucleo/video-blocked-fill.svg)
|
||||
* skin/classic/browser/zen-icons/video-fill.svg (../shared/zen-icons/nucleo/video-fill.svg)
|
||||
@@ -314,8 +318,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 +408,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)
|
||||
@@ -442,6 +447,7 @@
|
||||
* skin/classic/browser/zen-icons/tracking-protection.svg (../shared/zen-icons/nucleo/tracking-protection.svg)
|
||||
* skin/classic/browser/zen-icons/translations.svg (../shared/zen-icons/nucleo/translations.svg)
|
||||
* skin/classic/browser/zen-icons/trash.svg (../shared/zen-icons/nucleo/trash.svg)
|
||||
* skin/classic/browser/zen-icons/u-turn-to-left.svg (../shared/zen-icons/nucleo/u-turn-to-left.svg)
|
||||
* skin/classic/browser/zen-icons/unpin.svg (../shared/zen-icons/nucleo/unpin.svg)
|
||||
* skin/classic/browser/zen-icons/video-blocked-fill.svg (../shared/zen-icons/nucleo/video-blocked-fill.svg)
|
||||
* skin/classic/browser/zen-icons/video-fill.svg (../shared/zen-icons/nucleo/video-fill.svg)
|
||||
@@ -459,8 +465,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 +528,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)
|
||||
@@ -540,4 +546,11 @@
|
||||
* skin/classic/browser/zen-icons/selectable/warning.svg (../shared/zen-icons/common/selectable/warning.svg)
|
||||
* skin/classic/browser/zen-icons/selectable/water.svg (../shared/zen-icons/common/selectable/water.svg)
|
||||
* skin/classic/browser/zen-icons/selectable/weight.svg (../shared/zen-icons/common/selectable/weight.svg)
|
||||
* skin/classic/browser/zen-icons/library/library-boosts-sprite.svg (../shared/zen-icons/common/library/library-boosts-sprite.svg)
|
||||
* skin/classic/browser/zen-icons/library/library-downloads-sprite.svg (../shared/zen-icons/common/library/library-downloads-sprite.svg)
|
||||
* skin/classic/browser/zen-icons/library/library-history-sprite.svg (../shared/zen-icons/common/library/library-history-sprite.svg)
|
||||
* skin/classic/browser/zen-icons/library/library-media-sprite.svg (../shared/zen-icons/common/library/library-media-sprite.svg)
|
||||
* skin/classic/browser/zen-icons/library/library-spaces-sprite.svg (../shared/zen-icons/common/library/library-spaces-sprite.svg)
|
||||
* skin/classic/browser/zen-icons/library/library-sprite.svg (../shared/zen-icons/common/library/library-sprite.svg)
|
||||
* skin/classic/browser/zen-icons/library/library.svg (../shared/zen-icons/common/library/library.svg)
|
||||
skin/classic/browser/zen-icons/icons.css (../shared/zen-icons/icons.css)
|
||||
|
||||
@@ -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>
|
||||
@@ -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 applicable, you may obtain one at
|
||||
# http://mozilla.org/MPL/2.0/.
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="context-fill" fill-opacity="context-fill-opacity" viewBox="0 0 18 18"><path d="M5.22 2.22a.75.75 0 1 1 1.06 1.06L4.06 5.5H12a4.5 4.5 0 0 1 0 9H8.25a.75.75 0 0 1 0-1.5H12a3 3 0 0 0 0-6H4.06l2.22 2.22a.75.75 0 0 1-1.06 1.06l-3.5-3.5a.75.75 0 0 1-.165-.812l.004-.01a1 1 0 0 1 .056-.105 1 1 0 0 1 .105-.133z"/></svg>
|
||||
@@ -60,6 +60,13 @@ do_common_icons() {
|
||||
echo "Working on $filename"
|
||||
echo "* skin/classic/browser/zen-icons/selectable/$filename (../shared/zen-icons/common/selectable/$filename) " >> jar.inc.mn
|
||||
done
|
||||
for filename in common/library/*.svg; do
|
||||
# remove the os/ prefix
|
||||
add_header_to_file $filename
|
||||
filename=$(basename $filename)
|
||||
echo "Working on $filename"
|
||||
echo "* skin/classic/browser/zen-icons/library/$filename (../shared/zen-icons/common/library/$filename) " >> jar.inc.mn
|
||||
done
|
||||
}
|
||||
|
||||
do_icons nucleo WIN # TODO: use windows icons
|
||||
|
||||
@@ -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)(
|
||||
|
||||
@@ -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.
|
||||
@@ -1,167 +0,0 @@
|
||||
diff --git a/gfx/webrender_bindings/WebRenderAPI.cpp b/gfx/webrender_bindings/WebRenderAPI.cpp
|
||||
--- a/gfx/webrender_bindings/WebRenderAPI.cpp
|
||||
+++ b/gfx/webrender_bindings/WebRenderAPI.cpp
|
||||
@@ -298,11 +298,13 @@
|
||||
panic_on_gl_error, picTileWidth, picTileHeight,
|
||||
gfx::gfxVars::WebRenderRequiresHardwareDriver(),
|
||||
StaticPrefs::gfx_webrender_low_quality_pinch_zoom_AtStartup(),
|
||||
StaticPrefs::gfx_webrender_max_shared_surface_size_AtStartup(),
|
||||
StaticPrefs::gfx_webrender_enable_subpixel_aa_AtStartup(),
|
||||
- compositor->ShouldUseLayerCompositor())) {
|
||||
+ compositor->ShouldUseLayerCompositor(),
|
||||
+ StaticPrefs::
|
||||
+ gfx_webrender_opaque_backdrop_fallback_AtStartup())) {
|
||||
// wr_window_new puts a message into gfxCriticalNote if it returns
|
||||
// false
|
||||
MOZ_ASSERT(errorMessage);
|
||||
error.AssignASCII(errorMessage);
|
||||
wr_api_free_error_msg(errorMessage);
|
||||
diff --git a/gfx/webrender_bindings/src/bindings.rs b/gfx/webrender_bindings/src/bindings.rs
|
||||
--- a/gfx/webrender_bindings/src/bindings.rs
|
||||
+++ b/gfx/webrender_bindings/src/bindings.rs
|
||||
@@ -1998,10 +1998,11 @@
|
||||
reject_software_rasterizer: bool,
|
||||
low_quality_pinch_zoom: bool,
|
||||
max_shared_surface_size: i32,
|
||||
enable_subpixel_aa: bool,
|
||||
use_layer_compositor: bool,
|
||||
+ opaque_backdrop_fallback: bool,
|
||||
) -> bool {
|
||||
assert!(unsafe { is_in_render_thread() });
|
||||
|
||||
// Ensure the WR profiler callbacks are hooked up to the Gecko profiler.
|
||||
set_profiler_hooks(Some(&PROFILER_HOOKS));
|
||||
@@ -2164,10 +2165,11 @@
|
||||
texture_cache_config,
|
||||
reject_software_rasterizer,
|
||||
low_quality_pinch_zoom,
|
||||
max_shared_surface_size,
|
||||
enable_dithering,
|
||||
+ opaque_backdrop_fallback,
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
let window_size = DeviceIntSize::new(window_width, window_height);
|
||||
let notifier = Box::new(CppNotifier { window_id });
|
||||
diff --git a/gfx/wr/webrender/src/device/gl.rs b/gfx/wr/webrender/src/device/gl.rs
|
||||
--- a/gfx/wr/webrender/src/device/gl.rs
|
||||
+++ b/gfx/wr/webrender/src/device/gl.rs
|
||||
@@ -3982,10 +3982,14 @@
|
||||
|
||||
pub fn disable_color_write(&self) {
|
||||
self.gl.color_mask(false, false, false, false);
|
||||
}
|
||||
|
||||
+ pub fn set_color_mask(&self, r: bool, g: bool, b: bool, a: bool) {
|
||||
+ self.gl.color_mask(r, g, b, a);
|
||||
+ }
|
||||
+
|
||||
pub fn set_blend(&mut self, enable: bool) {
|
||||
if enable {
|
||||
self.gl.enable(gl::BLEND);
|
||||
} else {
|
||||
self.gl.disable(gl::BLEND);
|
||||
diff --git a/gfx/wr/webrender/src/renderer/init.rs b/gfx/wr/webrender/src/renderer/init.rs
|
||||
--- a/gfx/wr/webrender/src/renderer/init.rs
|
||||
+++ b/gfx/wr/webrender/src/renderer/init.rs
|
||||
@@ -204,6 +204,8 @@
|
||||
pub low_quality_pinch_zoom: bool,
|
||||
pub max_shared_surface_size: i32,
|
||||
/// If true, open a debug socket to listen for remote debugger.
|
||||
/// Relies on `debugger` cargo feature being enabled.
|
||||
pub enable_debugger: bool,
|
||||
+ /// See explanation of `gfx.webrender.opaque-backdrop-fallback`.
|
||||
+ pub opaque_backdrop_fallback: bool,
|
||||
}
|
||||
@@ -277,9 +279,10 @@
|
||||
enable_instancing: true,
|
||||
reject_software_rasterizer: false,
|
||||
low_quality_pinch_zoom: false,
|
||||
max_shared_surface_size: 2048,
|
||||
enable_debugger: true,
|
||||
+ opaque_backdrop_fallback: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -802,10 +805,11 @@
|
||||
allocated_native_surfaces: FastHashSet::default(),
|
||||
debug_overlay_state: DebugOverlayState::new(),
|
||||
buffer_damage_tracker: BufferDamageTracker::default(),
|
||||
max_primitive_instance_count,
|
||||
enable_instancing: options.enable_instancing,
|
||||
+ opaque_backdrop_fallback: options.opaque_backdrop_fallback,
|
||||
consecutive_oom_frames: 0,
|
||||
target_frame_publish_id: None,
|
||||
pending_result_msg: None,
|
||||
layer_compositor_frame_state_in_prev_frame: None,
|
||||
external_composite_debug_items: Vec::new(),
|
||||
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 @@
|
||||
buffer_damage_tracker: BufferDamageTracker,
|
||||
|
||||
max_primitive_instance_count: usize,
|
||||
enable_instancing: bool,
|
||||
|
||||
+ opaque_backdrop_fallback: bool,
|
||||
+
|
||||
/// Count consecutive oom frames to detectif we are stuck unable to render
|
||||
/// in a loop.
|
||||
consecutive_oom_frames: u32,
|
||||
|
||||
/// update() defers processing of ResultMsg, if frame_publish_id of
|
||||
@@ -2787,18 +2789,29 @@
|
||||
let read_target = ReadTarget::from_texture(cache_texture);
|
||||
|
||||
// Should always be drawing to picture cache tiles or off-screen surface!
|
||||
debug_assert!(!draw_target.is_default());
|
||||
let device_to_framebuffer = Scale::new(1i32);
|
||||
+ let dest_fb_rect = dest * device_to_framebuffer;
|
||||
|
||||
self.device.blit_render_target(
|
||||
read_target,
|
||||
src * device_to_framebuffer,
|
||||
draw_target,
|
||||
- dest * device_to_framebuffer,
|
||||
+ dest_fb_rect,
|
||||
TextureFilter::Linear,
|
||||
);
|
||||
+
|
||||
+ if self.opaque_backdrop_fallback {
|
||||
+ self.device.set_color_mask(false, false, false, true);
|
||||
+ self.device.clear_target(
|
||||
+ Some([0.0, 0.0, 0.0, 1.0]),
|
||||
+ None,
|
||||
+ Some(dest_fb_rect),
|
||||
+ );
|
||||
+ self.device.set_color_mask(true, true, true, true);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn draw_picture_cache_target(
|
||||
diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml
|
||||
--- a/modules/libpref/init/StaticPrefList.yaml
|
||||
+++ b/modules/libpref/init/StaticPrefList.yaml
|
||||
@@ -8439,10 +8439,17 @@
|
||||
#else
|
||||
value: false
|
||||
#endif
|
||||
mirror: once
|
||||
|
||||
+# Make backdrop-filter treat its captured backdrop as if it had been
|
||||
+# composited over an opaque-black background. (See bug 2036640)
|
||||
+- name: gfx.webrender.opaque-backdrop-fallback
|
||||
+ type: bool
|
||||
+ value: true
|
||||
+ mirror: once
|
||||
+
|
||||
# Disable wait of GPU execution completion
|
||||
- name: gfx.webrender.wait-gpu-finished.disabled
|
||||
type: bool
|
||||
value: false
|
||||
mirror: once
|
||||
|
||||
@@ -0,0 +1,886 @@
|
||||
diff --git a/gfx/wr/webrender/src/command_buffer.rs b/gfx/wr/webrender/src/command_buffer.rs
|
||||
index 9369cea..8c70d29 100644
|
||||
--- a/gfx/wr/webrender/src/command_buffer.rs
|
||||
+++ b/gfx/wr/webrender/src/command_buffer.rs
|
||||
@@ -476,6 +476,9 @@ pub struct CommandBufferBuilder {
|
||||
|
||||
/// List of render tasks that depend on the task that will be created for this builder.
|
||||
pub extra_dependencies: Vec<RenderTaskId>,
|
||||
+
|
||||
+ /// If true, backdrop-filters on this (tiled) surface also read back the slices below it.
|
||||
+ pub backdrop_reads_lower_slices: bool,
|
||||
}
|
||||
|
||||
impl CommandBufferBuilder {
|
||||
@@ -485,12 +488,14 @@ impl CommandBufferBuilder {
|
||||
establishes_sub_graph: false,
|
||||
resolve_source: None,
|
||||
extra_dependencies: Vec::new(),
|
||||
+ backdrop_reads_lower_slices: false,
|
||||
}
|
||||
}
|
||||
|
||||
/// Construct a tiled command buffer builder.
|
||||
pub fn new_tiled(
|
||||
tiles: FastHashMap<TileKey, SurfaceTileDescriptor>,
|
||||
+ backdrop_reads_lower_slices: bool,
|
||||
) -> Self {
|
||||
CommandBufferBuilder {
|
||||
kind: CommandBufferBuilderKind::Tiled {
|
||||
@@ -499,6 +504,7 @@ impl CommandBufferBuilder {
|
||||
establishes_sub_graph: false,
|
||||
resolve_source: None,
|
||||
extra_dependencies: Vec::new(),
|
||||
+ backdrop_reads_lower_slices,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -518,6 +524,7 @@ impl CommandBufferBuilder {
|
||||
establishes_sub_graph,
|
||||
resolve_source: None,
|
||||
extra_dependencies: Vec::new(),
|
||||
+ backdrop_reads_lower_slices: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
diff --git a/gfx/wr/webrender/src/frame_builder.rs b/gfx/wr/webrender/src/frame_builder.rs
|
||||
index 068182d..1442528 100644
|
||||
--- a/gfx/wr/webrender/src/frame_builder.rs
|
||||
+++ b/gfx/wr/webrender/src/frame_builder.rs
|
||||
@@ -17,7 +17,7 @@ use crate::gpu_types::{PrimitiveHeaders, ZBufferIdGenerator};
|
||||
use crate::gpu_types::QuadSegment;
|
||||
use crate::internal_types::{FastHashMap, PlaneSplitter, FrameStamp};
|
||||
use crate::invalidation::DirtyRegion;
|
||||
-use crate::tile_cache::{SliceId, TileCacheInstance};
|
||||
+use crate::tile_cache::{SliceId, TileCacheInstance, update_cross_slice_backdrops};
|
||||
use crate::picture::PictureInstance;
|
||||
use crate::picture::ResolvedSurfaceTexture;
|
||||
use crate::picture::{RasterConfig, PictureScratch};
|
||||
@@ -487,6 +487,25 @@ impl FrameBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
+ if render_picture_cache_slices {
|
||||
+ let slice_ids: Vec<SliceId> = scene.tile_cache_pictures
|
||||
+ .iter()
|
||||
+ .filter_map(|pic_index| {
|
||||
+ match scene.prim_store.pictures[pic_index.0 as usize].raster_config {
|
||||
+ Some(RasterConfig { composite_mode: PictureCompositeMode::TileCache { slice_id }, .. }) => Some(slice_id),
|
||||
+ _ => None,
|
||||
+ }
|
||||
+ })
|
||||
+ .collect();
|
||||
+
|
||||
+ update_cross_slice_backdrops(
|
||||
+ &slice_ids,
|
||||
+ tile_caches,
|
||||
+ &visibility_context,
|
||||
+ &composite_state.compositor_kind,
|
||||
+ );
|
||||
+ }
|
||||
+
|
||||
scratch.primitive.frame.assert_draws_resolved();
|
||||
|
||||
profile.end_time(profiler::FRAME_VISIBILITY_TIME);
|
||||
diff --git a/gfx/wr/webrender/src/picture.rs b/gfx/wr/webrender/src/picture.rs
|
||||
index 9b100ee..8f476e5 100644
|
||||
--- a/gfx/wr/webrender/src/picture.rs
|
||||
+++ b/gfx/wr/webrender/src/picture.rs
|
||||
@@ -140,7 +140,8 @@ use std::ops::Range;
|
||||
use crate::picture_textures::PictureCacheTextureHandle;
|
||||
use crate::util::{MaxRect, Recycler, ScaleOffset};
|
||||
use crate::tile_cache::{SliceDebugInfo, TileDebugInfo, DirtyTileDebugInfo, CompositorClipDebugInfo};
|
||||
-use crate::tile_cache::{SliceId, TileCacheInstance, TileSurface, NativeSurface};
|
||||
+use crate::tile_cache::{SliceId, Tile, TileCacheInstance, TileSurface, NativeSurface};
|
||||
+use crate::render_target::{LowerSliceSource, LowerSliceSourceKind};
|
||||
use crate::tile_cache::{BackdropKind, BackdropSurface};
|
||||
use crate::tile_cache::{TileKey, SubSliceIndex};
|
||||
use crate::invalidation::InvalidationReason;
|
||||
@@ -1660,6 +1661,32 @@ fn prepare_tiled_picture_surface(
|
||||
let device_pixel_scale = frame_state
|
||||
.surfaces[surface_index.0]
|
||||
.device_pixel_scale;
|
||||
+
|
||||
+ let pic_to_root = if tile_cache.feeds_cross_slice_backdrop {
|
||||
+ frame_context.spatial_tree
|
||||
+ .get_relative_transform(tile_cache.spatial_node_index, frame_context.root_spatial_node_index)
|
||||
+ .as_2d_scale_offset()
|
||||
+ } else {
|
||||
+ None
|
||||
+ };
|
||||
+ let rounded_clip = tile_cache.compositor_clip.map(|clip_index| {
|
||||
+ let clip = frame_state.composite_state.get_compositor_clip(clip_index);
|
||||
+ (clip.rect.cast_unit(), clip.radius)
|
||||
+ });
|
||||
+ let local_clip_rect = tile_cache.local_clip_rect;
|
||||
+ let lower_slice_source = move |tile: &Tile, kind: LowerSliceSourceKind, rect: PictureRect, sub_slice_index: usize| {
|
||||
+ let pic_to_root = pic_to_root?;
|
||||
+ let clip_rect = local_clip_rect
|
||||
+ .intersection(&tile.cached_surface.current_descriptor.local_valid_rect)?;
|
||||
+
|
||||
+ Some(LowerSliceSource {
|
||||
+ kind,
|
||||
+ rect: pic_to_root.map_rect(&rect),
|
||||
+ clip_rect: pic_to_root.map_rect(&clip_rect),
|
||||
+ rounded_clip,
|
||||
+ sub_slice_index,
|
||||
+ })
|
||||
+ };
|
||||
let mut at_least_one_tile_visible = false;
|
||||
|
||||
// Get the overall device space rect of the picture cache. Used to clip
|
||||
@@ -1784,6 +1811,19 @@ fn prepare_tiled_picture_surface(
|
||||
|
||||
at_least_one_tile_visible = true;
|
||||
|
||||
+ if tile.feeds_cross_slice_backdrop {
|
||||
+ if let Some(TileSurface::Color { color }) = tile.surface {
|
||||
+ if let Some(source) = lower_slice_source(
|
||||
+ tile,
|
||||
+ LowerSliceSourceKind::Color(color),
|
||||
+ tile.cached_surface.current_descriptor.local_valid_rect,
|
||||
+ sub_slice_index,
|
||||
+ ) {
|
||||
+ frame_state.surface_builder.lower_slice_sources.push(source);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
if let TileSurface::Texture { descriptor, .. } = tile.surface.as_mut().unwrap() {
|
||||
match descriptor {
|
||||
SurfaceTextureDescriptor::TextureCache { ref handle, .. } => {
|
||||
@@ -1972,7 +2012,8 @@ fn prepare_tiled_picture_surface(
|
||||
// TODO(gw): As a performance optimization, we could skip the resolve picture
|
||||
// if the dirty rect is the same as the resolve rect (probably quite
|
||||
// common for effects that scroll underneath a backdrop-filter, for example).
|
||||
- let use_tile_composite = !tile.cached_surface.sub_graphs.is_empty();
|
||||
+ let use_tile_composite = !tile.cached_surface.sub_graphs.is_empty() ||
|
||||
+ tile.feeds_cross_slice_backdrop;
|
||||
|
||||
if use_tile_composite {
|
||||
let mut local_content_rect = tile.cached_surface.local_dirty_rect;
|
||||
@@ -2056,12 +2097,24 @@ fn prepare_tiled_picture_surface(
|
||||
),
|
||||
);
|
||||
|
||||
+ let lower_slice_source = if tile.feeds_cross_slice_backdrop {
|
||||
+ lower_slice_source(
|
||||
+ tile,
|
||||
+ LowerSliceSourceKind::Task(render_task_id),
|
||||
+ (content_device_rect.to_f32() / device_pixel_scale).cast_unit(),
|
||||
+ sub_slice_index,
|
||||
+ )
|
||||
+ } else {
|
||||
+ None
|
||||
+ };
|
||||
+
|
||||
surface_render_tasks.insert(
|
||||
tile_key,
|
||||
SurfaceTileDescriptor {
|
||||
current_task_id: render_task_id,
|
||||
composite_task_id: Some(composite_task_id),
|
||||
dirty_rect: tile.cached_surface.local_dirty_rect,
|
||||
+ lower_slice_source,
|
||||
},
|
||||
);
|
||||
} else {
|
||||
@@ -2097,6 +2150,7 @@ fn prepare_tiled_picture_surface(
|
||||
current_task_id: render_task_id,
|
||||
composite_task_id: None,
|
||||
dirty_rect: tile.cached_surface.local_dirty_rect,
|
||||
+ lower_slice_source: None,
|
||||
},
|
||||
);
|
||||
}
|
||||
@@ -2262,7 +2316,10 @@ fn prepare_tiled_picture_surface(
|
||||
);
|
||||
}
|
||||
|
||||
- let descriptor = SurfaceDescriptor::new_tiled(surface_render_tasks);
|
||||
+ let descriptor = SurfaceDescriptor::new_tiled(
|
||||
+ surface_render_tasks,
|
||||
+ tile_cache.backdrop_reads_lower_slices,
|
||||
+ );
|
||||
|
||||
frame_state.surface_builder.push_surface(
|
||||
surface_index,
|
||||
diff --git a/gfx/wr/webrender/src/render_target.rs b/gfx/wr/webrender/src/render_target.rs
|
||||
index 2185365..d3ca780 100644
|
||||
--- a/gfx/wr/webrender/src/render_target.rs
|
||||
+++ b/gfx/wr/webrender/src/render_target.rs
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
|
||||
use api::units::*;
|
||||
-use api::{ColorF, LineOrientation, BorderStyle};
|
||||
+use api::{BorderRadius, ColorF, LineOrientation, BorderStyle};
|
||||
use crate::batch::{AlphaBatchBuilder, AlphaBatchContainer, BatchTextures, TextureSet};
|
||||
use crate::batch::{BatchBuilder, INVALID_SEGMENT_INDEX, ClipMaskInstanceList};
|
||||
use crate::render_task::{SubTask, RectangleClipSubTask, ImageClipSubTask};
|
||||
@@ -631,6 +631,33 @@ pub struct ResolveOp {
|
||||
/// back the region the backdrop actually covers rather than one offset by
|
||||
/// the difference between the two raster roots.
|
||||
pub dest_to_src_raster: ScaleOffset,
|
||||
+ /// Content of the picture cache slices below the backdrop root, drawn bottom-up
|
||||
+ /// under the content of the src tasks.
|
||||
+ pub lower_slice_sources: Vec<LowerSliceSource>,
|
||||
+ /// Maps a rect from the dest surface's raster space into the root coordinate system.
|
||||
+ pub dest_raster_to_root: ScaleOffset,
|
||||
+}
|
||||
+
|
||||
+#[cfg_attr(feature = "capture", derive(Serialize))]
|
||||
+#[cfg_attr(feature = "replay", derive(Deserialize))]
|
||||
+#[derive(Debug, PartialEq, Clone)]
|
||||
+pub enum LowerSliceSourceKind {
|
||||
+ Task(RenderTaskId),
|
||||
+ Color(ColorF),
|
||||
+}
|
||||
+
|
||||
+/// Content of a picture cache tile that a backdrop-filter in a slice above it reads
|
||||
+/// back.
|
||||
+#[cfg_attr(feature = "capture", derive(Serialize))]
|
||||
+#[cfg_attr(feature = "replay", derive(Deserialize))]
|
||||
+#[derive(Debug, PartialEq, Clone)]
|
||||
+pub struct LowerSliceSource {
|
||||
+ pub kind: LowerSliceSourceKind,
|
||||
+ /// The rect covered by the task's content, or by the color.
|
||||
+ pub rect: LayoutRect,
|
||||
+ pub clip_rect: LayoutRect,
|
||||
+ pub rounded_clip: Option<(LayoutRect, BorderRadius)>,
|
||||
+ pub sub_slice_index: usize,
|
||||
}
|
||||
|
||||
#[cfg_attr(feature = "capture", derive(Serialize))]
|
||||
diff --git a/gfx/wr/webrender/src/renderer/composite.rs b/gfx/wr/webrender/src/renderer/composite.rs
|
||||
index 032a0e1..dd91394 100644
|
||||
--- a/gfx/wr/webrender/src/renderer/composite.rs
|
||||
+++ b/gfx/wr/webrender/src/renderer/composite.rs
|
||||
@@ -6,6 +6,7 @@ use api::units::*;
|
||||
use api::{ColorF, ImageBufferKind, ImageRendering, PremultipliedColorF};
|
||||
use crate::batch::BatchTextures;
|
||||
use crate::composite::{
|
||||
+ CompositorClip,
|
||||
CompositeState, CompositeSurfaceFormat, CompositeTileSurface, CompositorConfig,
|
||||
CompositorInputLayer, CompositorSurfaceUsage, CompositorSurfaceTransform,
|
||||
CompositeRoundedCorner, NativeTileId, ResolvedExternalSurface,
|
||||
@@ -20,7 +21,11 @@ use crate::debug_item::DebugItem;
|
||||
use crate::segment::EdgeMask;
|
||||
use crate::device::DrawTarget;
|
||||
use crate::gpu_types::{CompositeInstance, ZBufferId};
|
||||
-use crate::internal_types::{FastHashMap, TextureSource};
|
||||
+use crate::internal_types::{FastHashMap, Swizzle, TextureSource};
|
||||
+use crate::render_target::{LowerSliceSourceKind, ResolveOp};
|
||||
+use crate::render_task::RenderTaskKind;
|
||||
+use crate::render_task_graph::RenderTaskGraph;
|
||||
+use api::BorderRadius;
|
||||
use crate::picture::ResolvedSurfaceTexture;
|
||||
use super::RenderResults;
|
||||
use crate::profiler::{self};
|
||||
@@ -435,6 +440,134 @@ impl Renderer {
|
||||
}
|
||||
}
|
||||
|
||||
+ pub(super) fn draw_resolve_with_lower_slices(
|
||||
+ &mut self,
|
||||
+ resolve_op: &ResolveOp,
|
||||
+ render_tasks: &RenderTaskGraph,
|
||||
+ draw_target: DrawTarget,
|
||||
+ projection: &default::Transform3D<f32>,
|
||||
+ src_copies: &[(TextureSource, DeviceIntRect, DeviceIntRect)],
|
||||
+ stats: &mut RendererStats,
|
||||
+ ) {
|
||||
+ let dest_task = &render_tasks[resolve_op.dest_task_id];
|
||||
+ let dest_info = match dest_task.kind {
|
||||
+ RenderTaskKind::Picture(ref info) => info,
|
||||
+ _ => panic!("bug: not a picture"),
|
||||
+ };
|
||||
+ let dest_task_rect = DeviceRect::from_origin_and_size(
|
||||
+ dest_task.get_target_rect().min.to_f32(),
|
||||
+ dest_info.content_size.to_f32(),
|
||||
+ );
|
||||
+ let dest_offset = dest_task_rect.min.to_vector() - dest_info.content_origin.to_vector();
|
||||
+ let root_to_dest = |rect: &LayoutRect| -> DeviceRect {
|
||||
+ let raster: WorldRect = resolve_op.dest_raster_to_root.unmap_rect(rect);
|
||||
+ let device: DeviceRect = (raster * dest_info.device_pixel_scale).cast_unit();
|
||||
+ device.translate(dest_offset)
|
||||
+ };
|
||||
+ let radius_scale = dest_info.device_pixel_scale.0 / resolve_op.dest_raster_to_root.scale.x;
|
||||
+
|
||||
+ let mut draws = Vec::new();
|
||||
+
|
||||
+ for source in &resolve_op.lower_slice_sources {
|
||||
+ let clip_rect = match root_to_dest(&source.clip_rect).intersection(&dest_task_rect) {
|
||||
+ Some(clip_rect) => clip_rect,
|
||||
+ None => continue,
|
||||
+ };
|
||||
+ let rect = root_to_dest(&source.rect);
|
||||
+ let clip = source.rounded_clip.map(|(clip_rect, radius)| {
|
||||
+ CompositorClip {
|
||||
+ rect: root_to_dest(&clip_rect),
|
||||
+ radius: BorderRadius {
|
||||
+ top_left: radius.top_left * radius_scale,
|
||||
+ top_right: radius.top_right * radius_scale,
|
||||
+ bottom_left: radius.bottom_left * radius_scale,
|
||||
+ bottom_right: radius.bottom_right * radius_scale,
|
||||
+ ..radius
|
||||
+ },
|
||||
+ }
|
||||
+ });
|
||||
+
|
||||
+ match source.kind {
|
||||
+ LowerSliceSourceKind::Task(task_id) => {
|
||||
+ let task = &render_tasks[task_id];
|
||||
+ let texture = TextureSource::TextureCache(task.get_target_texture(), Swizzle::default());
|
||||
+ let uv_rect = task.get_target_rect().to_f32();
|
||||
+ let instance = CompositeInstance::new_rgb(
|
||||
+ rect,
|
||||
+ clip_rect,
|
||||
+ PremultipliedColorF::WHITE,
|
||||
+ TexelRect::new(uv_rect.min.x, uv_rect.min.y, uv_rect.max.x, uv_rect.max.y),
|
||||
+ false,
|
||||
+ (false, false),
|
||||
+ clip.as_ref(),
|
||||
+ );
|
||||
+ let texture_size = self.texture_resolver.get_texture_size(&texture).to_f32();
|
||||
+ draws.push((instance, texture, Some(texture_size)));
|
||||
+ }
|
||||
+ LowerSliceSourceKind::Color(color) => {
|
||||
+ let instance = CompositeInstance::new(
|
||||
+ rect,
|
||||
+ clip_rect,
|
||||
+ color.premultiplied(),
|
||||
+ (false, false),
|
||||
+ clip.as_ref(),
|
||||
+ );
|
||||
+ draws.push((instance, TextureSource::Dummy, None));
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ for (texture, src, dest) in src_copies {
|
||||
+ let dest = dest.to_f32();
|
||||
+ let src = src.to_f32();
|
||||
+ let instance = CompositeInstance::new_rgb(
|
||||
+ dest,
|
||||
+ dest,
|
||||
+ PremultipliedColorF::WHITE,
|
||||
+ TexelRect::new(src.min.x, src.min.y, src.max.x, src.max.y),
|
||||
+ false,
|
||||
+ (false, false),
|
||||
+ None,
|
||||
+ );
|
||||
+ let texture_size = self.texture_resolver.get_texture_size(texture).to_f32();
|
||||
+ draws.push((instance, *texture, Some(texture_size)));
|
||||
+ }
|
||||
+
|
||||
+ self.device.bind_draw_target(draw_target);
|
||||
+ self.device.disable_depth();
|
||||
+ self.device.disable_depth_write();
|
||||
+ self.set_blend(true, FramebufferKind::Other);
|
||||
+ self.set_blend_mode_premultiplied_alpha(FramebufferKind::Other);
|
||||
+
|
||||
+ for (instance, texture, texture_size) in draws {
|
||||
+ let features = instance.get_rgb_features();
|
||||
+
|
||||
+ self.shaders
|
||||
+ .borrow_mut()
|
||||
+ .get_composite_shader(
|
||||
+ CompositeSurfaceFormat::Rgba,
|
||||
+ texture.image_buffer_kind(),
|
||||
+ features,
|
||||
+ ).bind(
|
||||
+ &mut self.device,
|
||||
+ projection,
|
||||
+ texture_size,
|
||||
+ &mut self.renderer_errors,
|
||||
+ &mut self.profile,
|
||||
+ &mut self.command_log,
|
||||
+ );
|
||||
+
|
||||
+ self.draw_instanced_batch(
|
||||
+ &[instance],
|
||||
+ VertexArrayKind::Composite,
|
||||
+ &BatchTextures::composite_rgb(texture),
|
||||
+ stats,
|
||||
+ );
|
||||
+ }
|
||||
+
|
||||
+ self.set_blend(false, FramebufferKind::Other);
|
||||
+ }
|
||||
+
|
||||
// Composite tiles in a swapchain. When using LayerCompositor, we may
|
||||
// split the compositing in to multiple swapchains.
|
||||
fn composite_pass(
|
||||
diff --git a/gfx/wr/webrender/src/renderer/mod.rs b/gfx/wr/webrender/src/renderer/mod.rs
|
||||
index d177263..a45ec70 100644
|
||||
--- a/gfx/wr/webrender/src/renderer/mod.rs
|
||||
+++ b/gfx/wr/webrender/src/renderer/mod.rs
|
||||
@@ -2288,6 +2288,8 @@ impl Renderer {
|
||||
resolve_ops: &[ResolveOp],
|
||||
render_tasks: &RenderTaskGraph,
|
||||
draw_target: DrawTarget,
|
||||
+ projection: &default::Transform3D<f32>,
|
||||
+ stats: &mut RendererStats,
|
||||
) {
|
||||
if resolve_ops.is_empty() {
|
||||
return;
|
||||
@@ -2300,6 +2302,8 @@ impl Renderer {
|
||||
resolve_op,
|
||||
render_tasks,
|
||||
draw_target,
|
||||
+ projection,
|
||||
+ stats,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -2729,7 +2733,12 @@ impl Renderer {
|
||||
resolve_op: &ResolveOp,
|
||||
render_tasks: &RenderTaskGraph,
|
||||
draw_target: DrawTarget,
|
||||
+ projection: &default::Transform3D<f32>,
|
||||
+ stats: &mut RendererStats,
|
||||
) {
|
||||
+ let has_lower_slices = !resolve_op.lower_slice_sources.is_empty();
|
||||
+ let mut src_copies = Vec::new();
|
||||
+
|
||||
for src_task_id in &resolve_op.src_task_ids {
|
||||
let src_task = &render_tasks[*src_task_id];
|
||||
let src_info = match src_task.kind {
|
||||
@@ -2818,6 +2827,12 @@ impl Renderer {
|
||||
src_task.get_target_texture(),
|
||||
Swizzle::default(),
|
||||
);
|
||||
+
|
||||
+ if has_lower_slices {
|
||||
+ src_copies.push((texture_source, src, dest));
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
let (cache_texture, _) = self.texture_resolver
|
||||
.resolve(&texture_source).expect("bug: no source texture");
|
||||
|
||||
@@ -2836,6 +2851,17 @@ impl Renderer {
|
||||
);
|
||||
}
|
||||
}
|
||||
+
|
||||
+ if has_lower_slices {
|
||||
+ self.draw_resolve_with_lower_slices(
|
||||
+ resolve_op,
|
||||
+ render_tasks,
|
||||
+ draw_target,
|
||||
+ projection,
|
||||
+ &src_copies,
|
||||
+ stats,
|
||||
+ );
|
||||
+ }
|
||||
}
|
||||
|
||||
fn draw_picture_cache_target(
|
||||
@@ -3385,6 +3411,8 @@ impl Renderer {
|
||||
&target.resolve_ops,
|
||||
render_tasks,
|
||||
draw_target,
|
||||
+ &projection,
|
||||
+ stats,
|
||||
);
|
||||
|
||||
// Handle any blits from the texture cache to this target.
|
||||
diff --git a/gfx/wr/webrender/src/surface.rs b/gfx/wr/webrender/src/surface.rs
|
||||
index 20536bb..f8a8709 100644
|
||||
--- a/gfx/wr/webrender/src/surface.rs
|
||||
+++ b/gfx/wr/webrender/src/surface.rs
|
||||
@@ -14,7 +14,7 @@ use crate::picture_composite_mode::PictureCompositeMode;
|
||||
use crate::tile_cache::{TileKey, SubSliceIndex, MAX_COMPOSITOR_SURFACES};
|
||||
use crate::prim_store::PictureIndex;
|
||||
use crate::render_task_graph::{RenderTaskId, RenderTaskGraphBuilder};
|
||||
-use crate::render_target::ResolveOp;
|
||||
+use crate::render_target::{LowerSliceSource, LowerSliceSourceKind, ResolveOp};
|
||||
use crate::render_task::{RenderTask, RenderTaskKind, RenderTaskLocation};
|
||||
use crate::space::SpaceMapper;
|
||||
use crate::spatial_tree::{CoordinateSpaceMapping, SpatialTree, SpatialNodeIndex};
|
||||
@@ -380,6 +380,8 @@ pub struct SurfaceTileDescriptor {
|
||||
pub composite_task_id: Option<RenderTaskId>,
|
||||
/// Dirty rect for this tile
|
||||
pub dirty_rect: PictureRect,
|
||||
+ /// Set if this tile's content is read back by a backdrop-filter in a slice above.
|
||||
+ pub lower_slice_source: Option<LowerSliceSource>,
|
||||
}
|
||||
|
||||
// Details of how a surface is rendered
|
||||
@@ -387,6 +389,7 @@ pub enum SurfaceDescriptorKind {
|
||||
// Picture cache tiles
|
||||
Tiled {
|
||||
tiles: FastHashMap<TileKey, SurfaceTileDescriptor>,
|
||||
+ backdrop_reads_lower_slices: bool,
|
||||
},
|
||||
// A single surface (e.g. for an opacity filter)
|
||||
Simple {
|
||||
@@ -410,10 +413,12 @@ impl SurfaceDescriptor {
|
||||
// Create a picture cache tiled surface
|
||||
pub fn new_tiled(
|
||||
tiles: FastHashMap<TileKey, SurfaceTileDescriptor>,
|
||||
+ backdrop_reads_lower_slices: bool,
|
||||
) -> Self {
|
||||
SurfaceDescriptor {
|
||||
kind: SurfaceDescriptorKind::Tiled {
|
||||
tiles,
|
||||
+ backdrop_reads_lower_slices,
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -526,6 +531,9 @@ pub struct SurfaceBuilder {
|
||||
// A map of the output render tasks from any sub-graphs that haven't
|
||||
// been consumed by BackdropRender prims yet
|
||||
pub sub_graph_output_map: FastHashMap<PictureIndex, RenderTaskId>,
|
||||
+ // Content of the picture cache slices built so far that backdrop-filters in
|
||||
+ // slices above them read back, ordered bottom-up
|
||||
+ pub lower_slice_sources: Vec<LowerSliceSource>,
|
||||
}
|
||||
|
||||
impl SurfaceBuilder {
|
||||
@@ -534,6 +542,7 @@ impl SurfaceBuilder {
|
||||
current_cmd_buffers: CommandBufferTargets::new(),
|
||||
builder_stack: Vec::new(),
|
||||
sub_graph_output_map: FastHashMap::default(),
|
||||
+ lower_slice_sources: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -574,9 +583,10 @@ impl SurfaceBuilder {
|
||||
|
||||
let builder = if let Some(descriptor) = descriptor {
|
||||
match descriptor.kind {
|
||||
- SurfaceDescriptorKind::Tiled { tiles } => {
|
||||
+ SurfaceDescriptorKind::Tiled { tiles, backdrop_reads_lower_slices } => {
|
||||
CommandBufferBuilder::new_tiled(
|
||||
tiles,
|
||||
+ backdrop_reads_lower_slices,
|
||||
)
|
||||
}
|
||||
SurfaceDescriptorKind::Simple { render_task_id, dirty_rect, .. } => {
|
||||
@@ -700,6 +710,7 @@ impl SurfaceBuilder {
|
||||
// Get info about the resolve operation to copy from parent surface or tiles to the picture cache task
|
||||
if let Some(resolve_task_id) = builder.resolve_source {
|
||||
let mut src_task_ids = Vec::new();
|
||||
+ let reads_lower_slices = self.builder_stack.last().unwrap().backdrop_reads_lower_slices;
|
||||
|
||||
// Make the output of the sub-graph a dependency of the new replacement tile task
|
||||
let _old = self.sub_graph_output_map.insert(
|
||||
@@ -869,6 +880,27 @@ impl SurfaceBuilder {
|
||||
&src_task_ids,
|
||||
);
|
||||
|
||||
+ let mut lower_slice_sources = Vec::new();
|
||||
+ let mut dest_raster_to_root = ScaleOffset::identity();
|
||||
+
|
||||
+ if reads_lower_slices && !self.lower_slice_sources.is_empty() {
|
||||
+ let dest_raster = raster_spatial_node(rg_builder, resolve_task_id);
|
||||
+ let to_root = spatial_tree
|
||||
+ .get_relative_transform(dest_raster, spatial_tree.root_reference_frame_index())
|
||||
+ .as_2d_scale_offset();
|
||||
+
|
||||
+ if let Some(to_root) = to_root {
|
||||
+ dest_raster_to_root = to_root;
|
||||
+ lower_slice_sources = self.lower_slice_sources.clone();
|
||||
+
|
||||
+ for source in &lower_slice_sources {
|
||||
+ if let LowerSliceSourceKind::Task(task_id) = source.kind {
|
||||
+ rg_builder.add_dependency(resolve_task_id, task_id);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
let dest_task = rg_builder.get_task_mut(resolve_task_id);
|
||||
|
||||
match dest_task.kind {
|
||||
@@ -878,6 +910,8 @@ impl SurfaceBuilder {
|
||||
src_task_ids,
|
||||
dest_task_id: resolve_task_id,
|
||||
dest_to_src_raster,
|
||||
+ lower_slice_sources,
|
||||
+ dest_raster_to_root,
|
||||
})
|
||||
}
|
||||
_ => {
|
||||
@@ -917,7 +951,16 @@ impl SurfaceBuilder {
|
||||
} else {
|
||||
match builder.kind {
|
||||
CommandBufferBuilderKind::Tiled { ref tiles } => {
|
||||
+ let first_source = self.lower_slice_sources.len();
|
||||
+
|
||||
for (_, descriptor) in tiles {
|
||||
+ if let Some(ref source) = descriptor.lower_slice_source {
|
||||
+ self.lower_slice_sources.push(LowerSliceSource {
|
||||
+ kind: LowerSliceSourceKind::Task(descriptor.current_task_id),
|
||||
+ ..source.clone()
|
||||
+ });
|
||||
+ }
|
||||
+
|
||||
if let Some(composite_task_id) = descriptor.composite_task_id {
|
||||
rg_builder.add_dependency(
|
||||
composite_task_id,
|
||||
@@ -933,6 +976,8 @@ impl SurfaceBuilder {
|
||||
}
|
||||
}
|
||||
}
|
||||
+
|
||||
+ self.lower_slice_sources[first_source ..].sort_by_key(|source| source.sub_slice_index);
|
||||
}
|
||||
CommandBufferBuilderKind::Simple { render_task_id: child_task_id, root_task_id: child_root_task_id, .. } => {
|
||||
match self.builder_stack.last().unwrap().kind {
|
||||
diff --git a/gfx/wr/webrender/src/tile_cache/mod.rs b/gfx/wr/webrender/src/tile_cache/mod.rs
|
||||
index 731be26..d20e6ac 100644
|
||||
--- a/gfx/wr/webrender/src/tile_cache/mod.rs
|
||||
+++ b/gfx/wr/webrender/src/tile_cache/mod.rs
|
||||
@@ -198,6 +198,8 @@ pub struct TileCacheParams {
|
||||
// This is only a suggestion - the tile cache will clamp this as a reasonable number
|
||||
// and only promote a limited number of surfaces.
|
||||
pub yuv_image_surface_count: usize,
|
||||
+ // If true, backdrop-filters in this slice also read back content from the slices below it.
|
||||
+ pub backdrop_reads_lower_slices: bool,
|
||||
}
|
||||
|
||||
/// The backing surface for this tile.
|
||||
@@ -250,6 +252,8 @@ pub struct Tile {
|
||||
pub cached_surface: CachedSurface,
|
||||
/// Raster-space rect for this tile, cached to avoid recomputing per primitive.
|
||||
pub local_raster_rect: RasterRect,
|
||||
+ /// If true, this tile is read back this frame by a slice above.
|
||||
+ pub feeds_cross_slice_backdrop: bool,
|
||||
}
|
||||
|
||||
impl Tile {
|
||||
@@ -269,6 +273,7 @@ impl Tile {
|
||||
z_id: ZBufferId::invalid(),
|
||||
cached_surface: CachedSurface::new(),
|
||||
local_raster_rect: RasterRect::zero(),
|
||||
+ feeds_cross_slice_backdrop: false,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -828,6 +833,15 @@ pub struct TileCacheInstance {
|
||||
pub yuv_images_remaining: usize,
|
||||
/// Persistent cache for computing and storing raster-space primitive corners.
|
||||
corners_cache: CornersCache,
|
||||
+ /// If true, backdrop-filters in this slice also read back content from the slices below it.
|
||||
+ pub backdrop_reads_lower_slices: bool,
|
||||
+ /// The picture-space coverage rects of the backdrop-filters found in this slice this frame.
|
||||
+ backdrop_render_rects: Vec<PictureRect>,
|
||||
+ /// The picture to root transform of this slice in the previous frame, used to detect
|
||||
+ /// movement relative to backdrop-filters in slices above.
|
||||
+ prev_pic_to_root: Option<ScaleOffset>,
|
||||
+ /// If true, some tiles of this slice are read back by a backdrop-filter in a slice above.
|
||||
+ pub feeds_cross_slice_backdrop: bool,
|
||||
}
|
||||
|
||||
impl TileCacheInstance {
|
||||
@@ -893,6 +907,10 @@ impl TileCacheInstance {
|
||||
yuv_images_count: params.yuv_image_surface_count,
|
||||
yuv_images_remaining: 0,
|
||||
corners_cache: CornersCache::new(),
|
||||
+ backdrop_reads_lower_slices: params.backdrop_reads_lower_slices,
|
||||
+ backdrop_render_rects: Vec::new(),
|
||||
+ prev_pic_to_root: None,
|
||||
+ feeds_cross_slice_backdrop: false,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -970,6 +988,7 @@ impl TileCacheInstance {
|
||||
self.background_color = params.background_color;
|
||||
self.shared_clip_leaf_id = params.shared_clip_leaf_id;
|
||||
self.shared_clip_node_id = params.shared_clip_node_id;
|
||||
+ self.backdrop_reads_lower_slices = params.backdrop_reads_lower_slices;
|
||||
|
||||
// Since the slice flags may have changed, ensure we re-evaluate the
|
||||
// appropriate tile size for this cache next update.
|
||||
@@ -1040,6 +1059,7 @@ impl TileCacheInstance {
|
||||
self.local_rect = pic_rect;
|
||||
self.local_clip_rect = PictureRect::max_rect();
|
||||
self.deferred_dirty_tests.clear();
|
||||
+ self.backdrop_render_rects.clear();
|
||||
self.mix_blend_pic_rects.clear();
|
||||
self.underlays.clear();
|
||||
self.overlay_region = PictureRect::zero();
|
||||
@@ -2667,6 +2687,8 @@ impl TileCacheInstance {
|
||||
}
|
||||
}
|
||||
|
||||
+ self.backdrop_render_rects.push(pic_coverage_rect);
|
||||
+
|
||||
// For backdrop-filter, we need to check if any of the dirty rects
|
||||
// in tiles that are affected by the filter primitive are dirty.
|
||||
self.deferred_dirty_tests.push(DeferredDirtyTest {
|
||||
@@ -3264,6 +3286,159 @@ impl TileCacheInstance {
|
||||
}
|
||||
|
||||
|
||||
+fn slice_is_dirty_in_rect(tile_cache: &TileCacheInstance, rect: &PictureRect) -> bool {
|
||||
+ tile_cache.sub_slices.iter().any(|sub_slice| {
|
||||
+ sub_slice.tiles.values().any(|tile| {
|
||||
+ tile.is_visible &&
|
||||
+ !tile.cached_surface.is_valid &&
|
||||
+ tile.cached_surface.local_dirty_rect.intersects(rect)
|
||||
+ })
|
||||
+ })
|
||||
+}
|
||||
+
|
||||
+fn invalidate_slice_rect(
|
||||
+ tile_cache: &mut TileCacheInstance,
|
||||
+ rect: &PictureRect,
|
||||
+ supports_dirty_rects: bool,
|
||||
+ feeds_cross_slice_backdrop: bool,
|
||||
+) {
|
||||
+ let mut rects = vec![*rect];
|
||||
+
|
||||
+ rects.extend(
|
||||
+ tile_cache.backdrop_render_rects
|
||||
+ .iter()
|
||||
+ .filter(|backdrop_rect| backdrop_rect.intersects(rect))
|
||||
+ .cloned()
|
||||
+ );
|
||||
+
|
||||
+ for sub_slice in &mut tile_cache.sub_slices {
|
||||
+ for tile in sub_slice.tiles.values_mut() {
|
||||
+ if !tile.is_visible {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ for rect in &rects {
|
||||
+ if !tile.cached_surface.local_rect.intersects(rect) {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ tile.invalidate(Some(*rect), InvalidationReason::SurfaceContentChanged);
|
||||
+ if !supports_dirty_rects {
|
||||
+ tile.cached_surface.local_dirty_rect = tile.cached_surface.local_rect;
|
||||
+ }
|
||||
+ tile.feeds_cross_slice_backdrop |= feeds_cross_slice_backdrop;
|
||||
+ tile_cache.feeds_cross_slice_backdrop |= feeds_cross_slice_backdrop;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+pub fn update_cross_slice_backdrops(
|
||||
+ slice_ids: &[SliceId],
|
||||
+ tile_caches: &mut FastHashMap<SliceId, Box<TileCacheInstance>>,
|
||||
+ frame_context: &FrameVisibilityContext,
|
||||
+ compositor_kind: &CompositorKind,
|
||||
+) {
|
||||
+ let supports_dirty_rects = match compositor_kind {
|
||||
+ CompositorKind::Draw { .. } | CompositorKind::Layer { .. } => {
|
||||
+ frame_context.config.gpu_supports_render_target_partial_update
|
||||
+ }
|
||||
+ CompositorKind::Native { capabilities, .. } => {
|
||||
+ capabilities.max_update_rects > 0
|
||||
+ }
|
||||
+ };
|
||||
+
|
||||
+ let any_backdrop = slice_ids.iter().any(|slice_id| {
|
||||
+ let tile_cache = &tile_caches[slice_id];
|
||||
+ tile_cache.backdrop_reads_lower_slices && !tile_cache.backdrop_render_rects.is_empty()
|
||||
+ });
|
||||
+
|
||||
+ let mut pic_to_root = Vec::with_capacity(slice_ids.len());
|
||||
+ let mut moved = Vec::with_capacity(slice_ids.len());
|
||||
+
|
||||
+ for slice_id in slice_ids {
|
||||
+ let tile_cache = tile_caches.get_mut(slice_id).expect("bug: non-existent tile cache");
|
||||
+
|
||||
+ if tile_cache.feeds_cross_slice_backdrop {
|
||||
+ tile_cache.feeds_cross_slice_backdrop = false;
|
||||
+ for sub_slice in &mut tile_cache.sub_slices {
|
||||
+ for tile in sub_slice.tiles.values_mut() {
|
||||
+ tile.feeds_cross_slice_backdrop = false;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if !any_backdrop {
|
||||
+ tile_cache.prev_pic_to_root = None;
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ let transform = frame_context.spatial_tree
|
||||
+ .get_relative_transform(tile_cache.spatial_node_index, frame_context.root_spatial_node_index)
|
||||
+ .as_2d_scale_offset();
|
||||
+
|
||||
+ moved.push(transform != tile_cache.prev_pic_to_root);
|
||||
+ tile_cache.prev_pic_to_root = transform;
|
||||
+ pic_to_root.push(transform);
|
||||
+ }
|
||||
+
|
||||
+ if !any_backdrop {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ for top in 1 .. slice_ids.len() {
|
||||
+ let top_transform = match pic_to_root[top] {
|
||||
+ Some(transform) => transform,
|
||||
+ None => continue,
|
||||
+ };
|
||||
+
|
||||
+ let backdrop_rects = {
|
||||
+ let tile_cache = &tile_caches[&slice_ids[top]];
|
||||
+ if !tile_cache.backdrop_reads_lower_slices {
|
||||
+ continue;
|
||||
+ }
|
||||
+ tile_cache.backdrop_render_rects.clone()
|
||||
+ };
|
||||
+
|
||||
+ for backdrop_rect in backdrop_rects {
|
||||
+ let root_rect: LayoutRect = top_transform.map_rect(&backdrop_rect);
|
||||
+
|
||||
+ let lower_rects: Vec<(usize, PictureRect)> = (0 .. top)
|
||||
+ .filter_map(|lower| {
|
||||
+ let rect: PictureRect = pic_to_root[lower]?.unmap_rect(&root_rect);
|
||||
+ Some((lower, rect))
|
||||
+ })
|
||||
+ .collect();
|
||||
+
|
||||
+ let needs_update = moved[top] ||
|
||||
+ slice_is_dirty_in_rect(&tile_caches[&slice_ids[top]], &backdrop_rect) ||
|
||||
+ lower_rects.iter().any(|(lower, rect)| {
|
||||
+ moved[*lower] || slice_is_dirty_in_rect(&tile_caches[&slice_ids[*lower]], rect)
|
||||
+ });
|
||||
+
|
||||
+ if !needs_update {
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ invalidate_slice_rect(
|
||||
+ tile_caches.get_mut(&slice_ids[top]).unwrap(),
|
||||
+ &backdrop_rect,
|
||||
+ supports_dirty_rects,
|
||||
+ false,
|
||||
+ );
|
||||
+
|
||||
+ for (lower, rect) in lower_rects {
|
||||
+ invalidate_slice_rect(
|
||||
+ tile_caches.get_mut(&slice_ids[lower]).unwrap(),
|
||||
+ &rect,
|
||||
+ supports_dirty_rects,
|
||||
+ true,
|
||||
+ );
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
/// A SubSlice represents a potentially overlapping set of tiles within a picture cache. Most
|
||||
/// picture cache instances will have only a single sub-slice. The exception to this is when
|
||||
/// a picture cache has compositor surfaces, in which case sub slices are used to interleave
|
||||
diff --git a/gfx/wr/webrender/src/tile_cache/slice_builder.rs b/gfx/wr/webrender/src/tile_cache/slice_builder.rs
|
||||
index f81edc9..d8759bc 100644
|
||||
--- a/gfx/wr/webrender/src/tile_cache/slice_builder.rs
|
||||
+++ b/gfx/wr/webrender/src/tile_cache/slice_builder.rs
|
||||
@@ -688,6 +688,7 @@ fn create_tile_cache(
|
||||
virtual_surface_size: frame_builder_config.compositor_kind.get_virtual_surface_size(),
|
||||
image_surface_count: prim_list.image_surface_count,
|
||||
yuv_image_surface_count: prim_list.yuv_image_surface_count,
|
||||
+ backdrop_reads_lower_slices: iframe_clip.is_none() && slice > 0,
|
||||
});
|
||||
|
||||
let pic_index = prim_store.pictures.alloc().init(PictureInstance::new_image(
|
||||
162
src/external-patches/firefox/issue_14710.patch
Normal file
162
src/external-patches/firefox/issue_14710.patch
Normal 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);
|
||||
+});
|
||||
|
||||
131
src/external-patches/firefox/issue_15123.patch
Normal file
131
src/external-patches/firefox/issue_15123.patch
Normal 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"]
|
||||
|
||||
@@ -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;
|
||||
|
||||
32
src/external-patches/firefox/override_cert_checks_temp.patch
Normal file
32
src/external-patches/firefox/override_cert_checks_temp.patch
Normal 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
|
||||
}
|
||||
@@ -9,17 +9,13 @@
|
||||
},
|
||||
{
|
||||
"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",
|
||||
// TODO: Convert into https://phabricator.services.mozilla.com/D298079
|
||||
// once it gets accepted.
|
||||
"path": "firefox/allow_backdrop_to_work_on_transparency.patch"
|
||||
"type": "phabricator",
|
||||
"id": "D327914",
|
||||
"name": "Backdrop filter reads web content"
|
||||
},
|
||||
{
|
||||
"type": "local",
|
||||
@@ -48,5 +44,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"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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 {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user