Compare commits

...

85 Commits

Author SHA1 Message Date
mr. m
e176c1ba41 perf: Improve startup performance, b=no-bug, c=common 2026-01-10 20:21:20 +01:00
mr. m
8d25577bdb fix: Make sure to disable workspace delete when updating context menus, b=no-bug, c=workspaces 2026-01-10 18:48:56 +01:00
Andrey Bochkarev
fc7f10aef1 feat: Add dnd switch support for groups, p=#11854
* feat: Add dnd switch support for groups

* refactor: Use `changeFolderToSpace` for drag-and-drop workspace changes

* refactor: Use optional parameter instead of attribute

* fix: Formatting

* refactor: Move condition inside function

* Refactor tab group handling in drag-and-drop

Signed-off-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>

* feat: Only allow double click rename on labels, b=no-bug, c=common

---------

Signed-off-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>
Co-authored-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>
2026-01-10 14:41:28 +01:00
mr. m
44a28e2afe perf: Stop flushing document styles when switching spaces, b=bug #11851, c=glance, workspaces 2026-01-10 13:00:27 +01:00
mr. m
818b2d1af5 chore: Make sure to mark macos unifications as releases, b=no-bug, c=workflows 2026-01-10 12:26:50 +01:00
mr. m
9147e5c10c Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2026-01-10 01:24:26 +01:00
mr. m
d5727a6a1b chore: Clean up build flags to stay more close to firefox defaults, b=no-bug, c=common, configs, windows 2026-01-10 01:24:20 +01:00
rain capsule
6c84a01950 fix: Allow user override of zen.theme.border-radius pref value, p=#11847
* fix: Allow user override of zen.theme.border-radius pref value

* fix: Handle platform-specific zen radius via JS rather than CSS

* lint: border radius js implementation
2026-01-09 17:00:55 +01:00
mr. m
f77249e8e9 fix: Make sure to update cache when swaping docshells, b=bug #11831, c=no-component 2026-01-09 16:52:22 +01:00
mr. m
6bce6f4874 chore: Update SDK version to 26.2 for MacOS artifact builds, b=no-bug, c=workflows, configs 2026-01-09 03:06:31 +01:00
mr. m
0d080ffc38 chore: Specify the new MacOSX SDK dir for artifact builds, b=no-bug, c=configs 2026-01-09 02:49:43 +01:00
mr. m
568607231f Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2026-01-09 02:45:58 +01:00
mr. m
88068613a1 chore: Override minimum MacOS SDK version, b=no-bug, c=workflows 2026-01-09 02:45:52 +01:00
Andrey Bochkarev
1e09b3fb4d feat: Expand pinned section when a tab is pinned, p=#11848 2026-01-09 02:18:10 +01:00
mr. m
4d1e091af6 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2026-01-09 02:17:10 +01:00
mr. m
b22bf7485e feat: Create patches to use MacOS 26.2 SDK version, b=no-bug, c=no-component 2026-01-09 02:16:58 +01:00
Andrey Bochkarev
bcdd9c0567 fix: Fix indentation and activeTabs on new folder tab, p=#11846 2026-01-09 01:38:02 +01:00
mr. m
05b1f52171 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2026-01-09 01:37:49 +01:00
mr. m
edfb427a23 chore: Update MacOS and Windows SDKs, b=no-bug, c=workflows, windows, scripts 2026-01-09 01:37:43 +01:00
Andrey Bochkarev
b7fafdbf02 fix: Unexpected renaming behavior when creating new folders, p=#11843 2026-01-08 23:09:44 +01:00
mr. m
f39faf6638 fix: Fixed closing and reopening zen turning tabs into blank states when having multiple windows, b=bug #11831, c=split-view 2026-01-08 20:48:38 +01:00
mr. m
7e7d860c9e chore: Sync upstream Firefox to version 147.0, p=#11822
* chore: Sync upstream to `Firefox 147.0`

* chore: Continued migration, b=no-bug, c=tests

* chore: Finish migration without testing, b=no-bug, c=scripts, tabs, media, common, split-view

* feat: Finish migration, b=no-bug, c=common, compact-mode, split-view, workspaces

* feat: Finish basic migration, b=no-bug, c=kbs, common, folders

