Compare commits

..
56 Commits
Author SHA1 Message Date
mr. m 4c92731b2d gh-15512: Sync upstream Firefox to version 156.0.1 (gh-15515) 2026-09-22 15:45:14 +02:00
mr. m be04ad6d50 gh-15513: URL bar and sidebar should have transparency when available (gh-15514) 2026-09-22 14:08:20 +02:00
fen4flo f0f21cdade gh-15438: Fix library compact mode offset (gh-15504) 2026-09-21 20:00:10 +02:00
fen4flo e68b5e5c26 gh-15438: Fix library compact mode animation (gh-15502) 2026-09-21 16:52:29 +02:00
mr. m 7545e5a870 gh-15460: Fixed folder expansion expanding real folders on library (gh-15498) 2026-09-21 16:51:05 +02:00
mr. m b3467c0ff2 gh-15494: Fixed library media tab freezing (gh-15495) 2026-09-21 01:43:48 +02:00
fen4floandmr. m 303b6e39ed gh-15438: Performance optimizations and media tab for Library (gh-15483)
Co-authored-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>
Signed-off-by: fen4flo <75260616+FlorianButz@users.noreply.github.com>
2026-09-20 22:08:51 +02:00
mr. m 7debd15013 gh-15489: Fixed closing a window not swiping browser views (gh-15490) 2026-09-20 11:55:02 +02:00
mr. m 450aeeccd3 gh-15380: Fixed not identifying applied stamps correctly (gh-15485) 2026-09-19 20:42:51 +02:00
mr. m 8645a5b9c8 gh-15462: Fixed broken folder animations for library (gh-15467) 2026-09-18 16:40:31 +02:00
mr. m 031b5d8d0a gh-15426: Fixed spaces wiping if zen is opened on other devices (gh-15458) 2026-09-18 16:27:05 +02:00
mr. m 2804ba8350 gh-15445: Fixed visibility checks for popup notifications (gh-15455) 2026-09-18 09:29:37 +02:00
Batan Alex 5e5926e708 gh-15374: Remove squircle multiplier from thumbnail's border radius (gh-15452) 2026-09-18 08:30:49 +02:00
mr. m a65f96c3b8 gh-15448: Fixed various library issues (gh-15451) 2026-09-18 00:40:09 +02:00
mr. m 4b4a659c7b gh-15437: Fixed command actions on the urlbar not working (gh-15449) 2026-09-18 00:37:43 +02:00
Batan Alex 5ff06e4274 gh-15374: Fix incorrect tab preview thumbnail border radius (gh-15444)
Signed-off-by: Batan Alex <batan_alex@icloud.com>
2026-09-17 23:19:57 +02:00
Andrey Bochkarev f31f99e507 gh-15293: Fix tab index calculation for CWLO (gh-15446) 2026-09-17 21:41:37 +02:00
fen4floandmr. m 2ee1275f28 gh-15438: Implementing Zen Library (gh-15282)
Co-authored-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>
Signed-off-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>
2026-09-17 15:03:20 +02:00
Andrey Bochkarev 45b9cfe37f gh-15419: Fix overflow-extension order in single toolbar mode (gh-15420) 2026-09-17 14:54:22 +02:00
mr. m f800d550cb gh-15422: Fixed broken folder animations (gh-15436) 2026-09-17 14:53:29 +02:00
mr. m 04e7db5d3a gh-15384: Sync upstream Firefox to version 156.0 (gh-15409) 2026-09-15 23:06:35 +02:00
mr. m 644bf48b6c gh-13196: Fixed sidebar not hiding if the urlbar is open (gh-15403) 2026-09-14 20:56:36 +02:00
Kyle Montag d2acc61a88 gh-15402: Add archived:false to github live folder queries (gh-14854)
Signed-off-by: Kyle Montag <KMontag42@users.noreply.github.com>
2026-09-14 19:52:56 +02:00
mr. m f84278317f gh-15400: Fixed duplicate paste and go items (gh-15401) 2026-09-14 15:03:58 +02:00
Alain Stulzandmr. m 4980f3ce18 gh-10577: Add various requested url bar actions (gh-15376)
Co-authored-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>
Signed-off-by: Alain Stulz <ast3150@gmail.com>
2026-09-14 09:42:23 +02:00
Patrick Wozniakandmr. m 5362ddbccd gh-14171: Fix cross-space routing tab lifecycle races (gh-14832)
Co-authored-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>
2026-09-14 09:27:31 +02:00
mr. m 6c32eaad68 gh-15384: Fix windows builds for Firefox 156.0 (gh-15399) 2026-09-14 02:33:15 +02:00
mr. m 610e7bfbae gh-15384: Sync upstream Firefox to version 156.0 (gh-15385) 2026-09-14 01:33:43 +02:00
doruk b43785de65 gh-15387: Fix #writeToDom crash when mod has checkbox preferences (gh-15388) 2026-09-14 01:33:21 +02:00
Ashvin Jangid 787f9c5e02 gh-15393: Remove corner-shape from loading-progress-bar and statuspanel (gh-15394) 2026-09-13 13:19:49 +02:00
doruk 22961e97d8 gh-15363: Fix boost font shuffle off-by-one index (gh-15365) 2026-09-11 14:35:24 +02:00
mr. m cb6a607c67 gh-15362: Prevent window captions appearing as squircles (gh-15364) 2026-09-11 14:25:26 +02:00
mr. m 267c9aabe1 gh-15353: Prevent popups from being too rounded on linux (gh-15354) 2026-09-11 09:37:47 +02:00
doruk d54e12359c gh-15355: Fix folder unload TypeError by using String.includes (gh-15347) 2026-09-11 09:37:37 +02:00
mr. m c89645a787 gh-15344: Fixed restoring tabs with static icons being cleared (gh-15345) 2026-09-11 01:23:58 +02:00
mr. m 0a548c7572 gh-15329: Prevent split view preview from opening for multiple tabs (gh-15340) 2026-09-10 22:20:12 +02:00
mr. m 6d158223b5 gh-15123: Fixed not spawining any native messaging host (gh-15328) 2026-09-10 10:47:35 +02:00
mr. m 76fcd5c822 gh-15026: Revert "Improve scrolling performance" (gh-15327) 2026-09-10 10:32:48 +02:00
Brandon Quon ed6900d762 gh-14938: Fix CWLO for only pinned/essential tabs (gh-15324) 2026-09-10 10:27:53 +02:00
mr. m 2e9aecd41b gh-6302: Remove corner shape for browser stack rendering (gh-15318) 2026-09-09 19:35:46 +02:00
mr. m da995e8653 gh-15313: Make sure to bootstrap before doing release builds (gh-15314) 2026-09-09 13:15:17 +02:00
mr. m 64d73ab3e3 gh-14956: Check if the closing tab exists on the tab list before switching (gh-15312) 2026-09-09 13:13:40 +02:00
Brandon Quonandmr. m 9551444c61 gh-15260: Fix essentials appearing during workspace creation (gh-15307)
Co-authored-by: mr. m <mr.m@tuta.com>
2026-09-09 08:34:59 +02:00
mr. m fdf9588b7b gh-15026: Improve scrolling performance (gh-15306) 2026-09-09 02:13:38 +02:00
mr. m b07b17c87e gh-15304: Revert urlbar when searching with an alias (gh-15305) 2026-09-09 01:39:13 +02:00
mr. m c9d3cb3dc9 gh-15297: Fixed synced tabs losing their icon when they are unloaded (gh-15298) 2026-09-08 20:14:23 +02:00
KiKaraage 2c030369c5 gh-15288: add missing margin for space selector in BMPanel (gh-15286)
Signed-off-by: KiKaraage <kikaraage@tuta.io>
2026-09-08 18:48:07 +02:00
Brandon Quon 88a90206ce gh-14755: fix duplicated owned tabs leaving folders (gh-15285) 2026-09-08 18:24:10 +02:00
Andrey Bochkarev 6d398dec63 gh-15295: Correct tab index calculation for CWLO (gh-15293) 2026-09-08 18:22:23 +02:00
mr. m 243a8791a0 gh-15279: Wait for all windows to be restored before syncing (gh-15294) 2026-09-08 18:13:33 +02:00
Brandon Quon 412731f37e gh-15155: Fix tab moving to bottom of tab list (gh-15246) 2026-09-07 22:54:02 +02:00
mr. m 7a78848177 gh-15266: Add support for sharing spaces, folders and split views (gh-15283) 2026-09-07 22:28:09 +02:00
mr. m a323036995 gh-15266: Add support for sharing spaces, folders and split views (gh-15267) 2026-09-07 01:11:02 +02:00
Harsh Varshney abc69a1fcb gh-15188: Fixed invisible download progress bar in Library when unselected (gh-15251)
Signed-off-by: Harsh Varshney <92783708+Iron0utlaw@users.noreply.github.com>
2026-09-06 17:52:30 +02:00
mr. m 8df45e5c9a gh-15247: Add support for cross-device normal tabs (gh-15250) 2026-09-06 02:42:59 +02:00
mr. m 58e83c137f gh-15244: Fixed creatin a new space not selecting the empty tab (gh-15245) 2026-09-05 20:25:24 +02:00
263 changed files with 17019 additions and 4899 deletions
@@ -23,7 +23,6 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
arch: [x86_64, aarch64] arch: [x86_64, aarch64]
runs-on: ${{ matrix.arch == 'x86_64' && 'macos-15-intel' || 'macos-26' }} runs-on: ${{ matrix.arch == 'x86_64' && 'macos-15-intel' || 'macos-26' }}
steps: steps:
@@ -27,7 +27,6 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
arch: [x86_64, aarch64] arch: [x86_64, aarch64]
runs-on: ${{ inputs.release-branch == 'release' && 'windows-latest' || 'windows-latest' }} runs-on: ${{ inputs.release-branch == 'release' && 'windows-latest' || 'windows-latest' }}
steps: steps:
+1 -1
View File
@@ -1 +1 @@
1.94.1 1.95.0
+2 -2
View File
@@ -34,8 +34,8 @@ Zen is a firefox-based browser with the aim of pushing your productivity to a ne
### Firefox Versions ### Firefox Versions
- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `155.0.1`! - [`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 155.0.1`! - [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 156.0.1`!
### Contributing ### Contributing
+1 -1
View File
@@ -1 +1 @@
b6d45eac914fd4886c9b6e5f1447f613771228ff 782b15a7c771795a323e9403340c029e7c8d7629
+2 -2
View File
@@ -147,9 +147,9 @@ function SignAndPackage($name) {
$env:ZEN_SETUP_EXE_PATH="$PWD\windsign-temp\windows-x64-obj-$name\browser\installer\windows\instgen\setup.exe" $env:ZEN_SETUP_EXE_PATH="$PWD\windsign-temp\windows-x64-obj-$name\browser\installer\windows\instgen\setup.exe"
if ($name -eq "arm64") { 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 { } 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" $env:MAR="..\\build\\windows\\mar.exe"
+9 -11
View File
@@ -53,7 +53,10 @@ fi
if test "$ZEN_RELEASE"; then if test "$ZEN_RELEASE"; then
ac_add_options --enable-clang-plugin 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 ac_add_options --enable-optimize
@@ -69,16 +72,11 @@ if test "$ZEN_RELEASE"; then
ac_add_options --disable-geckodriver ac_add_options --disable-geckodriver
ac_add_options --disable-rust-tests ac_add_options --disable-rust-tests
if ! test "$ZEN_DISABLE_LTO"; then if test "$ZEN_DISABLE_LTO"; then
# only enable full LTO when ZEN_RELEASE_BRANCH is 'release' ac_add_options --disable-lto
if test "$ZEN_RELEASE_BRANCH" = "release"; then else
# TODO: make it "full" once we have the resources to build it export MOZ_LTO=cross,thin
export MOZ_LTO=cross,full ac_add_options --enable-lto=cross,thin
ac_add_options --enable-lto=cross,full
else
export MOZ_LTO=cross,thin
ac_add_options --enable-lto=cross,thin
fi
fi fi
mk_add_options MOZILLA_OFFICIAL=1 mk_add_options MOZILLA_OFFICIAL=1
+3
View File
@@ -9,6 +9,9 @@ if test "$ZEN_RELEASE"; then
# Enable Profile Guided Optimization # Enable Profile Guided Optimization
if ! test "$ZEN_GA_DISABLE_PGO"; then 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 if test "$ZEN_GA_GENERATE_PROFILE"; then
mk_add_options "export MOZ_AUTOMATION_PACKAGE_GENERATED_SOURCES=0" mk_add_options "export MOZ_AUTOMATION_PACKAGE_GENERATED_SOURCES=0"
ac_add_options --enable-profile-generate=cross ac_add_options --enable-profile-generate=cross
+5 -2
View File
@@ -15,9 +15,9 @@ if test "$ZEN_CROSS_COMPILING"; then
CROSS_COMPILE=1 CROSS_COMPILE=1
if test "$SURFER_COMPAT" = "aarch64"; then 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 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
fi fi
@@ -45,6 +45,9 @@ if test "$ZEN_CROSS_COMPILING"; then
ac_add_options --enable-profile-use=cross ac_add_options --enable-profile-use=cross
ac_add_options --with-pgo-profile-path=$(echo ~)/artifact/merged.profdata ac_add_options --with-pgo-profile-path=$(echo ~)/artifact/merged.profdata
ac_add_options --with-pgo-jarlog=$(echo ~)/artifact/en-US.log 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 fi
fi fi
+2
View File
@@ -26,3 +26,5 @@ files:
translation: browser/browser/zen-space-routing.ftl translation: browser/browser/zen-space-routing.ftl
- source: en-US/browser/browser/zen-command-palette.ftl - source: en-US/browser/browser/zen-command-palette.ftl
translation: 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
@@ -68,6 +68,10 @@ zen-settings-workspaces-sync =
.label = Sync your sidebar across devices .label = Sync your sidebar across devices
.description = Keep your workspaces, pinned tabs and folders in sync on all your devices through your Mozilla account. .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 = zen-settings-workspaces-sync-unpinned-tabs =
.label = Sync only pinned tabs in workspaces .label = Sync only pinned tabs in workspaces
@@ -5,6 +5,8 @@
zen-action-toggle-compact-mode = Toggle Compact Mode zen-action-toggle-compact-mode = Toggle Compact Mode
zen-action-open-theme-picker = Open Theme Picker zen-action-open-theme-picker = Open Theme Picker
zen-action-new-split-view = New Split View 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-new-folder = New Folder
zen-action-copy-current-url = Copy Current URL zen-action-copy-current-url = Copy Current URL
zen-action-settings = Settings zen-action-settings = Settings
@@ -18,6 +20,9 @@ zen-action-new-boost = New Boost
zen-action-next-space = Next Space zen-action-next-space = Next Space
zen-action-previous-space = Previous Space zen-action-previous-space = Previous Space
zen-action-close-tab = Close Tab 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 = Reload Tab
zen-action-reload-tab-without-cache = Reload Tab Without Cache zen-action-reload-tab-without-cache = Reload Tab Without Cache
zen-action-next-tab = Next Tab 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-print = Print
zen-action-focus-on = Focus on zen-action-focus-on = Focus on
zen-action-extension = Extension zen-action-extension = Extension
zen-action-open = Open
@@ -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
@@ -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
@@ -24,6 +24,11 @@ zen-welcome-default-search-description = Choose your default search engine. You
zen-welcome-essentials-title = Choose the apps you use most. 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-essentials-description = Select your favorite apps to keep them handy in your sidebar.
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-title = Your space, your colors.
zen-welcome-workspace-colors-description = Personalize your browser by giving each space its own unique color identity. zen-welcome-workspace-colors-description = Personalize your browser by giving each space its own unique color identity.
+15
View 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"
+14 -1
View File
@@ -2,5 +2,18 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this # 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/. # 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 value: true
- name: zen.share.dont-ask-before-sharing
value: false
+6
View File
@@ -8,3 +8,9 @@
- name: zen.spaces-sync.debug - name: zen.spaces-sync.debug
value: false value: false
- name: zen.spaces-sync.normal-tabs
value: false
- name: services.sync.prefs.sync.zen.spaces-sync.normal-tabs
value: true
+1
View File
@@ -20,6 +20,7 @@
- name: zen.theme.acrylic-elements - name: zen.theme.acrylic-elements
value: "@IS_TWILIGHT@" value: "@IS_TWILIGHT@"
- name: zen.theme.disable-lightweight - name: zen.theme.disable-lightweight
value: true value: true
+3 -2
View File
@@ -1,8 +1,8 @@
diff --git a/.stylelintignore b/.stylelintignore diff --git a/.stylelintignore b/.stylelintignore
index 185490999507b8a5032977237af50f5e61c71df1..77c1635d90c6480af4ebd3c6e3ec49780eaca571 100644 index 185490999507b8a5032977237af50f5e61c71df1..4b1b1dc76d316f38f60c90e6cbd74d9569800d04 100644
--- a/.stylelintignore --- a/.stylelintignore
+++ b/.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: # under our control or we don't want to modify at this point:
testing/web-platform/mozilla/ testing/web-platform/mozilla/
testing/web-platform/tests/ testing/web-platform/tests/
@@ -20,5 +20,6 @@ index 185490999507b8a5032977237af50f5e61c71df1..77c1635d90c6480af4ebd3c6e3ec4978
+zen/split-view/zen-split-view.css +zen/split-view/zen-split-view.css
+zen/spaces/zen-workspaces.css +zen/spaces/zen-workspaces.css
+zen/common/styles/zen-toolbar.css +zen/common/styles/zen-toolbar.css
+zen/common/styles/zen-single-components.css
+ +
+*.inc +*.inc
@@ -1,5 +1,5 @@
diff --git a/browser/base/content/navigator-toolbox.inc.xhtml b/browser/base/content/navigator-toolbox.inc.xhtml diff --git a/browser/base/content/navigator-toolbox.inc.xhtml b/browser/base/content/navigator-toolbox.inc.xhtml
index dd2f391096968564086911c532f696dc7ffb8ae1..c968e5f0ebb5f0151fb124bafe10d8d5361e060f 100644 index a76bb7aae7636c07989a4acb35281777d3103505..d35aa0457307e95ad00464861fcee2827325193e 100644
--- a/browser/base/content/navigator-toolbox.inc.xhtml --- a/browser/base/content/navigator-toolbox.inc.xhtml
+++ b/browser/base/content/navigator-toolbox.inc.xhtml +++ b/browser/base/content/navigator-toolbox.inc.xhtml
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
@@ -26,7 +26,7 @@ index dd2f391096968564086911c532f696dc7ffb8ae1..c968e5f0ebb5f0151fb124bafe10d8d5
<toolbar id="TabsToolbar" <toolbar id="TabsToolbar"
class="browser-toolbar browser-titlebar" class="browser-toolbar browser-titlebar"
fullscreentoolbar="true" fullscreentoolbar="true"
@@ -54,6 +58,8 @@ @@ -56,6 +60,8 @@
<html:sidebar-pins-promo id="drag-to-pin-promo-card"></html:sidebar-pins-promo> <html:sidebar-pins-promo id="drag-to-pin-promo-card"></html:sidebar-pins-promo>
<arrowscrollbox id="pinned-tabs-container" orient="horizontal" clicktoscroll=""></arrowscrollbox> <arrowscrollbox id="pinned-tabs-container" orient="horizontal" clicktoscroll=""></arrowscrollbox>
<splitter orient="vertical" id="vertical-pinned-tabs-splitter" resizebefore="sibling" resizeafter="none" hidden="true"/> <splitter orient="vertical" id="vertical-pinned-tabs-splitter" resizebefore="sibling" resizeafter="none" hidden="true"/>
@@ -35,7 +35,7 @@ index dd2f391096968564086911c532f696dc7ffb8ae1..c968e5f0ebb5f0151fb124bafe10d8d5
<hbox class="tab-drop-indicator" hidden="true"/> <hbox class="tab-drop-indicator" hidden="true"/>
<arrowscrollbox id="tabbrowser-arrowscrollbox" orient="horizontal" flex="1" clicktoscroll="" scrolledtostart="" scrolledtoend=""> <arrowscrollbox id="tabbrowser-arrowscrollbox" orient="horizontal" flex="1" clicktoscroll="" scrolledtostart="" scrolledtoend="">
<tab is="tabbrowser-tab" class="tabbrowser-tab" selected="" visuallyselected="" fadein=""/> <tab is="tabbrowser-tab" class="tabbrowser-tab" selected="" visuallyselected="" fadein=""/>
@@ -73,6 +79,7 @@ @@ -75,6 +81,7 @@
tooltip="dynamic-shortcut-tooltip" tooltip="dynamic-shortcut-tooltip"
data-l10n-id="tabs-toolbar-new-tab"/> data-l10n-id="tabs-toolbar-new-tab"/>
<html:span id="tabbrowser-tab-a11y-desc" hidden="true"/> <html:span id="tabbrowser-tab-a11y-desc" hidden="true"/>
@@ -43,7 +43,7 @@ index dd2f391096968564086911c532f696dc7ffb8ae1..c968e5f0ebb5f0151fb124bafe10d8d5
</tabs> </tabs>
<toolbarbutton id="new-tab-button" <toolbarbutton id="new-tab-button"
@@ -99,9 +106,10 @@ @@ -102,9 +109,10 @@
<toolbarbutton class="content-analysis-indicator toolbarbutton-1 content-analysis-indicator-icon"/> <toolbarbutton class="content-analysis-indicator toolbarbutton-1 content-analysis-indicator-icon"/>
@@ -54,4 +54,12 @@ index dd2f391096968564086911c532f696dc7ffb8ae1..c968e5f0ebb5f0151fb124bafe10d8d5
+</hbox> +</hbox>
<toolbar id="nav-bar" <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/boosts/jar.inc.mn
#include ../../../zen/live-folders/jar.inc.mn #include ../../../zen/live-folders/jar.inc.mn
#include ../../../zen/space-routing/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_zenSplitViewUnsplit" />
<command id="cmd_zenSplitViewLinkInNewTab" /> <command id="cmd_zenSplitViewLinkInNewTab" />
<command id="cmd_zenSplitViewContextMenu" /> <command id="cmd_zenSplitViewContextMenu" />
<command id="cmd_zenCtxShareSplitView" />
<command id="cmd_zenNewEmptySplit" /> <command id="cmd_zenNewEmptySplit" />
<!-- Workspace commands --> <!-- Workspace commands -->
@@ -40,6 +41,7 @@
<command id="cmd_contextZenRemoveFromEssentials" /> <command id="cmd_contextZenRemoveFromEssentials" />
<command id="cmd_zenCtxDeleteWorkspace" /> <command id="cmd_zenCtxDeleteWorkspace" />
<command id="cmd_zenCtxShareWorkspace" />
<command id="cmd_zenUnloadWorkspace" /> <command id="cmd_zenUnloadWorkspace" />
<command id="cmd_zenUnloadAllOtherWorkspace" /> <command id="cmd_zenUnloadAllOtherWorkspace" />
<command id="cmd_zenOpenSpaceRoutingSettings" /> <command id="cmd_zenOpenSpaceRoutingSettings" />
@@ -70,4 +72,6 @@
<command id="cmd_zenNewLiveFolder" /> <command id="cmd_zenNewLiveFolder" />
<command id="cmd_zenDuplicateTab" /> <command id="cmd_zenDuplicateTab" />
<command id="cmd_zenToggleLibrary" />
</commandset> </commandset>
@@ -12,4 +12,6 @@
<link rel="localization" href="browser/zen-boosts.ftl"/> <link rel="localization" href="browser/zen-boosts.ftl"/>
<link rel="localization" href="browser/zen-live-folders.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-space-routing.ftl"/>
<link rel="localization" href="browser/zen-share.ftl"/>
<link rel="localization" href="browser/zen-library.ftl"/>
</linkset> </linkset>
@@ -32,6 +32,7 @@
<menuitem id="context_zenUnloadAllOtherWorkspace" data-l10n-id="zen-workspaces-panel-unload-others" command="cmd_zenUnloadAllOtherWorkspace"/> <menuitem id="context_zenUnloadAllOtherWorkspace" data-l10n-id="zen-workspaces-panel-unload-others" command="cmd_zenUnloadAllOtherWorkspace"/>
<menuseparator/> <menuseparator/>
<menuitem data-l10n-id="zen-panel-ui-workspaces-create" command="cmd_zenOpenWorkspaceCreation"/> <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"/> <menuitem id="context_zenDeleteWorkspace" data-l10n-id="zen-workspaces-panel-context-delete" command="cmd_zenCtxDeleteWorkspace"/>
<menuseparator/> <menuseparator/>
<menuitem id="context_zenSpaceRoutingSettings" data-l10n-id="zen-space-routing-settings" command="cmd_zenOpenSpaceRoutingSettings"/> <menuitem id="context_zenSpaceRoutingSettings" data-l10n-id="zen-space-routing-settings" command="cmd_zenOpenSpaceRoutingSettings"/>
@@ -55,6 +56,7 @@
<menupopup /> <menupopup />
</menu> </menu>
<menuitem id="context_zenFolderToSpace" data-l10n-id="zen-folders-panel-convert-folder-to-space" /> <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 /> <menuseparator />
<menuitem id="context_zenFolderUnpack" data-l10n-id="zen-folders-panel-unpack-folder"/> <menuitem id="context_zenFolderUnpack" data-l10n-id="zen-folders-panel-unpack-folder"/>
<menuitem id="context_zenFolderDelete" data-l10n-id="zen-folders-panel-delete-folder"/> <menuitem id="context_zenFolderDelete" data-l10n-id="zen-folders-panel-delete-folder"/>
@@ -1,5 +1,5 @@
diff --git a/browser/components/customizableui/CustomizableUI.sys.mjs b/browser/components/customizableui/CustomizableUI.sys.mjs diff --git a/browser/components/customizableui/CustomizableUI.sys.mjs b/browser/components/customizableui/CustomizableUI.sys.mjs
index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa13303d3a3 100644 index 875f8b03d979353ef44a57c15ef1ae09d33ab730..3d6e092e7ed126cdee8c32229df2cfa13303d3a3 100644
--- a/browser/components/customizableui/CustomizableUI.sys.mjs --- a/browser/components/customizableui/CustomizableUI.sys.mjs
+++ b/browser/components/customizableui/CustomizableUI.sys.mjs +++ b/browser/components/customizableui/CustomizableUI.sys.mjs
@@ -13,6 +13,7 @@ ChromeUtils.defineESModuleGetters(lazy, { @@ -13,6 +13,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
@@ -19,7 +19,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
}, },
false false
); );
@@ -362,27 +363,23 @@ var CustomizableUIInternal = { @@ -362,20 +363,15 @@ var CustomizableUIInternal = {
"back-button", "back-button",
"forward-button", "forward-button",
"stop-reload-button", "stop-reload-button",
@@ -41,27 +41,29 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
this.registerArea( this.registerArea(
CustomizableUI.AREA_NAVBAR, CustomizableUI.AREA_NAVBAR,
{ {
type: CustomizableUI.TYPE_TOOLBAR, @@ -383,9 +379,6 @@ var CustomizableUIInternal = {
overflowable: true, overflowable: true,
defaultPlacements: navbarPlacements, defaultPlacements: navbarPlacements,
- verticalTabsDefaultPlacements: ["alltabs-button", "ai-window-toggle"], verticalTabsDefaultPlacements: [
+ verticalTabsDefaultPlacements: [ - "alltabs-button",
+ ], - "smartwindow-group-tabs-button",
- "ai-window-toggle",
],
defaultCollapsed: false, defaultCollapsed: false,
}, },
true @@ -410,11 +403,6 @@ var CustomizableUIInternal = {
@@ -406,10 +403,6 @@ var CustomizableUIInternal = {
type: CustomizableUI.TYPE_TOOLBAR, type: CustomizableUI.TYPE_TOOLBAR,
defaultPlacements: [ defaultPlacements: [
"tabbrowser-tabs", "tabbrowser-tabs",
- "new-tab-button", - "new-tab-button",
- "spring", - "spring",
- "alltabs-button", - "alltabs-button",
- "smartwindow-group-tabs-button",
- "ai-window-toggle", - "ai-window-toggle",
], ],
verticalTabsDefaultPlacements: [], verticalTabsDefaultPlacements: [],
defaultCollapsed: null, defaultCollapsed: null,
@@ -502,6 +495,7 @@ var CustomizableUIInternal = { @@ -507,6 +495,7 @@ var CustomizableUIInternal = {
CustomizableUI.AREA_NAVBAR, CustomizableUI.AREA_NAVBAR,
CustomizableUI.AREA_BOOKMARKS, CustomizableUI.AREA_BOOKMARKS,
CustomizableUI.AREA_TABSTRIP, CustomizableUI.AREA_TABSTRIP,
@@ -69,7 +71,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
]); ]);
if (AppConstants.platform != "macosx") { if (AppConstants.platform != "macosx") {
toolbars.add(CustomizableUI.AREA_MENUBAR); toolbars.add(CustomizableUI.AREA_MENUBAR);
@@ -1334,6 +1328,9 @@ var CustomizableUIInternal = { @@ -1339,6 +1328,9 @@ var CustomizableUIInternal = {
placements = gPlacements.get(area); placements = gPlacements.get(area);
} }
@@ -79,7 +81,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
// For toolbars that need it, mark as dirty. // For toolbars that need it, mark as dirty.
let defaultPlacements = areaProperties.get("defaultPlacements"); let defaultPlacements = areaProperties.get("defaultPlacements");
if ( if (
@@ -1842,7 +1839,6 @@ var CustomizableUIInternal = { @@ -1847,7 +1839,6 @@ var CustomizableUIInternal = {
lazy.log.info( lazy.log.info(
"Widget " + aWidgetId + " not found, unable to remove from " + aArea "Widget " + aWidgetId + " not found, unable to remove from " + aArea
); );
@@ -87,7 +89,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
} }
this.notifyDOMChange(widgetNode, null, container, true, () => { this.notifyDOMChange(widgetNode, null, container, true, () => {
@@ -1852,7 +1848,7 @@ var CustomizableUIInternal = { @@ -1857,7 +1848,7 @@ var CustomizableUIInternal = {
// We also need to remove the panel context menu if it's there: // We also need to remove the panel context menu if it's there:
this.ensureButtonContextMenu(widgetNode); this.ensureButtonContextMenu(widgetNode);
if (gPalette.has(aWidgetId) || this.isSpecialWidget(aWidgetId)) { if (gPalette.has(aWidgetId) || this.isSpecialWidget(aWidgetId)) {
@@ -96,7 +98,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
} else { } else {
window.gNavToolbox.palette.appendChild(widgetNode); window.gNavToolbox.palette.appendChild(widgetNode);
} }
@@ -2020,16 +2016,16 @@ var CustomizableUIInternal = { @@ -2025,16 +2016,16 @@ var CustomizableUIInternal = {
elem.setAttribute("skipintoolbarset", "true"); elem.setAttribute("skipintoolbarset", "true");
} }
} }
@@ -116,7 +118,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
// Handle initial state of vertical tabs. // Handle initial state of vertical tabs.
if (isVerticalTabs) { if (isVerticalTabs) {
// Show the vertical tabs toolbar // Show the vertical tabs toolbar
@@ -2271,6 +2267,10 @@ var CustomizableUIInternal = { @@ -2276,6 +2267,10 @@ var CustomizableUIInternal = {
* The identifier string of the area that aNode is being inserted into. * The identifier string of the area that aNode is being inserted into.
*/ */
insertWidgetBefore(aNode, aNextNode, aContainer, aAreaId) { insertWidgetBefore(aNode, aNextNode, aContainer, aAreaId) {
@@ -127,7 +129,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
this.notifyDOMChange(aNode, aNextNode, aContainer, false, () => { this.notifyDOMChange(aNode, aNextNode, aContainer, false, () => {
this.setLocationAttributes(aNode, aAreaId); this.setLocationAttributes(aNode, aAreaId);
aContainer.insertBefore(aNode, aNextNode); aContainer.insertBefore(aNode, aNextNode);
@@ -4647,7 +4647,7 @@ var CustomizableUIInternal = { @@ -4652,7 +4647,7 @@ var CustomizableUIInternal = {
* For all registered areas, builds those areas to reflect the current * For all registered areas, builds those areas to reflect the current
* placement state of all widgets. * placement state of all widgets.
*/ */
@@ -136,7 +138,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
for (let [areaId, areaNodes] of gBuildAreas) { for (let [areaId, areaNodes] of gBuildAreas) {
let placements = gPlacements.get(areaId); let placements = gPlacements.get(areaId);
let isFirstChangedToolbar = true; let isFirstChangedToolbar = true;
@@ -4658,7 +4658,7 @@ var CustomizableUIInternal = { @@ -4663,7 +4658,7 @@ var CustomizableUIInternal = {
if (area.get("type") == CustomizableUI.TYPE_TOOLBAR) { if (area.get("type") == CustomizableUI.TYPE_TOOLBAR) {
let defaultCollapsed = area.get("defaultCollapsed"); let defaultCollapsed = area.get("defaultCollapsed");
let win = areaNode.documentGlobal; let win = areaNode.documentGlobal;
@@ -145,7 +147,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
win.setToolbarVisibility( win.setToolbarVisibility(
areaNode, areaNode,
typeof defaultCollapsed == "string" typeof defaultCollapsed == "string"
@@ -5971,6 +5971,7 @@ export var CustomizableUI = { @@ -5976,6 +5971,7 @@ export var CustomizableUI = {
unregisterArea(aName, aDestroyPlacements) { unregisterArea(aName, aDestroyPlacements) {
CustomizableUIInternal.unregisterArea(aName, aDestroyPlacements); CustomizableUIInternal.unregisterArea(aName, aDestroyPlacements);
}, },
@@ -153,7 +155,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
/** /**
* Add a widget to an area. * Add a widget to an area.
* If the area to which you try to add is not known to CustomizableUI, * If the area to which you try to add is not known to CustomizableUI,
@@ -7946,7 +7947,9 @@ class OverflowableToolbar { @@ -7951,7 +7947,9 @@ class OverflowableToolbar {
); );
if (webExtList && CustomizableUI.isWebExtensionWidget(child.id)) { if (webExtList && CustomizableUI.isWebExtensionWidget(child.id)) {
@@ -163,7 +165,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
webExtList.insertBefore(child, webExtList.firstElementChild); webExtList.insertBefore(child, webExtList.firstElementChild);
} else { } else {
child.setAttribute("cui-anchorid", this.#defaultListButton.id); child.setAttribute("cui-anchorid", this.#defaultListButton.id);
@@ -7995,6 +7998,7 @@ class OverflowableToolbar { @@ -8000,6 +7998,7 @@ class OverflowableToolbar {
return aElement.getBoundingClientRect().width; return aElement.getBoundingClientRect().width;
} }
@@ -171,7 +173,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
function sumChildrenInlineSize(aParent, aExceptChild = null) { function sumChildrenInlineSize(aParent, aExceptChild = null) {
let sum = 0; let sum = 0;
for (let child of aParent.children) { for (let child of aParent.children) {
@@ -8006,7 +8010,10 @@ class OverflowableToolbar { @@ -8011,7 +8010,10 @@ class OverflowableToolbar {
) { ) {
continue; continue;
} }
@@ -183,7 +185,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
if (child != aExceptChild) { if (child != aExceptChild) {
sum += getInlineSize(child); sum += getInlineSize(child);
} }
@@ -8030,11 +8037,11 @@ class OverflowableToolbar { @@ -8035,11 +8037,11 @@ class OverflowableToolbar {
parseFloat(style.paddingLeft) - parseFloat(style.paddingLeft) -
parseFloat(style.paddingRight) - parseFloat(style.paddingRight) -
toolbarChildrenWidth; toolbarChildrenWidth;
@@ -197,7 +199,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
}); });
lazy.log.debug( lazy.log.debug(
@@ -8049,7 +8056,39 @@ class OverflowableToolbar { @@ -8054,7 +8056,39 @@ class OverflowableToolbar {
Math.max(targetWidth, targetChildrenWidth) Math.max(targetWidth, targetChildrenWidth)
); );
totalAvailWidth = Math.ceil(totalAvailWidth); totalAvailWidth = Math.ceil(totalAvailWidth);
@@ -238,7 +240,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
return { isOverflowing, targetContentWidth, totalAvailWidth }; return { isOverflowing, targetContentWidth, totalAvailWidth };
} }
@@ -8110,7 +8149,11 @@ class OverflowableToolbar { @@ -8115,7 +8149,11 @@ class OverflowableToolbar {
return; return;
} }
} }
@@ -251,7 +253,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
lazy.log.debug( lazy.log.debug(
`Need ${minSize} but width is ${totalAvailWidth} so bailing` `Need ${minSize} but width is ${totalAvailWidth} so bailing`
); );
@@ -8143,7 +8186,7 @@ class OverflowableToolbar { @@ -8148,7 +8186,7 @@ class OverflowableToolbar {
} }
} }
if (!inserted) { if (!inserted) {
@@ -260,7 +262,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
} }
child.removeAttribute("cui-anchorid"); child.removeAttribute("cui-anchorid");
child.removeAttribute("overflowedItem"); child.removeAttribute("overflowedItem");
@@ -8269,6 +8312,9 @@ class OverflowableToolbar { @@ -8274,6 +8312,9 @@ class OverflowableToolbar {
* if no such list exists. * if no such list exists.
*/ */
get #webExtList() { get #webExtList() {
@@ -270,7 +272,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
if (!this.#webExtListRef) { if (!this.#webExtListRef) {
let targetID = this.#toolbar.getAttribute("addon-webext-overflowtarget"); let targetID = this.#toolbar.getAttribute("addon-webext-overflowtarget");
if (!targetID) { if (!targetID) {
@@ -8280,6 +8326,9 @@ class OverflowableToolbar { @@ -8285,6 +8326,9 @@ class OverflowableToolbar {
let win = this.#toolbar.documentGlobal; let win = this.#toolbar.documentGlobal;
let { panel } = win.gUnifiedExtensions; let { panel } = win.gUnifiedExtensions;
this.#webExtListRef = panel.querySelector(`#${targetID}`); this.#webExtListRef = panel.querySelector(`#${targetID}`);
@@ -280,7 +282,7 @@ index 6d1885a54815d10b3a4e79f7e5acd61ab3abb159..3d6e092e7ed126cdee8c32229df2cfa1
} }
return this.#webExtListRef; return this.#webExtListRef;
} }
@@ -8488,7 +8537,7 @@ class OverflowableToolbar { @@ -8493,7 +8537,7 @@ class OverflowableToolbar {
break; break;
} }
case "mousedown": { case "mousedown": {
@@ -1,16 +1,17 @@
diff --git a/browser/components/preferences/config/account-sync.mjs b/browser/components/preferences/config/account-sync.mjs diff --git a/browser/components/preferences/config/account-sync.mjs b/browser/components/preferences/config/account-sync.mjs
index b01fd4bb163ad53139fcbd8e79e12ef994d1fa13..dd60be4fe268618d6596cd5cfac3342975bd241a 100644 index b01fd4bb163ad53139fcbd8e79e12ef994d1fa13..7e3c2f6852b77192b4505bb3d5a7b58586da6548 100644
--- a/browser/components/preferences/config/account-sync.mjs --- a/browser/components/preferences/config/account-sync.mjs
+++ b/browser/components/preferences/config/account-sync.mjs +++ b/browser/components/preferences/config/account-sync.mjs
@@ -46,6 +46,7 @@ Preferences.addAll([ @@ -46,6 +46,8 @@ Preferences.addAll([
{ id: "services.sync.engine.creditcards", type: "bool" }, { id: "services.sync.engine.creditcards", type: "bool" },
{ id: "services.sync.engine.addons", type: "bool" }, { id: "services.sync.engine.addons", type: "bool" },
{ id: "services.sync.engine.prefs", type: "bool" }, { id: "services.sync.engine.prefs", type: "bool" },
+ { id: "services.sync.engine.spaces", type: "bool" }, + { id: "services.sync.engine.spaces", type: "bool" },
+ { id: "zen.spaces-sync.normal-tabs", type: "bool" },
]); ]);
/** /**
@@ -557,6 +558,7 @@ const SYNC_ENGINE_SETTINGS = [ @@ -557,6 +559,7 @@ const SYNC_ENGINE_SETTINGS = [
type: "payments", type: "payments",
}, },
{ id: "syncAddons", pref: "services.sync.engine.addons", type: "addons" }, { id: "syncAddons", pref: "services.sync.engine.addons", type: "addons" },
@@ -18,7 +19,7 @@ index b01fd4bb163ad53139fcbd8e79e12ef994d1fa13..dd60be4fe268618d6596cd5cfac33429
{ id: "syncSettings", pref: "services.sync.engine.prefs", type: "settings" }, { id: "syncSettings", pref: "services.sync.engine.prefs", type: "settings" },
]; ];
@@ -564,6 +566,12 @@ SYNC_ENGINE_SETTINGS.forEach(({ id, pref }) => { @@ -564,6 +567,18 @@ SYNC_ENGINE_SETTINGS.forEach(({ id, pref }) => {
Preferences.addSetting({ id, pref }); Preferences.addSetting({ id, pref });
}); });
@@ -27,11 +28,17 @@ index b01fd4bb163ad53139fcbd8e79e12ef994d1fa13..dd60be4fe268618d6596cd5cfac33429
+ id: "zenSyncWorkspaces", + id: "zenSyncWorkspaces",
+ pref: "services.sync.engine.spaces", + pref: "services.sync.engine.spaces",
+}); +});
+Preferences.addSetting({
+ id: "zenSyncNormalTabs",
+ pref: "zen.spaces-sync.normal-tabs",
+ deps: ["zenSyncWorkspaces"],
+ visible: deps => !!deps.zenSyncWorkspaces.value,
+});
+ +
Preferences.addSetting({ Preferences.addSetting({
id: "syncEngines", id: "syncEngines",
deps: SYNC_ENGINE_SETTINGS.map(({ id }) => id), deps: SYNC_ENGINE_SETTINGS.map(({ id }) => id),
@@ -995,6 +1003,20 @@ SettingGroupManager.registerGroups({ @@ -995,6 +1010,27 @@ SettingGroupManager.registerGroups({
id: "syncEnginesList", id: "syncEnginesList",
control: "sync-engines-list", control: "sync-engines-list",
}, },
@@ -46,6 +53,13 @@ index b01fd4bb163ad53139fcbd8e79e12ef994d1fa13..dd60be4fe268618d6596cd5cfac33429
+ controlAttrs: { + controlAttrs: {
+ inputlayout: "inline-end", + inputlayout: "inline-end",
+ }, + },
+ items: [
+ {
+ id: "zenSyncNormalTabs",
+ l10nId: "zen-settings-normal-tabs-sync",
+ control: "moz-checkbox",
+ },
+ ],
+ }, + },
+ ], + ],
+ }, + },
@@ -1,8 +1,8 @@
diff --git a/browser/components/preferences/main.js b/browser/components/preferences/main.js diff --git a/browser/components/preferences/main.js b/browser/components/preferences/main.js
index 88675d1bcbf000b10d85a9c0980bc6069d88052c..ed3a1e809eb0fcccc5a957be7affb77be8978e32 100644 index 5a56d348146c1c37c088ced60327fffebcf8fac0..abd65594d365fbc0a74af3953c71f410301898ad 100644
--- a/browser/components/preferences/main.js --- a/browser/components/preferences/main.js
+++ b/browser/components/preferences/main.js +++ b/browser/components/preferences/main.js
@@ -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", id: "windowsLaunchOnLogin",
l10nId: "windows-launch-on-login", l10nId: "windows-launch-on-login",
@@ -575,7 +580,7 @@ function createStartupConfig(hidden = false) { @@ -576,7 +581,7 @@ function createStartupConfig(hidden = false) {
SettingGroupManager.registerGroups({ SettingGroupManager.registerGroups({
defaultBrowser: createDefaultBrowserConfig(), defaultBrowser: createDefaultBrowserConfig(),
startup: createStartupConfig( 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( return new Localization(
@@ -38,9 +38,16 @@ var gZenMarketplaceManager = {
this.__hasInitializedEvents = true; this.__hasInitializedEvents = true;
await this._buildModsList();
Services.prefs.addObserver(gZenMods.updatePref, this); Services.prefs.addObserver(gZenMods.updatePref, this);
window.addEventListener(
"unload",
() => {
Services.prefs.removeObserver(gZenMods.updatePref, this);
},
{ once: true }
);
await this._buildModsList();
const checkForUpdateClick = (event) => { const checkForUpdateClick = (event) => {
if (event.target === checkForUpdates) { if (event.target === checkForUpdates) {
@@ -69,7 +76,6 @@ var gZenMarketplaceManager = {
}); });
window.addEventListener("unload", () => { window.addEventListener("unload", () => {
Services.prefs.removeObserver(gZenMods.updatePref, this);
this.__hasInitializedEvents = false; this.__hasInitializedEvents = false;
document.removeEventListener("ZenModsMarketplace:CheckForUpdatesFinished", this); 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.glance.enabled", tabsUnloaderPrefListener); // We can use the same listener for both prefs
Services.prefs.addObserver("zen.workspaces.separate-essentials", tabsUnloaderPrefListener); 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.window-sync.sync-only-pinned-tabs", tabsUnloaderPrefListener);
Services.prefs.addObserver( Services.prefs.addObserver(
"zen.tabs.ctrl-tab.ignore-essential-tabs", "zen.tabs.ctrl-tab.ignore-essential-tabs",
@@ -744,7 +749,6 @@ var gZenWorkspacesSettings = {
Services.prefs.addObserver("browser.ctrlTab.sortByRecentlyUsed", toggleZenCycleByAttrWarning); Services.prefs.addObserver("browser.ctrlTab.sortByRecentlyUsed", toggleZenCycleByAttrWarning);
window.addEventListener("unload", () => { window.addEventListener("unload", () => {
Services.prefs.removeObserver("zen.glance.enabled", tabsUnloaderPrefListener); 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.workspaces.separate-essentials", tabsUnloaderPrefListener);
Services.prefs.removeObserver( Services.prefs.removeObserver(
"zen.window-sync.sync-only-pinned-tabs", "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 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 --- a/browser/components/sessionstore/SessionFile.sys.mjs
+++ b/browser/components/sessionstore/SessionFile.sys.mjs +++ b/browser/components/sessionstore/SessionFile.sys.mjs
@@ -22,6 +22,7 @@ ChromeUtils.defineESModuleGetters(lazy, { @@ -25,6 +25,7 @@ const lazy = XPCOMUtils.declareLazy({
RunState: "resource:///modules/sessionstore/RunState.sys.mjs", "moz-src:///browser/components/sessionstore/SessionStore.sys.mjs",
SessionStore: "resource:///modules/sessionstore/SessionStore.sys.mjs", SessionWriter:
SessionWriter: "resource:///modules/sessionstore/SessionWriter.sys.mjs", "moz-src:///browser/components/sessionstore/SessionWriter.sys.mjs",
+ ZenSessionStore: "resource:///modules/zen/ZenSessionManager.sys.mjs", + ZenSessionStore: "resource:///modules/zen/ZenSessionManager.sys.mjs",
}); });
const PREF_UPGRADE_BACKUP = "browser.sessionstore.upgradeBackup.latestBuildID"; const PREF_UPGRADE_BACKUP = "browser.sessionstore.upgradeBackup.latestBuildID";
@@ -381,7 +382,7 @@ var SessionFileInternal = { @@ -384,7 +385,7 @@ var SessionFileInternal = {
this._readOrigin = result.origin; this._readOrigin = result.origin;
result.noFilesFound = noFilesFound; result.noFilesFound = noFilesFound;
@@ -1,11 +1,11 @@
diff --git a/browser/components/sessionstore/SessionSaver.sys.mjs b/browser/components/sessionstore/SessionSaver.sys.mjs 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 --- a/browser/components/sessionstore/SessionSaver.sys.mjs
+++ b/browser/components/sessionstore/SessionSaver.sys.mjs +++ b/browser/components/sessionstore/SessionSaver.sys.mjs
@@ -20,6 +20,7 @@ ChromeUtils.defineESModuleGetters(lazy, { @@ -20,6 +20,7 @@ const lazy = XPCOMUtils.declareLazy({
SessionFile: "resource:///modules/sessionstore/SessionFile.sys.mjs", "moz-src:///browser/components/sessionstore/SessionStore.sys.mjs",
SessionStore: "resource:///modules/sessionstore/SessionStore.sys.mjs", sessionStoreLogger:
sessionStoreLogger: "resource:///modules/sessionstore/SessionLogger.sys.mjs", "moz-src:///browser/components/sessionstore/SessionLogger.sys.mjs",
+ ZenSessionStore: "resource:///modules/zen/ZenSessionManager.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 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 --- a/browser/components/sessionstore/SessionStartup.sys.mjs
+++ b/browser/components/sessionstore/SessionStartup.sys.mjs +++ b/browser/components/sessionstore/SessionStartup.sys.mjs
@@ -40,6 +40,7 @@ ChromeUtils.defineESModuleGetters(lazy, { @@ -41,6 +41,7 @@ const lazy = XPCOMUtils.declareLazy({
StartupPerformance: "moz-src:///browser/components/sessionstore/StartupPerformance.sys.mjs",
"resource:///modules/sessionstore/StartupPerformance.sys.mjs", sessionStoreLogger:
sessionStoreLogger: "resource:///modules/sessionstore/SessionLogger.sys.mjs", "moz-src:///browser/components/sessionstore/SessionLogger.sys.mjs",
+ ZenSessionStore: "resource:///modules/zen/ZenSessionManager.sys.mjs", + ZenSessionStore: "resource:///modules/zen/ZenSessionManager.sys.mjs",
}); });
const STATE_RUNNING_STR = "running"; 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 // do not need to initialize anything in auto-started private browsing sessions
@@ -19,7 +19,7 @@ index 86600ffb5178599ab23270a964064ca657a3283f..70d7b5c7d69d3700475d663b59505226
this._initialized = true; this._initialized = true;
gOnceInitializedDeferred.resolve(); gOnceInitializedDeferred.resolve();
return; return;
@@ -179,6 +180,8 @@ export var SessionStartup = { @@ -180,6 +181,8 @@ export var SessionStartup = {
this._initialState = parsed; this._initialState = parsed;
} }
@@ -28,7 +28,7 @@ index 86600ffb5178599ab23270a964064ca657a3283f..70d7b5c7d69d3700475d663b59505226
if (this._initialState == null) { if (this._initialState == null) {
// No valid session found. // No valid session found.
this._sessionType = this.NO_SESSION; 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}` `Previous shutdown ok? ${this._previousSessionCrashed}, reason: ${previousSessionCrashedReason}`
); );
@@ -37,7 +37,7 @@ index 86600ffb5178599ab23270a964064ca657a3283f..70d7b5c7d69d3700475d663b59505226
Services.obs.addObserver(this, "sessionstore-windows-restored", true); Services.obs.addObserver(this, "sessionstore-windows-restored", true);
if (this.sessionType == this.NO_SESSION) { if (this.sessionType == this.NO_SESSION) {
@@ -336,12 +341,7 @@ export var SessionStartup = { @@ -337,12 +342,7 @@ export var SessionStartup = {
isAutomaticRestoreEnabled() { isAutomaticRestoreEnabled() {
if (this._resumeSessionEnabled === null) { if (this._resumeSessionEnabled === null) {
this._resumeSessionEnabled = this._resumeSessionEnabled =
@@ -51,7 +51,7 @@ index 86600ffb5178599ab23270a964064ca657a3283f..70d7b5c7d69d3700475d663b59505226
} }
return this._resumeSessionEnabled; return this._resumeSessionEnabled;
@@ -354,8 +354,7 @@ export var SessionStartup = { @@ -355,8 +355,7 @@ export var SessionStartup = {
*/ */
willRestore() { willRestore() {
return ( return (
@@ -1,8 +1,8 @@
diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs
index 536e06eec9f35bad3b8366733b23b5a8697df9c8..631a16bc7518108641993836f0c52e2ab6e6c967 100644 index 52fc803050cd257d6de52b1e4a92f3211cbaba88..a9841832ddce540dc0f9b14c29e5eadac7510935 100644
--- a/browser/components/sessionstore/SessionStore.sys.mjs --- a/browser/components/sessionstore/SessionStore.sys.mjs
+++ b/browser/components/sessionstore/SessionStore.sys.mjs +++ b/browser/components/sessionstore/SessionStore.sys.mjs
@@ -129,6 +129,11 @@ const TAB_EVENTS = [ @@ -111,6 +111,11 @@ const TAB_EVENTS = [
"TabSplitViewActivate", "TabSplitViewActivate",
"SplitViewRemoved", "SplitViewRemoved",
"SplitViewCreated", "SplitViewCreated",
@@ -14,16 +14,39 @@ index 536e06eec9f35bad3b8366733b23b5a8697df9c8..631a16bc7518108641993836f0c52e2a
]; ];
const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
@@ -201,6 +206,8 @@ ChromeUtils.defineESModuleGetters(lazy, { @@ -185,6 +190,8 @@ const lazy = XPCOMUtils.declareLazy({
TabStateCache: "resource:///modules/sessionstore/TabStateCache.sys.mjs", TabStateFlusher:
TabStateFlusher: "resource:///modules/sessionstore/TabStateFlusher.sys.mjs", "moz-src:///browser/components/sessionstore/TabStateFlusher.sys.mjs",
setTimeout: "resource://gre/modules/Timer.sys.mjs", setTimeout: "resource://gre/modules/Timer.sys.mjs",
+ ZenSessionStore: "resource:///modules/zen/ZenSessionManager.sys.mjs", + ZenSessionStore: "resource:///modules/zen/ZenSessionManager.sys.mjs",
+ ZenWindowSync: "resource:///modules/zen/ZenWindowSync.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", () => { + get _windows() {
@@ -1317,10 +1324,7 @@ var SessionStoreInternal = { + 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() { get willAutoRestore() {
return ( return (
@@ -33,9 +56,9 @@ index 536e06eec9f35bad3b8366733b23b5a8697df9c8..631a16bc7518108641993836f0c52e2a
- BROWSER_STARTUP_RESUME_SESSION) - BROWSER_STARTUP_RESUME_SESSION)
+ true + true
); );
}, }
@@ -2008,6 +2012,11 @@ var SessionStoreInternal = { @@ -1215,6 +1235,11 @@ class _SessionStore {
case "TabPinned": case "TabPinned":
case "TabUnpinned": case "TabUnpinned":
case "SwapDocShells": case "SwapDocShells":
@@ -44,47 +67,47 @@ index 536e06eec9f35bad3b8366733b23b5a8697df9c8..631a16bc7518108641993836f0c52e2a
+ case "TabMove": + case "TabMove":
+ case "TabGroupMoved": + case "TabGroupMoved":
+ case "ZenWorkspaceDataChanged": + case "ZenWorkspaceDataChanged":
this.saveStateDelayed(win); this.#saveStateDelayed(win);
break; break;
case "TabGroupCreate": case "TabGroupCreate":
@@ -2117,6 +2126,10 @@ var SessionStoreInternal = { @@ -1341,6 +1366,10 @@ class _SessionStore {
this._windows[aWindow.__SSi].isTaskbarTab = true; this.#windows[aWindow.__SSi].isTaskbarTab = true;
} }
+ if (aWindow.document.documentElement.hasAttribute("zen-unsynced-window")) { + 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)) { if (lazy.AIWindow.isAIWindowActiveAndEnabled(aWindow)) {
this._windows[aWindow.__SSi].isAIWindow = true; this.#windows[aWindow.__SSi].isAIWindow = true;
} }
@@ -2153,7 +2166,7 @@ var SessionStoreInternal = { @@ -1377,7 +1406,7 @@ class _SessionStore {
let isTaskbarTab = this._windows[aWindow.__SSi].isTaskbarTab; let isTaskbarTab = this.#windows[aWindow.__SSi].isTaskbarTab;
// A regular window is not a private window, taskbar tab window, or popup window // A regular window is not a private window, taskbar tab window, or popup window
let isRegularWindow = let isRegularWindow =
- !isPrivateWindow && !isTaskbarTab && aWindow.toolbar.visible; - !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 // perform additional initialization when the first window is loading
if (lazy.RunState.isStopped) { if (lazy.RunState.isStopped) {
@@ -2165,7 +2178,7 @@ var SessionStoreInternal = { @@ -1389,7 +1418,7 @@ class _SessionStore {
// to disk to NOW() to enforce a full interval before the next write. // to disk to NOW() to enforce a full interval before the next write.
lazy.SessionSaver.updateLastSaveTime(); lazy.SessionSaver.updateLastSaveTime();
- if (isPrivateWindow || isTaskbarTab) { - if (isPrivateWindow || isTaskbarTab) {
+ if (isPrivateWindow || isTaskbarTab || aWindow.document.documentElement.hasAttribute("zen-unsynced-window")) { + 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" "initializeWindow, the window is private or a web app. Saving SessionStartup.state for possibly restoring later"
); );
@@ -2209,6 +2222,7 @@ var SessionStoreInternal = { @@ -1433,6 +1462,7 @@ class _SessionStore {
null, null,
"sessionstore-one-or-no-tab-restored" "sessionstore-one-or-no-tab-restored"
); );
+ lazy.ZenSessionStore.onNewEmptySession(aWindow); + lazy.ZenSessionStore.onNewEmptySession(aWindow);
this._deferredAllWindowsRestored.resolve(); this.#deferredAllWindowsRestored.resolve();
} }
// this window was opened by _openWindowWithState // this window was opened by #openWindowWithState
@@ -2258,7 +2272,6 @@ var SessionStoreInternal = { @@ -1482,7 +1512,6 @@ class _SessionStore {
if (closedWindowState) { if (closedWindowState) {
let newWindowState; let newWindowState;
if ( if (
@@ -92,25 +115,25 @@ index 536e06eec9f35bad3b8366733b23b5a8697df9c8..631a16bc7518108641993836f0c52e2a
!lazy.SessionStartup.willRestore() !lazy.SessionStartup.willRestore()
) { ) {
// We want to split the window up into pinned tabs and unpinned tabs. // We want to split the window up into pinned tabs and unpinned tabs.
@@ -2294,6 +2307,7 @@ var SessionStoreInternal = { @@ -1518,6 +1547,7 @@ class _SessionStore {
} }
if (newWindowState) { if (newWindowState) {
+ lazy.ZenSessionStore.onRestoringClosedWindow(newWindowState); + lazy.ZenSessionStore.onRestoringClosedWindow(newWindowState);
// Ensure that the window state isn't hidden // Ensure that the window state isn't hidden
this._restoreCount = 1; this.#restoreCount = 1;
let state = { windows: [newWindowState] }; let state = { windows: [newWindowState] };
@@ -2330,6 +2344,9 @@ var SessionStoreInternal = { @@ -1554,6 +1584,9 @@ class _SessionStore {
}); });
this._shouldRestoreLastSession = false; this.#shouldRestoreLastSession = false;
} }
+ else if (!aInitialState && isRegularWindow) { + else if (!aInitialState && isRegularWindow) {
+ lazy.ZenSessionStore.restoreNewWindow(aWindow, this); + lazy.ZenSessionStore.restoreNewWindow(aWindow, this);
+ } + }
if (this._restoreLastWindow && aWindow.toolbar.visible) { if (this.#restoreLastWindow && aWindow.toolbar.visible) {
// always reset (if not a popup window) // always reset (if not a popup window)
@@ -2480,7 +2497,7 @@ var SessionStoreInternal = { @@ -1704,7 +1737,7 @@ class _SessionStore {
var tabbrowser = aWindow.gBrowser; var tabbrowser = aWindow.gBrowser;
@@ -119,56 +142,56 @@ index 536e06eec9f35bad3b8366733b23b5a8697df9c8..631a16bc7518108641993836f0c52e2a
TAB_EVENTS.forEach(function (aEvent) { TAB_EVENTS.forEach(function (aEvent) {
tabbrowser.tabContainer.removeEventListener(aEvent, this, true); tabbrowser.tabContainer.removeEventListener(aEvent, this, true);
@@ -2531,7 +2548,7 @@ var SessionStoreInternal = { @@ -1755,7 +1788,7 @@ class _SessionStore {
let isLastRegularWindow = let isLastRegularWindow =
Object.values(this._windows).filter( Object.values(this.#windows).filter(
- wData => !wData.isPrivate && !wData.isTaskbarTab - wData => !wData.isPrivate && !wData.isTaskbarTab
+ wData => !wData.isPrivate && !wData.isTaskbarTab && !wData.isZenUnsynced + wData => !wData.isPrivate && !wData.isTaskbarTab && !wData.isZenUnsynced
).length == 1; ).length == 1;
this._log.debug( this.#log.debug(
`onClose, closing window isLastRegularWindow? ${isLastRegularWindow}` `onClose, closing window isLastRegularWindow? ${isLastRegularWindow}`
@@ -2588,8 +2605,8 @@ var SessionStoreInternal = { @@ -1812,8 +1845,8 @@ class _SessionStore {
// 2) Flush the window. // 2) Flush the window.
// 3) When the flush is complete, revisit our decision to store 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) { - if (!winData.isPrivate && !winData.isTaskbarTab) {
- this.maybeSaveClosedWindow(winData, isLastWindow); - this.#maybeSaveClosedWindow(winData, isLastWindow);
+ if (!winData.isPrivate && !winData.isTaskbarTab && !winData.isZenUnsynced) { + if (!winData.isPrivate && !winData.isTaskbarTab && !winData.isZenUnsynced) {
+ this.maybeSaveClosedWindow(winData, isLastWindow, isLastRegularWindow); + this.#maybeSaveClosedWindow(winData, isLastWindow, isLastRegularWindow);
} }
completionPromise = lazy.TabStateFlusher.flushWindow(aWindow).then(() => { completionPromise = lazy.TabStateFlusher.flushWindow(aWindow).then(() => {
@@ -2609,8 +2626,9 @@ var SessionStoreInternal = { @@ -1833,8 +1866,9 @@ class _SessionStore {
// Save non-private windows if they have at // Save non-private windows if they have at
// least one saveable tab or are the last window. // least one saveable tab or are the last window.
- if (!winData.isPrivate && !winData.isTaskbarTab) { - if (!winData.isPrivate && !winData.isTaskbarTab) {
- this.maybeSaveClosedWindow(winData, isLastWindow); - this.#maybeSaveClosedWindow(winData, isLastWindow);
+ lazy.ZenWindowSync.on_WindowCloseAndBrowserFlushed(browsers); + lazy.ZenWindowSync.on_WindowCloseAndBrowserFlushed(browsers);
+ if (!winData.isPrivate && !winData.isTaskbarTab && !winData.isZenUnsynced) { + if (!winData.isPrivate && !winData.isTaskbarTab && !winData.isZenUnsynced) {
+ this.maybeSaveClosedWindow(winData, isLastWindow, isLastRegularWindow); + this.#maybeSaveClosedWindow(winData, isLastWindow, isLastRegularWindow);
if (!isLastWindow && winData.closedId > -1) { if (!isLastWindow && winData.closedId > -1) {
this._addClosedAction( this.#addClosedAction(
@@ -2686,7 +2704,7 @@ var SessionStoreInternal = { @@ -1910,7 +1944,7 @@ class _SessionStore {
* to call this method again asynchronously (for example, after * to call this method again asynchronously (for example, after
* a window flush). * a window flush).
*/ */
- maybeSaveClosedWindow(winData, isLastWindow) { - #maybeSaveClosedWindow(winData, isLastWindow) {
+ maybeSaveClosedWindow(winData, isLastWindow, isLastRegularWindow = false) { + #maybeSaveClosedWindow(winData, isLastWindow, isLastRegularWindow = false) {
// Make sure SessionStore is still running, and make sure that we // Make sure SessionStore is still running, and make sure that we
// haven't chosen to forget this window. // haven't chosen to forget this window.
if ( if (
@@ -2703,6 +2721,7 @@ var SessionStoreInternal = { @@ -1927,6 +1961,7 @@ class _SessionStore {
// _closedWindows from a previous call to this function. // #closedWindows from a previous call to this function.
let winIndex = this._closedWindows.indexOf(winData); let winIndex = this.#closedWindows.indexOf(winData);
let alreadyStored = winIndex != -1; let alreadyStored = winIndex != -1;
+ lazy.ZenSessionStore.maybeSaveClosedWindow(winData, isLastRegularWindow); + lazy.ZenSessionStore.maybeSaveClosedWindow(winData, isLastRegularWindow);
// If sidebar command is truthy, i.e. sidebar is open, store sidebar settings // If sidebar command is truthy, i.e. sidebar is open, store sidebar settings
let shouldStore = hasSaveableTabs || isLastWindow; let shouldStore = hasSaveableTabs || isLastWindow;
@@ -3525,7 +3544,7 @@ var SessionStoreInternal = { @@ -2744,7 +2779,7 @@ class _SessionStore {
if (!isPrivateWindow && tabState.isPrivate) { if (!isPrivateWindow && tabState.isPrivate) {
return; return;
} }
@@ -177,10 +200,14 @@ index 536e06eec9f35bad3b8366733b23b5a8697df9c8..631a16bc7518108641993836f0c52e2a
return; return;
} }
@@ -4264,6 +4283,12 @@ var SessionStoreInternal = { @@ -3511,7 +3546,15 @@ class _SessionStore {
1,
Math.min(tabState.index, tabState.entries.length) 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.zenEssential = false;
+ tabState.zenSyncId = null; + tabState.zenSyncId = null;
+ tabState.zenIsGlance = false; + tabState.zenIsGlance = false;
@@ -190,7 +217,7 @@ index 536e06eec9f35bad3b8366733b23b5a8697df9c8..631a16bc7518108641993836f0c52e2a
if (inBackground === false) { if (inBackground === false) {
aWindow.gBrowser.selectedTab = newTab; aWindow.gBrowser.selectedTab = newTab;
@@ -4697,6 +4722,8 @@ var SessionStoreInternal = { @@ -4036,6 +4079,8 @@ class _SessionStore {
// Append the tab if we're opening into a different window, // Append the tab if we're opening into a different window,
tabIndex: aSource == aTargetWindow ? pos : Infinity, tabIndex: aSource == aTargetWindow ? pos : Infinity,
pinned: state.pinned, pinned: state.pinned,
@@ -199,7 +226,7 @@ index 536e06eec9f35bad3b8366733b23b5a8697df9c8..631a16bc7518108641993836f0c52e2a
userContextId: state.userContextId, userContextId: state.userContextId,
skipLoad: true, skipLoad: true,
preferredRemoteType, preferredRemoteType,
@@ -5194,9 +5221,10 @@ var SessionStoreInternal = { @@ -4608,9 +4653,10 @@ class _SessionStore {
if (activePageData.title && activePageData.title != activePageData.url) { if (activePageData.title && activePageData.title != activePageData.url) {
win.gBrowser.setInitialTabTitle(tab, activePageData.title, { win.gBrowser.setInitialTabTitle(tab, activePageData.title, {
isContentTitle: true, isContentTitle: true,
@@ -211,7 +238,7 @@ index 536e06eec9f35bad3b8366733b23b5a8697df9c8..631a16bc7518108641993836f0c52e2a
} }
} }
@@ -5561,7 +5589,7 @@ var SessionStoreInternal = { @@ -4982,7 +5028,7 @@ class _SessionStore {
for (let i = tabbrowser.pinnedTabCount; i < tabbrowser.tabs.length; i++) { for (let i = tabbrowser.pinnedTabCount; i < tabbrowser.tabs.length; i++) {
let tab = tabbrowser.tabs[i]; let tab = tabbrowser.tabs[i];
@@ -220,30 +247,30 @@ index 536e06eec9f35bad3b8366733b23b5a8697df9c8..631a16bc7518108641993836f0c52e2a
removableTabs.push(tab); removableTabs.push(tab);
} }
} }
@@ -5674,7 +5702,7 @@ var SessionStoreInternal = { @@ -5095,7 +5141,7 @@ class _SessionStore {
// collect the data for all windows // collect the data for all windows
for (ix in this._windows) { for (ix in this.#windows) {
- if (this._windows[ix]._restoring || this._windows[ix].isTaskbarTab) { - if (this.#windows[ix]._restoring || this.#windows[ix].isTaskbarTab) {
+ if (this._windows[ix]._restoring || this._windows[ix].isTaskbarTab && !this._windows[ix].isZenUnsynced) { + if (this.#windows[ix]._restoring || this.#windows[ix].isTaskbarTab && !this.#windows[ix].isZenUnsynced) {
// window data is still in _statesToRestore // window data is still in #statesToRestore
continue; continue;
} }
@@ -5818,11 +5846,12 @@ var SessionStoreInternal = { @@ -5239,11 +5285,12 @@ class _SessionStore {
} }
let tabbrowser = aWindow.gBrowser; let tabbrowser = aWindow.gBrowser;
- let tabs = tabbrowser.tabs; - let tabs = tabbrowser.tabs;
+ let tabs = aWindow.gZenWorkspaces.allStoredTabs; + let tabs = aWindow.gZenWorkspaces.allStoredTabs;
/** @type {WindowStateData} */ /** @type {WindowStateData} */
let winData = this._windows[aWindow.__SSi]; let winData = this.#windows[aWindow.__SSi];
let tabsData = (winData.tabs = []); let tabsData = (winData.tabs = []);
+ winData.splitViewData = aWindow.gZenViewSplitter?.storeDataForSessionStore(); + winData.splitViewData = aWindow.gZenViewSplitter?.storeDataForSessionStore();
// update the internal state data for this window // update the internal state data for this window
for (let tab of tabs) { for (let tab of tabs) {
if (tab == aWindow.FirefoxViewHandler.tab) { if (tab == aWindow.FirefoxViewHandler.tab) {
@@ -5833,6 +5862,9 @@ var SessionStoreInternal = { @@ -5254,6 +5301,9 @@ class _SessionStore {
tabsData.push(tabData); tabsData.push(tabData);
} }
@@ -253,7 +280,7 @@ index 536e06eec9f35bad3b8366733b23b5a8697df9c8..631a16bc7518108641993836f0c52e2a
// update tab group state for this window // update tab group state for this window
winData.groups = []; winData.groups = [];
for (let tabGroup of aWindow.gBrowser.tabGroups) { for (let tabGroup of aWindow.gBrowser.tabGroups) {
@@ -5849,7 +5881,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, // a window is closed, point to the first item in the tab strip instead (it will never be the Firefox View tab,
// since it's only inserted into the tab strip after it's selected). // since it's only inserted into the tab strip after it's selected).
if (aWindow.FirefoxViewHandler.tab?.selected) { if (aWindow.FirefoxViewHandler.tab?.selected) {
@@ -262,7 +289,7 @@ index 536e06eec9f35bad3b8366733b23b5a8697df9c8..631a16bc7518108641993836f0c52e2a
winData.title = tabbrowser.tabs[0].label; winData.title = tabbrowser.tabs[0].label;
} }
winData.selected = selectedIndex; winData.selected = selectedIndex;
@@ -6051,8 +6083,8 @@ var SessionStoreInternal = { @@ -5472,8 +5522,8 @@ class _SessionStore {
// selectTab represents. // selectTab represents.
let selectTab = 0; let selectTab = 0;
if (overwriteTabs) { if (overwriteTabs) {
@@ -273,7 +300,7 @@ index 536e06eec9f35bad3b8366733b23b5a8697df9c8..631a16bc7518108641993836f0c52e2a
selectTab = Math.min(selectTab, winData.tabs.length); selectTab = Math.min(selectTab, winData.tabs.length);
} }
@@ -6074,6 +6106,7 @@ var SessionStoreInternal = { @@ -5495,6 +5545,7 @@ class _SessionStore {
if (overwriteTabs) { if (overwriteTabs) {
for (let i = tabbrowser.browsers.length - 1; i >= 0; i--) { for (let i = tabbrowser.browsers.length - 1; i >= 0; i--) {
if (!tabbrowser.tabs[i].selected) { if (!tabbrowser.tabs[i].selected) {
@@ -281,7 +308,7 @@ index 536e06eec9f35bad3b8366733b23b5a8697df9c8..631a16bc7518108641993836f0c52e2a
tabbrowser.removeTab(tabbrowser.tabs[i]); tabbrowser.removeTab(tabbrowser.tabs[i]);
} }
} }
@@ -6108,6 +6141,12 @@ var SessionStoreInternal = { @@ -5529,6 +5580,12 @@ class _SessionStore {
savedTabGroup => !openTabGroupIdsInWindow.has(savedTabGroup.id) savedTabGroup => !openTabGroupIdsInWindow.has(savedTabGroup.id)
); );
} }
@@ -294,7 +321,7 @@ index 536e06eec9f35bad3b8366733b23b5a8697df9c8..631a16bc7518108641993836f0c52e2a
// Move the originally open tabs to the end. // Move the originally open tabs to the end.
if (initialTabs) { if (initialTabs) {
@@ -6674,6 +6713,25 @@ var SessionStoreInternal = { @@ -6098,6 +6155,25 @@ class _SessionStore {
// Most of tabData has been restored, now continue with restoring // Most of tabData has been restored, now continue with restoring
// attributes that may trigger external events. // attributes that may trigger external events.
@@ -320,17 +347,25 @@ index 536e06eec9f35bad3b8366733b23b5a8697df9c8..631a16bc7518108641993836f0c52e2a
if (tabData.pinned) { if (tabData.pinned) {
tabbrowser.pinTab(tab); tabbrowser.pinTab(tab);
@@ -6859,6 +6917,9 @@ var SessionStoreInternal = { @@ -6272,6 +6348,9 @@ class _SessionStore {
aWindow.gURLBar.readOnly = false; aWindow.gURLBar.readOnly = false;
} }
} }
+ if (aWinData.isZenUnsynced) { + if (aWinData.isZenUnsynced) {
+ this._windows[aWindow.__SSi].isZenUnsynced = true; + this.#windows[aWindow.__SSi].isZenUnsynced = true;
+ } + }
let promiseParts = Promise.withResolvers(); let promiseParts = Promise.withResolvers();
aWindow.setTimeout(() => { const wasMinimized = aWindow.windowState == aWindow.STATE_MINIMIZED;
@@ -7654,7 +7715,7 @@ var SessionStoreInternal = { @@ -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(); let groupsToSave = new Map();
for (let tIndex = 0; tIndex < window.tabs.length; ) { for (let tIndex = 0; tIndex < window.tabs.length; ) {
@@ -339,7 +374,7 @@ index 536e06eec9f35bad3b8366733b23b5a8697df9c8..631a16bc7518108641993836f0c52e2a
// Adjust window.selected // Adjust window.selected
if (tIndex + 1 < window.selected) { if (tIndex + 1 < window.selected) {
window.selected -= 1; window.selected -= 1;
@@ -7669,7 +7730,7 @@ var SessionStoreInternal = { @@ -7131,7 +7211,7 @@ class _SessionStore {
); );
// We don't want to increment tIndex here. // We don't want to increment tIndex here.
continue; continue;
@@ -348,15 +383,15 @@ index 536e06eec9f35bad3b8366733b23b5a8697df9c8..631a16bc7518108641993836f0c52e2a
// Convert any open groups into saved groups. // Convert any open groups into saved groups.
let groupStateToSave = window.groups.find( let groupStateToSave = window.groups.find(
groupState => groupState.id == window.tabs[tIndex].groupId groupState => groupState.id == window.tabs[tIndex].groupId
@@ -8233,7 +8294,6 @@ var SessionStoreInternal = { @@ -7691,7 +7771,6 @@ class _SessionStore {
timer.initWithCallback( timer.initWithCallback(
function () { () => {
if (beats <= 0) { 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); Glean.sessionRestore.shutdownFlushAllOutcomes.timed_out.add(1);
deferred.resolve(); deferred.resolve();
} }
@@ -8711,6 +8771,7 @@ var SessionStoreInternal = { @@ -8174,6 +8253,7 @@ class _SessionStore {
if ( if (
!savedTabGroupState.tabs.length || !savedTabGroupState.tabs.length ||
this.getSavedTabGroup(savedTabGroupState.id) this.getSavedTabGroup(savedTabGroupState.id)
@@ -1,16 +1,16 @@
diff --git a/browser/components/sessionstore/TabState.sys.mjs b/browser/components/sessionstore/TabState.sys.mjs diff --git a/browser/components/sessionstore/TabState.sys.mjs b/browser/components/sessionstore/TabState.sys.mjs
index a33deeb5b587d6a950960a1a4781176e4e730ad7..e96cfb9a5ffbe4feccdffa8b6d18ececb48d4c52 100644 index bb7bd8c7ca88f776188fce64e0c85beb5ceb27a5..bdec77ba26172fe1b41369b1d45d5a6f9d52ae25 100644
--- a/browser/components/sessionstore/TabState.sys.mjs --- a/browser/components/sessionstore/TabState.sys.mjs
+++ b/browser/components/sessionstore/TabState.sys.mjs +++ b/browser/components/sessionstore/TabState.sys.mjs
@@ -8,6 +8,7 @@ ChromeUtils.defineESModuleGetters(lazy, { @@ -10,6 +10,7 @@ const lazy = XPCOMUtils.declareLazy({
PrivacyFilter: "resource://gre/modules/sessionstore/PrivacyFilter.sys.mjs", "moz-src:///browser/components/sessionstore/TabAttributes.sys.mjs",
TabAttributes: "resource:///modules/sessionstore/TabAttributes.sys.mjs", TabStateCache:
TabStateCache: "resource:///modules/sessionstore/TabStateCache.sys.mjs", "moz-src:///browser/components/sessionstore/TabStateCache.sys.mjs",
+ UrlbarShared: "chrome://browser/content/urlbar/UrlbarShared.mjs", + UrlbarShared: "chrome://browser/content/urlbar/UrlbarShared.mjs",
sessionStoreLogger: "resource:///modules/sessionstore/SessionLogger.sys.mjs", sessionStoreLogger:
"moz-src:///browser/components/sessionstore/SessionLogger.sys.mjs",
}); });
@@ -106,10 +107,28 @@ class _TabState {
@@ -103,10 +104,28 @@ class _TabState {
} }
} }
@@ -39,3 +39,14 @@ index a33deeb5b587d6a950960a1a4781176e4e730ad7..e96cfb9a5ffbe4feccdffa8b6d18ecec
tabData.userContextId = tab.userContextId || 0; tabData.userContextId = tab.userContextId || 0;
@@ -135,6 +154,10 @@ class _TabState {
tabData.image = tabbrowser.getIcon(tab);
}
+ if (tab.zenStaticIcon) {
+ tabData.image = tab.zenStaticIcon;
+ }
+
// If there is a userTypedValue set, then either the user has typed something
// in the URL bar, or a new tab was opened with a URI to load.
// If so, we also track whether we were still in the process of loading something.
File diff suppressed because it is too large Load Diff
@@ -1,8 +1,8 @@
diff --git a/browser/components/tabbrowser/content/drag-and-drop.js b/browser/components/tabbrowser/content/drag-and-drop.js diff --git a/browser/components/tabbrowser/content/drag-and-drop.js b/browser/components/tabbrowser/content/drag-and-drop.js
index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8edf9bcf4 100644 index f9623f82499e516050d523068e70ebaa4fe9a66a..95bcc078a86b4ec4b35f5916b7e4a5e305afba9e 100644
--- a/browser/components/tabbrowser/content/drag-and-drop.js --- a/browser/components/tabbrowser/content/drag-and-drop.js
+++ b/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} * @returns {MozTabbrowserTab|vbox}
*/ */
const elementToMove = element => { const elementToMove = element => {
@@ -12,7 +12,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
if (isTab(element) || isSplitViewWrapper(element)) { if (isTab(element) || isSplitViewWrapper(element)) {
return element; return element;
} }
@@ -128,6 +131,9 @@ @@ -140,6 +143,9 @@
} }
let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0); let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0);
@@ -22,15 +22,15 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
if ( if (
(dropEffect == "move" || dropEffect == "copy") && (dropEffect == "move" || dropEffect == "copy") &&
document == draggedTab.ownerDocument && document == draggedTab.ownerDocument &&
@@ -148,6 +154,7 @@ @@ -161,6 +167,7 @@
!draggedTab.group.collapsed
) { ) {
draggedTab.group.collapsedByDrag = true;
draggedTab.group.collapsed = true; draggedTab.group.collapsed = true;
+ gZenFolders.animateGroupMove(draggedTab.group); + gZenFolders.animateGroupMove(draggedTab.group);
} }
if (dropEffect == "move") { if (dropEffect == "move") {
@@ -155,10 +162,6 @@ @@ -168,10 +175,6 @@
// Pinned tabs in expanded vertical mode are on a grid format and require // Pinned tabs in expanded vertical mode are on a grid format and require
// different logic to drag and drop. // different logic to drag and drop.
@@ -41,7 +41,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
this._animateTabMove(event); this._animateTabMove(event);
return; return;
} }
@@ -297,6 +300,10 @@ @@ -310,6 +313,10 @@
this._tabDropIndicator.hidden = true; this._tabDropIndicator.hidden = true;
event.stopPropagation(); event.stopPropagation();
@@ -52,7 +52,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
if (draggedTab && dropEffect == "copy") { if (draggedTab && dropEffect == "copy") {
let duplicatedDraggedTab; let duplicatedDraggedTab;
let duplicatedTabs = []; let duplicatedTabs = [];
@@ -324,12 +331,16 @@ @@ -337,12 +344,16 @@
let translateOffsetY = oldTranslateY % tabHeight; let translateOffsetY = oldTranslateY % tabHeight;
let newTranslateX = oldTranslateX - translateOffsetX; let newTranslateX = oldTranslateX - translateOffsetX;
let newTranslateY = oldTranslateY - translateOffsetY; let newTranslateY = oldTranslateY - translateOffsetY;
@@ -73,7 +73,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
if (this._tabbrowserTabs.isContainerVerticalPinnedGrid(draggedTab)) { if (this._tabbrowserTabs.isContainerVerticalPinnedGrid(draggedTab)) {
// Update both translate axis for pinned vertical expanded tabs // Update both translate axis for pinned vertical expanded tabs
@@ -404,11 +415,13 @@ @@ -417,11 +428,13 @@
this._dragToPinPromoCard, this._dragToPinPromoCard,
]; ];
let shouldPin = let shouldPin =
@@ -87,7 +87,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
isTab(draggedTab) && isTab(draggedTab) &&
draggedTab.pinned && draggedTab.pinned &&
this._tabbrowserTabs.arrowScrollbox.contains(event.target); this._tabbrowserTabs.arrowScrollbox.contains(event.target);
@@ -484,6 +497,7 @@ @@ -492,6 +505,7 @@
} }
} }
@@ -95,7 +95,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
if (shouldTranslate) { if (shouldTranslate) {
this.#dropAnimationEndTime = Date.now() + DROP_ANIMATION_GRACE_MS; this.#dropAnimationEndTime = Date.now() + DROP_ANIMATION_GRACE_MS;
let translationPromises = []; let translationPromises = [];
@@ -496,7 +510,7 @@ @@ -504,7 +518,7 @@
item.removeAttribute("tabdrop-samewindow"); item.removeAttribute("tabdrop-samewindow");
resolve(); resolve();
}; };
@@ -104,7 +104,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
postTransitionCleanup(); postTransitionCleanup();
} else { } else {
let onTransitionEnd = transitionendEvent => { let onTransitionEnd = transitionendEvent => {
@@ -580,7 +594,7 @@ @@ -595,7 +609,7 @@
if (tab.selected) { if (tab.selected) {
selectedTab = tab; selectedTab = tab;
indexForSelectedTab = newIndex; indexForSelectedTab = newIndex;
@@ -113,7 +113,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
const droppedIntoPinnedArea = dropIndex < gBrowser.pinnedTabCount; const droppedIntoPinnedArea = dropIndex < gBrowser.pinnedTabCount;
const newSplitView = gBrowser.adoptSplitView(tab, { const newSplitView = gBrowser.adoptSplitView(tab, {
elementIndex: droppedIntoPinnedArea elementIndex: droppedIntoPinnedArea
@@ -605,7 +619,7 @@ @@ -620,7 +634,7 @@
} }
} }
} }
@@ -122,7 +122,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
const newTab = gBrowser.adoptTab(selectedTab, { const newTab = gBrowser.adoptTab(selectedTab, {
elementIndex: indexForSelectedTab, elementIndex: indexForSelectedTab,
selectTab: selectedTab == draggedTab, selectTab: selectedTab == draggedTab,
@@ -639,10 +653,6 @@ @@ -654,10 +668,6 @@
this._tabbrowserTabs.dragAndDropElements[ this._tabbrowserTabs.dragAndDropElements[
gBrowser.pinnedTabCount + unpinnedSplitViews.length - 1 gBrowser.pinnedTabCount + unpinnedSplitViews.length - 1
]; ];
@@ -133,7 +133,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
} }
} }
} else { } else {
@@ -703,6 +713,7 @@ @@ -717,6 +727,7 @@
let nextItem = this._tabbrowserTabs.dragAndDropElements[newIndex]; let nextItem = this._tabbrowserTabs.dragAndDropElements[newIndex];
let tabGroup = isTab(nextItem) && nextItem.group; let tabGroup = isTab(nextItem) && nextItem.group;
@@ -141,7 +141,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
gBrowser.loadTabs(urls, { gBrowser.loadTabs(urls, {
inBackground, inBackground,
replace, replace,
@@ -744,6 +755,22 @@ @@ -758,6 +769,22 @@
this._expandGroupOnDrop(draggedTab); this._expandGroupOnDrop(draggedTab);
} }
this._resetTabsAfterDrop(draggedTab); this._resetTabsAfterDrop(draggedTab);
@@ -164,7 +164,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
if ( if (
dt.mozUserCancelled || dt.mozUserCancelled ||
@@ -1074,11 +1101,10 @@ @@ -1088,11 +1115,10 @@
return this.#getHorizontalScrollboxDragTarget(event, ignoreSides); return this.#getHorizontalScrollboxDragTarget(event, ignoreSides);
} }
while (target) { while (target) {
@@ -180,7 +180,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
break; break;
} }
target = target.parentNode; target = target.parentNode;
@@ -1108,6 +1134,9 @@ @@ -1122,6 +1148,9 @@
return null; return null;
} }
} }
@@ -190,36 +190,43 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
return target; return target;
} }
@@ -1170,14 +1199,20 @@ @@ -1188,17 +1217,24 @@
let releaseReservedSpace = () => let periphery = draggedTab.ownerDocument.getElementById(
this.#releaseSpaceInScrolledContent(periphery); "tabbrowser-arrowscrollbox-periphery"
if (group.collapsed) { );
- // The group's tabs animate back to their full size, so hold on to the - // The group's tabs animate back to their full size, so hold on to the
- // space reserved for them until they get there. - // space reserved for them until they get there.
- group.addEventListener( - group.addEventListener(
- "TabGroupAnimationComplete", - "TabGroupAnimationComplete",
- releaseReservedSpace, - () => {
- { once: true } - group.collapsedByDrag = false;
- ); - this.#releaseSpaceInScrolledContent(periphery);
- group.collapsed = false; - },
+ const expand = !group.hasAttribute("has-active"); - { once: true }
+ if (expand) { - );
+ // The group's tabs animate back to their full size, so hold on to the - group.collapsed = false;
+ // space reserved for them until they get there. + const expand = !group.hasAttribute("has-active");
+ group.addEventListener( + if (expand) {
+ "TabGroupAnimationComplete", + // The group's tabs animate back to their full size, so hold on to the
+ releaseReservedSpace, + // space reserved for them until they get there.
+ { once: true } + group.addEventListener(
+ ); + "TabGroupAnimationComplete",
+ } else { + () => {
+ releaseReservedSpace(); + group.collapsedByDrag = false;
+ } + this.#releaseSpaceInScrolledContent(periphery);
+ group.collapsed = !expand; + },
+ gZenFolders.animateGroupMove(group, true); + { once: true }
} else { + );
releaseReservedSpace(); + } else {
} + group.collapsedByDrag = false;
@@ -1362,7 +1397,6 @@ + this.#releaseSpaceInScrolledContent(periphery);
+ }
+ group.collapsed = !expand;
+ gZenFolders.animateGroupMove(group, true);
}
/**
@@ -1380,7 +1416,6 @@
// using updateDragImage. On Linux, we can use a panel. // using updateDragImage. On Linux, we can use a panel.
if (platform == "win" || platform == "macosx") { if (platform == "win" || platform == "macosx") {
captureListener = function () { captureListener = function () {
@@ -227,7 +234,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
}; };
} else { } else {
// Create a panel to use it in setDragImage // Create a panel to use it in setDragImage
@@ -1400,7 +1434,6 @@ @@ -1418,7 +1453,6 @@
); );
dragImageOffset = dragImageOffset * scale; dragImageOffset = dragImageOffset * scale;
} }
@@ -235,7 +242,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
// _dragData.offsetX/Y give the coordinates that the mouse should be // _dragData.offsetX/Y give the coordinates that the mouse should be
// positioned relative to the corner of the new window created upon // positioned relative to the corner of the new window created upon
@@ -1419,7 +1452,7 @@ @@ -1437,7 +1471,7 @@
let dropEffect = this.getDropEffectForTabDrag(event); let dropEffect = this.getDropEffectForTabDrag(event);
let isMovingInTabStrip = !fromTabList && dropEffect == "move"; let isMovingInTabStrip = !fromTabList && dropEffect == "move";
let collapseTabGroupDuringDrag = let collapseTabGroupDuringDrag =
@@ -244,7 +251,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
tab._dragData = { tab._dragData = {
offsetX: this._tabbrowserTabs.verticalMode offsetX: this._tabbrowserTabs.verticalMode
@@ -1429,7 +1462,7 @@ @@ -1447,7 +1481,7 @@
? event.screenY - window.screenY - tabOffset ? event.screenY - window.screenY - tabOffset
: event.screenY - window.screenY, : event.screenY - window.screenY,
scrollPos: scrollPos:
@@ -253,7 +260,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
? this._tabbrowserTabs.pinnedTabsContainer.scrollPosition ? this._tabbrowserTabs.pinnedTabsContainer.scrollPosition
: this._tabbrowserTabs.arrowScrollbox.scrollPosition, : this._tabbrowserTabs.arrowScrollbox.scrollPosition,
screenX: event.screenX, screenX: event.screenX,
@@ -1522,6 +1555,7 @@ @@ -1540,6 +1574,7 @@
if (tabStripItemElement.hasAttribute("dragtarget")) { if (tabStripItemElement.hasAttribute("dragtarget")) {
return; return;
} }
@@ -261,7 +268,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
let isPinned = tab.pinned; let isPinned = tab.pinned;
let dragAndDropElements = this._tabbrowserTabs.dragAndDropElements; let dragAndDropElements = this._tabbrowserTabs.dragAndDropElements;
let isGrid = this._tabbrowserTabs.isContainerVerticalPinnedGrid(tab); let isGrid = this._tabbrowserTabs.isContainerVerticalPinnedGrid(tab);
@@ -1895,23 +1929,6 @@ @@ -1913,23 +1948,6 @@
// Slide the relevant tabs to their new position. // Slide the relevant tabs to their new position.
// non-moving tabs adjust for RTL // non-moving tabs adjust for RTL
@@ -285,7 +292,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
// moving tabs don't adjust for RTL // moving tabs don't adjust for RTL
for (let item of selectedElements) { for (let item of selectedElements) {
if ( if (
@@ -1960,7 +1977,6 @@ @@ -1978,7 +1996,6 @@
for (let item of this._tabbrowserTabs.dragAndDropElements) { for (let item of this._tabbrowserTabs.dragAndDropElements) {
delete item._moveTogetherSelectedTabsData; delete item._moveTogetherSelectedTabsData;
item = elementToMove(item); item = elementToMove(item);
@@ -293,7 +300,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
item.removeAttribute("multiselected-move-together"); item.removeAttribute("multiselected-move-together");
} }
} }
@@ -2812,7 +2828,6 @@ @@ -2830,7 +2847,6 @@
tab.style.top = ""; tab.style.top = "";
tab.style.maxWidth = ""; tab.style.maxWidth = "";
tab.style.pointerEvents = ""; tab.style.pointerEvents = "";
@@ -301,7 +308,7 @@ index 70b37f93c4e8ff4ad9a2452681e468d23914c1b5..dbf2d9c83dafbe0e0b4e6caf3835edc8
tab.removeAttribute("small-stack"); tab.removeAttribute("small-stack");
tab.removeAttribute("big-stack"); tab.removeAttribute("big-stack");
} }
@@ -2821,11 +2836,9 @@ @@ -2839,11 +2855,9 @@
)) { )) {
label.style.width = ""; label.style.width = "";
label.style.maxWidth = ""; label.style.maxWidth = "";
File diff suppressed because it is too large Load Diff
@@ -1,15 +1,15 @@
diff --git a/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs b/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs diff --git a/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs b/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs
index cfc232f038cd491db32e0c0ca35622360dd9dec5..4806a725ddefa9d0709020d537eae5464249a294 100644 index e32b02941a6019703212cede4660a24b88845120..5cb363ed20d49c1ae8abedecc3b08540406b7a1b 100644
--- a/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs --- a/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs
+++ b/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs +++ b/browser/components/urlbar/UrlbarProviderHeuristicFallback.sys.mjs
@@ -77,22 +77,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 // 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 // to visit or search for it, we provide an alternative searchengine
// match if the string looks like an alphanumeric origin or an e-mail. // match if the string looks like an alphanumeric origin or an e-mail.
- let str = queryContext.searchString; - let str = queryContext.searchString;
- if (!URL.canParse(str)) { - if (!URL.canParse(str)) {
- if ( - if (
- lazy.UrlbarPrefs.get("keyword.enabled") && - queryContext.keywordEnabled &&
- (lazy.UrlUtils.looksLikeOrigin(str, { - (lazy.UrlUtils.looksLikeOrigin(str, {
- noIp: true, - noIp: true,
- noPort: true, - noPort: true,
@@ -24,7 +24,7 @@ index cfc232f038cd491db32e0c0ca35622360dd9dec5..4806a725ddefa9d0709020d537eae546
+ } + }
+ ); + );
+ if ( + if (
+ lazy.UrlbarPrefs.get("keyword.enabled") && + queryContext.keywordEnabled &&
+ (lazy.UrlUtils.looksLikeUrl(searchCandidate) || + (lazy.UrlUtils.looksLikeUrl(searchCandidate) ||
+ lazy.UrlUtils.looksLikeOrigin(searchCandidate, { + lazy.UrlUtils.looksLikeOrigin(searchCandidate, {
+ allowPartialNumericalTLDs: true, + allowPartialNumericalTLDs: true,
@@ -1,16 +0,0 @@
diff --git a/browser/components/urlbar/UrlbarUtils.sys.mjs b/browser/components/urlbar/UrlbarUtils.sys.mjs
index 178cd5e84fda74a28b2de59b671b3399cc28fac4..b03c6e06de4ee9a95dcb4d33d7ac9f0b053be4e1 100644
--- a/browser/components/urlbar/UrlbarUtils.sys.mjs
+++ b/browser/components/urlbar/UrlbarUtils.sys.mjs
@@ -214,6 +214,11 @@ export var UrlbarUtils = {
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":
@@ -1,16 +1,16 @@
diff --git a/browser/components/urlbar/content/UrlbarChildController.mjs b/browser/components/urlbar/content/UrlbarChildController.mjs diff --git a/browser/components/urlbar/content/UrlbarChildController.mjs b/browser/components/urlbar/content/UrlbarChildController.mjs
index a17a4de079b69d2818388b33a2c1746cc6148c73..4fee63a22919972af08716db2d2de1c7549ff100 100644 index 52ed36deac35d3de9f7f537313159fb4debe98a6..3bbc612a2e10eedafdabdaa8e17cf36831a6a27c 100644
--- a/browser/components/urlbar/content/UrlbarChildController.mjs --- a/browser/components/urlbar/content/UrlbarChildController.mjs
+++ b/browser/components/urlbar/content/UrlbarChildController.mjs +++ b/browser/components/urlbar/content/UrlbarChildController.mjs
@@ -438,7 +438,6 @@ export class UrlbarChildController { @@ -446,7 +446,6 @@ export class UrlbarChildController {
const isMac = AppConstants.platform == "macosx"; const isMac = UrlbarContentUtils.getPlatform() == "macosx";
// Handle readline/emacs-style navigation bindings on Mac. // Handle readline/emacs-style navigation bindings on Mac.
if ( if (
- isMac && - isMac &&
this.view.isOpen && this.view.isOpen &&
event.ctrlKey && event.ctrlKey &&
(event.key == "n" || event.key == "p") (event.key == "n" || event.key == "p")
@@ -630,6 +629,8 @@ export class UrlbarChildController { @@ -644,6 +643,8 @@ export class UrlbarChildController {
}); });
} }
event.preventDefault(); event.preventDefault();
@@ -19,7 +19,7 @@ index a17a4de079b69d2818388b33a2c1746cc6148c73..4fee63a22919972af08716db2d2de1c7
} }
break; break;
} }
@@ -934,6 +935,10 @@ export class UrlbarChildController { @@ -905,6 +906,10 @@ export class UrlbarChildController {
} }
reuseEmpty = true; reuseEmpty = true;
} }
@@ -30,7 +30,7 @@ index a17a4de079b69d2818388b33a2c1746cc6148c73..4fee63a22919972af08716db2d2de1c7
// The browser window exists only in chrome; a content-process input has no // 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. // tab to reuse, so `gBrowser` is absent and the reuse is skipped.
if ( if (
@@ -943,6 +948,10 @@ export class UrlbarChildController { @@ -914,6 +919,10 @@ export class UrlbarChildController {
) { ) {
where = "current"; where = "current";
} }
@@ -1,22 +1,21 @@
diff --git a/browser/components/urlbar/content/UrlbarInput.mjs b/browser/components/urlbar/content/UrlbarInput.mjs diff --git a/browser/components/urlbar/content/UrlbarInputBase.mjs b/browser/components/urlbar/content/UrlbarInputBase.mjs
index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1a95e28b8 100644 index 8be35b58c5369e123ca69426e852e3849bf75513..778d8aecce4da6748ecbf8b86a38c2da6e01bec5 100644
--- a/browser/components/urlbar/content/UrlbarInput.mjs --- a/browser/components/urlbar/content/UrlbarInputBase.mjs
+++ b/browser/components/urlbar/content/UrlbarInput.mjs +++ b/browser/components/urlbar/content/UrlbarInputBase.mjs
@@ -88,6 +88,13 @@ const lazy = XPCOMUtils.declareLazy({ @@ -83,6 +83,12 @@ if (lazy) {
logger: () => UrlbarShared.getLogger({ prefix: "Input" }), Ci.nsIURLQueryStringStripper,
}); ],
});
+ XPCOMUtils.defineLazyPreferenceGetter(
+ lazy,
+ "ZEN_URLBAR_BEHAVIOR",
+ "zen.urlbar.behavior",
+ 'default'
+ );
}
+XPCOMUtils.defineLazyPreferenceGetter( const logger = () => UrlbarShared.getLogger({ prefix: "Input" });
+ lazy, @@ -917,7 +923,16 @@ ${
+ "ZEN_URLBAR_BEHAVIOR",
+ "zen.urlbar.behavior",
+ 'default'
+);
+
const UNLIMITED_MAX_RESULTS = 99;
let getBoundsWithoutFlushing = element =>
@@ -771,7 +778,16 @@ ${
// See _on_select(). HTMLInputElement.select() dispatches a "select" // See _on_select(). HTMLInputElement.select() dispatches a "select"
// event but does not set the primary selection. // event but does not set the primary selection.
this._suppressPrimaryAdjustment = true; this._suppressPrimaryAdjustment = true;
@@ -33,7 +32,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
this._suppressPrimaryAdjustment = false; this._suppressPrimaryAdjustment = false;
} }
@@ -846,6 +862,10 @@ ${ @@ -992,6 +1007,10 @@ ${
hideSearchTerms = false, hideSearchTerms = false,
isSameDocument = false, isSameDocument = false,
} = {}) { } = {}) {
@@ -44,7 +43,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
if (!this.#isAddressbar) { if (!this.#isAddressbar) {
throw new Error( throw new Error(
"Cannot set URI for UrlbarInput that is not an address bar" "Cannot set URI for UrlbarInput that is not an address bar"
@@ -1143,7 +1163,16 @@ ${ @@ -1289,7 +1308,16 @@ ${
this.searchModeSwitcher?.updateSearchIcon(); this.searchModeSwitcher?.updateSearchIcon();
} }
@@ -61,7 +60,17 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
} }
/** /**
@@ -1726,7 +1755,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; openParams.avoidBrowserFocus = keepViewOpen;
if (!this.#providesSearchMode(result) && !keepViewOpen) { if (!this.#providesSearchMode(result) && !keepViewOpen) {
@@ -74,12 +83,12 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
} }
if (isCanonized) { if (isCanonized) {
@@ -3016,6 +3049,42 @@ ${ @@ -3181,6 +3216,42 @@ ${
await this.#updateLayoutBreakoutDimensions(); await this.#updateLayoutBreakoutDimensions();
} }
+ zenFormatURLValue() { + zenFormatURLValue() {
+ return this.#lazy.valueFormatter._formatURL(); + return this.#getValueFormatter().update();
+ } + }
+ +
+ get zenUrlbarBehavior() { + get zenUrlbarBehavior() {
@@ -117,8 +126,11 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
startLayoutExtend() { startLayoutExtend() {
if (!this.#allowBreakout || this.hasAttribute("breakout-extend")) { if (!this.#allowBreakout || this.hasAttribute("breakout-extend")) {
// Do not expand if the Urlbar does not support being expanded or it is // Do not expand if the Urlbar does not support being expanded or it is
@@ -3030,6 +3099,13 @@ ${ @@ -3193,8 +3264,16 @@ ${
}
this.toggleAttribute("breakout-extend", true); this.toggleAttribute("breakout-extend", true);
+ this.#showBreakoutPopover();
this.#updateTextboxPosition(); this.#updateTextboxPosition();
+ this.window.gZenUIManager.onUrlbarOpen(); + this.window.gZenUIManager.onUrlbarOpen();
@@ -131,7 +143,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
// Enable the animation only after the first extend call to ensure it // Enable the animation only after the first extend call to ensure it
// doesn't run when opening a new window. // doesn't run when opening a new window.
if (!this.hasAttribute("breakout-extend-animate")) { if (!this.hasAttribute("breakout-extend-animate")) {
@@ -3053,6 +3129,29 @@ ${ @@ -3218,7 +3297,33 @@ ${
return; return;
} }
@@ -159,9 +171,13 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
+ this.removeAttribute("zen-floating-urlbar"); + this.removeAttribute("zen-floating-urlbar");
+ +
this.toggleAttribute("breakout-extend", false); this.toggleAttribute("breakout-extend", false);
+ if (this.#isAddressbar) {
+ this.#hideBreakoutPopover();
+ }
this.#updateTextboxPosition(); this.#updateTextboxPosition();
} }
@@ -3091,7 +3190,7 @@ ${
@@ -3256,7 +3361,7 @@ ${
forceUnifiedSearchButtonAvailable = false forceUnifiedSearchButtonAvailable = false
) { ) {
let prevState = this.getAttribute("pageproxystate"); let prevState = this.getAttribute("pageproxystate");
@@ -170,20 +186,51 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
this.setAttribute("pageproxystate", state); this.setAttribute("pageproxystate", state);
this._inputContainer.setAttribute("pageproxystate", state); this._inputContainer.setAttribute("pageproxystate", state);
this._identityBox?.setAttribute("pageproxystate", state); this._identityBox?.setAttribute("pageproxystate", state);
@@ -3355,10 +3454,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.window.gZenVerticalTabsManager._hasSetSingleToolbar ?
this.parentNode.getBoxQuads({ + getUntransformedTop(this.parentNode)
ignoreTransforms: true, + : (UrlbarContentUtils.getPlatform() == "macosx" ? -2 : -5)
flush: false, + );
})[0].p1.y
+ : (AppConstants.platform == "macosx" ? -2 : -5)
);
} }
@@ -3417,9 +3518,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; return;
} }
@@ -195,7 +242,19 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
); );
if (this.#breakoutBlockerCount) { if (this.#breakoutBlockerCount) {
@@ -3929,6 +4031,7 @@ ${ @@ -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) { _toggleActionOverride(event) {
@@ -203,7 +262,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
if ( if (
event.keyCode == KeyEvent.DOM_VK_SHIFT || event.keyCode == KeyEvent.DOM_VK_SHIFT ||
event.keyCode == KeyEvent.DOM_VK_ALT || event.keyCode == KeyEvent.DOM_VK_ALT ||
@@ -4027,9 +4130,10 @@ ${ @@ -4206,9 +4335,10 @@ ${
if (!this.#isAddressbar) { if (!this.#isAddressbar) {
return val; return val;
} }
@@ -216,36 +275,36 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
+ : val; + : val;
// Only trim value if the directionality doesn't change to RTL and we're not // Only trim value if the directionality doesn't change to RTL and we're not
// showing a strikeout https protocol. // showing a strikeout https protocol.
return this.controller.isTextDirectionRTL(trimmedValue) || return UrlbarContentUtils.isTextDirectionRTL(trimmedValue, window) ||
@@ -4235,6 +4339,11 @@ ${ @@ -4410,6 +4540,11 @@ ${
keepViewOpen = false, keepViewOpen = false,
browserId = null, browserId = null,
}) { }) {
+ where = this.window.gZenUIManager.getOpenUILinkWhere( + where = this.window.gZenUIManager.getOpenUILinkWhere(
+ url, + loadRequest.urlLoad?.url ?? "",
+ this.window.gBrowser.selectedBrowser, + this.window.gBrowser.selectedBrowser,
+ where + where
+ ); + );
let userTypedValue; let keyDownEnterDeferred;
if (this.#isAddressbar && where == "current") { if (
// Make sure URL is formatted properly (don't show punycode). this._keyDownEnterDeferred &&
@@ -4576,6 +4685,7 @@ ${ @@ -4731,6 +4866,7 @@ ${
this.setResultForCurrentValue(null); this.setResultForCurrentValue(null);
this.handleCommand(); this.handleCommand();
this.controller.clearLastQueryContextCache(); this.controller.clearLastQueryContextCache();
+ this.view.close(); + this.view.close();
this._suppressStartQuery = false; this._suppressStartQuery = false;
}); });
@@ -4583,7 +4693,6 @@ ${ @@ -4742,7 +4878,6 @@ ${
contextMenu.addEventListener("popupshowing", () => { // Close the results pane, because paste and go doesn't want a result
// Close the results pane when the input field contextual menu is open, // selection. This has to happen before the menu opens: ending
// because paste and go doesn't want a result selection. // breakout-extend once it's open keeps it from showing (bug 2037468).
- this.view.close(); - this.view.close();
let controller = let controller =
this.document.commandDispatcher.getControllerForCommand("cmd_paste"); this.document.commandDispatcher.getControllerForCommand("cmd_paste");
@@ -4850,7 +4959,11 @@ ${ @@ -5025,7 +5160,11 @@ ${
if (!engineName && !source && !this.hasAttribute("searchmode")) { if (!engineName && !source && !this.hasAttribute("searchmode")) {
return; return;
} }
@@ -258,7 +317,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
if (this._searchModeIndicatorTitle) { if (this._searchModeIndicatorTitle) {
this._searchModeIndicatorTitle.textContent = ""; this._searchModeIndicatorTitle.textContent = "";
this._searchModeIndicatorTitle.removeAttribute("data-l10n-id"); this._searchModeIndicatorTitle.removeAttribute("data-l10n-id");
@@ -5149,6 +5262,7 @@ ${ @@ -5335,6 +5474,7 @@ ${
this.document.l10n.setAttributes( this.document.l10n.setAttributes(
this.inputField, this.inputField,
@@ -266,10 +325,10 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
l10nId, l10nId,
l10nId == "urlbar-placeholder-with-name" l10nId == "urlbar-placeholder-with-name"
? { name: engineName } ? { name: engineName }
@@ -5199,6 +5313,12 @@ ${ @@ -5385,6 +5525,12 @@ ${
} }
lazy.logger.debug("Blur Event"); logger().debug("Blur Event");
+ if ( + if (
+ this.document.commandDispatcher.focusedElement == this.inputField && + this.document.commandDispatcher.focusedElement == this.inputField &&
+ !UrlbarPrefs.get("closeOnWindowBlur") + !UrlbarPrefs.get("closeOnWindowBlur")
@@ -279,7 +338,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
// We cannot count every blur events after a missed engagement as abandoment // We cannot count every blur events after a missed engagement as abandoment
// because the user may have clicked on some view element that executes // because the user may have clicked on some view element that executes
// a command causing a focus change. For example opening preferences from // a command causing a focus change. For example opening preferences from
@@ -5276,6 +5396,11 @@ ${ @@ -5464,6 +5610,11 @@ ${
} }
_on_click(event) { _on_click(event) {
@@ -291,7 +350,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
switch (event.target) { switch (event.target) {
case this.inputField: case this.inputField:
case this._inputContainer: case this._inputContainer:
@@ -5371,10 +5496,11 @@ ${ @@ -5558,10 +5709,11 @@ ${
} }
if (untrim) { if (untrim) {
this.setValue(this._untrimmedValue); this.setValue(this._untrimmedValue);
@@ -304,7 +363,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
this.view.autoOpen({ event }); this.view.autoOpen({ event });
} else { } else {
if (this._untrimOnFocusAfterKeydown) { if (this._untrimOnFocusAfterKeydown) {
@@ -5414,9 +5540,16 @@ ${ @@ -5605,9 +5757,16 @@ ${
} }
_on_mousedown(event) { _on_mousedown(event) {
@@ -322,7 +381,7 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
if ( if (
event.composedTarget != this.inputField && event.composedTarget != this.inputField &&
event.composedTarget != this._inputContainer event.composedTarget != this._inputContainer
@@ -5426,6 +5559,10 @@ ${ @@ -5617,6 +5776,10 @@ ${
this.focusedViaMousedown = !this.focused; this.focusedViaMousedown = !this.focused;
this.#preventClickSelectsAll = this.focused; this.#preventClickSelectsAll = this.focused;
@@ -333,16 +392,16 @@ index 319fb6870ec18d87b9f1263bd960edaa39b0447c..554cc90fb2307450ddc68033968cefd1
// Keep the focus status, since the attribute may be changed // Keep the focus status, since the attribute may be changed
// upon calling this.focus(). // upon calling this.focus().
@@ -5463,7 +5600,7 @@ ${ @@ -5654,7 +5817,7 @@ ${
// view open on tab switch, and the TabSelect event arrived earlier. // view open on tab switch, and the TabSelect event arrived earlier.
// Also ignore mousedown on the urlbarView context menu: opening/closing the // Also ignore mousedown on the urlbarView context menu: opening/closing the
// view is already handled by the result opening flow. // 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")) {
+ 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; break;
} }
@@ -5754,7 +5891,7 @@ ${ @@ -5948,7 +6111,7 @@ ${
// When we are in actions search mode we can show more results so // When we are in actions search mode we can show more results so
// increase the limit. // increase the limit.
let maxResults = let maxResults =
@@ -1,8 +1,8 @@
diff --git a/browser/components/urlbar/content/UrlbarShared.mjs b/browser/components/urlbar/content/UrlbarShared.mjs diff --git a/browser/components/urlbar/content/UrlbarShared.mjs b/browser/components/urlbar/content/UrlbarShared.mjs
index 4e67dad66ae006842abc6eed547e4a244320d57a..393b61b4d2543c73e60afd334a353f36119ae73e 100644 index 0ac5330223c84fbb98880a5c2d83ae58a8f3079e..ff488cf5a2c8b7857a8e145e40aaf861cfa655ec 100644
--- a/browser/components/urlbar/content/UrlbarShared.mjs --- a/browser/components/urlbar/content/UrlbarShared.mjs
+++ b/browser/components/urlbar/content/UrlbarShared.mjs +++ b/browser/components/urlbar/content/UrlbarShared.mjs
@@ -100,6 +100,7 @@ export const UrlbarShared = { @@ -158,6 +158,7 @@ export const UrlbarShared = {
// `looksLikeOrigin()` returned `LOOKS_LIKE_ORIGIN.OTHER` for this token. // `looksLikeOrigin()` returned `LOOKS_LIKE_ORIGIN.OTHER` for this token.
// It may or may not be an origin. // It may or may not be an origin.
POSSIBLE_ORIGIN_BUT_SEARCH_ALLOWED: 12, POSSIBLE_ORIGIN_BUT_SEARCH_ALLOWED: 12,
@@ -10,7 +10,7 @@ index 4e67dad66ae006842abc6eed547e4a244320d57a..393b61b4d2543c73e60afd334a353f36
}), }),
/** /**
@@ -120,6 +121,7 @@ export const UrlbarShared = { @@ -178,6 +179,7 @@ export const UrlbarShared = {
TITLE: "#", TITLE: "#",
URL: "$", URL: "$",
ACTION: ">", ACTION: ">",
@@ -18,7 +18,7 @@ index 4e67dad66ae006842abc6eed547e4a244320d57a..393b61b4d2543c73e60afd334a353f36
}), }),
// Defines UrlbarResult types. // Defines UrlbarResult types.
@@ -165,6 +167,8 @@ export const UrlbarShared = { @@ -223,6 +225,8 @@ export const UrlbarShared = {
OTHER_NETWORK: 6, OTHER_NETWORK: 6,
ADDON: 7, ADDON: 7,
ACTIONS: 8, ACTIONS: 8,
@@ -27,7 +27,7 @@ index 4e67dad66ae006842abc6eed547e4a244320d57a..393b61b4d2543c73e60afd334a353f36
}), }),
// Results are categorized into groups to help the muxer compose them. See // Results are categorized into groups to help the muxer compose them. See
@@ -200,6 +204,8 @@ export const UrlbarShared = { @@ -258,6 +262,8 @@ export const UrlbarShared = {
SEMANTIC_HISTORY: "semanticHistory", SEMANTIC_HISTORY: "semanticHistory",
SUGGESTED_INDEX: "suggestedIndex", SUGGESTED_INDEX: "suggestedIndex",
TAIL_SUGGESTION: "tailSuggestion", TAIL_SUGGESTION: "tailSuggestion",
@@ -36,7 +36,7 @@ index 4e67dad66ae006842abc6eed547e4a244320d57a..393b61b4d2543c73e60afd334a353f36
}), }),
// Defines provider types. // Defines provider types.
@@ -385,6 +391,14 @@ export const UrlbarShared = { @@ -443,6 +449,14 @@ export const UrlbarShared = {
telemetryLabel: "actions", telemetryLabel: "actions",
uiLabel: "urlbar-searchmode-actions3", uiLabel: "urlbar-searchmode-actions3",
}, },
@@ -51,7 +51,7 @@ index 4e67dad66ae006842abc6eed547e4a244320d57a..393b61b4d2543c73e60afd334a353f36
]); ]);
}, },
@@ -402,6 +416,7 @@ export const UrlbarShared = { @@ -460,6 +474,7 @@ export const UrlbarShared = {
if (UrlbarPrefs.get("scotchBonnet.enableOverride")) { if (UrlbarPrefs.get("scotchBonnet.enableOverride")) {
keys.push(this.RESTRICT_TOKENS.ACTION); keys.push(this.RESTRICT_TOKENS.ACTION);
} }
@@ -59,3 +59,23 @@ index 4e67dad66ae006842abc6eed547e4a244320d57a..393b61b4d2543c73e60afd334a353f36
return new Set(keys); 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;
@@ -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);
}
@@ -1,10 +1,10 @@
diff --git a/browser/modules/ExtensionsUI.sys.mjs b/browser/modules/ExtensionsUI.sys.mjs diff --git a/browser/modules/ExtensionsUI.sys.mjs b/browser/modules/ExtensionsUI.sys.mjs
index 95a4b6e40bd568c3ea5003b648b0acbf96bbb725..6ab8a658721aa6470d482dc958e4b3ac78f49f44 100644 index 73ef024602cb4554a024de4ddef83f492adc33ef..959c3403a48a3e4294ad5d2f72bad0e5d4fbfd75 100644
--- a/browser/modules/ExtensionsUI.sys.mjs --- a/browser/modules/ExtensionsUI.sys.mjs
+++ b/browser/modules/ExtensionsUI.sys.mjs +++ b/browser/modules/ExtensionsUI.sys.mjs
@@ -502,7 +502,7 @@ export var ExtensionsUI = { @@ -507,7 +507,7 @@ export var ExtensionsUI = {
eventCallback, // right after the panel opens can't accidentally grant permissions).
removeOnDismissal: true, autofocus: true,
popupOptions: { popupOptions: {
- position: "bottomright topright", - position: "bottomright topright",
+ position: window.gZenUIManager.panelUIPosition(), + position: window.gZenUIManager.panelUIPosition(),
@@ -1,8 +1,8 @@
diff --git a/browser/themes/shared/tabbrowser/content-area.css b/browser/themes/shared/tabbrowser/content-area.css diff --git a/browser/themes/shared/tabbrowser/content-area.css b/browser/themes/shared/tabbrowser/content-area.css
index 2374ed38bd9361d6c7e1886117099c6761e403b8..72f1f52a13096f19ca4009037ad0cdc880775ff7 100644 index 86400b643c8b2af4207d226fbd6d91e5e74548b9..3044e4ab87b7ebcfaa2ac624680da1cc5653c861 100644
--- a/browser/themes/shared/tabbrowser/content-area.css --- a/browser/themes/shared/tabbrowser/content-area.css
+++ b/browser/themes/shared/tabbrowser/content-area.css +++ b/browser/themes/shared/tabbrowser/content-area.css
@@ -239,7 +239,6 @@ @@ -166,7 +166,6 @@
min-width: 0; min-width: 0;
/* We want to be able to show the frame color behind the clipped radiused corner */ /* We want to be able to show the frame color behind the clipped radiused corner */
@@ -10,7 +10,7 @@ index 2374ed38bd9361d6c7e1886117099c6761e403b8..72f1f52a13096f19ca4009037ad0cdc8
display: grid; display: grid;
/** /**
@@ -425,7 +424,6 @@ @@ -355,7 +354,6 @@
} }
browser:is([blank], [pendingpaint]) { browser:is([blank], [pendingpaint]) {
@@ -18,21 +18,21 @@ index 2374ed38bd9361d6c7e1886117099c6761e403b8..72f1f52a13096f19ca4009037ad0cdc8
} }
/* Exclude browsers with smartwindow-content attribute which inherit /* Exclude browsers with smartwindow-content attribute which inherit
@@ -865,7 +863,7 @@ split-view-footer { @@ -735,7 +733,7 @@ split-view-footer {
.dialogStack { .dialogStack {
z-index: var(--browser-stack-z-index-dialog-stack); z-index: var(--browser-stack-z-index-dialog-stack);
- position: absolute; - position: absolute;
+ position: fixed; + position: fixed;
inset: 0;
/* --browser-with-dialog set on browser[tabDialogShowing], we want to position the overlay /* --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 */ only on the top of the <browser> element so it doesn't overlap the DevTools toolbox */
@@ -1034,7 +1032,7 @@ split-view-footer { @@ -909,7 +907,7 @@ split-view-footer {
.dialogOverlay[topmost="true"], .dialogOverlay[topmost="true"],
#window-modal-dialog::backdrop { #window-modal-dialog::backdrop {
- background-color: var(--background-color-overlay); - background-color: var(--background-color-overlay);
+ background-color: light-dark(rgba(255, 255, 255, .3), rgba(0, 0, 0, .3)); + background-color: light-dark(rgba(255, 255, 255, .3), rgba(0, 0, 0, .3));
border-radius: var(--chrome-block-radius); }
.browserSidebarContainer.responsive-mode & { .dialogOverlay[hideContent="true"][topmost="true"] {
@@ -1,5 +1,5 @@
diff --git a/browser/themes/shared/toolbarbuttons.css b/browser/themes/shared/toolbarbuttons.css diff --git a/browser/themes/shared/toolbarbuttons.css b/browser/themes/shared/toolbarbuttons.css
index 94b1a2a841d8fd47a491616d52e5bf544f0c0bf9..9e98266b98c6b66fed26fec12fa3391fc5fcc79b 100644 index bbf906c7bf1d6f0d71744953aeeb750c5181639a..dd116e22c38dc376c9c6b34dfa569bf4661a8971 100644
--- a/browser/themes/shared/toolbarbuttons.css --- a/browser/themes/shared/toolbarbuttons.css
+++ b/browser/themes/shared/toolbarbuttons.css +++ b/browser/themes/shared/toolbarbuttons.css
@@ -13,20 +13,6 @@ @@ -13,20 +13,6 @@
@@ -23,7 +23,7 @@ index 94b1a2a841d8fd47a491616d52e5bf544f0c0bf9..9e98266b98c6b66fed26fec12fa3391f
&:where([uidensity="compact"]) { &:where([uidensity="compact"]) {
--toolbarbutton-padding-inner: var(--toolbarbutton-padding-inner-compact); --toolbarbutton-padding-inner: var(--toolbarbutton-padding-inner-compact);
--bookmark-block-padding: 1px; --bookmark-block-padding: 1px;
@@ -123,9 +109,7 @@ @@ -119,9 +105,7 @@
#TabsToolbar { #TabsToolbar {
/* Override the inner padding to ensure the dimensions match the tabs, but also making sure /* 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. */ different types of buttons (combined-buttons-dropmarker or text) still look correct. */
@@ -33,18 +33,16 @@ index 94b1a2a841d8fd47a491616d52e5bf544f0c0bf9..9e98266b98c6b66fed26fec12fa3391f
} }
/* Primary toolbar buttons */ /* Primary toolbar buttons */
@@ -205,8 +189,8 @@ toolbar .toolbarbutton-1 { @@ -174,7 +158,7 @@
> .toolbarbutton-icon { toolbar .toolbarbutton-1 {
/* horizontal padding + actual icon width */ /* horizontal padding + actual icon width */
- width: calc(2 * var(--toolbarbutton-padding-inner) + 16px); - --toolbarbutton-icon-size: calc(2 * var(--toolbarbutton-padding-inner) + 16px);
- height: calc(2 * var(--toolbarbutton-padding-inner) + 16px); + --toolbarbutton-icon-size: calc(2 * var(--toolbarbutton-padding-inner) + var(--zen-toolbar-button-size, 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));
}
> .toolbarbutton-text { appearance: none;
@@ -216,7 +200,7 @@ toolbar .toolbarbutton-1 { margin: 0;
@@ -214,7 +198,7 @@ toolbar .toolbarbutton-1 {
* height as the button icons and the same vertical padding, but as a minimum, * height as the button icons and the same vertical padding, but as a minimum,
* because otherwise an increase in text sizes would break things. * because otherwise an increase in text sizes would break things.
*/ */
@@ -62,7 +60,7 @@ index 94b1a2a841d8fd47a491616d52e5bf544f0c0bf9..9e98266b98c6b66fed26fec12fa3391f
display: none; display: none;
} }
@@ -536,7 +520,7 @@ toolbarbutton.bookmark-item:not(.subviewbutton) { @@ -427,7 +411,7 @@ toolbarbutton.bookmark-item:not(.subviewbutton) {
*/ */
align-items: stretch; align-items: stretch;
> .toolbarbutton-icon { > .toolbarbutton-icon {
@@ -1,8 +1,8 @@
diff --git a/browser/themes/shared/urlbar-searchbar.css b/browser/themes/shared/urlbar-searchbar.css diff --git a/browser/themes/shared/urlbar.css b/browser/themes/shared/urlbar.css
index 149f123e26cd79e89432dfeb504ca7218ee04810..7e0e6d981d6c2aa53bc2a76d82d2078419659065 100644 index 06183c82e2869290a5fb476c47fb7db92bbef57f..c64cde1eef50d3457fb1c540d95fe3b8aa087294 100644
--- a/browser/themes/shared/urlbar-searchbar.css --- a/browser/themes/shared/urlbar.css
+++ b/browser/themes/shared/urlbar-searchbar.css +++ b/browser/themes/shared/urlbar.css
@@ -19,8 +19,8 @@ @@ -24,8 +24,8 @@
@media not -moz-pref("browser.nova.enabled") { @media not -moz-pref("browser.nova.enabled") {
--urlbar-basic-component-size: calc(var(--urlbar-height) - 2 * (var(--urlbar-input-container-border-width) + var(--urlbar-input-container-padding))); --urlbar-basic-component-size: calc(var(--urlbar-height) - 2 * (var(--urlbar-input-container-border-width) + var(--urlbar-input-container-padding)));
@@ -13,7 +13,7 @@ index 149f123e26cd79e89432dfeb504ca7218ee04810..7e0e6d981d6c2aa53bc2a76d82d20784
} }
@media (max-width: 770px) { @media (max-width: 770px) {
--urlbar-container-min-width: 240px; --urlbar-container-min-width: 240px;
@@ -127,7 +127,7 @@ toolbar[inactive="true"] .urlbar, @@ -143,7 +143,7 @@ toolbar[inactive="true"] .urlbar,
.urlbar:not([usertyping]) > .urlbar-input-container > .urlbar-go-button, .urlbar:not([usertyping]) > .urlbar-input-container > .urlbar-go-button,
.urlbar:not(#searchbar-new, [focused]) > .urlbar-input-container > .urlbar-go-button, .urlbar:not(#searchbar-new, [focused]) > .urlbar-input-container > .urlbar-go-button,
#urlbar-revert-button-container { #urlbar-revert-button-container {
@@ -22,7 +22,7 @@ index 149f123e26cd79e89432dfeb504ca7218ee04810..7e0e6d981d6c2aa53bc2a76d82d20784
} }
/* Document Picture-in-Picture API window */ /* Document Picture-in-Picture API window */
@@ -405,6 +405,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 > & { .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)); mask-image: linear-gradient(to right, transparent var(--urlbar-scheme-size), black calc(var(--urlbar-scheme-size) + 3ch));
} }
@@ -33,7 +33,7 @@ index 149f123e26cd79e89432dfeb504ca7218ee04810..7e0e6d981d6c2aa53bc2a76d82d20784
} }
#urlbar-scheme { #urlbar-scheme {
@@ -476,10 +480,15 @@ toolbar[inactive="true"] .urlbar, @@ -505,10 +509,15 @@ toolbar[inactive="true"] .urlbar,
} }
.urlbar[breakout][breakout-extend] { .urlbar[breakout][breakout-extend] {
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: &apos;&lt;number&gt;&apos;; initial-value: 1; inherits: false; }
@property --zen-circle-anim { syntax: &apos;&lt;number&gt;&apos;; 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>
@@ -143,6 +143,7 @@
* skin/classic/browser/zen-icons/tracking-protection.svg (../shared/zen-icons/nucleo/tracking-protection.svg) * 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/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/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/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-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) * skin/classic/browser/zen-icons/video-fill.svg (../shared/zen-icons/nucleo/video-fill.svg)
@@ -294,6 +295,7 @@
* skin/classic/browser/zen-icons/tracking-protection.svg (../shared/zen-icons/nucleo/tracking-protection.svg) * 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/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/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/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-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) * skin/classic/browser/zen-icons/video-fill.svg (../shared/zen-icons/nucleo/video-fill.svg)
@@ -445,6 +447,7 @@
* skin/classic/browser/zen-icons/tracking-protection.svg (../shared/zen-icons/nucleo/tracking-protection.svg) * 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/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/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/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-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) * skin/classic/browser/zen-icons/video-fill.svg (../shared/zen-icons/nucleo/video-fill.svg)
@@ -543,4 +546,11 @@
* skin/classic/browser/zen-icons/selectable/warning.svg (../shared/zen-icons/common/selectable/warning.svg) * 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/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/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) 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 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 "Working on $filename"
echo "* skin/classic/browser/zen-icons/selectable/$filename (../shared/zen-icons/common/selectable/$filename) " >> jar.inc.mn echo "* skin/classic/browser/zen-icons/selectable/$filename (../shared/zen-icons/common/selectable/$filename) " >> jar.inc.mn
done 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 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 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 --- a/build/moz.configure/lto-pgo.configure
+++ b/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): @@ -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", 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( use_fat_lto = cxx_compiler.try_link(
ldflags=depends(stlport_libs)( ldflags=depends(stlport_libs)(
@@ -1,173 +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,11 +2165,12 @@
texture_cache_config,
reject_software_rasterizer,
low_quality_pinch_zoom,
max_shared_surface_size,
enable_dithering,
enable_shared_instance_buffer,
+ opaque_backdrop_fallback,
..Default::default()
};
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,10 +279,11 @@
enable_instancing: true,
enable_shared_instance_buffer: false,
reject_software_rasterizer: false,
low_quality_pinch_zoom: false,
max_shared_surface_size: 2048,
enable_debugger: true,
+ opaque_backdrop_fallback: false,
}
}
}
@@ -802,11 +805,12 @@
allocated_native_surfaces: FastHashSet::default(),
debug_overlay_state: DebugOverlayState::new(),
buffer_damage_tracker: BufferDamageTracker::default(),
max_primitive_instance_count,
enable_instancing: options.enable_instancing,
use_shared_instance_buffer,
+ opaque_backdrop_fallback: options.opaque_backdrop_fallback,
consecutive_oom_frames: 0,
target_frame_publish_id: None,
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,13 +867,15 @@
buffer_damage_tracker: BufferDamageTracker,
max_primitive_instance_count: usize,
enable_instancing: bool,
/// If true, stream instance data into large buffers shared by multiple
/// draws, rather than allocating a new instance buffer for each draw.
use_shared_instance_buffer: bool,
+ opaque_backdrop_fallback: bool,
+
/// 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(
@@ -1,168 +0,0 @@
diff --git a/browser/components/sessionstore/test/browser.toml b/browser/components/sessionstore/test/browser.toml
--- a/browser/components/sessionstore/test/browser.toml
+++ b/browser/components/sessionstore/test/browser.toml
@@ -14,10 +14,12 @@
"browser_frame_history_c.html",
"browser_frame_history_c1.html",
"browser_frame_history_c2.html",
"browser_formdata_format_sample.html",
"browser_sessionHistory_slow.sjs",
+ "browser_policy_container_sample.html",
+ "browser_policy_container_sample_frame.html",
"browser_scrollPositions_sample.html",
"browser_scrollPositions_sample2.html",
"browser_scrollPositions_sample_frameset.html",
"browser_scrollPositions_readerModeArticle.html",
"browser_sessionStorage.html",
@@ -226,10 +228,12 @@
["browser_pinned_tabs.js"]
skip-if = [
"ccov", # Bug 1625525
]
+["browser_policy_container_not_stored.js"]
+
["browser_privatetabs.js"]
["browser_purge_domaindata.js"]
["browser_purge_shistory.js"]
diff --git a/browser/components/sessionstore/test/browser_policy_container_not_stored.js b/browser/components/sessionstore/test/browser_policy_container_not_stored.js
new file mode 100644
--- /dev/null
+++ b/browser/components/sessionstore/test/browser_policy_container_not_stored.js
@@ -0,0 +1,51 @@
+/* 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";
+
+/**
+ * A session history entry only needs to retain the policy container for loads
+ * that inherit their policies (about:blank, about:srcdoc, blob:, data:, ...).
+ * Anything fetched over the network gets its policies from the response again,
+ * so storing them would only bloat the session store (bug 2011236).
+ */
+
+const TEST_ROOT = getRootDirectory(gTestPath).replace(
+ "chrome://mochitests/content",
+ "https://example.com"
+);
+const PARENT_URL = TEST_ROOT + "browser_policy_container_sample.html";
+const FRAME_URL = TEST_ROOT + "browser_policy_container_sample_frame.html";
+
+add_task(async function test_policy_container_only_for_inheriting_loads() {
+ const tab = BrowserTestUtils.addTab(gBrowser, PARENT_URL);
+ gBrowser.selectedTab = tab;
+ await promiseBrowserLoaded(tab.linkedBrowser, true, PARENT_URL);
+ await TabStateFlusher.flush(tab.linkedBrowser);
+
+ const state = JSON.parse(ss.getTabState(tab));
+ const topEntry = state.entries.at(-1);
+ is(topEntry.url, PARENT_URL, "collected the parent entry");
+
+ const children = topEntry.children ?? [];
+ const networkFrame = children.find(child => child.url === FRAME_URL);
+ const blankFrame = children.find(child => child.url === "about:blank");
+
+ ok(networkFrame, "collected the network-scheme subframe entry");
+ ok(blankFrame, "collected the about:blank subframe entry");
+
+ // The parent has a CSP, so both subframes inherit a policy container onto
+ // their load state. Only the one that cannot recover it from a response
+ // should keep it in session history.
+ ok(
+ !("policyContainer" in networkFrame),
+ "https subframe entry does not store a policyContainer"
+ );
+ ok(
+ "policyContainer" in blankFrame,
+ "about:blank subframe entry still stores its inherited policyContainer"
+ );
+
+ await BrowserTestUtils.removeTab(tab);
+});
diff --git a/browser/components/sessionstore/test/browser_policy_container_sample.html b/browser/components/sessionstore/test/browser_policy_container_sample.html
new file mode 100644
--- /dev/null
+++ b/browser/components/sessionstore/test/browser_policy_container_sample.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <meta http-equiv="Content-Security-Policy" content="default-src * data: blob: 'unsafe-inline'">
+ <title>policyContainer session store sample</title>
+</head>
+<body>
+ <iframe id="network" src="browser_policy_container_sample_frame.html"></iframe>
+ <iframe id="blank" src="about:blank"></iframe>
+</body>
+</html>
diff --git a/browser/components/sessionstore/test/browser_policy_container_sample_frame.html b/browser/components/sessionstore/test/browser_policy_container_sample_frame.html
new file mode 100644
--- /dev/null
+++ b/browser/components/sessionstore/test/browser_policy_container_sample_frame.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>policyContainer session store sample frame</title>
+</head>
+<body>
+ frame
+</body>
+</html>
diff --git a/docshell/shistory/SessionHistoryEntry.cpp b/docshell/shistory/SessionHistoryEntry.cpp
--- a/docshell/shistory/SessionHistoryEntry.cpp
+++ b/docshell/shistory/SessionHistoryEntry.cpp
@@ -41,10 +41,18 @@
extern mozilla::LazyLogModule gSHLog;
namespace mozilla {
namespace dom {
+// Only store policy container for loads that can't carry it themselves
+// (about:blank, about:srcdoc, blob:, data:, ...)
+// bug 1867137, bug 2011236
+static nsIPolicyContainer* PolicyContainerToStore(
+ nsIURI* aURI, nsIPolicyContainer* aPolicyContainer) {
+ return CSP_ShouldURIInheritCSP(aURI) ? aPolicyContainer : nullptr;
+}
+
SessionHistoryInfo::SessionHistoryInfo(nsDocShellLoadState* aLoadState,
nsIChannel* aChannel)
: mURI(aLoadState->URI()),
mOriginalURI(aLoadState->OriginalURI()),
mResultPrincipalURI(aLoadState->ResultPrincipalURI()),
@@ -59,11 +67,12 @@
mLoadReplace(aLoadState->LoadReplace()),
mHasUserActivation(aLoadState->HasValidUserGestureActivation()),
mSharedState(SharedState::Create(
aLoadState->TriggeringPrincipal(), aLoadState->PrincipalToInherit(),
aLoadState->PartitionedPrincipalToInherit(),
- aLoadState->PolicyContainer(),
+ PolicyContainerToStore(aLoadState->URI(),
+ aLoadState->PolicyContainer()),
/* FIXME Is this correct? */
aLoadState->TypeHint())) {
MOZ_DIAGNOSTIC_ASSERT(!mURI->SchemeIs("javascript"));
// Pull the upload stream off of the channel instead of the load state, as
@@ -124,11 +133,12 @@
loadInfo->GetPrincipalToInherit(
getter_AddRefs(mSharedState.Get()->mPrincipalToInherit));
mSharedState.Get()->mPartitionedPrincipalToInherit =
aPartitionedPrincipalToInherit;
- mSharedState.Get()->mPolicyContainer = aPolicyContainer;
+ mSharedState.Get()->mPolicyContainer =
+ PolicyContainerToStore(mURI, aPolicyContainer);
aChannel->GetContentType(mSharedState.Get()->mContentType);
aChannel->GetOriginalURI(getter_AddRefs(mOriginalURI));
uint32_t loadFlags;
aChannel->GetLoadFlags(&loadFlags);
File diff suppressed because it is too large Load Diff
@@ -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 diff --git a/toolkit/themes/shared/global-shared.css b/toolkit/themes/shared/global-shared.css
--- a/toolkit/themes/shared/global-shared.css --- a/toolkit/themes/shared/global-shared.css
+++ b/toolkit/themes/shared/global-shared.css +++ b/toolkit/themes/shared/global-shared.css
@@ -80,11 +80,10 @@ @@ -80,10 +80,9 @@
background-color: transparent; background-color: transparent;
--panel-background: transparent;
--panel-box-shadow: none; --panel-box-shadow: none;
--panel-border-color: transparent; --panel-border-color: transparent;
--panel-box-shadow-margin: 0px; --panel-box-shadow-margin: 0px;
+8 -13
View File
@@ -8,10 +8,14 @@
"name": "Native MacOS popovers fix" "name": "Native MacOS popovers fix"
}, },
{ {
"type": "local", "type": "phabricator",
// TODO: Convert into https://phabricator.services.mozilla.com/D298079 "id": "D323933",
// once it gets accepted. "name": "Issue 15123"
"path": "firefox/allow_backdrop_to_work_on_transparency.patch" },
{
"type": "phabricator",
"id": "D327914",
"name": "Backdrop filter reads web content"
}, },
{ {
"type": "local", "type": "local",
@@ -41,20 +45,11 @@
" jsonLengthHint,": " lengthHint: jsonLengthHint," " jsonLengthHint,": " lengthHint: jsonLengthHint,"
} }
}, },
{
"type": "phabricator",
"id": "D320897",
"name": "Bug 2011236"
},
{ {
"type": "phabricator", "type": "phabricator",
"id": "D321446", "id": "D321446",
"name": "Issue 14710" "name": "Issue 14710"
}, },
{
"type": "local",
"path": "firefox/css_corner_shape_rendering.patch"
},
{ {
"type": "local", "type": "local",
"path": "firefox/override_cert_checks_temp.patch" "path": "firefox/override_cert_checks_temp.patch"
@@ -1,8 +1,8 @@
diff --git a/layout/painting/nsImageRenderer.cpp b/layout/painting/nsImageRenderer.cpp 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 --- a/layout/painting/nsImageRenderer.cpp
+++ b/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())) { if (NS_WARN_IF(!XRE_IsParentProcess())) {
return nullptr; return nullptr;
} }
@@ -11,7 +11,7 @@ index 6e464b48c90174b8954aad8a79bae30a7a30cbc9..9ea9a4963ceae679f092e014ac24a0d2
auto key = std::make_tuple(aName, aScale, fg); auto key = std::make_tuple(aName, aScale, fg);
auto* cache = aFrame->GetOrCreateDeletableProperty(SymbolicImageCacheProp()); auto* cache = aFrame->GetOrCreateDeletableProperty(SymbolicImageCacheProp());
auto lookup = cache->Lookup(key); 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: { case StyleImage::Tag::Gradient: {
nsCSSGradientRenderer renderer = nsCSSGradientRenderer::Create( nsCSSGradientRenderer renderer = nsCSSGradientRenderer::Create(
@@ -20,7 +20,7 @@ index 6e464b48c90174b8954aad8a79bae30a7a30cbc9..9ea9a4963ceae679f092e014ac24a0d2
renderer.Paint(*ctx, aDest, aFill, aRepeatSize, aSrc, aDirtyRect, renderer.Paint(*ctx, aDest, aFill, aRepeatSize, aSrc, aDirtyRect,
aOpacity); aOpacity);
@@ -652,7 +652,7 @@ ImgDrawResult nsImageRenderer::BuildWebRenderDisplayItems( @@ -657,7 +657,7 @@ ImgDrawResult nsImageRenderer::BuildWebRenderDisplayItems(
switch (mType) { switch (mType) {
case StyleImage::Tag::Gradient: { case StyleImage::Tag::Gradient: {
nsCSSGradientRenderer renderer = nsCSSGradientRenderer::Create( nsCSSGradientRenderer renderer = nsCSSGradientRenderer::Create(
@@ -29,16 +29,16 @@ index 6e464b48c90174b8954aad8a79bae30a7a30cbc9..9ea9a4963ceae679f092e014ac24a0d2
renderer.BuildWebRenderDisplayItems(aBuilder, aSc, aDest, aFill, renderer.BuildWebRenderDisplayItems(aBuilder, aSc, aDest, aFill,
aRepeatSize, aSrc, aRepeatSize, aSrc,
@@ -678,6 +678,8 @@ ImgDrawResult nsImageRenderer::BuildWebRenderDisplayItems( @@ -679,6 +679,8 @@ ImgDrawResult nsImageRenderer::BuildWebRenderDisplayItems(
nsPresContext::AppUnitsToIntCSSPixels(aDest.height)}; }
SVGImageContext svgContext(Some(destCSSSize)); SVGImageContext svgContext(Some(CSSSize::FromAppUnits(aDest.Size())));
+ SVGImageContext::MaybeStoreZenBoosts(svgContext, + SVGImageContext::MaybeStoreZenBoosts(svgContext,
+ *mForFrame->PresContext()); + *mForFrame->PresContext());
Maybe<ImageIntRegion> region; Maybe<ImageIntRegion> region;
const int32_t appUnitsPerDevPixel = aPresContext->AppUnitsPerDevPixel(); 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()) { if (mImage->IsGradient()) {
nsCSSGradientRenderer renderer = nsCSSGradientRenderer::Create( nsCSSGradientRenderer renderer = nsCSSGradientRenderer::Create(
+4 -4
View File
@@ -1,8 +1,8 @@
diff --git a/layout/svg/SVGGradientFrame.cpp b/layout/svg/SVGGradientFrame.cpp 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 --- a/layout/svg/SVGGradientFrame.cpp
+++ b/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( SVGColorStopInterpolator(
gfxPattern* aGradient, const nsTArray<ColorStop>& aStops, gfxPattern* aGradient, const nsTArray<ColorStop>& aStops,
const StyleColorInterpolationMethod& aStyleColorInterpolationMethod, const StyleColorInterpolationMethod& aStyleColorInterpolationMethod,
@@ -14,8 +14,8 @@ index b0d38b0fab01797328af0b1f1f48af8fb5eebe4d..953feffdc96143dc2d8f8e57f8bb4a6a
mGradient(aGradient) {} mGradient(aGradient) {}
void CreateStop(float aPosition, DeviceColor aColor) { void CreateStop(float aPosition, DeviceColor aColor) {
@@ -270,7 +271,8 @@ already_AddRefed<gfxPattern> SVGGradientFrame::GetPaintServerPattern( @@ -269,7 +270,8 @@ already_AddRefed<gfxPattern> SVGGradientFrame::GetPaintServerPattern(
if (nStops == 1 || GradientVectorLengthIsZero()) { if (nStops == 1 || GradientVectorLengthIsZero(gradientUnits)) {
// The gradient paints a single colour, using the stop-color of the last // The gradient paints a single colour, using the stop-color of the last
// gradient step if there are more than one. // gradient step if there are more than one.
- return MakeAndAddRef<gfxPattern>(ToDeviceColor(stops.LastElement().mColor)); - return MakeAndAddRef<gfxPattern>(ToDeviceColor(stops.LastElement().mColor));
+10 -10
View File
@@ -1,5 +1,5 @@
diff --git a/layout/svg/SVGImageContext.h b/layout/svg/SVGImageContext.h diff --git a/layout/svg/SVGImageContext.h b/layout/svg/SVGImageContext.h
index ad833c7c2ee6a4c4984efdb0d59e3576c2d1bc19..36864a34badc0cbfe44d6295798622fd6178f9e3 100644 index 63f3c4926cfdb8b12e9e4a38016fc66f50cf3129..5ba3f2c07f521905a086ee6eea87975d5a3441ec 100644
--- a/layout/svg/SVGImageContext.h --- a/layout/svg/SVGImageContext.h
+++ b/layout/svg/SVGImageContext.h +++ b/layout/svg/SVGImageContext.h
@@ -6,6 +6,7 @@ @@ -6,6 +6,7 @@
@@ -7,10 +7,10 @@ index ad833c7c2ee6a4c4984efdb0d59e3576c2d1bc19..36864a34badc0cbfe44d6295798622fd
#include "Units.h" #include "Units.h"
+#include "nsColor.h" +#include "nsColor.h"
#include "mozilla/Casting.h"
#include "mozilla/Maybe.h" #include "mozilla/Maybe.h"
#include "mozilla/SVGContextPaint.h" #include "mozilla/SVGContextPaint.h"
#include "mozilla/SVGPreserveAspectRatio.h" @@ -64,6 +65,11 @@ class SVGImageContext {
@@ -63,6 +64,11 @@ class SVGImageContext {
nsISVGPaintContext* aPaintContext, nsISVGPaintContext* aPaintContext,
imgIContainer* aImgContainer); imgIContainer* aImgContainer);
@@ -19,10 +19,10 @@ index ad833c7c2ee6a4c4984efdb0d59e3576c2d1bc19..36864a34badc0cbfe44d6295798622fd
+ static void MaybeStoreZenBoosts(SVGImageContext& aContext, + static void MaybeStoreZenBoosts(SVGImageContext& aContext,
+ const nsPresContext& aPresContext); + const nsPresContext& aPresContext);
+ +
const Maybe<CSSIntSize>& GetViewportSize() const { return mViewportSize; } const Maybe<CSSSize>& GetViewportSize() const { return mViewportSize; }
void SetViewportSize(const Maybe<CSSIntSize>& aSize) { void SetViewportSize(const Maybe<CSSSize>& aSize) { mViewportSize = aSize; }
@@ -75,6 +81,21 @@ class SVGImageContext { @@ -74,6 +80,21 @@ class SVGImageContext {
mColorScheme = aScheme; mColorScheme = aScheme;
} }
@@ -44,7 +44,7 @@ index ad833c7c2ee6a4c4984efdb0d59e3576c2d1bc19..36864a34badc0cbfe44d6295798622fd
const Maybe<SVGPreserveAspectRatio>& GetPreserveAspectRatio() const { const Maybe<SVGPreserveAspectRatio>& GetPreserveAspectRatio() const {
return mPreserveAspectRatio; return mPreserveAspectRatio;
} }
@@ -110,7 +131,11 @@ class SVGImageContext { @@ -109,7 +130,11 @@ class SVGImageContext {
return contextPaintIsEqual && mViewportSize == aOther.mViewportSize && return contextPaintIsEqual && mViewportSize == aOther.mViewportSize &&
mPreserveAspectRatio == aOther.mPreserveAspectRatio && mPreserveAspectRatio == aOther.mPreserveAspectRatio &&
mColorScheme == aOther.mColorScheme && mColorScheme == aOther.mColorScheme &&
@@ -56,8 +56,8 @@ index ad833c7c2ee6a4c4984efdb0d59e3576c2d1bc19..36864a34badc0cbfe44d6295798622fd
+ mZenBoostsInverted == aOther.mZenBoostsInverted; + mZenBoostsInverted == aOther.mZenBoostsInverted;
} }
bool operator!=(const SVGImageContext&) const = default; PLDHashNumber Hash() const {
@@ -123,7 +148,8 @@ class SVGImageContext { @@ -120,7 +145,8 @@ class SVGImageContext {
return AddToHash(hash, mViewportSize.map(HashSize).valueOr(0), return AddToHash(hash, mViewportSize.map(HashSize).valueOr(0),
mPreserveAspectRatio.map(HashPAR).valueOr(0), mPreserveAspectRatio.map(HashPAR).valueOr(0),
mColorScheme.map(HashColorScheme).valueOr(0), mColorScheme.map(HashColorScheme).valueOr(0),
@@ -67,7 +67,7 @@ index ad833c7c2ee6a4c4984efdb0d59e3576c2d1bc19..36864a34badc0cbfe44d6295798622fd
} }
private: private:
@@ -156,6 +182,9 @@ class SVGImageContext { @@ -154,6 +180,9 @@ class SVGImageContext {
Maybe<SVGPreserveAspectRatio> mPreserveAspectRatio; Maybe<SVGPreserveAspectRatio> mPreserveAspectRatio;
Maybe<ColorScheme> mColorScheme; Maybe<ColorScheme> mColorScheme;
StyleLinkParameters mLinkParameters; StyleLinkParameters mLinkParameters;
@@ -1,29 +0,0 @@
diff --git a/toolkit/content/widgets/panel-list/panel-list.mjs b/toolkit/content/widgets/panel-list/panel-list.mjs
index 68ad2fafc8b31dfff541cf8381d9b9533e376d1c..fa62fec6bfb33338091fc06d3736fb76fd5c47c4 100644
--- a/toolkit/content/widgets/panel-list/panel-list.mjs
+++ b/toolkit/content/widgets/panel-list/panel-list.mjs
@@ -223,7 +223,12 @@ export class PanelList extends HTMLElement {
this.setAttribute("showing", "true");
// Tell the host element to hide any overflow in case the panel extends off
// the page before the alignment is set.
- hostElement.style.overflow = "hidden";
+ const hostHidesOverflow = !getComputedStyle(hostElement)
+ .overflow.split(" ")
+ .includes("visible");
+ if (!hostHidesOverflow) {
+ hostElement.style.overflow = "hidden";
+ }
// Wait for a layout flush, then find the bounds.
let {
@@ -344,7 +349,9 @@ export class PanelList extends HTMLElement {
// Set the alignments and show the panel.
this.setAttribute("align", align);
this.setAttribute("valign", valign);
- hostElement.style.overflow = "";
+ if (!hostHidesOverflow) {
+ hostElement.style.overflow = "";
+ }
// Decide positioning based on where this panel will be rendered
const offsetParentIsBody =
this.supportsPopover() ||
@@ -1,5 +1,5 @@
diff --git a/toolkit/themes/shared/design-system/dist/tokens-shared.css b/toolkit/themes/shared/design-system/dist/tokens-shared.css diff --git a/toolkit/themes/shared/design-system/dist/tokens-shared.css b/toolkit/themes/shared/design-system/dist/tokens-shared.css
index 63c641f560d4c0ce06b40a652ca99d1c48cd6941..39c81e773a442870763396e68fb57bd336e3625a 100644 index b0f8fa146de335c53e73d46853f45dda9b15cc73..1b7592c0e9ca12fd9d1f8a555633fd39c2efb537 100644
--- a/toolkit/themes/shared/design-system/dist/tokens-shared.css --- a/toolkit/themes/shared/design-system/dist/tokens-shared.css
+++ b/toolkit/themes/shared/design-system/dist/tokens-shared.css +++ b/toolkit/themes/shared/design-system/dist/tokens-shared.css
@@ -7,6 +7,8 @@ @@ -7,6 +7,8 @@
@@ -8,9 +8,9 @@ index 63c641f560d4c0ce06b40a652ca99d1c48cd6941..39c81e773a442870763396e68fb57bd3
+@import url("chrome://browser/content/zen-styles/zen-theme.css"); +@import url("chrome://browser/content/zen-styles/zen-theme.css");
+ +
@layer tokens-foundation { :root,
:root, :host(.anonymous-content-host) {
:host(.anonymous-content-host) { @layer tokens-foundation {
@@ -28,10 +30,10 @@ @@ -28,10 +30,10 @@
--border-color-selected: var(--color-accent-primary); --border-color-selected: var(--color-accent-primary);
--border-color-transparent: transparent; --border-color-transparent: transparent;
+26 -4
View File
@@ -1,16 +1,17 @@
diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm
index 2efd02e4a92433fd29bbfdb707aa81cfec45031e..3b763c3927f07e529c826f8e4f62bc80a324b247 100644 index 887e4c052d5dd2b73d4c2059463529fb4b09dcab..36da18e19018b1b216576c299f938e75093546d3 100644
--- a/widget/cocoa/nsCocoaWindow.mm --- a/widget/cocoa/nsCocoaWindow.mm
+++ b/widget/cocoa/nsCocoaWindow.mm +++ b/widget/cocoa/nsCocoaWindow.mm
@@ -86,6 +86,7 @@ @@ -86,6 +86,8 @@
#include "mozilla/StaticPrefs_gfx.h" #include "mozilla/StaticPrefs_gfx.h"
#include "mozilla/StaticPrefs_ui.h" #include "mozilla/StaticPrefs_ui.h"
#include "mozilla/StaticPrefs_widget.h" #include "mozilla/StaticPrefs_widget.h"
+#include "mozilla/StaticPrefs_zen.h" +#include "mozilla/StaticPrefs_zen.h"
+#include "mozilla/nsZenDragAndDrop.h"
#include "mozilla/WritingModes.h" #include "mozilla/WritingModes.h"
#include "mozilla/dom/Document.h" #include "mozilla/dom/Document.h"
#include "mozilla/layers/CompositorBridgeChild.h" #include "mozilla/layers/CompositorBridgeChild.h"
@@ -1332,6 +1333,110 @@ - (NSRect)_opaqueRectForWindowMoveWhenInTitlebar { @@ -1332,6 +1334,110 @@ - (NSRect)_opaqueRectForWindowMoveWhenInTitlebar {
} }
@end @end
@@ -121,7 +122,28 @@ index 2efd02e4a92433fd29bbfdb707aa81cfec45031e..3b763c3927f07e529c826f8e4f62bc80
void nsCocoaWindow::UpdateWindowDraggingRegion( void nsCocoaWindow::UpdateWindowDraggingRegion(
const LayoutDeviceIntRegion& aRegion) { const LayoutDeviceIntRegion& aRegion) {
// mChildView returns YES from mouseDownCanMoveWindow, so we need to put // mChildView returns YES from mouseDownCanMoveWindow, so we need to put
@@ -4919,6 +5024,10 @@ - (BOOL)wantsBestResolutionOpenGLSurface { @@ -3858,7 +3964,9 @@ - (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender {
// NSDraggingDestination
- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender {
MOZ_LOG(sCocoaLog, LogLevel::Info, ("ChildView draggingUpdated: entered\n"));
- return [self doDragAction:eDragOver sender:sender];
+ NSDragOperation operation = [self doDragAction:eDragOver sender:sender];
+ zen::PrepareDropLanding(sender);
+ return operation;
}
// NSDraggingDestination
@@ -3874,6 +3982,9 @@ - (void)draggingExited:(id<NSDraggingInfo>)sender {
- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
nsAutoRetainCocoaObject kungFuDeathGrip(self);
BOOL handled = [self doDragAction:eDrop sender:sender] != NSDragOperationNone;
+ if (handled) {
+ zen::LandDrop(sender);
+ }
NS_IF_RELEASE(mDragService);
return handled;
}
@@ -4919,6 +5030,10 @@ - (BOOL)wantsBestResolutionOpenGLSurface {
nsCocoaWindow::~nsCocoaWindow() { nsCocoaWindow::~nsCocoaWindow() {
NS_OBJC_BEGIN_TRY_IGNORE_BLOCK; NS_OBJC_BEGIN_TRY_IGNORE_BLOCK;
+110 -1
View File
@@ -1,5 +1,5 @@
diff --git a/widget/cocoa/nsDragService.mm b/widget/cocoa/nsDragService.mm diff --git a/widget/cocoa/nsDragService.mm b/widget/cocoa/nsDragService.mm
index 340a9ad81c5cb23bb7e5f927d11d5cffdde7ce70..32fc707ccfa56fa8c307860868d092c4a9050419 100644 index 340a9ad81c5cb23bb7e5f927d11d5cffdde7ce70..ba597ba4373ba3ace7455ce0859f2339349ffc06 100644
--- a/widget/cocoa/nsDragService.mm --- a/widget/cocoa/nsDragService.mm
+++ b/widget/cocoa/nsDragService.mm +++ b/widget/cocoa/nsDragService.mm
@@ -10,6 +10,7 @@ @@ -10,6 +10,7 @@
@@ -45,3 +45,112 @@ index 340a9ad81c5cb23bb7e5f927d11d5cffdde7ce70..32fc707ccfa56fa8c307860868d092c4
#endif #endif
src += 4; src += 4;
dest += 4; dest += 4;
@@ -249,12 +254,44 @@
[[[NSDraggingItem alloc] initWithPasteboardWriter:pbItem] autorelease];
[dragItem setDraggingFrame:localDragRect contents:image];
+ NSMutableArray* dragItems = [NSMutableArray arrayWithObject:dragItem];
+ auto zenDragAndDrop = zen::nsZenDragAndDrop::GetZenDragAndDropInstance();
+ const nsTArray<nsCOMPtr<nsINode>> noExtraImages;
+ @try {
+ for (const auto& extraImageNode :
+ zenDragAndDrop ? zenDragAndDrop->DragImages() : noExtraImages) {
+ nsCOMPtr<nsINode> mainImage = std::move(mImage);
+ mImage = extraImageNode;
+ NSPoint extraPoint;
+ NSImage* extraImage = ConstructDragImage(mSourceNode, aRegion, &extraPoint);
+ mImage = std::move(mainImage);
+ if (!extraImage) {
+ continue;
+ }
+ NSRect extraRect = extraImage.alignmentRect;
+ extraRect.origin.x = extraPoint.x;
+ extraRect.origin.y = extraPoint.y - extraRect.size.height;
+ NSPasteboardItem* extraPbItem = [[NSPasteboardItem new] autorelease];
+ [extraPbItem setData:[NSData data]
+ forType:[UTIHelper stringFromPboardType:kMozWildcardPboardType]];
+ NSDraggingItem* extraItem = [[[NSDraggingItem alloc]
+ initWithPasteboardWriter:extraPbItem] autorelease];
+ [extraItem setDraggingFrame:extraRect contents:extraImage];
+ [dragItems addObject:extraItem];
+ }
+ } @catch (NSException* e) {
+ dragItems = [NSMutableArray arrayWithObject:dragItem];
+ }
+
OpenDragPopup();
mNSDraggingSession = [mNativeDragView
- beginDraggingSessionWithItems:[NSArray arrayWithObject:dragItem]
+ beginDraggingSessionWithItems:dragItems
event:mNativeDragEvent
source:mNativeDragView];
+ if (dragItems.count > 1) {
+ mNSDraggingSession.draggingFormation = NSDraggingFormationStack;
+ }
mNSDraggingSession.animatesToStartingPositionsOnCancelOrFail =
!mDataTransfer || mDataTransfer->MozShowFailAnimation();
@@ -455,29 +492,44 @@
}
if (pc) {
+ nsPoint pt = LayoutDevicePixel::ToAppUnits(
+ devPoint, pc->DeviceContext()->AppUnitsPerDevPixel());
+ CSSIntPoint screenPoint =
+ CSSIntPoint(nsPresContext::AppUnitsToIntCSSPixels(pt.x),
+ nsPresContext::AppUnitsToIntCSSPixels(pt.y));
+
+ NSMutableArray* images = [NSMutableArray array];
+ NSMutableArray* rects = [NSMutableArray array];
+ auto render = [&]() {
+ LayoutDeviceIntRect newRect;
+ NSImage* image =
+ ConstructDragImage(mSourceNode, Nothing(), screenPoint, &newRect);
+ [images addObject:image ? (id)image : (id)[NSNull null]];
+ [rects addObject:[NSValue valueWithRect:
+ image ? nsCocoaUtils::GeckoRectToCocoaRectDevPix(
+ newRect, scaleFactor)
+ : NSZeroRect]];
+ };
+ render();
+ if (auto zenDragAndDrop = zen::nsZenDragAndDrop::GetZenDragAndDropInstance()) {
+ for (const auto& extraImageNode : zenDragAndDrop->DragImages()) {
+ nsCOMPtr<nsINode> mainImage = std::move(mImage);
+ mImage = extraImageNode;
+ render();
+ mImage = std::move(mainImage);
+ }
+ }
+
void (^changeImageBlock)(NSDraggingItem*, NSInteger, BOOL*) = ^(
NSDraggingItem* draggingItem, NSInteger idx, BOOL* stop) {
- // We never add more than one item right now, but check just in case.
- if (idx > 0) {
+ if ((NSUInteger)idx >= images.count || images[idx] == [NSNull null]) {
return;
}
-
- nsPoint pt = LayoutDevicePixel::ToAppUnits(
- devPoint, pc->DeviceContext()->AppUnitsPerDevPixel());
- CSSIntPoint screenPoint =
- CSSIntPoint(nsPresContext::AppUnitsToIntCSSPixels(pt.x),
- nsPresContext::AppUnitsToIntCSSPixels(pt.y));
-
- // Create a new image; if one isn't returned don't change the current
- // one.
- LayoutDeviceIntRect newRect;
- NSImage* image =
- ConstructDragImage(mSourceNode, Nothing(), screenPoint, &newRect);
- if (image) {
- NSRect draggingRect =
- nsCocoaUtils::GeckoRectToCocoaRectDevPix(newRect, scaleFactor);
- [draggingItem setDraggingFrame:draggingRect contents:image];
+ NSRect frame = [rects[idx] rectValue];
+ if (idx > 0) {
+ frame.origin = draggingItem.draggingFrame.origin;
}
+ [draggingItem setDraggingFrame:frame contents:images[idx]];
};
[mNSDraggingSession
+4 -2
View File
@@ -69,7 +69,9 @@ export class nsZenBoostEditor {
* @returns {ZenBoostsParent} Boost JSActor parent * @returns {ZenBoostsParent} Boost JSActor parent
*/ */
get zenBoostsParent() { get zenBoostsParent() {
const linkedBrowser = this.openerWindow.gBrowser.selectedTab.linkedBrowser; const linkedBrowser =
this.editorWindow.browser ??
this.openerWindow.gBrowser.selectedTab.linkedBrowser;
const actor = const actor =
linkedBrowser.browsingContext.currentWindowGlobal.getActor("ZenBoosts"); linkedBrowser.browsingContext.currentWindowGlobal.getActor("ZenBoosts");
return actor; return actor;
@@ -1521,7 +1523,7 @@ ${cssSelector} {
shuffleBoost() { shuffleBoost() {
const availFonts = this.fetchFontList(); const availFonts = this.fetchFontList();
const commonFonts = this.commonFonts; const commonFonts = this.commonFonts;
let font = commonFonts[Math.round(Math.random() * commonFonts.length)]; let font = commonFonts[Math.floor(Math.random() * commonFonts.length)];
if (availFonts.includes(font)) { if (availFonts.includes(font)) {
this.currentBoostData.fontFamily = font; this.currentBoostData.fontFamily = font;
} }
+41 -13
View File
@@ -606,9 +606,12 @@ class nsZenBoostsManager {
* @param {Window} parentWindow - The parent browser window * @param {Window} parentWindow - The parent browser window
* @param {Boost} boost - The boost which will be edited * @param {Boost} boost - The boost which will be edited
* @param {nsIURI} domainUri - The boost which will be edited * @param {nsIURI} domainUri - The boost which will be edited
* @param {object} [options]
* @param {Element} [options.browser] - Browser showing the site when it is
* not the selected tab, e.g. a detached glance
* @returns {Window|null} The instanced editor window * @returns {Window|null} The instanced editor window
*/ */
openBoostWindow(parentWindow, boost, domainUri) { openBoostWindow(parentWindow, boost, domainUri, { browser = null } = {}) {
if (!this.canBoostSite(domainUri)) { if (!this.canBoostSite(domainUri)) {
console.error( console.error(
"[ZenBoostsManager] Cannot open editor for boost with invalid domain." "[ZenBoostsManager] Cannot open editor for boost with invalid domain."
@@ -648,26 +651,51 @@ class nsZenBoostsManager {
null null
); );
// Close the editor if the tab is switched
parentWindow.gBrowser.tabContainer.addEventListener(
"TabSelect",
editor.close.bind(editor),
{
once: true,
}
);
const progressListener = { const progressListener = {
QueryInterface: ChromeUtils.generateQI([
"nsIWebProgressListener",
"nsISupportsWeakReference",
]),
onLocationChange: webProgress => { onLocationChange: webProgress => {
if (webProgress.isTopLevel) { if (webProgress.isTopLevel) {
editor.close(); editor.close();
parentWindow.gBrowser.removeTabsProgressListener(progressListener);
} }
}, },
}; };
const onTabSelect = editor.close.bind(editor);
if (browser) {
browser.addProgressListener(progressListener);
editor.addEventListener(
"unload",
() => {
browser.removeProgressListener(progressListener);
editor.browser = null;
},
{ once: true }
);
} else {
// Close the editor if the tab is switched or navigates.
parentWindow.gBrowser.tabContainer.addEventListener(
"TabSelect",
onTabSelect,
{ once: true }
);
parentWindow.gBrowser.addProgressListener(progressListener);
editor.addEventListener(
"unload",
() => {
parentWindow.gBrowser.tabContainer.removeEventListener(
"TabSelect",
onTabSelect
);
parentWindow.gBrowser.removeProgressListener(progressListener);
editor.browser = null;
},
{ once: true }
);
}
parentWindow.gBrowser.addProgressListener(progressListener); editor.browser = browser;
// Give the domain // Give the domain
editor.domain = domain; editor.domain = domain;
editor.openerWindow = parentWindow; editor.openerWindow = parentWindow;
+34 -9
View File
@@ -70,8 +70,10 @@ export class ZenBoostsChild extends JSWindowActorChild {
static PREVENTABLE_SET = new Set(ZenBoostsChild.PREVENTABLE_EVENTS); static PREVENTABLE_SET = new Set(ZenBoostsChild.PREVENTABLE_EVENTS);
actorCreated() { handleEvent(event) {
this.#applyBoostForPageIfAvailable(); if (event.type === "DOMDocElementInserted") {
this.#applyBoostForPageIfAvailable();
}
} }
didDestroy() { didDestroy() {
@@ -330,6 +332,22 @@ export class ZenBoostsChild extends JSWindowActorChild {
return this.sendQuery("ZenBoost:GetBoostForDomain", domain); return this.sendQuery("ZenBoost:GetBoostForDomain", domain);
} }
/**
* Sets a synced BrowsingContext field only when its value changes. Every
* setter commits a transaction that is broadcast to the whole browsing
* context group, even when the value is unchanged, so this avoids three
* such broadcasts on every page load that has no boost.
*
* @param {BrowsingContext} browsingContext
* @param {string} field - The synced field name.
* @param {number | boolean} value
*/
#setSyncedField(browsingContext, field, value) {
if (browsingContext[field] !== value) {
browsingContext[field] = value;
}
}
/** /**
* Applies the boost settings for the current page if available. * Applies the boost settings for the current page if available.
* *
@@ -360,7 +378,11 @@ export class ZenBoostsChild extends JSWindowActorChild {
sizeOverride: boostData.sizeOverride, sizeOverride: boostData.sizeOverride,
}); });
browsingContext.isZenBoostsInverted = boostData.smartInvert; this.#setSyncedField(
browsingContext,
"isZenBoostsInverted",
!!boostData.smartInvert
);
if (boostData.enableColorBoost) { if (boostData.enableColorBoost) {
let primaryColor; let primaryColor;
if (boostData.autoTheme) { if (boostData.autoTheme) {
@@ -396,18 +418,21 @@ export class ZenBoostsChild extends JSWindowActorChild {
boostData boostData
); );
} }
browsingContext.zenBoostsData = primaryColor; this.#setSyncedField(browsingContext, "zenBoostsData", primaryColor);
// The complementary accent is derived in the backend by rotating the // The complementary accent is derived in the backend by rotating the
// primary accent's hue by this delta (in degrees). // primary accent's hue by this delta (in degrees).
browsingContext.zenBoostsComplementaryRotation = this.#setSyncedField(
boostData.secondaryDotAngleDegDelta ?? 0; browsingContext,
"zenBoostsComplementaryRotation",
boostData.secondaryDotAngleDegDelta ?? 0
);
return; return;
} }
} else { } else {
browsingContext.isZenBoostsInverted = false; this.#setSyncedField(browsingContext, "isZenBoostsInverted", false);
} }
browsingContext.zenBoostsData = 0; this.#setSyncedField(browsingContext, "zenBoostsData", 0);
browsingContext.zenBoostsComplementaryRotation = 0; this.#setSyncedField(browsingContext, "zenBoostsComplementaryRotation", 0);
} }
/** /**
+1
View File
@@ -28,6 +28,7 @@
"chrome://browser/content/zen-components/ZenEmojiPicker.mjs", "chrome://browser/content/zen-components/ZenEmojiPicker.mjs",
"chrome://browser/content/zen-components/ZenLiveFoldersUI.mjs", "chrome://browser/content/zen-components/ZenLiveFoldersUI.mjs",
"chrome://browser/content/zen-components/ZenDownloadAnimation.mjs", "chrome://browser/content/zen-components/ZenDownloadAnimation.mjs",
"resource:///modules/zen/share/ZenShareManager.mjs",
]; ];
for (let script of scripts) { for (let script of scripts) {
+2 -1
View File
@@ -23,7 +23,7 @@
content/browser/zen-styles/zen-browser-ui.css (../../zen/common/styles/zen-browser-ui.css) content/browser/zen-styles/zen-browser-ui.css (../../zen/common/styles/zen-browser-ui.css)
content/browser/zen-styles/zen-animations.css (../../zen/common/styles/zen-animations.css) content/browser/zen-styles/zen-animations.css (../../zen/common/styles/zen-animations.css)
content/browser/zen-styles/zen-panel-ui.css (../../zen/common/styles/zen-panel-ui.css) content/browser/zen-styles/zen-panel-ui.css (../../zen/common/styles/zen-panel-ui.css)
content/browser/zen-styles/zen-single-components.css (../../zen/common/styles/zen-single-components.css) * content/browser/zen-styles/zen-single-components.css (../../zen/common/styles/zen-single-components.css)
content/browser/zen-styles/zen-sidebar.css (../../zen/common/styles/zen-sidebar.css) content/browser/zen-styles/zen-sidebar.css (../../zen/common/styles/zen-sidebar.css)
* content/browser/zen-styles/zen-toolbar.css (../../zen/common/styles/zen-toolbar.css) * content/browser/zen-styles/zen-toolbar.css (../../zen/common/styles/zen-toolbar.css)
content/browser/zen-styles/zen-browser-container.css (../../zen/common/styles/zen-browser-container.css) content/browser/zen-styles/zen-browser-container.css (../../zen/common/styles/zen-browser-container.css)
@@ -31,6 +31,7 @@
content/browser/zen-styles/zen-popup.css (../../zen/common/styles/zen-popup.css) content/browser/zen-styles/zen-popup.css (../../zen/common/styles/zen-popup.css)
content/browser/zen-styles/zen-branding.css (../../zen/common/styles/zen-branding.css) content/browser/zen-styles/zen-branding.css (../../zen/common/styles/zen-branding.css)
content/browser/zen-styles/zen-sidebar-notification.css (../../zen/common/styles/zen-sidebar-notification.css) content/browser/zen-styles/zen-sidebar-notification.css (../../zen/common/styles/zen-sidebar-notification.css)
* content/browser/zen-styles/zen-backdrop-filters.svg (../../zen/common/styles/zen-backdrop-filters.svg)
content/browser/zen-styles/zen-panels/bookmarks.css (../../zen/common/styles/zen-panels/bookmarks.css) content/browser/zen-styles/zen-panels/bookmarks.css (../../zen/common/styles/zen-panels/bookmarks.css)
content/browser/zen-styles/zen-panels/print.css (../../zen/common/styles/zen-panels/print.css) content/browser/zen-styles/zen-panels/print.css (../../zen/common/styles/zen-panels/print.css)
+51 -23
View File
@@ -146,6 +146,20 @@ window.gZenUIManager = {
}); });
}, },
/**
* Shakes an element from side to side to catch the user's eye.
*
* @param {Element} element
* @param {number} delay Milliseconds to wait before shaking.
*/
shakeElement(element, delay = 0) {
return this.elementAnimate(
element,
{ x: [0, -12, 8, -4, 2, 0] },
{ duration: 600, delay, easing: "ease-out" }
);
},
_addNewCustomizableButtonsIfNeeded() { _addNewCustomizableButtonsIfNeeded() {
const kPref = "zen.ui.migration.compact-mode-button-added"; const kPref = "zen.ui.migration.compact-mode-button-added";
let navbarPlacements = CustomizableUI.getWidgetIdsInArea( let navbarPlacements = CustomizableUI.getWidgetIdsInArea(
@@ -257,7 +271,7 @@ window.gZenUIManager = {
}; };
}, },
updateTabsToolbar() { updateTabsToolbar(fromResizeEvent = false) {
const kUrlbarHeight = 333; const kUrlbarHeight = 333;
gURLBar.style.setProperty( gURLBar.style.setProperty(
"--zen-urlbar-top", "--zen-urlbar-top",
@@ -270,8 +284,8 @@ window.gZenUIManager = {
gZenVerticalTabsManager.actualWindowButtons.removeAttribute( gZenVerticalTabsManager.actualWindowButtons.removeAttribute(
"zen-has-hover" "zen-has-hover"
); );
gZenVerticalTabsManager.recalculateURLBarHeight(true); gZenVerticalTabsManager.recalculateURLBarHeight(!fromResizeEvent);
if (!this._preventToolbarRebuild) { if (!this._preventToolbarRebuild && !fromResizeEvent) {
setTimeout(() => { setTimeout(() => {
gZenWorkspaces.updateTabsContainers(); gZenWorkspaces.updateTabsContainers();
}, 0); }, 0);
@@ -990,14 +1004,7 @@ window.gZenVerticalTabsManager = {
}); });
ChromeUtils.defineLazyGetter(this, "hidesTabsToolbar", () => { ChromeUtils.defineLazyGetter(this, "hidesTabsToolbar", () => {
return ( return document.documentElement.hasAttribute("popup-window");
document.documentElement
.getAttribute("chromehidden")
?.includes("toolbar") ||
document.documentElement
.getAttribute("chromehidden")
?.includes("menubar")
);
}); });
XPCOMUtils.defineLazyPreferenceGetter( XPCOMUtils.defineLazyPreferenceGetter(
@@ -1278,8 +1285,16 @@ window.gZenVerticalTabsManager = {
if (gZenWorkspaces._processingResize) { if (gZenWorkspaces._processingResize) {
return; return;
} }
this._pendingUrlbarFormatUpdate ||= updateFormat;
if (this._urlbarHeightRecalcScheduled) {
return;
}
this._urlbarHeightRecalcScheduled = true;
requestAnimationFrame(() => { requestAnimationFrame(() => {
requestAnimationFrame(() => { requestAnimationFrame(() => {
delete this._urlbarHeightRecalcScheduled;
const shouldUpdateFormat = this._pendingUrlbarFormatUpdate;
delete this._pendingUrlbarFormatUpdate;
gURLBar.removeAttribute("--urlbar-height"); gURLBar.removeAttribute("--urlbar-height");
let height; let height;
if (!this._hasSetSingleToolbar) { if (!this._hasSetSingleToolbar) {
@@ -1290,7 +1305,7 @@ window.gZenVerticalTabsManager = {
if (typeof height !== "undefined") { if (typeof height !== "undefined") {
gURLBar.style.setProperty("--urlbar-height", `${height}px`); gURLBar.style.setProperty("--urlbar-height", `${height}px`);
} }
if (updateFormat) { if (shouldUpdateFormat) {
gURLBar.zenFormatURLValue(); gURLBar.zenFormatURLValue();
} }
}); });
@@ -1403,18 +1418,37 @@ window.gZenVerticalTabsManager = {
if (isSingleToolbar) { if (isSingleToolbar) {
this._navbarParent = navBar.parentElement; this._navbarParent = navBar.parentElement;
let elements = document.querySelectorAll( let elements = Array.from(
'#nav-bar-customization-target > :is([cui-areatype="toolbar"], .chromeclass-toolbar-additional):not(#urlbar-container):not(toolbarspring)' document.querySelectorAll(
'#nav-bar-customization-target > :is([cui-areatype="toolbar"], .chromeclass-toolbar-additional):not(#urlbar-container):not(toolbarspring)'
)
); );
elements = Array.from(elements).reverse(); let normalButtons = [];
let extensionButtons = [];
for (const element of elements) {
if (
element.hasAttribute("data-extensionid") &&
Services.prefs.getBoolPref("zen.view.overflow-webext-toolbar", true)
) {
extensionButtons.push(element);
} else {
normalButtons.push(element);
}
}
// Add separator if it doesn't exist // Add separator if it doesn't exist
if (!this._hasSetSingleToolbar) { if (!this._hasSetSingleToolbar) {
buttonsTarget.append(this._topButtonsSeparatorElement); buttonsTarget.append(this._topButtonsSeparatorElement);
} }
this._hasSetSingleToolbar = true; this._hasSetSingleToolbar = true;
for (const button of elements) { for (const button of normalButtons.reverse()) {
this.appendCustomizableItem(this._topButtonsSeparatorElement, button); this.appendCustomizableItem(this._topButtonsSeparatorElement, button);
} }
for (const extension of extensionButtons) {
this.appendCustomizableItem(
this._topButtonsSeparatorElement,
extension
);
}
buttonsTarget.prepend( buttonsTarget.prepend(
document.getElementById("unified-extensions-button") document.getElementById("unified-extensions-button")
); );
@@ -1575,13 +1609,7 @@ window.gZenVerticalTabsManager = {
}, },
rebuildURLBarMenus() { rebuildURLBarMenus() {
if (document.getElementById("paste-and-go")) { gURLBar.updatePlaceholder();
return;
}
gURLBar._initCopyCutController();
gURLBar._initPasteAndGo();
gURLBar._initStripOnShare();
gURLBar._updatePlaceholderFromDefaultEngine();
}, },
rebuildAreas() { rebuildAreas() {
+1 -1
View File
@@ -3,5 +3,5 @@
% file, You can obtain one at http://mozilla.org/MPL/2.0/. % file, You can obtain one at http://mozilla.org/MPL/2.0/.
color-scheme: dark; color-scheme: dark;
--zen-backdrop-underlay: url("chrome://browser/content/zen-styles/zen-backdrop-filters.svg#underlay-dark");
--zen-urlbar-outline-offset: -2px; --zen-urlbar-outline-offset: -2px;
--zen-urlbar-filter: blur(40px) saturate(110%) brightness(25%) contrast(100%);
+1 -1
View File
@@ -3,5 +3,5 @@
% file, You can obtain one at http://mozilla.org/MPL/2.0/. % file, You can obtain one at http://mozilla.org/MPL/2.0/.
color-scheme: light; color-scheme: light;
--zen-backdrop-underlay: url("chrome://browser/content/zen-styles/zen-backdrop-filters.svg#underlay-light");
--zen-urlbar-outline-offset: 0px; --zen-urlbar-outline-offset: 0px;
--zen-urlbar-filter: blur(40px) saturate(110%) brightness(75%) contrast(100%);
@@ -0,0 +1,37 @@
/*
* 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/.
*/
/* Upstream elements that take their radius from --border-radius-circle (9999px).
They are meant to read as circles or pills, so a superellipse only makes them
look lumpy. */
.tab-icon-overlay:not([crashed]):is([soundplaying], [muted], [activemedia-blocked]),
.tab-note-icon-overlay,
.tab-group-overflow-count,
.tab-group-editor-swatch,
.tab-preview-container-indicator,
.tab-preview-thumbnail-container > canvas,
#tabbrowser-tabs[orient='vertical']:not([expanded]) .tab-close-button,
.all-tabs-item > toolbarbutton.all-tabs-container-indicator::before,
.urlbarView-button,
.downloadButton,
.titlebar-button,
.titlebar-button .toolbarbutton-icon,
#downloads-indicator-progress-inner,
#smartwindow-ask-button-inner,
#PanelUI-fxa-menu-manage-account-button,
.fxa-menu-manage-account-avatar,
[fxastatus='signedin'] #fxa-avatar-image,
#profile-icon-image,
.appMenu-update-banner-pulse-ring,
.urlbarView-favicon,
:is(#appMenu-zoomReduce-button2, #appMenu-zoomEnlarge-button2) > .toolbarbutton-icon,
.color-swatches .userContext-icon,
.reusable-relay-masks > button,
.radio-check,
#zen-loading-progress-bar,
#statuspanel-label {
corner-shape: round;
}
+32
View File
@@ -4,6 +4,38 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/ */
@keyframes library-badge-download {
0% {
transform: translateY(0);
}
20% {
transform: translateY(12px);
}
100% {
transform: translateY(0);
}
}
@keyframes zen-library-sprite-hover {
from {
background-position-x: 0%;
}
to {
background-position-x: 100%;
}
}
@keyframes zen-library-sprite-unhover {
from {
background-position-x: 100%;
}
to {
background-position-x: 0%;
}
}
@keyframes zen-back-and-forth-text { @keyframes zen-back-and-forth-text {
0%, 0%,
10% { 10% {
@@ -0,0 +1,20 @@
#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">
<filter id="underlay-dark" x="0" y="0" width="100%" height="100%" color-interpolation-filters="sRGB">
<feFlood flood-color="black" />
<feMerge>
<feMergeNode />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
<filter id="underlay-light" x="0" y="0" width="100%" height="100%" color-interpolation-filters="sRGB">
<feFlood flood-color="white" />
<feMerge>
<feMergeNode />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
</svg>
@@ -3,13 +3,15 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/ */
:root:not([inDOMFullscreen="true"]):not([chromehidden~="location"]):not([chromehidden~="toolbar"]) { :root:not([inDOMFullscreen="true"]):not([popup-window]) {
& #tabbrowser-tabbox #tabbrowser-tabpanels .browserSidebarContainer { & #tabbrowser-tabbox #tabbrowser-tabpanels .browserSidebarContainer {
--zen-transparent-browser-background: light-dark(rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.1));
overflow: clip; overflow: clip;
:root:not([zen-no-padding="true"]) &:not(.zen-glance-overlay) { :root:not([zen-no-padding="true"]) &:not(.zen-glance-overlay) {
border-radius: var(--zen-native-inner-radius); /* stylelint-disable-next-line property-no-unknown */
box-shadow: var(--zen-big-shadow); corner-shape: round;
border-radius: calc(var(--zen-native-inner-radius) / var(--zen-squircle-value));
} }
& browser[type="content"] { & browser[type="content"] {
@@ -18,7 +20,7 @@
} }
&[transparent="true"] { &[transparent="true"] {
background: light-dark(rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.1)); background: var(--zen-transparent-browser-background);
} }
} }
@@ -28,18 +30,6 @@
color-scheme: env(-moz-content-preferred-color-scheme); color-scheme: env(-moz-content-preferred-color-scheme);
} }
} }
/* stylelint-disable-next-line media-query-no-invalid */
@media -moz-pref("zen.theme.acrylic-elements") {
& browser[type="content"] {
/* For the rendering engine to apply layering optimizations. This
* is a hacky solution, but it works for now. Note that this makes
* zen REALLY slow, so lets not enable it by default until we have
* a better solution. */
translate: 0;
backface-visibility: hidden;
}
}
} }
/* stylelint-disable-next-line media-query-no-invalid */ /* stylelint-disable-next-line media-query-no-invalid */
+7 -7
View File
@@ -20,7 +20,7 @@ body,
position: inherit; position: inherit;
} }
:root:is([inDOMFullscreen="true"], [chromehidden~="location"], [chromehidden~="toolbar"]) { :root:is([inDOMFullscreen="true"], [popup-window]) {
#navigator-toolbox, #navigator-toolbox,
#zen-sidebar-splitter { #zen-sidebar-splitter {
visibility: collapse; visibility: collapse;
@@ -61,7 +61,7 @@ body,
background: var(--zen-main-browser-background); background: var(--zen-main-browser-background);
opacity: var(--zen-background-opacity); opacity: var(--zen-background-opacity);
transition: 0s; transition: 0s;
background-blend-mode: screen; background-blend-mode: lighten;
} }
&:is(.zen-toolbar-background) { &:is(.zen-toolbar-background) {
@@ -74,7 +74,7 @@ body,
background: var(--zen-main-browser-background-old); background: var(--zen-main-browser-background-old);
opacity: calc(1 - var(--zen-background-opacity)); opacity: calc(1 - var(--zen-background-opacity));
transition: 0s; transition: 0s;
background-blend-mode: screen; background-blend-mode: lighten;
} }
&:is(.zen-toolbar-background) { &:is(.zen-toolbar-background) {
@@ -100,14 +100,14 @@ body,
display: flex; display: flex;
opacity: var(--zen-grainy-background-opacity, 0); opacity: var(--zen-grainy-background-opacity, 0);
:root:not([swipe-gesture="true"]) & { &:not([swipe-gesture="true"]) {
/* note: Keep in sync with kGlobalAnimationDuration */ /* note: Keep in sync with kGlobalAnimationDuration */
transition: opacity 0.2s ease-in-out; transition: opacity 0.2s ease-in-out;
} }
} }
} }
:root[swipe-gesture] #tabbrowser-arrowscrollbox { #tabbrowser-arrowscrollbox[swipe-gesture] {
/* See gh-13703 for rationale. */ /* See gh-13703 for rationale. */
pointer-events: none; pointer-events: none;
} }
@@ -152,7 +152,7 @@ body,
} }
& > * { & > * {
z-index: 1; z-index: var(--zen-main-app-child-z-index, 1);
} }
/* stylelint-disable-next-line media-query-no-invalid */ /* stylelint-disable-next-line media-query-no-invalid */
@@ -170,7 +170,7 @@ body,
min-width: 1px; min-width: 1px;
} }
:root:not([inDOMFullscreen="true"]):not([chromehidden~="location"]):not([chromehidden~="toolbar"]) { :root:not([inDOMFullscreen="true"]):not([popup-window]) {
& #zen-tabbox-wrapper { & #zen-tabbox-wrapper {
margin: var(--zen-element-separation); margin: var(--zen-element-separation);
margin-top: 0; margin-top: 0;
+49
View File
@@ -78,3 +78,52 @@ dialog::part(dialog-button) {
scale: 0.98; scale: 0.98;
} }
} }
:root {
--zen-accent-button-color: light-dark(
oklch(from var(--zen-primary-color) clamp(0.35, l, 0.6) c h),
oklch(from var(--zen-primary-color) clamp(0.7, l, 0.85) c h)
);
--zen-accent-button-background: light-dark(
oklch(from var(--zen-primary-color) clamp(0.35, l, 0.6) c h),
oklch(from var(--zen-primary-color) clamp(0.55, l, 0.7) c h)
);
}
.zen-big-accent-button {
appearance: none;
border: none;
border-radius: 12px;
padding: 1.2rem 1rem;
background: transparent;
color: var(--zen-accent-button-color);
font: inherit;
font-size: 1.2rem;
font-weight: 600;
cursor: pointer;
will-change: transform;
transition: scale 0.15s ease-out;
&:hover {
scale: 1.03;
filter: brightness(1.1);
}
&:active:hover {
scale: 1;
color: color-mix(in srgb, var(--zen-accent-button-color) 80%, transparent);
}
&.primary {
background: var(--zen-accent-button-background);
color: white;
&:hover {
filter: brightness(1.1);
}
&:active:hover {
color: rgba(255, 255, 255, 0.8);
}
}
}
@@ -0,0 +1,94 @@
/* 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-media-preview {
position: absolute;
inset: 0;
--zen-main-app-child-z-index: 3;
display: flex;
align-items: center;
justify-content: center;
}
.zen-library-media-preview-backdrop {
position: absolute;
inset: 0;
background: light-dark(rgba(255, 255, 255, 0.55), rgba(0, 0, 0, 0.45));
}
.zen-library-media-preview-panel {
position: relative;
display: flex;
flex-direction: column;
width: min(78vw, 1100px);
border-radius: 18px;
overflow: hidden;
background: light-dark(rgb(245, 245, 247), rgb(28, 30, 32));
box-shadow: 0 24px 60px rgba(0, 0, 0, 0.45);
}
.zen-library-media-preview-header {
--zen-toolbar-button-size: 15px;
display: flex;
align-items: center;
gap: 8px;
padding: 10px 12px;
flex: none;
color: light-dark(rgb(28, 30, 32), rgb(233, 234, 237));
}
.zen-library-media-preview-name {
margin-inline-start: 6px;
font-size: 13px;
font-weight: 600;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.zen-library-media-preview-date {
font-size: 13px;
opacity: 0.6;
margin-inline-end: auto;
white-space: nowrap;
}
.zen-library-media-preview .toolbarbutton-1 > .toolbarbutton-icon {
box-sizing: border-box;
-moz-context-properties: fill;
fill: var(--toolbarbutton-icon-fill);
}
.zen-library-media-preview-open {
& > .toolbarbutton-text {
display: block;
margin: 0;
padding: 5px 10px;
border-radius: var(--toolbarbutton-border-radius);
background: color-mix(in srgb, currentColor 12%, transparent);
font-weight: 600;
}
&:hover > .toolbarbutton-text {
background: color-mix(in srgb, currentColor 20%, transparent);
}
}
.zen-library-media-preview-stage {
display: flex;
align-items: center;
justify-content: center;
height: min(64vh, 620px);
padding: 16px;
background: light-dark(rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.28));
border-top: 1px solid light-dark(rgba(0, 0, 0, 0.08), rgba(255, 255, 255, 0.07));
}
.zen-library-media-preview-media {
max-width: 100%;
max-height: 100%;
border-radius: 8px;
object-fit: contain;
}
@@ -0,0 +1,313 @@
@property --zen-library-progress {
syntax: "<number>";
inherits: true;
initial-value: 0;
}
#zen-sidebar-foot-buttons,
#tabbrowser-tabs {
--zen-library-open-duration: 0.3s;
--zen-library-open-easing: cubic-bezier(0.22, 1, 0.36, 1);
--zen-library-entry-easing: linear(0, 0.34 12%, 0.7 24%, 0.93 38%, 1.03 55%, 1);
transition: --zen-library-progress var(--zen-library-open-duration) var(--zen-library-open-easing);
&[zen-library-stack-open] {
--zen-library-progress: 1;
}
}
#zen-library-button {
position: relative;
--zen-library-sprite-size: 18px;
&::before {
content: "";
position: absolute;
width: var(--zen-library-sprite-size);
height: var(--zen-library-sprite-size);
background-image: url("chrome://browser/skin/zen-icons/library/library-sprite.svg");
scale: 1.08;
}
@media (prefers-reduced-motion: no-preference) {
&::before {
animation: zen-library-sprite-unhover 0.3s steps(36, jump-none);
}
&:hover::before {
animation: zen-library-sprite-hover 0.35s steps(36, jump-none) forwards;
}
}
}
#zen-library-button > .toolbarbutton-badge-stack {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
background: none !important;
pointer-events: none;
&[downloading] {
animation: 0.4s library-badge-download ease;
}
/* The badge flies from its spot on the button to the newest entry's badge
* along an arc, the target being set as the list opens. */
& #library-button-badge {
position: absolute;
margin: 0 !important;
transform-origin: left top;
--zen-library-badge-x: 14px;
--zen-library-badge-y: -8px;
--zen-library-badge-to-x: var(--zen-library-badge-x);
--zen-library-badge-to-y: var(--zen-library-badge-y);
--zen-library-badge-mid-x: calc(
(var(--zen-library-badge-x) + var(--zen-library-badge-to-x)) / 2 +
abs(var(--zen-library-badge-to-y) - var(--zen-library-badge-y)) / 2
);
--zen-library-badge-mid-y: calc(
(var(--zen-library-badge-y) + var(--zen-library-badge-to-y)) / 2 -
abs(var(--zen-library-badge-to-x) - var(--zen-library-badge-x)) / 2
);
--zen-library-left: calc(1 - var(--zen-library-progress));
left: calc(
var(--zen-library-left) * var(--zen-library-left) * var(--zen-library-badge-x) +
2 * var(--zen-library-left) * var(--zen-library-progress) * var(--zen-library-badge-mid-x) +
var(--zen-library-progress) * var(--zen-library-progress) * var(--zen-library-badge-to-x)
);
top: calc(
var(--zen-library-left) * var(--zen-library-left) * var(--zen-library-badge-y) +
2 * var(--zen-library-left) * var(--zen-library-progress) * var(--zen-library-badge-mid-y) +
var(--zen-library-progress) * var(--zen-library-progress) * var(--zen-library-badge-to-y)
);
&:not([downloading]) {
transform: scale(calc((var(--zen-library-progress) * 0.5 + 0.5) * 100%));
}
&[downloading] {
transform: scale(calc((var(--zen-library-progress) * 0.2 + 0.8) * 100%));
}
}
}
#library-button-badge,
#zen-sidebar-foot-buttons[zen-library-badge] #zen-library-download-list > :last-child .zen-library-download-badge {
visibility: hidden;
}
#zen-sidebar-foot-buttons[zen-library-badge] {
& #library-button-badge {
visibility: visible;
}
&[zen-library-stack-open] {
& #library-button-badge {
visibility: hidden;
transition: visibility 0s var(--zen-library-open-duration);
}
& #zen-library-download-list > :last-child .zen-library-download-badge {
visibility: visible;
transition: visibility 0s var(--zen-library-open-duration);
}
}
}
.zen-library-download-badge {
pointer-events: none;
}
.zen-library-download-badge:not([downloading]) {
background-image: var(--download-image);
width: 20px;
height: 20px;
border-radius: var(--border-radius-xsmall);
background-size: cover;
scale: 2;
& .zen-library-download-progress {
display: none !important;
}
}
.zen-library-download-badge[downloading] {
will-change: transform;
align-self: start;
transform: translateX(-2px);
--border-color: color-mix(in srgb, var(--zen-primary-color), light-dark(rgba(0,0,0,.8), white) 70%);
background-color: color-mix(in srgb, var(--zen-primary-color), light-dark(white, rgba(0,0,0,.5)) 80%);
border: 3px solid transparent;
box-shadow: 0 0 6px 2px rgba(0,0,0,.1);
color: var(--border-color);
width: 25px;
height: 25px;
border-radius: 100%;
position: relative;
}
.zen-library-download-badge[downloading]::after {
background-image: url("chrome://browser/skin/zen-icons/forward.svg");
rotate: 90deg;
position: absolute;
content: '';
background-size: contain;
inset: 2px;
fill: currentColor;
-moz-context-properties: fill;
}
.zen-library-download-progress {
position: absolute;
inset: 1px;
border-radius: 50%;
--badge-size: 25px;
--border-width: 4px;
--size: calc(var(--badge-size) + 2 * var(--border-width));
margin: calc(-1 * var(--border-width));
--thickness: 3px;
--progress: var(--zen-accent-button-background);
background:
conic-gradient(
from 0deg,
var(--progress) calc(var(--value) * 1%),
transparent 0
)
border-box,
var(--border-color) border-box;
mask: radial-gradient(
circle closest-side,
transparent calc(100% - var(--thickness)),
black calc(100% - var(--thickness))
);
}
#zen-sidebar-foot-buttons:is([zen-library-stack-open], [zen-library-stack-closing]) {
z-index: 3;
}
#zen-library-download-list {
width: 100%;
height: auto;
position: absolute;
bottom: 100%;
visibility: hidden;
transition: visibility 0s var(--zen-library-open-duration);
#zen-sidebar-foot-buttons[zen-library-stack-open] & {
visibility: visible;
transition: none;
}
display: flex;
flex-direction: column;
padding: 0;
padding-top: 10px;
gap: 4px;
.zen-library-download-list-download {
container-type: inline-size;
-moz-window-dragging: no-drag;
height: 52px;
border-radius: 16px;
display: flex;
position: relative;
padding: 0 4px;
--zen-library-progress: 0;
--zen-library-entry-index: 0;
--zen-library-entry-delay: calc(var(--zen-library-entry-index) * 12ms);
--zen-library-entry-settle: 0s;
transition:
--zen-library-progress 0.22s var(--zen-library-entry-easing) var(--zen-library-entry-delay),
pointer-events 0s var(--zen-library-entry-settle) allow-discrete;
pointer-events: none;
&:nth-last-child(2) {
--zen-library-entry-index: 1;
}
&:nth-last-child(3) {
--zen-library-entry-index: 2;
}
&:nth-last-child(4) {
--zen-library-entry-index: 3;
}
#zen-sidebar-foot-buttons[zen-library-stack-open] & {
--zen-library-progress: 1;
--zen-library-entry-settle: calc(0.22s + var(--zen-library-entry-delay));
pointer-events: auto;
}
transform: translateY(calc((1 - var(--zen-library-progress)) * 25px));
opacity: var(--zen-library-progress);
&:hover {
background: var(--zen-toolbar-element-bg);
}
& .zen-library-download-list-title-container {
@container (max-width: 50px) {
display: none !important;
}
margin: auto 0;
min-width: 0;
flex: 1;
& .zen-library-download-list-title {
font-size: 11pt;
opacity: 0.9;
text-overflow: ellipsis;
display: block;
overflow: hidden;
white-space: nowrap;
}
& .zen-library-download-list-subtitle {
font-size: 9pt;
opacity: 0.6;
text-overflow: ellipsis;
display: block;
overflow: hidden;
white-space: nowrap;
}
}
& .zen-library-download-badge {
margin: auto 20px auto 8px;
@container (max-width: 50px) {
margin: auto;
}
}
& .zen-library-download-action {
display: none;
margin: auto 4px auto 0;
@container (max-width: 50px) {
display: none !important;
}
}
&[downloading] .zen-library-download-action {
display: flex;
list-style-image: url("chrome://browser/skin/zen-icons/close.svg");
}
}
}
+41 -34
View File
@@ -17,7 +17,7 @@
} }
.urlbar { .urlbar {
--urlbarview-separator-color: light-dark(hsl(0, 0%, 80%), hsl(0, 0%, 20%)); --urlbarview-separator-color: light-dark(rgb(233, 233, 233), rgb(46 46 47));
--urlbarview-background-color-hover: var(--toolbarbutton-background-color-hover); --urlbarview-background-color-hover: var(--toolbarbutton-background-color-hover);
border-radius: calc(var(--toolbarbutton-border-radius) - 2px); border-radius: calc(var(--toolbarbutton-border-radius) - 2px);
--urlbarView-results-padding: 10px !important; --urlbarView-results-padding: 10px !important;
@@ -27,6 +27,9 @@
--urlbar-margin-inline: 5px; --urlbar-margin-inline: 5px;
--urlbar-container-padding: 4px; --urlbar-container-padding: 4px;
--urlbar-icon-border-radius: 8px !important;
--urlbar-inner-border-radius: 8px !important;
&[breakout-extend] { &[breakout-extend] {
--urlbar-container-padding: 0px; --urlbar-container-padding: 0px;
} }
@@ -164,11 +167,12 @@
} }
#navigator-toolbox[zen-has-implicit-hover="true"] &, #navigator-toolbox[zen-has-implicit-hover="true"] &,
&[open], &:is([open], [showing]),
#urlbar[has-popup-open="true"] &, #urlbar[has-popup-open="true"] &,
:root[zen-has-empty-tab="true"] & { :root[zen-has-empty-tab="true"] & {
opacity: 1; opacity: 1;
visibility: visible; visibility: visible;
transition: opacity 0.15s !important;
} }
} }
} }
@@ -273,29 +277,31 @@
} }
& .urlbar-background { & .urlbar-background {
--zen-urlbar-background-base: light-dark(#fbfbfb, color-mix(in srgb, hsl(0, 0%, 6.7%), var(--zen-colors-primary) 30%)); --zen-urlbar-background-base: light-dark(rgb(255, 255, 255), rgb(24 24 24));
/* stylelint-disable-next-line media-query-no-invalid */ /* stylelint-disable-next-line media-query-no-invalid */
@media -moz-pref("zen.theme.acrylic-elements") and (not (prefers-reduced-transparency: reduce)) { @media -moz-pref("zen.theme.acrylic-elements") and (not (prefers-reduced-transparency: reduce)) {
--zen-urlbar-background-transparent: light-dark( &:not(:-moz-window-inactive) {
color-mix(in srgb, white 80%, transparent), --zen-urlbar-background-transparent: light-dark(
color-mix(in srgb, var(--zen-urlbar-background-base) 65%, transparent) rgba(255, 255, 255, .93),
); rgba(20, 20, 20, .93)
);
}
} }
background-color: var(--zen-urlbar-background-transparent, var(--zen-urlbar-background-base)) !important; background-color: var(--zen-urlbar-background-transparent, var(--zen-urlbar-background-base)) !important;
box-shadow: 0 30px 140px -15px light-dark(rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.6)) !important; box-shadow: 0 30px 140px -15px light-dark(rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.6)) !important;
backdrop-filter: none !important; backdrop-filter: none !important;
outline: 0.5px solid light-dark(rgba(0, 0, 0, 0.2), rgba(255, 255, 255, 0.2)) !important; outline: 0.5px solid light-dark(rgba(0, 0, 0, 0.2), rgb(75, 75, 75)) !important;
outline-offset: var(--zen-urlbar-outline-offset) !important; outline-offset: var(--zen-urlbar-outline-offset) !important;
/* stylelint-disable-next-line media-query-no-invalid */ /* stylelint-disable-next-line media-query-no-invalid */
@media -moz-pref("zen.theme.acrylic-elements") { @media -moz-pref("zen.theme.acrylic-elements") {
backdrop-filter: var(--zen-urlbar-filter) !important; backdrop-filter: var(--zen-backdrop-underlay) blur(40px) !important;
} }
} }
&, &,
.urlbar-background { .urlbar-background {
border-radius: 12px !important; border-radius: 15px !important;
} }
&[breakout-extend][animate-searchmode="true"]::before { &[breakout-extend][animate-searchmode="true"]::before {
@@ -315,9 +321,6 @@
} }
:root[zen-single-toolbar="true"] { :root[zen-single-toolbar="true"] {
--urlbar-icon-border-radius: 8px !important;
--urlbar-inner-border-radius: 6px !important;
#identity-permission-box > *:not(#zen-site-data-icon-button) { #identity-permission-box > *:not(#zen-site-data-icon-button) {
visibility: collapse; visibility: collapse;
} }
@@ -509,7 +512,7 @@
#urlbar[open][zen-floating-urlbar="true"] #identity-icon-box, #urlbar[open][zen-floating-urlbar="true"] #identity-icon-box,
:root[zen-single-toolbar="true"] #urlbar[breakout-extend] #identity-icon-box { :root[zen-single-toolbar="true"] #urlbar[breakout-extend] #identity-icon-box {
--urlbar-box-hover-bgcolor: transparent; --urlbar-box-hover-bgcolor: transparent;
margin-inline: 2px 8px; margin-inline: 2px 4px;
transition: none; transition: none;
} }
@@ -535,8 +538,8 @@
.urlbarView-favicon { .urlbarView-favicon {
margin-left: 0 !important; margin-left: 0 !important;
margin-right: 12px !important; margin-right: 12px !important;
padding: 6px !important; padding: 4px !important;
border-radius: 3px !important; border-radius: 4px !important;
} }
.urlbarView-userContext { .urlbarView-userContext {
@@ -558,22 +561,24 @@
} }
.urlbarView-prettyName, .urlbarView-prettyName,
.urlbarView-tabGroup,
.urlbarView-shortcutContent { .urlbarView-shortcutContent {
border-radius: 4px; border-radius: 4px !important;
font-weight: 600; font-weight: 600;
margin-top: auto; margin-top: auto !important;
margin-bottom: auto; margin-bottom: auto !important;
} }
.urlbarView-prettyName { .urlbarView-prettyName,
padding: 4px 6px; .urlbarView-tabGroup {
background-color: color-mix(in srgb, var(--zen-branding-bg-reverse), transparent 90%); padding: 4px 6px !important;
margin-left: 6px; background-color: color-mix(in srgb, var(--zen-branding-bg-reverse), transparent 90%) !important;
margin-left: 6px !important;
font-size: 12px; font-size: 12px;
align-items: center; align-items: center;
gap: 6px; gap: 6px;
display: flex; display: flex;
color: color-mix(in srgb, var(--zen-primary-color), currentColor 95%); color: color-mix(in srgb, var(--zen-primary-color), currentColor 95%) !important;
& img { & img {
-moz-context-properties: fill; -moz-context-properties: fill;
@@ -649,18 +654,19 @@
.urlbarView-row { .urlbarView-row {
--urlbarView-row-padding-inline: 8px; --urlbarView-row-padding-inline: 8px;
--urlbarview-row-padding-block: 10px; --urlbarview-row-padding-block: 12px;
--urlbarView-row-gutter: 0px;
color: light-dark(rgba(0, 0, 0, 0.7), rgba(255, 255, 255, 0.7)) !important; color: light-dark(rgba(0, 0, 0, 0.7), rgba(255, 255, 255, 0.7)) !important;
&:hover { &:hover,
&, &:hover .urlbarView-favicon,
& .urlbarView-favicon { .urlbarView-action-favicon {
background-color: color-mix(in srgb, var(--zen-branding-bg-reverse) 5%, transparent 95%) !important; background-color: color-mix(in srgb, var(--zen-branding-bg-reverse) 5%, transparent 95%) !important;
}
} }
&[selected] { &[selected] {
--zen-selected-bg: color-mix(in srgb, var(--zen-primary-color) 50%, light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.1))); --zen-selected-bg: color-mix(in srgb, var(--zen-primary-color) 50%, light-dark(rgba(0, 0, 0, 0.3), rgba(255, 255, 255, 0.1)));
--zen-selected-color: color-mix(in srgb, var(--zen-selected-bg), black 30%); --zen-selected-color: color-mix(in srgb, var(--zen-selected-bg), black 30%);
background-color: var(--zen-selected-bg) !important; background-color: var(--zen-selected-bg) !important;
@@ -684,14 +690,15 @@
background-color: rgba(255, 255, 255, 0.9) !important; background-color: rgba(255, 255, 255, 0.9) !important;
} }
& .urlbarView-prettyName { & .urlbarView-prettyName,
background-color: color-mix(in srgb, var(--zen-branding-bg-reverse), transparent 80%); & .urlbarView-tabGroup {
background-color: color-mix(in srgb, var(--zen-branding-bg-reverse), transparent 80%) !important;
} }
} }
} }
#urlbar-results { #urlbar-results {
max-height: 252px; max-height: 244px;
overflow-y: auto; overflow-y: auto;
scrollbar-width: none; scrollbar-width: none;
margin-block-start: calc(var(--urlbarView-results-padding) - 2px); margin-block-start: calc(var(--urlbarView-results-padding) - 2px);
+8
View File
@@ -30,6 +30,14 @@ panel[type="arrow"]:not(#feature-callout) {
} }
} }
@media (-moz-platform: linux) or ((-moz-platform: windows) and (not (-moz-windows-mica-popups))) {
&::part(content) {
/* stylelint-disable-next-line property-no-unknown */
corner-shape: round;
border-radius: calc(var(--panel-border-radius) / var(--zen-squircle-value));
}
}
@media (-moz-platform: macos) { @media (-moz-platform: macos) {
&:is([nonnative], :not([type="arrow"])) { &:is([nonnative], :not([type="arrow"])) {
appearance: auto !important; appearance: auto !important;
@@ -64,6 +64,10 @@ hbox.editBMPanel_folderRow {
margin-right: 10px; margin-right: 10px;
} }
#editBMPanel_workspaceSummary .workspace-trigger {
margin-inline-end: 16px;
}
/* Bookmarks in toolbar */ /* Bookmarks in toolbar */
#PersonalToolbar { #PersonalToolbar {
background: transparent; background: transparent;
+4
View File
@@ -411,3 +411,7 @@ menuseparator {
#window-modal-dialog { #window-modal-dialog {
inset: 0; inset: 0;
} }
.tab-preview-thumbnail-container > canvas {
border-radius: calc(var(--border-radius-medium) / var(--zen-squircle-value));
}
@@ -800,3 +800,16 @@
display: none; display: none;
} }
} }
#tabbrowser-tabs:is([zen-library-stack-open], [zen-library-stack-closing]) {
--gradient-pos: calc(100% - var(--zen-library-stack-height, 0px) + 20px);
mask-image: linear-gradient(
to bottom,
black
calc(var(--gradient-pos) - 50px),
color-mix(transparent calc(var(--zen-library-progress) * 100%), black)
var(--gradient-pos));
}
%include zen-library-widget.css
%include zen-library-media-preview.css
+5 -3
View File
@@ -101,7 +101,7 @@
) !important; ) !important;
--focus-outline-color: var(--color-accent-primary) !important; --focus-outline-color: var(--color-accent-primary) !important;
--toolbarbutton-icon-fill-attention: var(--toolbar-color) !important; --toolbarbutton-icon-fill-attention: var(--toolbar-color, currentColor) !important;
--toolbarbutton-icon-fill: currentColor !important; --toolbarbutton-icon-fill: currentColor !important;
--button-background-color-primary: var(--in-content-primary-button-background) !important; --button-background-color-primary: var(--in-content-primary-button-background) !important;
@@ -220,7 +220,7 @@
--zen-squircle-value: 1.3; --zen-squircle-value: 1.3;
@media (-moz-platform: windows) { @media (-moz-platform: windows) {
--zen-squircle-value: 2.1; --zen-squircle-value: 2.3;
} }
--tab-icon-overlay-stroke: light-dark(white, black) !important; --tab-icon-overlay-stroke: light-dark(white, black) !important;
@@ -303,7 +303,7 @@
} }
} }
#main-window[windowtype="navigator:browser"]:not([chromehidden~='toolbar']) { #main-window[windowtype="navigator:browser"]:not([popup-window]) {
min-height: 495px !important; min-height: 495px !important;
@media (-moz-windows-mica) or (-moz-platform: macos) or ((-moz-platform: linux) and @media (-moz-windows-mica) or (-moz-platform: macos) or ((-moz-platform: linux) and
@@ -361,4 +361,6 @@
.zen-squircle-after::after { .zen-squircle-after::after {
corner-shape: superellipse(var(--zen-squircle-value)); corner-shape: superellipse(var(--zen-squircle-value));
} }
%include squircle-exclusions.inc.css
} }
+1 -4
View File
@@ -42,7 +42,6 @@ let JSWINDOWACTORS = {
child: { child: {
esModuleURI: "resource:///actors/ZenGlanceChild.sys.mjs", esModuleURI: "resource:///actors/ZenGlanceChild.sys.mjs",
events: { events: {
DOMContentLoaded: {},
mousedown: { mousedown: {
capture: true, capture: true,
}, },
@@ -86,9 +85,7 @@ if (!Services.appinfo.inSafeMode) {
child: { child: {
esModuleURI: "resource:///actors/ZenBoostsChild.sys.mjs", esModuleURI: "resource:///actors/ZenBoostsChild.sys.mjs",
events: { events: {
// Needed to let the actor be created, please don't remove DOMDocElementInserted: {},
// without checking if boosts still work without it, thanks <3
DOMWindowCreated: {},
}, },
}, },
safeForUntrustedWebProcess: true, safeForUntrustedWebProcess: true,
+9 -1
View File
@@ -4,17 +4,25 @@
import { AppConstants } from "resource://gre/modules/AppConstants.sys.mjs"; import { AppConstants } from "resource://gre/modules/AppConstants.sys.mjs";
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
ZenLibraryWidget: "moz-src:///zen/library/ZenLibraryWidget.sys.mjs",
});
export const ZenCustomizableUI = new (class { export const ZenCustomizableUI = new (class {
constructor() {} constructor() {}
TYPE_TOOLBAR = "toolbar"; TYPE_TOOLBAR = "toolbar";
defaultSidebarIcons = [ defaultSidebarIcons = [
"downloads-button", Services.prefs.getBoolPref("zen.library.enabled")
? "zen-library-button"
: "downloads-button",
"zen-workspaces-button", "zen-workspaces-button",
"zen-create-new-button", "zen-create-new-button",
]; ];
startup(CustomizableUIInternal) { startup(CustomizableUIInternal) {
CustomizableUIInternal.createBuiltinWidget(lazy.ZenLibraryWidget);
CustomizableUIInternal.registerArea( CustomizableUIInternal.registerArea(
"zen-sidebar-top-buttons", "zen-sidebar-top-buttons",
{ {
+53 -2
View File
@@ -7,12 +7,15 @@ import { AppConstants } from "resource://gre/modules/AppConstants.sys.mjs";
const lazy = {}; const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, { ChromeUtils.defineESModuleGetters(lazy, {
SessionStore: "resource:///modules/sessionstore/SessionStore.sys.mjs", CustomizableUI:
"moz-src:///browser/components/customizableui/CustomizableUI.sys.mjs",
SessionStore:
"moz-src:///browser/components/sessionstore/SessionStore.sys.mjs",
}); });
class nsZenUIMigration { class nsZenUIMigration {
PREF_NAME = "zen.ui.migration.version"; PREF_NAME = "zen.ui.migration.version";
MIGRATION_VERSION = 7; MIGRATION_VERSION = 8;
init(isNewProfile) { init(isNewProfile) {
if (!isNewProfile) { if (!isNewProfile) {
@@ -22,6 +25,7 @@ class nsZenUIMigration {
console.error("ZenUIMigration: Error during migration", e); console.error("ZenUIMigration: Error during migration", e);
} }
} }
this.#migrateLibraryButton();
this.clearVariables(); this.clearVariables();
if (this.shouldRestart) { if (this.shouldRestart) {
Services.startup.quit( Services.startup.quit(
@@ -50,6 +54,41 @@ class nsZenUIMigration {
this._migrationVersion = this.MIGRATION_VERSION; this._migrationVersion = this.MIGRATION_VERSION;
} }
#migrateLibraryButton() {
const donePref = "zen.library.migrated-downloads-button";
if (
!Services.prefs.getBoolPref("zen.library.enabled", false) ||
Services.prefs.getBoolPref(donePref, false)
) {
return;
}
// A toolbar's saved placements are only there once a window has it.
const footButtons = "zen-sidebar-foot-buttons";
const listener = {
onAreaNodeRegistered: area => {
if (area !== footButtons) {
return;
}
lazy.CustomizableUI.removeListener(listener);
Services.prefs.setBoolPref(donePref, true);
const downloads =
lazy.CustomizableUI.getPlacementOfWidget("downloads-button");
if (
downloads?.area === footButtons &&
!lazy.CustomizableUI.getPlacementOfWidget("zen-library-button")
) {
lazy.CustomizableUI.addWidgetToArea(
"zen-library-button",
footButtons,
downloads.position
);
lazy.CustomizableUI.removeWidgetFromArea("downloads-button");
}
},
};
lazy.CustomizableUI.addListener(listener);
}
_migrateV1() { _migrateV1() {
// If there's an userChrome.css or userContent.css existing, we set // If there's an userChrome.css or userContent.css existing, we set
// 'toolkit.legacyUserProfileCustomizations.stylesheets' back to true // 'toolkit.legacyUserProfileCustomizations.stylesheets' back to true
@@ -164,6 +203,18 @@ class nsZenUIMigration {
Services.prefs.setBoolPref("zen.widget.macos.window-vibrancy", false); Services.prefs.setBoolPref("zen.widget.macos.window-vibrancy", false);
} }
} }
_migrateV8() {
// A version mismatch in the downloadable gfx blocklist wrongly blocked
// video overlays for every Windows user. The status pref persists in the
// profile and short-circuits the blocklist evaluation, so clear it (and
// its failure id) and restart, since gfx is already initialized by now.
if (Services.prefs.prefHasUserValue("gfx.blacklist.video-overlay")) {
Services.prefs.clearUserPref("gfx.blacklist.video-overlay");
Services.prefs.clearUserPref("gfx.blacklist.video-overlay.failureid");
this.shouldRestart = true;
}
}
} }
export var gZenUIMigration = new nsZenUIMigration(); export var gZenUIMigration = new nsZenUIMigration();
+15 -1
View File
@@ -41,6 +41,9 @@ document.addEventListener(
case "cmd_zenSplitViewContextMenu": case "cmd_zenSplitViewContextMenu":
gZenViewSplitter.contextSplitTabs(); gZenViewSplitter.contextSplitTabs();
break; break;
case "cmd_zenCtxShareSplitView":
gZenViewSplitter.contextShareSplitView();
break;
case "cmd_zenCopyCurrentURLMarkdown": case "cmd_zenCopyCurrentURLMarkdown":
gZenCommonActions.copyCurrentURLAsMarkdownToClipboard(); gZenCommonActions.copyCurrentURLAsMarkdownToClipboard();
break; break;
@@ -90,6 +93,9 @@ document.addEventListener(
case "cmd_zenCtxDeleteWorkspace": case "cmd_zenCtxDeleteWorkspace":
gZenWorkspaces.contextDeleteWorkspace(event); gZenWorkspaces.contextDeleteWorkspace(event);
break; break;
case "cmd_zenCtxShareWorkspace":
gZenWorkspaces.contextShareWorkspace();
break;
case "cmd_zenChangeWorkspaceName": case "cmd_zenChangeWorkspaceName":
gZenVerticalTabsManager.renameTabStart({ gZenVerticalTabsManager.renameTabStart({
target: gZenWorkspaces.activeWorkspaceIndicator.querySelector( target: gZenWorkspaces.activeWorkspaceIndicator.querySelector(
@@ -154,12 +160,20 @@ document.addEventListener(
} }
case "cmd_zenDuplicateTab": { case "cmd_zenDuplicateTab": {
const selectedTabs = gBrowser.selectedTabs; const selectedTabs = gBrowser.selectedTabs;
let insertAt = selectedTabs.at(-1)._tPos + 1; let insertAt = selectedTabs.at(-1).index + 1;
for (const tab of selectedTabs) { for (const tab of selectedTabs) {
gBrowser.duplicateTab(tab, true, { tabIndex: insertAt++ }); gBrowser.duplicateTab(tab, true, { tabIndex: insertAt++ });
} }
break; break;
} }
case "cmd_zenToggleLibrary": {
const { ZenLibrary } = ChromeUtils.importESModule(
"moz-src:///zen/library/ZenLibrary.mjs",
{ global: "current" }
);
ZenLibrary.toggle();
break;
}
default: default:
gZenGlanceManager.handleMainCommandSet(event); gZenGlanceManager.handleMainCommandSet(event);
if (event.target.id.startsWith("cmd_zenWorkspaceSwitch")) { if (event.target.id.startsWith("cmd_zenWorkspaceSwitch")) {
+2 -2
View File
@@ -109,7 +109,7 @@
if (AppConstants.platform == "macosx") { if (AppConstants.platform == "macosx") {
const targetRadius = window.matchMedia("(-moz-mac-tahoe-theme)") const targetRadius = window.matchMedia("(-moz-mac-tahoe-theme)")
.matches .matches
? 12 ? 11
: 10; : 10;
document.documentElement.style.setProperty( document.documentElement.style.setProperty(
"--zen-border-radius", "--zen-border-radius",
@@ -125,7 +125,7 @@
// Windows defaults to 8px // Windows defaults to 8px
document.documentElement.style.setProperty( document.documentElement.style.setProperty(
"--zen-border-radius", "--zen-border-radius",
"8px" "9px"
); );
} }
} else { } else {
+19 -10
View File
@@ -61,6 +61,12 @@ ChromeUtils.defineLazyGetter(lazy, "mainAppWrapper", () =>
document.getElementById("zen-main-app-wrapper") document.getElementById("zen-main-app-wrapper")
); );
ChromeUtils.defineESModuleGetters(
lazy,
{ ZenLibrary: "moz-src:///zen/library/ZenLibrary.mjs" },
{ global: "current" }
);
window.gZenCompactModeManager = { window.gZenCompactModeManager = {
_flashTimeouts: {}, _flashTimeouts: {},
_eventListeners: [], _eventListeners: [],
@@ -165,12 +171,13 @@ window.gZenCompactModeManager = {
}, },
get shouldBeCompact() { get shouldBeCompact() {
return !document.documentElement return !document.documentElement.hasAttribute("popup-window");
.getAttribute("chromehidden")
?.includes("toolbar");
}, },
set preference(value) { set preference(value) {
if (lazy.ZenLibrary.isLibrarySlightlyOpen) {
return;
}
if (!this.shouldBeCompact) { if (!this.shouldBeCompact) {
value = false; value = false;
} }
@@ -477,9 +484,9 @@ window.gZenCompactModeManager = {
document.documentElement.setAttribute("zen-compact-animating", "true"); document.documentElement.setAttribute("zen-compact-animating", "true");
return new Promise(resolve => { return new Promise(resolve => {
// We need to set the splitter width before hiding it // We need to set the splitter width before hiding it
let splitterWidth = document let splitterWidth = window.windowUtils.getBoundsWithoutFlushing(
.getElementById("zen-sidebar-splitter") document.getElementById("zen-sidebar-splitter")
.getBoundingClientRect().width; ).width;
const isCompactMode = this.preference; const isCompactMode = this.preference;
const canHideSidebar = this.canHideSidebar; const canHideSidebar = this.canHideSidebar;
let canAnimate = let canAnimate =
@@ -543,7 +550,7 @@ window.gZenCompactModeManager = {
ease: "easeIn", ease: "easeIn",
type: "spring", type: "spring",
bounce: 0, bounce: 0,
duration: 0.12, duration: 0.1,
} }
) )
.then(() => { .then(() => {
@@ -599,7 +606,7 @@ window.gZenCompactModeManager = {
ease: "easeOut", ease: "easeOut",
type: "spring", type: "spring",
bounce: 0, bounce: 0,
duration: 0.12, duration: 0.1,
} }
) )
.then(() => { .then(() => {
@@ -864,7 +871,6 @@ window.gZenCompactModeManager = {
"supress-primary-adjustment" "supress-primary-adjustment"
) === "true" && ) === "true" &&
gZenVerticalTabsManager._hasSetSingleToolbar) || gZenVerticalTabsManager._hasSetSingleToolbar) ||
this._hasHoveredUrlbar ||
this._ignoreNextHover || this._ignoreNextHover ||
(event.type === "dragleave" && (event.type === "dragleave" &&
event.explicitOriginalTarget !== target && event.explicitOriginalTarget !== target &&
@@ -877,7 +883,10 @@ window.gZenCompactModeManager = {
return; return;
} }
if (this.hoverableElements[i].keepHoverDuration) { if (
this.hoverableElements[i].keepHoverDuration &&
!this._hasHoveredUrlbar
) {
this.flashElement( this.flashElement(
target, target,
this.hoverableElements[i].keepHoverDuration, this.hoverableElements[i].keepHoverDuration,

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