* feat: Update surfer, b=no-bug, c=scripts
2026-01-08 18:06:05 +01:00
Andrey Bochkarev
ae93efef57 fix: Prevent indentation for collapsed workspace, b=closes #11839, p=#11830
* fix: Prevent indentation for collapsed workspace (#11830)

* refactor: Use `activeWorkspaceElement` for collapsed pinned tabs check
2026-01-08 15:25:11 +01:00
mr. m
3c7fb093db feat: Make sure dragged tab does not allow the title to overflow, b=no-bug, c=no-component 2026-01-07 01:05:08 +01:00
mr. m
ec4a55e1f8 chore: Revert linking with ld64 due to big compile times and resource usage, b=no-bug, c=configs 2026-01-07 00:28:56 +01:00
mr. m
b0f3839426 feat: Limit the number of threads when building macos releases, b=no-bug, c=configs 2026-01-06 20:20:38 +01:00
mr. m
a537f0f91d feat: Ignore errors when trying to import external mochitests while trying to sync upstream, b=no-bug, c=workflows 2026-01-06 13:02:03 +01:00
mr. m
11f29c12c5 chore: Install autopep8 for code formatting in the upstream workflow, b=no-bug, c=workflows 2026-01-06 12:53:27 +01:00
mr. m
e7631ce9cc feat: Make sure upstream sync workflow initializes git before downloading, b=no-bug, c=workflows 2026-01-06 12:48:26 +01:00
mr. m
481163a756 feat: Correctly initialize new restored windows, p=#11821
* feat: Correctly initialize new restored windows, b=no-bug, c=no-component

* chore: Experiment with different build flags for optimization and build time, b=no-bug, c=common, configs

* chore: Format, b=no-bug, c=no-component
2026-01-06 12:38:22 +01:00
mr. m
281ec6693d feat: Correctly initialize new restored windows, b=no-bug, c=no-component 2026-01-06 12:35:35 +01:00
mr. m
9820bd5772 test: Started adding tests for window sync, b=no-bug, c=tests, workspaces 2026-01-06 01:23:20 +01:00
mr. m
75f4f0c3e6 feat: Created share files, schemas and prefs, p=#11814, c=no-component 2026-01-05 19:42:01 +01:00
mr. m
591193b748 fix: Correctly restore unsynced windows, b=no-bug, c=workspaces 2026-01-05 19:29:22 +01:00
mr. m
2628ba7dd8 chore: Don't imply MOZ_LD64_KNOWN_GOOD from automation flag, b=no-bug, c=no-component 2026-01-05 18:58:35 +01:00
mr. m
2fd0935bf5 chore: Mark ld64 as known for automated macos builds, b=no-bug, c=configs 2026-01-05 18:37:30 +01:00
mr. m
7683b2675a fix: Fixed title overlapping with essential tabs after unlock, b=closes #11808, c=workspaces 2026-01-05 13:35:43 +01:00
mr. m
ea7024aae4 feat: Start using ld64 for macos builds, b=no-bug, c=configs, compact-mode 2026-01-05 13:31:08 +01:00
mr. m
be8cbce23e fix: Fixed 'focus on' not working on twilight, b=closes #11804, c=no-component 2026-01-05 13:30:16 +01:00
mr. m
9c2b8426a9 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2026-01-05 02:22:53 +01:00
mr. m
beb4f94fd2 chore: Change compile flags for macos to fix potential memory leaks, b=bug #9649, c=configs 2026-01-05 02:22:44 +01:00
Andrey Bochkarev
f39ca33aa5 fix: Correctly identify child active groups for collapsible pins, b=closes https://github.com/zen-browser/desktop/issues/11799, p=#11809, c=folders
* fix: Correctly identify child active groups for `zen-workspace-collapsible-pins` (#11799)

* fix: Formatting
2026-01-04 23:44:13 +01:00
mr. m
7743ad968c fix: Fixed deleting a space when its currently selected, b=no-bug, c=common, workspaces 2026-01-04 23:43:29 +01:00
mr. m
7470df4cf6 feat: Fixed creating new unsynced windows rendering the window blank, b=no-bug, c=common, tabs, workspaces 2026-01-04 19:15:18 +01:00
mr. m
aef8400841 feat: Improved gradient rendering for three colors, b=no-bug, c=workspaces 2026-01-03 23:11:08 +01:00
mr. m
babd7ad871 feat: Fixed animating new tabs and improved compact mode correctness, b=no-bug, c=common, compact-mode 2026-01-03 18:36:46 +01:00
mr. m
4000cc3d55 feat: Wait a delay to collapse pinned tabs on startup and listen for space changes on session store, b=no-bug, c=workspaces 2026-01-03 15:55:00 +01:00
mr. m
3fc7629b3a feat: Make workspace initialization an async process for better performance, b=no-bug, c=common, kbs, workspaces 2026-01-03 15:00:53 +01:00
mr. m
9dbd4cdd41 chore: [part 2] Continue on motion to native animations migration, p=#11798
* chore: Motion to native animatiosn migration, b=no-bug, c=common, glance, split-view

* Discard changes to src/zen/glance/zen-glance.css

* Discard changes to src/zen/glance/ZenGlanceManager.mjs

* feat: [part 2]: Continue on motion to native animations migration, b=no-bug, c=common, folders, split-view, workspaces
2026-01-03 02:52:23 +01:00
realSilasYang
3d45363c8f fix: Hide Unified Panel when navigating to management pages, p=#11790
* Hide unified panel popup after context menu actions

Signed-off-by: realSilasYang <64590265+realSilasYang@users.noreply.github.com>

* Add unified extensions manage hook initialization

Signed-off-by: realSilasYang <64590265+realSilasYang@users.noreply.github.com>

* Fix indentation in ZenSiteDataPanel.sys.mjs

Signed-off-by: realSilasYang <64590265+realSilasYang@users.noreply.github.com>

* Refactor code for better readability and consistency

Signed-off-by: realSilasYang <64590265+realSilasYang@users.noreply.github.com>

* Remove hidePopup call in addons context menu

Remove call to hidePopup in context_zenOpenGetAddons.

Signed-off-by: realSilasYang <64590265+realSilasYang@users.noreply.github.com>

* Refactor code for consistency and readability

Signed-off-by: realSilasYang <64590265+realSilasYang@users.noreply.github.com>

* Simplify event listener setup for manageExtensionItem

Removed unnecessary check for manageExtensionItem and unifiedPanel before adding event listener.

Signed-off-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>

---------

Signed-off-by: realSilasYang <64590265+realSilasYang@users.noreply.github.com>
Signed-off-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>
Co-authored-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>
2026-01-03 02:45:35 +01:00
mr. m
e118cc1a20 chore: Motion to native animatiosn migration, p=#11796
* chore: Motion to native animatiosn migration, b=no-bug, c=common, glance, split-view

* Discard changes to src/zen/glance/zen-glance.css

* Discard changes to src/zen/glance/ZenGlanceManager.mjs
2026-01-03 02:42:17 +01:00
mr. m
bc8a26223b feat: Properly handle new profiles without a previous session, b=no-bug, c=common, workspaces 2026-01-02 13:58:49 +01:00
mr. m
9e6998bc1a feat: Take into account tab entry index may not exist, b=no-bug, c=no-component 2026-01-02 00:18:51 +01:00
mr. m
560c92cc0e fix: Fixed custom tab icons not inheriting color fills on essentials, b=no-bug, c=common, tabs 2026-01-01 23:47:00 +01:00
mr. m
699c42cce4 chore: Change folder structure for icons to match their system name, p=#11784, c=common 2026-01-01 18:30:18 +01:00
mr. m
f6ba087539 feat: Make sure to sync tab's permanent key to other windows, b=bug #11750, c=folders, split-view 2026-01-01 17:43:57 +01:00
mr-cheffy
5fb096865c docs: Update monthly issue metrics, b=(no bug), c={docs} 2026-01-01 02:55:53 +00:00
mr. m
ff69cbe259 feat: Increase inner padding for toolbar buttons for windows and linux, b=no-bug, c=common 2025-12-31 19:54:07 +01:00
mr. m
be0668561f feat: Better menu bar integration, p=#11780, c=workspaces, common, kbs
* feat: Better menu bar integration, b=no-bug, c=workspaces, common, kbs
2025-12-31 18:34:30 +01:00
mr. m
7af0aab07f feat: Optimized SVGs after properly merging paths with inkscape's CLI tool, b=no-bug, c=common, media 2025-12-31 15:25:19 +01:00
mr. m
07b2a74a66 feat: Revert icon optimizations and change welcome essentials, b=no-bug, c=common, media, images, welcome 2025-12-31 13:20:05 +01:00
mr. m
07150962a2 feat: Wait for the next cycle to set a drag image, b=no-bug, c=no-component 2025-12-30 19:30:51 +01:00
mr. m
bfee94c7bf feat: Always restore sessions but clear unpinned tabs when persistent private mode is enabled, b=closes #11751, c=no-component 2025-12-30 18:46:12 +01:00
mr. m
810d959fbf fix: Fixed PGO builds causing daily builds to fail, b=no-bug, c=workspaces 2025-12-30 12:55:32 +01:00
mr. m
639eb9a267 feat: Initialize closed windows if no normal restorable windows have been found, b=no-bug, c=workspaces 2025-12-30 00:47:03 +01:00
mr. m
ec398760c6 feat: Optimized SVGs and improved small details, b=no-bug, c=common, media, tabs, workspaces 2025-12-29 15:46:39 +01:00
mr. m
7a8ac8bd9c feat: Improved pinned tabs collapse impl and disable window sync for tests, b=no-bug, c=tabs, common, workspaces 2025-12-29 02:01:31 +01:00
mr. m
86f9031b67 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-12-28 20:05:27 +01:00
mr. m
335c024e6d chore: Drag and drop refactor, p=#11723
* feat: Full cross-window workspace syncing, b=no-bug, c=workspaces

* feat: Also change icons and labels if the tab is pending, b=no-bug, c=tabs, workspaces

* feat: Dont session duplicate the tabs, b=no-bug, c=workspaces

* feat: Properly handle tab moves, b=no-bug, c=workspaces

* feat: Start on new session restore, b=no-bug, c=no-component

* Discard changes to prefs/browser.yaml

* feat: Start doing out own session restore, b=no-bug, c=folders, tabs

* feat: Stop using pinned manager and use zen session sidebar, b=no-bug, c=common, folders, tabs, workspaces

* feat: Dont restore windows that are already initialized, b=no-bug, c=no-component

* chore: Update patches to ff 145, b=no-bug, c=no-component

* Discard changes to src/browser/components/sessionstore/SessionStore-sys-mjs.patch

* Discard changes to src/browser/components/tabbrowser/content/tab-js.patch

* Discard changes to src/browser/components/tabbrowser/content/tabbrowser-js.patch

* Discard changes to src/zen/tabs/ZenPinnedTabsStorage.mjs

* feat: Run session saver before opening a new winodw, b=no-bug, c=tabs

* feat: Clone the previous state, b=no-bug, c=no-component

* feat: Move window sync to its own JS module, b=no-bug, c=workspaces

* feat: Run session saver before opening a new window, b=no-bug, c=no-component

* feat: Full cross-window workspace syncing, b=no-bug, c=workspaces

* feat: Also change icons and labels if the tab is pending, b=no-bug, c=tabs, workspaces

* feat: Dont session duplicate the tabs, b=no-bug, c=workspaces

* feat: Start on new session restore, b=no-bug, c=no-component

* feat: Properly handle tab moves, b=no-bug, c=workspaces

* Discard changes to prefs/browser.yaml

* feat: Start doing out own session restore, b=no-bug, c=folders, tabs

* feat: Stop using pinned manager and use zen session sidebar, b=no-bug, c=common, folders, tabs, workspaces

* feat: Dont restore windows that are already initialized, b=no-bug, c=no-component

* chore: Update patches to ff 145, b=no-bug, c=no-component

* Discard changes to src/browser/components/sessionstore/SessionStore-sys-mjs.patch

* Discard changes to src/browser/components/tabbrowser/content/tab-js.patch

* Discard changes to src/browser/components/tabbrowser/content/tabbrowser-js.patch

* Discard changes to src/zen/tabs/ZenPinnedTabsStorage.mjs

* feat: Run session saver before opening a new winodw, b=no-bug, c=tabs

* feat: Clone the previous state, b=no-bug, c=no-component

* feat: Move window sync to its own JS module, b=no-bug, c=workspaces

* feat: Run session saver before opening a new window, b=no-bug, c=no-component

* feat: Start making use of IDs instead of sync identifiers, b=no-bug, c=folders

* feat: Listen to new tab opens for new sync system, b=no-bug, c=common, folders, tabs

* feat: Listen for more tab events and properly sync them, b=no-bug, c=common, folders, tabs

* feat: Start moving browser views to the selected windows, b=no-bug, c=no-component

* chore: Remove extra patch, b=no-bug, c=no-component

* feat: Leave a screenshot of the page behind when switching windows or tabs, b=no-bug, c=common

* feat: Run session saves right before writing and quiting, b=no-bug, c=common

* fix: Fixed going back to a different window not allowing to type on inputs, b=no-bug, c=no-component

* feat: Start syncing folders as well, b=no-bug, c=folders

* Discard changes to src/browser/components/tabbrowser/content/tab-js.patch

* chore: Update patches to ff 146, b=no-bug, c=no-component

* feat: Early support for unsynced windoiws, b=no-bug, c=workspaces

* fix: Move back active views when closing a window, b=no-bug, c=no-component

* feat: Stop rendering sub-layers when swaping browsers, b=no-bug, c=common

* feat: Improved support for unsynced windows support, b=no-bug, c=workspaces, folders

* feat: Implemented 'Move To...' Button for unsynced windows, b=no-bug, c=workspaces, common

* feat: Make sure to properly flush all windows when making a new one and fix removing progress listeners, b=no-bug, c=workspaces

* feat: Make sure to not lose any tabs when opening from a private window, b=no-bug, c=workspaces

* feat: Allow unload to run instantly and fix closing windows on mac, b=no-bug, c=no-component

* feat: Make sure to always initialize an empty state with the sidebar object, b=no-bug, c=workspaces

* chore: Small fixes and QA checks, b=no-bug, c=tabs, workspaces

* fix: Fixed tab labels not changing on unfocused windows, b=no-bug, c=no-component

* feat: Fixed closing windows on macos not returning to the original views, b=no-bug, c=no-component

* chore: Turn off debug flags by default, b=no-bug, c=no-component

* feat: Start implementing old pinned tab behaviour we used to have, b=no-bug, c=common, tabs

* feat: Unsynced windows should always be allowed to change labels, b=no-bug, c=welcome

* feat: Make sure we wait long enough before we initialize workspaces, b=no-bug, c=workspaces

* feat: Dont mix remoteness when changing browser views and restore window spaces, b=no-bug, c=common, folders, workspaces

* test: Fixed tests for the pinned tabs manager, b=no-bug, c=tabs, folders, tests, welcome

* feat: Added partial support for split views, b=no-bug, c=split-view

* chore: Finished basic support for split views, b=no-bug, c=folders, split-view

* feat: Always make sure to save the last closed window to the sidebar object, b=no-bug, c=no-component

* feat: Implement workspace sync store into the session file, b=closes #10857, c=common, tabs, tests, workspaces

* feat: New drag and drop system, b=no-bug, c=tabs, common, folders

* feat: Add support for drag-and-dropping tabs into groups, b=no-bug, c=common, folders, tabs, workspaces

* feat: Add a default value for the workspace cache, b=no-bug, c=workspaces

* fix: Default assign an array instead of an object to the workspaces cache, b=no-bug, c=workspaces

* feat: Take into consideration win data may not have allocated spaces, b=no-bug, c=workspaces

* feat: Always make sure we are assigning the correct space ID, b=no-bug, c=workspaces

* feat: Make sure to initialize windows even if there are no tabs, b=no-bug, c=no-component

* feat: Improved drag and drop simulation, b=no-bug, c=common, tabs

* feat: Implement opacity changes to the drag image, b=no-bug, c=tabs, common, split-view

* feat: Support for drag and dropping outside the window, b=no-bug, c=split-view

* feat: Added transitions when reordering, b=no-bug, c=split-view, tabs

* feat: Started working on drag and dropping to essentials, b=no-bug, c=no-component

* Discard changes to locales/en-US/browser/browser/zen-workspaces.ftl

* Discard changes to prefs/zen/view.yaml

* Discard changes to prefs/zen/zen.yaml

* Discard changes to src/browser/base/content/zen-assets.inc.xhtml

* Discard changes to src/browser/base/content/zen-assets.jar.inc.mn

* Discard changes to src/browser/base/content/zen-panels/popups.inc

* Discard changes to src/browser/base/content/zen-preloaded.inc.xhtml

* Discard changes to src/browser/components/places/content/editBookmark-js.patch

* Discard changes to src/browser/components/sessionstore/SessionStore-sys-mjs.patch

* Discard changes to src/browser/components/sessionstore/TabState-sys-mjs.patch

* Discard changes to src/browser/components/tabbrowser/content/tab-js.patch

* Discard changes to src/browser/components/urlbar/UrlbarProviderPlaces-sys-mjs.patch

* Discard changes to src/zen/ZenComponents.manifest

* Discard changes to src/browser/components/tabbrowser/content/tabbrowser-js.patch

* feat: Finish migration, b=no-bug, c=no-component

* feat: Add support for multi tabs dragging, b=no-bug, c=tabs

* feat: Added support for essential tabs, b=no-bug, c=split-view, tabs, workspaces

* feat: Added support to switch space when holding on the side of the sidebar, b=no-bug, c=common, split-view, workspaces

* Discard changes to src/browser/components/tabbrowser/content/tabbrowser-js.patch

* chore: Fixed merge conflicts, b=no-bug, c=no-component

* feat: Added support for split views, b=no-bug, c=split-view

---------

Signed-off-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>
2025-12-28 18:26:52 +01:00
mr. m
b66b05dcf6 feat: Allow pinned tabs to be collapsible, p=#11753, c=tabs, folders, workspaces
* fix: Fixed restoring the previous pinned state clearing up the custom icon, b=no-bug, c=tabs

* feat: Allow pinned tabs to be collapsible, b=no-bug, c=tabs, folders, workspaces

* fix: Fixed new folder context menu item not working, b=no-bug, c=common, folders
2025-12-28 17:58:18 +01:00
mr. m
32a9267af2 fix: Fixed restoring the previous pinned state clearing up the custom icon, b=no-bug, c=tabs 2025-12-28 14:58:35 +01:00
mr. m
1338b43e10 feat: Add migration logic for zen_pins database to window sync, b=no-bug, c=common, tabs 2025-12-27 18:52:09 +01:00
mr. m
ec8b14e8f1 fix: Fixed custom tab icons not persisting across sessions, p=#11744
* fix: Fixed custom tab icons not persisting across sessions, b=no-bug, c=common, tabs

* feat: Allow rename tab context menu to appear on expanded mode, b=no-bug, c=tabs
2025-12-27 12:26:34 +01:00
mr. m
47c03d03c8 fix: Run a mouse tracker event on compact mode to check for closes, b=no-bug, c=compact-mode 2025-12-27 12:00:40 +01:00
mr. m
fb7eeebfdb fix: Fixed tab icons disappearing when being restored, b=no-bug, c=tabs 2025-12-25 16:59:15 +01:00
mr. m
d74cf98f6f feat: Make sure to restore spaces even when restore is disabled, b=closes #11724, c=no-component 2025-12-25 15:46:49 +01:00
mr. m
2cba5b94ec feat: Improve migration for new profiles updating to window sync, b=no-bug, c=workspaces 2025-12-25 01:48:10 +01:00
mr. m
6bd199a0b3 fix: Initialize a default space if none exist, b=closes #11720, c=workspaces 2025-12-25 01:12:46 +01:00
mr. m
4c2cb60412 feat: Fixed folders on new windows not expanding at startup, b=no-bug, c=common, folders, tabs, workspaces 2025-12-24 17:34:29 +01:00
mr. m
b3ea7f0e8d feat: Ignore screen sizes when trying to align the tabs toolbar, b=no-bug, c=tabs 2025-12-23 23:28:03 +01:00
mr. m
c761608f27 feat: Fixed spacing for pin reset button, b=no-bug, c=tabs 2025-12-23 21:36:25 +01:00
mr. m
7753202623 feat: Return a copy of workspaces when trying to fetch it to prevent mutations, b=no-bug, c=tabs, workspaces 2025-12-23 20:15:00 +01:00
Dennis Koch
2cc545762e feat: Add print to command palette, p=#11696
* Add print to command palette

* Do not show print command on empty tab
2025-12-22 20:26:52 +01:00
mr. m
578c28df92 feat: Allow tabs to have custom icons and other cleanups, p=#11697
* feat: Allow tabs to have custom icons and other cleanups, b=closes #11686, closees https://github.com/zen-browser/desktop/issues/9972, closes https://github.com/zen-browser/desktop/issues/9251, c=folders, workspaces, tabs, common


* chore: Lint, b=no-bug, c=tabs
2025-12-22 20:26:44 +01:00
mr. m
d93c46fe20 feat: Full cross-window workspace syncing, p=#10034
* feat: Full cross-window workspace syncing, b=no-bug, c=workspaces

* feat: Also change icons and labels if the tab is pending, b=no-bug, c=tabs, workspaces

* feat: Dont session duplicate the tabs, b=no-bug, c=workspaces

* feat: Properly handle tab moves, b=no-bug, c=workspaces

* feat: Start on new session restore, b=no-bug, c=no-component

* Discard changes to prefs/browser.yaml

* feat: Start doing out own session restore, b=no-bug, c=folders, tabs

* feat: Stop using pinned manager and use zen session sidebar, b=no-bug, c=common, folders, tabs, workspaces

* feat: Dont restore windows that are already initialized, b=no-bug, c=no-component

* chore: Update patches to ff 145, b=no-bug, c=no-component

* Discard changes to src/browser/components/sessionstore/SessionStore-sys-mjs.patch

* Discard changes to src/browser/components/tabbrowser/content/tab-js.patch

* Discard changes to src/browser/components/tabbrowser/content/tabbrowser-js.patch

* Discard changes to src/zen/tabs/ZenPinnedTabsStorage.mjs

* feat: Run session saver before opening a new winodw, b=no-bug, c=tabs

* feat: Clone the previous state, b=no-bug, c=no-component

* feat: Move window sync to its own JS module, b=no-bug, c=workspaces

* feat: Run session saver before opening a new window, b=no-bug, c=no-component

* feat: Full cross-window workspace syncing, b=no-bug, c=workspaces

* feat: Also change icons and labels if the tab is pending, b=no-bug, c=tabs, workspaces

* feat: Dont session duplicate the tabs, b=no-bug, c=workspaces

* feat: Start on new session restore, b=no-bug, c=no-component

* feat: Properly handle tab moves, b=no-bug, c=workspaces

* Discard changes to prefs/browser.yaml

* feat: Start doing out own session restore, b=no-bug, c=folders, tabs

* feat: Stop using pinned manager and use zen session sidebar, b=no-bug, c=common, folders, tabs, workspaces

* feat: Dont restore windows that are already initialized, b=no-bug, c=no-component

* chore: Update patches to ff 145, b=no-bug, c=no-component

* Discard changes to src/browser/components/sessionstore/SessionStore-sys-mjs.patch

* Discard changes to src/browser/components/tabbrowser/content/tab-js.patch

* Discard changes to src/browser/components/tabbrowser/content/tabbrowser-js.patch

* Discard changes to src/zen/tabs/ZenPinnedTabsStorage.mjs

* feat: Run session saver before opening a new winodw, b=no-bug, c=tabs

* feat: Clone the previous state, b=no-bug, c=no-component

* feat: Move window sync to its own JS module, b=no-bug, c=workspaces

* feat: Run session saver before opening a new window, b=no-bug, c=no-component

* feat: Start making use of IDs instead of sync identifiers, b=no-bug, c=folders

* feat: Listen to new tab opens for new sync system, b=no-bug, c=common, folders, tabs

* feat: Listen for more tab events and properly sync them, b=no-bug, c=common, folders, tabs

* feat: Start moving browser views to the selected windows, b=no-bug, c=no-component

* chore: Remove extra patch, b=no-bug, c=no-component

* feat: Leave a screenshot of the page behind when switching windows or tabs, b=no-bug, c=common

* feat: Run session saves right before writing and quiting, b=no-bug, c=common

* fix: Fixed going back to a different window not allowing to type on inputs, b=no-bug, c=no-component

* feat: Start syncing folders as well, b=no-bug, c=folders

* Discard changes to src/browser/components/tabbrowser/content/tab-js.patch

* chore: Update patches to ff 146, b=no-bug, c=no-component

* feat: Early support for unsynced windoiws, b=no-bug, c=workspaces

* fix: Move back active views when closing a window, b=no-bug, c=no-component

* feat: Stop rendering sub-layers when swaping browsers, b=no-bug, c=common

* feat: Improved support for unsynced windows support, b=no-bug, c=workspaces, folders

* feat: Implemented 'Move To...' Button for unsynced windows, b=no-bug, c=workspaces, common

* feat: Make sure to properly flush all windows when making a new one and fix removing progress listeners, b=no-bug, c=workspaces

* feat: Make sure to not lose any tabs when opening from a private window, b=no-bug, c=workspaces

* feat: Allow unload to run instantly and fix closing windows on mac, b=no-bug, c=no-component

* feat: Make sure to always initialize an empty state with the sidebar object, b=no-bug, c=workspaces

* chore: Small fixes and QA checks, b=no-bug, c=tabs, workspaces

* fix: Fixed tab labels not changing on unfocused windows, b=no-bug, c=no-component

* feat: Fixed closing windows on macos not returning to the original views, b=no-bug, c=no-component

* chore: Turn off debug flags by default, b=no-bug, c=no-component

* feat: Start implementing old pinned tab behaviour we used to have, b=no-bug, c=common, tabs

* feat: Unsynced windows should always be allowed to change labels, b=no-bug, c=welcome

* feat: Make sure we wait long enough before we initialize workspaces, b=no-bug, c=workspaces

* feat: Dont mix remoteness when changing browser views and restore window spaces, b=no-bug, c=common, folders, workspaces

* test: Fixed tests for the pinned tabs manager, b=no-bug, c=tabs, folders, tests, welcome

* feat: Added partial support for split views, b=no-bug, c=split-view

* chore: Finished basic support for split views, b=no-bug, c=folders, split-view

* feat: Always make sure to save the last closed window to the sidebar object, b=no-bug, c=no-component

* feat: Implement workspace sync store into the session file, b=closes #10857, c=common, tabs, tests, workspaces

* feat: Add a default value for the workspace cache, b=no-bug, c=workspaces

* fix: Default assign an array instead of an object to the workspaces cache, b=no-bug, c=workspaces

* feat: Take into consideration win data may not have allocated spaces, b=no-bug, c=workspaces

* feat: Always make sure we are assigning the correct space ID, b=no-bug, c=workspaces

* feat: Make sure to initialize windows even if there are no tabs, b=no-bug, c=no-component

---------

Signed-off-by: mr. m <91018726+mr-cheffy@users.noreply.github.com>
2025-12-22 11:12:52 +01:00
591 changed files with 8195 additions and 6946 deletions

View File

@@ -15,7 +15,7 @@ fonts
welcome
scripts
workflows
winsign
windows
flatpak
configs
l10n

View File

@@ -126,8 +126,9 @@ jobs:
export SURFER_PLATFORM="darwin"
export PATH="$(python3 -m site --user-base)/bin":$PATH
# Always exist with 0, even if bootstrap fails
./mach --no-interactive bootstrap --application-choice browser --no-system-changes --exclude macos-sdk || true
./mach --no-interactive bootstrap --application-choice browser --exclude macos-sdk || true
cd ..
ls /Library/Developer/CommandLineTools/SDKs/MacOSX26.2.sdk
- name: Build language packs
run: sh scripts/download-language-packs.sh

View File

@@ -92,6 +92,7 @@ jobs:
- name: Populate mozconfig
env:
SURFER_MOZCONFIG_ONLY: true
ZEN_RELEASE: 1
run: |
npm run build
cd engine

View File

@@ -47,6 +47,12 @@ jobs:
if: steps.check-upstream-branch.outputs.branch_exists == 'false'
run: npm ci
- name: Install dependencies
if: steps.check-upstream-branch.outputs.branch_exists == 'false'
run: |
git config --global user.email "mr-cheffy@users.noreply.github.com"
git config --global user.name "mr-cheffy"
- name: Setup surfer CI
if: steps.check-upstream-branch.outputs.branch_exists == 'false'
run: |
@@ -67,6 +73,12 @@ jobs:
npm run sync
fi
- name: Run formatter
if: steps.check-upstream-branch.outputs.branch_exists == 'false'
run: |
sudo apt install python3-autopep8
npm run pretty
- name: Check if any files changed
id: git-check
run: |
@@ -97,7 +109,7 @@ jobs:
- name: Import external tests
if: steps.git-check.outputs.files_changed == 'true'
run: python3 scripts/import_external_tests.py
run: python3 scripts/import_external_tests.py || true
- name: Create pull request
uses: peter-evans/create-pull-request@v7

View File

@@ -197,12 +197,14 @@ jobs:
else
rustup target add x86_64-pc-windows-msvc
fi
# Stored in build/windows/.windows-rs-version
WINDOWS_RS_VERSION=$(cat build/windows/.windows-rs-version)
cd engine/
cargo install cargo-download --locked
cargo download -x windows=0.58.0
cargo download -x windows=$WINDOWS_RS_VERSION
export CARGO_INCREMENTAL=0
echo "" >> ../configs/common/mozconfig
echo "export MOZ_WINDOWS_RS_DIR=$(pwd)/windows-0.58.0" >> ../configs/common/mozconfig
echo "export MOZ_WINDOWS_RS_DIR=$(pwd)/windows-$WINDOWS_RS_VERSION" >> ../configs/common/mozconfig
- name: Build language packs
if: ${{ !(inputs.generate-gpo && matrix.arch == 'aarch64') }}

View File

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

View File

@@ -1 +1 @@
b6f4d18893d4f547f01d5e8aa8a4b364b168c84f
459ca9dfb9642c48c4ae314ce489d462b25448a8

View File

@@ -0,0 +1 @@
0.62.2

View File

@@ -47,6 +47,8 @@ if test "$ZEN_RELEASE"; then
# ac_add_options --enable-clang-plugin
ac_add_options --enable-bootstrap=-sccache
ac_add_options --enable-optimize
ac_add_options --enable-release
ac_add_options --disable-debug
ac_add_options --disable-debug-symbols
@@ -56,8 +58,6 @@ if test "$ZEN_RELEASE"; then
ac_add_options --enable-rust-simd
ac_add_options --enable-wasm-simd
mk_add_options MOZ_PARALLEL_COMPILE=1
ac_add_options --disable-geckodriver
ac_add_options --disable-rust-tests
@@ -73,24 +73,13 @@ if test "$ZEN_RELEASE"; then
fi
fi
ac_add_options --enable-jemalloc
mk_add_options MOZILLA_OFFICIAL=1
MOZILLA_OFFICIAL=1
export MOZILLA_OFFICIAL=1
export OPT_LEVEL="3"
ac_add_options OPT_LEVEL="3"
export RUSTC_OPT_LEVEL="3"
ac_add_options RUSTC_OPT_LEVEL="3"
mk_add_options AUTOCLOBBER=1
export AUTOCLOBBER=1
ac_add_options --enable-updater
ac_add_options --enable-js-shell
export MOZ_PACKAGE_JSSHELL=1
ac_add_options --disable-crashreporter

View File

@@ -17,30 +17,16 @@ if test "$ZEN_RELEASE"; then
ac_add_options --enable-eme=widevine
# Enable Profile Guided Optimization
if test "$ZEN_GA_DISABLE_PGO"; then
export ZEN_DUMMY=1
else
export MOZ_PGO=1
ac_add_options MOZ_PGO=1
if ! test "$ZEN_GA_DISABLE_PGO"; then
export MOZ_PGO=1
ac_add_options MOZ_PGO=1
fi
# Optimization flags for SURFER_COMPAT
ac_add_options --enable-optimize="-O3 -w -ftree-vectorize -mfpmath=sse -mprfchw -msse3 -mcx16 -msahf"
export LDFLAGS="$LDFLAGS -Wl,-O3"
elif test "$SURFER_COMPAT" = "aarch64"; then
ac_add_options --target=aarch64-linux-gnu
ac_add_options --enable-optimize="-O3"
# override LTO settings
export MOZ_LTO=cross,thin
ac_add_options --enable-lto=cross,thin
export CFLAGS="$CFLAGS -O3"
export CPPFLAGS="$CPPFLAGS -O3"
export CXXFLAGS="$CXXFLAGS -O3"
export LDFLAGS="$LDFLAGS -Wl,-O3"
fi
# Disable DMD and ELF hacks, enable linker lld

View File

@@ -28,28 +28,31 @@ if test "$SURFER_COMPAT" = "x86_64"; then
if test "$ZEN_RELEASE"; then
ac_add_options --enable-wasm-avx
ac_add_options --enable-optimize="-march=nehalem -mtune=haswell -O3 -w"
export CFLAGS="-O3 -march=nehalem"
export CPPFLAGS="-O3 -march=nehalem"
export CXXFLAGS="-O3 -march=nehalem"
export LDFLAGS="-Wl,-O3 -march=nehalem"
export RUSTFLAGS="-Ctarget-cpu=nehalem"
fi
else
ac_add_options --enable-clang-plugin
ac_add_options --target=aarch64-apple-darwin
if test "$ZEN_RELEASE"; then
ac_add_options --enable-optimize="-O3 -mcpu=apple-m1 -march=armv8.3-a+simd"
# As of Clang 13, the default is -mcpu=apple-m1 when using a aarch64-apple-macos target,
# but we're using apple64-apple-darwin, which defaults to -mcpu=apple-a7, which disables
# a bunch of # performance-enabling CPU features.
export CFLAGS="-O3 -march=armv8.3-a+simd -mcpu=apple-m1"
export CPPFLAGS="-O3 -march=armv8.3-a+simd -mcpu=apple-m1"
export CXXFLAGS="-O3 -march=armv8.3-a+simd -mcpu=apple-m1"
export LDFLAGS="-Wl,-O3 -march=armv8.3-a+simd -mcpu=apple-m1"
export RUSTFLAGS="-C target-feature=+v8.3a -Ctarget-cpu=apple-m1"
# TODO: We'll want to switch to aarch64-apple-macos eventually.
export CFLAGS="$CFLAGS -mcpu=apple-m1"
export CXXFLAGS="$CXXFLAGS -mcpu=apple-m1"
fi
fi
if test "$ZEN_RELEASE"; then
ac_add_options --with-macos-sdk=/Library/Developer/CommandLineTools/SDKs/MacOSX26.2.sdk
fi
# Keep using ld64 on PGO/LTO builds because of performance regressions when using lld.
# Mozilla sets "MOZ_LD64_KNOWN_GOOD" to true when they do automated builds with PGO/LTO on macOS.
# See https://searchfox.org/firefox-main/rev/e61d59b5c9a651fd7bf28043f87c0dc669833496/build/moz.configure/lto-pgo.configure#261
# export MOZ_LD64_KNOWN_GOOD=1
# ac_add_options --enable-linker=ld64
#
# if test "$ZEN_RELEASE"; then
# mk_add_options MOZ_MAKE_FLAGS="-j4"
# fi

View File

@@ -30,34 +30,19 @@ ac_add_options --disable-maintenance-service
ac_add_options --disable-bits-download
if test "$SURFER_COMPAT" = "x86_64"; then
ac_add_options --target=x86_64-pc-windows-msvc
ac_add_options --enable-eme=widevine,wmfcdm
ac_add_options --enable-optimize="-O3 -w -ftree-vectorize -mfpmath=sse -mprfchw -msse3 -mcx16 -msahf"
export LDFLAGS="-Wl,-O3"
export RUSTFLAGS="-Clink-args=--icf=safe"
elif test "$SURFER_COMPAT" = "aarch64"; then
ac_add_options --target=aarch64-pc-windows-msvc
ac_add_options --enable-eme=widevine
ac_add_options --enable-optimize="-O2 -mtune=cortex-a55 -march=armv8.2-a+simd"
# override LTO settings
export MOZ_LTO=cross,thin
ac_add_options --enable-lto=cross,thin
export CFLAGS="-O2 -march=armv8.2-a+simd -mtune=cortex-a55"
export CPPFLAGS="-O2 -march=armv8.2-a+simd -mtune=cortex-a55"
export CXXFLAGS="-O2 -march=armv8.2-a+simd -mtune=cortex-a55"
export LDFLAGS="-Wl,-O2 -march=armv8.2-a+simd -mtune=cortex-a55"
export RUSTFLAGS="-C target-feature=+v8.2a -Ctarget-cpu=cortex-a55"
fi
if test "$ZEN_CROSS_COMPILING"; then
if test "$ZEN_GA_GENERATE_PROFILE"; then
export CXXFLAGS="$CXXFLAGS -fprofile-generate -mllvm -enable-name-compression=false -mllvm -pgo-temporal-instrumentation -fprofile-update=atomic"
mk_add_options "export MOZ_AUTOMATION_PACKAGE_GENERATED_SOURCES=0"
ac_add_options --enable-profile-generate=cross
elif test "$SURFER_COMPAT" = "x86_64"; then

View File

@@ -8,6 +8,8 @@ files:
translation: browser/browser/zen-general.ftl
- source: en-US/browser/browser/zen-split-view.ftl
translation: browser/browser/zen-split-view.ftl
- source: en-US/browser/browser/zen-menubar.ftl
translation: browser/browser/zen-menubar.ftl
- source: en-US/browser/browser/zen-vertical-tabs.ftl
translation: browser/browser/zen-vertical-tabs.ftl
- source: en-US/browser/browser/zen-welcome.ftl

View File

@@ -0,0 +1,178 @@
# Issue Metrics
| Metric | Average | Median | 90th percentile |
| --- | --- | --- | ---: |
| Time to first response | 1 day, 0:30:20 | 5:02:49 | 2 days, 2:05:28 |
| Time to close | 1 day, 6:06:03 | 15:57:36 | 3 days, 0:29:29 |
| Metric | Count |
| --- | ---: |
| Number of items that remain open | 75 |
| Number of items closed | 85 |
| Total number of items created | 160 |
| Title | URL | Time to first response | Time to close |
| --- | --- | --- | --- |
| Downloads with "always ask you where to save files" occur twice -- in the downloads folder as well as in the path specified after popup | https://github.com/zen-browser/desktop/issues/11779 | None | None |
| Change tab to a different workspace option is not visible | https://github.com/zen-browser/desktop/issues/11778 | 20:10:39 | 20:10:39 |
| Closing Tab Does Not Go To Previous Tab for Pinned tabs | https://github.com/zen-browser/desktop/issues/11775 | None | None |
| Folders tab glance not working on Windows v1.17.15b (64-bit) | https://github.com/zen-browser/desktop/issues/11774 | 1 day, 2:08:49 | None |
| Browser Layout resets after Toggle Sidebar's Width | https://github.com/zen-browser/desktop/issues/11771 | 1 day, 5:27:23 | 1 day, 5:27:23 |
| PDF Download | https://github.com/zen-browser/desktop/issues/11768 | 1 day, 5:48:10 | 1 day, 5:48:10 |
| “Show search suggestions” setting unchecks itself &#124; Settings UI value not synced with about:config | https://github.com/zen-browser/desktop/issues/11767 | 1 day, 6:26:12 | 1 day, 6:26:12 |
| Full screen mode not working in YouTube while using Glance mode | https://github.com/zen-browser/desktop/issues/11766 | 1:59:37 | None |
| Guacamole paste | https://github.com/zen-browser/desktop/issues/11765 | 2:04:31 | 2:04:31 |
| Workspace icons as dots | https://github.com/zen-browser/desktop/issues/11763 | 0:03:17 | 0:23:41 |
| Printing Issue | https://github.com/zen-browser/desktop/issues/11762 | 11:29:55 | None |
| My profiles folder is not loading after the last update. | https://github.com/zen-browser/desktop/issues/11761 | 3:00:38 | None |
| Video Playback Issues | https://github.com/zen-browser/desktop/issues/11760 | 16:12:17 | 16:12:17 |
| When closing the window on mac and reopening the browser, the session isn't restored | https://github.com/zen-browser/desktop/issues/11759 | None | 17:41:15 |
| Identical filenames for clipboard images (image.png) prevents multiple uploads in Gemini | https://github.com/zen-browser/desktop/issues/11758 | 18:30:44 | 18:30:44 |
| Search suggestions cannot be hidden | https://github.com/zen-browser/desktop/issues/11755 | 1:14:56 | 1 day, 3:42:17 |
| [Bug] [Twilight] [Win 11] New window in virtual desktop bugs and opens several new windows | https://github.com/zen-browser/desktop/issues/11754 | 1 day, 10:56:04 | 2 days, 18:04:04 |
| [Twilight] Pinned tab reset when restart | https://github.com/zen-browser/desktop/issues/11751 | 2 days, 2:05:28 | 2 days, 8:02:26 |
| Profile locks are being ignored, causing weird synced behavior | https://github.com/zen-browser/desktop/issues/11750 | 11:19:12 | None |
| selecting tabs, Right Click to add them to a New Folder no longer works | https://github.com/zen-browser/desktop/issues/11745 | 2:42:55 | 3 days, 0:31:33 |
| When Zen Browser is set as the default browser, it cannot open links clicked from external applications under KDE. | https://github.com/zen-browser/desktop/issues/11743 | 7:19:40 | 7:19:40 |
| After updating all the folders and essential tabs are empty | https://github.com/zen-browser/desktop/issues/11741 | 4:15:52 | 3 days, 5:50:29 |
| Poor performance in OnShape | https://github.com/zen-browser/desktop/issues/11740 | None | None |
| Can't hide tab groups. | https://github.com/zen-browser/desktop/issues/11739 | 2:27:37 | 7:47:28 |
| Cannot install extension via local file if sidebar and toolbar are hidden | https://github.com/zen-browser/desktop/issues/11738 | None | 8:26:16 |
| [Bug] White space padding below minimized parent folder containing partially minimized subfolders | https://github.com/zen-browser/desktop/issues/11736 | 3 days, 14:36:08 | 3 days, 14:36:08 |
| Youtube Shorts Video is hidden out of view, but loaded | https://github.com/zen-browser/desktop/issues/11734 | 5:52:53 | None |
| Websites not funcationing correctly in latest version | https://github.com/zen-browser/desktop/issues/11733 | 0:15:44 | 0:15:44 |
| Sidebar not hiding when in compact mode | https://github.com/zen-browser/desktop/issues/11732 | None | None |
| Lag when restoring sessions with addons like Tab Session Manager? | https://github.com/zen-browser/desktop/issues/11731 | 10:52:46 | None |
| Crash and no load video | https://github.com/zen-browser/desktop/issues/11729 | 0:35:39 | 0:35:39 |
| Bug: Right-Click Menu Text Not Visible | https://github.com/zen-browser/desktop/issues/11728 | 5:49:57 | None |
| Firefox Extension pop-up doesnt open when side-panel is hidden | https://github.com/zen-browser/desktop/issues/11727 | None | 0:55:53 |
| Master Password Prompt on duckai | https://github.com/zen-browser/desktop/issues/11725 | None | None |
| [Twilight] Spaces are removed after updating to December 25 version | https://github.com/zen-browser/desktop/issues/11724 | 2:03:12 | None |
| Memory leak on arch linux? | https://github.com/zen-browser/desktop/issues/11721 | 5:03:16 | None |
| Upgrade to 1.18t lost everything. | https://github.com/zen-browser/desktop/issues/11720 | 5:02:49 | 5:14:44 |
| Can't show Kaomoji on Zen. (Special unicode characters Chinese, Korean, Japanese, etc) | https://github.com/zen-browser/desktop/issues/11719 | 1:28:17 | 2 days, 22:27:07 |
| Inconsistent Essential tabs unloading | https://github.com/zen-browser/desktop/issues/11717 | 3:40:23 | None |
| browser is laggy | https://github.com/zen-browser/desktop/issues/11715 | 9:19:37 | 18:42:49 |
| Duplicate “Find on Page” entry in Search & Find shortcut settings | https://github.com/zen-browser/desktop/issues/11714 | None | None |
| Zen sets itself as default | https://github.com/zen-browser/desktop/issues/11712 | 0:17:54 | None |
| Zen does not display data in IndexedDB while on localhost | https://github.com/zen-browser/desktop/issues/11711 | 10:12:55 | 18:12:11 |
| YouTube fullscreen controls are cut off when Zen Browser is in fullscreen mode | https://github.com/zen-browser/desktop/issues/11710 | None | 10:16:10 |
| Chess.com doesn't fit on a page since last update | https://github.com/zen-browser/desktop/issues/11708 | 0:14:05 | 0:14:05 |
| YouTube videos lose contrast when in full screen mode. | https://github.com/zen-browser/desktop/issues/11706 | 6:06:04 | None |
| Disappeared Font Rendering on Wayland Zen Browser | https://github.com/zen-browser/desktop/issues/11705 | None | 2:45:33 |
| TopCV website doesn't displayed correctly | https://github.com/zen-browser/desktop/issues/11704 | 7:52:49 | None |
| Zen not remembering where the tabs opened in the previous sessions. | https://github.com/zen-browser/desktop/issues/11700 | None | 3:04:19 |
| When RestoreDown/maximazing/moving browser the video in Picture-in-Picture mode is returning to the tab by itself | https://github.com/zen-browser/desktop/issues/11698 | 15:05:45 | None |
| I can't continue from where I left off; I need to log in again. | https://github.com/zen-browser/desktop/issues/11695 | 4:19:58 | 4:19:58 |
| Drag addressbar Link to Desktop no longer works | https://github.com/zen-browser/desktop/issues/11694 | 8:13:08 | None |
| opening a link from external application on zen browser | https://github.com/zen-browser/desktop/issues/11692 | 0:08:44 | 0:08:44 |
| Widow border highlight is diffrent depending of the platform | https://github.com/zen-browser/desktop/issues/11691 | 3:53:57 | 3:53:57 |
| Vertical maximize via mouse (Aero Snap) does not work in Zen Browser | https://github.com/zen-browser/desktop/issues/11690 | None | None |
| Some styles appear to be displaying abnormally (context menu, Library) | https://github.com/zen-browser/desktop/issues/11689 | None | None |
| Moving pinned tabs with media playing between windows broken | https://github.com/zen-browser/desktop/issues/11688 | None | None |
| Context menu on tabs says "workspace" instead of "space" | https://github.com/zen-browser/desktop/issues/11686 | None | 1 day, 0:02:12 |
| Can't change folder name | https://github.com/zen-browser/desktop/issues/11683 | 1:50:39 | 6:38:14 |
| Opening DevTools make the browser crash | https://github.com/zen-browser/desktop/issues/11681 | 0:35:01 | 0:35:01 |
| ZEN DOES NOT UPDATE AUTOMATICALLY | https://github.com/zen-browser/desktop/issues/11680 | 0:41:30 | 19:54:17 |
| Visual glitches while scrolling in the bottom of the page. | https://github.com/zen-browser/desktop/issues/11678 | None | None |
| Full screen mode not occupying complete available screen space. | https://github.com/zen-browser/desktop/issues/11676 | None | None |
| On Mac, first item in bookmarks toolbar disappears after closing window and reopening (without closing app) | https://github.com/zen-browser/desktop/issues/11674 | None | None |
| Some web pages freeze for aparently no reason | https://github.com/zen-browser/desktop/issues/11668 | 0:34:14 | None |
| Unable to install Browser Addons in Compact Mode | https://github.com/zen-browser/desktop/issues/11667 | 7:01:49 | None |
| WebGL2 is not working | https://github.com/zen-browser/desktop/issues/11665 | None | 0:04:30 |
| Tab dissapeared after reopening browser after lagging | https://github.com/zen-browser/desktop/issues/11662 | None | None |
| High CPU usage on idle and even higher CPU usage when opening Twitch (even in Troubleshoot Mode) | https://github.com/zen-browser/desktop/issues/11661 | 1:32:07 | 1:47:33 |
| Audio stopped working - Mac | https://github.com/zen-browser/desktop/issues/11660 | None | 23:33:37 |
| Zorin os freeze/crash on video playback | https://github.com/zen-browser/desktop/issues/11657 | None | None |
| "Material Icons" not displaying correctly (but they are in Firefox desktop app) | https://github.com/zen-browser/desktop/issues/11656 | 5:10:45 | None |
| Browser Padding top bar not removable | https://github.com/zen-browser/desktop/issues/11654 | 3:40:52 | 3:40:52 |
| Update to 1.18t: 1) unresponsive on start, 2) duplicated all pinned tabs. | https://github.com/zen-browser/desktop/issues/11653 | 4:27:05 | 4:27:05 |
| Zen doesn't save splitview configuration correctly with "open previous windows and tabs" enabled | https://github.com/zen-browser/desktop/issues/11652 | 1 day, 9:11:28 | 1 day, 9:25:45 |
| Zen reacts to system sound device changes while watching media (youtube) only after playing with the timeline | https://github.com/zen-browser/desktop/issues/11651 | None | None |
| Workspace is synchronized, but bookmarks within the Workspace are not synchronized as well. | https://github.com/zen-browser/desktop/issues/11650 | 9:24:51 | 9:24:51 |
| Zen becomes unresponsive when playing YouTube videos | https://github.com/zen-browser/desktop/issues/11649 | 1 day, 19:29:58 | None |
| proton mail sign up fails on every container except the first container | https://github.com/zen-browser/desktop/issues/11648 | None | None |
| The translation function that comes with Firefox cannot be used after I reinstall ZEN | https://github.com/zen-browser/desktop/issues/11647 | 1 day, 13:40:21 | None |
| Trackpad gesture doesn't work for switching between spaces | https://github.com/zen-browser/desktop/issues/11645 | 4:10:42 | 1 day, 20:43:04 |
| 多工具栏设置无法生效 | https://github.com/zen-browser/desktop/issues/11643 | 1 day, 6:32:46 | 1 day, 18:53:53 |
| A small section of split tabs' border is visible on glance and can be used to resize split tabs | https://github.com/zen-browser/desktop/issues/11641 | None | 2 days, 3:52:57 |
| Opening Zen via a hyperlink doesn't open the link it was given | https://github.com/zen-browser/desktop/issues/11639 | None | 2 days, 6:06:13 |
| Tabs don't show on hover in compact mode when "Tabs are on the right" setting is enabled | https://github.com/zen-browser/desktop/issues/11638 | 0:26:15 | None |
| "New split view" in command bar opens a new tab instead | https://github.com/zen-browser/desktop/issues/11637 | 12:16:48 | 3 days, 3:03:38 |
| The disappearance of the Firefox toolbar extension management icon is a bug or intentional | https://github.com/zen-browser/desktop/issues/11634 | 2:09:59 | 3 days, 0:26:24 |
| Google reverse image search doesn't work, only uploads stripes instead of the actual image | https://github.com/zen-browser/desktop/issues/11633 | 1:34:48 | 2 days, 10:21:07 |
| MacOS: Context Windows appear always on main monitor | https://github.com/zen-browser/desktop/issues/11632 | 3:02:07 | None |
| update firefox version &#124; amazon music and many more media websites not loading | https://github.com/zen-browser/desktop/issues/11631 | 0:30:37 | 0:30:37 |
| UI Scaling issue on linux desktop | https://github.com/zen-browser/desktop/issues/11629 | 3 days, 17:28:00 | None |
| Window can't shrink enough for W11 On-Screen Keyboard | https://github.com/zen-browser/desktop/issues/11628 | 0:50:10 | None |
| Split tab divider can't be moved to resize with bookmarks sidebar open | https://github.com/zen-browser/desktop/issues/11626 | 2 days, 19:07:37 | None |
| Container information cannot be saved correctly. | https://github.com/zen-browser/desktop/issues/11622 | 2:10:41 | 2:10:41 |
| Slow syncing state and browser crashes if trying to delete a space | https://github.com/zen-browser/desktop/issues/11621 | 1 day, 13:13:35 | None |
| Tabs not loaded in beforehand have full favicon transparency | https://github.com/zen-browser/desktop/issues/11620 | 3:00:50 | None |
| Browser keeps crashing when playing videos or just scrolling rapidly. | https://github.com/zen-browser/desktop/issues/11618 | 3:43:34 | 7:22:44 |
| The tab crashes when searching certain words | https://github.com/zen-browser/desktop/issues/11615 | 2 days, 0:53:45 | None |
| Zen profile problems after update and uninstall | https://github.com/zen-browser/desktop/issues/11614 | 11:21:11 | None |
| No button to access extension menu in order to pin when side and top bar enabled | https://github.com/zen-browser/desktop/issues/11612 | 1:54:17 | 1:54:31 |
| Youtube crashes Zen | https://github.com/zen-browser/desktop/issues/11610 | 17:48:03 | None |
| Scree gliches and flashes rapidly | https://github.com/zen-browser/desktop/issues/11606 | None | None |
| Perplexity disappeared in the new version and the app had to installed, all my configurations dissappeared | https://github.com/zen-browser/desktop/issues/11604 | None | 6:03:27 |
| Content under transparent menus appears frozen after menu is opened | https://github.com/zen-browser/desktop/issues/11603 | None | None |
| Nvidia RTX video is broken again for non-fullscreen video on 1.17.13b (2025-12-11) | https://github.com/zen-browser/desktop/issues/11602 | None | None |
| Perplexity gets removed even when added as custom search engine. | https://github.com/zen-browser/desktop/issues/11601 | 9:10:41 | 19:37:58 |
| No content is displaying, just transparent browser | https://github.com/zen-browser/desktop/issues/11599 | 9:27:02 | 1 day, 10:30:08 |
| Bookmarks Side-Panel Font is white on white background when using Windows 11 Dark Theme | https://github.com/zen-browser/desktop/issues/11597 | None | 9 days, 3:57:43 |
| Can't download files from Element | https://github.com/zen-browser/desktop/issues/11596 | 3:27:57 | None |
| The toolbar breaks when changing the browser layout | https://github.com/zen-browser/desktop/issues/11595 | None | None |
| Windows Explorer doesn't open after opening a file through Zen | https://github.com/zen-browser/desktop/issues/11594 | None | None |
| Zen launching instead of opening links | https://github.com/zen-browser/desktop/issues/11593 | None | None |
| Missing spacing between media controls and sidebar notification | https://github.com/zen-browser/desktop/issues/11592 | None | 3:25:48 |
| Addons (extensions) not added when side bar not open | https://github.com/zen-browser/desktop/issues/11591 | 7 days, 7:20:32 | 7 days, 7:20:32 |
| No video streaming on Twitch.TV | https://github.com/zen-browser/desktop/issues/11590 | 1:40:34 | 2:13:10 |
| Zen Browser loops when visiting pionex.us instead of loading and stopping | https://github.com/zen-browser/desktop/issues/11589 | 0:22:45 | 5:25:13 |
| Firefox add-ons fail to auto update | https://github.com/zen-browser/desktop/issues/11586 | 8:36:24 | None |
| Opening two instances (windows) of Zen Browser | https://github.com/zen-browser/desktop/issues/11585 | 1 day, 22:15:12 | None |
| Compact mode word translation(Turkish) error in right click menu in vertical tabs | https://github.com/zen-browser/desktop/issues/11583 | 10 days, 19:56:47 | None |
| Tab reordering does not trigger haptic feedback on MacOS | https://github.com/zen-browser/desktop/issues/11582 | None | None |
| Blur text and content when window is maximized (but not in full full screen) on Mac using Apple Studio display | https://github.com/zen-browser/desktop/issues/11580 | 1:53:06 | 5:20:16 |
| Closing a recently opened tab returns to the top tab, not the previously focused tab | https://github.com/zen-browser/desktop/issues/11576 | 9 days, 1:26:27 | None |
| Toolbar appearing on hover in compact mode results in jittery page | https://github.com/zen-browser/desktop/issues/11575 | 1:27:27 | None |
| Firefox Sync doesn't sync extensions to new instance | https://github.com/zen-browser/desktop/issues/11574 | None | None |
| Spotify no sound | https://github.com/zen-browser/desktop/issues/11570 | 0:02:19 | 0:35:22 |
| performance issue | https://github.com/zen-browser/desktop/issues/11569 | 1:49:29 | 1:49:28 |
| [macOS] Default Unsplit shortcut (Opt+Cmd+U) conflicts with native 'View Source' binding | https://github.com/zen-browser/desktop/issues/11568 | 6 days, 13:28:07 | None |
| pdf markup undo would undo random things a few steps prior. | https://github.com/zen-browser/desktop/issues/11567 | None | None |
| Changing keyboard language closes tab bar | https://github.com/zen-browser/desktop/issues/11563 | 3:38:59 | 3:38:59 |
| Zen started randomly crashing | https://github.com/zen-browser/desktop/issues/11562 | 3:49:51 | 4 days, 5:32:07 |
| "Show all tabs" keyboard shortcut not working | https://github.com/zen-browser/desktop/issues/11560 | 13 days, 1:31:35 | None |
| Unable to go full screen when in split view | https://github.com/zen-browser/desktop/issues/11559 | None | None |
| Closing sequence of windows, makes Zen loose all the unpinned tabs | https://github.com/zen-browser/desktop/issues/11558 | 7 days, 12:45:23 | None |
| Discord Link on https://zen-browser.app/ is Invalid | https://github.com/zen-browser/desktop/issues/11557 | 22:21:31 | 22:21:31 |
| Zen Browser not saving the tabs I had - V1.17.12b | https://github.com/zen-browser/desktop/issues/11555 | 4:07:02 | 2 days, 7:05:04 |
| Hidden Navbar Not Triggering on Hover (Compact Mode) | https://github.com/zen-browser/desktop/issues/11554 | 1 day, 0:22:48 | None |
| Dom manipulation causes massive performance issues | https://github.com/zen-browser/desktop/issues/11553 | 5:49:40 | None |
| "Unload and switch to tab" button kills navigation history | https://github.com/zen-browser/desktop/issues/11552 | None | None |
| Bookmarks in a folder open in reverse order | https://github.com/zen-browser/desktop/issues/11551 | None | 0:05:28 |
| If glance tab opens in a different container than parent tab, glance tab is moved to a regular new tab | https://github.com/zen-browser/desktop/issues/11544 | None | None |
| New tab not opening the normal homepage but opening the floating searchbar instead | https://github.com/zen-browser/desktop/issues/11543 | 0:19:37 | 1:16:54 |
| After my Mac wakes from sleep, Zen often stops loading pages for a few minutes. | https://github.com/zen-browser/desktop/issues/11541 | 7 days, 2:10:40 | None |
| Boxes in the Background | https://github.com/zen-browser/desktop/issues/11538 | None | None |
| Zen Browser Icon disappears from taskbar when the app isn't pinned | https://github.com/zen-browser/desktop/issues/11536 | 1:32:38 | None |
| The Space Icon/Name overlaps the New Tab Button when many tabs are open | https://github.com/zen-browser/desktop/issues/11531 | None | 0:01:23 |
| full screen does not hide the side/top bars | https://github.com/zen-browser/desktop/issues/11530 | 1 day, 1:45:36 | 1 day, 1:45:36 |
| Floading Bookmarks Bar Issue | https://github.com/zen-browser/desktop/issues/11529 | 2:18:35 | 13 days, 19:33:54 |
| Bug on Youtube Playing | https://github.com/zen-browser/desktop/issues/11528 | 0:26:20 | 15:57:36 |
| Site display issue on nokotime.com | https://github.com/zen-browser/desktop/issues/11525 | 7:58:19 | 1 day, 21:13:57 |
| can't load twitch page after update 1.17.12b | https://github.com/zen-browser/desktop/issues/11524 | 0:03:23 | 0:05:16 |
| Browser layout does not return to Single Toolbar after expanding Collapsed Sidebar, reverts to dual toolbars instead. | https://github.com/zen-browser/desktop/issues/11521 | 0:40:45 | 0:40:45 |
| Can't play youtube live video after update | https://github.com/zen-browser/desktop/issues/11518 | 0:42:10 | 16:06:02 |
| Mouse back/forward button didn't work anymore to switch between workspaces | https://github.com/zen-browser/desktop/issues/11517 | 0:44:38 | 0:53:37 |
| Bug on youtube | https://github.com/zen-browser/desktop/issues/11514 | 2 days, 17:49:10 | 2 days, 17:49:10 |
| Manual install issue | https://github.com/zen-browser/desktop/issues/11511 | 5:05:51 | 18:53:21 |
| Tab misplacements and Slow Internet Performance | https://github.com/zen-browser/desktop/issues/11510 | None | 0:13:33 |
| Incorrect origin point of glance animation when opening from split view | https://github.com/zen-browser/desktop/issues/11506 | None | None |
| Zen using passkey from apple keychain instead vaultwarden | https://github.com/zen-browser/desktop/issues/11498 | 1:10:26 | 1 day, 8:36:24 |
| Sidebar jitters due to trying to render more buttons than it can fit (at the top) | https://github.com/zen-browser/desktop/issues/11497 | None | None |
| z index mismatch on this page is slowing down your page modal | https://github.com/zen-browser/desktop/issues/11496 | None | 3 days, 21:12:36 |
_This report was generated with the [Issue Metrics Action](https://github.com/github/issue-metrics)_
Search query used to find these items: `repo:zen-browser/desktop is:issue created:2025-12-01..2025-12-31`

View File

@@ -353,3 +353,4 @@ zen-devtools-toggle-storage-shortcut = Toggle Storage
zen-devtools-toggle-dom-shortcut = Toggle DOM
zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
zen-new-unsynced-window-shortcut = New Unsynced Window

View File

@@ -23,9 +23,6 @@ zen-folders-panel-convert-folder-to-space =
zen-folders-panel-change-folder-space =
.label = Change Space...
zen-folders-panel-change-icon-folder =
.label = Change Icon
zen-folders-unload-all-tooltip =
.tooltiptext = Unload active in this folder

View File

@@ -18,6 +18,10 @@ tab-context-zen-remove-essential =
tab-context-zen-replace-pinned-url-with-current =
.label = Replace Pinned URL with Current
.accesskey = C
tab-context-zen-edit-title =
.label = Change Label...
tab-context-zen-edit-icon =
.label = Change Icon...
zen-themes-corrupted = Your { -brand-short-name } mods file is corrupted. They have been reset to the default theme.
zen-shortcuts-corrupted = Your { -brand-short-name } shortcuts file is corrupted. They have been reset to the default shortcuts.
@@ -33,7 +37,6 @@ pictureinpicture-minimize-btn =
.tooltip = Minimize
zen-panel-ui-gradient-generator-custom-color = Custom Color
zen-panel-ui-gradient-generator-saved-message = Successfully saved the gradient!
zen-copy-current-url-confirmation = Copied current URL!
@@ -47,12 +50,6 @@ zen-tabs-renamed = Tab has been successfully renamed!
zen-background-tab-opened-toast = New background tab opened!
zen-workspace-renamed-toast = Workspace has been successfully renamed!
zen-library-sidebar-workspaces =
.label = Spaces
zen-library-sidebar-mods =
.label = Mods
zen-toggle-compact-mode-button =
.label = Compact Mode
.tooltiptext = Toggle Compact Mode

View File

@@ -0,0 +1,23 @@
# 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-menubar-toggle-pinned-tabs =
.label =
{ $pinnedAreCollapsed ->
[true] Expand Pinned Tabs
*[false] Collapse Pinned Tabs
}
zen-menubar-appearance =
.label = Appearance
zen-menubar-appearance-description =
.label = Websites will use:
zen-menubar-appearance-auto =
.label = Automatic
zen-menubar-appearance-light =
.label = Light
zen-menubar-appearance-dark =
.label = Dark

View File

@@ -4,6 +4,9 @@
zen-panel-ui-workspaces-text = Spaces
zen-panel-ui-spaces-label =
.label = Spaces
zen-panel-ui-workspaces-create =
.label = Create Space
@@ -43,12 +46,8 @@ zen-workspaces-panel-context-edit =
.label = Edit Space
.accesskey = E
context-zen-change-workspace-tab =
.label = Change Tab(s) To Workspace
.accesskey = C
zen-bookmark-edit-panel-workspace-selector =
.value = Workspaces
.value = Spaces
.accesskey = W
zen-panel-ui-gradient-generator-algo-complementary =
@@ -66,6 +65,10 @@ zen-panel-ui-gradient-click-to-add = Click to add a color
zen-workspace-creation-name =
.placeholder = Space Name
zen-move-tab-to-workspace-button =
.label = Move To...
.tooltiptext = Move all tabs in this window to a Space
zen-workspaces-panel-context-reorder =
.label = Reorder Spaces
@@ -83,3 +86,9 @@ zen-workspaces-close-all-unpinned-tabs-toast = Tabs Closed! Use <span>{ $shortcu
zen-workspaces-close-all-unpinned-tabs-title =
.label = Clear
.tooltiptext = Close all unpinned tabs
zen-panel-ui-workspaces-change-forward =
.label = Next Space
zen-panel-ui-workspaces-change-back =
.label = Previous Space

228
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -49,13 +49,11 @@
"url": "https://github.com/zen-browser/desktop/issues"
},
"homepage": "https://github.com/zen-browser/desktop#readme",
"dependencies": {
"@zen-browser/surfer": "^1.12.1"
},
"devDependencies": {
"@babel/preset-typescript": "^7.27.0",
"@eslint/js": "^9.32.0",
"@microsoft/eslint-plugin-sdl": "^1.1.0",
"@zen-browser/surfer": "^1.13.0",
"eslint": "^9.32.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-html": "^8.1.3",

View File

@@ -65,3 +65,7 @@
- name: browser.tabs.closeWindowWithLastTab
value: false
- name: browser.tabs.dragDrop.multiselectStacking
value: false
locked: true

View File

@@ -6,7 +6,7 @@
value: true
- name: zen.folders.search.hover-delay
value: 900 # ms
value: 700 # ms
- name: zen.folders.max-subfolders
value: 5

View File

@@ -2,9 +2,6 @@
# 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.keyboard.shortcuts.enabled
value: true
- name: zen.keyboard.shortcuts.version
value: 0 # Empty string means default shortcuts

View File

@@ -0,0 +1,12 @@
# 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.session-store.backup-file
value: true
- name: zen.session-store.log
value: '@IS_TWILIGHT@'
- name: zen.session-store.restore-unsynced-windows
value: true

6
prefs/zen/share.yaml Normal file
View File

@@ -0,0 +1,6 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
- name: zen.share.enabled
value: true

View File

@@ -41,12 +41,7 @@
# ==== Mark: border radius ====
# macOS border radius
# -1 will use platform-native values
# Set to a positive value to override with a custom radius
- name: zen.theme.border-radius
value: 10
condition: 'defined(XP_MACOSX)'
# non-macOS border radius
- name: zen.theme.border-radius
value: 8
condition: '!defined(XP_MACOSX)'
value: -1

View File

@@ -40,14 +40,8 @@
- name: zen.view.window.scheme
value: 2
- name: zen.view.drag-and-drop.move-over-threshold
value: 70
- name: zen.view.drag-and-drop.edge-zone-threshold
value: 25
- name: zen.view.context-menu.refresh
value: false
value: '@IS_TWILIGHT@'
- name: zen.view.borderless-fullscreen
value: true

View File

@@ -0,0 +1,12 @@
# 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.window-sync.enabled
value: true
- name: zen.window-sync.log
value: false
- name: zen.window-sync.prefer-unsynced-windows
value: false

View File

@@ -32,6 +32,9 @@
- name: zen.workspaces.separate-essentials
value: true
- name: zen.workspaces.dnd-switch-padding
value: 10
- name: zen.workspaces.debug
value: '@cond'
condition: '!defined(MOZILLA_OFFICIAL)' # Section: Pinned tabs management

View File

@@ -20,6 +20,15 @@
- name: zen.tabs.close-window-with-empty
value: true
- name: zen.tabs.use-legacy-drag-and-drop
value: false
- name: zen.tabs.folder-dragover-threshold-percent
value: 20 # Percentage of folder height to trigger dragover
- name: zen.tabs.dnd-switch-space-delay
value: 1000 # milliseconds
- name: zen.ctrlTab.show-pending-tabs
value: false

View File

@@ -17,7 +17,7 @@ def get_current_version() -> Optional[str]:
try:
with open(METADATA_FILENAME) as f:
metadata = json.load(f)
return metadata["version"]["candidate"]
return metadata["version"]["candidate"], metadata["version"]["candidateBuild"]
except (FileNotFoundError, json.JSONDecodeError) as e:
print(f"Error reading current version: {e}")
return None
@@ -43,8 +43,10 @@ def get_rc_response() -> Optional[str]:
tag = tag_dict["tag"]
if (tag.startswith("FIREFOX") and tag.endswith("_BUILD1")
and "ESR" not in tag and "b" not in tag and "ANDROID" not in tag):
return (tag.replace("FIREFOX_", "").replace("_BUILD1",
"").replace("_", "."))
version = (tag.replace("FIREFOX_", "").replace("_BUILD1",
"").replace("_", "."))
build = int(tag.split("_BUILD")[-1])
return version, build
except (FileNotFoundError, json.JSONDecodeError) as e:
print(f"Error reading RC response: {e}")
return None
@@ -76,15 +78,15 @@ def send_webhook(rc: str) -> None:
print("Webhook URL not set.")
def rc_should_be_updated(rc_response: str, current_version: str) -> bool:
return rc_response and rc_response != current_version
def rc_should_be_updated(rc_response: str, current_version: str, rc_build: int, current_build: int) -> bool:
return rc_response and (rc_response != current_version or rc_build != current_build)
def main() -> int:
current_version = get_current_version()
rc_response = get_rc_response()
current_version, current_build = get_current_version()
rc_response, rc_build = get_rc_response()
if rc_should_be_updated(rc_response, current_version):
if rc_should_be_updated(rc_response, current_version, rc_build, current_build):
send_webhook(rc_response)
return 0

View File

@@ -10,7 +10,7 @@ COMPONENT_ROOT=$(pwd)/src/zen
EXTRA_COMPONENTS=(
"scripts"
"workflows"
"winsign"
"windows"
"flatpak"
"configs"
)

View File

@@ -16,7 +16,7 @@ IGNORE_FILES=(
# Recursively find all .patch files in the current directory and its subdirectories
find src -type f -name "*.patch" | while read -r patch_file; do
# Get the file from the inside of the file as indicated by the patch
target_file=$(grep -m 1 -oP '(?<=\+\+\+ b/).+' "$patch_file")
target_file=$(grep -m 1 -E '^\+\+\+ b/' "$patch_file" | sed 's/^\+\+\+ b\///')
if [[ -z "$target_file" ]]; then
echo "No target file found in patch: $patch_file"
continue

View File

@@ -10,4 +10,4 @@ if [ ! -f "package.json" ]; then
fi
npm update @zen-browser/surfer
npm i @zen-browser/surfer@latest
npm i @zen-browser/surfer@latest -D

View File

@@ -10,9 +10,9 @@ import shutil
from check_rc_response import get_rc_response, rc_should_be_updated
def update_rc(last_version: str):
rc_version = get_rc_response()
if rc_should_be_updated(rc_version, last_version):
def update_rc(last_version: str, last_build: int):
rc_version, rc_build = get_rc_response()
if rc_should_be_updated(rc_version, last_version, rc_build, last_build):
print(f"New Firefox RC version is available: {rc_version}")
print("Removing engine directory and updating surfer.json.")
if os.path.exists("engine"):
@@ -21,6 +21,7 @@ def update_rc(last_version: str):
data = json.load(f)
with open("surfer.json", "w") as f:
data["version"]["candidate"] = rc_version
data["version"]["candidateBuild"] = rc_build
json.dump(data, f, indent=2)
print("Download the new engine by running 'npm run download'.")
os.system("npm run download")
@@ -28,10 +29,10 @@ def update_rc(last_version: str):
print("No new Firefox RC version available.")
def update_ff(is_rc: bool = False, last_version: str = ""):
def update_ff(is_rc: bool = False, last_version: str = "", last_build: int = 0):
"""Runs the npm command to sync Firefox."""
if is_rc:
return update_rc(last_version)
return update_rc(last_version, last_build)
result = os.system("npm run sync:raw")
if result != 0:
raise RuntimeError("Failed to sync Firefox.")
@@ -42,7 +43,8 @@ def get_version_from_file(filename, is_rc):
try:
with open(filename, "r") as f:
data = json.load(f)
return data["version"]["version"] if not is_rc else data["version"]["candidate"]
return (data["version"]["version"] if not is_rc else data["version"]["candidate"],
data["version"]["candidateBuild"])
except (FileNotFoundError, json.JSONDecodeError) as e:
raise RuntimeError(f"Error reading version from {filename}: {e}")
@@ -91,9 +93,9 @@ def main():
try:
if not args.just_l10n:
last_version = get_version_from_file("surfer.json", args.rc)
update_ff(args.rc, last_version)
new_version = get_version_from_file("surfer.json", args.rc)
last_version, last_build = get_version_from_file("surfer.json", args.rc)
update_ff(args.rc, last_version, last_build)
new_version, new_build = get_version_from_file("surfer.json", args.rc)
update_readme(last_version, new_version, args.rc)
print(
f"Updated version from {last_version} to {new_version} in README.md.")

View File

@@ -1,8 +1,8 @@
diff --git a/Cargo.lock b/Cargo.lock
index 6f6632e9747e281aac3ea177225c03b73f25456e..06756e08041835c203490057855d537118647cd0 100644
index 723445447f491058784992e66245e0e0f8e61e19..02816c1df3e20d96ce68f16970b8a6e38080533e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4171,8 +4171,6 @@ dependencies = [
@@ -4214,8 +4214,6 @@ dependencies = [
[[package]]
name = "mime_guess"
version = "2.0.4"

View File

@@ -1,8 +1,8 @@
diff --git a/Cargo.toml b/Cargo.toml
index e2846a08008684f18799d75e5c28fd244c10361a..ba72071baef49ed494f78d1cc6752b53d1841f46 100644
index 35e725043bce0b39fea550e8fb2b0ae1ff752e43..abac2042d537fcc1ce26e0e3acbf98fc2975b793 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -232,6 +232,8 @@ moz_asserts = { path = "mozglue/static/rust/moz_asserts" }
@@ -237,6 +237,8 @@ moz_asserts = { path = "mozglue/static/rust/moz_asserts" }
# Workaround for https://github.com/rust-lang/cargo/issues/11232
rure = { path = "third_party/rust/rure" }

View File

@@ -1,5 +1,5 @@
diff --git a/browser/actors/WebRTCParent.sys.mjs b/browser/actors/WebRTCParent.sys.mjs
index a9612920f86ef5f37328497bf62255497e96b02d..a5643cd7e9c7a71da391408c14e00185b7db3f24 100644
index ffa7d61ded4f2cf5866d0cb12dd9b14728a63570..5575943208a734f820758fd50a80503061934d56 100644
--- a/browser/actors/WebRTCParent.sys.mjs
+++ b/browser/actors/WebRTCParent.sys.mjs
@@ -152,6 +152,7 @@ export class WebRTCParent extends JSWindowActorParent {

View File

@@ -1,5 +1,5 @@
diff --git a/browser/base/content/browser-addons.js b/browser/base/content/browser-addons.js
index fadcbfca95ee28140579430c0371baad0e2f216a..1947b4ab1c0b4ba0099147c9f13ae78d6e425bdf 100644
index cfb6b8dd5443966d0635c3d7b477a68eca8fa9e0..c876890706b1a314c7760bbe1ff5e9eb57857e60 100644
--- a/browser/base/content/browser-addons.js
+++ b/browser/base/content/browser-addons.js
@@ -1069,7 +1069,7 @@ var gXPInstallObserver = {
@@ -20,7 +20,7 @@ index fadcbfca95ee28140579430c0371baad0e2f216a..1947b4ab1c0b4ba0099147c9f13ae78d
},
};
@@ -2211,7 +2211,7 @@ var gUnifiedExtensions = {
@@ -2212,7 +2212,7 @@ var gUnifiedExtensions = {
// If the new ID is not added in NOTIFICATION_IDS, consider handling the case
// in the "PopupNotificationsBeforeAnchor" handler elsewhere in this file.
getPopupAnchorID(aBrowser, aWindow) {
@@ -29,7 +29,7 @@ index fadcbfca95ee28140579430c0371baad0e2f216a..1947b4ab1c0b4ba0099147c9f13ae78d
const attr = anchorID + "popupnotificationanchor";
if (!aBrowser[attr]) {
@@ -2222,7 +2222,7 @@ var gUnifiedExtensions = {
@@ -2223,7 +2223,7 @@ var gUnifiedExtensions = {
anchorID
// Anchor on the toolbar icon to position the popup right below the
// button.
@@ -38,7 +38,7 @@ index fadcbfca95ee28140579430c0371baad0e2f216a..1947b4ab1c0b4ba0099147c9f13ae78d
}
return anchorID;
@@ -2547,7 +2547,7 @@ var gUnifiedExtensions = {
@@ -2548,7 +2548,7 @@ var gUnifiedExtensions = {
requestAnimationFrame(() => this.updateAttention());
},
@@ -47,7 +47,7 @@ index fadcbfca95ee28140579430c0371baad0e2f216a..1947b4ab1c0b4ba0099147c9f13ae78d
// A list of extension widget IDs (possibly empty).
let widgetIDs;
@@ -2561,7 +2561,7 @@ var gUnifiedExtensions = {
@@ -2562,7 +2562,7 @@ var gUnifiedExtensions = {
}
// The list of overflowed extensions in the extensions panel.
@@ -56,7 +56,7 @@ index fadcbfca95ee28140579430c0371baad0e2f216a..1947b4ab1c0b4ba0099147c9f13ae78d
"#overflowed-extensions-list"
);
@@ -2662,37 +2662,41 @@ var gUnifiedExtensions = {
@@ -2663,37 +2663,41 @@ var gUnifiedExtensions = {
);
template.replaceWith(template.content);
this._panel = document.getElementById("unified-extensions-panel");
@@ -123,7 +123,7 @@ index fadcbfca95ee28140579430c0371baad0e2f216a..1947b4ab1c0b4ba0099147c9f13ae78d
if (!CustomizationHandler.isCustomizing()) {
if (aEvent) {
if (
@@ -2714,6 +2718,7 @@ var gUnifiedExtensions = {
@@ -2715,6 +2719,7 @@ var gUnifiedExtensions = {
// and no alternative content is available for display in the panel.
const policies = this.getActivePolicies();
if (
@@ -131,7 +131,7 @@ index fadcbfca95ee28140579430c0371baad0e2f216a..1947b4ab1c0b4ba0099147c9f13ae78d
policies.length &&
!this.hasExtensionsInPanel(policies) &&
!this.isPrivateWindowMissingExtensionsWithoutPBMAccess() &&
@@ -2729,32 +2734,30 @@ var gUnifiedExtensions = {
@@ -2730,32 +2735,30 @@ var gUnifiedExtensions = {
this.blocklistAttentionInfo =
await AddonManager.getBlocklistAttentionInfo();
@@ -170,7 +170,7 @@ index fadcbfca95ee28140579430c0371baad0e2f216a..1947b4ab1c0b4ba0099147c9f13ae78d
triggerEvent: aEvent,
});
}
@@ -2941,18 +2944,20 @@ var gUnifiedExtensions = {
@@ -2942,18 +2945,20 @@ var gUnifiedExtensions = {
this._maybeMoveWidgetNodeBack(widgetId);
}

View File

@@ -1,8 +1,8 @@
diff --git a/browser/base/content/browser-box.inc.xhtml b/browser/base/content/browser-box.inc.xhtml
index afa7f8e7dd74173bf2c696bd96f7e86e8b0126bc..4847c24923f673e91eb7fb65ea6b037f38062405 100644
index 2faed30e09511c381051bc40910a883d1d7bc10d..6ba2d0d91235ed33e4b4bad281c974b5960beaa2 100644
--- a/browser/base/content/browser-box.inc.xhtml
+++ b/browser/base/content/browser-box.inc.xhtml
@@ -25,7 +25,15 @@
@@ -25,7 +25,13 @@
</stack>
</vbox>
<splitter id="sidebar-splitter" class="chromeclass-extrachrome sidebar-splitter" resizebefore="sibling" resizeafter="none" hidden="true"/>
@@ -15,6 +15,10 @@ index afa7f8e7dd74173bf2c696bd96f7e86e8b0126bc..4847c24923f673e91eb7fb65ea6b037f
+#include zen-tabbrowser-elements.inc.xhtml
<tabpanels id="tabbrowser-tabpanels" flex="1" selectedIndex="0"/>
</tabbox>
<splitter id="ai-window-splitter" class="chromeclass-extrachrome sidebar-splitter" resizebefore="none" resizeafter="sibling" hidden="true"/>
@@ -34,3 +40,5 @@
</stack>
</vbox>
</hbox>
+</vbox>
+</hbox>

View File

@@ -1,19 +1,13 @@
diff --git a/browser/base/content/browser-fullScreenAndPointerLock.js b/browser/base/content/browser-fullScreenAndPointerLock.js
index f459f3ca4048c29a32832b46ba87de8552a0ab8a..d317676e6d12d756ddf5dfbffe73050de07c2375 100644
index 0e1aa344c084abdce40058278b12a042a4510997..50c06aaab823cb8572eee2ad53a7b709b1cfd084 100644
--- a/browser/base/content/browser-fullScreenAndPointerLock.js
+++ b/browser/base/content/browser-fullScreenAndPointerLock.js
@@ -423,10 +423,10 @@ var FullScreen = {
@@ -425,8 +425,6 @@ var FullScreen = {
gNavToolbox.classList.toggle("fullscreen-with-menubar", shiftSize > 0);
let transform = shiftSize > 0 ? `translateY(${shiftSize}px)` : "";
- gNavToolbox.style.transform = transform;
- gURLBar.textbox.style.transform = gURLBar.textbox.hasAttribute("breakout")
- ? transform
- : "";
+ //gNavToolbox.style.transform = transform;
+ //gURLBar.textbox.style.transform = gURLBar.textbox.hasAttribute("breakout")
+ // ? transform
+ // : "";
- gURLBar.style.transform = gURLBar.hasAttribute("breakout") ? transform : "";
if (shiftSize > 0) {
// If the mouse tracking missed our fullScreenToggler, then the toolbox
// might not have been shown before the menubar is animated down. Make

View File

@@ -1,8 +1,8 @@
diff --git a/browser/base/content/browser-init.js b/browser/base/content/browser-init.js
index 02f601d859ea32557af572d2499ad8be75b684b5..b1a6f66a74f75150d7e2fbc50528965bb16cb4d9 100644
index 288a79e5fb4da24cffcb30fb4b8adc9604b15d26..bf9bd3e666dfb6298dbeec0546cae223a7bc68f0 100644
--- a/browser/base/content/browser-init.js
+++ b/browser/base/content/browser-init.js
@@ -198,6 +198,7 @@ var gBrowserInit = {
@@ -200,6 +200,7 @@ var gBrowserInit = {
},
onLoad() {
@@ -10,7 +10,7 @@ index 02f601d859ea32557af572d2499ad8be75b684b5..b1a6f66a74f75150d7e2fbc50528965b
gBrowser.addEventListener("DOMUpdateBlockedPopups", e =>
PopupAndRedirectBlockerObserver.handleEvent(e)
);
@@ -372,6 +373,7 @@ var gBrowserInit = {
@@ -375,6 +376,7 @@ var gBrowserInit = {
this._handleURIToLoad();

View File

@@ -1,8 +1,8 @@
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
index 15ef352c147eff781d34a3e5fa02fa791bdd6188..b0784e817ad25c7a4983e9f1cb08b293de15a99d 100644
index 16cf3e201358d24c9216f9b06b0ba3b89684d32a..2cfa507bbdc96b8a293b18595d0beae031fe6119 100644
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -31,6 +31,7 @@ ChromeUtils.defineESModuleGetters(this, {
@@ -33,6 +33,7 @@ ChromeUtils.defineESModuleGetters(this, {
"resource://gre/modules/ContextualIdentityService.sys.mjs",
CustomizableUI:
"moz-src:///browser/components/customizableui/CustomizableUI.sys.mjs",
@@ -10,7 +10,7 @@ index 15ef352c147eff781d34a3e5fa02fa791bdd6188..b0784e817ad25c7a4983e9f1cb08b293
DevToolsSocketStatus:
"resource://devtools/shared/security/DevToolsSocketStatus.sys.mjs",
DownloadUtils: "resource://gre/modules/DownloadUtils.sys.mjs",
@@ -821,7 +822,12 @@ function UpdateBackForwardCommands(aWebNavigation) {
@@ -819,7 +820,12 @@ function UpdateBackForwardCommands(aWebNavigation) {
var backDisabled = backCommand.hasAttribute("disabled");
var forwardDisabled = forwardCommand.hasAttribute("disabled");
@@ -24,7 +24,7 @@ index 15ef352c147eff781d34a3e5fa02fa791bdd6188..b0784e817ad25c7a4983e9f1cb08b293
if (backDisabled) {
backCommand.removeAttribute("disabled");
} else {
@@ -2297,6 +2303,8 @@ var XULBrowserWindow = {
@@ -2305,6 +2311,8 @@ var XULBrowserWindow = {
AboutReaderParent.updateReaderButton(gBrowser.selectedBrowser);
TranslationsParent.onLocationChange(gBrowser.selectedBrowser);
@@ -33,7 +33,7 @@ index 15ef352c147eff781d34a3e5fa02fa791bdd6188..b0784e817ad25c7a4983e9f1cb08b293
PictureInPicture.updateUrlbarToggle(gBrowser.selectedBrowser);
if (!gMultiProcessBrowser) {
@@ -3808,7 +3816,7 @@ function warnAboutClosingWindow() {
@@ -3818,7 +3826,7 @@ function warnAboutClosingWindow() {
if (!isPBWindow && !toolbar.visible) {
return gBrowser.warnAboutClosingTabs(
@@ -42,7 +42,7 @@ index 15ef352c147eff781d34a3e5fa02fa791bdd6188..b0784e817ad25c7a4983e9f1cb08b293
gBrowser.closingTabsEnum.ALL
);
}
@@ -3848,7 +3856,7 @@ function warnAboutClosingWindow() {
@@ -3858,7 +3866,7 @@ function warnAboutClosingWindow() {
return (
isPBWindow ||
gBrowser.warnAboutClosingTabs(
@@ -51,7 +51,7 @@ index 15ef352c147eff781d34a3e5fa02fa791bdd6188..b0784e817ad25c7a4983e9f1cb08b293
gBrowser.closingTabsEnum.ALL
)
);
@@ -3873,7 +3881,7 @@ function warnAboutClosingWindow() {
@@ -3883,7 +3891,7 @@ function warnAboutClosingWindow() {
AppConstants.platform != "macosx" ||
isPBWindow ||
gBrowser.warnAboutClosingTabs(
@@ -60,7 +60,7 @@ index 15ef352c147eff781d34a3e5fa02fa791bdd6188..b0784e817ad25c7a4983e9f1cb08b293
gBrowser.closingTabsEnum.ALL
)
);
@@ -4795,6 +4803,9 @@ var ConfirmationHint = {
@@ -4806,6 +4814,9 @@ var ConfirmationHint = {
MozXULElement.insertFTLIfNeeded("toolkit/branding/brandings.ftl");
MozXULElement.insertFTLIfNeeded("browser/confirmationHints.ftl");
document.l10n.setAttributes(this._message, messageId, options.l10nArgs);

View File

@@ -1,5 +1,5 @@
diff --git a/browser/base/content/browser-places.js b/browser/base/content/browser-places.js
index 3bd7b8f6025a7df4ce5cfb66916125bce9ef3991..c408ef829b7540aec72b2307e5d4bfa34109d6cd 100644
index 925d74575827340960706718a29426bdf079b47c..921feb0e4229706b4691a43c9fc1005cbfd90999 100644
--- a/browser/base/content/browser-places.js
+++ b/browser/base/content/browser-places.js
@@ -249,6 +249,8 @@ var StarUI = {
@@ -33,7 +33,7 @@ index 3bd7b8f6025a7df4ce5cfb66916125bce9ef3991..c408ef829b7540aec72b2307e5d4bfa3
removeBookmarkButtonCommand: function SU_removeBookmarkButtonCommand() {
this._removeBookmarksOnPopupHidden = true;
this.panel.hidePopup();
@@ -1797,6 +1814,7 @@ var BookmarkingUI = {
@@ -1806,6 +1823,7 @@ var BookmarkingUI = {
document.getElementById("context-bookmarkpage"),
PanelMultiView.getViewNode(document, "panelMenuBookmarkThisPage"),
document.getElementById("pageAction-panel-bookmark"),

View File

@@ -0,0 +1,12 @@
diff --git a/browser/base/content/browser-profiles.js b/browser/base/content/browser-profiles.js
index fb260896c14b90734182d2f232e33350287f0209..9984a2d18dfd33e3606adac0e8c5f80f7e35e682 100644
--- a/browser/base/content/browser-profiles.js
+++ b/browser/base/content/browser-profiles.js
@@ -70,6 +70,7 @@ var gProfiles = {
},
toggleProfileMenus(isEnabled) {
+ isEnabled &&= Services.prefs.getBoolPref("browser.profiles.enabled", false);
let profilesMenu = document.getElementById("profiles-menu");
profilesMenu.hidden = !isEnabled;
},

View File

@@ -1,8 +1,8 @@
diff --git a/browser/base/content/browser-sets.inc b/browser/base/content/browser-sets.inc
index 8d97b6e669954a09afe6a46d1c79652264494e92..86877b983207c5f9852c9192ee0257a909c5ea7a 100644
index 139f7c2617f5e4843e0072435818c859def2f6bb..6ac1467b4117e2d76102d6977f13268827b4588f 100644
--- a/browser/base/content/browser-sets.inc
+++ b/browser/base/content/browser-sets.inc
@@ -406,3 +406,4 @@
@@ -413,3 +413,4 @@
internal="true"/>
#endif
</keyset>

View File

@@ -1,8 +1,8 @@
diff --git a/browser/base/content/browser-sets.js b/browser/base/content/browser-sets.js
index 0bb581aa34ddeef1e3eb85b0fadd41a539b4b9d6..cbe2df8b1775cb8194007ee995fd91769618b48d 100644
index 94a05a510204c027e482fda33deaf3dc0d7471c9..79d37a7c7f29739d3ad2d9f6a3b3b8d638836b10 100644
--- a/browser/base/content/browser-sets.js
+++ b/browser/base/content/browser-sets.js
@@ -254,7 +254,7 @@ document.addEventListener(
@@ -266,7 +266,7 @@ document.addEventListener(
}
});

View File

@@ -1,5 +1,5 @@
diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml
index 246d23a77960d25f78b163429a3ed28c7180ccd7..1c26485d8464413689767c8a38aadbcadcecae4d 100644
index ac82dcd286b5502d1ba38ed740813db08941eb7b..c26b3f0468ee6acd7716d4e8a24ad8cc84fce186 100644
--- a/browser/base/content/browser.xhtml
+++ b/browser/base/content/browser.xhtml
@@ -19,6 +19,7 @@
@@ -10,7 +10,7 @@ index 246d23a77960d25f78b163429a3ed28c7180ccd7..1c26485d8464413689767c8a38aadbca
persist="screenX screenY width height sizemode"
data-l10n-sync="true">
<head>
@@ -98,8 +99,10 @@
@@ -99,8 +100,10 @@
<title data-l10n-id="browser-main-window-default-title"></title>
@@ -21,7 +21,7 @@ index 246d23a77960d25f78b163429a3ed28c7180ccd7..1c26485d8464413689767c8a38aadbca
</head>
<html:body xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
# All sets except for popupsets (commands, keys, and stringbundles)
@@ -132,9 +135,11 @@
@@ -133,9 +136,11 @@
</vbox>
</html:template>

View File

@@ -1,8 +1,8 @@
diff --git a/browser/base/content/main-popupset.inc.xhtml b/browser/base/content/main-popupset.inc.xhtml
index e688ba37c40ea602a32a84af6c1497d884ddc27b..ad8515eae1d4e697b9329d9d5babfd59679c9288 100644
index 79b604c5965ba03762acbf085c9288c73001ec24..d75d5481e5de93c592850e39d4b0b4fd07e12678 100644
--- a/browser/base/content/main-popupset.inc.xhtml
+++ b/browser/base/content/main-popupset.inc.xhtml
@@ -216,6 +216,10 @@
@@ -226,6 +226,10 @@
hidden="true"
tabspecific="true"
aria-labelledby="editBookmarkPanelTitle">
@@ -13,7 +13,7 @@ index e688ba37c40ea602a32a84af6c1497d884ddc27b..ad8515eae1d4e697b9329d9d5babfd59
<box class="panel-header">
<html:h1>
<html:span id="editBookmarkPanelTitle"/>
@@ -241,6 +245,7 @@
@@ -251,6 +255,7 @@
class="footer-button"/>
</html:moz-button-group>
</vbox>
@@ -21,7 +21,7 @@ index e688ba37c40ea602a32a84af6c1497d884ddc27b..ad8515eae1d4e697b9329d9d5babfd59
</panel>
</html:template>
@@ -636,6 +641,8 @@
@@ -656,6 +661,8 @@
#include popup-notifications.inc.xhtml

View File

@@ -1,5 +1,5 @@
diff --git a/browser/base/content/navigator-toolbox.inc.xhtml b/browser/base/content/navigator-toolbox.inc.xhtml
index 40dddda5a6191c2ac012767ca55ed5fa35c03a6b..2e96a7ca233529ee2b570f94154008be5b0088e3 100644
index 68c24f730d56f548cf1e286198a04f8363529378..71418c93ce7216d71412f2fa67295322bb73abad 100644
--- a/browser/base/content/navigator-toolbox.inc.xhtml
+++ b/browser/base/content/navigator-toolbox.inc.xhtml
@@ -2,7 +2,7 @@

View File

@@ -1,5 +1,5 @@
diff --git a/browser/base/content/navigator-toolbox.js b/browser/base/content/navigator-toolbox.js
index 7b776b15d52367a008ce6bf53dcfcbbe007b7453..da23f716c753f5a43f17bb5ed7a3d335891168c2 100644
index 15469e9d9b91c1eaef2578c9e43b6999edac3392..553402b41bc15f7cd99bf87c54416dc66d7c03e7 100644
--- a/browser/base/content/navigator-toolbox.js
+++ b/browser/base/content/navigator-toolbox.js
@@ -6,7 +6,7 @@
@@ -11,9 +11,9 @@ index 7b776b15d52367a008ce6bf53dcfcbbe007b7453..da23f716c753f5a43f17bb5ed7a3d335
const widgetOverflow = document.getElementById("widget-overflow");
function onPopupShowing(event) {
@@ -185,6 +185,7 @@ document.addEventListener(
@@ -184,6 +184,7 @@ document.addEventListener(
#forward-button,
#reload-button ,
#urlbar-go-button,
#reader-mode-button,
+ #zen-tabs-wrapper,
#picture-in-picture-button,
@@ -27,15 +27,15 @@ index 7b776b15d52367a008ce6bf53dcfcbbe007b7453..da23f716c753f5a43f17bb5ed7a3d335
gBrowser.handleNewTabMiddleClick(element, event);
break;
@@ -316,6 +318,7 @@ document.addEventListener(
@@ -318,6 +320,7 @@ document.addEventListener(
#downloads-button,
#fxa-toolbar-menu-button,
#unified-extensions-button,
+ #zen-site-data-icon-button,
#library-button
#library-button,
#split-view-button
`);
if (!element) {
@@ -398,6 +401,16 @@ document.addEventListener(
@@ -401,6 +404,16 @@ document.addEventListener(
gUnifiedExtensions.togglePanel(event);
break;

View File

@@ -1,8 +1,8 @@
diff --git a/browser/base/content/nsContextMenu.sys.mjs b/browser/base/content/nsContextMenu.sys.mjs
index b77c12da637ba31aca6e8100187d0ac14db33298..4fbec0dda932bcaa77ce714826ac8ab20b9e8e63 100644
index d9fbd3a9a78c993c89efa75be9e2ffc975158aba..e64382b32580c2d113774e76e3587002ce0aebad 100644
--- a/browser/base/content/nsContextMenu.sys.mjs
+++ b/browser/base/content/nsContextMenu.sys.mjs
@@ -376,6 +376,9 @@ export class nsContextMenu {
@@ -371,6 +371,9 @@ export class nsContextMenu {
this.initPDFItems();
this.initTextFragmentItems();

View File

@@ -45,9 +45,6 @@
# Scripts used all over the browser
<script type="module" src="chrome://browser/content/zen-components/ZenFolder.mjs"></script>
<script type="module" src="chrome://browser/content/zen-components/ZenPinnedTabsStorage.mjs"></script>
<script type="module" src="chrome://browser/content/zen-components/ZenWorkspacesStorage.mjs"></script>
<script type="module" src="chrome://browser/content/zen-components/ZenMediaController.mjs"></script>
<script type="module" src="chrome://browser/content/zen-components/ZenWorkspaceCreation.mjs"></script>
<script type="module" src="chrome://browser/content/zen-components/ZenGlanceManager.mjs"></script>

View File

@@ -4,6 +4,7 @@
#include ../../../zen/common/jar.inc.mn
#include ../../../zen/compact-mode/jar.inc.mn
#include ../../../zen/drag-and-drop/jar.inc.mn
#include ../../../zen/split-view/jar.inc.mn
#include ../../../zen/mods/jar.inc.mn
#include ../../../zen/workspaces/jar.inc.mn

View File

@@ -61,4 +61,6 @@
<command id="cmd_zenTogglePinTab" />
<command id="cmd_zenCloseUnpinnedTabs" />
<command id="cmd_zenNewNavigatorUnsynced" />
</commandset>

View File

@@ -4,4 +4,10 @@
#include zen-commands.inc.xhtml
<keyset id="zenKeyset"></keyset>
<keyset id="zenKeyset">
# Prefetch these keys because they are being used by the native menu bar
# and they need to be available even before the XUL is fully loaded and
# our KBS sysmtem is initialized.
<key id="zen-workspace-forward" />
<key id="zen-workspace-backward" />
</keyset>

View File

@@ -6,6 +6,7 @@
<link rel="localization" href="browser/zen-workspaces.ftl"/>
<link rel="localization" href="browser/zen-split-view.ftl"/>
<link rel="localization" href="browser/zen-general.ftl"/>
<link rel="localization" href="browser/zen-menubar.ftl"/>
<link rel="localization" href="browser/zen-vertical-tabs.ftl"/>
<link rel="localization" href="browser/zen-folders.ftl"/>
</linkset>

View File

@@ -36,7 +36,7 @@
<menupopup id="zenFolderActions">
<menuitem id="context_zenFolderRename" data-l10n-id="zen-folders-panel-rename-folder"/>
<menuitem id="context_zenFolderChangeIcon" data-l10n-id="zen-folders-panel-change-icon-folder"/>
<menuitem id="context_zenFolderChangeIcon" data-l10n-id="tab-context-zen-edit-icon"/>
<menuseparator />
<menuitem id="context_zenFolderUnloadAll" data-l10n-id="zen-folders-unload-folder"/>
<menuitem id="context_zenFolderNewSubfolder" data-l10n-id="zen-folders-new-subfolder"/>
@@ -59,3 +59,8 @@
<menuseparator />
<menuitem id="context_zenOpenSiteSettings" data-l10n-id="zen-site-data-site-settings"/>
</menupopup>
<menupopup id="zenMoveTabsToSyncedWorkspacePopup">
# Popup to move tabs to a synced workspace.
# This would be automatically populated with the list of available synced workspaces.
</menupopup>

View File

@@ -6,7 +6,6 @@
# the window is fully loaded.
# Make sure they are loaded before the global-scripts.inc file.
<script type="text/javascript" src="chrome://browser/content/zen-sets.js"></script>
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenWorkspacesSync.mjs"></script>
<script type="module" src="chrome://browser/content/zen-components/ZenHasPolyfill.mjs"></script>
<script type="module" src="chrome://browser/content/zen-components/ZenWorkspaces.mjs"></script>

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/BrowserGlue.sys.mjs b/browser/components/BrowserGlue.sys.mjs
index 5dcbb1705625746afd7c57b7a6044c4fa2f00afd..c0872057ec65fe8ebdb2f81e47198dec5d6f0faf 100644
index 8acc1e5a97f769dc76d30ca0534f28b0a4511ab5..bd54169f976d3abe7d122b0efc0fa0d0626179eb 100644
--- a/browser/components/BrowserGlue.sys.mjs
+++ b/browser/components/BrowserGlue.sys.mjs
@@ -8,6 +8,7 @@ import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";

View File

@@ -1,22 +0,0 @@
diff --git a/browser/components/aboutlogins/content/components/login-list.css b/browser/components/aboutlogins/content/components/login-list.css
index e8d2077ca425d9a2b924aa6ac6ba8ada36b76615..95a8ab3dcff832f16068b6739526e8e29f0b4e26 100644
--- a/browser/components/aboutlogins/content/components/login-list.css
+++ b/browser/components/aboutlogins/content/components/login-list.css
@@ -3,7 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
:host {
- border-inline-end: 1px solid var(--in-content-border-color);
+ border: 1px solid var(--in-content-border-color);
background-color: var(--background-color-box);
display: flex;
flex-direction: column;
@@ -162,3 +162,8 @@ ol {
font-size: 0.85em;
color: var(--text-color-deemphasized);
}
+
+:host {
+ border-radius: 5px;
+ margin: 10px;
+}

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/asrouter/modules/FeatureCallout.sys.mjs b/browser/components/asrouter/modules/FeatureCallout.sys.mjs
index 4ea9c9e88a1831dad7e42ebd8d0dd507102e8280..316aa626e525f05caac7f315e0ea7ae9d822b6af 100644
index 80dd8b5e357acc9decea6cf621c4868d547a0eb3..8a5fea6ed1a62a5930bafffcbbde3ce3292e42a1 100644
--- a/browser/components/asrouter/modules/FeatureCallout.sys.mjs
+++ b/browser/components/asrouter/modules/FeatureCallout.sys.mjs
@@ -777,6 +777,7 @@ export class FeatureCallout {
@@ -778,6 +778,7 @@ export class FeatureCallout {
) {
return false;
}

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/customizableui/content/panelUI.js b/browser/components/customizableui/content/panelUI.js
index d6393080aa8aff6c0f7b2043fd408b6f6249d0c4..bf37b46c4743b7619393c730720204380635666a 100644
index d016811caa6c1ecc947fd705f6e1b27e3b5a12a5..89f2a9ec9ebd80e744ed0118e1b3c164151cf2b8 100644
--- a/browser/components/customizableui/content/panelUI.js
+++ b/browser/components/customizableui/content/panelUI.js
@@ -608,10 +608,12 @@ const PanelUI = {
@@ -619,10 +619,12 @@ const PanelUI = {
if (hasKids && !this.navbar.hasAttribute("nonemptyoverflow")) {
this.navbar.setAttribute("nonemptyoverflow", "true");
this.overflowPanel.setAttribute("hasfixeditems", "true");
@@ -15,7 +15,7 @@ index d6393080aa8aff6c0f7b2043fd408b6f6249d0c4..bf37b46c4743b7619393c73072020438
}
},
@@ -959,7 +961,7 @@ const PanelUI = {
@@ -970,7 +972,7 @@ const PanelUI = {
el.removeAttribute("data-lazy-l10n-id");
});

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/places/content/bookmarkProperties.xhtml b/browser/components/places/content/bookmarkProperties.xhtml
index 4aad4e4fb4139aa3d81e00eefa82e26b697df973..a2bfac11322f3679af9b51ebc7478323aa8e4adb 100644
index 4aad4e4fb4139aa3d81e00eefa82e26b697df973..831e42a4a55e277b5b8e81e4317a2007c5306996 100644
--- a/browser/components/places/content/bookmarkProperties.xhtml
+++ b/browser/components/places/content/bookmarkProperties.xhtml
@@ -38,6 +38,8 @@
@@ -15,7 +15,7 @@ index 4aad4e4fb4139aa3d81e00eefa82e26b697df973..a2bfac11322f3679af9b51ebc7478323
src="chrome://browser/locale/places/bookmarkProperties.properties"/>
</stringbundleset>
+ <script src="chrome://browser/content/zen-components/ZenWorkspacesStorage.mjs" />
+ <script src="chrome://browser/content/zen-components/ZenWorkspaceBookmarksStorage.js" />
+ <script src="chrome://browser/content/zenThemeModifier.js"></script>
<script src="chrome://browser/content/places/editBookmark.js"/>
<script src="chrome://browser/content/places/bookmarkProperties.js"/>

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/places/content/editBookmark.js b/browser/components/places/content/editBookmark.js
index f562f19741d882d92365da531b55e2810a0e79ea..9339e1158b074c41fc19bf91cbfde3c4016594b9 100644
index f562f19741d882d92365da531b55e2810a0e79ea..a68ce8191314845c589f3a9f14b56028e0532628 100644
--- a/browser/components/places/content/editBookmark.js
+++ b/browser/components/places/content/editBookmark.js
@@ -387,6 +387,10 @@ var gEditItemOverlay = {
@@ -31,34 +31,11 @@ index f562f19741d882d92365da531b55e2810a0e79ea..9339e1158b074c41fc19bf91cbfde3c4
}
break;
}
@@ -1280,6 +1288,148 @@ var gEditItemOverlay = {
@@ -1280,6 +1288,128 @@ var gEditItemOverlay = {
get bookmarkState() {
return this._bookmarkState;
},
+
+ async _initWorkspaceSelector() {
+ if(document.documentElement.getAttribute("windowtype") === "Places:Organizer") {
+ return;
+ }
+ this._workspaces = await ZenWorkspacesStorage.getWorkspaces();
+
+ const selectElement = this._workspaceSelect;
+
+ // Clear any existing options
+ while (selectElement.firstChild) {
+ selectElement.removeChild(selectElement.firstChild);
+ }
+
+ // For each workspace, create an option element
+ for (let workspace of this._workspaces) {
+ const option = document.createElementNS("http://www.w3.org/1999/xhtml", "option");
+ option.textContent = workspace.name;
+ option.value = workspace.uuid;
+ selectElement.appendChild(option);
+ }
+
+ selectElement.disabled = this.readOnly;
+ },
+ async onWorkspaceSelectionChange(event) {
+ if(document.documentElement.getAttribute("windowtype") === "Places:Organizer") {
+ return;
@@ -129,7 +106,10 @@ index f562f19741d882d92365da531b55e2810a0e79ea..9339e1158b074c41fc19bf91cbfde3c4
+ if(document.documentElement.getAttribute("windowtype") === "Places:Organizer") {
+ return;
+ }
+ this._workspaces = await ZenWorkspacesStorage.getWorkspaces();
+ const { ZenSessionStore } = ChromeUtils.importESModule(
+ "resource:///modules/zen/ZenSessionManager.sys.mjs"
+ );
+ this._workspaces = ZenSessionStore.getClonedSpaces();
+ const workspaceList = this._workspaceList;
+ if(aInfo.node?.bookmarkGuid) {
+ this._selectedWorkspaces = await ZenWorkspaceBookmarksStorage.getBookmarkWorkspaces(aInfo.node.bookmarkGuid);
@@ -180,7 +160,7 @@ index f562f19741d882d92365da531b55e2810a0e79ea..9339e1158b074c41fc19bf91cbfde3c4
};
ChromeUtils.defineLazyGetter(gEditItemOverlay, "_folderTree", () => {
@@ -1318,6 +1468,9 @@ for (let elt of [
@@ -1318,6 +1448,9 @@ for (let elt of [
"locationField",
"keywordField",
"tagsField",

View File

@@ -1,11 +1,10 @@
diff --git a/browser/components/preferences/jar.mn b/browser/components/preferences/jar.mn
index 7c5f6e9053f119a790f83a68c75ee11a6c172d98..cb0e1386318e8a8df24dfbbf8430d0a09fe07d16 100644
index 5e53352fdbd25d2aed40d0117c3ad7072b9acf8c..0f400864ba7cc850d212ddeeefb71a06376e845f 100644
--- a/browser/components/preferences/jar.mn
+++ b/browser/components/preferences/jar.mn
@@ -37,3 +37,5 @@ browser.jar:
content/browser/preferences/widgets/security-privacy-card.mjs (widgets/security-privacy/security-privacy-card/security-privacy-card.mjs)
content/browser/preferences/widgets/security-privacy-card.css (widgets/security-privacy/security-privacy-card/security-privacy-card.css)
@@ -42,3 +42,5 @@ browser.jar:
content/browser/preferences/widgets/sync-device-name.mjs (widgets/sync-device-name/sync-device-name.mjs)
content/browser/preferences/widgets/sync-engines-list.mjs (widgets/sync-engine-list/sync-engines-list.mjs)
content/browser/preferences/widgets/sync-engines-list.css (widgets/sync-engine-list/sync-engines-list.css)
+
+ content/browser/preferences/zen-settings.js
\ No newline at end of file

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/preferences/main.inc.xhtml b/browser/components/preferences/main.inc.xhtml
index bfddd91e6b524f2ebced985f5d12a4963e5c6075..7e80c0a293aae6356e53d9c9760017290e97ffa0 100644
index d218a04e0ab44e6a55e368566c97df95e939565b..59f038e59fe1a8554a8b112c5ac33e700b71c79c 100644
--- a/browser/components/preferences/main.inc.xhtml
+++ b/browser/components/preferences/main.inc.xhtml
@@ -141,7 +141,8 @@
@@ -48,7 +48,8 @@
<!-- Browser layout -->
<groupbox data-category="paneGeneral"
data-subcategory="layout"
@@ -12,7 +12,7 @@ index bfddd91e6b524f2ebced985f5d12a4963e5c6075..7e80c0a293aae6356e53d9c976001729
<label><html:h2 data-l10n-id="browser-layout-header"/></label>
<radiogroup id="browserLayoutRadioGroup" preference="sidebar.verticalTabs">
<radio id="browserLayoutHorizontalTabs" data-l10n-id="browser-layout-horizontal-tabs" value="false"/>
@@ -346,6 +347,7 @@
@@ -253,6 +254,7 @@
languages-customize-add.label,
" />
</hbox>

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/preferences/main.js b/browser/components/preferences/main.js
index a184086f10d6a919c8125ab5d7728319256b3b73..7c826000ccdc8a55a12a08bdc2c547d886e5610c 100644
index 6f99cbf973d414ffd4036d17740abe963629db37..520dcce0adb06c5ebfee8c76f72f7d7b40e106da 100644
--- a/browser/components/preferences/main.js
+++ b/browser/components/preferences/main.js
@@ -1117,6 +1117,11 @@ let SETTINGS_CONFIG = {
@@ -1729,6 +1729,11 @@ SettingGroupManager.registerGroups({
id: "browserRestoreSession",
l10nId: "startup-restore-windows-and-tabs",
},
@@ -14,7 +14,7 @@ index a184086f10d6a919c8125ab5d7728319256b3b73..7c826000ccdc8a55a12a08bdc2c547d8
{
id: "windowsLaunchOnLogin",
l10nId: "windows-launch-on-login",
@@ -1700,7 +1705,7 @@ function getBundleForLocales(newLocales) {
@@ -3133,7 +3138,7 @@ function getBundleForLocales(newLocales) {
])
);
return new Localization(

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/preferences/preferences.js b/browser/components/preferences/preferences.js
index a0e16b375f0ad7ef58bf68d7574453ef37d4557f..2d5b5a0715b5ed8ebe592eebea0219a6cde17b52 100644
index 7d6835b8636f771943b8081b7d56f579812026c2..97227eec4baeffd39b23ed6194ce7fa108c3b862 100644
--- a/browser/components/preferences/preferences.js
+++ b/browser/components/preferences/preferences.js
@@ -118,6 +118,7 @@ ChromeUtils.defineLazyGetter(this, "gSubDialog", function () {
@@ -124,6 +124,7 @@ ChromeUtils.defineLazyGetter(this, "gSubDialog", function () {
styleSheets: [
"chrome://browser/skin/preferences/dialog.css",
"chrome://browser/skin/preferences/preferences.css",
@@ -10,7 +10,7 @@ index a0e16b375f0ad7ef58bf68d7574453ef37d4557f..2d5b5a0715b5ed8ebe592eebea0219a6
],
resizeCallback: async ({ title, frame }) => {
// Search within main document and highlight matched keyword.
@@ -225,6 +226,10 @@ function init_all() {
@@ -344,6 +345,10 @@ function init_all() {
register_module("paneSearch", gSearchPane);
register_module("panePrivacy", gPrivacyPane);
register_module("paneContainers", gContainersPane);
@@ -19,5 +19,5 @@ index a0e16b375f0ad7ef58bf68d7574453ef37d4557f..2d5b5a0715b5ed8ebe592eebea0219a6
+ register_module("paneZenCKS", gZenCKSSettings);
+ register_module("paneZenMarketplace", gZenMarketplaceManager);
for (let [subPane, config] of Object.entries(CONFIG_PANES)) {
subPane = friendlyPrefCategoryNameToInternalName(subPane);
for (let [id, config] of Object.entries(CONFIG_PANES)) {
SettingPaneManager.registerPane(id, config);

View File

@@ -1,9 +1,9 @@
diff --git a/browser/components/preferences/preferences.xhtml b/browser/components/preferences/preferences.xhtml
index 993554d64efa6ce39fbcc01d4676a69199e158ff..e69aec388162997ef7cb93481cfedb9d102b4fe0 100644
index a1aec823d6266d69ff02aa8523d2da999a0871b9..559f2ea12e53dd19f24e7953db4388456b97f02c 100644
--- a/browser/components/preferences/preferences.xhtml
+++ b/browser/components/preferences/preferences.xhtml
@@ -45,6 +45,8 @@
<link rel="stylesheet" href="chrome://browser/content/preferences/widgets/setting-group.css" />
@@ -46,6 +46,8 @@
<link rel="stylesheet" href="chrome://browser/content/preferences/widgets/setting-pane.css" />
<link rel="stylesheet" href="chrome://browser/content/preferences/widgets/setting-control.css" />
+#include zen-preferences-links.xhtml
@@ -11,7 +11,7 @@ index 993554d64efa6ce39fbcc01d4676a69199e158ff..e69aec388162997ef7cb93481cfedb9d
<link rel="localization" href="branding/brand.ftl"/>
<link rel="localization" href="browser/browser.ftl"/>
<!-- Used by fontbuilder.js -->
@@ -113,6 +115,11 @@
@@ -115,6 +117,11 @@
<hbox flex="1">
<vbox class="navigation">
@@ -23,7 +23,7 @@ index 993554d64efa6ce39fbcc01d4676a69199e158ff..e69aec388162997ef7cb93481cfedb9d
<!-- category list -->
<richlistbox id="categories" data-l10n-id="category-list" data-l10n-attrs="aria-label">
<richlistitem id="category-general"
@@ -125,6 +132,50 @@
@@ -127,6 +134,50 @@
<label class="category-name" flex="1" data-l10n-id="pane-general-title"></label>
</richlistitem>
@@ -74,7 +74,7 @@ index 993554d64efa6ce39fbcc01d4676a69199e158ff..e69aec388162997ef7cb93481cfedb9d
<richlistitem id="category-home"
class="category"
value="paneHome"
@@ -236,11 +287,6 @@
@@ -242,11 +293,6 @@
<html:a href="about:policies" target="_blank" data-l10n-id="managed-notice"/>
</hbox>
</hbox>
@@ -86,7 +86,7 @@ index 993554d64efa6ce39fbcc01d4676a69199e158ff..e69aec388162997ef7cb93481cfedb9d
</hbox>
</hbox>
<vbox id="mainPrefPane">
@@ -254,6 +300,10 @@
@@ -260,6 +306,10 @@
#include sync.inc.xhtml
#include experimental.inc.xhtml
#include moreFromMozilla.inc.xhtml

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/screenshots/overlay/overlay.css b/browser/components/screenshots/overlay/overlay.css
index ee2740fc48e9b70fe17b0f27b60053209516dbbf..cc0270e0eb28c3e60216460b02d62111abb970de 100644
index 43a5d2109ad107ce1c79eef7cb8635bc1fa813f7..c1e5648d0e71826119bda1bc18c5d16886bab8fd 100644
--- a/browser/components/screenshots/overlay/overlay.css
+++ b/browser/components/screenshots/overlay/overlay.css
@@ -196,6 +196,9 @@

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/search/SearchUIUtils.sys.mjs b/browser/components/search/SearchUIUtils.sys.mjs
index 15fdb0cd7664c2b49977902d7f4c7a117d82cf15..6aedbc18de6604b63b2586e7d9745a4c4e7e38ae 100644
index 65daa1402a52e252360386e60471f726c1387bb3..be8f588316a8a4d7f33a324bf11f9e1f19def32d 100644
--- a/browser/components/search/SearchUIUtils.sys.mjs
+++ b/browser/components/search/SearchUIUtils.sys.mjs
@@ -434,7 +434,7 @@ export var SearchUIUtils = {
@@ -444,7 +444,7 @@ export var SearchUIUtils = {
triggeringSearchEngine: engine.name,
},
});

View File

@@ -0,0 +1,21 @@
diff --git a/browser/components/sessionstore/SessionFile.sys.mjs b/browser/components/sessionstore/SessionFile.sys.mjs
index 5580838acd72bf0e1189d367984859529d89f5b4..e5fa6076a9cc6ada016ccc4e129cad455010a522 100644
--- a/browser/components/sessionstore/SessionFile.sys.mjs
+++ b/browser/components/sessionstore/SessionFile.sys.mjs
@@ -22,6 +22,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
RunState: "resource:///modules/sessionstore/RunState.sys.mjs",
SessionStore: "resource:///modules/sessionstore/SessionStore.sys.mjs",
SessionWriter: "resource:///modules/sessionstore/SessionWriter.sys.mjs",
+ ZenSessionStore: "resource:///modules/zen/ZenSessionManager.sys.mjs",
});
const PREF_UPGRADE_BACKUP = "browser.sessionstore.upgradeBackup.latestBuildID";
@@ -381,7 +382,7 @@ var SessionFileInternal = {
this._readOrigin = result.origin;
result.noFilesFound = noFilesFound;
-
+ await lazy.ZenSessionStore.readFile();
return result;
},

View File

@@ -0,0 +1,29 @@
diff --git a/browser/components/sessionstore/SessionSaver.sys.mjs b/browser/components/sessionstore/SessionSaver.sys.mjs
index 9141793550f7c7ff6aa63d4c85bf571b4499e2d0..6906fd9be7ae6ca4316133e0d6552b797c54a7ec 100644
--- a/browser/components/sessionstore/SessionSaver.sys.mjs
+++ b/browser/components/sessionstore/SessionSaver.sys.mjs
@@ -20,6 +20,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
SessionFile: "resource:///modules/sessionstore/SessionFile.sys.mjs",
SessionStore: "resource:///modules/sessionstore/SessionStore.sys.mjs",
sessionStoreLogger: "resource:///modules/sessionstore/SessionLogger.sys.mjs",
+ ZenSessionStore: "resource:///modules/zen/ZenSessionManager.sys.mjs",
});
/*
@@ -250,7 +251,7 @@ var SessionSaverInternal = {
// Cancel any pending timeouts.
this.cancel();
- if (lazy.PrivateBrowsingUtils.permanentPrivateBrowsing) {
+ if (false) {
// Don't save (or even collect) anything in permanent private
// browsing mode
@@ -305,6 +306,7 @@ var SessionSaverInternal = {
this._maybeClearCookiesAndStorage(state);
Glean.sessionRestore.collectData.stopAndAccumulate(timerId);
+ lazy.ZenSessionStore.saveState(state);
return this._writeState(state);
},

View File

@@ -0,0 +1,44 @@
diff --git a/browser/components/sessionstore/SessionStartup.sys.mjs b/browser/components/sessionstore/SessionStartup.sys.mjs
index 86600ffb5178599ab23270a964064ca657a3283f..ffb22990e7d9e1b79f276fe5c1eb38f2b869a57b 100644
--- a/browser/components/sessionstore/SessionStartup.sys.mjs
+++ b/browser/components/sessionstore/SessionStartup.sys.mjs
@@ -40,6 +40,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
StartupPerformance:
"resource:///modules/sessionstore/StartupPerformance.sys.mjs",
sessionStoreLogger: "resource:///modules/sessionstore/SessionLogger.sys.mjs",
+ ZenSessionStore: "resource:///modules/zen/ZenSessionManager.sys.mjs",
});
const STATE_RUNNING_STR = "running";
@@ -85,7 +86,7 @@ export var SessionStartup = {
}
// do not need to initialize anything in auto-started private browsing sessions
- if (lazy.PrivateBrowsingUtils.permanentPrivateBrowsing) {
+ if (false) {
this._initialized = true;
gOnceInitializedDeferred.resolve();
return;
@@ -179,6 +180,8 @@ export var SessionStartup = {
this._initialState = parsed;
}
+ lazy.ZenSessionStore.onFileRead(this._initialState);
+
if (this._initialState == null) {
// No valid session found.
this._sessionType = this.NO_SESSION;
@@ -336,12 +339,7 @@ export var SessionStartup = {
isAutomaticRestoreEnabled() {
if (this._resumeSessionEnabled === null) {
this._resumeSessionEnabled =
- !lazy.PrivateBrowsingUtils.permanentPrivateBrowsing &&
- (Services.prefs.getBoolPref(
- "browser.sessionstore.resume_session_once"
- ) ||
- Services.prefs.getIntPref("browser.startup.page") ==
- BROWSER_STARTUP_RESUME_SESSION);
+ true;
}
return this._resumeSessionEnabled;

View File

@@ -1,38 +1,117 @@
diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs
index 2c2f43bf743ef458b378e85e9ed44a971711e1d9..6894412f5dcf632c1d4c3dabeffabf9e5dd96222 100644
index 2a055f0c5f34f0a2667f659185120c07d38f4e41..959e73ab86bdb78203e3aed0c939c1b9acbe4897 100644
--- a/browser/components/sessionstore/SessionStore.sys.mjs
+++ b/browser/components/sessionstore/SessionStore.sys.mjs
@@ -127,6 +127,8 @@ const TAB_EVENTS = [
@@ -127,6 +127,9 @@ const TAB_EVENTS = [
"TabGroupCollapse",
"TabGroupExpand",
"TabSplitViewActivate",
+ "TabAddedToEssentials",
+ "TabRemovedFromEssentials",
+ "ZenWorkspaceDataChanged",
];
const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
@@ -1911,6 +1913,8 @@ var SessionStoreInternal = {
@@ -196,6 +199,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
TabStateCache: "resource:///modules/sessionstore/TabStateCache.sys.mjs",
TabStateFlusher: "resource:///modules/sessionstore/TabStateFlusher.sys.mjs",
setTimeout: "resource://gre/modules/Timer.sys.mjs",
+ ZenSessionStore: "resource:///modules/zen/ZenSessionManager.sys.mjs",
});
ChromeUtils.defineLazyGetter(lazy, "blankURI", () => {
@@ -1261,10 +1265,7 @@ var SessionStoreInternal = {
*/
get willAutoRestore() {
return (
- !PrivateBrowsingUtils.permanentPrivateBrowsing &&
- (Services.prefs.getBoolPref("browser.sessionstore.resume_session_once") ||
- Services.prefs.getIntPref("browser.startup.page") ==
- BROWSER_STARTUP_RESUME_SESSION)
+ true
);
},
@@ -1934,6 +1935,9 @@ var SessionStoreInternal = {
case "TabPinned":
case "TabUnpinned":
case "SwapDocShells":
+ case "TabRemovedFromEssentials":
+ case "TabAddedToEssentials":
+ case "ZenWorkspaceDataChanged":
this.saveStateDelayed(win);
break;
case "TabGroupCreate":
@@ -2384,11 +2388,9 @@ var SessionStoreInternal = {
tabbrowser.selectedTab.label;
@@ -2044,6 +2048,10 @@ var SessionStoreInternal = {
this._windows[aWindow.__SSi].isTaskbarTab = true;
}
+ if (aWindow.document.documentElement.hasAttribute("zen-unsynced-window")) {
+ this._windows[aWindow.__SSi].isZenUnsynced = true;
+ }
+
let tabbrowser = aWindow.gBrowser;
// add tab change listeners to all already existing tabs
@@ -2131,6 +2139,7 @@ var SessionStoreInternal = {
null,
"sessionstore-one-or-no-tab-restored"
);
+ lazy.ZenSessionStore.onNewEmptySession(aWindow);
this._deferredAllWindowsRestored.resolve();
}
// this window was opened by _openWindowWithState
@@ -2175,7 +2184,6 @@ var SessionStoreInternal = {
if (closedWindowState) {
let newWindowState;
if (
- AppConstants.platform == "macosx" ||
!lazy.SessionStartup.willRestore()
) {
// We want to split the window up into pinned tabs and unpinned tabs.
@@ -2239,6 +2247,15 @@ var SessionStoreInternal = {
});
this._shouldRestoreLastSession = false;
}
+ else if (!aInitialState && isRegularWindow) {
+ let windowPromises = [];
+ for (let window of this._browserWindows) {
+ windowPromises.push(lazy.TabStateFlusher.flushWindow(window));
+ }
+ Promise.all(windowPromises).finally(() => {
+ lazy.ZenSessionStore.restoreNewWindow(aWindow, this);
+ });
+ }
if (this._restoreLastWindow && aWindow.toolbar.visible) {
// always reset (if not a popup window)
@@ -2491,7 +2508,7 @@ var SessionStoreInternal = {
// 2) Flush the window.
// 3) When the flush is complete, revisit our decision to store the window
// in _closedWindows, and add/remove as necessary.
- if (!winData.isPrivate && !winData.isTaskbarTab) {
+ if (!winData.isPrivate && !winData.isTaskbarTab && !winData.isZenUnsynced) {
this.maybeSaveClosedWindow(winData, isLastWindow);
}
- if (AppConstants.platform != "macosx") {
// Until we decide otherwise elsewhere, this window is part of a series
// of closing windows to quit.
winData._shouldRestore = true;
- }
@@ -2512,7 +2529,7 @@ var SessionStoreInternal = {
// Store the window's close date to figure out when each individual tab
// was closed. This timestamp should allow re-arranging data based on how
@@ -3373,7 +3375,7 @@ var SessionStoreInternal = {
// Save non-private windows if they have at
// least one saveable tab or are the last window.
- if (!winData.isPrivate && !winData.isTaskbarTab) {
+ if (!winData.isPrivate && !winData.isTaskbarTab && !winData.isZenUnsynced) {
this.maybeSaveClosedWindow(winData, isLastWindow);
if (!isLastWindow && winData.closedId > -1) {
@@ -2608,6 +2625,7 @@ var SessionStoreInternal = {
let alreadyStored = winIndex != -1;
// If sidebar command is truthy, i.e. sidebar is open, store sidebar settings
let shouldStore = hasSaveableTabs || isLastWindow;
+ lazy.ZenSessionStore.maybeSaveClosedWindow(winData, isLastWindow);
if (shouldStore && !alreadyStored) {
let index = this._closedWindows.findIndex(win => {
@@ -3408,7 +3426,7 @@ var SessionStoreInternal = {
if (!isPrivateWindow && tabState.isPrivate) {
return;
}
@@ -41,12 +120,12 @@ index 2c2f43bf743ef458b378e85e9ed44a971711e1d9..6894412f5dcf632c1d4c3dabeffabf9e
return;
}
@@ -4089,6 +4091,12 @@ var SessionStoreInternal = {
@@ -4129,6 +4147,12 @@ var SessionStoreInternal = {
Math.min(tabState.index, tabState.entries.length)
);
tabState.pinned = false;
+ tabState.zenEssential = false;
+ tabState.zenPinnedId = null;
+ tabState.zenSyncId = null;
+ tabState.zenIsGlance = false;
+ tabState.zenGlanceId = null;
+ tabState.zenHasStaticLabel = false;
@@ -54,7 +133,7 @@ index 2c2f43bf743ef458b378e85e9ed44a971711e1d9..6894412f5dcf632c1d4c3dabeffabf9e
if (inBackground === false) {
aWindow.gBrowser.selectedTab = newTab;
@@ -4525,6 +4533,7 @@ var SessionStoreInternal = {
@@ -4565,6 +4589,7 @@ var SessionStoreInternal = {
// Append the tab if we're opening into a different window,
tabIndex: aSource == aTargetWindow ? pos : Infinity,
pinned: state.pinned,
@@ -62,7 +141,7 @@ index 2c2f43bf743ef458b378e85e9ed44a971711e1d9..6894412f5dcf632c1d4c3dabeffabf9e
userContextId: state.userContextId,
skipLoad: true,
preferredRemoteType,
@@ -5374,7 +5383,7 @@ var SessionStoreInternal = {
@@ -5414,7 +5439,7 @@ var SessionStoreInternal = {
for (let i = tabbrowser.pinnedTabCount; i < tabbrowser.tabs.length; i++) {
let tab = tabbrowser.tabs[i];
@@ -71,16 +150,16 @@ index 2c2f43bf743ef458b378e85e9ed44a971711e1d9..6894412f5dcf632c1d4c3dabeffabf9e
removableTabs.push(tab);
}
}
@@ -5434,7 +5443,7 @@ var SessionStoreInternal = {
}
@@ -5525,7 +5550,7 @@ var SessionStoreInternal = {
let workspaceID = aWindow.getWorkspaceID();
- if (workspaceID) {
+ if (workspaceID && !(this.isLastRestorableWindow() && AppConstants.platform == "macosx")) {
winData.workspaceID = workspaceID;
}
},
@@ -5625,11 +5634,12 @@ var SessionStoreInternal = {
// collect the data for all windows
for (ix in this._windows) {
- if (this._windows[ix]._restoring || this._windows[ix].isTaskbarTab) {
+ if (this._windows[ix]._restoring || this._windows[ix].isTaskbarTab && !this._windows[ix].isZenUnsynced) {
// window data is still in _statesToRestore
continue;
}
@@ -5668,11 +5693,12 @@ var SessionStoreInternal = {
}
let tabbrowser = aWindow.gBrowser;
@@ -94,15 +173,17 @@ index 2c2f43bf743ef458b378e85e9ed44a971711e1d9..6894412f5dcf632c1d4c3dabeffabf9e
// update the internal state data for this window
for (let tab of tabs) {
if (tab == aWindow.FirefoxViewHandler.tab) {
@@ -5640,6 +5650,7 @@ var SessionStoreInternal = {
@@ -5683,6 +5709,9 @@ var SessionStoreInternal = {
tabsData.push(tabData);
}
+ winData.folders = aWindow.gZenFolders?.storeDataForSessionStore() || [];
+ winData.activeZenSpace = aWindow.gZenWorkspaces?.activeWorkspace || null;
+ winData.spaces = aWindow.gZenWorkspaces?.getWorkspacesForSessionStore();
// update tab group state for this window
winData.groups = [];
for (let tabGroup of aWindow.gBrowser.tabGroups) {
@@ -5652,7 +5663,7 @@ var SessionStoreInternal = {
@@ -5695,7 +5724,7 @@ var SessionStoreInternal = {
// a window is closed, point to the first item in the tab strip instead (it will never be the Firefox View tab,
// since it's only inserted into the tab strip after it's selected).
if (aWindow.FirefoxViewHandler.tab?.selected) {
@@ -111,7 +192,7 @@ index 2c2f43bf743ef458b378e85e9ed44a971711e1d9..6894412f5dcf632c1d4c3dabeffabf9e
winData.title = tabbrowser.tabs[0].label;
}
winData.selected = selectedIndex;
@@ -5765,8 +5776,8 @@ var SessionStoreInternal = {
@@ -5810,8 +5839,8 @@ var SessionStoreInternal = {
// selectTab represents.
let selectTab = 0;
if (overwriteTabs) {
@@ -122,7 +203,7 @@ index 2c2f43bf743ef458b378e85e9ed44a971711e1d9..6894412f5dcf632c1d4c3dabeffabf9e
selectTab = Math.min(selectTab, winData.tabs.length);
}
@@ -5788,6 +5799,7 @@ var SessionStoreInternal = {
@@ -5833,6 +5862,7 @@ var SessionStoreInternal = {
if (overwriteTabs) {
for (let i = tabbrowser.browsers.length - 1; i >= 0; i--) {
if (!tabbrowser.tabs[i].selected) {
@@ -130,16 +211,20 @@ index 2c2f43bf743ef458b378e85e9ed44a971711e1d9..6894412f5dcf632c1d4c3dabeffabf9e
tabbrowser.removeTab(tabbrowser.tabs[i]);
}
}
@@ -5809,6 +5821,8 @@ var SessionStoreInternal = {
winData.tabs,
winData.groups ?? []
@@ -5866,6 +5896,12 @@ var SessionStoreInternal = {
savedTabGroup => !openTabGroupIdsInWindow.has(savedTabGroup.id)
);
+ aWindow.gZenFolders?.restoreDataFromSessionStore(winData.folders);
+ aWindow.gZenViewSplitter?.restoreDataFromSessionStore(winData.splitViewData);
this._log.debug(
`restoreWindow, createTabsForSessionRestore returned ${tabs.length} tabs`
);
@@ -6372,6 +6386,25 @@ var SessionStoreInternal = {
}
+ if (winData.isZenUnsynced) {
+ aWindow.document.documentElement.setAttribute("zen-unsynced-window", "true");
+ }
+ aWindow.gZenFolders?.restoreDataFromSessionStore(winData.folders);
+ aWindow.gZenViewSplitter?.restoreDataFromSessionStore(winData.splitViewData);
+ aWindow.gZenWorkspaces?.restoreWorkspacesFromSessionStore(winData);
// Move the originally open tabs to the end.
if (initialTabs) {
@@ -6419,6 +6455,25 @@ var SessionStoreInternal = {
// Most of tabData has been restored, now continue with restoring
// attributes that may trigger external events.
@@ -150,11 +235,11 @@ index 2c2f43bf743ef458b378e85e9ed44a971711e1d9..6894412f5dcf632c1d4c3dabeffabf9e
+ if (tabData.zenIsEmpty) {
+ tab.setAttribute("zen-empty-tab", "true");
+ }
+ if (tabData.zenHasStaticLabel) {
+ tab.setAttribute("zen-has-static-label", "true");
+ if (tabData.zenStaticLabel) {
+ tab.zenStaticLabel = tabData.zenStaticLabel;
+ }
+ if (tabData.zenPinnedId) {
+ tab.setAttribute("zen-pin-id", tabData.zenPinnedId);
+ if (tabData.zenHasStaticIcon && tabData.image) {
+ tab.zenStaticIcon = tabData.image;
+ }
+ if (tabData.zenDefaultUserContextId) {
+ tab.setAttribute("zenDefaultUserContextId", true);
@@ -165,7 +250,7 @@ index 2c2f43bf743ef458b378e85e9ed44a971711e1d9..6894412f5dcf632c1d4c3dabeffabf9e
if (tabData.pinned) {
tabbrowser.pinTab(tab);
@@ -7290,7 +7323,7 @@ var SessionStoreInternal = {
@@ -7343,7 +7398,7 @@ var SessionStoreInternal = {
let groupsToSave = new Map();
for (let tIndex = 0; tIndex < window.tabs.length; ) {
@@ -174,7 +259,7 @@ index 2c2f43bf743ef458b378e85e9ed44a971711e1d9..6894412f5dcf632c1d4c3dabeffabf9e
// Adjust window.selected
if (tIndex + 1 < window.selected) {
window.selected -= 1;
@@ -7305,7 +7338,7 @@ var SessionStoreInternal = {
@@ -7358,7 +7413,7 @@ var SessionStoreInternal = {
);
// We don't want to increment tIndex here.
continue;

View File

@@ -1,22 +1,24 @@
diff --git a/browser/components/sessionstore/TabState.sys.mjs b/browser/components/sessionstore/TabState.sys.mjs
index 82721356d191055bec0d4b0ca49e481221988801..1ea5c394c704da295149443d7794961a12f2060b 100644
index 82721356d191055bec0d4b0ca49e481221988801..238d6ae1a4261e098d1e986e3c3df813d9d625f3 100644
--- a/browser/components/sessionstore/TabState.sys.mjs
+++ b/browser/components/sessionstore/TabState.sys.mjs
@@ -85,7 +85,22 @@ class _TabState {
@@ -85,7 +85,24 @@ class _TabState {
tabData.groupId = tab.group.id;
}
+ tabData.zenWorkspace = tab.getAttribute("zen-workspace-id");
+ tabData.zenPinnedId = tab.getAttribute("zen-pin-id");
+ tabData.zenSyncId = tab.getAttribute("id");
+ tabData.zenEssential = tab.getAttribute("zen-essential");
+ tabData.pinned = tabData.pinned || tabData.zenEssential;
+ tabData.zenDefaultUserContextId = tab.getAttribute("zenDefaultUserContextId");
+ tabData.zenPinnedEntry = tab.getAttribute("zen-pinned-entry");
+ tabData.zenPinnedIcon = tab.getAttribute("zen-pinned-icon");
+ tabData.zenIsEmpty = tab.hasAttribute("zen-empty-tab");
+ tabData.zenHasStaticLabel = tab.hasAttribute("zen-has-static-label");
+ tabData.zenStaticLabel = tab.zenStaticLabel;
+ tabData.zenHasStaticIcon = !!tab.zenStaticIcon;
+ tabData.zenGlanceId = tab.getAttribute("glance-id");
+ tabData.zenIsGlance = tab.hasAttribute("zen-glance-tab");
+ tabData._zenPinnedInitialState = tab._zenPinnedInitialState;
+ tabData._zenIsActiveTab = tab._zenContentsVisible;
+
tabData.searchMode = tab.ownerGlobal.gURLBar.getSearchMode(browser, true);
+ if (tabData.searchMode?.source === tab.ownerGlobal.UrlbarUtils.RESULT_SOURCE.ZEN_ACTIONS) {

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/sidebar/browser-sidebar.js b/browser/components/sidebar/browser-sidebar.js
index 220c3c83fa09daaec433803a4655a20114a137a6..1ef8adc3ecfa61839bb993f7fc090133bffe77db 100644
index bd6db85732e6e99ca51ce9c4c1a7d469199cf8cb..6c7859c1014baf4e343714ef797cf558d065e189 100644
--- a/browser/components/sidebar/browser-sidebar.js
+++ b/browser/components/sidebar/browser-sidebar.js
@@ -793,7 +793,7 @@ var SidebarController = {
@@ -8,6 +8,6 @@ index 220c3c83fa09daaec433803a4655a20114a137a6..1ef8adc3ecfa61839bb993f7fc090133
let contentArea = document.getElementById("tabbrowser-tabbox");
- let browser = document.getElementById("browser");
+ let browser = document.getElementById("tabbrowser-tabbox");
[...browser.children].forEach((node, i) => {
node.style.order = i + 1;
[...browser.children].forEach((node, i, children) => {
node.style.order = this._positionStart ? i + 1 : children.length - i;
});

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs b/browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs
index bcd7689e9d68ef8b171c327188174334c4271e21..0a95e1137fdf4b63e0d841776ad934da1a513c6f 100644
index 9c5e92fbd555d328ce09c0cf0ff8078584f68478..2af7a428bc830d8c12b3d3c0af375c97e6942994 100644
--- a/browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs
+++ b/browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs
@@ -938,6 +938,7 @@ export class AsyncTabSwitcher {
@@ -939,6 +939,7 @@ export class AsyncTabSwitcher {
this.tabbrowser._printPreviewBrowsers.has(browser) ||
this.tabbrowser.splitViewBrowsers.includes(browser) ||
lazy.PictureInPicture.isOriginatingBrowser(browser)

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/TabUnloader.sys.mjs b/browser/components/tabbrowser/TabUnloader.sys.mjs
index 2a3fcbe9dfb6328cabba891697990e2467973f6e..22fdaaefa71b3c37cbccbd7ae4db044b1057f1f2 100644
index aefccef39f0b81176a5710a794e8a5e2650d6507..e073c65790df6d55e827a4f4596199f4f1a99a57 100644
--- a/browser/components/tabbrowser/TabUnloader.sys.mjs
+++ b/browser/components/tabbrowser/TabUnloader.sys.mjs
@@ -52,7 +52,7 @@ let CRITERIA_WEIGHT = 1;

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/TabsList.sys.mjs b/browser/components/tabbrowser/TabsList.sys.mjs
index b394a980869d5e5df01b6afdd81e0f41c090e6ec..236c99db0dfa5ebcba50d55c1e4eb6ab7b8110b2 100644
index 400a69449e6477da754b06530eef7c15ea9ad887..7dd22f481dade16286533acffc2c2321d4c34b41 100644
--- a/browser/components/tabbrowser/TabsList.sys.mjs
+++ b/browser/components/tabbrowser/TabsList.sys.mjs
@@ -87,7 +87,7 @@ class TabsListBase {

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/tabbrowser/content/browser-ctrlTab.js b/browser/components/tabbrowser/content/browser-ctrlTab.js
index 958728cde19dd7cc24692baa89e11fcab816ab82..32e2b6af2536133f170bd5e14c47392ded8440eb 100644
index 3330dc133c120e7fbeecd2a36c71f9dfba60b3fb..0243cdfe67e5eb3f68fc7cde66bb3809e79bd6c3 100644
--- a/browser/components/tabbrowser/content/browser-ctrlTab.js
+++ b/browser/components/tabbrowser/content/browser-ctrlTab.js
@@ -249,7 +249,8 @@ var ctrlTab = {
@@ -252,7 +252,8 @@ var ctrlTab = {
},
get tabList() {
@@ -12,7 +12,7 @@ index 958728cde19dd7cc24692baa89e11fcab816ab82..32e2b6af2536133f170bd5e14c47392d
},
init: function ctrlTab_init() {
@@ -460,7 +461,7 @@ var ctrlTab = {
@@ -457,7 +458,7 @@ var ctrlTab = {
// If the tab is hidden, don't add it to the list unless it's selected
// (Normally hidden tabs would be unhidden when selected, but that doesn't
// happen for Firefox View).
@@ -21,7 +21,7 @@ index 958728cde19dd7cc24692baa89e11fcab816ab82..32e2b6af2536133f170bd5e14c47392d
return;
}
@@ -484,7 +485,7 @@ var ctrlTab = {
@@ -481,7 +482,7 @@ var ctrlTab = {
},
open: function ctrlTab_open() {
@@ -30,7 +30,7 @@ index 958728cde19dd7cc24692baa89e11fcab816ab82..32e2b6af2536133f170bd5e14c47392d
return;
}
@@ -763,7 +764,7 @@ var ctrlTab = {
@@ -751,7 +752,7 @@ var ctrlTab = {
_initRecentlyUsedTabs() {
this._recentlyUsedTabs = Array.prototype.filter.call(
gBrowser.tabs,

View File

@@ -1,37 +1,44 @@
diff --git a/browser/components/tabbrowser/content/drag-and-drop.js b/browser/components/tabbrowser/content/drag-and-drop.js
index 97b931c3c7385a52d20204369fcf6d6999053687..bc49f4f5a90638d725eca016d00f30d9548dce83 100644
index 57800333445ec7850742145527e04ae8d504b0bb..3a5015c391c594c94aa77a7ff9b08762d36276f6 100644
--- a/browser/components/tabbrowser/content/drag-and-drop.js
+++ b/browser/components/tabbrowser/content/drag-and-drop.js
@@ -32,6 +32,9 @@
@@ -35,6 +35,9 @@
* @returns {MozTabbrowserTab|vbox}
*/
const elementToMove = element => {
+ if (element.group?.hasAttribute("split-view-group")) {
+ return element.group;
+ }
if (isTab(element)) {
if (isTab(element) || isSplitViewWrapper(element)) {
return element;
}
@@ -112,6 +115,10 @@
@@ -115,6 +118,9 @@
}
let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0);
+ if (draggedTab && dropEffect === "move") {
+ gZenPinnedTabManager.applyDragoverClass(event, draggedTab);
+ gZenViewSplitter.onBrowserDragEndToSplit(event);
+ }
if (
(dropEffect == "move" || dropEffect == "copy") &&
document == draggedTab.ownerDocument &&
@@ -266,6 +273,18 @@
@@ -133,10 +139,6 @@
// Pinned tabs in expanded vertical mode are on a grid format and require
// different logic to drag and drop.
- if (this._isContainerVerticalPinnedGrid(draggedTab)) {
- this._animateExpandedPinnedTabMove(event);
- return;
- }
this._animateTabMove(event);
return;
}
@@ -269,6 +271,15 @@
this._tabDropIndicator.hidden = true;
event.stopPropagation();
+ if (draggedTab?.hasAttribute("zen-has-splitted")) {
+ draggedTab.removeAttribute("zen-has-splitted");
+ draggedTab._visuallySelected = false;
+ }
+ if (draggedTab && dropEffect == "move") {
+ this.handle_drop_transition?.(draggedTab._dragData.dropElement, draggedTab, movingTabs, draggedTab._dragData.dropBefore);
+ let moved = gZenPinnedTabManager.moveToAnotherTabContainerIfNecessary(event, movingTabs);
+
+ if (moved) {
@@ -42,7 +49,7 @@ index 97b931c3c7385a52d20204369fcf6d6999053687..bc49f4f5a90638d725eca016d00f30d9
if (draggedTab && dropEffect == "copy") {
let duplicatedDraggedTab;
let duplicatedTabs = [];
@@ -291,8 +310,9 @@
@@ -294,8 +305,9 @@
let translateOffsetY = oldTranslateY % tabHeight;
let newTranslateX = oldTranslateX - translateOffsetX;
let newTranslateY = oldTranslateY - translateOffsetY;
@@ -54,10 +61,10 @@ index 97b931c3c7385a52d20204369fcf6d6999053687..bc49f4f5a90638d725eca016d00f30d9
if (this._isContainerVerticalPinnedGrid(draggedTab)) {
// Update both translate axis for pinned vertical expanded tabs
@@ -308,8 +328,8 @@
@@ -311,8 +323,8 @@
}
} else {
let tabs = this._tabbrowserTabs.ariaFocusableItems.slice(
let tabs = this._tabbrowserTabs.dragAndDropElements.slice(
- isPinned ? 0 : numPinned,
- isPinned ? numPinned : undefined
+ isPinned ? (essential ? 0 : gBrowser._numZenEssentials) : numPinned,
@@ -65,7 +72,7 @@ index 97b931c3c7385a52d20204369fcf6d6999053687..bc49f4f5a90638d725eca016d00f30d9
);
let size = this._tabbrowserTabs.verticalMode ? "height" : "width";
let screenAxis = this._tabbrowserTabs.verticalMode
@@ -362,11 +382,13 @@
@@ -365,11 +377,13 @@
this._dragToPinPromoCard,
];
let shouldPin =
@@ -79,7 +86,7 @@ index 97b931c3c7385a52d20204369fcf6d6999053687..bc49f4f5a90638d725eca016d00f30d9
isTab(draggedTab) &&
draggedTab.pinned &&
this._tabbrowserTabs.arrowScrollbox.contains(event.target);
@@ -384,6 +406,7 @@
@@ -387,6 +401,7 @@
(oldTranslateY && oldTranslateY != newTranslateY);
} else if (this._tabbrowserTabs.verticalMode) {
shouldTranslate &&= oldTranslateY && oldTranslateY != newTranslateY;
@@ -87,7 +94,7 @@ index 97b931c3c7385a52d20204369fcf6d6999053687..bc49f4f5a90638d725eca016d00f30d9
} else {
shouldTranslate &&= oldTranslateX && oldTranslateX != newTranslateX;
}
@@ -440,7 +463,7 @@
@@ -443,7 +458,7 @@
item.removeAttribute("tabdrop-samewindow");
resolve();
};
@@ -96,15 +103,15 @@ index 97b931c3c7385a52d20204369fcf6d6999053687..bc49f4f5a90638d725eca016d00f30d9
postTransitionCleanup();
} else {
let onTransitionEnd = transitionendEvent => {
@@ -581,6 +604,7 @@
@@ -584,6 +599,7 @@
let nextItem = this._tabbrowserTabs.ariaFocusableItems[newIndex];
let nextItem = this._tabbrowserTabs.dragAndDropElements[newIndex];
let tabGroup = isTab(nextItem) && nextItem.group;
+ if (gZenViewSplitter.handleTabDrop(event, urls, replace, inBackground)) return;
gBrowser.loadTabs(urls, {
inBackground,
replace,
@@ -618,7 +642,16 @@
@@ -621,7 +637,16 @@
this._expandGroupOnDrop(draggedTab);
}
this._resetTabsAfterDrop(draggedTab.ownerDocument);
@@ -122,7 +129,7 @@ index 97b931c3c7385a52d20204369fcf6d6999053687..bc49f4f5a90638d725eca016d00f30d9
if (
dt.mozUserCancelled ||
dt.dropEffect != "none" ||
@@ -822,7 +855,10 @@
@@ -825,7 +850,10 @@
_getDragTarget(event, { ignoreSides = false } = {}) {
let { target } = event;
while (target) {
@@ -134,7 +141,7 @@ index 97b931c3c7385a52d20204369fcf6d6999053687..bc49f4f5a90638d725eca016d00f30d9
break;
}
target = target.parentNode;
@@ -839,14 +875,17 @@
@@ -842,14 +870,17 @@
return null;
}
}
@@ -154,7 +161,7 @@ index 97b931c3c7385a52d20204369fcf6d6999053687..bc49f4f5a90638d725eca016d00f30d9
!this._tabbrowserTabs.expandOnHover
);
}
@@ -877,7 +916,8 @@
@@ -880,7 +911,8 @@
isTabGroupLabel(draggedTab) &&
draggedTab._dragData?.expandGroupOnDrop
) {
@@ -164,19 +171,23 @@ index 97b931c3c7385a52d20204369fcf6d6999053687..bc49f4f5a90638d725eca016d00f30d9
}
}
@@ -942,10 +982,7 @@
if (this._isContainerVerticalPinnedGrid(tab)) {
// In expanded vertical mode, the max number of pinned tabs per row is dynamic
// Set this before adjusting dragged tab's position
- let pinnedTabs = this._tabbrowserTabs.visibleTabs.slice(
- 0,
- gBrowser.pinnedTabCount
- );
+ let pinnedTabs = this._tabbrowserTabs.ariaFocusableItems.slice(0, gBrowser._numZenEssentials);
let tabsPerRow = 0;
let position = RTL_UI
? window.windowUtils.getBoundsWithoutFlushing(
@@ -1112,7 +1149,7 @@
@@ -1058,7 +1090,6 @@
// using updateDragImage. On Linux, we can use a panel.
if (platform == "win" || platform == "macosx") {
captureListener = function () {
- dt.updateDragImage(canvas, dragImageOffset, dragImageOffset);
};
} else {
// Create a panel to use it in setDragImage
@@ -1096,7 +1127,6 @@
);
dragImageOffset = dragImageOffset * scale;
}
- dt.setDragImage(toDrag, dragImageOffset, dragImageOffset);
// _dragData.offsetX/Y give the coordinates that the mouse should be
// positioned relative to the corner of the new window created upon
@@ -1115,7 +1145,7 @@
let dropEffect = this.getDropEffectForTabDrag(event);
let isMovingInTabStrip = !fromTabList && dropEffect == "move";
let collapseTabGroupDuringDrag =
@@ -185,7 +196,7 @@ index 97b931c3c7385a52d20204369fcf6d6999053687..bc49f4f5a90638d725eca016d00f30d9
tab._dragData = {
offsetX: this._tabbrowserTabs.verticalMode
@@ -1122,7 +1159,7 @@
@@ -1125,7 +1155,7 @@
? event.screenY - window.screenY - tabOffset
: event.screenY - window.screenY,
scrollPos:
@@ -194,7 +205,7 @@ index 97b931c3c7385a52d20204369fcf6d6999053687..bc49f4f5a90638d725eca016d00f30d9
? this._tabbrowserTabs.pinnedTabsContainer.scrollPosition
: this._tabbrowserTabs.arrowScrollbox.scrollPosition,
screenX: event.screenX,
@@ -1149,6 +1186,7 @@
@@ -1152,6 +1182,7 @@
if (collapseTabGroupDuringDrag) {
tab.group.collapsed = true;
@@ -202,238 +213,45 @@ index 97b931c3c7385a52d20204369fcf6d6999053687..bc49f4f5a90638d725eca016d00f30d9
}
}
}
@@ -1173,6 +1211,16 @@
@@ -1176,6 +1207,7 @@
if (tabStripItemElement.hasAttribute("dragtarget")) {
return;
}
+ let { movingTabs: zenMovingTabs } = tab._dragData;
+ for (let movingTab of zenMovingTabs.slice(zenMovingTabs.findIndex(t => t._tPos == tab._tPos))) {
+ if (isTabGroupLabel(tab)) {
+ movingTab = movingTab.parentElement;
+ }
+ // "dragtarget" contains the following rules which must only be set AFTER the above
+ // elements have been adjusted. {z-index: 3 !important, position: absolute !important}
+ movingTab.setAttribute("zen-dragtarget", "");
+ }
+ return;
let isPinned = tab.pinned;
let numPinned = gBrowser.pinnedTabCount;
let allTabs = this._tabbrowserTabs.ariaFocusableItems;
@@ -1624,10 +1672,7 @@
return;
let dragAndDropElements = this._tabbrowserTabs.dragAndDropElements;
@@ -1601,7 +1633,6 @@
for (let item of this._tabbrowserTabs.dragAndDropElements) {
item = elementToMove(item);
- item.style.transform = "";
item.removeAttribute("multiselected-move-together");
delete item._moveTogetherSelectedTabsData;
}
- let tabs = this._tabbrowserTabs.visibleTabs.slice(
- 0,
- gBrowser.pinnedTabCount
- );
+ let tabs = this._tabbrowserTabs.ariaFocusableItems.slice(0, gBrowser._numZenEssentials);
let directionX = screenX > dragData.animLastScreenX;
let directionY = screenY > dragData.animLastScreenY;
@@ -1636,6 +1681,8 @@
let { width: tabWidth, height: tabHeight } =
draggedTab.getBoundingClientRect();
+ tabWidth += 4; // Add 4px to account for the gap
+ tabHeight += 4;
let shiftSizeX = tabWidth * movingTabs.length;
let shiftSizeY = tabHeight;
dragData.tabWidth = tabWidth;
@@ -1672,8 +1719,8 @@
let lastBoundX =
lastTabInRow.screenX +
lastTabInRow.getBoundingClientRect().width -
- (lastMovingTabScreenX + tabWidth);
- let lastBoundY = periphery.screenY - (lastMovingTabScreenY + tabHeight);
+ (lastMovingTabScreenX + tabWidth) + 4;
+ let lastBoundY = lastTab.screenY - lastMovingTabScreenY;
translateX = Math.min(Math.max(translateX, firstBoundX), lastBoundX);
translateY = Math.min(Math.max(translateY, firstBoundY), lastBoundY);
@@ -1833,13 +1880,18 @@
this._clearDragOverGroupingTimer();
this.#clearPinnedDropIndicatorTimer();
- let isPinned = draggedTab.pinned;
- let numPinned = gBrowser.pinnedTabCount;
+ let isPinned = draggedTab?.group ? draggedTab.group.pinned : draggedTab.pinned;
+ let numPinned = gBrowser._numVisiblePinTabsWithoutCollapsed;
+ let essential = draggedTab.hasAttribute("zen-essential");
+ const isDraggingFolder = isTabGroupLabel(draggedTab) && draggedTab.group?.isZenFolder;
let allTabs = this._tabbrowserTabs.ariaFocusableItems;
let tabs = allTabs.slice(
- isPinned ? 0 : numPinned,
- isPinned ? numPinned : undefined
+ (isPinned && essential) ? 0 : gBrowser._numZenEssentials,
+ isPinned ? (essential ? gBrowser._numZenEssentials : (isDraggingFolder ? numPinned : undefined)) : undefined
);
+ if (draggedTab.group?.hasAttribute("split-view-group")) {
+ draggedTab = draggedTab.group.labelElement;
+ }
if (this._rtlMode) {
tabs.reverse();
@@ -1854,7 +1906,7 @@
let translateAxis = this._tabbrowserTabs.verticalMode
? "translateY"
: "translateX";
- let { width: tabWidth, height: tabHeight } = bounds(draggedTab);
+ let { width: tabWidth, height: tabHeight } = bounds(draggedTab.group?.hasAttribute("split-view-group") ? draggedTab.group : draggedTab);
let tabSize = this._tabbrowserTabs.verticalMode ? tabHeight : tabWidth;
let translateX = event.screenX - dragData.screenX;
let translateY = event.screenY - dragData.screenY;
@@ -1870,6 +1922,12 @@
);
let lastMovingTab = movingTabs.at(-1);
let firstMovingTab = movingTabs[0];
+ if (lastMovingTab.group?.hasAttribute("split-view-group")) {
+ lastMovingTab = lastMovingTab.group;
+ }
+ if (firstMovingTab.group?.hasAttribute("split-view-group")) {
+ firstMovingTab = firstMovingTab.group;
+ }
let endEdge = ele => ele[screenAxis] + bounds(ele)[size];
let lastMovingTabScreen = endEdge(lastMovingTab);
let firstMovingTabScreen = firstMovingTab[screenAxis];
@@ -1884,6 +1942,13 @@
let endBound = this._rtlMode
? endEdge(this._tabbrowserTabs) - lastMovingTabScreen
: periphery[screenAxis] - 1 - lastMovingTabScreen;
+ {
+ let firstTab = tabs.at(this._rtlMode ? -1 : 0);
+ let lastTab = tabs.at(this._rtlMode ? 0 : -1);
+ startBound = firstTab[screenAxis] - firstMovingTabScreen;
+ endBound = endEdge(lastTab) - lastMovingTabScreen;
+ endBound = gZenPinnedTabManager.getLastTabBound(endBound, lastTab, isDraggingFolder);
+ }
translate = Math.min(Math.max(translate, startBound), endBound);
// Center the tab under the cursor if the tab is not under the cursor while dragging
@@ -2075,6 +2140,8 @@
};
let dropElement = getOverlappedElement();
+ if (dropElement?.hasAttribute("split-view-group")) dropElement = dropElement.labelElement;
+ gZenPinnedTabManager.animateSeparatorMove(movingTabs, dropElement, isPinned, event);
let newDropElementIndex;
if (dropElement) {
@@ -2157,7 +2224,7 @@
? Services.prefs.getIntPref(
"browser.tabs.dragDrop.moveOverThresholdPercent"
) / 100
- : 0.5;
+ : Services.prefs.getIntPref('zen.view.drag-and-drop.move-over-threshold') / 100;
moveOverThreshold = Math.min(1, Math.max(0, moveOverThreshold));
let shouldMoveOver = overlapPercent > moveOverThreshold;
if (logicalForward && shouldMoveOver) {
@@ -2190,6 +2257,7 @@
// If dragging a group over another group, don't make it look like it is
// possible to drop the dragged group inside the other group.
if (
+ false &&
isTabGroupLabel(draggedTab) &&
dropElement?.group &&
(!dropElement.group.collapsed ||
@@ -2216,20 +2284,13 @@
let isOutOfBounds = isPinned
? dropElement.elementIndex >= numPinned
: dropElement.elementIndex < numPinned;
- if (isOutOfBounds) {
- // Drop after last pinned tab
- dropElement = this._tabbrowserTabs.ariaFocusableItems[numPinned - 1];
- dropBefore = false;
- }
}
- if (
- gBrowser._tabGroupsEnabled &&
- isTab(draggedTab) &&
- !isPinned &&
- (!numPinned || newDropElementIndex >= numPinned)
- ) {
+ if (isTab(draggedTab) || isTabGroupLabel(draggedTab)) {
let dragOverGroupingThreshold = 1 - moveOverThreshold;
+ if (draggedTab && !dropElement?.group) {
+ gZenFolders.highlightGroupOnDragOver(null);
+ }
let groupingDelay = Services.prefs.getIntPref(
"browser.tabs.dragDrop.createGroup.delayMS"
);
@@ -2237,6 +2298,7 @@
// When dragging tab(s) over an ungrouped tab, signal to the user
// that dropping the tab(s) will create a new tab group.
let shouldCreateGroupOnDrop =
+ false &&
!movingTabsSet.has(dropElement) &&
isTab(dropElement) &&
!dropElement?.group &&
@@ -2245,6 +2307,7 @@
// When dragging tab(s) over a collapsed tab group label, signal to the
// user that dropping the tab(s) will add them to the group.
let shouldDropIntoCollapsedTabGroup =
+ false &&
isTabGroupLabel(dropElement) &&
dropElement.group.collapsed &&
overlapPercent > dragOverGroupingThreshold;
@@ -2302,6 +2365,14 @@
dropElement = dropElementGroup.tabs[0];
dropBefore = true;
}
+ ({ dropElement, colorCode, dropBefore } = gZenFolders.handleDragOverTabGroupLabel(
+ dropElement,
+ draggedTab,
+ overlapPercent,
+ movingTabs,
+ dropBefore,
+ colorCode
+ ));
}
this._setDragOverGroupColor(colorCode);
this._tabbrowserTabs.toggleAttribute(
@@ -2324,10 +2395,11 @@
dragData.dropBefore = dropBefore;
dragData.animDropElementIndex = newDropElementIndex;
+ gZenFolders.setFolderIndentation(movingTabs, dropElement);
// Shift background tabs to leave a gap where the dragged tab
// would currently be dropped.
for (let item of tabs) {
- if (item == draggedTab) {
+ if (item == draggedTab || (item.group?.hasAttribute("split-view-group") && item.group == draggedTab.group)) {
continue;
}
@@ -2417,11 +2489,13 @@
}
finishAnimateTabMove() {
+ gZenPinnedTabManager.onDragFinish();
if (!this.#isMovingTab()) {
return;
}
this.#setMovingTabMode(false);
+ gZenFolders.highlightGroupOnDragOver(null);
for (let item of this._tabbrowserTabs.ariaFocusableItems) {
@@ -2429,7 +2460,6 @@
for (let item of this._tabbrowserTabs.dragAndDropElements) {
this._resetGroupTarget(item);
@@ -2457,7 +2531,7 @@
item = elementToMove(item);
- item.style.transform = "";
}
this._tabbrowserTabs.removeAttribute("movingtab-group");
this._tabbrowserTabs.removeAttribute("movingtab-ungroup");
@@ -2460,17 +2490,14 @@
tab.style.left = "";
tab.style.top = "";
tab.style.maxWidth = "";
- tab.removeAttribute("dragtarget");
+ tab.removeAttribute("zen-dragtarget");
}
for (let label of draggedTabDocument.getElementsByClassName(
"tab-group-label-container"
@@ -2467,7 +2541,7 @@
)) {
label.style.width = "";
- label.style.height = "";
label.style.left = "";
label.style.top = "";
label.style.maxWidth = "";
- label.removeAttribute("dragtarget");
+ label.removeAttribute("zen-dragtarget");
}
let periphery = draggedTabDocument.getElementById(
"tabbrowser-arrowscrollbox-periphery"

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/tab.js b/browser/components/tabbrowser/content/tab.js
index 2dacb325190b6ae42ebeb3e9f0e862dc690ecdca..02d70e9b0261f92917d274759838cfbfd6214f77 100644
index 6528da245d922e2ccdb59cbf8106055bc34d1e74..1cd3395961a80e3b48582794b5b5365c9b8386b3 100644
--- a/browser/components/tabbrowser/content/tab.js
+++ b/browser/components/tabbrowser/content/tab.js
@@ -21,6 +21,7 @@
@@ -10,18 +10,19 @@ index 2dacb325190b6ae42ebeb3e9f0e862dc690ecdca..02d70e9b0261f92917d274759838cfbf
<stack class="tab-icon-stack">
<hbox class="tab-throbber"/>
<hbox class="tab-icon-pending"/>
@@ -37,8 +38,10 @@
@@ -38,9 +39,11 @@
<hbox class="tab-secondary-label">
<label class="tab-icon-sound-label tab-icon-sound-pip-label" data-l10n-id="browser-tab-audio-pip" role="presentation"/>
</hbox>
+ <label class="tab-reset-pin-label" data-l10n-id="tab-reset-pin-label" role="presentation"/>
</vbox>
<image class="tab-note-icon" role="presentation"/>
<image class="tab-close-button close-icon" role="button" data-l10n-id="tabbrowser-close-tabs-button" data-l10n-args='{"tabCount": 1}' keyNav="false"/>
+ <image class="tab-reset-button reset-icon" role="button" data-l10n-id="tabbrowser-unload-tab-button" data-l10n-args='{"tabCount": 1}' keyNav="false"/>
</hbox>
</stack>
`;
@@ -84,7 +87,7 @@
@@ -86,7 +89,7 @@
".tab-content":
"pinned,selected=visuallyselected,multiselected,titlechanged,attention",
".tab-icon-stack":
@@ -30,7 +31,7 @@ index 2dacb325190b6ae42ebeb3e9f0e862dc690ecdca..02d70e9b0261f92917d274759838cfbf
".tab-throbber":
"fadein,pinned,busy,progress,selected=visuallyselected",
".tab-icon-pending":
@@ -93,9 +96,9 @@
@@ -95,9 +98,9 @@
"src=image,requestcontextid,fadein,pinned,selected=visuallyselected,busy,crashed,sharing,pictureinpicture,pending,discarded",
".tab-sharing-icon-overlay": "sharing,selected=visuallyselected,pinned",
".tab-icon-overlay":
@@ -42,7 +43,7 @@ index 2dacb325190b6ae42ebeb3e9f0e862dc690ecdca..02d70e9b0261f92917d274759838cfbf
".tab-label-container":
"pinned,selected=visuallyselected,labeldirection",
".tab-label":
@@ -186,7 +189,7 @@
@@ -188,7 +191,7 @@
}
set _visuallySelected(val) {
@@ -51,7 +52,7 @@ index 2dacb325190b6ae42ebeb3e9f0e862dc690ecdca..02d70e9b0261f92917d274759838cfbf
return;
}
@@ -222,11 +225,21 @@
@@ -224,11 +227,21 @@
}
get visible() {
@@ -78,7 +79,7 @@ index 2dacb325190b6ae42ebeb3e9f0e862dc690ecdca..02d70e9b0261f92917d274759838cfbf
}
get hidden() {
@@ -305,7 +318,7 @@
@@ -307,7 +320,7 @@
return false;
}
@@ -87,7 +88,7 @@ index 2dacb325190b6ae42ebeb3e9f0e862dc690ecdca..02d70e9b0261f92917d274759838cfbf
}
get lastAccessed() {
@@ -382,7 +395,12 @@
@@ -384,7 +397,18 @@
}
get group() {
@@ -97,11 +98,17 @@ index 2dacb325190b6ae42ebeb3e9f0e862dc690ecdca..02d70e9b0261f92917d274759838cfbf
+ }
+ if (gBrowser.isTabGroup(this.parentElement?.parentElement)) {
+ return this.parentElement.parentElement;
+ }
+ if (this.pinned && !this.hasAttribute('zen-essential')) {
+ let collapsiblePins = gZenWorkspaces.workspaceElement(this.getAttribute('zen-workspace-id'))?.collapsiblePins;
+ if (collapsiblePins?.collapsed) {
+ return collapsiblePins;
+ }
+ }
}
get splitview() {
@@ -473,6 +491,8 @@
@@ -489,6 +513,8 @@
this.style.MozUserFocus = "ignore";
} else if (
event.target.classList.contains("tab-close-button") ||
@@ -110,7 +117,7 @@ index 2dacb325190b6ae42ebeb3e9f0e862dc690ecdca..02d70e9b0261f92917d274759838cfbf
event.target.classList.contains("tab-icon-overlay") ||
event.target.classList.contains("tab-audio-button")
) {
@@ -527,6 +547,10 @@
@@ -543,6 +569,10 @@
this.style.MozUserFocus = "";
}
@@ -121,15 +128,7 @@ index 2dacb325190b6ae42ebeb3e9f0e862dc690ecdca..02d70e9b0261f92917d274759838cfbf
on_click(event) {
if (event.button != 0) {
return;
@@ -575,6 +599,7 @@
)
);
} else {
+ gZenPinnedTabManager._removePinnedAttributes(this, true);
gBrowser.removeTab(this, {
animate: true,
triggeringEvent: event,
@@ -587,6 +612,14 @@
@@ -603,6 +633,14 @@
// (see tabbrowser-tabs 'click' handler).
gBrowser.tabContainer._blockDblClick = true;
}
@@ -144,7 +143,7 @@ index 2dacb325190b6ae42ebeb3e9f0e862dc690ecdca..02d70e9b0261f92917d274759838cfbf
}
on_dblclick(event) {
@@ -610,6 +643,8 @@
@@ -626,6 +664,8 @@
animate: true,
triggeringEvent: event,
});

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f53bc059b 100644
index 0eaca7a58e0026237b71b2ad515efe84d9e8c779..f3966d85049735538b24424f42d4a690eaf7bbec 100644
--- a/browser/components/tabbrowser/content/tabbrowser.js
+++ b/browser/components/tabbrowser/content/tabbrowser.js
@@ -386,6 +386,7 @@
@@ -398,6 +398,7 @@
* @type {MozBrowser[]}
*/
get splitViewBrowsers() {
@@ -10,7 +10,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
const browsers = [];
if (this.#activeSplitView) {
for (const tab of this.#activeSplitView.tabs) {
@@ -450,15 +451,64 @@
@@ -462,15 +463,66 @@
return this.tabContainer.visibleTabs;
}
@@ -18,6 +18,8 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
+ return this.#handleTabMove(...args);
+ }
+
+ get zenTabProgressListener() { return TabProgressListener; }
+
+ get _numVisiblePinTabsWithoutCollapsed() {
+ let i = 0;
+ for (let item of this.tabContainer.ariaFocusableItems) {
@@ -77,7 +79,18 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
set selectedTab(val) {
if (
gSharedTabWarning.willShowSharedTabWarning(val) ||
@@ -613,6 +663,7 @@
@@ -546,6 +598,10 @@
userContextId = parseInt(tabArgument.getAttribute("usercontextid"), 10);
}
+ if (typeof window._zenStartupUnsyncedUserContextId == 'number') {
+ userContextId = window._zenStartupUnsyncedUserContextId;
+ }
+
if (tabArgument && tabArgument.linkedBrowser) {
remoteType = tabArgument.linkedBrowser.remoteType;
initialBrowsingContextGroupId =
@@ -625,6 +681,7 @@
this.tabpanels.appendChild(panel);
let tab = this.tabs[0];
@@ -85,7 +98,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
tab.linkedPanel = uniqueId;
this._selectedTab = tab;
this._selectedBrowser = browser;
@@ -898,13 +949,17 @@
@@ -912,13 +969,18 @@
}
this.showTab(aTab);
@@ -98,17 +111,21 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
);
// If periphery is null, append to end
- this.pinnedTabsContainer.insertBefore(aTab, periphery);
+ this.tabContainer.tabDragAndDrop.handle_drop_transition(this.tabs[this.pinnedTabCount - 1], aTab, [aTab], false);
+ aTab.hasAttribute("zen-essential") ? gZenWorkspaces.getEssentialsSection(aTab).appendChild(aTab) : this.pinnedTabsContainer.insertBefore(aTab, this.pinnedTabsContainer.lastChild)
});
+ }
aTab.setAttribute("pinned", "true");
this._updateTabBarForPinnedTabs();
@@ -917,11 +972,15 @@
@@ -931,11 +993,18 @@
}
this.#handleTabMove(aTab, () => {
+ const handled = gZenFolders.handleTabUnpin(aTab);
+ if (!handled) {
+ this.tabContainer.tabDragAndDrop.handle_drop_transition(this.tabs[this.pinnedTabCount + 1 /* empty + extra */], aTab, [aTab], true);
+ }
+
// we remove this attribute first, so that allTabs represents
// the moving of a tab from the pinned tabs container
@@ -121,16 +138,17 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
});
aTab.style.marginInlineStart = "";
@@ -1098,6 +1157,8 @@
@@ -1112,6 +1181,9 @@
let LOCAL_PROTOCOLS = ["chrome:", "about:", "resource:", "data:"];
+ try {
+ gZenPinnedTabManager.onTabIconChanged(aTab, aIconURL);
+ aIconURL = aTab.zenStaticIcon || aIconURL;
+ gZenPinnedTabManager.onTabIconChanged(aTab, aIconURL);
if (
aIconURL &&
!LOCAL_PROTOCOLS.some(protocol => aIconURL.startsWith(protocol))
@@ -1107,6 +1168,9 @@
@@ -1121,6 +1193,9 @@
);
return;
}
@@ -140,7 +158,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
let browser = this.getBrowserForTab(aTab);
browser.mIconURL = aIconURL;
@@ -1379,7 +1443,6 @@
@@ -1393,7 +1468,6 @@
// Preview mode should not reset the owner
if (!this._previewMode && !oldTab.selected) {
@@ -148,7 +166,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
}
let lastRelatedTab = this._lastRelatedTabMap.get(oldTab);
@@ -1470,6 +1533,7 @@
@@ -1484,6 +1558,7 @@
if (!this._previewMode) {
newTab.recordTimeFromUnloadToReload();
newTab.updateLastAccessed();
@@ -156,7 +174,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
oldTab.updateLastAccessed();
// if this is the foreground window, update the last-seen timestamps.
if (this.ownerGlobal == BrowserWindowTracker.getTopWindow()) {
@@ -1622,6 +1686,9 @@
@@ -1636,6 +1711,9 @@
}
let activeEl = document.activeElement;
@@ -166,17 +184,19 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
// If focus is on the old tab, move it to the new tab.
if (activeEl == oldTab) {
newTab.focus();
@@ -1945,7 +2012,8 @@
@@ -1959,6 +2037,11 @@
}
_setTabLabel(aTab, aLabel, { beforeTabOpen, isContentTitle, isURL } = {}) {
- if (!aLabel || aLabel.includes("about:reader?")) {
+ if (!aTab._zenContentsVisible && !aTab._zenChangeLabelFlag && !aTab._labelIsInitialTitle && !gZenWorkspaces.privateWindowOrDisabled) {
+ return false;
+ }
+ aLabel = aTab.zenStaticLabel || aLabel;
+ gZenPinnedTabManager.onTabLabelChanged(aTab);
+ if (!aLabel || aLabel.includes("about:reader?") || aTab.hasAttribute("zen-has-static-label")) {
if (!aLabel || aLabel.includes("about:reader?")) {
return false;
}
@@ -2053,7 +2121,7 @@
@@ -2067,7 +2150,7 @@
newIndex = this.selectedTab._tPos + 1;
}
@@ -185,7 +205,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
if (this.isTabGroupLabel(targetTab)) {
throw new Error(
"Replacing a tab group label with a tab is not supported"
@@ -2328,6 +2396,7 @@
@@ -2342,6 +2425,7 @@
uriIsAboutBlank,
userContextId,
skipLoad,
@@ -193,7 +213,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
} = {}) {
let b = document.createXULElement("browser");
// Use the JSM global to create the permanentKey, so that if the
@@ -2401,8 +2470,7 @@
@@ -2415,8 +2499,7 @@
// we use a different attribute name for this?
b.setAttribute("name", name);
}
@@ -203,7 +223,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
b.setAttribute("transparent", "true");
}
@@ -2567,7 +2635,7 @@
@@ -2581,7 +2664,7 @@
let panel = this.getPanel(browser);
let uniqueId = this._generateUniquePanelID();
@@ -212,7 +232,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
aTab.linkedPanel = uniqueId;
// Inject the <browser> into the DOM if necessary.
@@ -2626,8 +2694,8 @@
@@ -2640,8 +2723,8 @@
// If we transitioned from one browser to two browsers, we need to set
// hasSiblings=false on both the existing browser and the new browser.
if (this.tabs.length == 2) {
@@ -223,7 +243,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
} else {
aTab.linkedBrowser.browsingContext.hasSiblings = this.tabs.length > 1;
}
@@ -2814,7 +2882,6 @@
@@ -2828,7 +2911,6 @@
this.selectedTab = this.addTrustedTab(BROWSER_NEW_TAB_URL, {
tabIndex: tab._tPos + 1,
userContextId: tab.userContextId,
@@ -231,16 +251,17 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
focusUrlBar: true,
});
resolve(this.selectedBrowser);
@@ -2923,6 +2990,8 @@
@@ -2938,6 +3020,9 @@
schemelessInput,
hasValidUserGestureActivation = false,
textDirectiveUserActivation = false,
+ _forZenEmptyTab,
+ essential,
+ zenWorkspaceId,
} = {}
) {
// all callers of addTab that pass a params object need to pass
@@ -2933,10 +3002,17 @@
@@ -2948,10 +3033,17 @@
);
}
@@ -258,7 +279,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
// If we're opening a foreground tab, set the owner by default.
ownerTab ??= inBackground ? null : this.selectedTab;
@@ -2944,6 +3020,7 @@
@@ -2959,6 +3051,7 @@
if (this.selectedTab.owner) {
this.selectedTab.owner = null;
}
@@ -266,14 +287,16 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
// Find the tab that opened this one, if any. This is used for
// determining positioning, and inherited attributes such as the
@@ -2996,6 +3073,19 @@
@@ -3011,6 +3104,21 @@
noInitialLabel,
skipBackgroundNotify,
});
+ if (hasZenDefaultUserContextId) {
+ t.setAttribute("zenDefaultUserContextId", "true");
+ }
+ if (zenForcedWorkspaceId !== undefined) {
+ if (zenWorkspaceId) {
+ t.setAttribute("zen-workspace-id", zenWorkspaceId);
+ } else if (zenForcedWorkspaceId !== undefined) {
+ t.setAttribute("zen-workspace-id", zenForcedWorkspaceId);
+ t.setAttribute("change-workspace", "")
+ }
@@ -286,7 +309,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
if (insertTab) {
// Insert the tab into the tab container in the correct position.
this.#insertTabAtIndex(t, {
@@ -3004,6 +3094,7 @@
@@ -3019,6 +3127,7 @@
ownerTab,
openerTab,
pinned,
@@ -294,7 +317,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
bulkOrderedOpen,
tabGroup: tabGroup ?? openerTab?.group,
});
@@ -3022,6 +3113,7 @@
@@ -3037,6 +3146,7 @@
openWindowInfo,
skipLoad,
triggeringRemoteType,
@@ -302,7 +325,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
}));
if (focusUrlBar) {
@@ -3146,6 +3238,12 @@
@@ -3161,6 +3271,12 @@
}
}
@@ -315,19 +338,25 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
// Additionally send pinned tab events
if (pinned) {
this.#notifyPinnedStatus(t);
@@ -3349,10 +3447,10 @@
@@ -3375,6 +3491,7 @@
isAdoptingGroup = false,
isUserTriggered = false,
telemetryUserCreateSource = "unknown",
+ forSplitView = false,
} = {}
) {
if (!tabs?.length) {
- throw new Error("Cannot create tab group with zero tabs");
if (
@@ -3385,9 +3502,6 @@
!this.isSplitViewWrapper(tabOrSplitView)
)
) {
- throw new Error(
- "Cannot create tab group with zero tabs or split views"
- );
}
if (!color) {
@@ -3373,9 +3471,14 @@
@@ -3408,9 +3522,14 @@
label,
isAdoptingGroup
);
@@ -335,16 +364,16 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
+ if (forSplitView) {
+ group.setAttribute('split-view-group', true);
+ }
+ group.essential = tabs.some(tab => tab.hasAttribute("essential"));
+ group.pinned = group.essential || tabs.some(tab => tab.pinned);
+ group.essential = tabsAndSplitViews.some(tab => tab.hasAttribute("essential"));
+ group.pinned = group.essential || tabsAndSplitViews.some(tab => tab.pinned);
+ if (forSplitView && !insertBefore?.group?.isZenFolder) insertBefore = insertBefore?.group ?? insertBefore;
+ insertBefore.before(
group,
- insertBefore?.group ?? insertBefore
);
group.addTabs(tabs);
group.addTabs(tabsAndSplitViews);
@@ -3496,7 +3599,7 @@
@@ -3531,7 +3650,7 @@
}
this.#handleTabMove(tab, () =>
@@ -353,7 +382,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
);
}
@@ -3698,6 +3801,7 @@
@@ -3746,6 +3865,7 @@
openWindowInfo,
skipLoad,
triggeringRemoteType,
@@ -361,7 +390,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
}
) {
// If we don't have a preferred remote type (or it is `NOT_REMOTE`), and
@@ -3767,6 +3871,7 @@
@@ -3815,6 +3935,7 @@
openWindowInfo,
name,
skipLoad,
@@ -369,7 +398,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
});
}
@@ -3955,7 +4060,7 @@
@@ -4003,7 +4124,7 @@
// Add a new tab if needed.
if (!tab) {
let createLazyBrowser =
@@ -378,7 +407,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
let url = "about:blank";
if (tabData.entries?.length) {
@@ -3992,8 +4097,10 @@
@@ -4040,8 +4161,10 @@
insertTab: false,
skipLoad: true,
preferredRemoteType,
@@ -390,7 +419,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
if (select) {
tabToSelect = tab;
}
@@ -4005,7 +4112,8 @@
@@ -4053,7 +4176,8 @@
this.pinTab(tab);
// Then ensure all the tab open/pinning information is sent.
this._fireTabOpen(tab, {});
@@ -400,7 +429,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
let { groupId } = tabData;
const tabGroup = tabGroupWorkingData.get(groupId);
// if a tab refers to a tab group we don't know, skip any group
@@ -4019,7 +4127,10 @@
@@ -4067,7 +4191,10 @@
tabGroup.stateData.id,
tabGroup.stateData.color,
tabGroup.stateData.collapsed,
@@ -412,7 +441,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
);
tabsFragment.appendChild(tabGroup.node);
}
@@ -4064,9 +4175,23 @@
@@ -4112,9 +4239,23 @@
// to remove the old selected tab.
if (tabToSelect) {
let leftoverTab = this.selectedTab;
@@ -436,7 +465,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
if (tabs.length > 1 || !tabs[0].selected) {
this._updateTabsAfterInsert();
@@ -4257,11 +4382,14 @@
@@ -4305,11 +4446,14 @@
if (ownerTab) {
tab.owner = ownerTab;
}
@@ -452,7 +481,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
if (
!bulkOrderedOpen &&
((openerTab &&
@@ -4273,7 +4401,7 @@
@@ -4321,7 +4465,7 @@
let lastRelatedTab =
openerTab && this._lastRelatedTabMap.get(openerTab);
let previousTab = lastRelatedTab || openerTab || this.selectedTab;
@@ -461,16 +490,16 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
tabGroup = previousTab.group;
}
if (
@@ -4284,7 +4412,7 @@
) {
elementIndex = Infinity;
@@ -4337,7 +4481,7 @@
previousTab.splitview
) + 1;
} else if (previousTab.visible) {
- elementIndex = previousTab.elementIndex + 1;
+ elementIndex = (typeof previousTab.elementIndex === 'undefined') ? elementIndex : (previousTab.elementIndex + 1);
} else if (previousTab == FirefoxViewHandler.tab) {
elementIndex = 0;
}
@@ -4312,14 +4440,14 @@
@@ -4365,14 +4509,14 @@
}
// Ensure index is within bounds.
if (tab.pinned) {
@@ -489,16 +518,16 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
if (pinned && !itemAfter?.pinned) {
itemAfter = null;
@@ -4330,7 +4458,7 @@
@@ -4385,7 +4529,7 @@
this.tabContainer._invalidateCachedTabs();
- if (tabGroup) {
+ if (tabGroup && !tabGroup.hasAttribute("split-view-group")) {
if (this.isTab(itemAfter) && itemAfter.group == tabGroup) {
// Place at the front of, or between tabs in, the same tab group
this.tabContainer.insertBefore(tab, itemAfter);
@@ -4358,7 +4486,11 @@
if (
(this.isTab(itemAfter) && itemAfter.group == tabGroup) ||
this.isSplitViewWrapper(itemAfter)
@@ -4416,7 +4560,11 @@
const tabContainer = pinned
? this.tabContainer.pinnedTabsContainer
: this.tabContainer;
@@ -509,8 +538,8 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
+ }
}
this._updateTabsAfterInsert();
@@ -4366,6 +4498,7 @@
if (tab.group?.collapsed) {
@@ -4431,6 +4579,7 @@
if (pinned) {
this._updateTabBarForPinnedTabs();
}
@@ -518,17 +547,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
TabBarVisibility.update();
}
@@ -4655,6 +4788,9 @@
return;
}
+ for (let tab of selectedTabs) {
+ gZenPinnedTabManager._removePinnedAttributes(tab, true);
+ }
this.removeTabs(selectedTabs, { isUserTriggered, telemetrySource });
}
@@ -4916,6 +5052,7 @@
@@ -4983,6 +5132,7 @@
telemetrySource,
} = {}
) {
@@ -536,7 +555,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
// When 'closeWindowWithLastTab' pref is enabled, closing all tabs
// can be considered equivalent to closing the window.
if (
@@ -5005,6 +5142,7 @@
@@ -5072,6 +5222,7 @@
if (lastToClose) {
this.removeTab(lastToClose, aParams);
}
@@ -544,7 +563,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
} catch (e) {
console.error(e);
}
@@ -5043,6 +5181,12 @@
@@ -5110,6 +5261,12 @@
aTab._closeTimeNoAnimTimerId = Glean.browserTabclose.timeNoAnim.start();
}
@@ -557,7 +576,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
// Handle requests for synchronously removing an already
// asynchronously closing tab.
if (!animate && aTab.closing) {
@@ -5057,6 +5201,9 @@
@@ -5124,6 +5281,9 @@
// state).
let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width;
let isLastTab = this.#isLastTabInWindow(aTab);
@@ -567,7 +586,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
if (
!this._beginRemoveTab(aTab, {
closeWindowFastpath: true,
@@ -5105,7 +5252,13 @@
@@ -5172,7 +5332,13 @@
// We're not animating, so we can cancel the animation stopwatch.
Glean.browserTabclose.timeAnim.cancel(aTab._closeTimeAnimTimerId);
aTab._closeTimeAnimTimerId = null;
@@ -582,7 +601,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
return;
}
@@ -5239,7 +5392,7 @@
@@ -5306,7 +5472,7 @@
closeWindowWithLastTab != null
? closeWindowWithLastTab
: !window.toolbar.visible ||
@@ -591,7 +610,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
if (closeWindow) {
// We've already called beforeunload on all the relevant tabs if we get here,
@@ -5263,6 +5416,7 @@
@@ -5330,6 +5496,7 @@
newTab = true;
}
@@ -599,7 +618,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
aTab._endRemoveArgs = [closeWindow, newTab];
// swapBrowsersAndCloseOther will take care of closing the window without animation.
@@ -5303,13 +5457,7 @@
@@ -5370,13 +5537,7 @@
aTab._mouseleave();
if (newTab) {
@@ -614,7 +633,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
} else {
TabBarVisibility.update();
}
@@ -5442,6 +5590,7 @@
@@ -5509,6 +5670,7 @@
this.tabs[i]._tPos = i;
}
@@ -622,7 +641,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
if (!this._windowIsClosing) {
// update tab close buttons state
this.tabContainer._updateCloseButtons();
@@ -5663,6 +5812,7 @@
@@ -5732,6 +5894,7 @@
}
let excludeTabs = new Set(aExcludeTabs);
@@ -630,7 +649,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
// If this tab has a successor, it should be selectable, since
// hiding or closing a tab removes that tab as a successor.
@@ -5675,13 +5825,13 @@
@@ -5744,13 +5907,13 @@
!excludeTabs.has(aTab.owner) &&
Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose")
) {
@@ -646,7 +665,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
);
let tab = this.tabContainer.findNextTab(aTab, {
@@ -5697,7 +5847,7 @@
@@ -5766,7 +5929,7 @@
}
if (tab) {
@@ -655,7 +674,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
}
// If no qualifying visible tab was found, see if there is a tab in
@@ -5718,7 +5868,7 @@
@@ -5787,7 +5950,7 @@
});
}
@@ -664,7 +683,47 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
}
_blurTab(aTab) {
@@ -6124,10 +6274,10 @@
@@ -5798,7 +5961,7 @@
* @returns {boolean}
* False if swapping isn't permitted, true otherwise.
*/
- swapBrowsersAndCloseOther(aOurTab, aOtherTab) {
+ swapBrowsersAndCloseOther(aOurTab, aOtherTab, zenCloseOther = true) {
// Do not allow transfering a private tab to a non-private window
// and vice versa.
if (
@@ -5852,6 +6015,7 @@
// fire the beforeunload event in the process. Close the other
// window if this was its last tab.
if (
+ zenCloseOther &&
!remoteBrowser._beginRemoveTab(aOtherTab, {
adoptedByTab: aOurTab,
closeWindowWithLastTab: true,
@@ -5863,7 +6027,7 @@
// If this is the last tab of the window, hide the window
// immediately without animation before the docshell swap, to avoid
// about:blank being painted.
- let [closeWindow] = aOtherTab._endRemoveArgs;
+ let [closeWindow] = !zenCloseOther ? [false] : aOtherTab._endRemoveArgs;
if (closeWindow) {
let win = aOtherTab.ownerGlobal;
win.windowUtils.suppressAnimation(true);
@@ -5987,11 +6151,13 @@
}
// Finish tearing down the tab that's going away.
+ if (zenCloseOther) {
if (closeWindow) {
aOtherTab.ownerGlobal.close();
} else {
remoteBrowser._endRemoveTab(aOtherTab);
}
+ }
this.setTabTitle(aOurTab);
@@ -6193,10 +6359,10 @@
SessionStore.deleteCustomTabValue(aTab, "hiddenBy");
}
@@ -677,15 +736,33 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
aTab.selected ||
aTab.closing ||
// Tabs that are sharing the screen, microphone or camera cannot be hidden.
@@ -6186,6 +6336,7 @@
@@ -6254,7 +6420,8 @@
*
* @param {MozTabbrowserTab|MozTabbrowserTabGroup|MozTabbrowserTabGroup.labelElement} aTab
*/
replaceTabWithWindow(aTab, aOptions) {
- replaceTabWithWindow(aTab, aOptions) {
+ replaceTabWithWindow(aTab, aOptions, zenForceSync = false) {
+ if (!this.isTab(aTab)) return; // TODO: Handle tab groups
if (this.tabs.length == 1) {
return null;
}
@@ -6319,7 +6470,7 @@
@@ -6278,12 +6445,14 @@
}
// tell a new window to take the "dropped" tab
- return window.openDialog(
+ let win = window.openDialog(
AppConstants.BROWSER_CHROME_URL,
"_blank",
options,
aTab
);
+ win._zenStartupSyncFlag = zenForceSync ? 'synced' : 'unsynced';
+ return win;
}
/**
@@ -6388,7 +6557,7 @@
* `true` if element is a `<tab-group>`
*/
isTabGroup(element) {
@@ -694,7 +771,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
}
/**
@@ -6404,8 +6555,8 @@
@@ -6473,8 +6642,8 @@
}
// Don't allow mixing pinned and unpinned tabs.
@@ -705,7 +782,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
} else {
tabIndex = Math.max(tabIndex, this.pinnedTabCount);
}
@@ -6431,10 +6582,16 @@
@@ -6500,10 +6669,16 @@
this.#handleTabMove(
element,
() => {
@@ -724,7 +801,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
if (neighbor && this.isTab(element) && tabIndex > element._tPos) {
neighbor.after(element);
} else {
@@ -6492,23 +6649,28 @@
@@ -6561,23 +6736,31 @@
#moveTabNextTo(element, targetElement, moveBefore = false, metricsContext) {
if (this.isTabGroupLabel(targetElement)) {
targetElement = targetElement.group;
@@ -745,6 +822,9 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
// Don't allow mixing pinned and unpinned tabs.
+ targetElement = gZenGlanceManager.getTabOrGlanceParent(targetElement);
+ if (targetElement?.classList.contains('tab-group-label-container')) {
+ targetElement = targetElement.parentElement;
+ }
+ if (element.hasAttribute('zen-essential') && !targetElement?.hasAttribute('zen-essential')) {
+ targetElement = this.tabsWithoutGlance[this._numZenEssentials - 1];
+ } else
@@ -759,7 +839,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
} else if (!element.pinned && targetElement && targetElement.pinned) {
// If the caller asks to move an unpinned element next to a pinned
// tab, move the unpinned element to be the first unpinned element
@@ -6521,14 +6683,34 @@
@@ -6590,14 +6773,34 @@
// move the tab group right before the first unpinned tab.
// 4. Moving a tab group and the first unpinned tab is grouped:
// move the tab group right before the first unpinned tab's tab group.
@@ -795,7 +875,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
element.pinned
? this.tabContainer.pinnedTabsContainer
: this.tabContainer;
@@ -6537,7 +6719,7 @@
@@ -6606,7 +6809,7 @@
element,
() => {
if (moveBefore) {
@@ -804,10 +884,10 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
} else if (targetElement) {
targetElement.after(element);
} else {
@@ -6607,10 +6789,10 @@
@@ -6676,10 +6879,10 @@
* @param {TabMetricsContext} [metricsContext]
*/
moveTabToGroup(aTab, aGroup, metricsContext) {
moveTabToExistingGroup(aTab, aGroup, metricsContext) {
- if (!this.isTab(aTab)) {
+ if (!this.isTab(aTab) && !aTab.hasAttribute('split-view-group')) {
throw new Error("Can only move a tab into a tab group");
@@ -817,7 +897,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
return;
}
if (aTab.group && aTab.group.id === aGroup.id) {
@@ -6656,6 +6838,7 @@
@@ -6751,6 +6954,7 @@
let state = {
tabIndex: tab._tPos,
@@ -825,7 +905,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
};
if (tab.visible) {
state.elementIndex = tab.elementIndex;
@@ -6682,7 +6865,7 @@
@@ -6777,7 +6981,7 @@
let changedTabGroup =
previousTabState.tabGroupId != currentTabState.tabGroupId;
@@ -834,7 +914,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
tab.dispatchEvent(
new CustomEvent("TabMove", {
bubbles: true,
@@ -6723,6 +6906,10 @@
@@ -6818,6 +7022,10 @@
moveActionCallback();
@@ -845,7 +925,16 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
// Clear tabs cache after moving nodes because the order of tabs may have
// changed.
this.tabContainer._invalidateCachedTabs();
@@ -7623,7 +7810,7 @@
@@ -6910,6 +7118,8 @@
params.userContextId = aTab.getAttribute("usercontextid");
}
let newTab = this.addWebTab("about:blank", params);
+ newTab._zenContentsVisible = true;
+ newTab.zenStaticLabel = aTab.zenStaticLabel;
let newBrowser = this.getBrowserForTab(newTab);
aTab.container.tabDragAndDrop.finishAnimateTabMove();
@@ -7718,7 +7928,7 @@
// preventDefault(). It will still raise the window if appropriate.
break;
}
@@ -854,7 +943,7 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
window.focus();
aEvent.preventDefault();
break;
@@ -7640,7 +7827,6 @@
@@ -7735,7 +7945,6 @@
}
case "TabGroupCollapse":
aEvent.target.tabs.forEach(tab => {
@@ -862,7 +951,17 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
});
break;
case "TabGroupCreateByUser":
@@ -8589,6 +8775,7 @@
@@ -7895,7 +8104,9 @@
let filter = this._tabFilters.get(tab);
if (filter) {
+ try {
browser.webProgress.removeProgressListener(filter);
+ } catch {}
let listener = this._tabListeners.get(tab);
if (listener) {
@@ -8698,6 +8909,7 @@
aWebProgress.isTopLevel
) {
this.mTab.setAttribute("busy", "true");
@@ -870,7 +969,15 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
gBrowser._tabAttrModified(this.mTab, ["busy"]);
this.mTab._notselectedsinceload = !this.mTab.selected;
}
@@ -9623,7 +9810,7 @@ var TabContextMenu = {
@@ -8778,6 +8990,7 @@
// known defaults. Note we use the original URL since about:newtab
// redirects to a prerendered page.
const shouldRemoveFavicon =
+ !this.mTab.zenStaticIcon &&
!this.mBrowser.mIconURL &&
!ignoreBlank &&
!(originalLocation.spec in FAVICON_DEFAULTS);
@@ -9803,7 +10016,7 @@ var TabContextMenu = {
);
contextUnpinSelectedTabs.hidden =
!this.contextTab.pinned || !this.multiselected;
@@ -879,11 +986,3 @@ index 42027bfa55eab8ea9298a7d425f2ded45188f7f3..6aa725c0e5a6a29dc33fcb162f83522f
// Build Ask Chat items
TabContextMenu.GenAI.buildTabMenu(
document.getElementById("context_askChat"),
@@ -9943,6 +10130,7 @@ var TabContextMenu = {
)
);
} else {
+ gZenPinnedTabManager._removePinnedAttributes(this.contextTab, true);
gBrowser.removeTab(this.contextTab, {
animate: true,
...gBrowser.TabMetrics.userTriggeredContext(

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/tabgroup.js b/browser/components/tabbrowser/content/tabgroup.js
index 394b2af2e187b82bb3e98ebcdc6e66b63036e20d..4757555c7654a14578a5d057323057ebc71c2f5f 100644
index 9abf115062e7c86196d7cb6b8ac82a9bb63b5a65..9a38d7dc10403c1ee721b6abf33d525a4aa1f821 100644
--- a/browser/components/tabbrowser/content/tabgroup.js
+++ b/browser/components/tabbrowser/content/tabgroup.js
@@ -14,11 +14,11 @@
@@ -68,17 +68,30 @@ index 394b2af2e187b82bb3e98ebcdc6e66b63036e20d..4757555c7654a14578a5d057323057eb
- return false;
- });
+ this.appendChild = function (child) {
+ this.querySelector(".tab-group-container").appendChild(child);
+ this.groupContainer.appendChild(child);
+ for (let tab of this.tabs) {
+ if (tab.hasAttribute("zen-empty-tab") && tab.group === this) {
+ this.querySelector(".zen-tab-group-start").after(tab);
+ this.groupStartElement.after(tab);
+ }
+ }
+ };
this.#updateLabelAriaAttributes();
@@ -143,6 +162,8 @@
@@ -132,17 +151,21 @@
let tabGroupCreateDetail = this.#wasCreatedByAdoption
? { isAdoptingGroup: true }
: {};
+ if (!this.hasAttribute('drag-image')) {
this.dispatchEvent(
new CustomEvent("TabGroupCreate", {
bubbles: true,
detail: tabGroupCreateDetail,
})
);
+ }
// Reset `wasCreatedByAdoption` to default of false so that we only
// claim that a tab group was created by adoption the first time it
// mounts after getting created by `Tabbrowser.adoptTabGroup`.
this.#wasCreatedByAdoption = false;
}
@@ -87,19 +100,19 @@ index 394b2af2e187b82bb3e98ebcdc6e66b63036e20d..4757555c7654a14578a5d057323057eb
resetDefaultGroupName = () => {
this.#defaultGroupName = "";
@@ -211,7 +232,10 @@
@@ -211,7 +234,10 @@
}
});
}
- this.#tabChangeObserver.observe(this, { childList: true });
+ const container = this.querySelector(".tab-group-container");
+ const container = this.groupContainer;
+ if (container) {
+ this.#tabChangeObserver.observe(container, { childList: true });
+ }
}
get color() {
@@ -305,6 +329,9 @@
@@ -305,6 +331,9 @@
}
set collapsed(val) {
@@ -109,7 +122,7 @@ index 394b2af2e187b82bb3e98ebcdc6e66b63036e20d..4757555c7654a14578a5d057323057eb
if (!!val == this.collapsed) {
return;
}
@@ -391,7 +418,6 @@
@@ -391,7 +420,6 @@
tabGroupName,
})
.then(result => {
@@ -117,7 +130,7 @@ index 394b2af2e187b82bb3e98ebcdc6e66b63036e20d..4757555c7654a14578a5d057323057eb
});
}
@@ -466,13 +492,57 @@
@@ -466,13 +494,65 @@
* @returns {MozTabbrowserTab[]}
*/
get tabs() {
@@ -126,20 +139,29 @@ index 394b2af2e187b82bb3e98ebcdc6e66b63036e20d..4757555c7654a14578a5d057323057eb
- if (childrenArray[i].tagName == "tab-split-view-wrapper") {
- childrenArray.splice(i, 1, ...childrenArray[i].tabs);
+ // add other group tabs if they are under this group
+ let childs = Array.from(this.querySelector(".tab-group-container")?.children ?? []);
+ let childs = Array.from(this.groupContainer?.children ?? []);
+ const tabsCollect = [];
+ for (let item of childs) {
+ tabsCollect.push(item);
+ if (gBrowser.isTabGroup(item)) {
+ tabsCollect.push(...item.tabs);
+ }
+ }
}
}
- return childrenArray.filter(node => node.matches("tab"));
+ return tabsCollect.filter(node => node.matches("tab"));
+ }
+
+ get groupContainer() {
+ return this.querySelector(".tab-group-container");
+ }
+
+ get groupStartElement() {
+ return this.querySelector(".zen-tab-group-start");
+ }
+
+ get childGroupsAndTabs() {
+ const result = [];
+ const container = this.querySelector(".tab-group-container");
+ const container = this.groupContainer;
+
+ for (const item of Array.from(container.children)) {
+ if (gBrowser.isTab(item)) {
@@ -169,9 +191,8 @@ index 394b2af2e187b82bb3e98ebcdc6e66b63036e20d..4757555c7654a14578a5d057323057eb
+ currentGroup = currentGroup?.group;
+ if (currentGroup.collapsed) {
+ return false;
}
}
- return childrenArray.filter(node => node.matches("tab"));
+ }
+ }
+ return true;
+ }
+
@@ -180,15 +201,15 @@ index 394b2af2e187b82bb3e98ebcdc6e66b63036e20d..4757555c7654a14578a5d057323057eb
}
/**
@@ -553,7 +623,6 @@
addTabs(tabs, metricsContext) {
for (let tab of tabs) {
if (tab.pinned) {
- tab.ownerGlobal.gBrowser.unpinTab(tab);
}
let tabToMove =
this.ownerGlobal === tab.ownerGlobal
@@ -616,7 +685,7 @@
@@ -560,7 +640,6 @@
);
} else {
if (tabOrSplitView.pinned) {
- tabOrSplitView.ownerGlobal.gBrowser.unpinTab(tabOrSplitView);
}
let tabToMove =
this.ownerGlobal === tabOrSplitView.ownerGlobal
@@ -625,7 +704,7 @@
*/
on_click(event) {
let isToggleElement =
@@ -197,7 +218,7 @@ index 394b2af2e187b82bb3e98ebcdc6e66b63036e20d..4757555c7654a14578a5d057323057eb
event.target === this.#overflowCountLabel;
if (isToggleElement && event.button === 0) {
event.preventDefault();
@@ -687,5 +756,6 @@
@@ -696,5 +775,6 @@
}
}

View File

@@ -1,8 +1,17 @@
diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js
index 6b6c04599fe80983d13d2069ca62b99d8ad70271..a765f2decc3a565226ac8793422474052f476573 100644
index a61b4e7af40f1404bf3555a7011c6211de917635..bb3c822ad14c4ebf0b8792665ff8242f97e501d9 100644
--- a/browser/components/tabbrowser/content/tabs.js
+++ b/browser/components/tabbrowser/content/tabs.js
@@ -436,7 +436,7 @@
@@ -240,7 +240,7 @@
true
)
? new window.TabStacking(this)
- : new window.TabDragAndDrop(this);
+ : Services.prefs.getBoolPref("zen.tabs.use-legacy-drag-and-drop") ? new window.TabDragAndDrop(this) : new window.ZenDragAndDrop(this);
this.tabDragAndDrop.init();
}
@@ -453,7 +453,7 @@
// and we're not hitting the scroll buttons.
if (
event.button != 0 ||
@@ -11,7 +20,7 @@ index 6b6c04599fe80983d13d2069ca62b99d8ad70271..a765f2decc3a565226ac879342247405
event.composedTarget.localName == "toolbarbutton"
) {
return;
@@ -517,7 +517,6 @@
@@ -534,7 +534,6 @@
});
}
} else if (isTabGroupLabel(event.target)) {
@@ -19,7 +28,7 @@ index 6b6c04599fe80983d13d2069ca62b99d8ad70271..a765f2decc3a565226ac879342247405
} else if (
event.originalTarget.closest("scrollbox") &&
!Services.prefs.getBoolPref(
@@ -553,6 +552,9 @@
@@ -570,6 +569,9 @@
}
on_keydown(event) {
@@ -29,7 +38,7 @@ index 6b6c04599fe80983d13d2069ca62b99d8ad70271..a765f2decc3a565226ac879342247405
let { altKey, shiftKey } = event;
let [accel, nonAccel] =
AppConstants.platform == "macosx"
@@ -747,7 +749,6 @@
@@ -764,7 +766,6 @@
this._updateCloseButtons();
if (!this.#animatingGroups.size) {
@@ -37,7 +46,7 @@ index 6b6c04599fe80983d13d2069ca62b99d8ad70271..a765f2decc3a565226ac879342247405
}
document
@@ -808,7 +809,7 @@
@@ -825,7 +826,7 @@
}
get newTabButton() {
@@ -46,7 +55,7 @@ index 6b6c04599fe80983d13d2069ca62b99d8ad70271..a765f2decc3a565226ac879342247405
}
get verticalMode() {
@@ -824,6 +825,7 @@
@@ -841,6 +842,7 @@
}
get overflowing() {
@@ -54,7 +63,7 @@ index 6b6c04599fe80983d13d2069ca62b99d8ad70271..a765f2decc3a565226ac879342247405
return this.hasAttribute("overflow");
}
@@ -837,29 +839,54 @@
@@ -854,29 +856,56 @@
if (pinnedChildren?.at(-1)?.id == "pinned-tabs-container-periphery") {
pinnedChildren.pop();
}
@@ -81,8 +90,10 @@ index 6b6c04599fe80983d13d2069ca62b99d8ad70271..a765f2decc3a565226ac879342247405
+ tabs.splice(i, 1);
+ // add the tabs in the group to the list
+ tabs.splice(i, 0, ...tab.tabs);
+ } else if (tab.classList.contains("zen-tab-group-start")) {
+ tabs.splice(i, 1);
+ }
+ }
}
+ };
+ expandTabs(pinnedTabs);
+ expandTabs(unpinnedChildren);
@@ -103,7 +114,7 @@ index 6b6c04599fe80983d13d2069ca62b99d8ad70271..a765f2decc3a565226ac879342247405
+ // remove the separator from the list
+ allTabs.splice(i, 1);
+ i--;
}
+ }
+ i++;
}
-
@@ -119,42 +130,55 @@ index 6b6c04599fe80983d13d2069ca62b99d8ad70271..a765f2decc3a565226ac879342247405
}
/**
@@ -926,17 +953,10 @@
let elementIndex = 0;
@@ -944,29 +973,28 @@
return this.#focusableItems;
}
- let unpinnedChildren = Array.from(this.arrowScrollbox.children);
- let pinnedChildren = Array.from(this.pinnedTabsContainer.children);
+ let elementIndex = 0;
+ let children = gZenWorkspaces.tabboxChildrenWithoutEmpty;
let focusableItems = [];
- for (let child of pinnedChildren) {
- if (isTab(child)) {
- child.elementIndex = elementIndex++;
- focusableItems.push(child);
- }
- }
- for (let child of unpinnedChildren) {
+ for (let child of [...gZenWorkspaces.getCurrentEssentialsContainer().children, ...this.pinnedTabsContainer.children, ...children]) {
+ for (let child of [...gZenWorkspaces.getCurrentEssentialsContainer().children, ...(gZenWorkspaces.activeWorkspaceElement?.hasCollapsedPinnedTabs ? [] : this.pinnedTabsContainer.children), ...children]) {
if (isTab(child) && child.visible) {
child.elementIndex = elementIndex++;
focusableItems.push(child);
@@ -944,11 +964,13 @@
child.labelElement.elementIndex = elementIndex++;
} else if (isTabGroup(child)) {
focusableItems.push(child.labelElement);
-
- let visibleTabsInGroup = child.tabs.filter(tab => tab.visible);
+ if (!child.hasAttribute("split-view-group")) {
+ let visibleTabsInGroup = child.childGroupsAndTabs.filter(tab => tab.visible);
visibleTabsInGroup.forEach(tab => {
tab.elementIndex = elementIndex++;
});
+
focusableItems.push(...visibleTabsInGroup);
+ }
} else if (child.tagName == "tab-split-view-wrapper") {
let visibleTabsInSplitView = child.tabs.filter(tab => tab.visible);
visibleTabsInSplitView.forEach(tab => {
@@ -992,6 +1014,7 @@
focusableItems.push(...visibleTabsInSplitView);
}
}
-
+ focusableItems.forEach(item => {
+ item.elementIndex = elementIndex++;
+ });
this.#focusableItems = focusableItems;
return this.#focusableItems;
@@ -979,6 +1007,7 @@
* focusable (ex, we don't want the splitview container to be focusable, only its children).
*/
get dragAndDropElements() {
+ return this.ariaFocusableItems;
if (this.#dragAndDropElements) {
return this.#dragAndDropElements;
}
@@ -1050,6 +1079,7 @@
_invalidateCachedTabs() {
this.#allTabs = null;
this._invalidateCachedVisibleTabs();
@@ -162,7 +186,7 @@ index 6b6c04599fe80983d13d2069ca62b99d8ad70271..a765f2decc3a565226ac879342247405
}
_invalidateCachedVisibleTabs() {
@@ -1095,7 +1118,7 @@
@@ -1154,7 +1184,7 @@
if (node == null) {
// We have a container for non-tab elements at the end of the scrollbox.
@@ -171,7 +195,7 @@ index 6b6c04599fe80983d13d2069ca62b99d8ad70271..a765f2decc3a565226ac879342247405
}
node.before(tab);
@@ -1193,7 +1216,7 @@
@@ -1252,7 +1282,7 @@
// There are separate "new tab" buttons for horizontal tabs toolbar, vertical tabs and
// for when the tab strip is overflowed (which is shared by vertical and horizontal tabs);
// Attach the long click popup to all of them.
@@ -180,7 +204,7 @@ index 6b6c04599fe80983d13d2069ca62b99d8ad70271..a765f2decc3a565226ac879342247405
const newTab2 = this.newTabButton;
const newTabVertical = document.getElementById(
"vertical-tabs-newtab-button"
@@ -1294,8 +1317,10 @@
@@ -1353,8 +1383,10 @@
*/
_handleTabSelect(aInstant) {
let selectedTab = this.selectedItem;
@@ -191,7 +215,7 @@ index 6b6c04599fe80983d13d2069ca62b99d8ad70271..a765f2decc3a565226ac879342247405
selectedTab._notselectedsinceload = false;
}
@@ -1304,7 +1329,7 @@
@@ -1363,7 +1395,7 @@
* @param {boolean} [shouldScrollInstantly=false]
*/
#ensureTabIsVisible(tab, shouldScrollInstantly = false) {
@@ -200,7 +224,7 @@ index 6b6c04599fe80983d13d2069ca62b99d8ad70271..a765f2decc3a565226ac879342247405
if (arrowScrollbox?.overflowing) {
arrowScrollbox.ensureElementIsVisible(tab, shouldScrollInstantly);
}
@@ -1437,7 +1462,7 @@
@@ -1496,7 +1528,7 @@
}
_notifyBackgroundTab(aTab) {

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/urlbar/UrlbarController.sys.mjs b/browser/components/urlbar/UrlbarController.sys.mjs
index 09c1a7d4e156fe5e606f097277420333efe88976..f31e183e7b92c616d81dae509ef0448c4d507cc7 100644
index dc8ca021feff9e5c623dd2e9b3e3a8d6f55aa461..b6382bdcfef0cf6c2975fdb6f1a3c9b5c53f81af 100644
--- a/browser/components/urlbar/UrlbarController.sys.mjs
+++ b/browser/components/urlbar/UrlbarController.sys.mjs
@@ -296,7 +296,6 @@ export class UrlbarController {
@@ -302,7 +302,6 @@ export class UrlbarController {
const isMac = AppConstants.platform == "macosx";
// Handle readline/emacs-style navigation bindings on Mac.
if (
@@ -10,7 +10,7 @@ index 09c1a7d4e156fe5e606f097277420333efe88976..f31e183e7b92c616d81dae509ef0448c
this.view.isOpen &&
event.ctrlKey &&
(event.key == "n" || event.key == "p")
@@ -445,6 +444,8 @@ export class UrlbarController {
@@ -451,6 +450,8 @@ export class UrlbarController {
});
}
event.preventDefault();

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/urlbar/UrlbarPrefs.sys.mjs b/browser/components/urlbar/UrlbarPrefs.sys.mjs
index 0cc0db4889d66872bce2aa775a79a4c68e8cec51..604106e328843b3a6eb0922cc8663474ddb008f4 100644
index 41e8aa0ee37fef0d24d41f2c4e776c39ed3895f6..293e993175bbbd67fa1541db6b9419b687de7fcd 100644
--- a/browser/components/urlbar/UrlbarPrefs.sys.mjs
+++ b/browser/components/urlbar/UrlbarPrefs.sys.mjs
@@ -763,6 +763,7 @@ function makeResultGroups({ showSearchSuggestionsFirst }) {
@@ -759,6 +759,7 @@ function makeResultGroups({ showSearchSuggestionsFirst }) {
*/
let rootGroup = {
children: [

View File

@@ -1,44 +0,0 @@
diff --git a/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs b/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs
index 4db61038e5e476bad3a61dbdb707e5222c1f08f8..9eca13d9cfac3b762917aaaa942267effb743cf7 100644
--- a/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs
+++ b/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs
@@ -45,11 +45,13 @@ function defaultQuery(conditions = "") {
let query = `
SELECT h.url, h.title, ${SQL_BOOKMARK_TAGS_FRAGMENT}, h.id, t.open_count,
${lazy.PAGES_FRECENCY_FIELD} AS frecency, t.userContextId,
- h.last_visit_date, NULLIF(t.groupId, '') groupId
+ h.last_visit_date, NULLIF(t.groupId, '') groupId, zp.url AS pinned_url, zp.title AS pinned_title
FROM moz_places h
LEFT JOIN moz_openpages_temp t
ON t.url = h.url
AND (t.userContextId = :userContextId OR (t.userContextId <> -1 AND :userContextId IS NULL))
+ LEFT JOIN zen_pins zp
+ ON zp.url = h.url
WHERE (
(:switchTabsEnabled AND t.open_count > 0) OR
${lazy.PAGES_FRECENCY_FIELD} <> 0
@@ -63,7 +65,7 @@ function defaultQuery(conditions = "") {
:matchBehavior, :searchBehavior, NULL)
ELSE
AUTOCOMPLETE_MATCH(:searchString, h.url,
- h.title, '',
+ IFNULL(zp.title, h.title), '',
h.visit_count, h.typed,
0, t.open_count,
:matchBehavior, :searchBehavior, NULL)
@@ -1176,11 +1178,13 @@ class Search {
? lazy.PlacesUtils.toDate(lastVisitPRTime).getTime()
: undefined;
let tabGroup = row.getResultByName("groupId");
+ let pinnedTitle = row.getResultByIndex(12);
+ let pinnedUrl = row.getResultByIndex("pinned_url");
let match = {
placeId,
- value: url,
- comment: bookmarkTitle || historyTitle,
+ value: pinnedUrl || url,
+ comment: pinnedTitle || bookmarkTitle || historyTitle,
icon: UrlbarUtils.getIconForUrl(url),
frecency: frecency || FRECENCY_DEFAULT,
userContextId,

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/urlbar/UrlbarProvidersManager.sys.mjs b/browser/components/urlbar/UrlbarProvidersManager.sys.mjs
index 15dd29152cf349b5ed23f1bae0a74a8d7dbe4c3d..f44f5dd87f778f432b0028969ca5732305c98915 100644
index 3a9cb4735185691df021157e42f8b9cc93f14aa1..00d7eaf3177d27df1e0db5303405ce28f3031d34 100644
--- a/browser/components/urlbar/UrlbarProvidersManager.sys.mjs
+++ b/browser/components/urlbar/UrlbarProvidersManager.sys.mjs
@@ -883,6 +883,7 @@ export class Query {
@@ -893,6 +893,7 @@ export class Query {
if (
result.heuristic &&
this.context.searchMode &&

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/urlbar/UrlbarUtils.sys.mjs b/browser/components/urlbar/UrlbarUtils.sys.mjs
index 7e9ede3dae5c2099c45e0221ad1cb8ebd622fc39..f82db27dbd07961ad6af7dbe2cb5d79e5f7a9828 100644
index b97fa81cef276e4bb22414b7c182e00b4bb835dc..1f489eceead0aa331ace59281cb777db5e635366 100644
--- a/browser/components/urlbar/UrlbarUtils.sys.mjs
+++ b/browser/components/urlbar/UrlbarUtils.sys.mjs
@@ -79,6 +79,7 @@ export var UrlbarUtils = {
@@ -81,6 +81,7 @@ export var UrlbarUtils = {
RESTRICT_SEARCH_KEYWORD: "restrictSearchKeyword",
SUGGESTED_INDEX: "suggestedIndex",
TAIL_SUGGESTION: "tailSuggestion",
@@ -10,7 +10,7 @@ index 7e9ede3dae5c2099c45e0221ad1cb8ebd622fc39..f82db27dbd07961ad6af7dbe2cb5d79e
}),
// Defines provider types.
@@ -138,6 +139,7 @@ export var UrlbarUtils = {
@@ -140,6 +141,7 @@ export var UrlbarUtils = {
OTHER_NETWORK: 6,
ADDON: 7,
ACTIONS: 8,
@@ -18,7 +18,7 @@ index 7e9ede3dae5c2099c45e0221ad1cb8ebd622fc39..f82db27dbd07961ad6af7dbe2cb5d79e
}),
// Per-result exposure telemetry.
@@ -549,6 +551,8 @@ export var UrlbarUtils = {
@@ -552,6 +554,8 @@ export var UrlbarUtils = {
return this.RESULT_GROUP.HEURISTIC_FALLBACK;
case "UrlbarProviderHistoryUrlHeuristic":
return this.RESULT_GROUP.HEURISTIC_HISTORY_URL;

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/urlbar/UrlbarValueFormatter.sys.mjs b/browser/components/urlbar/UrlbarValueFormatter.sys.mjs
index 307b3cac259c05e616cf7d5eb1ce50a146550cd9..72252a6363154b6c5f926bf2acf3282e8396d2ad 100644
index 3a8c233dd1e05c070e497ec9877e65b9d8a3e87b..dd2a7aac6945331a3a50a0d7f6d62aeda396b560 100644
--- a/browser/components/urlbar/UrlbarValueFormatter.sys.mjs
+++ b/browser/components/urlbar/UrlbarValueFormatter.sys.mjs
@@ -76,7 +76,7 @@ export class UrlbarValueFormatter {

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/urlbar/UrlbarView.sys.mjs b/browser/components/urlbar/UrlbarView.sys.mjs
index c58bc4871fbfb5ca924df822a09d783f21db616a..68fd73055d30ec4f4128fb8639369f07b167955a 100644
index 6d6cc27e203a5799683a4e6eae1007ff30a69cd0..953c5cd09bcfd832d8ad11016977509f55935eb7 100644
--- a/browser/components/urlbar/UrlbarView.sys.mjs
+++ b/browser/components/urlbar/UrlbarView.sys.mjs
@@ -620,7 +620,7 @@ export class UrlbarView {
@@ -618,7 +618,7 @@ export class UrlbarView {
!this.input.value ||
this.input.getAttribute("pageproxystate") == "valid"
) {
@@ -11,7 +11,7 @@ index c58bc4871fbfb5ca924df822a09d783f21db616a..68fd73055d30ec4f4128fb8639369f07
// Try to reuse the cached top-sites context. If it's not cached, then
// there will be a gap of time between when the input is focused and
// when the view opens that can be perceived as flicker.
@@ -2855,6 +2855,8 @@ export class UrlbarView {
@@ -2852,6 +2852,8 @@ export class UrlbarView {
if (row?.hasAttribute("row-selectable")) {
row?.toggleAttribute("selected", true);
}
@@ -24,7 +24,7 @@ index c58bc4871fbfb5ca924df822a09d783f21db616a..68fd73055d30ec4f4128fb8639369f07
}
#enableOrDisableRowWrap() {
- let wrap = getBoundsWithoutFlushing(this.input.textbox).width < 650;
- let wrap = getBoundsWithoutFlushing(this.input).width < 650;
+ let wrap = false;
this.#rows.toggleAttribute("wrap", wrap);
this.oneOffSearchButtons?.container.toggleAttribute("wrap", wrap);

View File

@@ -1,7 +1,7 @@
diff --git a/browser/components/urlbar/UrlbarInput.sys.mjs b/browser/components/urlbar/UrlbarInput.sys.mjs
index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f5f45accf 100644
--- a/browser/components/urlbar/UrlbarInput.sys.mjs
+++ b/browser/components/urlbar/UrlbarInput.sys.mjs
diff --git a/browser/components/urlbar/content/UrlbarInput.mjs b/browser/components/urlbar/content/UrlbarInput.mjs
index edb0482f0bfb22c70a585b0770e5b0437983779e..545f65db4fe8b807b388d5552842cd9e56a72eb3 100644
--- a/browser/components/urlbar/content/UrlbarInput.mjs
+++ b/browser/components/urlbar/content/UrlbarInput.mjs
@@ -68,6 +68,13 @@ const lazy = XPCOMUtils.declareLazy({
logger: () => lazy.UrlbarUtils.getLogger({ prefix: "Input" }),
});
@@ -13,10 +13,10 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
+ 'default'
+);
+
const DEFAULT_FORM_HISTORY_NAME = "searchbar-history";
const UNLIMITED_MAX_RESULTS = 99;
@@ -445,7 +452,16 @@ export class UrlbarInput {
let getBoundsWithoutFlushing = element =>
@@ -630,7 +637,16 @@ export class UrlbarInput extends HTMLElement {
// See _on_select(). HTMLInputElement.select() dispatches a "select"
// event but does not set the primary selection.
this._suppressPrimaryAdjustment = true;
@@ -33,10 +33,10 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
this._suppressPrimaryAdjustment = false;
}
@@ -521,6 +537,10 @@ export class UrlbarInput {
@@ -704,6 +720,10 @@ export class UrlbarInput extends HTMLElement {
hideSearchTerms = false,
isSameDocument = false
) {
isSameDocument = false,
} = {}) {
+ if (this.hasAttribute("zen-newtab")) {
+ return;
+ }
@@ -44,7 +44,7 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
if (!this.#isAddressbar) {
throw new Error(
"Cannot set URI for UrlbarInput that is not an address bar"
@@ -798,8 +818,16 @@ export class UrlbarInput {
@@ -985,8 +1005,16 @@ export class UrlbarInput extends HTMLElement {
return;
}
}
@@ -62,7 +62,7 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
}
/**
@@ -1215,7 +1243,11 @@ export class UrlbarInput {
@@ -1405,7 +1433,11 @@ export class UrlbarInput extends HTMLElement {
}
if (!this.#providesSearchMode(result)) {
@@ -75,7 +75,7 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
}
if (isCanonized) {
@@ -2335,6 +2367,32 @@ export class UrlbarInput {
@@ -2529,6 +2561,32 @@ export class UrlbarInput extends HTMLElement {
await this.#updateLayoutBreakoutDimensions();
}
@@ -108,7 +108,7 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
startLayoutExtend() {
if (!this.#allowBreakout || this.hasAttribute("breakout-extend")) {
// Do not expand if the Urlbar does not support being expanded or it is
@@ -2349,6 +2407,13 @@ export class UrlbarInput {
@@ -2543,6 +2601,13 @@ export class UrlbarInput extends HTMLElement {
this.setAttribute("breakout-extend", "true");
@@ -122,7 +122,7 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
// Enable the animation only after the first extend call to ensure it
// doesn't run when opening a new window.
if (!this.hasAttribute("breakout-extend-animate")) {
@@ -2368,6 +2433,24 @@ export class UrlbarInput {
@@ -2562,6 +2627,24 @@ export class UrlbarInput extends HTMLElement {
return;
}
@@ -147,7 +147,7 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
this.removeAttribute("breakout-extend");
this.#updateTextboxPosition();
}
@@ -2398,7 +2481,7 @@ export class UrlbarInput {
@@ -2592,7 +2675,7 @@ export class UrlbarInput extends HTMLElement {
forceUnifiedSearchButtonAvailable = false
) {
let prevState = this.getAttribute("pageproxystate");
@@ -156,12 +156,12 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
this.setAttribute("pageproxystate", state);
this._inputContainer.setAttribute("pageproxystate", state);
this._identityBox?.setAttribute("pageproxystate", state);
@@ -2635,10 +2718,12 @@ export class UrlbarInput {
@@ -2846,10 +2929,12 @@ export class UrlbarInput extends HTMLElement {
return;
}
this.textbox.style.top = px(
this.style.top = px(
+ this.window.gZenVerticalTabsManager._hasSetSingleToolbar ?
this.textbox.parentNode.getBoxQuads({
this.parentNode.getBoxQuads({
ignoreTransforms: true,
flush: false,
})[0].p1.y
@@ -169,19 +169,19 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
);
}
@@ -2698,9 +2783,10 @@ export class UrlbarInput {
@@ -2908,9 +2993,10 @@ export class UrlbarInput extends HTMLElement {
return;
}
+ this.window.gZenVerticalTabsManager.recalculateURLBarHeight();
this.textbox.parentNode.style.setProperty(
this.parentNode.style.setProperty(
"--urlbar-container-height",
- px(getBoundsWithoutFlushing(this.textbox.parentNode).height)
+ px(getBoundsWithoutFlushing(this.textbox.parentNode).height + 8)
- px(getBoundsWithoutFlushing(this.parentNode).height)
+ px(getBoundsWithoutFlushing(this.parentNode).height + 8)
);
this.textbox.style.setProperty(
this.style.setProperty(
"--urlbar-height",
@@ -3134,6 +3220,7 @@ export class UrlbarInput {
@@ -3344,6 +3430,7 @@ export class UrlbarInput extends HTMLElement {
}
_toggleActionOverride(event) {
@@ -189,7 +189,7 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
if (
event.keyCode == KeyEvent.DOM_VK_SHIFT ||
event.keyCode == KeyEvent.DOM_VK_ALT ||
@@ -3237,8 +3324,8 @@ export class UrlbarInput {
@@ -3447,8 +3534,8 @@ export class UrlbarInput extends HTMLElement {
if (!this.#isAddressbar) {
return val;
}
@@ -200,7 +200,7 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
: val;
// Only trim value if the directionality doesn't change to RTL and we're not
// showing a strikeout https protocol.
@@ -3544,6 +3631,7 @@ export class UrlbarInput {
@@ -3754,6 +3841,7 @@ export class UrlbarInput extends HTMLElement {
resultDetails = null,
browser = this.window.gBrowser.selectedBrowser
) {
@@ -208,7 +208,7 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
if (this.#isAddressbar) {
this.#prepareAddressbarLoad(
url,
@@ -3651,6 +3739,10 @@ export class UrlbarInput {
@@ -3861,6 +3949,10 @@ export class UrlbarInput extends HTMLElement {
}
reuseEmpty = true;
}
@@ -219,7 +219,7 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
if (
where == "tab" &&
reuseEmpty &&
@@ -3658,6 +3750,9 @@ export class UrlbarInput {
@@ -3868,6 +3960,9 @@ export class UrlbarInput extends HTMLElement {
) {
where = "current";
}
@@ -229,7 +229,7 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
return where;
}
@@ -3909,6 +4004,7 @@ export class UrlbarInput {
@@ -4122,6 +4217,7 @@ export class UrlbarInput extends HTMLElement {
this.setResultForCurrentValue(null);
this.handleCommand();
this.controller.clearLastQueryContextCache();
@@ -237,7 +237,7 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
this._suppressStartQuery = false;
});
@@ -3916,7 +4012,6 @@ export class UrlbarInput {
@@ -4129,7 +4225,6 @@ export class UrlbarInput extends HTMLElement {
contextMenu.addEventListener("popupshowing", () => {
// Close the results pane when the input field contextual menu is open,
// because paste and go doesn't want a result selection.
@@ -245,7 +245,7 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
let controller =
this.document.commandDispatcher.getControllerForCommand("cmd_paste");
@@ -4026,7 +4121,11 @@ export class UrlbarInput {
@@ -4239,7 +4334,11 @@ export class UrlbarInput extends HTMLElement {
if (!engineName && !source && !this.hasAttribute("searchmode")) {
return;
}
@@ -258,27 +258,27 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
if (this._searchModeIndicatorTitle) {
this._searchModeIndicatorTitle.textContent = "";
this._searchModeIndicatorTitle.removeAttribute("data-l10n-id");
@@ -4338,6 +4437,7 @@ export class UrlbarInput {
@@ -4549,6 +4648,7 @@ export class UrlbarInput extends HTMLElement {
this.document.l10n.setAttributes(
this.inputField,
+ this.window.gZenVerticalTabsManager._hasSetSingleToolbar ? 'zen-singletoolbar-urlbar-placeholder-with-name' :
l10nId,
l10nId == "urlbar-placeholder-with-name" ? { name } : undefined
);
@@ -4449,6 +4549,11 @@ export class UrlbarInput {
l10nId == "urlbar-placeholder-with-name"
? { name: engineName }
@@ -4662,6 +4762,11 @@ export class UrlbarInput extends HTMLElement {
}
_on_click(event) {
+ if (event.target == this.inputField) {
+ event.zenOriginalTarget = this.textbox;
+ event.zenOriginalTarget = this;
+ this._on_mousedown(event);
+ }
+
if (
event.target == this.inputField ||
event.target == this._inputContainer
@@ -4521,7 +4626,7 @@ export class UrlbarInput {
switch (event.target) {
case this.inputField:
case this._inputContainer:
@@ -4740,7 +4845,7 @@ export class UrlbarInput extends HTMLElement {
}
}
@@ -287,13 +287,13 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
this.view.autoOpen({ event });
} else {
if (this._untrimOnFocusAfterKeydown) {
@@ -4561,9 +4666,16 @@ export class UrlbarInput {
@@ -4780,9 +4885,16 @@ export class UrlbarInput extends HTMLElement {
}
_on_mousedown(event) {
- switch (event.currentTarget) {
+ switch (event.zenOriginalTarget || event.currentTarget) {
case this.textbox: {
case this: {
this._mousedownOnUrlbarDescendant = true;
+ const isProbablyFloating =
+ (this.zenUrlbarBehavior == "floating-on-type" &&
@@ -302,10 +302,10 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
+ if (event.type != "click" && isProbablyFloating || event.type == "click" && !isProbablyFloating) {
+ return true;
+ }
if (
event.target != this.inputField &&
@@ -4574,6 +4686,10 @@ export class UrlbarInput {
event.composedTarget != this.inputField &&
event.composedTarget != this._inputContainer
@@ -4792,6 +4904,10 @@ export class UrlbarInput extends HTMLElement {
this.focusedViaMousedown = !this.focused;
this._preventClickSelectsAll = this.focused;
@@ -316,7 +316,7 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
// Keep the focus status, since the attribute may be changed
// upon calling this.focus().
@@ -4609,7 +4725,7 @@ export class UrlbarInput {
@@ -4827,7 +4943,7 @@ export class UrlbarInput extends HTMLElement {
}
// Don't close the view when clicking on a tab; we may want to keep the
// view open on tab switch, and the TabSelect event arrived earlier.
@@ -325,7 +325,7 @@ index 6ad064710da20f7a13fda3517780c2f38b3d2865..58a01eef024d8b9992068a6a5b7be68f
break;
}
@@ -4930,7 +5046,7 @@ export class UrlbarInput {
@@ -5155,7 +5271,7 @@ export class UrlbarInput extends HTMLElement {
// When we are in actions search mode we can show more results so
// increase the limit.
let maxResults =

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