From b0f165a744430cd950cb9a608cc204a6970e2230 Mon Sep 17 00:00:00 2001 From: mr-cheffy <91018726+mr-cheffy@users.noreply.github.com> Date: Sat, 1 Nov 2025 02:40:40 +0000 Subject: [PATCH 01/41] docs: Update monthly issue metrics, b=(no bug), c={docs} --- .../2025_2025-10-01..2025-10-31.md | 276 ++++++++++++++++++ 1 file changed, 276 insertions(+) create mode 100644 docs/issue-metrics/2025_2025-10-01..2025-10-31.md diff --git a/docs/issue-metrics/2025_2025-10-01..2025-10-31.md b/docs/issue-metrics/2025_2025-10-01..2025-10-31.md new file mode 100644 index 000000000..3e808ca88 --- /dev/null +++ b/docs/issue-metrics/2025_2025-10-01..2025-10-31.md @@ -0,0 +1,276 @@ +# Issue Metrics + +| Metric | Average | Median | 90th percentile | +| --- | --- | --- | ---: | +| Time to first response | 15:19:48 | 2:42:07 | 1 day, 0:05:54 | +| Time to close | 22:10:13 | 4:42:08 | 2 days, 0:56:21 | + +| Metric | Count | +| --- | ---: | +| Number of items that remain open | 108 | +| Number of items closed | 150 | +| Total number of items created | 258 | + +| Title | URL | Time to first response | Time to close | +| --- | --- | --- | --- | +| The right click menu goes beyond the app border sometimes on arch hyprland | https://github.com/zen-browser/desktop/issues/11103 | None | None | +| Zen glance doesn't respect --margin-top-fix | https://github.com/zen-browser/desktop/issues/11098 | None | None | +| Security info button missing in url bar | https://github.com/zen-browser/desktop/issues/11093 | None | None | +| OS dark mode not detected by browser | https://github.com/zen-browser/desktop/issues/11092 | None | None | +| Zen menu is somehow showing on the "wrong" side of the app | https://github.com/zen-browser/desktop/issues/11091 | None | None | +| Volume is very low in YouTube videos. | https://github.com/zen-browser/desktop/issues/11089 | None | None | +| Opening Sidebar by Dragging URL in Compact Mode May Prevent Sidebar from Hiding | https://github.com/zen-browser/desktop/issues/11088 | None | None | +| Collapsed sidebar tab icons are misaligned when tabs are overflown | https://github.com/zen-browser/desktop/issues/11087 | 2:13:10 | None | +| Screensharing Teams over Zen instantly caused the system to hard crash | https://github.com/zen-browser/desktop/issues/11086 | None | None | +| Can't use KeePassXC-Browser in Zen (Flatpak) with KeePassXC (not FlatPak) | https://github.com/zen-browser/desktop/issues/11084 | None | None | +| PiP video reproduction makes the tab crash after a while | https://github.com/zen-browser/desktop/issues/11083 | None | None | +| Elements above the essentials tabs are in the toolbar instead of the sidebar in compact mode | https://github.com/zen-browser/desktop/issues/11082 | 1:11:28 | None | +| Select Tag missing background makes content not visible | https://github.com/zen-browser/desktop/issues/11081 | 15:01:49 | 19:55:32 | +| Hovering bookmarks toolbar causes vertical wiggle of website | https://github.com/zen-browser/desktop/issues/11080 | 0:32:11 | None | +| Custom Wallpaper on new tab does not loads in any Container | https://github.com/zen-browser/desktop/issues/11079 | 4:25:50 | 4:25:50 | +| Unable to activate the option to clear the history without the Zen interface being down. | https://github.com/zen-browser/desktop/issues/11078 | None | None | +| Zen sometimes hangs when a context menu or overlay is triggered | https://github.com/zen-browser/desktop/issues/11077 | None | None | +| Theme Editor fails to render the colour picker | https://github.com/zen-browser/desktop/issues/11076 | 1:55:40 | 19:38:53 | +| Tabs lost when closing main window before Library window | https://github.com/zen-browser/desktop/issues/11073 | None | None | +| The topbar doesn't hide in compact when the browser is closed and opening a link from outside | https://github.com/zen-browser/desktop/issues/11070 | None | None | +| Essentials tabs are no longer colored to icon accent (zen.theme.essentials-favicon-bg) | https://github.com/zen-browser/desktop/issues/11069 | None | None | +| Browser Gets Stuck in workspace. and upon restart deletes all current tabs & history. | https://github.com/zen-browser/desktop/issues/11068 | None | None | +| Unloaded tabs logos aren't dimmed | https://github.com/zen-browser/desktop/issues/11065 | None | None | +| url bar disappearing and stuttering after last update | https://github.com/zen-browser/desktop/issues/11063 | 1:01:34 | 5:21:04 | +| Unable to install any mods from the store / mods do not work anymore | https://github.com/zen-browser/desktop/issues/11062 | None | None | +| Page missing space without compact mode | https://github.com/zen-browser/desktop/issues/11060 | None | None | +| Unable to drop new tabs when using auto-hide menu | https://github.com/zen-browser/desktop/issues/11059 | None | 0:23:34 | +| Window top bar overlaps contents when expanded on hover | https://github.com/zen-browser/desktop/issues/11056 | 2:37:18 | 4:47:35 | +| SAVED WEBSITES NOT SHOWING FAVICONS ON STARTUP | https://github.com/zen-browser/desktop/issues/11050 | 5:08:35 | 6:19:52 | +| On single toolbar mode shortcut "toggle sidebar's width" doesnt change zen.view.use-single-toolbar, causing you to never be able to not hide sidebar in compact mode | https://github.com/zen-browser/desktop/issues/11049 | None | 2:09:48 | +| After every Zen Browser update, the browser automatically redirects all HTTP requests to HTTPS | https://github.com/zen-browser/desktop/issues/11048 | 1 day, 3:16:04 | None | +| Sidebar keeps moving when dragging a link to the sidebar in compact mode | https://github.com/zen-browser/desktop/issues/11045 | 1:26:22 | 1:26:22 | +| Browser auto force quits when sharing screen on Google meet | https://github.com/zen-browser/desktop/issues/11044 | 1 day, 0:37:45 | None | +| bookmark icon missing from address bar. Extenision cannot be pinned to toolbar | https://github.com/zen-browser/desktop/issues/11043 | 0:08:08 | 18:47:26 | +| Folder bug because of browser.tabs.groups.enabled was set to true when the first update about folders came out. | https://github.com/zen-browser/desktop/issues/11042 | 6:09:21 | 6:09:21 | +| Very confusing behaviour: Zen changes some keyboards keys | https://github.com/zen-browser/desktop/issues/11039 | None | None | +| Floating URL bar is off-center in Compact Mode | https://github.com/zen-browser/desktop/issues/11036 | 5:43:02 | 9:06:12 | +| severe lag when Compact Tabs mode is enabled | https://github.com/zen-browser/desktop/issues/11035 | None | None | +| Pinned/Essentials tabs are not individual for each window on restart | https://github.com/zen-browser/desktop/issues/11034 | 20:23:59 | None | +| Issue with toolbar after the update | https://github.com/zen-browser/desktop/issues/11033 | 0:30:05 | 0:30:05 | +| Url bar sometimes overlaps page | https://github.com/zen-browser/desktop/issues/11032 | 0:40:02 | None | +| Sluggish Scrolling With Winodws 11 Dynamic Refresh Rate | https://github.com/zen-browser/desktop/issues/11030 | 0:36:58 | 2:14:02 | +| [Bug] Picture-in-Picture (PiP) icon disappears from the URL bar | https://github.com/zen-browser/desktop/issues/11029 | 2:02:15 | 2 days, 1:05:37 | +| Splitter barely visible when Split View + Compact Mode are active | https://github.com/zen-browser/desktop/issues/11027 | 0:11:40 | None | +| The new unified panel has significantly affected the dragging link behavior (For example, drag and drop to save bookmarks). | https://github.com/zen-browser/desktop/issues/11026 | None | None | +| Nextcloud passwords plugin fails to keep connection to nextcloud | https://github.com/zen-browser/desktop/issues/11025 | None | None | +| Extension symbol in toolbar | https://github.com/zen-browser/desktop/issues/11024 | 1:04:53 | None | +| bookmark is bugged | https://github.com/zen-browser/desktop/issues/11023 | None | 2:09:24 | +| Essential tab background color not adapting to icon color | https://github.com/zen-browser/desktop/issues/11022 | None | None | +| Extensions button is missing if Removed from toolbar | https://github.com/zen-browser/desktop/issues/11021 | 0:12:48 | 0:12:48 | +| Zen icon not appearing in sidebar in "only sidebar" mode in macOS | https://github.com/zen-browser/desktop/issues/11020 | 1:19:03 | None | +| White background websites render as transparent | https://github.com/zen-browser/desktop/issues/11019 | 2:00:20 | 5 days, 10:00:50 | +| Extensions menu (and its "jigsaw" button) need to be an option | https://github.com/zen-browser/desktop/issues/11013 | 1:10:36 | 1:10:36 | +| sign in with google failing | https://github.com/zen-browser/desktop/issues/11010 | 0:15:42 | None | +| Stuttering when playing 4K videos on Bilibili | https://github.com/zen-browser/desktop/issues/11007 | 0:27:17 | 1 day, 17:54:57 | +| Cannot access extension icons on sites that have DRM content in version 1.17.2b | https://github.com/zen-browser/desktop/issues/11004 | 1:05:25 | None | +| URL bar in a wrong place | https://github.com/zen-browser/desktop/issues/11002 | 1:34:49 | 1:34:49 | +| Zen slow on Linux after v1.17b | https://github.com/zen-browser/desktop/issues/11001 | None | 20:41:15 | +| Extension flagged by Mozilla as risky display broken | https://github.com/zen-browser/desktop/issues/11000 | 1:46:25 | 1:46:25 | +| Title bar of zen browser | https://github.com/zen-browser/desktop/issues/10998 | 0:46:49 | 0:47:07 | +| Glance buttons not appearing on the left side | https://github.com/zen-browser/desktop/issues/10997 | 1:06:43 | 1:06:43 | +| Compact Mode Sidebar Obfuscats Favorites (Top) in New Window | https://github.com/zen-browser/desktop/issues/10994 | None | 0:10:54 | +| Video issues (constant stuttering) On Flatpack version of Zen browser | https://github.com/zen-browser/desktop/issues/10993 | 0:10:08 | 2 days, 8:24:55 | +| Update to 1.17.2b wiped the session data | https://github.com/zen-browser/desktop/issues/10992 | 2:11:53 | None | +| Zen freezes when an image is copied on Linux | https://github.com/zen-browser/desktop/issues/10991 | 4:55:17 | None | +| Toolbar items becomes overflow menu | https://github.com/zen-browser/desktop/issues/10990 | 6:38:06 | 8:17:57 | +| Compact mode double toolbar slide over webview not appearing correctly | https://github.com/zen-browser/desktop/issues/10987 | 0:23:29 | 10:55:15 | +| Middle clicking on a pinned tab no longer removes it | https://github.com/zen-browser/desktop/issues/10984 | 2:11:56 | 2:11:56 | +| Page Reload icon | https://github.com/zen-browser/desktop/issues/10983 | 2:35:26 | 2:35:26 | +| v1.17 broke CamelCamelCamel extension | https://github.com/zen-browser/desktop/issues/10982 | 2:42:07 | 2:42:07 | +| Closing last tab individually prevents restoring window/session | https://github.com/zen-browser/desktop/issues/10981 | None | None | +| Cannot drag image to the left panel when in compact mode | https://github.com/zen-browser/desktop/issues/10979 | 0:30:59 | 6:10:19 | +| Suddenly my tabs deleted | https://github.com/zen-browser/desktop/issues/10978 | None | None | +| Release Notes tab always opens at the top of the tabs' list | https://github.com/zen-browser/desktop/issues/10976 | 0:01:36 | None | +| I cannot use the "hide toolbar" option on compact mode | https://github.com/zen-browser/desktop/issues/10975 | None | 0:12:57 | +| Mouse events not firing correctly for items under control buttons when the bar is hidden | https://github.com/zen-browser/desktop/issues/10973 | 0:36:05 | 1 day, 9:12:42 | +| Container tab name removed from URL bar | https://github.com/zen-browser/desktop/issues/10972 | 0:16:56 | 1:13:15 | +| Extensions (Puzzle Piece) Icon Missing After Update | https://github.com/zen-browser/desktop/issues/10971 | 0:12:24 | 0:28:02 | +| Top toolbar in multi-toolbar mode is shown when it shouldn’t | https://github.com/zen-browser/desktop/issues/10970 | None | 2:08:34 | +| Middle clicking on pending tab no longer closes it | https://github.com/zen-browser/desktop/issues/10969 | None | 0:01:44 | +| Reload button is hidden under menu when it is the only item in the menu | https://github.com/zen-browser/desktop/issues/10968 | None | 0:44:47 | +| Compact Mode sidebar is on the bottom of the screen rather than being in the middle. | https://github.com/zen-browser/desktop/issues/10965 | None | 0:08:13 | +| Youtube video player cropped in fullscreen | https://github.com/zen-browser/desktop/issues/10964 | None | 0:02:31 | +| New Site Control Center renders add-on warnings vertically on top of the rest of the UI | https://github.com/zen-browser/desktop/issues/10963 | None | 0:02:07 | +| Media keys (Previous, Pause, Next) don't work | https://github.com/zen-browser/desktop/issues/10962 | 0:01:20 | 6:30:56 | +| [UI] Container IDs removed from URL bar | https://github.com/zen-browser/desktop/issues/10961 | 0:09:33 | 0:12:33 | +| History | https://github.com/zen-browser/desktop/issues/10960 | 0:22:22 | 0:58:14 | +| The toolbar remains visible after following specific steps in compact mode | https://github.com/zen-browser/desktop/issues/10959 | 2:31:24 | None | +| New extensions' interface in address bar still broken for some extensions | https://github.com/zen-browser/desktop/issues/10958 | None | 8:26:44 | +| Copy current URL pop up doesn't disappear | https://github.com/zen-browser/desktop/issues/10956 | 8:56:54 | 10:51:44 | +| The icon for "Enable compact mode" is a duplicate in the sidebar. | https://github.com/zen-browser/desktop/issues/10955 | 10:48:59 | None | +| Wrong style on 4 buttons | https://github.com/zen-browser/desktop/issues/10954 | 0:27:06 | 0:27:06 | +| Poor formatting in extensions control panel | https://github.com/zen-browser/desktop/issues/10953 | 0:32:14 | 0:32:14 | +| New top border line at top of browser application window | https://github.com/zen-browser/desktop/issues/10952 | None | 0:58:56 | +| "Hide Top bar" compact mode is greyed out / impossible to select | https://github.com/zen-browser/desktop/issues/10951 | 0:07:47 | 14:26:57 | +| Cannot hide "forward" button from toolbar | https://github.com/zen-browser/desktop/issues/10949 | 0:28:05 | 0:28:05 | +| Top toolbar now covers up top of webpages | https://github.com/zen-browser/desktop/issues/10948 | 0:34:17 | 14:55:39 | +| Missing the Extensions "Jigsaw" icon next to the URL bar. | https://github.com/zen-browser/desktop/issues/10947 | 0:45:52 | 4:36:42 | +| Can't place Home button to left upper corner | https://github.com/zen-browser/desktop/issues/10946 | None | None | +| All tabs close and disappear when you open a private window | https://github.com/zen-browser/desktop/issues/10945 | None | 1:03:19 | +| Youtube Controls Only Partially Visible in Fullscreen Mode | https://github.com/zen-browser/desktop/issues/10944 | 1:21:37 | 1:21:37 | +| Sidebar Flickers/Flaps Rapidly When Dragging Text/URL to Window Edge in Compact Mode | https://github.com/zen-browser/desktop/issues/10942 | 2:43:13 | 6 days, 19:36:33 | +| Dragging tab out of window opens a new blank window instead of a new tabbed window | https://github.com/zen-browser/desktop/issues/10941 | 0:15:32 | 0:15:32 | +| Compact Mode "Hide toolbar" only works with tabs on right | https://github.com/zen-browser/desktop/issues/10940 | 0:25:59 | 0:25:58 | +| Floating URL bar not appearing on focus in compact mode | https://github.com/zen-browser/desktop/issues/10938 | 1:53:52 | None | +| Extension area layout breaks after switching between toolbar layouts | https://github.com/zen-browser/desktop/issues/10936 | 3:14:21 | 10:14:36 | +| No option to revert "new" extensions + site settings menu | https://github.com/zen-browser/desktop/issues/10935 | 3:14:19 | 3:14:19 | +| Search bar bug while compact mode on macos | https://github.com/zen-browser/desktop/issues/10934 | 1:01:13 | 1:17:41 | +| Tooltips missing for unified panel quick actions | https://github.com/zen-browser/desktop/issues/10933 | None | 4:13:23 | +| In collapsed sidebar mode you are no longer able to hide toolbar | https://github.com/zen-browser/desktop/issues/10932 | 1:51:58 | 3:53:59 | +| playerctl metadata shows firefox instead of zen browser | https://github.com/zen-browser/desktop/issues/10931 | 8:32:21 | None | +| Zen doesn't retrieve correct accent color from OS | https://github.com/zen-browser/desktop/issues/10930 | 4:19:46 | None | +| Compact Mode Issue on Windows | https://github.com/zen-browser/desktop/issues/10929 | 3:39:31 | 4:10:59 | +| Layout inconsistency between Look and Feel preview and the actual collapsed toolbar | https://github.com/zen-browser/desktop/issues/10928 | 0:30:59 | 5:17:10 | +| about:logo has wrong logo | https://github.com/zen-browser/desktop/issues/10926 | None | None | +| pinned split view tabs don't have "X" near them on hover | https://github.com/zen-browser/desktop/issues/10924 | None | 5:40:27 | +| New extention tab doesnt render right if one of the extentions violate mozilla policy | https://github.com/zen-browser/desktop/issues/10922 | None | 5:16:46 | +| Line above URL bar but not sidebar | https://github.com/zen-browser/desktop/issues/10921 | 5:57:13 | 5:57:13 | +| New menu for extensions, etc. overflows the window. | https://github.com/zen-browser/desktop/issues/10918 | 0:37:05 | 0:53:30 | +| [UI Bug?] Horizontal scrollbar appears in "Looks and Feel" settings on smaller window widths (e.g. 1280px) | https://github.com/zen-browser/desktop/issues/10915 | 3:43:21 | 1 day, 13:46:48 | +| 'New tab' button no longer at the top of unpinned tabs | https://github.com/zen-browser/desktop/issues/10914 | 3:19:00 | 11:13:57 | +| Top toolbar adopts Transparent Zen mod format in Compact Mode Double Toolbar | https://github.com/zen-browser/desktop/issues/10913 | 3:34:48 | 3:34:48 | +| Compact Mode formatting bugs when switching between Toolbar settings | https://github.com/zen-browser/desktop/issues/10912 | 3:58:57 | None | +| Compact Mode Collapsed Sidebar on hover endlessly expands | https://github.com/zen-browser/desktop/issues/10911 | None | 4:09:14 | +| Compact Mode Sidebar Only won't hide. | https://github.com/zen-browser/desktop/issues/10910 | 3:45:10 | None | +| Compact Mode Double Toolbar, Top Toolbar doesn't hide. | https://github.com/zen-browser/desktop/issues/10909 | None | 0:29:10 | +| Compact mode hide toolbar option Broken if 'Tabs on Right' | https://github.com/zen-browser/desktop/issues/10908 | 5:35:04 | 5:35:04 | +| New extensions' interface in address bar broken for some extensions | https://github.com/zen-browser/desktop/issues/10907 | 0:12:05 | 3 days, 15:02:25 | +| Missing tabs when closing and reopening Zen browser with multiple windows | https://github.com/zen-browser/desktop/issues/10906 | 0:09:30 | 0:09:30 | +| missing theme/accent settings (linux, flathub) (?) | https://github.com/zen-browser/desktop/issues/10905 | 1:06:10 | 1:06:10 | +| Battery consumption | https://github.com/zen-browser/desktop/issues/10903 | 0:29:10 | 0:29:10 | +| browser-init-js.patch error while building from zero on arch linux | https://github.com/zen-browser/desktop/issues/10902 | 3:53:18 | None | +| Addon popup window broken when no tabs opened | https://github.com/zen-browser/desktop/issues/10900 | None | 1:43:44 | +| Udemy Crash | https://github.com/zen-browser/desktop/issues/10898 | None | 0:04:29 | +| Text in sidebar becomes unreadable after switching system theme | https://github.com/zen-browser/desktop/issues/10893 | 12:10:14 | 12:11:00 | +| Extensions popup failing to render when zen is recently launched | https://github.com/zen-browser/desktop/issues/10892 | 0:06:10 | 0:33:28 | +| New tab URL popup doesn’t appear when opening a new tab using Ctrl+T while watching videos in fullscreen | https://github.com/zen-browser/desktop/issues/10891 | 9:44:27 | 15:42:30 | +| Zen Browser’s RAM usage on Arch Linux suddenly completely blew up after waking up from sleep (64GB of RAM + 32GB of Zram) | https://github.com/zen-browser/desktop/issues/10889 | 11:05:26 | 4 days, 0:26:42 | +| Holy GPU Usage (I have a 6750xt for reference {12GB VRAM} ) | https://github.com/zen-browser/desktop/issues/10888 | 13:36:41 | 5 days, 21:19:18 | +| Dragging tabs across multi-screens | https://github.com/zen-browser/desktop/issues/10875 | None | None | +| Sidbery Conflict in Zen Browser only | https://github.com/zen-browser/desktop/issues/10871 | None | 2 days, 5:59:58 | +| Bookmarks Bar Folders is incorrectly redundantly displayed | https://github.com/zen-browser/desktop/issues/10866 | 2 days, 17:12:01 | None | +| Source tarball should include zen locales | https://github.com/zen-browser/desktop/issues/10865 | None | 15:18:10 | +| Simplify extension login breaking | https://github.com/zen-browser/desktop/issues/10864 | 0:12:31 | 1:06:05 | +| Open site in container sites cannot be added to essentials | https://github.com/zen-browser/desktop/issues/10862 | 1:07:05 | None | +| 1password addon integration fails to show unlock window | https://github.com/zen-browser/desktop/issues/10859 | 0:39:20 | None | +| duplicated letters or conflict with Vietnamese keyboards | https://github.com/zen-browser/desktop/issues/10858 | 1:29:34 | 1:35:14 | +| Creating a space with multiple windows open freezes other windows | https://github.com/zen-browser/desktop/issues/10857 | 8:08:55 | None | +| Mozilla services miscredited in user menu | https://github.com/zen-browser/desktop/issues/10854 | None | 4 days, 2:52:29 | +| Website's icons not showing if not loaded | https://github.com/zen-browser/desktop/issues/10853 | 0:06:20 | 0:06:20 | +| Bookmarks Toolbar is completely blank (flatpak install) | https://github.com/zen-browser/desktop/issues/10852 | 0:58:24 | 2:24:04 | +| Closing a tab switches to a particular previously visited tab instead of the immediately previous | https://github.com/zen-browser/desktop/issues/10848 | None | None | +| A resize cursor appears. | https://github.com/zen-browser/desktop/issues/10846 | 10:28:06 | None | +| Bookmarks Toolbar can not "only show on new tab" | https://github.com/zen-browser/desktop/issues/10845 | 9:18:48 | None | +| Sound not working on browser | https://github.com/zen-browser/desktop/issues/10844 | 9:25:58 | None | +| Theme issue on the UI | https://github.com/zen-browser/desktop/issues/10835 | None | None | +| Zombie processes | https://github.com/zen-browser/desktop/issues/10834 | 0:22:17 | None | +| The URL bar flashes too often | https://github.com/zen-browser/desktop/issues/10832 | None | 0:04:01 | +| Fixed or anchored website in browser can't be removed | https://github.com/zen-browser/desktop/issues/10828 | 0:15:40 | 6:35:29 | +| The media controls at the bottom overlap important elements. | https://github.com/zen-browser/desktop/issues/10824 | 9:33:17 | 17:48:58 | +| [Twilight] Compact mode button causing top toolbar to not hide/to not appear when hovering | https://github.com/zen-browser/desktop/issues/10821 | None | 17:59:30 | +| the top bar is not functional as expexted. | https://github.com/zen-browser/desktop/issues/10820 | 0:22:50 | 14:40:32 | +| Browser Screen Goes Blank (Them color ) Randomly –No UI Visible, Audio Still play . | https://github.com/zen-browser/desktop/issues/10817 | None | None | +| Sidebar Gets Stuck After Interacting With an Exntension in Compact Mode | https://github.com/zen-browser/desktop/issues/10812 | 2:15:35 | 10:54:25 | +| website setting lost | https://github.com/zen-browser/desktop/issues/10811 | None | None | +| Scrolling cause GPU spikes | https://github.com/zen-browser/desktop/issues/10810 | 0:02:36 | 3:39:42 | +| No such native application org.gnome.chrome_gnome_shell | https://github.com/zen-browser/desktop/issues/10806 | 2:20:05 | None | +| keep crashing | https://github.com/zen-browser/desktop/issues/10804 | 1 day, 0:05:54 | None | +| Workspace-aware restore closed tab behavior for reopening tabs | https://github.com/zen-browser/desktop/issues/10803 | 1 day, 20:48:51 | 1 day, 20:48:51 | +| After activation "Zen will never remember history" all toolbars are black and the font color is also black | https://github.com/zen-browser/desktop/issues/10802 | 9:08:32 | None | +| Fullscreen mode doesn't hide toolbar and sidebar | https://github.com/zen-browser/desktop/issues/10800 | 7:38:33 | 7:38:33 | +| DOH: Zen loose connectivity when network changes | https://github.com/zen-browser/desktop/issues/10799 | None | None | +| Large Memory Leak Issue (zen.exe not properly exiting) | https://github.com/zen-browser/desktop/issues/10797 | 10:46:25 | 10:46:25 | +| Absolutely broken compact mode 1.17t | https://github.com/zen-browser/desktop/issues/10796 | 10:56:37 | 1 day, 11:24:34 | +| I am being randomly logged out of websites | https://github.com/zen-browser/desktop/issues/10792 | None | None | +| 1Password desktop app integration not working in Zen Browser | https://github.com/zen-browser/desktop/issues/10788 | 0:44:13 | 0:44:13 | +| [Bug] WebRender content becomes blurry at 5120x1440 with NVIDIA eGPU on Linux (X11) - Upstream Firefox has this issue too but not as badly | https://github.com/zen-browser/desktop/issues/10787 | None | None | +| Tab Icons not rendering for certain tabs | https://github.com/zen-browser/desktop/issues/10782 | 0:09:03 | 0:09:03 | +| Dragging sidebar moves the window | https://github.com/zen-browser/desktop/issues/10781 | 1:56:10 | 1:56:10 | +| blinking caret bug | https://github.com/zen-browser/desktop/issues/10780 | 3:09:48 | 3:09:48 | +| Freezing youtube videos when i change screens | https://github.com/zen-browser/desktop/issues/10779 | None | None | +| Browser Icons Not Showing on Toolbar or Favorites in KDE Plasma on Fedora Linux | https://github.com/zen-browser/desktop/issues/10778 | None | None | +| AUR version of Zen Browser glitches/pauses continuously | https://github.com/zen-browser/desktop/issues/10777 | 12:31:55 | None | +| When tab changes while sub-folder is closing, does not fold the tab opened | https://github.com/zen-browser/desktop/issues/10772 | 9:29:58 | 9:29:58 | +| Green artifacts appear on the scrollbar while scrolling some webpages | https://github.com/zen-browser/desktop/issues/10766 | 6:41:23 | None | +| no newtab wallpaper apart from Default Workspace with no set profile container. | https://github.com/zen-browser/desktop/issues/10764 | 1:01:42 | 5:12:31 | +| Zen is slow to update and restart on macOS | https://github.com/zen-browser/desktop/issues/10763 | None | None | +| Layout issue: Preventing window from closing, minimizing, or resizing | https://github.com/zen-browser/desktop/issues/10762 | None | 18 days, 0:27:20 | +| Url bar overflow when click fullscreen | https://github.com/zen-browser/desktop/issues/10760 | None | None | +| Updates Failing | https://github.com/zen-browser/desktop/issues/10759 | 1 day, 9:15:55 | 1 day, 10:06:37 | +| Youtube video playback noticeably dropping frames | https://github.com/zen-browser/desktop/issues/10756 | 7:33:59 | None | +| Some websites' background is missing, uses Zen's theme color instead | https://github.com/zen-browser/desktop/issues/10755 | None | 0:02:35 | +| Toolbar History icon nonfunctional | https://github.com/zen-browser/desktop/issues/10752 | 20:34:15 | None | +| Video and audio playback error after recent pacman update | https://github.com/zen-browser/desktop/issues/10751 | None | 3:41:57 | +| Twitch.tv Login Issue on Zen Browser | https://github.com/zen-browser/desktop/issues/10750 | 5:49:14 | 1 day, 1:42:41 | +| Missing translations | https://github.com/zen-browser/desktop/issues/10749 | 3:28:20 | None | +| Passbolt Password Manager doesn't work properly | https://github.com/zen-browser/desktop/issues/10748 | 12:48:48 | 12:48:48 | +| Update are broken on macos since 1.16.4b | https://github.com/zen-browser/desktop/issues/10746 | 2 days, 16:23:56 | None | +| Blank Context Menu | https://github.com/zen-browser/desktop/issues/10745 | 10:19:37 | 11:46:43 | +| Cant load beehiv login page | https://github.com/zen-browser/desktop/issues/10744 | 14:48:10 | 14:48:10 | +| Ctrl+Shift+T after deleting a folder breaks Zen | https://github.com/zen-browser/desktop/issues/10743 | None | None | +| Settings: Search -> Address bar with browsing history negates open tabs selection | https://github.com/zen-browser/desktop/issues/10741 | None | None | +| NGINX 404 of some sites | https://github.com/zen-browser/desktop/issues/10740 | 3:51:13 | 18:34:43 | +| no pop up edit bookmark pages after triggered with 1) shortcut and 2) star icon after right click. setting "Sidebar only" of the 3 sidebar modes | https://github.com/zen-browser/desktop/issues/10738 | 4 days, 5:09:44 | 16 days, 22:20:24 | +| Sidebar resize issue when dragging the cursor beyond smallest size | https://github.com/zen-browser/desktop/issues/10737 | 1:03:24 | None | +| Can't access extensions menu from New Tab | https://github.com/zen-browser/desktop/issues/10733 | 1:46:53 | 2 days, 1:20:18 | +| Regular window tabs lost on closing if Incognito window is open | https://github.com/zen-browser/desktop/issues/10732 | 1:48:17 | 2:00:03 | +| Nested folders go back to root of workspace when opening Zen. | https://github.com/zen-browser/desktop/issues/10730 | 3:57:00 | None | +| Youtube videoplay laggy | https://github.com/zen-browser/desktop/issues/10729 | 6:03:54 | 2 days, 2:00:09 | +| Stay on page doesn't work in pinned/essential tabs | https://github.com/zen-browser/desktop/issues/10728 | None | None | +| Touch Keyboard Does Not Show | https://github.com/zen-browser/desktop/issues/10727 | 18 days, 12:51:30 | None | +| No page info in compact mode if clicked on URL | https://github.com/zen-browser/desktop/issues/10724 | None | 1:10:01 | +| Search Bar Problem | https://github.com/zen-browser/desktop/issues/10723 | 3:29:09 | 19:52:36 | +| Can't disable Hide Tab bar | https://github.com/zen-browser/desktop/issues/10722 | 0:12:09 | 2:23:39 | +| Compact Mode - Customize Toolbar - Sidebar cannot have Items | https://github.com/zen-browser/desktop/issues/10721 | 4:31:48 | 4:31:48 | +| [macOS] File upload dialog freezes Zen Browser for several seconds | https://github.com/zen-browser/desktop/issues/10719 | None | 1:29:55 | +| Mouse hover breaks Ctrl + Tab (tab switching) | https://github.com/zen-browser/desktop/issues/10715 | 4 days, 19:04:17 | 5 days, 4:09:28 | +| Spotify not working after updating to 1.16.3b | https://github.com/zen-browser/desktop/issues/10714 | 0:12:47 | 2:11:45 | +| Cursor dissapears in most online text editors | https://github.com/zen-browser/desktop/issues/10713 | 5:37:12 | None | +| Tabs dont close | https://github.com/zen-browser/desktop/issues/10710 | None | None | +| Address Bar opens on keypress right after starting zen | https://github.com/zen-browser/desktop/issues/10709 | None | None | +| Search bar wont fully disappear when trying to close it | https://github.com/zen-browser/desktop/issues/10708 | 9:51:49 | 9:51:49 | +| [Twilight] Tabs' area is reduced when enabling compact mode in collapsed toolbars layout | https://github.com/zen-browser/desktop/issues/10706 | 15:58:04 | 15:58:04 | +| Is not possible expand de tabs side bar | https://github.com/zen-browser/desktop/issues/10705 | 0:19:09 | 12:56:28 | +| Missing tab navigation keyboard shortcut | https://github.com/zen-browser/desktop/issues/10704 | 2:47:17 | 1 day, 1:48:51 | +| Switching workspace hotkey slow to repeat. | https://github.com/zen-browser/desktop/issues/10703 | 4:59:37 | None | +| DevTools warning: connected browser newer than Zen (unsupported setup message) | https://github.com/zen-browser/desktop/issues/10702 | None | 0:07:32 | +| - [Bug] High Memory & Disk Consumption on Snapdragon X Plus Device | https://github.com/zen-browser/desktop/issues/10701 | None | None | +| Youtube Live Streams Are Not Working After The Update | https://github.com/zen-browser/desktop/issues/10698 | 3:17:57 | 1 day, 3:35:02 | +| Very low performance | https://github.com/zen-browser/desktop/issues/10695 | 1:40:48 | 1:40:48 | +| Can you fucing fix the ctrashing???? | https://github.com/zen-browser/desktop/issues/10693 | 0:42:11 | 3:45:23 | +| Strange Behaviour with Context Menu Clicks | https://github.com/zen-browser/desktop/issues/10691 | 6:58:32 | None | +| Can't play DRM content on the latest release 1.16.3b | https://github.com/zen-browser/desktop/issues/10689 | 15:28:49 | None | +| On macOS, workspace swipe actions require "Swipe between pages" to be enabled in system settings | https://github.com/zen-browser/desktop/issues/10687 | None | None | +| macOS Altcodes / Modifier Keys Cause Keyboard Shortcut Issues | https://github.com/zen-browser/desktop/issues/10686 | 11 days, 13:05:50 | None | +| Mute button simply stopped functioning. | https://github.com/zen-browser/desktop/issues/10685 | None | None | +| Linux: 1Password desktop integration fails for Flatpak and Tarball installs | https://github.com/zen-browser/desktop/issues/10684 | None | None | +| Entire Program Constantly Crashes With No Discernible Reproduction Method, Making it Unusable | https://github.com/zen-browser/desktop/issues/10683 | 4:17:45 | 1 day, 10:38:49 | +| URL Bar appears cut off and onto the side (Floating URL Bar Issue) | https://github.com/zen-browser/desktop/issues/10682 | 1:31:06 | 0:02:30 | +| All tabs keep crashing on Windows | https://github.com/zen-browser/desktop/issues/10681 | 1 day, 7:25:22 | None | +| Failure to Update Zen Browser from Version 1.16.1b-1 to 1.16.2b-1 | https://github.com/zen-browser/desktop/issues/10678 | 2:02:51 | 5:04:58 | +| Cannot set hotkey for "Stop Loading" (Browser:Stop). | https://github.com/zen-browser/desktop/issues/10677 | 2 days, 0:55:20 | 2 days, 0:55:19 | +| Zen has suddenly overriden default Bitwarden keyboard shortcut and even when unbound it cannot be used for bitwarden | https://github.com/zen-browser/desktop/issues/10676 | None | None | +| Zen Browser blocks Macbook from sleep | https://github.com/zen-browser/desktop/issues/10673 | None | None | +| Cannot select text in URL bar by dragging mouse | https://github.com/zen-browser/desktop/issues/10671 | None | 1 day, 20:37:27 | +| Bookmarks bar partially obscured by sidebar | https://github.com/zen-browser/desktop/issues/10667 | 19 days, 23:45:50 | None | +| Browser freezes when tab is opened by external app with workspace switching enabled | https://github.com/zen-browser/desktop/issues/10666 | 1 day, 1:33:52 | None | +| The bookmarks bar disappears in full screen mode | https://github.com/zen-browser/desktop/issues/10665 | 18:54:47 | 20:41:21 | +| Websites rendering broken for me in 1.16 (fixed but reporting for clarity) | https://github.com/zen-browser/desktop/issues/10664 | None | None | +| cmd + option + M interferes with macOS cmd + option + H + M global command | https://github.com/zen-browser/desktop/issues/10663 | None | None | +| Zen freezes for ~3 seconds when downloading a file | https://github.com/zen-browser/desktop/issues/10657 | 18:33:18 | None | +| Twitch Video Stuttering | https://github.com/zen-browser/desktop/issues/10653 | 1 day, 0:24:44 | None | +| Recent Update Made Zen crash when using NVIDIA HW Acceleration (X11, Linux) | https://github.com/zen-browser/desktop/issues/10652 | 5 days, 18:32:13 | None | +| Search bar does not hide and stays stuck on screen | https://github.com/zen-browser/desktop/issues/10650 | 0:10:53 | 2:43:42 | +| browser stutter/halts/unresponsive | https://github.com/zen-browser/desktop/issues/10649 | 11:29:19 | None | +| Issue with `1.16.2b-1` | https://github.com/zen-browser/desktop/issues/10648 | 6:46:15 | 6:46:15 | +| Zen Sync not working | https://github.com/zen-browser/desktop/issues/10647 | 1 day, 7:52:54 | 12 days, 4:07:32 | +| Stability issue: random crashes after v1.16.2b update | https://github.com/zen-browser/desktop/issues/10646 | 3:44:53 | 10:49:23 | + +_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-10-01..2025-10-31` From 8097b402aad2c845193fb3f3b7754e87511a9cbc Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Sun, 2 Nov 2025 00:36:23 +0100 Subject: [PATCH 02/41] chore: New Crowdin updates, p=#11102 --- .../browser/preferences/zen-preferences.ftl | 2 +- locales/ko/browser/browser/zen-general.ftl | 12 ++--- locales/ko/browser/browser/zen-workspaces.ftl | 6 +-- .../browser/preferences/zen-preferences.ftl | 52 +++++++++---------- locales/lt/browser/browser/zen-general.ftl | 22 ++++---- locales/lt/browser/browser/zen-split-view.ftl | 2 +- locales/lt/browser/browser/zen-welcome.ftl | 2 +- locales/lt/browser/browser/zen-workspaces.ftl | 6 +-- .../browser/preferences/zen-preferences.ftl | 2 +- locales/uk/browser/browser/zen-workspaces.ftl | 6 +-- 10 files changed, 56 insertions(+), 56 deletions(-) diff --git a/locales/ko/browser/browser/preferences/zen-preferences.ftl b/locales/ko/browser/browser/preferences/zen-preferences.ftl index 853382131..7044951b2 100644 --- a/locales/ko/browser/browser/preferences/zen-preferences.ftl +++ b/locales/ko/browser/browser/preferences/zen-preferences.ftl @@ -304,4 +304,4 @@ zen-devtools-toggle-performance-shortcut = 성능 탭 전환 zen-devtools-toggle-storage-shortcut = 저장소 탭 전환 zen-devtools-toggle-dom-shortcut = DOM 탭 전환 zen-devtools-toggle-accessibility-shortcut = 접근성 탭 전환 -zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs +zen-close-all-unpinned-tabs-shortcut = 모든 고정되지 않은 탭 닫기 diff --git a/locales/ko/browser/browser/zen-general.ftl b/locales/ko/browser/browser/zen-general.ftl index 456953faa..77c7c86bb 100644 --- a/locales/ko/browser/browser/zen-general.ftl +++ b/locales/ko/browser/browser/zen-general.ftl @@ -63,8 +63,8 @@ zen-generic-next = 다음 # These labels will be used for the site data panel settings zen-site-data-setting-allow = 허용됨 zen-site-data-setting-block = 금지됨 -zen-site-data-protections-enabled = Enabled -zen-site-data-protections-disabled = Disabled +zen-site-data-protections-enabled = 활성화됨 +zen-site-data-protections-disabled = 비활성화됨 zen-site-data-setting-cross-site = 사이트 간 공유 쿠키 zen-site-data-security-info-extension = .label = 확장 @@ -79,13 +79,13 @@ zen-site-data-get-addons = zen-site-data-site-settings = .label = 모든 사이트 설정 zen-site-data-header-share = - .tooltiptext = Share This Page + .tooltiptext = 이 페이지 공유 zen-site-data-header-reader-mode = - .tooltiptext = Enter Reader Mode + .tooltiptext = 읽기 모드 켜기 zen-site-data-header-screenshot = - .tooltiptext = Take a Screenshot + .tooltiptext = 화면 캡쳐 zen-site-data-header-bookmark = - .tooltiptext = Bookmark This Page + .tooltiptext = 이 페이지 북마크 zen-urlbar-copy-url-button = .tooltiptext = URL 복사 zen-site-data-setting-site-protection = 추적 보호 diff --git a/locales/ko/browser/browser/zen-workspaces.ftl b/locales/ko/browser/browser/zen-workspaces.ftl index 105cbf911..dcaf818b3 100644 --- a/locales/ko/browser/browser/zen-workspaces.ftl +++ b/locales/ko/browser/browser/zen-workspaces.ftl @@ -59,7 +59,7 @@ zen-workspaces-delete-workspace-title = 워크스페이스를 삭제하시겠습 zen-workspaces-delete-workspace-body = 정말 { $name }을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다. # Note that the html tag MUST not be changed or removed, as it is used to better # display the shortcut in the toast notification. -zen-workspaces-close-all-unpinned-tabs-toast = Tabs Closed! Use { $shortcut } to undo. +zen-workspaces-close-all-unpinned-tabs-toast = 탭을 닫았습니다! 되돌리려면 { $shortcut }을 사용하세요. zen-workspaces-close-all-unpinned-tabs-title = - .label = Clear - .tooltiptext = Close all unpinned tabs + .label = 탭 정리 + .tooltiptext = 고정되지 않은 모든 탭을 닫습니다 diff --git a/locales/lt/browser/browser/preferences/zen-preferences.ftl b/locales/lt/browser/browser/preferences/zen-preferences.ftl index d78493dd1..8cc320b86 100644 --- a/locales/lt/browser/browser/preferences/zen-preferences.ftl +++ b/locales/lt/browser/browser/preferences/zen-preferences.ftl @@ -16,12 +16,12 @@ sync-engine-workspaces = .label = Darbo sritys .tooltiptext = Sinchronizuokite savo darbo sritis tarp įrenginių .accesskey = W -zen-glance-title = Greitasis pažiūrėjimas -zen-glance-header = Bendrieji greitojo pažiūrėjimo nustatymai -zen-glance-description = Gaukite greitą nuorodų apžvalgą neatidarydami jų naujoje kortelėje +zen-glance-title = Spartusis pažiūrėjimas +zen-glance-header = Bendrieji sparčiojo pažiūrėjimo nustatymai +zen-glance-description = Gaukite sparčią savo nuorodų apžvalgą neatverdami jų naujoje kortelėje. zen-glance-trigger-label = Paleidimo būdas zen-glance-enabled = - .label = Įjungti greitą pažiūrėjimą + .label = Įjungti spartų pažiūrėjimą zen-glance-trigger-ctrl-click = .label = Vald + spausti zen-glance-trigger-alt-click = @@ -29,15 +29,15 @@ zen-glance-trigger-alt-click = zen-glance-trigger-shift-click = .label = Lyg2 + spausti zen-glance-trigger-meta-click = - .label = Meta (Komanda) + spausti + .label = „Meta“ (komanda) + spausti zen-look-and-feel-compact-view-header = Rodyti kompaktiniame rodinyje -zen-look-and-feel-compact-view-description = Rodyti tik tas įrankių juostas, kurias naudojate! +zen-look-and-feel-compact-view-description = Rodyti tik tas įrankių juostas, kurias naudojate. zen-look-and-feel-compact-view-enabled = .label = Įjungti „{ -brand-short-name }“ kompaktinį režimą zen-look-and-feel-compact-view-top-toolbar = .label = Slėpti viršutinę įrankių juostą ir kompaktiniu režimu zen-look-and-feel-compact-toolbar-flash-popup = - .label = Trumpai padaryti, kad įrankių juosta iškyltų perjungiant arba atidarant naujas korteles kompaktiniu režimu + .label = Trumpai padaryti, kad įrankių juosta iškiltų perjungiant arba atidarant naujas korteles kompaktiniu režimu pane-zen-tabs-title = Kortelių tvarkymas category-zen-workspaces = .tooltiptext = { pane-zen-tabs-title } @@ -50,29 +50,29 @@ zen-workspace-continue-where-left-off = .label = Tęskite, kur baigėte pane-zen-pinned-tab-manager-title = Prisegtos kortelės zen-pinned-tab-manager-header = Bendrieji prisegtų kortelių nustatymai -zen-pinned-tab-manager-description = Tvarkykite papildomą prisegtų kortelių elgseną +zen-pinned-tab-manager-description = Tvarkykite papildomą prisegtų kortelių elgseną. zen-pinned-tab-manager-restore-pinned-tabs-to-pinned-url = .label = Atkurti prisegtas korteles į jų originalų prisegtą URL paleidimo metu zen-pinned-tab-manager-container-specific-essentials-enabled = .label = Įjungti konkrečiam konteineriui būtinuosius -zen-pinned-tab-manager-close-shortcut-behavior-label = Užverti kortelę sparčiųjų klavišų elgsena +zen-pinned-tab-manager-close-shortcut-behavior-label = Užvėrimo kortelę sparčiųjų klavišų elgsena zen-pinned-tab-manager-reset-unload-switch-close-shortcut-option = - .label = Atkurti URL, iškelti ir perjungti į kitą kortelę + .label = Atkurti URL, iškelti ir perjungti į sekančią kortelę zen-pinned-tab-manager-unload-switch-close-shortcut-option = - .label = Iškelti ir perjungti į kitą kortelę + .label = Iškelti ir perjungti į sekančią kortelę zen-pinned-tab-manager-reset-switch-close-shortcut-option = - .label = Atkurti URL ir perjungti į kitą kortelę + .label = Atkurti URL ir perjungti į sekančią kortelę zen-pinned-tab-manager-switch-close-shortcut-option = - .label = Perjungti į kitą kortelę + .label = Perjungti į sekančią kortelę zen-pinned-tab-manager-reset-close-shortcut-option = .label = Atkurti URL zen-pinned-tab-manager-close-close-shortcut-option = .label = Užverti kortelę pane-zen-workspaces-header = Darbo sritys zen-settings-workspaces-header = Bendrieji darbo sričių nustatymai -zen-settings-workspaces-description = Su darbo sritimis galite vienu metu atlikti kelias naršymo seansus! +zen-settings-workspaces-description = Su darbo sritimis galite vienu metu atlikti kelias naršymo seansus. zen-settings-workspaces-enabled = - .label = Įjungti darbo sritis (eksperimentinė) + .label = Įjungti darbo sritis zen-settings-workspaces-hide-default-container-indicator = .label = Slėpti numatytojo konteinerio indikatorių kortelių juostoje zen-key-unsaved = Neįrašytas spartusis klavišas! Iš naujo jį įvedę, paspauskite grįžimo klavišą. @@ -80,18 +80,18 @@ zen-key-conflict = Konfliktuoja su „{ $group }“ -> „{ $shortcut }“ pane-zen-theme-title = Temų nustatymai zen-vertical-tabs-title = Šoninė juosta ir kortelių išdėstymas zen-vertical-tabs-header = Vertikalios kortelės -zen-vertical-tabs-description = Tvarkykite korteles vertikaliame išdėstyme +zen-vertical-tabs-description = Tvarkykite korteles vertikaliame išdėstyme. zen-vertical-tabs-show-expand-button = .label = Rodyti išskleidimo mygtuką zen-vertical-tabs-newtab-on-tab-list = .label = Rodyti naujos kortelės mygtuką kortelių sąraše zen-vertical-tabs-newtab-top-button-up = .label = Perkelti naujos kortelės mygtuką į viršų -zen-vertical-tabs-expand-tabs-by-default = Išskleisti korteles pagal numatytąją nustatymą -zen-vertical-tabs-dont-expand-tabs-by-default = Neišskleisti kortelių pagal numatytąją nustatymą +zen-vertical-tabs-expand-tabs-by-default = Išskleisti korteles pagal numatytąją +zen-vertical-tabs-dont-expand-tabs-by-default = Neišskleisti kortelių pagal numatytąją zen-vertical-tabs-expand-tabs-on-hover = Išskleisti korteles užvedus (neveikia kompaktiniame režime) zen-vertical-tabs-expand-tabs-header = Kaip išskleisti korteles -zen-vertical-tabs-expand-tabs-description = Pasirinkite, kaip išskleisti kortelės šoninėje juostoje +zen-vertical-tabs-expand-tabs-description = Pasirinkite, kaip išskleisti kortelės šoninėje juostoje. zen-theme-marketplace-header = „Zen“ modifikacijos zen-theme-disable-all-enabled = .title = Išjungti visus modifikacijas @@ -128,10 +128,10 @@ pane-zen-marketplace-title = „Zen“ modifikacijos zen-themes-auto-update = .label = Automatiškai atnaujinti įdiegtas modifikacijas paleidimo metu zen-settings-workspaces-force-container-tabs-to-workspace = - .label = Perjungti į darbo sritį, kurioje konteineris nustatytas kaip numatytasis, atidarant konteinerio korteles + .label = Perjungti į darbo sritį, kurioje konteineris nustatytas kaip numatytasis, atveriant konteinerio korteles zen-theme-marketplace-link = Aplankyti parduotuvę zen-dark-theme-styles-header = Tamsios temos stiliai -zen-dark-theme-styles-description = Tinkinkite tamsią temą pagal savo poreikius +zen-dark-theme-styles-description = Tinkinkite tamsią temą pagal savo poreikius. zen-dark-theme-styles-amoled = Naktinė tema zen-dark-theme-styles-default = Numatytoji tamsi tema zen-dark-theme-styles-colorful = Spalvinga tamsi tema @@ -153,13 +153,13 @@ category-zen-CKS = .tooltiptext = { pane-zen-CKS-title } pane-settings-CKS-title = „{ -brand-short-name }“ klaviatūros spartieji klavišai zen-settings-CKS-header = Tinkinkite klaviatūros sparčiuosius klavišus -zen-settings-CKS-description = Keiskite numatytąsias klaviatūros sparčiąsias klavišus pagal savo pageidavimus ir patobulinkite naršymo potyrį +zen-settings-CKS-description = Keiskite numatytąsias klaviatūros sparčiąsias klavišus pagal savo pageidavimus ir patobulinkite naršymo patirtį. zen-settings-CKS-disable-firefox = .label = Išjungti „{ -brand-short-name }“ numatytuosius klaviatūros sparčiuosius klavišus zen-settings-CKS-duplicate-shortcut = .label = Dubliuoti spartųjį klavišą zen-settings-CKS-reset-shortcuts = - .label = Atkurti į numatytuosius nustatymus + .label = Atkurti į numatytuosius zenCKSOption-group-other = Kita zenCKSOption-group-windowAndTabManagement = Langų ir kortelių tvarkymas zenCKSOption-group-navigation = Naršymas @@ -234,7 +234,7 @@ zen-find-shortcut = Rasti puslapyje zen-search-find-again-shortcut = Rasti dar kartą zen-search-find-again-shortcut-prev = Rasti ankstesnį zen-search-find-again-shortcut-2 = Rasti dar kartą (Alt) -zen-bookmark-this-page-shortcut = Pridėti šį puslapį prie adresyno +zen-bookmark-this-page-shortcut = Įtraukti šį puslapį į adresyną zen-bookmark-show-library-shortcut = Rodyti adresyno biblioteką zen-key-stop = Stabdyti įkėlimą zen-full-zoom-reduce-shortcut = Sumažinti @@ -257,7 +257,7 @@ zen-close-tab-shortcut = Užverti kortelę zen-compact-mode-shortcut-show-sidebar = Perjungti slankančią šoninę juostą zen-compact-mode-shortcut-show-toolbar = Perjungti slankančią įrankių juostą zen-compact-mode-shortcut-toggle = Perjungti kompaktinį režimą -zen-glance-expand = Išskleisti greitą pažiūrėjimą +zen-glance-expand = Išskleisti spartų pažiūrėjimą zen-workspace-shortcut-switch-1 = Perjungti į 1 darbo sritį zen-workspace-shortcut-switch-2 = Perjungti į 2 darbo sritį zen-workspace-shortcut-switch-3 = Perjungti į 3 darbo sritį @@ -304,4 +304,4 @@ zen-devtools-toggle-performance-shortcut = Perjungti našumą zen-devtools-toggle-storage-shortcut = Perjungti saugyklą zen-devtools-toggle-dom-shortcut = Perjungti DOM zen-devtools-toggle-accessibility-shortcut = Perjungti prieinamumą -zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs +zen-close-all-unpinned-tabs-shortcut = Užverti visas neprisegtas korteles diff --git a/locales/lt/browser/browser/zen-general.ftl b/locales/lt/browser/browser/zen-general.ftl index f3af1aeb8..8a2d80b79 100644 --- a/locales/lt/browser/browser/zen-general.ftl +++ b/locales/lt/browser/browser/zen-general.ftl @@ -28,7 +28,7 @@ pictureinpicture-minimize-btn = .tooltip = Sumažinti zen-panel-ui-gradient-generator-custom-color = Pasirinktinė spalva zen-panel-ui-gradient-generator-saved-message = Gradientas sėkmingai įrašytas. -zen-copy-current-url-confirmation = Copied current URL! +zen-copy-current-url-confirmation = Nukopijuotas dabartinis URL. zen-general-cancel-label = .label = Atšaukti zen-general-confirm = @@ -59,13 +59,13 @@ urlbar-search-mode-zen_actions = Veiksmai zen-site-data-settings = Nustatymai zen-generic-manage = Tvarkyti zen-generic-more = Daugiau -zen-generic-next = Next +zen-generic-next = Sekantis # These labels will be used for the site data panel settings zen-site-data-setting-allow = Leidžiama zen-site-data-setting-block = Užblokuota -zen-site-data-protections-enabled = Enabled -zen-site-data-protections-disabled = Disabled -zen-site-data-setting-cross-site = Cross-Site cookie +zen-site-data-protections-enabled = Įjungta +zen-site-data-protections-disabled = Išjungta +zen-site-data-setting-cross-site = Tarpusavio svetainės slapukas zen-site-data-security-info-extension = .label = Plėtinys zen-site-data-security-info-secure = @@ -79,16 +79,16 @@ zen-site-data-get-addons = zen-site-data-site-settings = .label = Visi svetainės nustatymai zen-site-data-header-share = - .tooltiptext = Share This Page + .tooltiptext = Bendrinti šį puslapį zen-site-data-header-reader-mode = - .tooltiptext = Enter Reader Mode + .tooltiptext = Įeiti į skaitytojo režimą zen-site-data-header-screenshot = - .tooltiptext = Take a Screenshot + .tooltiptext = Daryti ekrano kopiją zen-site-data-header-bookmark = - .tooltiptext = Bookmark This Page + .tooltiptext = Įtraukti šį puslapį į adresyną zen-urlbar-copy-url-button = - .tooltiptext = Copy URL -zen-site-data-setting-site-protection = Tracking Protection + .tooltiptext = Kopijuoti URL +zen-site-data-setting-site-protection = Stebėjimo apsauga # Section: Feature callouts diff --git a/locales/lt/browser/browser/zen-split-view.ftl b/locales/lt/browser/browser/zen-split-view.ftl index 8f0e1c9bf..6c0f705d1 100644 --- a/locales/lt/browser/browser/zen-split-view.ftl +++ b/locales/lt/browser/browser/zen-split-view.ftl @@ -19,5 +19,5 @@ zen-split-view-modifier-header = Skaidymo rodinys zen-split-view-modifier-activate-reallocation = .label = Aktyvuoti perskyrimą zen-split-view-modifier-enabled-toast = Skaidymo rodinio pertvarkymas įjungtas. -zen-split-view-modifier-enabled-toast-description = Nutempkite rodinį, kad jį pertvarkytumėte. Paspauskite Gr, kad išeitumėte. +zen-split-view-modifier-enabled-toast-description = Nutempkite rodinį, kad pertvarkytumėte. Paspauskite Gr, kad išeitumėte. zen-split-view-modifier-disabled-toast = Skaidymo rodinio pertvarkymas išjungtas. diff --git a/locales/lt/browser/browser/zen-welcome.ftl b/locales/lt/browser/browser/zen-welcome.ftl index 03ceb5b64..2cbeb06b5 100644 --- a/locales/lt/browser/browser/zen-welcome.ftl +++ b/locales/lt/browser/browser/zen-welcome.ftl @@ -18,7 +18,7 @@ zen-welcome-workspace-colors-description = Suasmeninkite savo naršyklę, suteik zen-welcome-start-browsing-title = Viskas parengta?
Pradėkime veikti! -zen-welcome-start-browsing-description-1 = Viskas parengta ir gali veikti. Spustelėkite toliau esantį mygtuką, kad pradėtumėte naršyti su „{ -brand-short-name }“. +zen-welcome-start-browsing-description-1 = Viskas parengta ir gali veikti. Spustelėkite žemiau esantį mygtuką, kad pradėtumėte naršyti su „{ -brand-short-name }“. zen-welcome-start-browsing = Pirmyn! zen-welcome-default-search-title = Jūsų numatytasis paieškos variklis zen-welcome-default-search-description = Pasirinkite numatytąjį paieškos variklį. Vėliau visada galite ją pakeisti! diff --git a/locales/lt/browser/browser/zen-workspaces.ftl b/locales/lt/browser/browser/zen-workspaces.ftl index 9027e7a36..710690274 100644 --- a/locales/lt/browser/browser/zen-workspaces.ftl +++ b/locales/lt/browser/browser/zen-workspaces.ftl @@ -59,7 +59,7 @@ zen-workspaces-delete-workspace-title = Ištrinti erdvę? zen-workspaces-delete-workspace-body = Ar tikrai norite ištrinti „{ $name }“? Šio veiksmo anuliuoti negalima. # Note that the html tag MUST not be changed or removed, as it is used to better # display the shortcut in the toast notification. -zen-workspaces-close-all-unpinned-tabs-toast = Tabs Closed! Use { $shortcut } to undo. +zen-workspaces-close-all-unpinned-tabs-toast = Kortelės užvertos! Naudokite { $shortcut }, kad atšauktumėte. zen-workspaces-close-all-unpinned-tabs-title = - .label = Clear - .tooltiptext = Close all unpinned tabs + .label = Valyti + .tooltiptext = Užverti visas neprisegtas korteles diff --git a/locales/uk/browser/browser/preferences/zen-preferences.ftl b/locales/uk/browser/browser/preferences/zen-preferences.ftl index efb5d6a38..bbb5a6832 100644 --- a/locales/uk/browser/browser/preferences/zen-preferences.ftl +++ b/locales/uk/browser/browser/preferences/zen-preferences.ftl @@ -304,4 +304,4 @@ zen-devtools-toggle-performance-shortcut = Увімк. / Вимк. продук zen-devtools-toggle-storage-shortcut = Увімк. / Вимк. сховище zen-devtools-toggle-dom-shortcut = Увімк. / Вимк. DOM zen-devtools-toggle-accessibility-shortcut = Увімк. / Вимк. доступ -zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs +zen-close-all-unpinned-tabs-shortcut = Закрити всі відкріплені вкладки diff --git a/locales/uk/browser/browser/zen-workspaces.ftl b/locales/uk/browser/browser/zen-workspaces.ftl index 524f1a96a..f5101512b 100644 --- a/locales/uk/browser/browser/zen-workspaces.ftl +++ b/locales/uk/browser/browser/zen-workspaces.ftl @@ -59,7 +59,7 @@ zen-workspaces-delete-workspace-title = Видалити простір? zen-workspaces-delete-workspace-body = Упевнені, що хочете видалити { $name }? Цю дію неможливо скасувати. # Note that the html tag MUST not be changed or removed, as it is used to better # display the shortcut in the toast notification. -zen-workspaces-close-all-unpinned-tabs-toast = Tabs Closed! Use { $shortcut } to undo. +zen-workspaces-close-all-unpinned-tabs-toast = Вкладки закрито! Скористайтеся { $shortcut }, аби повернути їх. zen-workspaces-close-all-unpinned-tabs-title = - .label = Clear - .tooltiptext = Close all unpinned tabs + .label = Очистити + .tooltiptext = Закрити всі відкріплені вкладки From be561ec8dc4ef9fa2f88702a8decc77c44c3b207 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sun, 2 Nov 2025 01:35:46 +0100 Subject: [PATCH 03/41] chore: Several QA fixes and options added, b=closes #11105, closes https://github.com/zen-browser/desktop/issues/11020, closes https://github.com/zen-browser/desktop/issues/11105, https://github.com/zen-browser/desktop/issues/10752, c=common, compact-mode, workspaces --- prefs/zen/view.yaml | 3 + prefs/zen/zen-urlbar.yaml | 3 + .../base/content/browser-addons-js.patch | 8 +-- .../base/content/browser-places-js.patch | 10 +++- .../base/content/navigator-toolbox-js.patch | 20 +------ .../base/content/zen-panels/site-data.inc | 3 +- .../customizableui/content/panelUI-js.patch | 4 +- .../modules/ExtensionsUI-sys-mjs.patch | 4 +- src/browser/themes/shared/zen-icons/icons.css | 6 +- src/zen/common/ZenUIManager.mjs | 57 +++++++++++++++++-- src/zen/common/styles/zen-omnibox.css | 6 ++ src/zen/compact-mode/sidebar.inc.css | 3 +- src/zen/urlbar/ZenSiteDataPanel.sys.mjs | 13 ++++- src/zen/workspaces/ZenWorkspaces.mjs | 33 ++++++++--- surfer.json | 2 +- 15 files changed, 128 insertions(+), 47 deletions(-) diff --git a/prefs/zen/view.yaml b/prefs/zen/view.yaml index c5970430e..8235e67fe 100644 --- a/prefs/zen/view.yaml +++ b/prefs/zen/view.yaml @@ -57,3 +57,6 @@ - name: zen.view.shift-down-site-on-hover value: false + +- name: zen.view.show-clear-tabs-button + value: true diff --git a/prefs/zen/zen-urlbar.yaml b/prefs/zen/zen-urlbar.yaml index 97be59be9..4bd362402 100644 --- a/prefs/zen/zen-urlbar.yaml +++ b/prefs/zen/zen-urlbar.yaml @@ -26,6 +26,9 @@ - name: zen.urlbar.enable-overrides value: false +- name: zen.urlbar.single-toolbar-show-copy-url + value: true + # Mark: Zen suggestions controls - name: zen.urlbar.suggestions.quick-actions diff --git a/src/browser/base/content/browser-addons-js.patch b/src/browser/base/content/browser-addons-js.patch index 0264323c8..edd6cb122 100644 --- a/src/browser/base/content/browser-addons-js.patch +++ b/src/browser/base/content/browser-addons-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/browser-addons.js b/browser/base/content/browser-addons.js -index 754ce380ed233eb8764af07af3c8dc95d3f39d5c..29864ab59819271b7319b273c08bdc2736d40c93 100644 +index 754ce380ed233eb8764af07af3c8dc95d3f39d5c..ed3062bab0b80db3b456cdad03e7efcc31266b08 100644 --- a/browser/base/content/browser-addons.js +++ b/browser/base/content/browser-addons.js @@ -1071,7 +1071,7 @@ var gXPInstallObserver = { @@ -7,7 +7,7 @@ index 754ce380ed233eb8764af07af3c8dc95d3f39d5c..29864ab59819271b7319b273c08bdc27 hideClose: true, popupOptions: { - position: "bottomright topright", -+ position: gZenUIManager.panelUIPosition, ++ position: gZenUIManager.panelUIPosition(), }, }; @@ -16,7 +16,7 @@ index 754ce380ed233eb8764af07af3c8dc95d3f39d5c..29864ab59819271b7319b273c08bdc27 timeout: Date.now() + 30000, popupOptions: { - position: "bottomright topright", -+ position: gZenUIManager.panelUIPosition, ++ position: gZenUIManager.panelUIPosition(), }, }; @@ -65,7 +65,7 @@ index 754ce380ed233eb8764af07af3c8dc95d3f39d5c..29864ab59819271b7319b273c08bdc27 this.ensureButtonShownBeforeAttachingPanel(panel); PanelMultiView.openPopup(panel, this._button, { - position: "bottomright topright", -+ position: gZenUIManager.panelUIPosition, ++ position: gZenUIManager.panelUIPosition(panel, this._button), triggerEvent: aEvent, }); } diff --git a/src/browser/base/content/browser-places-js.patch b/src/browser/base/content/browser-places-js.patch index e302f2838..5425bd91e 100644 --- a/src/browser/base/content/browser-places-js.patch +++ b/src/browser/base/content/browser-places-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/browser-places.js b/browser/base/content/browser-places.js -index 79b4f6f8fb2f7dd8784920038784e6bb0c967e2d..1f3f4991b3ba7c00516e9708e89e8f95db25a36a 100644 +index 79b4f6f8fb2f7dd8784920038784e6bb0c967e2d..4db983dad9bea10c17b5ac166ba58b93fa2a4d56 100644 --- a/browser/base/content/browser-places.js +++ b/browser/base/content/browser-places.js @@ -252,6 +252,8 @@ var StarUI = { @@ -33,3 +33,11 @@ index 79b4f6f8fb2f7dd8784920038784e6bb0c967e2d..1f3f4991b3ba7c00516e9708e89e8f95 removeBookmarkButtonCommand: function SU_removeBookmarkButtonCommand() { this._removeBookmarksOnPopupHidden = true; this.panel.hidePopup(); +@@ -1800,6 +1817,7 @@ var BookmarkingUI = { + document.getElementById("context-bookmarkpage"), + PanelMultiView.getViewNode(document, "panelMenuBookmarkThisPage"), + document.getElementById("pageAction-panel-bookmark"), ++ document.getElementById("zen-site-data-icon-button"), + ]) { + if (!element) { + // The page action panel element may not have been created yet. diff --git a/src/browser/base/content/navigator-toolbox-js.patch b/src/browser/base/content/navigator-toolbox-js.patch index 167525ff8..829800da2 100644 --- a/src/browser/base/content/navigator-toolbox-js.patch +++ b/src/browser/base/content/navigator-toolbox-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/navigator-toolbox.js b/browser/base/content/navigator-toolbox.js -index 413bad2a62058a1c434d6a44e927e44eb397289d..472eab5d3bca2bc665920707a71105167cbe75ec 100644 +index 413bad2a62058a1c434d6a44e927e44eb397289d..d28116ffacb0ddb6fdb421db5d6498e455356b4a 100644 --- a/browser/base/content/navigator-toolbox.js +++ b/browser/base/content/navigator-toolbox.js @@ -8,7 +8,7 @@ @@ -11,24 +11,6 @@ index 413bad2a62058a1c434d6a44e927e44eb397289d..472eab5d3bca2bc665920707a7110516 const widgetOverflow = document.getElementById("widget-overflow"); function onPopupShowing(event) { -@@ -110,7 +110,7 @@ document.addEventListener( - #pageActionButton, - #downloads-button, - #fxa-toolbar-menu-button, -- #unified-extensions-button, -+ #zen-site-data-icon-button, - #library-button - `); - if (!element) { -@@ -138,7 +138,7 @@ document.addEventListener( - gSync.toggleAccountPanel(element, event); - break; - -- case "unified-extensions-button": -+ case "zen-site-data-icon-button": - gUnifiedExtensions.togglePanel(event); - break; - @@ -187,6 +187,7 @@ document.addEventListener( #reload-button , #urlbar-go-button, diff --git a/src/browser/base/content/zen-panels/site-data.inc b/src/browser/base/content/zen-panels/site-data.inc index bf310982b..b3b99dc06 100644 --- a/src/browser/base/content/zen-panels/site-data.inc +++ b/src/browser/base/content/zen-panels/site-data.inc @@ -5,8 +5,7 @@ + noautofocus="true"> # We'll keep the view with this name/id in order to prevent # any sort of future issues we may have if firefox decides diff --git a/src/browser/components/customizableui/content/panelUI-js.patch b/src/browser/components/customizableui/content/panelUI-js.patch index c20733de9..23ea8bef7 100644 --- a/src/browser/components/customizableui/content/panelUI-js.patch +++ b/src/browser/components/customizableui/content/panelUI-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/customizableui/content/panelUI.js b/browser/components/customizableui/content/panelUI.js -index 7156397d597579f745ea20ae2b9327433a31c8ec..13b844a63e79e227c96faf153ee5908759306407 100644 +index 7156397d597579f745ea20ae2b9327433a31c8ec..23c15c60acd77150ea89bd6f2fa1685a0cfc37fd 100644 --- a/browser/components/customizableui/content/panelUI.js +++ b/browser/components/customizableui/content/panelUI.js @@ -518,8 +518,7 @@ const PanelUI = { @@ -30,7 +30,7 @@ index 7156397d597579f745ea20ae2b9327433a31c8ec..13b844a63e79e227c96faf153ee59087 }); - this.notificationPanel.openPopup(anchor, "bottomright topright"); -+ this.notificationPanel.openPopup(anchor, gZenUIManager.panelUIPosition); ++ this.notificationPanel.openPopup(anchor, gZenUIManager.panelUIPosition(this.notificationPanel, anchor)); }, _clearNotificationPanel() { diff --git a/src/browser/modules/ExtensionsUI-sys-mjs.patch b/src/browser/modules/ExtensionsUI-sys-mjs.patch index 9cb95334a..0466fcc51 100644 --- a/src/browser/modules/ExtensionsUI-sys-mjs.patch +++ b/src/browser/modules/ExtensionsUI-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/modules/ExtensionsUI.sys.mjs b/browser/modules/ExtensionsUI.sys.mjs -index 17cad7b3fbdd6dff862483892f37f72c00792c88..72d87d70182abfbf664b1dc86f4b4a3ecb2b1d01 100644 +index 17cad7b3fbdd6dff862483892f37f72c00792c88..90ea4d95738eb50d1a4a67ee7df087e7c2a68b3d 100644 --- a/browser/modules/ExtensionsUI.sys.mjs +++ b/browser/modules/ExtensionsUI.sys.mjs @@ -478,7 +478,7 @@ export var ExtensionsUI = { @@ -7,7 +7,7 @@ index 17cad7b3fbdd6dff862483892f37f72c00792c88..72d87d70182abfbf664b1dc86f4b4a3e removeOnDismissal: true, popupOptions: { - position: "bottomright topright", -+ position: window.gZenUIManager.panelUIPosition, ++ position: window.gZenUIManager.panelUIPosition(), }, // Pass additional options used internally by the // addon-webext-permissions-notification custom element diff --git a/src/browser/themes/shared/zen-icons/icons.css b/src/browser/themes/shared/zen-icons/icons.css index 082e5b7c8..71416c647 100644 --- a/src/browser/themes/shared/zen-icons/icons.css +++ b/src/browser/themes/shared/zen-icons/icons.css @@ -399,6 +399,10 @@ &:not([can-close='true']) .toolbarbutton-icon { display: none; } + + @media -moz-pref('zen.view.show-clear-tabs-button', false) { + display: none; + } } .zen-workspace-actions-reorder-icon, @@ -513,7 +517,7 @@ -moz-context-properties: fill, fill-opacity; pointer-events: none; } - &[open] image { + &:is([open], [starred]) image { list-style-image: url('permissions-fill.svg'); } } diff --git a/src/zen/common/ZenUIManager.mjs b/src/zen/common/ZenUIManager.mjs index a95f7e60d..a65b9540f 100644 --- a/src/zen/common/ZenUIManager.mjs +++ b/src/zen/common/ZenUIManager.mjs @@ -610,10 +610,59 @@ var gZenUIManager = { this._toastTimeouts[messageId] = setTimeout(timeoutFunction, options.timeout || 2000); }, - get panelUIPosition() { - return gZenVerticalTabsManager._hasSetSingleToolbar && !gZenVerticalTabsManager._prefsRightSide - ? 'bottomleft topleft' - : 'bottomright topright'; + panelUIPosition(panel, anchor) { + void panel; + // The alignment position of the panel is determined during the "popuppositioned" event + // when the panel opens. The alignment positions help us determine in which orientation + // the panel is anchored to the screen space. + // + // * "after_start": The panel is anchored at the top-left corner in LTR locales, top-right in RTL locales. + // * "after_end": The panel is anchored at the top-right corner in LTR locales, top-left in RTL locales. + // * "before_start": The panel is anchored at the bottom-left corner in LTR locales, bottom-right in RTL locales. + // * "before_end": The panel is anchored at the bottom-right corner in LTR locales, bottom-left in RTL locales. + // + // ┌─Anchor(LTR) ┌─Anchor(RTL) + // │ Anchor(RTL)─┐ │ Anchor(LTR)─┐ + // │ │ │ │ + // x───────────────────x x───────────────────x + // │ │ │ │ + // │ Panel │ │ Panel │ + // │ "after_start" │ │ "after_end" │ + // │ │ │ │ + // └───────────────────┘ └───────────────────┘ + // + // ┌───────────────────┐ ┌───────────────────┐ + // │ │ │ │ + // │ Panel │ │ Panel │ + // │ "before_start" │ │ "before_end" │ + // │ │ │ │ + // x───────────────────x x───────────────────x + // │ │ │ │ + // │ Anchor(RTL)─┘ │ Anchor(LTR)─┘ + // └─Anchor(LTR) └─Anchor(RTL) + // + // The default choice for the panel is "after_start", to match the content context menu's alignment. However, it is + // possible to end up with any of the four combinations. Before the panel is opened, the XUL popup manager needs to + // make a determination about the size of the panel and whether or not it will fit within the visible screen area with + // the intended alignment. The manager may change the panel's alignment before opening to ensure the panel is fully visible. + // + // For example, if the panel is opened such that the bottom edge would be rendered off screen, then the XUL popup manager + // will change the alignment from "after_start" to "before_start", anchoring the panel's bottom corner to the target screen + // location instead of its top corner. This transformation ensures that the whole of the panel is visible on the screen. + // + // When the panel is anchored by one of its bottom corners (the "before_..." options), then it causes unintentionally odd + // behavior where dragging the text-area resizer downward with the mouse actually grows the panel's top edge upward, since + // the bottom of the panel is anchored in place. We want to disable the resizer if the panel was positioned to be anchored + // from one of its bottom corners. + let block = 'before'; + let inline = 'end'; + if (anchor?.closest('#zen-sidebar-top-buttons')) { + block = 'after'; + } + if (gZenVerticalTabsManager._hasSetSingleToolbar && !gZenVerticalTabsManager._prefsRightSide) { + inline = 'start'; + } + return `${block}_${inline}`; }, urlStringsDomainMatch(url1, url2) { diff --git a/src/zen/common/styles/zen-omnibox.css b/src/zen/common/styles/zen-omnibox.css index 7d07cc6dc..a150a3aab 100644 --- a/src/zen/common/styles/zen-omnibox.css +++ b/src/zen/common/styles/zen-omnibox.css @@ -189,6 +189,12 @@ } } +@media -moz-pref('zen.urlbar.single-toolbar-show-copy-url', false) { + :root[zen-single-toolbar='true'] #zen-copy-url-button { + display: none !important; + } +} + .urlbar-page-action, #tracking-protection-icon-container { padding: 0 !important; diff --git a/src/zen/compact-mode/sidebar.inc.css b/src/zen/compact-mode/sidebar.inc.css index 62a906ce9..40fecdf51 100644 --- a/src/zen/compact-mode/sidebar.inc.css +++ b/src/zen/compact-mode/sidebar.inc.css @@ -42,6 +42,7 @@ :root[zen-no-padding='true'] & { --zen-compact-float: 10px; + --zen-compact-top-toolbar-hidden-fix: var(--zen-compact-float); --zen-compact-mode-no-padding-radius-fix: 2px; } @@ -68,7 +69,7 @@ bottom: calc(var(--zen-compact-float) / 2); height: calc(100% - var(--zen-toolbar-height-with-bookmarks)); @media -moz-pref('zen.view.compact.hide-toolbar') { - height: 100%; + height: calc(100% - var(--zen-compact-top-toolbar-hidden-fix, 0px)); } } & #zen-sidebar-top-buttons { diff --git a/src/zen/urlbar/ZenSiteDataPanel.sys.mjs b/src/zen/urlbar/ZenSiteDataPanel.sys.mjs index ad3382a11..48b94bace 100644 --- a/src/zen/urlbar/ZenSiteDataPanel.sys.mjs +++ b/src/zen/urlbar/ZenSiteDataPanel.sys.mjs @@ -52,6 +52,7 @@ export class nsZenSiteDataPanel { this.panel.addEventListener('popupshowing', this); this.document.getElementById('zen-site-data-manage-addons').addEventListener('click', this); this.document.getElementById('zen-site-data-settings-more').addEventListener('click', this); + this.anchor.addEventListener('click', this); const kCommandIDs = [ 'zen-site-data-header-share', 'zen-site-data-header-bookmark', @@ -139,6 +140,12 @@ export class nsZenSiteDataPanel { } } + get #currentPageIsBookmarked() { + // A hacky way to check if the current page is bookmarked, but + // it works for our purposes. + return this.window.BookmarkingUI.star?.hasAttribute('starred'); + } + #setSiteHeader() { { const button = this.document.getElementById('zen-site-data-header-reader-mode'); @@ -156,7 +163,7 @@ export class nsZenSiteDataPanel { } { const button = this.document.getElementById('zen-site-data-header-bookmark'); - const isPageBookmarked = this.window.BookmarkingUI.star?.hasAttribute('starred'); + const isPageBookmarked = this.#currentPageIsBookmarked; if (isPageBookmarked) { button.classList.add('active'); @@ -548,6 +555,10 @@ export class nsZenSiteDataPanel { BrowserCommands.pageInfo(null, 'permTab'); break; } + case 'zen-site-data-icon-button': { + this.window.gUnifiedExtensions.togglePanel(event); + break; + } default: { const item = event.target.closest('.permission-popup-permission-item'); if (!item) { diff --git a/src/zen/workspaces/ZenWorkspaces.mjs b/src/zen/workspaces/ZenWorkspaces.mjs index a54c1ebfe..8bce5d7e7 100644 --- a/src/zen/workspaces/ZenWorkspaces.mjs +++ b/src/zen/workspaces/ZenWorkspaces.mjs @@ -2502,7 +2502,7 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { } // Only animate if it's from an event let animateContainer = target && target.target instanceof EventTarget; - if (target?.type === 'TabClose' || target?.type === 'TabOpened') { + if (target?.type === 'TabClose' || target?.type === 'TabOpen') { animateContainer = target.target.pinned; } await this.onPinnedTabsResize( @@ -2514,14 +2514,29 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { ); } - updateShouldHideSeparator(arrowScrollbox, pinnedContainer) { + updateShouldHideSeparator(arrowScrollbox, pinnedContainer, fromTabSelection = false) { + const visibleTabsFound = () => { + let count = 0; + for (const child of arrowScrollbox.children) { + if ( + !child.hasAttribute('hidden') && + !child.closing && + !child.hasAttribute('zen-empty-tab') + ) { + count++; + if (count > 1) { + // Early return + return true; + } + } + } + return false; + }; + // <= 2 because we have the empty tab and the new tab button - const shouldHideSeparator = - pinnedContainer.children.length === 1 || - Array.from(arrowScrollbox.children).filter( - (child) => - !child.hasAttribute('hidden') && !child.closing && !child.hasAttribute('zen-empty-tab') - ).length <= 1; + const shouldHideSeparator = fromTabSelection + ? pinnedContainer.hasAttribute('hide-separator') + : pinnedContainer.children.length === 1 || !visibleTabsFound(); if (shouldHideSeparator) { pinnedContainer.setAttribute('hide-separator', 'true'); } else { @@ -2656,7 +2671,7 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { } const workspaceID = tab.getAttribute('zen-workspace-id'); const isEssential = tab.getAttribute('zen-essential') === 'true'; - + this.updateShouldHideSeparator(this.activeWorkspaceStrip, this.pinnedTabsContainer, true); if (tab.hasAttribute('zen-empty-tab')) { return; } diff --git a/surfer.json b/surfer.json index 282528c9d..e88c81e65 100644 --- a/surfer.json +++ b/surfer.json @@ -19,7 +19,7 @@ "brandShortName": "Zen", "brandFullName": "Zen Browser", "release": { - "displayVersion": "1.17.4b", + "displayVersion": "1.17.5b", "github": { "repo": "zen-browser/desktop" }, From 42752f814546926c7e2e3f6b34ff26b11843aef8 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Mon, 3 Nov 2025 22:49:14 +0100 Subject: [PATCH 04/41] fix: Fixed pip button not appearing on the media manager, b=closes https://github.com/zen-browser/desktop/issues/11132, c=urlbar --- prefs/firefox/urlbar.yaml | 3 ++- prefs/zen/zen-urlbar.yaml | 3 +++ src/zen/common/styles/zen-omnibox.css | 6 ++++++ src/zen/common/styles/zen-single-components.css | 2 +- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/prefs/firefox/urlbar.yaml b/prefs/firefox/urlbar.yaml index cdb951402..76eb974a6 100644 --- a/prefs/firefox/urlbar.yaml +++ b/prefs/firefox/urlbar.yaml @@ -23,7 +23,8 @@ value: true - name: media.videocontrols.picture-in-picture.urlbar-button.enabled - value: false + value: true + locked: true # Enable private suggestions - name: browser.search.suggest.enabled diff --git a/prefs/zen/zen-urlbar.yaml b/prefs/zen/zen-urlbar.yaml index 97be59be9..ba97595fe 100644 --- a/prefs/zen/zen-urlbar.yaml +++ b/prefs/zen/zen-urlbar.yaml @@ -26,6 +26,9 @@ - name: zen.urlbar.enable-overrides value: false +- name: zen.urlbar.show-pip-button + value: true + # Mark: Zen suggestions controls - name: zen.urlbar.suggestions.quick-actions diff --git a/src/zen/common/styles/zen-omnibox.css b/src/zen/common/styles/zen-omnibox.css index 98b157154..782afbeac 100644 --- a/src/zen/common/styles/zen-omnibox.css +++ b/src/zen/common/styles/zen-omnibox.css @@ -189,6 +189,12 @@ } } +@media not -moz-pref('zen.urlbar.show-pip-button') { + #picture-in-picture-button { + display: none !important; + } +} + .urlbar-page-action, #tracking-protection-icon-container { padding: 0 !important; diff --git a/src/zen/common/styles/zen-single-components.css b/src/zen/common/styles/zen-single-components.css index 4c5473872..077cb2b72 100644 --- a/src/zen/common/styles/zen-single-components.css +++ b/src/zen/common/styles/zen-single-components.css @@ -500,7 +500,7 @@ body > #confetti { #zen-site-data-header { gap: 8px; align-items: center; - padding: 8px; + padding: 10px 9px; padding-bottom: 0; :root[zen-single-toolbar='true']:not([zen-right-side='true']) & { From 424de1bf913a68e547a8a3676bdbb041f7189ff8 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Mon, 3 Nov 2025 22:49:46 +0100 Subject: [PATCH 05/41] fix: Fixed glance close animation replay, b=closes #11130, c=glance --- .../components/tabbrowser/AsyncTabSwitcher-sys-mjs.patch | 4 ++-- src/zen/glance/ZenGlanceManager.mjs | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/browser/components/tabbrowser/AsyncTabSwitcher-sys-mjs.patch b/src/browser/components/tabbrowser/AsyncTabSwitcher-sys-mjs.patch index 85d1fbde2..99f83d192 100644 --- a/src/browser/components/tabbrowser/AsyncTabSwitcher-sys-mjs.patch +++ b/src/browser/components/tabbrowser/AsyncTabSwitcher-sys-mjs.patch @@ -1,12 +1,12 @@ diff --git a/browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs b/browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs -index 773f595e89e268578ba153907babec95b58a155a..abe86fc3d243a85c4a8dbee854a2d0130f7270fd 100644 +index 773f595e89e268578ba153907babec95b58a155a..7cb99cde00c19f50fd9aa48ab1efcfaeaef89771 100644 --- a/browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs +++ b/browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs @@ -937,6 +937,7 @@ export class AsyncTabSwitcher { return !( this.tabbrowser._printPreviewBrowsers.has(browser) || lazy.PictureInPicture.isOriginatingBrowser(browser) -+ || browser?.hasAttribute('zen-glance-background') ++ || browser?.parentNode?.parentNode?.parentNode?.classList?.contains("zen-glance-background") ); } diff --git a/src/zen/glance/ZenGlanceManager.mjs b/src/zen/glance/ZenGlanceManager.mjs index 3720448fa..5a9fcbaca 100644 --- a/src/zen/glance/ZenGlanceManager.mjs +++ b/src/zen/glance/ZenGlanceManager.mjs @@ -844,6 +844,10 @@ * @returns {Promise} Promise that resolves when closing is complete */ #animateGlanceClosing(onTabClose, browserSidebarContainer, sidebarButtons, setNewID) { + if (this.closingGlance) { + return; + } + this.closingGlance = true; this._animating = true; @@ -1008,6 +1012,7 @@ this.browserWrapper.removeAttribute('animate'); if (!this.#currentParentTab) { + this.closingGlance = false; return; } @@ -1063,7 +1068,6 @@ this.contentWrapper = null; lastCurrentTab.removeAttribute('zen-glance-tab'); - lastCurrentTab._closingGlance = true; this.#ignoreClose = true; lastCurrentTab.dispatchEvent(new Event('GlanceClose', { bubbles: true })); From 40af25998ff8b2d3ee9d139117b94bc808289060 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Tue, 4 Nov 2025 21:35:02 +0100 Subject: [PATCH 06/41] chore: Handle use implicit event function calls for glance, b=no-bug, c=common, glance --- src/zen/common/ZenActorsManager.sys.mjs | 3 ++ src/zen/glance/actors/ZenGlanceChild.sys.mjs | 30 +++++++------------- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/zen/common/ZenActorsManager.sys.mjs b/src/zen/common/ZenActorsManager.sys.mjs index 817cfef79..bfaf184af 100644 --- a/src/zen/common/ZenActorsManager.sys.mjs +++ b/src/zen/common/ZenActorsManager.sys.mjs @@ -42,6 +42,9 @@ let JSWINDOWACTORS = { esModuleURI: 'resource:///actors/ZenGlanceChild.sys.mjs', events: { DOMContentLoaded: {}, + click: { + capture: true, + }, keydown: { capture: true, }, diff --git a/src/zen/glance/actors/ZenGlanceChild.sys.mjs b/src/zen/glance/actors/ZenGlanceChild.sys.mjs index 51cd6cb17..8ebf72eaa 100644 --- a/src/zen/glance/actors/ZenGlanceChild.sys.mjs +++ b/src/zen/glance/actors/ZenGlanceChild.sys.mjs @@ -6,18 +6,12 @@ export class ZenGlanceChild extends JSWindowActorChild { constructor() { super(); - this.clickListener = this.handleClick.bind(this); } async handleEvent(event) { - switch (event.type) { - case 'DOMContentLoaded': - await this.initiateGlance(); - break; - case 'keydown': - this.onKeyDown(event); - break; - default: + const handler = this[`on_${event.type}`]; + if (typeof handler === 'function') { + await handler.call(this, event); } } @@ -25,13 +19,7 @@ export class ZenGlanceChild extends JSWindowActorChild { this.#activationMethod = await this.sendQuery('ZenGlance:GetActivationMethod'); } - async initiateGlance() { - this.mouseIsDown = false; - await this.#initActivationMethod(); - this.contentWindow.document.addEventListener('click', this.clickListener, { capture: true }); - } - - ensureOnlyKeyModifiers(event) { + #ensureOnlyKeyModifiers(event) { return !(event.ctrlKey ^ event.altKey ^ event.shiftKey ^ event.metaKey); } @@ -66,7 +54,7 @@ export class ZenGlanceChild extends JSWindowActorChild { }); } - handleClick(event) { + on_click(event) { if (event.button !== 0 || event.defaultPrevented) { return; } @@ -79,7 +67,7 @@ export class ZenGlanceChild extends JSWindowActorChild { // The problem is that at that stage we don't know the rect or even what // element has been clicked, so we send the data here. this.#sendClickDataToParent(target, elementToRecord); - if (this.ensureOnlyKeyModifiers(event)) { + if (this.#ensureOnlyKeyModifiers(event)) { return; } const activationMethod = this.#activationMethod; @@ -100,7 +88,7 @@ export class ZenGlanceChild extends JSWindowActorChild { } } - onKeyDown(event) { + on_keydown(event) { if (event.defaultPrevented || event.key !== 'Escape') { return; } @@ -108,4 +96,8 @@ export class ZenGlanceChild extends JSWindowActorChild { hasFocused: this.contentWindow.document.activeElement !== this.contentWindow.document.body, }); } + + async on_DOMContentLoaded() { + await this.#initActivationMethod(); + } } From 87e249f2a49f37233d911b2e9b5bfcf086852bf3 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Tue, 4 Nov 2025 23:38:35 +0100 Subject: [PATCH 07/41] feat: Disable omnibox PiP button by default, b=no-bug, c=no-component --- prefs/zen/zen-urlbar.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prefs/zen/zen-urlbar.yaml b/prefs/zen/zen-urlbar.yaml index bcc6ba7c7..748c77d27 100644 --- a/prefs/zen/zen-urlbar.yaml +++ b/prefs/zen/zen-urlbar.yaml @@ -30,7 +30,7 @@ value: true - name: zen.urlbar.show-pip-button - value: true + value: false # Mark: Zen suggestions controls From 37eb6f85ebc81d079c7569a57ecec03398e2905f Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Wed, 5 Nov 2025 00:08:18 +0100 Subject: [PATCH 08/41] chore: Fixed using the wrong location for wine, b=no-bug, c=configs --- configs/windows/mozconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configs/windows/mozconfig b/configs/windows/mozconfig index 408d8884e..66a65ff7e 100644 --- a/configs/windows/mozconfig +++ b/configs/windows/mozconfig @@ -6,7 +6,7 @@ if test "$ZEN_CROSS_COMPILING"; then export WINSYSROOT="$(echo ~)/win-cross/vs2022" - export WINE="$(echo ~)/win-cross/wine/bin/wine64" + export WINE="$(echo ~)/win-cross/wine/bin/wine" export WINEDEBUG=-all export MOZ_STUB_INSTALLER=1 From 3a9e20573035d161f18ce9a2c25fe57a26e08e9a Mon Sep 17 00:00:00 2001 From: Ivaon <155267770+Ivaon@users.noreply.github.com> Date: Wed, 5 Nov 2025 12:59:52 +0100 Subject: [PATCH 09/41] fix: New container tab popup menu displayed incorrectly (#11160) --- src/zen/common/styles/zen-single-components.css | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/zen/common/styles/zen-single-components.css b/src/zen/common/styles/zen-single-components.css index 077cb2b72..4ab836e02 100644 --- a/src/zen/common/styles/zen-single-components.css +++ b/src/zen/common/styles/zen-single-components.css @@ -609,3 +609,13 @@ body > #confetti { #widget-overflow-list { flex-direction: column-reverse; } + +/* Contextual new tab popup menu */ +#tabs-newtab-button > .new-tab-popup > menuitem { + & > :is(.menu-highlightable-text, .menu-accel) { + display: none !important; + } + & > label { + opacity: 1 !important; + } +} From 5ca4553e70ae77b3c125b5fab22963ba29412992 Mon Sep 17 00:00:00 2001 From: Ivaon <155267770+Ivaon@users.noreply.github.com> Date: Wed, 5 Nov 2025 23:36:48 +0100 Subject: [PATCH 10/41] fix: targeting new container tab context menu with a higher specificity and removing opacity rule, p=#11166 --- src/zen/common/styles/zen-single-components.css | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/zen/common/styles/zen-single-components.css b/src/zen/common/styles/zen-single-components.css index 4ab836e02..8c7fa89cd 100644 --- a/src/zen/common/styles/zen-single-components.css +++ b/src/zen/common/styles/zen-single-components.css @@ -611,11 +611,8 @@ body > #confetti { } /* Contextual new tab popup menu */ -#tabs-newtab-button > .new-tab-popup > menuitem { +#navigator-toolbox #titlebar #TabsToolbar #tabs-newtab-button > .new-tab-popup > menuitem { & > :is(.menu-highlightable-text, .menu-accel) { - display: none !important; - } - & > label { - opacity: 1 !important; + display: none; } } From 11e339742150dcc87570841ebfeafbad6a530c20 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Thu, 6 Nov 2025 23:02:07 +0100 Subject: [PATCH 11/41] fix: Fixed addons menu being off-screen, b=closes #11177, c=common --- src/browser/base/content/zen-panels/site-data.inc | 5 +++-- src/zen/common/ZenUIManager.mjs | 11 ++++++----- surfer.json | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/browser/base/content/zen-panels/site-data.inc b/src/browser/base/content/zen-panels/site-data.inc index b3b99dc06..e413d2c1e 100644 --- a/src/browser/base/content/zen-panels/site-data.inc +++ b/src/browser/base/content/zen-panels/site-data.inc @@ -5,10 +5,11 @@ + noautofocus="true" + position="bottomright topright"> # We'll keep the view with this name/id in order to prevent -# any sort of future issues we may have if firefox decides +# any sort of future issues we may have if firefox decides # to change the functionality of this view Date: Thu, 6 Nov 2025 23:07:06 +0100 Subject: [PATCH 12/41] chore: Increase the speed for glance background animation, b=no-bug, c=glance --- src/zen/glance/ZenGlanceManager.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zen/glance/ZenGlanceManager.mjs b/src/zen/glance/ZenGlanceManager.mjs index 70c7da14e..a35d4e021 100644 --- a/src/zen/glance/ZenGlanceManager.mjs +++ b/src/zen/glance/ZenGlanceManager.mjs @@ -926,7 +926,7 @@ opacity: [0.4, 1], }, { - duration: this.#GLANCE_ANIMATION_DURATION, + duration: this.#GLANCE_ANIMATION_DURATION / 2, type: 'spring', bounce: 0, } From a0f282a7598c2d5649646263675ee045461283bd Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Fri, 7 Nov 2025 10:35:15 +0100 Subject: [PATCH 13/41] feat: Increase the duration for glance close animation, p=#11184, c=glance --- src/zen/glance/ZenGlanceManager.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zen/glance/ZenGlanceManager.mjs b/src/zen/glance/ZenGlanceManager.mjs index a35d4e021..52e452175 100644 --- a/src/zen/glance/ZenGlanceManager.mjs +++ b/src/zen/glance/ZenGlanceManager.mjs @@ -926,7 +926,7 @@ opacity: [0.4, 1], }, { - duration: this.#GLANCE_ANIMATION_DURATION / 2, + duration: this.#GLANCE_ANIMATION_DURATION / 1.5, type: 'spring', bounce: 0, } From 96c6ec658cff4ec8b69192375ce8fbfc68737a29 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Sat, 8 Nov 2025 11:40:06 +0100 Subject: [PATCH 14/41] chore: Update to Firefox `145.0`, p=#11167 --- README.md | 2 +- build/firefox-cache/l10n-last-commit-hash | 2 +- src/.hgignore | 3 + src/Cargo-lock.patch | 4 +- src/Cargo-toml.patch | 4 +- src/browser/actors/WebRTCParent-sys-mjs.patch | 2 +- .../base/content/browser-addons-js.patch | 33 +- .../base/content/browser-commands-js.patch | 8 +- .../browser-fullScreenAndPointerLock-js.patch | 4 +- src/browser/base/content/browser-js.patch | 12 +- .../base/content/browser-places-js.patch | 8 +- .../content/browser-siteIdentity-js.patch | 8 +- src/browser/base/content/browser-xhtml.patch | 2 +- .../content/main-popupset-inc-xhtml.patch | 4 +- .../base/content/navigator-toolbox-js.patch | 12 +- .../base/content/nsContextMenu-sys-mjs.patch | 4 +- .../base/content/zen-panels/site-data.inc | 11 + .../components/BrowserGlue-sys-mjs.patch | 6 +- .../modules/FeatureCallout-sys-mjs.patch | 4 +- .../ToolbarContextMenu-sys-mjs.patch | 16 +- .../content/panelUI-inc-xhtml.patch | 4 +- .../customizableui/content/panelUI-js.patch | 16 +- .../extensions/parent/ext-browser-js.patch | 4 +- .../content/browserPlacesViews-js.patch | 16 +- .../components/preferences/jar-mn.patch | 11 +- .../preferences/main-inc-xhtml.patch | 18 +- .../components/preferences/main-js.patch | 16 +- .../preferences/preferences-js.patch | 8 +- .../preferences/preferences-xhtml.patch | 10 +- .../preferences/sync-inc-xhtml.patch | 2 +- .../components/preferences/zen-settings.js | 5 + .../search/SearchUIUtils-sys-mjs.patch | 4 +- .../sessionstore/SessionStore-sys-mjs.patch | 36 +- .../sidebar/browser-sidebar-js.patch | 4 +- .../tabbrowser/AsyncTabSwitcher-sys-mjs.patch | 6 +- .../tabbrowser/TabsList-sys-mjs.patch | 2 +- .../content/browser-ctrlTab-js.patch | 10 +- .../tabbrowser/content/drag-and-drop-js.patch | 439 +++++++++++++++ .../tabbrowser/content/tab-js.patch | 20 +- .../tabbrowser/content/tabbrowser-js.patch | 138 ++--- .../tabbrowser/content/tabgroup-js.patch | 20 +- .../tabbrowser/content/tabs-js.patch | 505 +----------------- .../urlbar/UrlbarController-sys-mjs.patch | 6 +- .../urlbar/UrlbarInput-sys-mjs.patch | 54 +- .../urlbar/UrlbarMuxerStandard-sys-mjs.patch | 6 +- .../urlbar/UrlbarPrefs-sys-mjs.patch | 2 +- .../urlbar/UrlbarProviderPlaces-sys-mjs.patch | 4 +- .../UrlbarProvidersManager-sys-mjs.patch | 4 +- .../urlbar/UrlbarUtils-sys-mjs.patch | 8 +- .../urlbar/UrlbarValueFormatter-sys-mjs.patch | 2 +- .../urlbar/UrlbarView-sys-mjs.patch | 6 +- .../newtab/lib/ActivityStream-sys-mjs.patch | 4 +- .../installer/package-manifest-in.patch | 4 +- .../windows/nsis/defines-nsi-in.patch | 4 +- .../windows/nsis/installer-nsi.patch | 6 +- .../windows/nsis/uninstaller-nsi.patch | 4 +- .../modules/BrowserDOMWindow-sys-mjs.patch | 12 +- .../modules/ExtensionsUI-sys-mjs.patch | 4 +- .../modules/URILoadingHelper-sys-mjs.patch | 2 +- src/browser/themes/osx/browser-css.patch | 2 +- .../themes/shared/browser-shared-css.patch | 12 +- .../identity-block/identity-block-css.patch | 4 +- src/browser/themes/shared/jar-inc-mn.patch | 4 +- .../shared/tabbrowser/content-area-css.patch | 6 +- .../shared/tabbrowser/ctrlTab-css.patch | 2 +- .../themes/shared/tabbrowser/tabs-css.patch | 32 +- .../themes/shared/urlbar-searchbar-css.patch | 4 +- .../themes/shared/urlbarView-css.patch | 6 +- .../actors/animation-type-longhand-js.patch | 4 +- .../startup/DevToolsStartup-sys-mjs.patch | 2 +- src/docshell/base/nsAboutRedirector-cpp.patch | 4 +- src/dom/base/Document-cpp.patch | 6 +- src/dom/base/use_counter_metrics-yaml.patch | 6 +- .../mediaelement/HTMLMediaElement-cpp.patch | 4 +- .../ff-145-tahoe-upgrade.patch | 336 ------------ src/layout/generic/nsIFrame-cpp.patch | 4 +- src/layout/style/nsStyleStruct-cpp.patch | 6 +- src/layout/style/nsStyleStruct-h.patch | 4 +- .../libpref/init/StaticPrefList-yaml.patch | 4 +- src/netwerk/protocol/http/moz-build.patch | 4 +- .../style/gecko/media_features-rs.patch | 2 +- src/testing/mochitest/browser-test-js.patch | 57 +- .../PictureInPictureChild-sys-mjs.patch | 4 +- src/toolkit/content/widgets/findbar-js.patch | 2 +- src/toolkit/content/widgets/tabbox-js.patch | 10 +- src/toolkit/content/xul-css.patch | 8 +- .../modules/ShortcutUtils-sys-mjs.patch | 12 +- src/toolkit/modules/moz-build.patch | 2 +- src/toolkit/moz-configure.patch | 2 +- .../extensions/AddonManager-sys-mjs.patch | 4 +- .../themes/shared/aboutReader-css.patch | 2 +- .../shared/in-content/common-shared-css.patch | 2 +- src/toolkit/themes/shared/menulist-css.patch | 4 +- .../shared/pictureinpicture/player-css.patch | 2 +- src/toolkit/themes/shared/popup-css.patch | 2 +- src/toolkit/themes/shared/tree/tree-css.patch | 2 +- .../signing/macos/mach_commands-py.patch | 4 +- src/widget/cocoa/nsCocoaWindow-mm.patch | 13 - src/zen/@types/lib.gecko.dom.d.ts | 59 +- src/zen/@types/lib.gecko.glean.d.ts | 232 +++++--- src/zen/@types/lib.gecko.linux.d.ts | 2 - src/zen/@types/lib.gecko.modules.d.ts | 402 ++++++++++++-- src/zen/@types/lib.gecko.services.d.ts | 1 - src/zen/@types/lib.gecko.xpcom.d.ts | 305 +++++------ .../common/styles/zen-browser-container.css | 48 +- src/zen/common/styles/zen-omnibox.css | 8 +- .../common/styles/zen-single-components.css | 5 + src/zen/split-view/ZenViewSplitter.mjs | 2 +- src/zen/tabs/ZenPinnedTabManager.mjs | 4 + src/zen/urlbar/ZenUBActionsProvider.sys.mjs | 23 +- src/zen/urlbar/ZenUBProvider.sys.mjs | 2 +- surfer.json | 4 +- 112 files changed, 1635 insertions(+), 1627 deletions(-) create mode 100644 src/.hgignore create mode 100644 src/browser/components/tabbrowser/content/drag-and-drop-js.patch delete mode 100644 src/firefox-patches/ff-145-tahoe-upgrade.patch delete mode 100644 src/widget/cocoa/nsCocoaWindow-mm.patch diff --git a/README.md b/README.md index aa71c3917..670da32b8 100644 --- a/README.md +++ b/README.md @@ -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 `144.0.2`! 🚀 -- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 144.0.2`! +- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 145.0`! ### Contributing diff --git a/build/firefox-cache/l10n-last-commit-hash b/build/firefox-cache/l10n-last-commit-hash index 26d328f6d..f451058a7 100644 --- a/build/firefox-cache/l10n-last-commit-hash +++ b/build/firefox-cache/l10n-last-commit-hash @@ -1 +1 @@ -860c37a26622f61c74c7cbb93f7e0ae759fcbfe1 \ No newline at end of file +7bc0bd3b3f84dddd16bc84ddb01bc55782177f5e \ No newline at end of file diff --git a/src/.hgignore b/src/.hgignore new file mode 100644 index 000000000..6fbe8159b --- /dev/null +++ b/src/.hgignore @@ -0,0 +1,3 @@ +# 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/. diff --git a/src/Cargo-lock.patch b/src/Cargo-lock.patch index 0f9223905..9d6b283dd 100644 --- a/src/Cargo-lock.patch +++ b/src/Cargo-lock.patch @@ -1,8 +1,8 @@ diff --git a/Cargo.lock b/Cargo.lock -index c079ef11880c5338c4498a0e5b3eb4cf4bfb6e02..ecd06b05381be740197c07c8cf0743dc882727f5 100644 +index 4386724a82baa72678b7228ef3af9fabc2da318e..01f7ac42ff96f8f96984537f19bde4bbc8cd8d72 100644 --- a/Cargo.lock +++ b/Cargo.lock -@@ -4069,8 +4069,6 @@ dependencies = [ +@@ -4167,8 +4167,6 @@ dependencies = [ [[package]] name = "mime_guess" version = "2.0.4" diff --git a/src/Cargo-toml.patch b/src/Cargo-toml.patch index 563622667..81b7afcbe 100644 --- a/src/Cargo-toml.patch +++ b/src/Cargo-toml.patch @@ -1,8 +1,8 @@ diff --git a/Cargo.toml b/Cargo.toml -index 2331ff5733d39e26c0a16301cb83d46ca970f632..777dbd5fb8546466e4a349772ccba254c7ffd691 100644 +index 772a74e7439d87e9c5486abcf003617240190710..522b5459b30b943832369ff7a73755ad4c7d8140 100644 --- a/Cargo.toml +++ b/Cargo.toml -@@ -224,6 +224,8 @@ moz_asserts = { path = "mozglue/static/rust/moz_asserts" } +@@ -227,6 +227,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" } diff --git a/src/browser/actors/WebRTCParent-sys-mjs.patch b/src/browser/actors/WebRTCParent-sys-mjs.patch index cee359785..7a99c8301 100644 --- a/src/browser/actors/WebRTCParent-sys-mjs.patch +++ b/src/browser/actors/WebRTCParent-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/actors/WebRTCParent.sys.mjs b/browser/actors/WebRTCParent.sys.mjs -index 80fd2177c7112c958ff51bbf7a18ebea39e50fbf..24f62810901dc558e25ee874bd49736bd64fd358 100644 +index 4ff6ae4d6f272936f0aa1c80a488df16159b42f2..85e4d7bf500603fcd5724658e96c7fd0a04432d3 100644 --- a/browser/actors/WebRTCParent.sys.mjs +++ b/browser/actors/WebRTCParent.sys.mjs @@ -152,6 +152,7 @@ export class WebRTCParent extends JSWindowActorParent { diff --git a/src/browser/base/content/browser-addons-js.patch b/src/browser/base/content/browser-addons-js.patch index edd6cb122..acb98ccc7 100644 --- a/src/browser/base/content/browser-addons-js.patch +++ b/src/browser/base/content/browser-addons-js.patch @@ -1,8 +1,8 @@ diff --git a/browser/base/content/browser-addons.js b/browser/base/content/browser-addons.js -index 754ce380ed233eb8764af07af3c8dc95d3f39d5c..ed3062bab0b80db3b456cdad03e7efcc31266b08 100644 +index f33a300eb0eed74e286da24919ad3e8505f632c3..9f400e887424693d0ecceb9db79fccf2bd5a757d 100644 --- a/browser/base/content/browser-addons.js +++ b/browser/base/content/browser-addons.js -@@ -1071,7 +1071,7 @@ var gXPInstallObserver = { +@@ -1069,7 +1069,7 @@ var gXPInstallObserver = { persistent: true, hideClose: true, popupOptions: { @@ -11,7 +11,7 @@ index 754ce380ed233eb8764af07af3c8dc95d3f39d5c..ed3062bab0b80db3b456cdad03e7efcc }, }; -@@ -1280,7 +1280,7 @@ var gXPInstallObserver = { +@@ -1279,7 +1279,7 @@ var gXPInstallObserver = { hideClose: true, timeout: Date.now() + 30000, popupOptions: { @@ -20,7 +20,7 @@ index 754ce380ed233eb8764af07af3c8dc95d3f39d5c..ed3062bab0b80db3b456cdad03e7efcc }, }; -@@ -2212,7 +2212,7 @@ var gUnifiedExtensions = { +@@ -2211,7 +2211,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 754ce380ed233eb8764af07af3c8dc95d3f39d5c..ed3062bab0b80db3b456cdad03e7efcc const attr = anchorID + "popupnotificationanchor"; if (!aBrowser[attr]) { -@@ -2223,7 +2223,7 @@ var gUnifiedExtensions = { +@@ -2222,7 +2222,7 @@ var gUnifiedExtensions = { anchorID // Anchor on the toolbar icon to position the popup right below the // button. @@ -38,7 +38,7 @@ index 754ce380ed233eb8764af07af3c8dc95d3f39d5c..ed3062bab0b80db3b456cdad03e7efcc } return anchorID; -@@ -2516,11 +2516,7 @@ var gUnifiedExtensions = { +@@ -2646,11 +2646,7 @@ var gUnifiedExtensions = { // Lazy load the unified-extensions-panel panel the first time we need to // display it. if (!this._panel) { @@ -51,16 +51,15 @@ index 754ce380ed233eb8764af07af3c8dc95d3f39d5c..ed3062bab0b80db3b456cdad03e7efcc let customizationArea = this._panel.querySelector( "#unified-extensions-area" ); -@@ -2570,7 +2566,7 @@ var gUnifiedExtensions = { - - // The button should directly open `about:addons` when the user does not - // have any active extensions listed in the unified extensions panel. -- if (!this.hasExtensionsInPanel()) { -+ if (!this.hasExtensionsInPanel() && false) { - let viewID; - if ( - Services.prefs.getBoolPref("extensions.getAddons.showPane", true) && -@@ -2615,7 +2611,7 @@ var gUnifiedExtensions = { +@@ -2703,6 +2699,7 @@ var gUnifiedExtensions = { + // and no alternative content is available for display in the panel. + const policies = this.getActivePolicies(); + if ( ++ false && + policies.length && + !this.hasExtensionsInPanel(policies) && + !this.isPrivateWindowMissingExtensionsWithoutPBMAccess() && +@@ -2743,7 +2740,7 @@ var gUnifiedExtensions = { this.recordButtonTelemetry(reason || "extensions_panel_showing"); this.ensureButtonShownBeforeAttachingPanel(panel); PanelMultiView.openPopup(panel, this._button, { @@ -69,7 +68,7 @@ index 754ce380ed233eb8764af07af3c8dc95d3f39d5c..ed3062bab0b80db3b456cdad03e7efcc triggerEvent: aEvent, }); } -@@ -2802,18 +2798,20 @@ var gUnifiedExtensions = { +@@ -2930,18 +2927,20 @@ var gUnifiedExtensions = { this._maybeMoveWidgetNodeBack(widgetId); } diff --git a/src/browser/base/content/browser-commands-js.patch b/src/browser/base/content/browser-commands-js.patch index b6d37eec0..a475e0749 100644 --- a/src/browser/base/content/browser-commands-js.patch +++ b/src/browser/base/content/browser-commands-js.patch @@ -1,8 +1,8 @@ diff --git a/browser/base/content/browser-commands.js b/browser/base/content/browser-commands.js -index 74aae01ddcdc4b6460ebbe174355ca129a89010b..52dd4e6aa49929394ed6afa6b25f4ee4954b8b94 100644 +index 939ca497b882b3f4200141ba1b6764fb5c846f45..36c830a503b004c0a332340f686c86cad68e9381 100644 --- a/browser/base/content/browser-commands.js +++ b/browser/base/content/browser-commands.js -@@ -317,6 +317,10 @@ var BrowserCommands = { +@@ -315,6 +315,10 @@ var BrowserCommands = { } } @@ -13,7 +13,7 @@ index 74aae01ddcdc4b6460ebbe174355ca129a89010b..52dd4e6aa49929394ed6afa6b25f4ee4 // A notification intended to be useful for modular peformance tracking // starting as close as is reasonably possible to the time when the user // expressed the intent to open a new tab. Since there are a lot of -@@ -401,6 +405,11 @@ var BrowserCommands = { +@@ -399,6 +403,11 @@ var BrowserCommands = { return; } @@ -25,7 +25,7 @@ index 74aae01ddcdc4b6460ebbe174355ca129a89010b..52dd4e6aa49929394ed6afa6b25f4ee4 // Keyboard shortcuts that would close a tab that is pinned select the first // unpinned tab instead. if ( -@@ -408,8 +417,8 @@ var BrowserCommands = { +@@ -406,8 +415,8 @@ var BrowserCommands = { (event.ctrlKey || event.metaKey || event.altKey) && gBrowser.selectedTab.pinned ) { diff --git a/src/browser/base/content/browser-fullScreenAndPointerLock-js.patch b/src/browser/base/content/browser-fullScreenAndPointerLock-js.patch index db1354d84..ce5b0041f 100644 --- a/src/browser/base/content/browser-fullScreenAndPointerLock-js.patch +++ b/src/browser/base/content/browser-fullScreenAndPointerLock-js.patch @@ -1,8 +1,8 @@ diff --git a/browser/base/content/browser-fullScreenAndPointerLock.js b/browser/base/content/browser-fullScreenAndPointerLock.js -index b41449d4c4bc373a4c9cf449c0bb370bfdbc20d6..f1166929397dd39b7f44bd9cb0d62a45d67f0e1d 100644 +index bef746dc594ad974c91075cf3657c199f8f8830f..bb671341b6715c42df76f7298ba55e1fac73f33b 100644 --- a/browser/base/content/browser-fullScreenAndPointerLock.js +++ b/browser/base/content/browser-fullScreenAndPointerLock.js -@@ -427,10 +427,10 @@ var FullScreen = { +@@ -424,10 +424,10 @@ var FullScreen = { gNavToolbox.classList.toggle("fullscreen-with-menubar", shiftSize > 0); let transform = shiftSize > 0 ? `translateY(${shiftSize}px)` : ""; diff --git a/src/browser/base/content/browser-js.patch b/src/browser/base/content/browser-js.patch index 374b89d06..8d2658275 100644 --- a/src/browser/base/content/browser-js.patch +++ b/src/browser/base/content/browser-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js -index 32b67f846b9942ad3da4276bb8748fee915eb485..529ef8895d2ab01b4cbebd2992fd3b64225e42b0 100644 +index b4b79e7fb3228ba91bd8afa08659be0d88883725..9e1d59b6a736107e55bda73686a4a627e4c0ba7c 100644 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -31,6 +31,7 @@ ChromeUtils.defineESModuleGetters(this, { @@ -10,7 +10,7 @@ index 32b67f846b9942ad3da4276bb8748fee915eb485..529ef8895d2ab01b4cbebd2992fd3b64 DevToolsSocketStatus: "resource://devtools/shared/security/DevToolsSocketStatus.sys.mjs", DownloadUtils: "resource://gre/modules/DownloadUtils.sys.mjs", -@@ -2293,6 +2294,8 @@ var XULBrowserWindow = { +@@ -2298,6 +2299,8 @@ var XULBrowserWindow = { AboutReaderParent.updateReaderButton(gBrowser.selectedBrowser); TranslationsParent.onLocationChange(gBrowser.selectedBrowser); @@ -19,7 +19,7 @@ index 32b67f846b9942ad3da4276bb8748fee915eb485..529ef8895d2ab01b4cbebd2992fd3b64 PictureInPicture.updateUrlbarToggle(gBrowser.selectedBrowser); if (!gMultiProcessBrowser) { -@@ -3795,7 +3798,7 @@ function warnAboutClosingWindow() { +@@ -3809,7 +3812,7 @@ function warnAboutClosingWindow() { if (!isPBWindow && !toolbar.visible) { return gBrowser.warnAboutClosingTabs( @@ -28,7 +28,7 @@ index 32b67f846b9942ad3da4276bb8748fee915eb485..529ef8895d2ab01b4cbebd2992fd3b64 gBrowser.closingTabsEnum.ALL ); } -@@ -3835,7 +3838,7 @@ function warnAboutClosingWindow() { +@@ -3849,7 +3852,7 @@ function warnAboutClosingWindow() { return ( isPBWindow || gBrowser.warnAboutClosingTabs( @@ -37,7 +37,7 @@ index 32b67f846b9942ad3da4276bb8748fee915eb485..529ef8895d2ab01b4cbebd2992fd3b64 gBrowser.closingTabsEnum.ALL ) ); -@@ -3860,7 +3863,7 @@ function warnAboutClosingWindow() { +@@ -3874,7 +3877,7 @@ function warnAboutClosingWindow() { AppConstants.platform != "macosx" || isPBWindow || gBrowser.warnAboutClosingTabs( @@ -46,7 +46,7 @@ index 32b67f846b9942ad3da4276bb8748fee915eb485..529ef8895d2ab01b4cbebd2992fd3b64 gBrowser.closingTabsEnum.ALL ) ); -@@ -4782,6 +4785,9 @@ var ConfirmationHint = { +@@ -4796,6 +4799,9 @@ var ConfirmationHint = { MozXULElement.insertFTLIfNeeded("toolkit/branding/brandings.ftl"); MozXULElement.insertFTLIfNeeded("browser/confirmationHints.ftl"); document.l10n.setAttributes(this._message, messageId, options.l10nArgs); diff --git a/src/browser/base/content/browser-places-js.patch b/src/browser/base/content/browser-places-js.patch index 5425bd91e..8fb826e25 100644 --- a/src/browser/base/content/browser-places-js.patch +++ b/src/browser/base/content/browser-places-js.patch @@ -1,8 +1,8 @@ diff --git a/browser/base/content/browser-places.js b/browser/base/content/browser-places.js -index 79b4f6f8fb2f7dd8784920038784e6bb0c967e2d..4db983dad9bea10c17b5ac166ba58b93fa2a4d56 100644 +index 3bd7b8f6025a7df4ce5cfb66916125bce9ef3991..c408ef829b7540aec72b2307e5d4bfa34109d6cd 100644 --- a/browser/base/content/browser-places.js +++ b/browser/base/content/browser-places.js -@@ -252,6 +252,8 @@ var StarUI = { +@@ -249,6 +249,8 @@ var StarUI = { }); } @@ -11,7 +11,7 @@ index 79b4f6f8fb2f7dd8784920038784e6bb0c967e2d..4db983dad9bea10c17b5ac166ba58b93 let onPanelReady = fn => { let target = this.panel; if (target.parentNode) { -@@ -303,6 +305,21 @@ var StarUI = { +@@ -300,6 +302,21 @@ var StarUI = { } }, @@ -33,7 +33,7 @@ index 79b4f6f8fb2f7dd8784920038784e6bb0c967e2d..4db983dad9bea10c17b5ac166ba58b93 removeBookmarkButtonCommand: function SU_removeBookmarkButtonCommand() { this._removeBookmarksOnPopupHidden = true; this.panel.hidePopup(); -@@ -1800,6 +1817,7 @@ var BookmarkingUI = { +@@ -1797,6 +1814,7 @@ var BookmarkingUI = { document.getElementById("context-bookmarkpage"), PanelMultiView.getViewNode(document, "panelMenuBookmarkThisPage"), document.getElementById("pageAction-panel-bookmark"), diff --git a/src/browser/base/content/browser-siteIdentity-js.patch b/src/browser/base/content/browser-siteIdentity-js.patch index ac751474b..694f10ecd 100644 --- a/src/browser/base/content/browser-siteIdentity-js.patch +++ b/src/browser/base/content/browser-siteIdentity-js.patch @@ -1,8 +1,8 @@ diff --git a/browser/base/content/browser-siteIdentity.js b/browser/base/content/browser-siteIdentity.js -index 65354e0ad3097e10de72f36e257c94472524baf7..866cf5672f30f81a1d8e061c9af0c1af5fbb5fb2 100644 +index 8369e546866aa313e62f808acb8d51afa8da4f9b..7a4b20dd5922425cebfac542893a52cd68a26449 100644 --- a/browser/base/content/browser-siteIdentity.js +++ b/browser/base/content/browser-siteIdentity.js -@@ -453,11 +453,6 @@ var gIdentityHandler = { +@@ -451,11 +451,6 @@ var gIdentityHandler = { // avoid a pretty ugly transition. Also hide it even // if the update resulted in no site data, to keep the // illusion that clicking the button had an effect. @@ -14,7 +14,7 @@ index 65354e0ad3097e10de72f36e257c94472524baf7..866cf5672f30f81a1d8e061c9af0c1af let baseDomain = SiteDataManager.getBaseDomainFromHost(this._uri.host); if (SiteDataManager.promptSiteDataRemoval(window, [baseDomain])) { -@@ -834,7 +829,7 @@ var gIdentityHandler = { +@@ -832,7 +827,7 @@ var gIdentityHandler = { // This is a secure internal Firefox page. this._identityBox.className = "chromeUI"; let brandBundle = document.getElementById("bundle_brand"); @@ -23,7 +23,7 @@ index 65354e0ad3097e10de72f36e257c94472524baf7..866cf5672f30f81a1d8e061c9af0c1af } else if (this._pageExtensionPolicy) { // This is a WebExtension page. this._identityBox.className = "extensionPage"; -@@ -1163,6 +1158,12 @@ var gIdentityHandler = { +@@ -1161,6 +1156,12 @@ var gIdentityHandler = { } } diff --git a/src/browser/base/content/browser-xhtml.patch b/src/browser/base/content/browser-xhtml.patch index 413da9a2a..8b473bbd3 100644 --- a/src/browser/base/content/browser-xhtml.patch +++ b/src/browser/base/content/browser-xhtml.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml -index ffddea280e2edffa2531b4b129489c2be0e2c3d2..f03db9e2db0dec06f997740337f28e76a08a3bdb 100644 +index 246d23a77960d25f78b163429a3ed28c7180ccd7..1c26485d8464413689767c8a38aadbcadcecae4d 100644 --- a/browser/base/content/browser.xhtml +++ b/browser/base/content/browser.xhtml @@ -19,6 +19,7 @@ diff --git a/src/browser/base/content/main-popupset-inc-xhtml.patch b/src/browser/base/content/main-popupset-inc-xhtml.patch index 45cdf904f..9adb099f4 100644 --- a/src/browser/base/content/main-popupset-inc-xhtml.patch +++ b/src/browser/base/content/main-popupset-inc-xhtml.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/main-popupset.inc.xhtml b/browser/base/content/main-popupset.inc.xhtml -index 69b83857f40bab6a7298c1416989df2d929d78c1..4ac9f02eb31f58a72d4c58c239ebeadcb66d1e16 100644 +index 78030413c4125362e056a8ec249b597292be050b..90fc935e105d594cd4cc925c70c29b18b8dffccd 100644 --- a/browser/base/content/main-popupset.inc.xhtml +++ b/browser/base/content/main-popupset.inc.xhtml @@ -208,6 +208,10 @@ @@ -21,7 +21,7 @@ index 69b83857f40bab6a7298c1416989df2d929d78c1..4ac9f02eb31f58a72d4c58c239ebeadc -@@ -615,6 +620,8 @@ +@@ -628,6 +633,8 @@ #include popup-notifications.inc.xhtml diff --git a/src/browser/base/content/navigator-toolbox-js.patch b/src/browser/base/content/navigator-toolbox-js.patch index 829800da2..9dc57d082 100644 --- a/src/browser/base/content/navigator-toolbox-js.patch +++ b/src/browser/base/content/navigator-toolbox-js.patch @@ -1,8 +1,8 @@ diff --git a/browser/base/content/navigator-toolbox.js b/browser/base/content/navigator-toolbox.js -index 413bad2a62058a1c434d6a44e927e44eb397289d..d28116ffacb0ddb6fdb421db5d6498e455356b4a 100644 +index 7b776b15d52367a008ce6bf53dcfcbbe007b7453..d9a3404905b73db7c8f202ab166d5f3c625351f6 100644 --- a/browser/base/content/navigator-toolbox.js +++ b/browser/base/content/navigator-toolbox.js -@@ -8,7 +8,7 @@ +@@ -6,7 +6,7 @@ document.addEventListener( "DOMContentLoaded", () => { @@ -11,7 +11,7 @@ index 413bad2a62058a1c434d6a44e927e44eb397289d..d28116ffacb0ddb6fdb421db5d6498e4 const widgetOverflow = document.getElementById("widget-overflow"); function onPopupShowing(event) { -@@ -187,6 +187,7 @@ document.addEventListener( +@@ -185,6 +185,7 @@ document.addEventListener( #reload-button , #urlbar-go-button, #reader-mode-button, @@ -19,7 +19,7 @@ index 413bad2a62058a1c434d6a44e927e44eb397289d..d28116ffacb0ddb6fdb421db5d6498e4 #picture-in-picture-button, #urlbar-zoom-button, #star-button-box, -@@ -208,6 +209,7 @@ document.addEventListener( +@@ -206,6 +207,7 @@ document.addEventListener( case "vertical-tabs-newtab-button": case "tabs-newtab-button": case "new-tab-button": @@ -27,7 +27,7 @@ index 413bad2a62058a1c434d6a44e927e44eb397289d..d28116ffacb0ddb6fdb421db5d6498e4 gBrowser.handleNewTabMiddleClick(element, event); break; -@@ -317,7 +319,7 @@ document.addEventListener( +@@ -315,7 +317,7 @@ document.addEventListener( #pageActionButton, #downloads-button, #fxa-toolbar-menu-button, @@ -36,7 +36,7 @@ index 413bad2a62058a1c434d6a44e927e44eb397289d..d28116ffacb0ddb6fdb421db5d6498e4 #library-button `); if (!element) { -@@ -396,7 +398,7 @@ document.addEventListener( +@@ -394,7 +396,7 @@ document.addEventListener( gSync.toggleAccountPanel(element, event); break; diff --git a/src/browser/base/content/nsContextMenu-sys-mjs.patch b/src/browser/base/content/nsContextMenu-sys-mjs.patch index d5ddb503a..d705ed870 100644 --- a/src/browser/base/content/nsContextMenu-sys-mjs.patch +++ b/src/browser/base/content/nsContextMenu-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/browser/base/content/nsContextMenu.sys.mjs b/browser/base/content/nsContextMenu.sys.mjs -index b4fe996f9685a085c14324a35a1d51e2fed569b7..c83d5e9bf92f8f2e3d96b121ba3b758dd124393b 100644 +index 259b440375c7e84d373a134fea20cdbc1c1bae4b..a9ce22a2391b4ec0bf82ceedd35f4c9d9626bb28 100644 --- a/browser/base/content/nsContextMenu.sys.mjs +++ b/browser/base/content/nsContextMenu.sys.mjs -@@ -1105,6 +1105,8 @@ export class nsContextMenu { +@@ -1104,6 +1104,8 @@ export class nsContextMenu { !this.isSecureAboutPage() ); diff --git a/src/browser/base/content/zen-panels/site-data.inc b/src/browser/base/content/zen-panels/site-data.inc index e413d2c1e..0f7695264 100644 --- a/src/browser/base/content/zen-panels/site-data.inc +++ b/src/browser/base/content/zen-panels/site-data.inc @@ -55,6 +55,17 @@ + +# We don't really use this, but again, to keep firefox happy +# in case they decide to change something for this specific +# empty state, we keep it on the DOM +# https://searchfox.org/firefox-main/rev/e613f4df351a21871cfeadf7d5b4043ffad157b1/browser/components/customizableui/content/panelUI.inc.xhtml#101-106 + + + + + + # Keep this button on the DOM even though we hide it for ever, diff --git a/src/browser/components/BrowserGlue-sys-mjs.patch b/src/browser/components/BrowserGlue-sys-mjs.patch index 7d280fdcd..1b6d97eba 100644 --- a/src/browser/components/BrowserGlue-sys-mjs.patch +++ b/src/browser/components/BrowserGlue-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/BrowserGlue.sys.mjs b/browser/components/BrowserGlue.sys.mjs -index 67b2806835baba3070f295d6b96f97077639995a..5f28e0073c893c57c1d6c37deaacf7b097351d60 100644 +index f1cabb13ca4f86a2bafc1d93b7f882218a108eb2..2389b1addf24d17bd41fca65cfeb6f944479076d 100644 --- a/browser/components/BrowserGlue.sys.mjs +++ b/browser/components/BrowserGlue.sys.mjs @@ -8,6 +8,7 @@ import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs"; @@ -10,7 +10,7 @@ index 67b2806835baba3070f295d6b96f97077639995a..5f28e0073c893c57c1d6c37deaacf7b0 AboutHomeStartupCache: "resource:///modules/AboutHomeStartupCache.sys.mjs", AWToolbarButton: "resource:///modules/aboutwelcome/AWToolbarUtils.sys.mjs", ASRouter: "resource:///modules/asrouter/ASRouter.sys.mjs", -@@ -1458,7 +1459,7 @@ BrowserGlue.prototype = { +@@ -1452,7 +1453,7 @@ BrowserGlue.prototype = { windowcount++; let tabbrowser = win.gBrowser; if (tabbrowser) { @@ -19,7 +19,7 @@ index 67b2806835baba3070f295d6b96f97077639995a..5f28e0073c893c57c1d6c37deaacf7b0 } } -@@ -1623,6 +1624,8 @@ BrowserGlue.prototype = { +@@ -1617,6 +1618,8 @@ BrowserGlue.prototype = { } else if (profileDataVersion < APP_DATA_VERSION) { lazy.ProfileDataUpgrader.upgrade(profileDataVersion, APP_DATA_VERSION); } diff --git a/src/browser/components/asrouter/modules/FeatureCallout-sys-mjs.patch b/src/browser/components/asrouter/modules/FeatureCallout-sys-mjs.patch index d2dabc56e..7bf648687 100644 --- a/src/browser/components/asrouter/modules/FeatureCallout-sys-mjs.patch +++ b/src/browser/components/asrouter/modules/FeatureCallout-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/asrouter/modules/FeatureCallout.sys.mjs b/browser/components/asrouter/modules/FeatureCallout.sys.mjs -index 2a2c5a6fe903694abbac0be86c7b3c8adc1d0275..5571b827198474a2635a9bd968adbc8c96dbc353 100644 +index 4ea9c9e88a1831dad7e42ebd8d0dd507102e8280..316aa626e525f05caac7f315e0ea7ae9d822b6af 100644 --- a/browser/components/asrouter/modules/FeatureCallout.sys.mjs +++ b/browser/components/asrouter/modules/FeatureCallout.sys.mjs -@@ -776,6 +776,7 @@ export class FeatureCallout { +@@ -777,6 +777,7 @@ export class FeatureCallout { ) { return false; } diff --git a/src/browser/components/customizableui/ToolbarContextMenu-sys-mjs.patch b/src/browser/components/customizableui/ToolbarContextMenu-sys-mjs.patch index 7cee05643..628fc23d9 100644 --- a/src/browser/components/customizableui/ToolbarContextMenu-sys-mjs.patch +++ b/src/browser/components/customizableui/ToolbarContextMenu-sys-mjs.patch @@ -1,15 +1,13 @@ diff --git a/browser/components/customizableui/ToolbarContextMenu.sys.mjs b/browser/components/customizableui/ToolbarContextMenu.sys.mjs -index 852cf2eee9113753fa0797be6dec80dcb9207703..93bb093e679320033a37b2af14e8e0e3c7621f94 100644 +index 95621ae202378fb1ebceca5623a98b790b9eb5ff..fe6901f53f863bca20a514df0490499402d669ae 100644 --- a/browser/components/customizableui/ToolbarContextMenu.sys.mjs +++ b/browser/components/customizableui/ToolbarContextMenu.sys.mjs -@@ -242,8 +242,8 @@ export var ToolbarContextMenu = { - // Show/hide sidebar and vertical tabs menu items - let sidebarRevampEnabled = Services.prefs.getBoolPref("sidebar.revamp"); +@@ -244,7 +244,7 @@ export var ToolbarContextMenu = { let showSidebarActions = -- ["tabbrowser-tabs", "sidebar-button"].includes(toolbarItem?.id) || -- toolbarItem?.localName == "toolbarspring"; -+ (["tabbrowser-tabs", "sidebar-button"].includes(toolbarItem?.id) || -+ toolbarItem?.localName == "toolbarspring") && false; + ["tabbrowser-tabs", "sidebar-button"].includes(toolbarItem?.id) || + toolbarItem?.localName == "toolbarspring" || +- isTitlebarSpacer; ++ isTitlebarSpacer && false; + let toggleVerticalTabsItem = document.getElementById( "toolbar-context-toggle-vertical-tabs" - ); diff --git a/src/browser/components/customizableui/content/panelUI-inc-xhtml.patch b/src/browser/components/customizableui/content/panelUI-inc-xhtml.patch index 1fb4adb95..2bf8a2602 100644 --- a/src/browser/components/customizableui/content/panelUI-inc-xhtml.patch +++ b/src/browser/components/customizableui/content/panelUI-inc-xhtml.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/customizableui/content/panelUI.inc.xhtml b/browser/components/customizableui/content/panelUI.inc.xhtml -index 85acb96a3deefed708ea768b2f163e7fd6480b97..bb3aed53758da7dafcfed4492acb0cbf2b80cd2f 100644 +index 6cb22be6526b17d952a90fd414c49a31e9afde7a..84f8156e88027a79a40f14c77c83d6a2d19c8a72 100644 --- a/browser/components/customizableui/content/panelUI.inc.xhtml +++ b/browser/components/customizableui/content/panelUI.inc.xhtml -@@ -132,7 +132,7 @@ +@@ -139,7 +139,7 @@ window.requestAnimationFrame(resolve)); if (!this._isAlive) { -@@ -1086,6 +1103,8 @@ class PlacesToolbar extends PlacesViewBase { +@@ -1120,6 +1137,8 @@ class PlacesToolbar extends PlacesViewBase { "scheme", PlacesUIUtils.guessUrlSchemeForUI(aChild.uri) ); @@ -119,7 +119,7 @@ index ee6050d411df009d8b61e49d7fdaba79f1bc5db1..0149528329dad3d48449175a35d96d3e } } -@@ -2234,7 +2253,7 @@ this.PlacesPanelview = class PlacesPanelview extends PlacesViewBase { +@@ -2268,7 +2287,7 @@ this.PlacesPanelview = class PlacesPanelview extends PlacesViewBase { PlacesUIUtils.guessUrlSchemeForUI(placesNode.uri) ); element.setAttribute("label", PlacesUIUtils.getBestTitle(placesNode)); diff --git a/src/browser/components/preferences/jar-mn.patch b/src/browser/components/preferences/jar-mn.patch index 1f1b5e52a..59429d78a 100644 --- a/src/browser/components/preferences/jar-mn.patch +++ b/src/browser/components/preferences/jar-mn.patch @@ -1,10 +1,11 @@ diff --git a/browser/components/preferences/jar.mn b/browser/components/preferences/jar.mn -index a786155d80a9f1f09d209f2da11437ee2d662739..2e422b48b452698275118d336d1b16af6a221577 100644 +index 65efb0666785cc79e58015e19ec55216bf4ec9c4..95941c52ffd4c9ee36f584413fb96d59721113db 100644 --- a/browser/components/preferences/jar.mn +++ b/browser/components/preferences/jar.mn -@@ -30,3 +30,5 @@ browser.jar: - content/browser/preferences/widgets/setting-control.mjs (widgets/setting-control/setting-control.mjs) - content/browser/preferences/widgets/setting-group.mjs (widgets/setting-group/setting-group.mjs) - content/browser/preferences/widgets/setting-group.css (widgets/setting-group/setting-group.css) +@@ -33,3 +33,5 @@ browser.jar: + content/browser/preferences/widgets/setting-pane.mjs (widgets/setting-pane/setting-pane.mjs) + 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) + + content/browser/preferences/zen-settings.js +\ No newline at end of file diff --git a/src/browser/components/preferences/main-inc-xhtml.patch b/src/browser/components/preferences/main-inc-xhtml.patch index de244411a..a0683e114 100644 --- a/src/browser/components/preferences/main-inc-xhtml.patch +++ b/src/browser/components/preferences/main-inc-xhtml.patch @@ -1,20 +1,8 @@ diff --git a/browser/components/preferences/main.inc.xhtml b/browser/components/preferences/main.inc.xhtml -index 891cf7108cf4606c99a902afa420e744b9690b87..2bdbc1f0b6ac2c883dcbd706aed0615fad5e0760 100644 +index ff577c035ff6128f7ae948bc810082c92b3a624c..40f94fff53c63bdff28eaa68f9b0736d53c5b4f8 100644 --- a/browser/components/preferences/main.inc.xhtml +++ b/browser/components/preferences/main.inc.xhtml -@@ -29,6 +29,11 @@ - - -+ -+ -+ - #ifdef XP_WIN - diff --git a/src/browser/components/preferences/main-js.patch b/src/browser/components/preferences/main-js.patch index fedbfaded..ece242110 100644 --- a/src/browser/components/preferences/main-js.patch +++ b/src/browser/components/preferences/main-js.patch @@ -1,8 +1,20 @@ diff --git a/browser/components/preferences/main.js b/browser/components/preferences/main.js -index 259bc260328af1b1f2b95866e7cf92dec341a4b0..3cebff51774b2542a8d4d888aa99dc10929c80be 100644 +index 46283d3eacfea0f419afa3bdfd2a51e411502a20..4fe229706eb0145a21042b8b3cca323682e89e76 100644 --- a/browser/components/preferences/main.js +++ b/browser/components/preferences/main.js -@@ -443,7 +443,7 @@ function getBundleForLocales(newLocales) { +@@ -1117,6 +1117,11 @@ let SETTINGS_CONFIG = { + id: "browserRestoreSession", + l10nId: "startup-restore-windows-and-tabs", + }, ++ { ++ id: "zenWorkspaceContinueWhereLeftOff", ++ l10nId: "zen-workspace-continue-where-left-off", ++ control: "moz-checkbox", ++ }, + { + id: "windowsLaunchOnLogin", + l10nId: "windows-launch-on-login", +@@ -1611,7 +1616,7 @@ function getBundleForLocales(newLocales) { ]) ); return new Localization( diff --git a/src/browser/components/preferences/preferences-js.patch b/src/browser/components/preferences/preferences-js.patch index c85a728be..8b2db49d4 100644 --- a/src/browser/components/preferences/preferences-js.patch +++ b/src/browser/components/preferences/preferences-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/preferences/preferences.js b/browser/components/preferences/preferences.js -index 1fb8a954f61e89736b369f5fa01bb4f89fff16ad..3030c32cb66529f14e575428654778abd312dfd8 100644 +index c949c1800cb4c200c273c4019a61553b0e236994..0846ab1a348d3c5904e967aeb36eb846ba3cffa9 100644 --- a/browser/components/preferences/preferences.js +++ b/browser/components/preferences/preferences.js @@ -117,6 +117,7 @@ ChromeUtils.defineLazyGetter(this, "gSubDialog", function () { @@ -10,7 +10,7 @@ index 1fb8a954f61e89736b369f5fa01bb4f89fff16ad..3030c32cb66529f14e575428654778ab ], resizeCallback: async ({ title, frame }) => { // Search within main document and highlight matched keyword. -@@ -196,6 +197,10 @@ function init_all() { +@@ -224,6 +225,10 @@ function init_all() { register_module("paneSearch", gSearchPane); register_module("panePrivacy", gPrivacyPane); register_module("paneContainers", gContainersPane); @@ -19,5 +19,5 @@ index 1fb8a954f61e89736b369f5fa01bb4f89fff16ad..3030c32cb66529f14e575428654778ab + register_module("paneZenCKS", gZenCKSSettings); + register_module("paneZenMarketplace", gZenMarketplaceManager); - if (Services.prefs.getBoolPref("browser.translations.newSettingsUI.enable")) { - register_module("paneTranslations", gTranslationsPane); + for (let [subPane, config] of Object.entries(CONFIG_PANES)) { + subPane = friendlyPrefCategoryNameToInternalName(subPane); diff --git a/src/browser/components/preferences/preferences-xhtml.patch b/src/browser/components/preferences/preferences-xhtml.patch index 8e8ee9e12..4227b80db 100644 --- a/src/browser/components/preferences/preferences-xhtml.patch +++ b/src/browser/components/preferences/preferences-xhtml.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/preferences/preferences.xhtml b/browser/components/preferences/preferences.xhtml -index 0081bb470c9b15b39441ff844680e5e91b05fb86..3e4e7c43cf0e4feffb80623491de6222bb88a64b 100644 +index 4500e3a3a7d54bd7647cd09ab0e11df782fb7a69..9506e860966e974b377b3e2e71c91f9d2c4a0c92 100644 --- a/browser/components/preferences/preferences.xhtml +++ b/browser/components/preferences/preferences.xhtml @@ -45,6 +45,8 @@ @@ -11,7 +11,7 @@ index 0081bb470c9b15b39441ff844680e5e91b05fb86..3e4e7c43cf0e4feffb80623491de6222 -@@ -106,6 +108,11 @@ +@@ -109,6 +111,11 @@ @@ -23,7 +23,7 @@ index 0081bb470c9b15b39441ff844680e5e91b05fb86..3e4e7c43cf0e4feffb80623491de6222 @@ -74,7 +74,7 @@ index 0081bb470c9b15b39441ff844680e5e91b05fb86..3e4e7c43cf0e4feffb80623491de6222 @@ -86,7 +86,7 @@ index 0081bb470c9b15b39441ff844680e5e91b05fb86..3e4e7c43cf0e4feffb80623491de6222 -@@ -247,6 +293,10 @@ +@@ -250,6 +296,10 @@ #include sync.inc.xhtml #include experimental.inc.xhtml #include moreFromMozilla.inc.xhtml diff --git a/src/browser/components/preferences/sync-inc-xhtml.patch b/src/browser/components/preferences/sync-inc-xhtml.patch index d712db631..406ca8fe2 100644 --- a/src/browser/components/preferences/sync-inc-xhtml.patch +++ b/src/browser/components/preferences/sync-inc-xhtml.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/preferences/sync.inc.xhtml b/browser/components/preferences/sync.inc.xhtml -index e59c536fc2fa06b11be9378a28285ac16fd16958..cf17ee3b6347b950fcf5bf260cd0631c77ffd1d3 100644 +index 31b95644f820eda3267d3b52913ed0845abc1c80..1c8869418f7c88ed33601860dafd2c4eb0d5731f 100644 --- a/browser/components/preferences/sync.inc.xhtml +++ b/browser/components/preferences/sync.inc.xhtml @@ -223,6 +223,10 @@ diff --git a/src/browser/components/preferences/zen-settings.js b/src/browser/components/preferences/zen-settings.js index 553ddc109..a126c8a38 100644 --- a/src/browser/components/preferences/zen-settings.js +++ b/src/browser/components/preferences/zen-settings.js @@ -1136,3 +1136,8 @@ Preferences.addAll([ default: true, }, ]); + +Preferences.addSetting({ + id: 'zenWorkspaceContinueWhereLeftOff', + pref: 'zen.workspaces.continue-where-left-off', +}); diff --git a/src/browser/components/search/SearchUIUtils-sys-mjs.patch b/src/browser/components/search/SearchUIUtils-sys-mjs.patch index c384b1151..fbe2c38aa 100644 --- a/src/browser/components/search/SearchUIUtils-sys-mjs.patch +++ b/src/browser/components/search/SearchUIUtils-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/search/SearchUIUtils.sys.mjs b/browser/components/search/SearchUIUtils.sys.mjs -index 55f90f4e802480728bbd5ef962b507183e017997..2a83f861fe6edee2b127c8d7946abcdcdbf677f5 100644 +index 15fdb0cd7664c2b49977902d7f4c7a117d82cf15..6aedbc18de6604b63b2586e7d9745a4c4e7e38ae 100644 --- a/browser/components/search/SearchUIUtils.sys.mjs +++ b/browser/components/search/SearchUIUtils.sys.mjs -@@ -430,7 +430,7 @@ export var SearchUIUtils = { +@@ -434,7 +434,7 @@ export var SearchUIUtils = { triggeringSearchEngine: engine.name, }, }); diff --git a/src/browser/components/sessionstore/SessionStore-sys-mjs.patch b/src/browser/components/sessionstore/SessionStore-sys-mjs.patch index 79c5bcfcf..df250c095 100644 --- a/src/browser/components/sessionstore/SessionStore-sys-mjs.patch +++ b/src/browser/components/sessionstore/SessionStore-sys-mjs.patch @@ -1,17 +1,17 @@ diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs -index eb62ff3e733e43fdaa299babddea3ba0125abb06..8f20ba50b06f5b75d7de08eb4d1b27d89fb95494 100644 +index 1cdbc0f41bf5b55dfbbd850cb618c6d870f7a261..f13ed1412bb7ae6623aa2605d7691d10540eb659 100644 --- a/browser/components/sessionstore/SessionStore.sys.mjs +++ b/browser/components/sessionstore/SessionStore.sys.mjs -@@ -126,6 +126,8 @@ const TAB_EVENTS = [ - "TabUngrouped", +@@ -127,6 +127,8 @@ const TAB_EVENTS = [ "TabGroupCollapse", "TabGroupExpand", + "TabSplitViewActivate", + "TabAddedToEssentials", + "TabRemovedFromEssentials", ]; const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; -@@ -1904,6 +1906,8 @@ var SessionStoreInternal = { +@@ -1911,6 +1913,8 @@ var SessionStoreInternal = { case "TabPinned": case "TabUnpinned": case "SwapDocShells": @@ -20,7 +20,7 @@ index eb62ff3e733e43fdaa299babddea3ba0125abb06..8f20ba50b06f5b75d7de08eb4d1b27d8 this.saveStateDelayed(win); break; case "TabGroupCreate": -@@ -2139,7 +2143,6 @@ var SessionStoreInternal = { +@@ -2151,7 +2155,6 @@ var SessionStoreInternal = { if (closedWindowState) { let newWindowState; if ( @@ -28,7 +28,7 @@ index eb62ff3e733e43fdaa299babddea3ba0125abb06..8f20ba50b06f5b75d7de08eb4d1b27d8 !lazy.SessionStartup.willRestore() ) { // We want to split the window up into pinned tabs and unpinned tabs. -@@ -2372,11 +2375,9 @@ var SessionStoreInternal = { +@@ -2384,11 +2387,9 @@ var SessionStoreInternal = { tabbrowser.selectedTab.label; } @@ -40,7 +40,7 @@ index eb62ff3e733e43fdaa299babddea3ba0125abb06..8f20ba50b06f5b75d7de08eb4d1b27d8 // 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 -@@ -3361,7 +3362,7 @@ var SessionStoreInternal = { +@@ -3373,7 +3374,7 @@ var SessionStoreInternal = { if (!isPrivateWindow && tabState.isPrivate) { return; } @@ -49,7 +49,7 @@ index eb62ff3e733e43fdaa299babddea3ba0125abb06..8f20ba50b06f5b75d7de08eb4d1b27d8 return; } -@@ -4073,6 +4074,11 @@ var SessionStoreInternal = { +@@ -4089,6 +4090,11 @@ var SessionStoreInternal = { Math.min(tabState.index, tabState.entries.length) ); tabState.pinned = false; @@ -61,7 +61,7 @@ index eb62ff3e733e43fdaa299babddea3ba0125abb06..8f20ba50b06f5b75d7de08eb4d1b27d8 if (inBackground === false) { aWindow.gBrowser.selectedTab = newTab; -@@ -4509,6 +4515,7 @@ var SessionStoreInternal = { +@@ -4525,6 +4531,7 @@ var SessionStoreInternal = { // Append the tab if we're opening into a different window, tabIndex: aSource == aTargetWindow ? pos : Infinity, pinned: state.pinned, @@ -69,7 +69,7 @@ index eb62ff3e733e43fdaa299babddea3ba0125abb06..8f20ba50b06f5b75d7de08eb4d1b27d8 userContextId: state.userContextId, skipLoad: true, preferredRemoteType, -@@ -5358,7 +5365,7 @@ var SessionStoreInternal = { +@@ -5374,7 +5381,7 @@ var SessionStoreInternal = { for (let i = tabbrowser.pinnedTabCount; i < tabbrowser.tabs.length; i++) { let tab = tabbrowser.tabs[i]; @@ -78,7 +78,7 @@ index eb62ff3e733e43fdaa299babddea3ba0125abb06..8f20ba50b06f5b75d7de08eb4d1b27d8 removableTabs.push(tab); } } -@@ -5418,7 +5425,7 @@ var SessionStoreInternal = { +@@ -5434,7 +5441,7 @@ var SessionStoreInternal = { } let workspaceID = aWindow.getWorkspaceID(); @@ -87,7 +87,7 @@ index eb62ff3e733e43fdaa299babddea3ba0125abb06..8f20ba50b06f5b75d7de08eb4d1b27d8 winData.workspaceID = workspaceID; } }, -@@ -5609,11 +5616,12 @@ var SessionStoreInternal = { +@@ -5625,11 +5632,12 @@ var SessionStoreInternal = { } let tabbrowser = aWindow.gBrowser; @@ -101,7 +101,7 @@ index eb62ff3e733e43fdaa299babddea3ba0125abb06..8f20ba50b06f5b75d7de08eb4d1b27d8 // update the internal state data for this window for (let tab of tabs) { if (tab == aWindow.FirefoxViewHandler.tab) { -@@ -5624,6 +5632,7 @@ var SessionStoreInternal = { +@@ -5640,6 +5648,7 @@ var SessionStoreInternal = { tabsData.push(tabData); } @@ -109,7 +109,7 @@ index eb62ff3e733e43fdaa299babddea3ba0125abb06..8f20ba50b06f5b75d7de08eb4d1b27d8 // update tab group state for this window winData.groups = []; for (let tabGroup of aWindow.gBrowser.tabGroups) { -@@ -5636,7 +5645,7 @@ var SessionStoreInternal = { +@@ -5652,7 +5661,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) { @@ -118,7 +118,7 @@ index eb62ff3e733e43fdaa299babddea3ba0125abb06..8f20ba50b06f5b75d7de08eb4d1b27d8 winData.title = tabbrowser.tabs[0].label; } winData.selected = selectedIndex; -@@ -5748,8 +5757,8 @@ var SessionStoreInternal = { +@@ -5764,8 +5773,8 @@ var SessionStoreInternal = { // selectTab represents. let selectTab = 0; if (overwriteTabs) { @@ -129,7 +129,7 @@ index eb62ff3e733e43fdaa299babddea3ba0125abb06..8f20ba50b06f5b75d7de08eb4d1b27d8 selectTab = Math.min(selectTab, winData.tabs.length); } -@@ -5792,6 +5801,8 @@ var SessionStoreInternal = { +@@ -5808,6 +5817,8 @@ var SessionStoreInternal = { winData.tabs, winData.groups ?? [] ); @@ -138,7 +138,7 @@ index eb62ff3e733e43fdaa299babddea3ba0125abb06..8f20ba50b06f5b75d7de08eb4d1b27d8 this._log.debug( `restoreWindow, createTabsForSessionRestore returned ${tabs.length} tabs` ); -@@ -6348,6 +6359,25 @@ var SessionStoreInternal = { +@@ -6371,6 +6382,25 @@ var SessionStoreInternal = { // Most of tabData has been restored, now continue with restoring // attributes that may trigger external events. @@ -164,7 +164,7 @@ index eb62ff3e733e43fdaa299babddea3ba0125abb06..8f20ba50b06f5b75d7de08eb4d1b27d8 if (tabData.pinned) { tabbrowser.pinTab(tab); -@@ -7263,7 +7293,7 @@ var SessionStoreInternal = { +@@ -7289,7 +7319,7 @@ var SessionStoreInternal = { let groupsToSave = new Map(); for (let tIndex = 0; tIndex < window.tabs.length; ) { diff --git a/src/browser/components/sidebar/browser-sidebar-js.patch b/src/browser/components/sidebar/browser-sidebar-js.patch index a04592bf8..215f98bae 100644 --- a/src/browser/components/sidebar/browser-sidebar-js.patch +++ b/src/browser/components/sidebar/browser-sidebar-js.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/sidebar/browser-sidebar.js b/browser/components/sidebar/browser-sidebar.js -index c4edb5442e5243b7d9fe35e1774b2fc651903601..d58076fedafe07d3401ab1723eaa837fabbae09f 100644 +index 220c3c83fa09daaec433803a4655a20114a137a6..1ef8adc3ecfa61839bb993f7fc090133bffe77db 100644 --- a/browser/components/sidebar/browser-sidebar.js +++ b/browser/components/sidebar/browser-sidebar.js -@@ -779,7 +779,7 @@ var SidebarController = { +@@ -793,7 +793,7 @@ var SidebarController = { setPosition() { // First reset all ordinals to match DOM ordering. let contentArea = document.getElementById("tabbrowser-tabbox"); diff --git a/src/browser/components/tabbrowser/AsyncTabSwitcher-sys-mjs.patch b/src/browser/components/tabbrowser/AsyncTabSwitcher-sys-mjs.patch index 99f83d192..eba2ec3d1 100644 --- a/src/browser/components/tabbrowser/AsyncTabSwitcher-sys-mjs.patch +++ b/src/browser/components/tabbrowser/AsyncTabSwitcher-sys-mjs.patch @@ -1,10 +1,10 @@ diff --git a/browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs b/browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs -index 773f595e89e268578ba153907babec95b58a155a..7cb99cde00c19f50fd9aa48ab1efcfaeaef89771 100644 +index bcd7689e9d68ef8b171c327188174334c4271e21..f69180acb87644f109aa91b871e347f1b1835f53 100644 --- a/browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs +++ b/browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs -@@ -937,6 +937,7 @@ export class AsyncTabSwitcher { - return !( +@@ -938,6 +938,7 @@ export class AsyncTabSwitcher { this.tabbrowser._printPreviewBrowsers.has(browser) || + this.tabbrowser.splitViewBrowsers.includes(browser) || lazy.PictureInPicture.isOriginatingBrowser(browser) + || browser?.parentNode?.parentNode?.parentNode?.classList?.contains("zen-glance-background") ); diff --git a/src/browser/components/tabbrowser/TabsList-sys-mjs.patch b/src/browser/components/tabbrowser/TabsList-sys-mjs.patch index 5ac1788da..6a7c9e503 100644 --- a/src/browser/components/tabbrowser/TabsList-sys-mjs.patch +++ b/src/browser/components/tabbrowser/TabsList-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/tabbrowser/TabsList.sys.mjs b/browser/components/tabbrowser/TabsList.sys.mjs -index 20a543dede6bf4428c8af19c5d0589788ddd8eaa..27a378e70f5b280b720c95ba8dac2cc4e88985be 100644 +index b394a980869d5e5df01b6afdd81e0f41c090e6ec..236c99db0dfa5ebcba50d55c1e4eb6ab7b8110b2 100644 --- a/browser/components/tabbrowser/TabsList.sys.mjs +++ b/browser/components/tabbrowser/TabsList.sys.mjs @@ -87,7 +87,7 @@ class TabsListBase { diff --git a/src/browser/components/tabbrowser/content/browser-ctrlTab-js.patch b/src/browser/components/tabbrowser/content/browser-ctrlTab-js.patch index cb6c9b42f..af58c3dd3 100644 --- a/src/browser/components/tabbrowser/content/browser-ctrlTab-js.patch +++ b/src/browser/components/tabbrowser/content/browser-ctrlTab-js.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/tabbrowser/content/browser-ctrlTab.js b/browser/components/tabbrowser/content/browser-ctrlTab.js -index 22db482e62e754135d8a6cf824914a3e3e06c45c..bdc18d575b33e788f9628b4cb648d5c3e8781666 100644 +index 958728cde19dd7cc24692baa89e11fcab816ab82..32e2b6af2536133f170bd5e14c47392ded8440eb 100644 --- a/browser/components/tabbrowser/content/browser-ctrlTab.js +++ b/browser/components/tabbrowser/content/browser-ctrlTab.js -@@ -252,7 +252,8 @@ var ctrlTab = { +@@ -249,7 +249,8 @@ var ctrlTab = { }, get tabList() { @@ -12,7 +12,7 @@ index 22db482e62e754135d8a6cf824914a3e3e06c45c..bdc18d575b33e788f9628b4cb648d5c3 }, init: function ctrlTab_init() { -@@ -463,7 +464,7 @@ var ctrlTab = { +@@ -460,7 +461,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 22db482e62e754135d8a6cf824914a3e3e06c45c..bdc18d575b33e788f9628b4cb648d5c3 return; } -@@ -487,7 +488,7 @@ var ctrlTab = { +@@ -484,7 +485,7 @@ var ctrlTab = { }, open: function ctrlTab_open() { @@ -30,7 +30,7 @@ index 22db482e62e754135d8a6cf824914a3e3e06c45c..bdc18d575b33e788f9628b4cb648d5c3 return; } -@@ -765,7 +766,7 @@ var ctrlTab = { +@@ -763,7 +764,7 @@ var ctrlTab = { _initRecentlyUsedTabs() { this._recentlyUsedTabs = Array.prototype.filter.call( gBrowser.tabs, diff --git a/src/browser/components/tabbrowser/content/drag-and-drop-js.patch b/src/browser/components/tabbrowser/content/drag-and-drop-js.patch new file mode 100644 index 000000000..7e4ed9cf2 --- /dev/null +++ b/src/browser/components/tabbrowser/content/drag-and-drop-js.patch @@ -0,0 +1,439 @@ +diff --git a/browser/components/tabbrowser/content/drag-and-drop.js b/browser/components/tabbrowser/content/drag-and-drop.js +index c97c661656868bc7faaf7c66c9702eea056aafe1..aa9f0ed071e4898cac2b98a4d81e95df6a41b8dd 100644 +--- a/browser/components/tabbrowser/content/drag-and-drop.js ++++ b/browser/components/tabbrowser/content/drag-and-drop.js +@@ -32,6 +32,9 @@ + * @returns {MozTabbrowserTab|vbox} + */ + const elementToMove = element => { ++ if (element.group?.hasAttribute("split-view-group")) { ++ return element.group; ++ } + if (isTab(element)) { + return element; + } +@@ -118,6 +121,10 @@ + } + + 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 && +@@ -272,6 +279,18 @@ + + this.#tabDropIndicator.hidden = true; + event.stopPropagation(); ++ if (draggedTab?.hasAttribute("zen-has-splitted")) { ++ draggedTab.removeAttribute("zen-has-splitted"); ++ draggedTab._visuallySelected = false; ++ } ++ if (draggedTab && dropEffect == "move") { ++ let moved = gZenPinnedTabManager.moveToAnotherTabContainerIfNecessary(event, movingTabs); ++ ++ if (moved) { ++ this.finishMoveTogetherSelectedTabs(draggedTab); ++ return; ++ } ++ } + if (draggedTab && dropEffect == "copy") { + let duplicatedDraggedTab; + let duplicatedTabs = []; +@@ -297,8 +316,9 @@ + let translateOffsetY = oldTranslateY % tabHeight; + let newTranslateX = oldTranslateX - translateOffsetX; + let newTranslateY = oldTranslateY - translateOffsetY; +- 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"); + + if (this.#isContainerVerticalPinnedGrid(draggedTab)) { + // Update both translate axis for pinned vertical expanded tabs +@@ -314,8 +334,8 @@ + } + } else { + let tabs = this.#tabbrowserTabs.ariaFocusableItems.slice( +- isPinned ? 0 : numPinned, +- isPinned ? numPinned : undefined ++ isPinned ? (essential ? 0 : gBrowser._numZenEssentials) : numPinned, ++ isPinned ? (essential ? gBrowser._numZenEssentials : numPinned) : undefined + ); + let size = this.#tabbrowserTabs.verticalMode ? "height" : "width"; + let screenAxis = this.#tabbrowserTabs.verticalMode +@@ -368,11 +388,13 @@ + this.#dragToPinPromoCard, + ]; + let shouldPin = ++ false && + isTab(draggedTab) && + !draggedTab.pinned && + (overPinnedDropIndicator || + dragToPinTargets.some(el => el.contains(event.target))); + let shouldUnpin = ++ false && + isTab(draggedTab) && + draggedTab.pinned && + this.#tabbrowserTabs.arrowScrollbox.contains(event.target); +@@ -390,6 +412,7 @@ + (oldTranslateY && oldTranslateY != newTranslateY); + } else if (this.#tabbrowserTabs.verticalMode) { + shouldTranslate &&= oldTranslateY && oldTranslateY != newTranslateY; ++ shouldTranslate = false; + } else { + shouldTranslate &&= oldTranslateX && oldTranslateX != newTranslateX; + } +@@ -446,7 +469,7 @@ + item.removeAttribute("tabdrop-samewindow"); + resolve(); + }; +- if (gReduceMotion) { ++ if (true || gReduceMotion) { + postTransitionCleanup(); + } else { + let onTransitionEnd = transitionendEvent => { +@@ -586,6 +609,7 @@ + + let nextItem = this.#tabbrowserTabs.ariaFocusableItems[newIndex]; + let tabGroup = isTab(nextItem) && nextItem.group; ++ if (gZenViewSplitter.handleTabDrop(event, urls, replace, inBackground)) return; + gBrowser.loadTabs(urls, { + inBackground, + replace, +@@ -623,7 +647,16 @@ + this.#expandGroupOnDrop(draggedTab); + } + this.#resetTabsAfterDrop(draggedTab.ownerDocument); +- ++ if (!dt.mozUserCancelled && dt.dropEffect == "none" && !this._isCustomizing) { ++ const moved = gZenViewSplitter.moveTabToSplitView(event, draggedTab); ++ if (moved) { ++ delete draggedTab._dragData; ++ return; ++ } ++ } else if (dt.mozUserCancelled) { ++ gZenViewSplitter.onBrowserDragEndToSplit(event, true); ++ if (gZenViewSplitter._lastOpenedTab) gZenViewSplitter._lastOpenedTab._visuallySelected = false; ++ } + if ( + dt.mozUserCancelled || + dt.dropEffect != "none" || +@@ -827,7 +860,10 @@ + #getDragTarget(event, { ignoreSides = false } = {}) { + let { target } = event; + while (target) { +- if (isTab(target) || isTabGroupLabel(target)) { ++ if (isTab(target) || isTabGroupLabel(target) || target?.classList?.contains("tab-group-label-container")) { ++ if (target.classList?.contains("tab-group-label-container")) { ++ target = target.querySelector(".tab-group-label"); ++ } + break; + } + target = target.parentNode; +@@ -844,14 +880,17 @@ + return null; + } + } ++ if (target?.group?.hasAttribute("split-view-group")) { ++ target = target.group.labelElement; ++ } + return target; + } + + #isContainerVerticalPinnedGrid(tab) { + return ( + this.#tabbrowserTabs.verticalMode && +- tab.pinned && +- this.#tabbrowserTabs.hasAttribute("expanded") && ++ (tab.hasAttribute("zen-essential")) && ++ (this.hasAttribute("expanded") || document.documentElement.hasAttribute("zen-sidebar-expanded")) && + !this.#tabbrowserTabs.expandOnHover + ); + } +@@ -882,7 +921,8 @@ + isTabGroupLabel(draggedTab) && + draggedTab._dragData?.expandGroupOnDrop + ) { +- draggedTab.group.collapsed = false; ++ draggedTab.group.collapsed = draggedTab.group.hasAttribute("has-active"); ++ gZenFolders.animateGroupMove(draggedTab.group, true); + } + } + +@@ -947,10 +987,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( +@@ -1117,7 +1154,7 @@ + let dropEffect = this.getDropEffectForTabDrag(event); + let isMovingInTabStrip = !fromTabList && dropEffect == "move"; + let collapseTabGroupDuringDrag = +- isMovingInTabStrip && isTabGroupLabel(tab) && !tab.group.collapsed; ++ isMovingInTabStrip && isTabGroupLabel(tab) && (!tab.group.collapsed || tab.group.hasAttribute("has-active")); + + tab._dragData = { + offsetX: this.#tabbrowserTabs.verticalMode +@@ -1127,7 +1164,7 @@ + ? event.screenY - window.screenY - tabOffset + : event.screenY - window.screenY, + scrollPos: +- this.#tabbrowserTabs.verticalMode && tab.pinned ++ this.#tabbrowserTabs.verticalMode && tab.pinned && false + ? this.#tabbrowserTabs.pinnedTabsContainer.scrollPosition + : this.#tabbrowserTabs.arrowScrollbox.scrollPosition, + screenX: event.screenX, +@@ -1156,6 +1193,7 @@ + + if (collapseTabGroupDuringDrag) { + tab.group.collapsed = true; ++ gZenFolders.animateGroupMove(tab.group); + } + } + } +@@ -1174,6 +1212,16 @@ + when the tab is first selected to be dragged. + */ + #updateTabStylesOnDrag(tab) { ++ 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 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) { + this.#resetGroupTarget(item); +@@ -2457,7 +2531,7 @@ + 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.left = ""; + label.style.top = ""; + label.style.maxWidth = ""; +- label.removeAttribute("dragtarget"); ++ label.removeAttribute("zen-dragtarget"); + } + let periphery = draggedTabDocument.getElementById( + "tabbrowser-arrowscrollbox-periphery" diff --git a/src/browser/components/tabbrowser/content/tab-js.patch b/src/browser/components/tabbrowser/content/tab-js.patch index 997098854..3452bced0 100644 --- a/src/browser/components/tabbrowser/content/tab-js.patch +++ b/src/browser/components/tabbrowser/content/tab-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/tabbrowser/content/tab.js b/browser/components/tabbrowser/content/tab.js -index 425aaf8c8e4adf1507eb0d8ded671f8295544b04..12988986c4cf00990c1d1b2e4be362efc001afdd 100644 +index 4c1a48424316b29d27ae2bc8b64004df41c87bb6..f1ff9bf0947127a8e9115357cedac577b5fad08c 100644 --- a/browser/components/tabbrowser/content/tab.js +++ b/browser/components/tabbrowser/content/tab.js @@ -21,6 +21,7 @@ @@ -42,7 +42,7 @@ index 425aaf8c8e4adf1507eb0d8ded671f8295544b04..12988986c4cf00990c1d1b2e4be362ef ".tab-label-container": "pinned,selected=visuallyselected,labeldirection", ".tab-label": -@@ -184,7 +187,7 @@ +@@ -186,7 +189,7 @@ } set _visuallySelected(val) { @@ -51,7 +51,7 @@ index 425aaf8c8e4adf1507eb0d8ded671f8295544b04..12988986c4cf00990c1d1b2e4be362ef return; } -@@ -220,11 +223,21 @@ +@@ -222,11 +225,21 @@ } get visible() { @@ -78,7 +78,7 @@ index 425aaf8c8e4adf1507eb0d8ded671f8295544b04..12988986c4cf00990c1d1b2e4be362ef } get hidden() { -@@ -295,7 +308,7 @@ +@@ -297,7 +310,7 @@ return false; } @@ -87,7 +87,7 @@ index 425aaf8c8e4adf1507eb0d8ded671f8295544b04..12988986c4cf00990c1d1b2e4be362ef } get lastAccessed() { -@@ -372,8 +385,11 @@ +@@ -374,8 +387,11 @@ } get group() { @@ -101,7 +101,7 @@ index 425aaf8c8e4adf1507eb0d8ded671f8295544b04..12988986c4cf00990c1d1b2e4be362ef } return null; } -@@ -468,6 +484,8 @@ +@@ -470,6 +486,8 @@ this.style.MozUserFocus = "ignore"; } else if ( event.target.classList.contains("tab-close-button") || @@ -110,7 +110,7 @@ index 425aaf8c8e4adf1507eb0d8ded671f8295544b04..12988986c4cf00990c1d1b2e4be362ef event.target.classList.contains("tab-icon-overlay") || event.target.classList.contains("tab-audio-button") ) { -@@ -522,6 +540,10 @@ +@@ -524,6 +542,10 @@ this.style.MozUserFocus = ""; } @@ -121,7 +121,7 @@ index 425aaf8c8e4adf1507eb0d8ded671f8295544b04..12988986c4cf00990c1d1b2e4be362ef on_click(event) { if (event.button != 0) { return; -@@ -570,6 +592,7 @@ +@@ -572,6 +594,7 @@ ) ); } else { @@ -129,7 +129,7 @@ index 425aaf8c8e4adf1507eb0d8ded671f8295544b04..12988986c4cf00990c1d1b2e4be362ef gBrowser.removeTab(this, { animate: true, triggeringEvent: event, -@@ -582,6 +605,14 @@ +@@ -584,6 +607,14 @@ // (see tabbrowser-tabs 'click' handler). gBrowser.tabContainer._blockDblClick = true; } @@ -144,7 +144,7 @@ index 425aaf8c8e4adf1507eb0d8ded671f8295544b04..12988986c4cf00990c1d1b2e4be362ef } on_dblclick(event) { -@@ -605,6 +636,8 @@ +@@ -607,6 +638,8 @@ animate: true, triggeringEvent: event, }); diff --git a/src/browser/components/tabbrowser/content/tabbrowser-js.patch b/src/browser/components/tabbrowser/content/tabbrowser-js.patch index 11561149a..407e111dc 100644 --- a/src/browser/components/tabbrowser/content/tabbrowser-js.patch +++ b/src/browser/components/tabbrowser/content/tabbrowser-js.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js -index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394b7dbc6a7 100644 +index c0eafd4faf8d57b8486c5bf8917375850ec8147e..326bf96d9346aba7096d518fbf63cc349868d0d0 100644 --- a/browser/components/tabbrowser/content/tabbrowser.js +++ b/browser/components/tabbrowser/content/tabbrowser.js -@@ -432,15 +432,64 @@ +@@ -450,15 +450,64 @@ return this.tabContainer.visibleTabs; } @@ -69,7 +69,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 set selectedTab(val) { if ( gSharedTabWarning.willShowSharedTabWarning(val) || -@@ -588,6 +637,7 @@ +@@ -613,6 +662,7 @@ this.tabpanels.appendChild(panel); let tab = this.tabs[0]; @@ -77,7 +77,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 tab.linkedPanel = uniqueId; this._selectedTab = tab; this._selectedBrowser = browser; -@@ -873,13 +923,17 @@ +@@ -898,13 +948,17 @@ } this.showTab(aTab); @@ -96,7 +96,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 aTab.setAttribute("pinned", "true"); this._updateTabBarForPinnedTabs(); -@@ -892,11 +946,15 @@ +@@ -917,11 +971,15 @@ } this.#handleTabMove(aTab, () => { @@ -113,7 +113,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 }); aTab.style.marginInlineStart = ""; -@@ -1073,6 +1131,8 @@ +@@ -1098,6 +1156,8 @@ let LOCAL_PROTOCOLS = ["chrome:", "about:", "resource:", "data:"]; @@ -122,7 +122,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 if ( aIconURL && !LOCAL_PROTOCOLS.some(protocol => aIconURL.startsWith(protocol)) -@@ -1082,6 +1142,9 @@ +@@ -1107,6 +1167,9 @@ ); return; } @@ -132,7 +132,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 let browser = this.getBrowserForTab(aTab); browser.mIconURL = aIconURL; -@@ -1445,6 +1508,7 @@ +@@ -1470,6 +1533,7 @@ if (!this._previewMode) { newTab.recordTimeFromUnloadToReload(); newTab.updateLastAccessed(); @@ -140,7 +140,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 oldTab.updateLastAccessed(); // if this is the foreground window, update the last-seen timestamps. if (this.ownerGlobal == BrowserWindowTracker.getTopWindow()) { -@@ -1597,6 +1661,9 @@ +@@ -1622,6 +1686,9 @@ } let activeEl = document.activeElement; @@ -150,7 +150,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 // If focus is on the old tab, move it to the new tab. if (activeEl == oldTab) { newTab.focus(); -@@ -1920,7 +1987,8 @@ +@@ -1945,7 +2012,8 @@ } _setTabLabel(aTab, aLabel, { beforeTabOpen, isContentTitle, isURL } = {}) { @@ -160,7 +160,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 return false; } -@@ -2028,7 +2096,7 @@ +@@ -2053,7 +2121,7 @@ newIndex = this.selectedTab._tPos + 1; } @@ -169,7 +169,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 if (this.isTabGroupLabel(targetTab)) { throw new Error( "Replacing a tab group label with a tab is not supported" -@@ -2303,6 +2371,7 @@ +@@ -2328,6 +2396,7 @@ uriIsAboutBlank, userContextId, skipLoad, @@ -177,7 +177,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 } = {}) { let b = document.createXULElement("browser"); // Use the JSM global to create the permanentKey, so that if the -@@ -2376,8 +2445,7 @@ +@@ -2401,8 +2470,7 @@ // we use a different attribute name for this? b.setAttribute("name", name); } @@ -187,7 +187,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 b.setAttribute("transparent", "true"); } -@@ -2542,7 +2610,7 @@ +@@ -2567,7 +2635,7 @@ let panel = this.getPanel(browser); let uniqueId = this._generateUniquePanelID(); @@ -196,7 +196,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 aTab.linkedPanel = uniqueId; // Inject the into the DOM if necessary. -@@ -2601,8 +2669,8 @@ +@@ -2626,8 +2694,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) { @@ -207,7 +207,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 } else { aTab.linkedBrowser.browsingContext.hasSiblings = this.tabs.length > 1; } -@@ -2779,7 +2847,6 @@ +@@ -2814,7 +2882,6 @@ this.selectedTab = this.addTrustedTab(BROWSER_NEW_TAB_URL, { tabIndex: tab._tPos + 1, userContextId: tab.userContextId, @@ -215,7 +215,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 focusUrlBar: true, }); resolve(this.selectedBrowser); -@@ -2859,6 +2926,8 @@ +@@ -2923,6 +2990,8 @@ schemelessInput, hasValidUserGestureActivation = false, textDirectiveUserActivation = false, @@ -224,7 +224,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 } = {} ) { // all callers of addTab that pass a params object need to pass -@@ -2869,6 +2938,12 @@ +@@ -2933,6 +3002,12 @@ ); } @@ -237,7 +237,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 if (!UserInteraction.running("browser.tabs.opening", window)) { UserInteraction.start("browser.tabs.opening", "initting", window); } -@@ -2932,6 +3007,19 @@ +@@ -2996,6 +3071,19 @@ noInitialLabel, skipBackgroundNotify, }); @@ -257,7 +257,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 if (insertTab) { // Insert the tab into the tab container in the correct position. this.#insertTabAtIndex(t, { -@@ -2940,6 +3028,7 @@ +@@ -3004,6 +3092,7 @@ ownerTab, openerTab, pinned, @@ -265,7 +265,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 bulkOrderedOpen, tabGroup: tabGroup ?? openerTab?.group, }); -@@ -2958,6 +3047,7 @@ +@@ -3022,6 +3111,7 @@ openWindowInfo, skipLoad, triggeringRemoteType, @@ -273,7 +273,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 })); if (focusUrlBar) { -@@ -3078,6 +3168,12 @@ +@@ -3146,6 +3236,12 @@ } } @@ -286,7 +286,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 // Additionally send pinned tab events if (pinned) { this.#notifyPinnedStatus(t); -@@ -3248,10 +3344,10 @@ +@@ -3330,10 +3426,10 @@ isAdoptingGroup = false, isUserTriggered = false, telemetryUserCreateSource = "unknown", @@ -298,7 +298,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 } if (!color) { -@@ -3272,9 +3368,14 @@ +@@ -3354,9 +3450,14 @@ label, isAdoptingGroup ); @@ -315,7 +315,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 ); group.addTabs(tabs); -@@ -3395,7 +3496,7 @@ +@@ -3477,7 +3578,7 @@ } this.#handleTabMove(tab, () => @@ -324,7 +324,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 ); } -@@ -3597,6 +3698,7 @@ +@@ -3679,6 +3780,7 @@ openWindowInfo, skipLoad, triggeringRemoteType, @@ -332,7 +332,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 } ) { // If we don't have a preferred remote type (or it is `NOT_REMOTE`), and -@@ -3666,6 +3768,7 @@ +@@ -3748,6 +3850,7 @@ openWindowInfo, name, skipLoad, @@ -340,7 +340,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 }); } -@@ -3853,7 +3956,7 @@ +@@ -3935,7 +4038,7 @@ // Add a new tab if needed. if (!tab) { let createLazyBrowser = @@ -349,7 +349,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 let url = "about:blank"; if (tabData.entries?.length) { -@@ -3890,8 +3993,10 @@ +@@ -3972,8 +4075,10 @@ insertTab: false, skipLoad: true, preferredRemoteType, @@ -361,7 +361,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 if (select) { tabToSelect = tab; } -@@ -3903,7 +4008,8 @@ +@@ -3985,7 +4090,8 @@ this.pinTab(tab); // Then ensure all the tab open/pinning information is sent. this._fireTabOpen(tab, {}); @@ -371,7 +371,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 let { groupId } = tabData; const tabGroup = tabGroupWorkingData.get(groupId); // if a tab refers to a tab group we don't know, skip any group -@@ -3917,7 +4023,10 @@ +@@ -3999,7 +4105,10 @@ tabGroup.stateData.id, tabGroup.stateData.color, tabGroup.stateData.collapsed, @@ -383,7 +383,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 ); tabsFragment.appendChild(tabGroup.node); } -@@ -3962,9 +4071,23 @@ +@@ -4044,9 +4153,23 @@ // to remove the old selected tab. if (tabToSelect) { let leftoverTab = this.selectedTab; @@ -407,7 +407,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 if (tabs.length > 1 || !tabs[0].selected) { this._updateTabsAfterInsert(); -@@ -4155,11 +4278,14 @@ +@@ -4237,11 +4360,14 @@ if (ownerTab) { tab.owner = ownerTab; } @@ -423,7 +423,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 if ( !bulkOrderedOpen && ((openerTab && -@@ -4171,7 +4297,7 @@ +@@ -4253,7 +4379,7 @@ let lastRelatedTab = openerTab && this._lastRelatedTabMap.get(openerTab); let previousTab = lastRelatedTab || openerTab || this.selectedTab; @@ -432,7 +432,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 tabGroup = previousTab.group; } if ( -@@ -4182,7 +4308,7 @@ +@@ -4264,7 +4390,7 @@ ) { elementIndex = Infinity; } else if (previousTab.visible) { @@ -441,7 +441,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 } else if (previousTab == FirefoxViewHandler.tab) { elementIndex = 0; } -@@ -4210,14 +4336,14 @@ +@@ -4292,14 +4418,14 @@ } // Ensure index is within bounds. if (tab.pinned) { @@ -460,7 +460,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 if (pinned && !itemAfter?.pinned) { itemAfter = null; -@@ -4228,7 +4354,7 @@ +@@ -4310,7 +4436,7 @@ this.tabContainer._invalidateCachedTabs(); @@ -469,7 +469,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 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); -@@ -4264,6 +4390,7 @@ +@@ -4346,6 +4472,7 @@ if (pinned) { this._updateTabBarForPinnedTabs(); } @@ -477,7 +477,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 TabBarVisibility.update(); } -@@ -4553,6 +4680,9 @@ +@@ -4635,6 +4762,9 @@ return; } @@ -487,7 +487,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 this.removeTabs(selectedTabs, { isUserTriggered, telemetrySource }); } -@@ -4814,6 +4944,7 @@ +@@ -4896,6 +5026,7 @@ telemetrySource, } = {} ) { @@ -495,7 +495,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 // When 'closeWindowWithLastTab' pref is enabled, closing all tabs // can be considered equivalent to closing the window. if ( -@@ -4903,6 +5034,7 @@ +@@ -4985,6 +5116,7 @@ if (lastToClose) { this.removeTab(lastToClose, aParams); } @@ -503,7 +503,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 } catch (e) { console.error(e); } -@@ -4941,6 +5073,12 @@ +@@ -5023,6 +5155,12 @@ aTab._closeTimeNoAnimTimerId = Glean.browserTabclose.timeNoAnim.start(); } @@ -516,7 +516,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 // Handle requests for synchronously removing an already // asynchronously closing tab. if (!animate && aTab.closing) { -@@ -4955,6 +5093,9 @@ +@@ -5037,6 +5175,9 @@ // state). let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width; let isLastTab = this.#isLastTabInWindow(aTab); @@ -526,7 +526,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 if ( !this._beginRemoveTab(aTab, { closeWindowFastpath: true, -@@ -5003,7 +5144,13 @@ +@@ -5085,7 +5226,13 @@ // We're not animating, so we can cancel the animation stopwatch. Glean.browserTabclose.timeAnim.cancel(aTab._closeTimeAnimTimerId); aTab._closeTimeAnimTimerId = null; @@ -541,7 +541,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 return; } -@@ -5137,7 +5284,7 @@ +@@ -5219,7 +5366,7 @@ closeWindowWithLastTab != null ? closeWindowWithLastTab : !window.toolbar.visible || @@ -550,7 +550,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 if (closeWindow) { // We've already called beforeunload on all the relevant tabs if we get here, -@@ -5161,6 +5308,7 @@ +@@ -5243,6 +5390,7 @@ newTab = true; } @@ -558,7 +558,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 aTab._endRemoveArgs = [closeWindow, newTab]; // swapBrowsersAndCloseOther will take care of closing the window without animation. -@@ -5201,13 +5349,7 @@ +@@ -5283,13 +5431,7 @@ aTab._mouseleave(); if (newTab) { @@ -573,7 +573,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 } else { TabBarVisibility.update(); } -@@ -5340,6 +5482,7 @@ +@@ -5422,6 +5564,7 @@ this.tabs[i]._tPos = i; } @@ -581,7 +581,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 if (!this._windowIsClosing) { // update tab close buttons state this.tabContainer._updateCloseButtons(); -@@ -5552,6 +5695,7 @@ +@@ -5643,6 +5786,7 @@ } let excludeTabs = new Set(aExcludeTabs); @@ -589,7 +589,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 // If this tab has a successor, it should be selectable, since // hiding or closing a tab removes that tab as a successor. -@@ -5564,13 +5708,13 @@ +@@ -5655,13 +5799,13 @@ !excludeTabs.has(aTab.owner) && Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose") ) { @@ -605,7 +605,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 ); let tab = this.tabContainer.findNextTab(aTab, { -@@ -5586,7 +5730,7 @@ +@@ -5677,7 +5821,7 @@ } if (tab) { @@ -614,7 +614,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 } // If no qualifying visible tab was found, see if there is a tab in -@@ -5607,7 +5751,7 @@ +@@ -5698,7 +5842,7 @@ }); } @@ -623,7 +623,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 } _blurTab(aTab) { -@@ -6013,10 +6157,10 @@ +@@ -6104,10 +6248,10 @@ SessionStore.deleteCustomTabValue(aTab, "hiddenBy"); } @@ -636,7 +636,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 aTab.selected || aTab.closing || // Tabs that are sharing the screen, microphone or camera cannot be hidden. -@@ -6075,6 +6219,7 @@ +@@ -6166,6 +6310,7 @@ * @param {MozTabbrowserTab|MozTabbrowserTabGroup|MozTabbrowserTabGroup.labelElement} aTab */ replaceTabWithWindow(aTab, aOptions) { @@ -644,7 +644,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 if (this.tabs.length == 1) { return null; } -@@ -6208,7 +6353,7 @@ +@@ -6299,7 +6444,7 @@ * `true` if element is a `` */ isTabGroup(element) { @@ -653,7 +653,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 } /** -@@ -6284,8 +6429,8 @@ +@@ -6375,8 +6520,8 @@ } // Don't allow mixing pinned and unpinned tabs. @@ -664,7 +664,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 } else { tabIndex = Math.max(tabIndex, this.pinnedTabCount); } -@@ -6311,10 +6456,16 @@ +@@ -6402,10 +6547,16 @@ this.#handleTabMove( element, () => { @@ -683,7 +683,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 if (neighbor && this.isTab(element) && tabIndex > element._tPos) { neighbor.after(element); } else { -@@ -6372,23 +6523,28 @@ +@@ -6463,23 +6614,28 @@ #moveTabNextTo(element, targetElement, moveBefore = false, metricsContext) { if (this.isTabGroupLabel(targetElement)) { targetElement = targetElement.group; @@ -718,7 +718,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 } 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 -@@ -6401,14 +6557,34 @@ +@@ -6492,14 +6648,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. @@ -754,7 +754,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 element.pinned ? this.tabContainer.pinnedTabsContainer : this.tabContainer; -@@ -6417,7 +6593,7 @@ +@@ -6508,7 +6684,7 @@ element, () => { if (moveBefore) { @@ -763,7 +763,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 } else if (targetElement) { targetElement.after(element); } else { -@@ -6489,10 +6665,10 @@ +@@ -6580,10 +6756,10 @@ * @param {TabMetricsContext} [metricsContext] */ moveTabToGroup(aTab, aGroup, metricsContext) { @@ -776,7 +776,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 return; } if (aTab.group && aTab.group.id === aGroup.id) { -@@ -6522,6 +6698,7 @@ +@@ -6613,6 +6789,7 @@ let state = { tabIndex: tab._tPos, @@ -784,7 +784,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 }; if (tab.visible) { state.elementIndex = tab.elementIndex; -@@ -6548,7 +6725,7 @@ +@@ -6639,7 +6816,7 @@ let changedTabGroup = previousTabState.tabGroupId != currentTabState.tabGroupId; @@ -793,7 +793,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 tab.dispatchEvent( new CustomEvent("TabMove", { bubbles: true, -@@ -6585,6 +6762,10 @@ +@@ -6676,6 +6853,10 @@ moveActionCallback(); @@ -804,7 +804,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 // Clear tabs cache after moving nodes because the order of tabs may have // changed. this.tabContainer._invalidateCachedTabs(); -@@ -7486,7 +7667,7 @@ +@@ -7576,7 +7757,7 @@ // preventDefault(). It will still raise the window if appropriate. break; } @@ -813,7 +813,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 window.focus(); aEvent.preventDefault(); break; -@@ -7501,7 +7682,6 @@ +@@ -7593,7 +7774,6 @@ } case "TabGroupCollapse": aEvent.target.tabs.forEach(tab => { @@ -821,7 +821,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 }); break; case "TabGroupCreateByUser": -@@ -8442,6 +8622,7 @@ +@@ -8542,6 +8722,7 @@ aWebProgress.isTopLevel ) { this.mTab.setAttribute("busy", "true"); @@ -829,7 +829,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 gBrowser._tabAttrModified(this.mTab, ["busy"]); this.mTab._notselectedsinceload = !this.mTab.selected; } -@@ -9443,7 +9624,7 @@ var TabContextMenu = { +@@ -9543,7 +9724,7 @@ var TabContextMenu = { ); contextUnpinSelectedTabs.hidden = !this.contextTab.pinned || !this.multiselected; @@ -838,7 +838,7 @@ index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394 // Build Ask Chat items TabContextMenu.GenAI.buildTabMenu( document.getElementById("context_askChat"), -@@ -9763,6 +9944,7 @@ var TabContextMenu = { +@@ -9863,6 +10044,7 @@ var TabContextMenu = { ) ); } else { diff --git a/src/browser/components/tabbrowser/content/tabgroup-js.patch b/src/browser/components/tabbrowser/content/tabgroup-js.patch index 2c3e80263..49d3342cf 100644 --- a/src/browser/components/tabbrowser/content/tabgroup-js.patch +++ b/src/browser/components/tabbrowser/content/tabgroup-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/tabbrowser/content/tabgroup.js b/browser/components/tabbrowser/content/tabgroup.js -index 1b4f6bf4ed6556492f84476d33e9103fbb1c74e9..77bd8738db6f2e65c2bfcae8347b424098ba3e7b 100644 +index aa8b22c558f9dbc0b0b1e63993477b9126fb6821..feb90bb75b78e2513362679a5b5da41fbf97ac20 100644 --- a/browser/components/tabbrowser/content/tabgroup.js +++ b/browser/components/tabbrowser/content/tabgroup.js @@ -14,11 +14,11 @@ @@ -77,8 +77,8 @@ index 1b4f6bf4ed6556492f84476d33e9103fbb1c74e9..77bd8738db6f2e65c2bfcae8347b4240 + }; this.#updateLabelAriaAttributes(); - this.#updateCollapsedAriaAttributes(); -@@ -144,6 +163,8 @@ + +@@ -143,6 +162,8 @@ // mounts after getting created by `Tabbrowser.adoptTabGroup`. this.#wasCreatedByAdoption = false; } @@ -87,7 +87,7 @@ index 1b4f6bf4ed6556492f84476d33e9103fbb1c74e9..77bd8738db6f2e65c2bfcae8347b4240 resetDefaultGroupName = () => { this.#defaultGroupName = ""; -@@ -228,7 +249,10 @@ +@@ -227,7 +248,10 @@ } }); } @@ -99,7 +99,7 @@ index 1b4f6bf4ed6556492f84476d33e9103fbb1c74e9..77bd8738db6f2e65c2bfcae8347b4240 } get color() { -@@ -322,6 +346,9 @@ +@@ -321,6 +345,9 @@ } set collapsed(val) { @@ -109,7 +109,7 @@ index 1b4f6bf4ed6556492f84476d33e9103fbb1c74e9..77bd8738db6f2e65c2bfcae8347b4240 if (!!val == this.collapsed) { return; } -@@ -399,7 +426,6 @@ +@@ -406,7 +433,6 @@ tabGroupName, }) .then(result => { @@ -117,7 +117,7 @@ index 1b4f6bf4ed6556492f84476d33e9103fbb1c74e9..77bd8738db6f2e65c2bfcae8347b4240 }); } -@@ -418,7 +444,57 @@ +@@ -425,7 +451,57 @@ * @returns {MozTabbrowserTab[]} */ get tabs() { @@ -176,7 +176,7 @@ index 1b4f6bf4ed6556492f84476d33e9103fbb1c74e9..77bd8738db6f2e65c2bfcae8347b4240 } /** -@@ -498,7 +574,6 @@ +@@ -506,7 +582,6 @@ addTabs(tabs, metricsContext) { for (let tab of tabs) { if (tab.pinned) { @@ -184,7 +184,7 @@ index 1b4f6bf4ed6556492f84476d33e9103fbb1c74e9..77bd8738db6f2e65c2bfcae8347b4240 } let tabToMove = this.ownerGlobal === tab.ownerGlobal -@@ -561,7 +636,7 @@ +@@ -569,7 +644,7 @@ */ on_click(event) { let isToggleElement = @@ -193,7 +193,7 @@ index 1b4f6bf4ed6556492f84476d33e9103fbb1c74e9..77bd8738db6f2e65c2bfcae8347b4240 event.target === this.#overflowCountLabel; if (isToggleElement && event.button === 0) { event.preventDefault(); -@@ -630,5 +705,6 @@ +@@ -638,5 +713,6 @@ } } diff --git a/src/browser/components/tabbrowser/content/tabs-js.patch b/src/browser/components/tabbrowser/content/tabs-js.patch index ec1bebfc1..b8834ec23 100644 --- a/src/browser/components/tabbrowser/content/tabs-js.patch +++ b/src/browser/components/tabbrowser/content/tabs-js.patch @@ -1,18 +1,8 @@ diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js -index 1425607ef87d6c28fb676e722617edfb51ba12a1..97cdeaf7cde41f39d70bd50ac8ca78bec02d253a 100644 +index 258b9627aaa8a1d26e8aeb987a0b4c67bc1b7abc..6d334761033a0654f28fd417193d2ac2a736d9f8 100644 --- a/browser/components/tabbrowser/content/tabs.js +++ b/browser/components/tabbrowser/content/tabs.js -@@ -44,6 +44,9 @@ - * @returns {MozTabbrowserTab|vbox} - */ - const elementToMove = element => { -+ if (element.group?.hasAttribute("split-view-group")) { -+ return element.group; -+ } - if (isTab(element)) { - return element; - } -@@ -423,7 +426,7 @@ +@@ -411,7 +411,7 @@ // and we're not hitting the scroll buttons. if ( event.button != 0 || @@ -21,7 +11,7 @@ index 1425607ef87d6c28fb676e722617edfb51ba12a1..97cdeaf7cde41f39d70bd50ac8ca78be event.composedTarget.localName == "toolbarbutton" ) { return; -@@ -504,7 +507,6 @@ +@@ -492,7 +492,6 @@ }); } } else if (isTabGroupLabel(event.target)) { @@ -29,7 +19,7 @@ index 1425607ef87d6c28fb676e722617edfb51ba12a1..97cdeaf7cde41f39d70bd50ac8ca78be } else if ( event.originalTarget.closest("scrollbox") && !Services.prefs.getBoolPref( -@@ -540,6 +542,9 @@ +@@ -528,6 +527,9 @@ } on_keydown(event) { @@ -39,153 +29,7 @@ index 1425607ef87d6c28fb676e722617edfb51ba12a1..97cdeaf7cde41f39d70bd50ac8ca78be let { altKey, shiftKey } = event; let [accel, nonAccel] = AppConstants.platform == "macosx" -@@ -777,7 +782,7 @@ - if (this.#isContainerVerticalPinnedGrid(tab)) { - // In expanded vertical mode, the max number of pinned tabs per row is dynamic - // Set this before adjusting dragged tab's position -- let pinnedTabs = this.visibleTabs.slice(0, gBrowser.pinnedTabCount); -+ let pinnedTabs = this.ariaFocusableItems.slice(0, gBrowser._numZenEssentials); - let tabsPerRow = 0; - let position = RTL_UI - ? window.windowUtils.getBoundsWithoutFlushing( -@@ -942,7 +947,7 @@ - let dropEffect = this.getDropEffectForTabDrag(event); - let isMovingInTabStrip = !fromTabList && dropEffect == "move"; - let collapseTabGroupDuringDrag = -- isMovingInTabStrip && isTabGroupLabel(tab) && !tab.group.collapsed; -+ isMovingInTabStrip && isTabGroupLabel(tab) && (!tab.group.collapsed || tab.group.hasAttribute("has-active")); - - tab._dragData = { - offsetX: this.verticalMode -@@ -952,7 +957,7 @@ - ? event.screenY - window.screenY - tabOffset - : event.screenY - window.screenY, - scrollPos: -- this.verticalMode && tab.pinned -+ this.verticalMode && tab.pinned && false - ? this.pinnedTabsContainer.scrollPosition - : this.arrowScrollbox.scrollPosition, - screenX: event.screenX, -@@ -981,6 +986,7 @@ - - if (collapseTabGroupDuringDrag) { - tab.group.collapsed = true; -+ gZenFolders.animateGroupMove(tab.group); - } - } - } -@@ -1027,6 +1033,10 @@ - } - - 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 && -@@ -1154,7 +1164,8 @@ - isTabGroupLabel(draggedTab) && - draggedTab._dragData?.expandGroupOnDrop - ) { -- draggedTab.group.collapsed = false; -+ draggedTab.group.collapsed = draggedTab.group.hasAttribute("has-active"); -+ gZenFolders.animateGroupMove(draggedTab.group, true); - } - } - -@@ -1208,6 +1219,18 @@ - - this._tabDropIndicator.hidden = true; - event.stopPropagation(); -+ if (draggedTab?.hasAttribute("zen-has-splitted")) { -+ draggedTab.removeAttribute("zen-has-splitted"); -+ draggedTab._visuallySelected = false; -+ } -+ if (draggedTab && dropEffect == "move") { -+ let moved = gZenPinnedTabManager.moveToAnotherTabContainerIfNecessary(event, movingTabs); -+ -+ if (moved) { -+ this.finishMoveTogetherSelectedTabs(draggedTab); -+ return; -+ } -+ } - if (draggedTab && dropEffect == "copy") { - let duplicatedDraggedTab; - let duplicatedTabs = []; -@@ -1232,8 +1255,9 @@ - let translateOffsetY = oldTranslateY % tabHeight; - let newTranslateX = oldTranslateX - translateOffsetX; - let newTranslateY = oldTranslateY - translateOffsetY; -- 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"); - - if (this.#isContainerVerticalPinnedGrid(draggedTab)) { - // Update both translate axis for pinned vertical expanded tabs -@@ -1249,8 +1273,8 @@ - } - } else { - let tabs = this.ariaFocusableItems.slice( -- isPinned ? 0 : numPinned, -- isPinned ? numPinned : undefined -+ isPinned ? (essential ? 0 : gBrowser._numZenEssentials) : numPinned, -+ isPinned ? (essential ? gBrowser._numZenEssentials : numPinned) : undefined - ); - let size = this.verticalMode ? "height" : "width"; - let screenAxis = this.verticalMode ? "screenY" : "screenX"; -@@ -1299,11 +1323,13 @@ - this.dragToPinPromoCard, - ]; - let shouldPin = -+ false && - isTab(draggedTab) && - !draggedTab.pinned && - (overPinnedDropIndicator || - dragToPinTargets.some(el => el.contains(event.target))); - let shouldUnpin = -+ false && - isTab(draggedTab) && - draggedTab.pinned && - this.arrowScrollbox.contains(event.target); -@@ -1321,6 +1347,7 @@ - (oldTranslateY && oldTranslateY != newTranslateY); - } else if (this.verticalMode) { - shouldTranslate &&= oldTranslateY && oldTranslateY != newTranslateY; -+ shouldTranslate = false; - } else { - shouldTranslate &&= oldTranslateX && oldTranslateX != newTranslateX; - } -@@ -1515,6 +1542,7 @@ - - let nextItem = this.ariaFocusableItems[newIndex]; - let tabGroup = isTab(nextItem) && nextItem.group; -+ if (gZenViewSplitter.handleTabDrop(event, urls, replace, inBackground)) return; - gBrowser.loadTabs(urls, { - inBackground, - replace, -@@ -1553,6 +1581,17 @@ - } - this.#resetTabsAfterDrop(draggedTab.ownerDocument); - -+ if (!dt.mozUserCancelled && dt.dropEffect == "none" && !this._isCustomizing) { -+ const moved = gZenViewSplitter.moveTabToSplitView(event, draggedTab); -+ if (moved) { -+ delete draggedTab._dragData; -+ return; -+ } -+ } else if (dt.mozUserCancelled) { -+ gZenViewSplitter.onBrowserDragEndToSplit(event, true); -+ if (gZenViewSplitter._lastOpenedTab) gZenViewSplitter._lastOpenedTab._visuallySelected = false; -+ } -+ - if ( - dt.mozUserCancelled || - dt.dropEffect != "none" || -@@ -1719,7 +1758,6 @@ +@@ -720,7 +722,6 @@ this.toggleAttribute("overflow", true); this._updateCloseButtons(); @@ -193,7 +37,7 @@ index 1425607ef87d6c28fb676e722617edfb51ba12a1..97cdeaf7cde41f39d70bd50ac8ca78be document .getElementById("tab-preview-panel") -@@ -1777,7 +1815,7 @@ +@@ -780,7 +781,7 @@ } get newTabButton() { @@ -202,7 +46,7 @@ index 1425607ef87d6c28fb676e722617edfb51ba12a1..97cdeaf7cde41f39d70bd50ac8ca78be } get verticalMode() { -@@ -1793,6 +1831,7 @@ +@@ -796,6 +797,7 @@ } get overflowing() { @@ -210,7 +54,7 @@ index 1425607ef87d6c28fb676e722617edfb51ba12a1..97cdeaf7cde41f39d70bd50ac8ca78be return this.hasAttribute("overflow"); } -@@ -1806,29 +1845,54 @@ +@@ -809,29 +811,54 @@ if (pinnedChildren?.at(-1)?.id == "pinned-tabs-container-periphery") { pinnedChildren.pop(); } @@ -275,7 +119,7 @@ index 1425607ef87d6c28fb676e722617edfb51ba12a1..97cdeaf7cde41f39d70bd50ac8ca78be } /** -@@ -1895,29 +1959,23 @@ +@@ -898,17 +925,10 @@ let elementIndex = 0; @@ -295,26 +139,22 @@ index 1425607ef87d6c28fb676e722617edfb51ba12a1..97cdeaf7cde41f39d70bd50ac8ca78be if (isTab(child) && child.visible) { child.elementIndex = elementIndex++; focusableItems.push(child); - } else if (isTabGroup(child)) { +@@ -916,11 +936,13 @@ child.labelElement.elementIndex = elementIndex++; focusableItems.push(child.labelElement); -- -- let visibleTabsInGroup = child.tabs.filter(tab => tab.visible); -- visibleTabsInGroup.forEach(tab => { -- tab.elementIndex = elementIndex++; -- }); -- focusableItems.push(...visibleTabsInGroup); -+ if (!child.hasAttribute("split-view-group")) { -+ let visibleTabsInGroup = child.childGroupsAndTabs.filter(tab => tab.visible); -+ visibleTabsInGroup.forEach(tab => { -+ tab.elementIndex = elementIndex++; -+ }); -+ focusableItems.push(...visibleTabsInGroup); -+ } - } - } -@@ -1929,6 +1987,7 @@ +- 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 => { +@@ -964,6 +986,7 @@ _invalidateCachedTabs() { this.#allTabs = null; this._invalidateCachedVisibleTabs(); @@ -322,18 +162,7 @@ index 1425607ef87d6c28fb676e722617edfb51ba12a1..97cdeaf7cde41f39d70bd50ac8ca78be } _invalidateCachedVisibleTabs() { -@@ -1944,8 +2003,8 @@ - #isContainerVerticalPinnedGrid(tab) { - return ( - this.verticalMode && -- tab.pinned && -- this.hasAttribute("expanded") && -+ (tab.hasAttribute("zen-essential")) && -+ (this.hasAttribute("expanded") || document.documentElement.hasAttribute("zen-sidebar-expanded")) && - !this.expandOnHover - ); - } -@@ -1961,7 +2020,7 @@ +@@ -1067,7 +1090,7 @@ if (node == null) { // We have a container for non-tab elements at the end of the scrollbox. @@ -342,7 +171,7 @@ index 1425607ef87d6c28fb676e722617edfb51ba12a1..97cdeaf7cde41f39d70bd50ac8ca78be } node.before(tab); -@@ -2056,7 +2115,7 @@ +@@ -1162,7 +1185,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. @@ -351,7 +180,7 @@ index 1425607ef87d6c28fb676e722617edfb51ba12a1..97cdeaf7cde41f39d70bd50ac8ca78be const newTab2 = this.newTabButton; const newTabVertical = document.getElementById( "vertical-tabs-newtab-button" -@@ -2156,8 +2215,10 @@ +@@ -1263,8 +1286,10 @@ */ _handleTabSelect(aInstant) { let selectedTab = this.selectedItem; @@ -362,7 +191,7 @@ index 1425607ef87d6c28fb676e722617edfb51ba12a1..97cdeaf7cde41f39d70bd50ac8ca78be selectedTab._notselectedsinceload = false; } -@@ -2166,7 +2227,7 @@ +@@ -1273,7 +1298,7 @@ * @param {boolean} [shouldScrollInstantly=false] */ #ensureTabIsVisible(tab, shouldScrollInstantly = false) { @@ -371,265 +200,7 @@ index 1425607ef87d6c28fb676e722617edfb51ba12a1..97cdeaf7cde41f39d70bd50ac8ca78be if (arrowScrollbox?.overflowing) { arrowScrollbox.ensureElementIsVisible(tab, shouldScrollInstantly); } -@@ -2305,6 +2366,16 @@ - when the tab is first selected to be dragged. - */ - #updateTabStylesOnDrag(tab) { -+ 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.ariaFocusableItems; -@@ -2578,7 +2649,7 @@ - return; - } - -- let tabs = this.visibleTabs.slice(0, gBrowser.pinnedTabCount); -+ let tabs = this.ariaFocusableItems.slice(0, gBrowser._numZenEssentials); - - let directionX = screenX > dragData.animLastScreenX; - let directionY = screenY > dragData.animLastScreenY; -@@ -2587,6 +2658,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; -@@ -2623,8 +2696,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); - -@@ -2782,13 +2855,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.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(); -@@ -2799,7 +2877,7 @@ - let screenAxis = this.verticalMode ? "screenY" : "screenX"; - let size = this.verticalMode ? "height" : "width"; - let translateAxis = this.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.verticalMode ? tabHeight : tabWidth; - let translateX = event.screenX - dragData.screenX; - let translateY = event.screenY - dragData.screenY; -@@ -2815,6 +2893,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]; -@@ -2829,6 +2913,11 @@ - let endBound = this.#rtlMode - ? endEdge(this) - 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 -@@ -3018,6 +3107,8 @@ - }; - - let dropElement = getOverlappedElement(); -+ if (dropElement?.hasAttribute("split-view-group")) dropElement = dropElement.labelElement; -+ gZenPinnedTabManager.animateSeparatorMove(movingTabs, dropElement, isPinned, event); - - let newDropElementIndex; - if (dropElement) { -@@ -3099,7 +3190,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) { -@@ -3132,6 +3223,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 || -@@ -3158,20 +3250,13 @@ - let isOutOfBounds = isPinned - ? dropElement.elementIndex >= numPinned - : dropElement.elementIndex < numPinned; -- if (isOutOfBounds) { -- // Drop after last pinned tab -- dropElement = this.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" - ); -@@ -3179,6 +3264,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 && -@@ -3187,6 +3273,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; -@@ -3231,19 +3318,14 @@ - dropElement = dropElementGroup; - colorCode = undefined; - } else if (isTabGroupLabel(dropElement)) { -- if (dropBefore) { -- // Dropping right before the tab group. -- dropElement = dropElementGroup; -- colorCode = undefined; -- } else if (dropElementGroup.collapsed) { -- // Dropping right after the collapsed tab group. -- dropElement = dropElementGroup; -- colorCode = undefined; -- } else { -- // Dropping right before the first tab in the tab group. -- dropElement = dropElementGroup.tabs[0]; -- dropBefore = true; -- } -+ ({ dropElement, colorCode, dropBefore } = gZenFolders.handleDragOverTabGroupLabel( -+ dropElement, -+ draggedTab, -+ overlapPercent, -+ movingTabs, -+ dropBefore, -+ colorCode -+ )); - } - this.#setDragOverGroupColor(colorCode); - this.toggleAttribute("movingtab-addToGroup", colorCode); -@@ -3262,11 +3344,11 @@ - dragData.dropElement = dropElement; - 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; - } - -@@ -3388,12 +3470,14 @@ - element?.removeAttribute("dragover-groupTarget"); - } - -- finishAnimateTabMove() { -- if (!this.#isMovingTab()) { -+ finishAnimateTabMove(always = false) { -+ gZenPinnedTabManager.onDragFinish(); -+ if (!this.#isMovingTab() && !always) { - return; - } - - this.#setMovingTabMode(false); -+ gZenFolders.highlightGroupOnDragOver(null); - - for (let item of this.ariaFocusableItems) { - this.#resetGroupTarget(item); -@@ -3440,17 +3524,16 @@ - 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" - )) { - 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" -@@ -3522,7 +3605,7 @@ - let postTransitionCleanup = () => { - movingTab._moveTogetherSelectedTabsData.animate = false; - }; -- if (gReduceMotion) { -+ if (true || gReduceMotion) { - postTransitionCleanup(); - } else { - let onTransitionEnd = transitionendEvent => { -@@ -3686,7 +3769,7 @@ +@@ -1406,7 +1431,7 @@ } _notifyBackgroundTab(aTab) { @@ -638,25 +209,3 @@ index 1425607ef87d6c28fb676e722617edfb51ba12a1..97cdeaf7cde41f39d70bd50ac8ca78be return; } -@@ -3795,7 +3878,10 @@ - #getDragTarget(event, { ignoreSides = false } = {}) { - let { target } = event; - while (target) { -- if (isTab(target) || isTabGroupLabel(target)) { -+ if (isTab(target) || isTabGroupLabel(target) || target?.classList?.contains("tab-group-label-container")) { -+ if (target.classList?.contains("tab-group-label-container")) { -+ target = target.querySelector(".tab-group-label"); -+ } - break; - } - target = target.parentNode; -@@ -3812,6 +3898,9 @@ - return null; - } - } -+ if (target?.group?.hasAttribute("split-view-group")) { -+ target = target.group.labelElement; -+ } - return target; - } - diff --git a/src/browser/components/urlbar/UrlbarController-sys-mjs.patch b/src/browser/components/urlbar/UrlbarController-sys-mjs.patch index 8ad0e02f6..dc004d516 100644 --- a/src/browser/components/urlbar/UrlbarController-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarController-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/urlbar/UrlbarController.sys.mjs b/browser/components/urlbar/UrlbarController.sys.mjs -index a1faf7e4278c66865f267283515f22052769928d..297391205ab3cd96bed2e5a3e36a181c6da90098 100644 +index 880f65b493ba5e9b9750e84c2ba5d08b99e3dad9..c4a495887926fc6f13312a29998d03bfe907f0e2 100644 --- a/browser/components/urlbar/UrlbarController.sys.mjs +++ b/browser/components/urlbar/UrlbarController.sys.mjs -@@ -297,7 +297,6 @@ export class UrlbarController { +@@ -299,7 +299,6 @@ export class UrlbarController { const isMac = AppConstants.platform == "macosx"; // Handle readline/emacs-style navigation bindings on Mac. if ( @@ -10,7 +10,7 @@ index a1faf7e4278c66865f267283515f22052769928d..297391205ab3cd96bed2e5a3e36a181c this.view.isOpen && event.ctrlKey && (event.key == "n" || event.key == "p") -@@ -441,6 +440,8 @@ export class UrlbarController { +@@ -443,6 +442,8 @@ export class UrlbarController { }); } event.preventDefault(); diff --git a/src/browser/components/urlbar/UrlbarInput-sys-mjs.patch b/src/browser/components/urlbar/UrlbarInput-sys-mjs.patch index 274325f5b..ac3e26172 100644 --- a/src/browser/components/urlbar/UrlbarInput-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarInput-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/urlbar/UrlbarInput.sys.mjs b/browser/components/urlbar/UrlbarInput.sys.mjs -index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d355858bcf37b 100644 +index 4b7232f3261f8589b734c2238170e6968d7ea0bf..d8c0b404724e9b0dc2b5a2d21420357586fb7f14 100644 --- a/browser/components/urlbar/UrlbarInput.sys.mjs +++ b/browser/components/urlbar/UrlbarInput.sys.mjs -@@ -76,6 +76,13 @@ ChromeUtils.defineLazyGetter(lazy, "logger", () => +@@ -84,6 +84,13 @@ ChromeUtils.defineLazyGetter(lazy, "logger", () => lazy.UrlbarUtils.getLogger({ prefix: "Input" }) ); @@ -16,7 +16,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 const DEFAULT_FORM_HISTORY_NAME = "searchbar-history"; const UNLIMITED_MAX_RESULTS = 99; -@@ -437,7 +444,16 @@ export class UrlbarInput { +@@ -454,7 +461,16 @@ export class UrlbarInput { // See _on_select(). HTMLInputElement.select() dispatches a "select" // event but does not set the primary selection. this._suppressPrimaryAdjustment = true; @@ -33,7 +33,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 this._suppressPrimaryAdjustment = false; } -@@ -513,6 +529,10 @@ export class UrlbarInput { +@@ -530,6 +546,10 @@ export class UrlbarInput { hideSearchTerms = false, isSameDocument = false ) { @@ -44,7 +44,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 if (!this.isAddressbar) { throw new Error( "Cannot set URI for UrlbarInput that is not an address bar" -@@ -790,8 +810,16 @@ export class UrlbarInput { +@@ -807,8 +827,16 @@ export class UrlbarInput { return; } } @@ -62,7 +62,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 } /** -@@ -1207,7 +1235,11 @@ export class UrlbarInput { +@@ -1224,7 +1252,11 @@ export class UrlbarInput { } if (!this.#providesSearchMode(result)) { @@ -75,7 +75,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 } if (isCanonized) { -@@ -2298,6 +2330,32 @@ export class UrlbarInput { +@@ -2347,6 +2379,32 @@ export class UrlbarInput { await this.#updateLayoutBreakoutDimensions(); } @@ -108,7 +108,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 startLayoutExtend() { if (!this.#allowBreakout || this.hasAttribute("breakout-extend")) { // Do not expand if the Urlbar does not support being expanded or it is -@@ -2312,6 +2370,13 @@ export class UrlbarInput { +@@ -2361,6 +2419,13 @@ export class UrlbarInput { this.setAttribute("breakout-extend", "true"); @@ -122,7 +122,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 // 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")) { -@@ -2331,6 +2396,24 @@ export class UrlbarInput { +@@ -2380,6 +2445,24 @@ export class UrlbarInput { return; } @@ -147,7 +147,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 this.removeAttribute("breakout-extend"); this.#updateTextboxPosition(); } -@@ -2361,7 +2444,7 @@ export class UrlbarInput { +@@ -2410,7 +2493,7 @@ export class UrlbarInput { forceUnifiedSearchButtonAvailable = false ) { let prevState = this.getAttribute("pageproxystate"); @@ -156,7 +156,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 this.setAttribute("pageproxystate", state); this._inputContainer.setAttribute("pageproxystate", state); this._identityBox?.setAttribute("pageproxystate", state); -@@ -2595,10 +2678,12 @@ export class UrlbarInput { +@@ -2646,10 +2729,12 @@ export class UrlbarInput { return; } this.textbox.style.top = px( @@ -169,7 +169,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 ); } -@@ -2658,9 +2743,10 @@ export class UrlbarInput { +@@ -2709,9 +2794,10 @@ export class UrlbarInput { return; } @@ -181,7 +181,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 ); this.textbox.style.setProperty( "--urlbar-height", -@@ -3093,6 +3179,7 @@ export class UrlbarInput { +@@ -3144,6 +3230,7 @@ export class UrlbarInput { } _toggleActionOverride(event) { @@ -189,7 +189,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 if ( event.keyCode == KeyEvent.DOM_VK_SHIFT || event.keyCode == KeyEvent.DOM_VK_ALT || -@@ -3197,7 +3284,7 @@ export class UrlbarInput { +@@ -3248,7 +3335,7 @@ export class UrlbarInput { return val; } let trimmedValue = lazy.UrlbarPrefs.get("trimURLs") @@ -198,7 +198,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 : val; // Only trim value if the directionality doesn't change to RTL and we're not // showing a strikeout https protocol. -@@ -3501,6 +3588,7 @@ export class UrlbarInput { +@@ -3552,6 +3639,7 @@ export class UrlbarInput { resultDetails = null, browser = this.window.gBrowser.selectedBrowser ) { @@ -206,7 +206,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 if (this.isAddressbar) { this.#prepareAddressbarLoad( url, -@@ -3608,6 +3696,10 @@ export class UrlbarInput { +@@ -3659,6 +3747,10 @@ export class UrlbarInput { } reuseEmpty = true; } @@ -217,7 +217,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 if ( where == "tab" && reuseEmpty && -@@ -3615,6 +3707,9 @@ export class UrlbarInput { +@@ -3666,6 +3758,9 @@ export class UrlbarInput { ) { where = "current"; } @@ -227,7 +227,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 return where; } -@@ -3872,6 +3967,7 @@ export class UrlbarInput { +@@ -3923,6 +4018,7 @@ export class UrlbarInput { this.setResultForCurrentValue(null); this.handleCommand(); this.controller.clearLastQueryContextCache(); @@ -235,7 +235,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 this._suppressStartQuery = false; }); -@@ -3879,7 +3975,6 @@ export class UrlbarInput { +@@ -3930,7 +4026,6 @@ export class UrlbarInput { contextMenu.addEventListener("popupshowing", () => { // Close the results pane when the input field contextual menu is open, // because paste and go doesn't want a result selection. @@ -243,7 +243,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 let controller = this.document.commandDispatcher.getControllerForCommand("cmd_paste"); -@@ -3991,7 +4086,11 @@ export class UrlbarInput { +@@ -4040,7 +4135,11 @@ export class UrlbarInput { if (!engineName && !source && !this.hasAttribute("searchmode")) { return; } @@ -256,7 +256,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 if (this._searchModeIndicatorTitle) { this._searchModeIndicatorTitle.textContent = ""; this._searchModeIndicatorTitle.removeAttribute("data-l10n-id"); -@@ -4302,6 +4401,7 @@ export class UrlbarInput { +@@ -4351,6 +4450,7 @@ export class UrlbarInput { this.document.l10n.setAttributes( this.inputField, @@ -264,7 +264,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 l10nId, l10nId == "urlbar-placeholder-with-name" ? { name } : undefined ); -@@ -4413,6 +4513,11 @@ export class UrlbarInput { +@@ -4462,6 +4562,11 @@ export class UrlbarInput { } _on_click(event) { @@ -276,7 +276,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 if ( event.target == this.inputField || event.target == this._inputContainer -@@ -4485,7 +4590,7 @@ export class UrlbarInput { +@@ -4534,7 +4639,7 @@ export class UrlbarInput { } } @@ -285,7 +285,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 this.view.autoOpen({ event }); } else { if (this._untrimOnFocusAfterKeydown) { -@@ -4525,9 +4630,16 @@ export class UrlbarInput { +@@ -4574,9 +4679,16 @@ export class UrlbarInput { } _on_mousedown(event) { @@ -303,7 +303,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 if ( event.target != this.inputField && -@@ -4538,6 +4650,10 @@ export class UrlbarInput { +@@ -4587,6 +4699,10 @@ export class UrlbarInput { this.focusedViaMousedown = !this.focused; this._preventClickSelectsAll = this.focused; @@ -314,7 +314,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 // Keep the focus status, since the attribute may be changed // upon calling this.focus(). -@@ -4573,7 +4689,7 @@ export class UrlbarInput { +@@ -4622,7 +4738,7 @@ export class UrlbarInput { } // Don't close the view when clicking on a tab; we may want to keep the // view open on tab switch, and the TabSelect event arrived earlier. @@ -323,7 +323,7 @@ index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..f28c9a1ac086af429a93bd01be5d3558 break; } -@@ -4890,7 +5006,7 @@ export class UrlbarInput { +@@ -4939,7 +5055,7 @@ export class UrlbarInput { // When we are in actions search mode we can show more results so // increase the limit. let maxResults = diff --git a/src/browser/components/urlbar/UrlbarMuxerStandard-sys-mjs.patch b/src/browser/components/urlbar/UrlbarMuxerStandard-sys-mjs.patch index c737569ca..c40310518 100644 --- a/src/browser/components/urlbar/UrlbarMuxerStandard-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarMuxerStandard-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/urlbar/UrlbarMuxerStandard.sys.mjs b/browser/components/urlbar/UrlbarMuxerStandard.sys.mjs -index 20be2dbbb8471aeb43a9bf77888c9858a0b61186..a9f974a78c5676d1340a3543852e4126c1d32b04 100644 +index c12d875172650dddfe7de623a776149517c83302..66e923ed2c84e350dd7ba7a20e362666cec8f307 100644 --- a/browser/components/urlbar/UrlbarMuxerStandard.sys.mjs +++ b/browser/components/urlbar/UrlbarMuxerStandard.sys.mjs -@@ -852,6 +852,7 @@ class MuxerUnifiedComplete extends UrlbarMuxer { +@@ -854,6 +854,7 @@ class MuxerUnifiedComplete extends UrlbarMuxer { } if (result.providerName == "UrlbarProviderTabToSearch") { @@ -10,7 +10,7 @@ index 20be2dbbb8471aeb43a9bf77888c9858a0b61186..a9f974a78c5676d1340a3543852e4126 // Discard the result if a tab-to-search result was added already. if (!state.canAddTabToSearch) { return false; -@@ -1498,7 +1499,9 @@ class MuxerUnifiedComplete extends UrlbarMuxer { +@@ -1500,7 +1501,9 @@ class MuxerUnifiedComplete extends UrlbarMuxer { usedLimits.maxResultCount++; } diff --git a/src/browser/components/urlbar/UrlbarPrefs-sys-mjs.patch b/src/browser/components/urlbar/UrlbarPrefs-sys-mjs.patch index 539445412..b4a67ce95 100644 --- a/src/browser/components/urlbar/UrlbarPrefs-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarPrefs-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/urlbar/UrlbarPrefs.sys.mjs b/browser/components/urlbar/UrlbarPrefs.sys.mjs -index 46ad55519aecd6c14034a9faa91c7ad8e5c1c422..e8d9c06499a2b273483edd21faf902c936462b59 100644 +index 531cecb9da3465d392ea82248e6ebb3fe6476b47..f3cce2a66bb8465ae022df0c1b9823e7e88cba21 100644 --- a/browser/components/urlbar/UrlbarPrefs.sys.mjs +++ b/browser/components/urlbar/UrlbarPrefs.sys.mjs @@ -731,6 +731,7 @@ function makeResultGroups({ showSearchSuggestionsFirst }) { diff --git a/src/browser/components/urlbar/UrlbarProviderPlaces-sys-mjs.patch b/src/browser/components/urlbar/UrlbarProviderPlaces-sys-mjs.patch index 7862a4a27..396ba65f0 100644 --- a/src/browser/components/urlbar/UrlbarProviderPlaces-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarProviderPlaces-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs b/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs -index b2c3bfa6fbe83fceb019196c210baaa7b4881372..02f2c8be89f163e16c5fd29f9b7e145e16ea53ed 100644 +index 91abb674d26dc7e2a919c94087b180a6148248fd..80551acd18228f19cb179f71adc4f58bc893ac14 100644 --- a/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs +++ b/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs @@ -44,11 +44,13 @@ function defaultQuery(conditions = "") { @@ -26,7 +26,7 @@ index b2c3bfa6fbe83fceb019196c210baaa7b4881372..02f2c8be89f163e16c5fd29f9b7e145e h.visit_count, h.typed, 0, t.open_count, :matchBehavior, :searchBehavior, NULL) -@@ -1120,11 +1122,13 @@ Search.prototype = { +@@ -1126,11 +1128,13 @@ Search.prototype = { ? lazy.PlacesUtils.toDate(lastVisitPRTime).getTime() : undefined; let tabGroup = row.getResultByName("groupId"); diff --git a/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch b/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch index b06de00cf..d2dbed260 100644 --- a/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/urlbar/UrlbarProvidersManager.sys.mjs b/browser/components/urlbar/UrlbarProvidersManager.sys.mjs -index ece407214669009e263b507b5236ab28da33efe9..8f22426295e2b001438918f44d2c22ed7a697c2f 100644 +index b864cf9a9159d1f4e162ff5e8895a2bc95dee881..b30ee47b4f6d9025648ca5d93ee79f993cb6f4c2 100644 --- a/browser/components/urlbar/UrlbarProvidersManager.sys.mjs +++ b/browser/components/urlbar/UrlbarProvidersManager.sys.mjs -@@ -845,6 +845,7 @@ export class Query { +@@ -873,6 +873,7 @@ export class Query { if ( result.heuristic && this.context.searchMode && diff --git a/src/browser/components/urlbar/UrlbarUtils-sys-mjs.patch b/src/browser/components/urlbar/UrlbarUtils-sys-mjs.patch index 12bdd6dba..f2d58b268 100644 --- a/src/browser/components/urlbar/UrlbarUtils-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarUtils-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/browser/components/urlbar/UrlbarUtils.sys.mjs b/browser/components/urlbar/UrlbarUtils.sys.mjs -index f38e860e46fa979b3e0c66ecd3eb88a64df60fc1..d130bbc7488ff3de926823974a1df13dc8e61fbc 100644 +index 079c9f18550b54b2a1cc030174849896fd23234e..605bb3433b61443037659d126ba17b033e5a4394 100644 --- a/browser/components/urlbar/UrlbarUtils.sys.mjs +++ b/browser/components/urlbar/UrlbarUtils.sys.mjs -@@ -74,6 +74,7 @@ export var UrlbarUtils = { +@@ -77,6 +77,7 @@ export var UrlbarUtils = { RESTRICT_SEARCH_KEYWORD: "restrictSearchKeyword", SUGGESTED_INDEX: "suggestedIndex", TAIL_SUGGESTION: "tailSuggestion", @@ -10,7 +10,7 @@ index f38e860e46fa979b3e0c66ecd3eb88a64df60fc1..d130bbc7488ff3de926823974a1df13d }), // Defines provider types. -@@ -133,6 +134,7 @@ export var UrlbarUtils = { +@@ -136,6 +137,7 @@ export var UrlbarUtils = { OTHER_NETWORK: 6, ADDON: 7, ACTIONS: 8, @@ -18,7 +18,7 @@ index f38e860e46fa979b3e0c66ecd3eb88a64df60fc1..d130bbc7488ff3de926823974a1df13d }), // Per-result exposure telemetry. -@@ -544,6 +546,8 @@ export var UrlbarUtils = { +@@ -547,6 +549,8 @@ export var UrlbarUtils = { return this.RESULT_GROUP.HEURISTIC_FALLBACK; case "UrlbarProviderHistoryUrlHeuristic": return this.RESULT_GROUP.HEURISTIC_HISTORY_URL; diff --git a/src/browser/components/urlbar/UrlbarValueFormatter-sys-mjs.patch b/src/browser/components/urlbar/UrlbarValueFormatter-sys-mjs.patch index 81ea5fc30..4a44486be 100644 --- a/src/browser/components/urlbar/UrlbarValueFormatter-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarValueFormatter-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/urlbar/UrlbarValueFormatter.sys.mjs b/browser/components/urlbar/UrlbarValueFormatter.sys.mjs -index 50961e4beb75012ef0ed6f261a95854712cc69d7..93bcfca9270ff34dbe6386789fdae6066457438d 100644 +index beff1d41e47efad09256459589176d96c69f7a8a..c850dad31454d61c4edb6e183db07b2d51fb9fc8 100644 --- a/browser/components/urlbar/UrlbarValueFormatter.sys.mjs +++ b/browser/components/urlbar/UrlbarValueFormatter.sys.mjs @@ -585,6 +585,7 @@ export class UrlbarValueFormatter { diff --git a/src/browser/components/urlbar/UrlbarView-sys-mjs.patch b/src/browser/components/urlbar/UrlbarView-sys-mjs.patch index 26c99b0e8..ad96d3e95 100644 --- a/src/browser/components/urlbar/UrlbarView-sys-mjs.patch +++ b/src/browser/components/urlbar/UrlbarView-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/urlbar/UrlbarView.sys.mjs b/browser/components/urlbar/UrlbarView.sys.mjs -index b3c7c8a995226e2cbe852d82515f9bc7077980e7..4c8611556f7f71e5f8860787ed1db9b50b9fa2e8 100644 +index 38e4987dc906cf3c668995aab79fc15a02834677..de9d69a4faab3cfa249de41ef573ae2ef873b348 100644 --- a/browser/components/urlbar/UrlbarView.sys.mjs +++ b/browser/components/urlbar/UrlbarView.sys.mjs @@ -620,7 +620,7 @@ export class UrlbarView { @@ -11,7 +11,7 @@ index b3c7c8a995226e2cbe852d82515f9bc7077980e7..4c8611556f7f71e5f8860787ed1db9b5 // 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. -@@ -2734,6 +2734,8 @@ export class UrlbarView { +@@ -2751,6 +2751,8 @@ export class UrlbarView { if (row?.hasAttribute("row-selectable")) { row?.toggleAttribute("selected", true); } @@ -20,7 +20,7 @@ index b3c7c8a995226e2cbe852d82515f9bc7077980e7..4c8611556f7f71e5f8860787ed1db9b5 if (element != row) { row?.toggleAttribute("descendant-selected", true); } -@@ -3215,7 +3217,7 @@ export class UrlbarView { +@@ -3232,7 +3234,7 @@ export class UrlbarView { } #enableOrDisableRowWrap() { diff --git a/src/browser/extensions/newtab/lib/ActivityStream-sys-mjs.patch b/src/browser/extensions/newtab/lib/ActivityStream-sys-mjs.patch index fb2d74187..20abe082c 100644 --- a/src/browser/extensions/newtab/lib/ActivityStream-sys-mjs.patch +++ b/src/browser/extensions/newtab/lib/ActivityStream-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/browser/extensions/newtab/lib/ActivityStream.sys.mjs b/browser/extensions/newtab/lib/ActivityStream.sys.mjs -index 6207e6c8aa1e303ec151bc1e5c51c277ef776ee6..d3783a3c459c94880be1c95dc265a7d4887f67a1 100644 +index 7e50d7f5512cb4304d6fd2ecb6952fbff0b8f98e..ba09805f07b754b4b36d5a650252d5578184d031 100644 --- a/browser/extensions/newtab/lib/ActivityStream.sys.mjs +++ b/browser/extensions/newtab/lib/ActivityStream.sys.mjs -@@ -223,7 +223,7 @@ export const PREFS_CONFIG = new Map([ +@@ -250,7 +250,7 @@ export const PREFS_CONFIG = new Map([ "showSponsoredTopSites", { title: "Show sponsored top sites", diff --git a/src/browser/installer/package-manifest-in.patch b/src/browser/installer/package-manifest-in.patch index 2f18925ed..f4bb3e12d 100644 --- a/src/browser/installer/package-manifest-in.patch +++ b/src/browser/installer/package-manifest-in.patch @@ -1,8 +1,8 @@ diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in -index b884f0167e5de87a45cf523436ceaceb710d35ae..eedc80278a5c93f81ce90c0d6198924549c07fc3 100644 +index bb06e9224a4e195122d8a47ccf97c3481342cf86..959862e95ec00c7dc18256bd2572c1d7285415d4 100644 --- a/browser/installer/package-manifest.in +++ b/browser/installer/package-manifest.in -@@ -362,17 +362,17 @@ bin/libfreebl_64int_3.so +@@ -372,17 +372,17 @@ bin/libfreebl_64int_3.so ; [MaintenanceService] ; #ifdef MOZ_MAINTENANCE_SERVICE diff --git a/src/browser/installer/windows/nsis/defines-nsi-in.patch b/src/browser/installer/windows/nsis/defines-nsi-in.patch index 2f7d2923e..09d60e5e3 100644 --- a/src/browser/installer/windows/nsis/defines-nsi-in.patch +++ b/src/browser/installer/windows/nsis/defines-nsi-in.patch @@ -1,5 +1,5 @@ diff --git a/browser/installer/windows/nsis/defines.nsi.in b/browser/installer/windows/nsis/defines.nsi.in -index f78af1e3634dd503089ff8bdab5adba614a87892..4a19de8e89efadf2456011e2da2907a1135fe766 100644 +index 51743f6157d69e9303ed480254c199791f1a4db8..2e113512c2f0b094aa50a4f0499607ad9eb7eaf8 100644 --- a/browser/installer/windows/nsis/defines.nsi.in +++ b/browser/installer/windows/nsis/defines.nsi.in @@ -90,7 +90,7 @@ @@ -11,7 +11,7 @@ index f78af1e3634dd503089ff8bdab5adba614a87892..4a19de8e89efadf2456011e2da2907a1 # ARCH is used when it is necessary to differentiate the x64 registry keys from # the x86 registry keys (e.g. the uninstall registry key). -@@ -154,7 +154,7 @@ VIAddVersionKey "ProductVersion" "${AppVersion}" +@@ -153,7 +153,7 @@ VIAddVersionKey "ProductVersion" "${AppVersion}" !define APPROXIMATE_REQUIRED_SPACE_MB "145" # Constants for parts of the telemetry submission URL diff --git a/src/browser/installer/windows/nsis/installer-nsi.patch b/src/browser/installer/windows/nsis/installer-nsi.patch index e3a9aa0b8..5c43ebe60 100644 --- a/src/browser/installer/windows/nsis/installer-nsi.patch +++ b/src/browser/installer/windows/nsis/installer-nsi.patch @@ -1,8 +1,8 @@ diff --git a/browser/installer/windows/nsis/installer.nsi b/browser/installer/windows/nsis/installer.nsi -index 92eb3f11ea8035ce72eb5b1e110c98b1ef8665d1..e6b91ecfa8f16d2b884c70468ec1d3a0197351d1 100755 +index 4ecf1ea7e325b23a901ec75687c6b959085c8207..28c4b462dab0c4830a4bfb4c9cdf82a8aa919456 100755 --- a/browser/installer/windows/nsis/installer.nsi +++ b/browser/installer/windows/nsis/installer.nsi -@@ -841,7 +841,7 @@ Section "-InstallEndCleanup" +@@ -842,7 +842,7 @@ Section "-InstallEndCleanup" ; When we're using the GUI, .onGUIEnd sends the ping, but of course that isn't ; invoked when we're running silently. ${If} ${Silent} @@ -11,7 +11,7 @@ index 92eb3f11ea8035ce72eb5b1e110c98b1ef8665d1..e6b91ecfa8f16d2b884c70468ec1d3a0 ${EndIf} SectionEnd -@@ -1969,5 +1969,5 @@ FunctionEnd +@@ -1970,5 +1970,5 @@ FunctionEnd Function .onGUIEnd ${OnEndCommon} diff --git a/src/browser/installer/windows/nsis/uninstaller-nsi.patch b/src/browser/installer/windows/nsis/uninstaller-nsi.patch index efc934a82..2136ef157 100644 --- a/src/browser/installer/windows/nsis/uninstaller-nsi.patch +++ b/src/browser/installer/windows/nsis/uninstaller-nsi.patch @@ -1,10 +1,10 @@ diff --git a/browser/installer/windows/nsis/uninstaller.nsi b/browser/installer/windows/nsis/uninstaller.nsi old mode 100755 new mode 100644 -index 559c8b46ee06bc42c91da49b5d9e397fe8ff6126..62094a5d98712a41a607ba01ca2adfa1e4f51ccd +index fd104f8ab0bd51d6a99c121b60e2695a54b0dfd0..9b117e5a1f5e8adac7d22cd65154529418fd2e5b --- a/browser/installer/windows/nsis/uninstaller.nsi +++ b/browser/installer/windows/nsis/uninstaller.nsi -@@ -507,6 +507,7 @@ Section "Uninstall" +@@ -519,6 +519,7 @@ Section "Uninstall" ${un.RegCleanFileHandler} ".svg" "FirefoxHTML-$AppUserModelID" ${un.RegCleanFileHandler} ".webp" "FirefoxHTML-$AppUserModelID" ${un.RegCleanFileHandler} ".avif" "FirefoxHTML-$AppUserModelID" diff --git a/src/browser/modules/BrowserDOMWindow-sys-mjs.patch b/src/browser/modules/BrowserDOMWindow-sys-mjs.patch index a0d49d806..053fb1028 100644 --- a/src/browser/modules/BrowserDOMWindow-sys-mjs.patch +++ b/src/browser/modules/BrowserDOMWindow-sys-mjs.patch @@ -1,17 +1,17 @@ diff --git a/browser/modules/BrowserDOMWindow.sys.mjs b/browser/modules/BrowserDOMWindow.sys.mjs -index 534d23b3e66176ea77f3ef577bf9630626948b9d..752e229bbe725ae394b7648adb949635f2bd70e4 100644 +index e951af5edb966718ee20422c8e46d868c177cd1c..cd41305a4da8e675417eca7df5cd4a1ecee90c3d 100644 --- a/browser/modules/BrowserDOMWindow.sys.mjs +++ b/browser/modules/BrowserDOMWindow.sys.mjs -@@ -374,7 +374,7 @@ export class BrowserDOMWindow { +@@ -437,7 +437,7 @@ export class BrowserDOMWindow { // Passing a null-URI to only create the content window, // and pass true for aSkipLoad to prevent loading of // about:blank -- return this.getContentWindowOrOpenURIInFrame( -+ let res = this.getContentWindowOrOpenURIInFrame( +- return this.#getContentWindowOrOpenURIInFrame( ++ let res = this.#getContentWindowOrOpenURIInFrame( null, aParams, aWhere, -@@ -382,6 +382,10 @@ export class BrowserDOMWindow { +@@ -445,6 +445,10 @@ export class BrowserDOMWindow { aName, true ); @@ -21,4 +21,4 @@ index 534d23b3e66176ea77f3ef577bf9630626948b9d..752e229bbe725ae394b7648adb949635 + return res; } - openURIInFrame(aURI, aParams, aWhere, aFlags, aName) { + /** diff --git a/src/browser/modules/ExtensionsUI-sys-mjs.patch b/src/browser/modules/ExtensionsUI-sys-mjs.patch index 0466fcc51..736ae6904 100644 --- a/src/browser/modules/ExtensionsUI-sys-mjs.patch +++ b/src/browser/modules/ExtensionsUI-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/browser/modules/ExtensionsUI.sys.mjs b/browser/modules/ExtensionsUI.sys.mjs -index 17cad7b3fbdd6dff862483892f37f72c00792c88..90ea4d95738eb50d1a4a67ee7df087e7c2a68b3d 100644 +index 31229b3bc1b93565a57c2c0b0307ceeb594c3936..30456ef5d3c58e96717cd292f861a04a790d0ee1 100644 --- a/browser/modules/ExtensionsUI.sys.mjs +++ b/browser/modules/ExtensionsUI.sys.mjs -@@ -478,7 +478,7 @@ export var ExtensionsUI = { +@@ -480,7 +480,7 @@ export var ExtensionsUI = { eventCallback, removeOnDismissal: true, popupOptions: { diff --git a/src/browser/modules/URILoadingHelper-sys-mjs.patch b/src/browser/modules/URILoadingHelper-sys-mjs.patch index ee763d2b8..d507c1852 100644 --- a/src/browser/modules/URILoadingHelper-sys-mjs.patch +++ b/src/browser/modules/URILoadingHelper-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/modules/URILoadingHelper.sys.mjs b/browser/modules/URILoadingHelper.sys.mjs -index f7a3e8272f1f22286a26bf50d78b23aa82b49df8..a690732012331dfc40cc08fef4453c28c6587a24 100644 +index 04d0b47099648cfd00e72ef260d44628718809ee..49cd0215778a33a80d1f45b8e2701410d016a5a3 100644 --- a/browser/modules/URILoadingHelper.sys.mjs +++ b/browser/modules/URILoadingHelper.sys.mjs @@ -541,7 +541,7 @@ export const URILoadingHelper = { diff --git a/src/browser/themes/osx/browser-css.patch b/src/browser/themes/osx/browser-css.patch index cdaeb1877..7cf8f61bb 100644 --- a/src/browser/themes/osx/browser-css.patch +++ b/src/browser/themes/osx/browser-css.patch @@ -1,5 +1,5 @@ diff --git a/browser/themes/osx/browser.css b/browser/themes/osx/browser.css -index b1062108c6f6174a680e9b235ee9cb2037f94924..31aac7bdee4ebb07e9de58e7c3e5e6833c94e968 100644 +index 0a15e3d60d408f119bd03007567d5dd1fa178c36..443901657296d0d15a95e1d39e826b1c008aac4d 100644 --- a/browser/themes/osx/browser.css +++ b/browser/themes/osx/browser.css @@ -38,7 +38,7 @@ diff --git a/src/browser/themes/shared/browser-shared-css.patch b/src/browser/themes/shared/browser-shared-css.patch index 780f07a9b..2a7d63eb1 100644 --- a/src/browser/themes/shared/browser-shared-css.patch +++ b/src/browser/themes/shared/browser-shared-css.patch @@ -1,17 +1,17 @@ diff --git a/browser/themes/shared/browser-shared.css b/browser/themes/shared/browser-shared.css -index c77a0e6388c4061d9e6ee5f396a3e3af8867e4fe..3da164d2414e8726675ac0184310c9363365387f 100644 +index 2b013ee77bb50db11e73152bd0265dd86e40b726..dc0ba2c8651470bcd81439953adbaca26a4a5b8c 100644 --- a/browser/themes/shared/browser-shared.css +++ b/browser/themes/shared/browser-shared.css @@ -102,7 +102,7 @@ body { - --toolbarbutton-border-radius: 4px; + --toolbarbutton-border-radius: var(--button-border-radius); --identity-box-margin-inline: 4px; --urlbar-min-height: max(32px, 1.4em); - --urlbar-icon-padding: calc((var(--urlbar-min-height) - 2px /* border */ - 2px /* padding */ - 16px /* icon */) / 2); + --urlbar-icon-padding: calc((var(--urlbar-min-height) - 2px /* border */ - 14px /* icon */) / 2); - /* This should be used for icons and chiclets inside the input field. It makes - the gap around them more uniform when they are close to the field edges */ -@@ -170,8 +170,6 @@ body { + /* This should be used for icons and chiclets inside the input field, as well + as result rows. It makes the gap around them more uniform when they are +@@ -171,8 +171,6 @@ body { */ &.fullscreen-with-menubar { z-index: var(--browser-area-z-index-toolbox-while-animating); @@ -20,7 +20,7 @@ index c77a0e6388c4061d9e6ee5f396a3e3af8867e4fe..3da164d2414e8726675ac0184310c936 } /* Themes define a set of toolbox foreground and background colors which we -@@ -281,13 +279,13 @@ body { +@@ -282,13 +280,13 @@ body { @media (-moz-platform: macos) and (not (-moz-mac-rtl)) { &:-moz-locale-dir(ltr) { diff --git a/src/browser/themes/shared/identity-block/identity-block-css.patch b/src/browser/themes/shared/identity-block/identity-block-css.patch index 13df820cf..2c5c54f64 100644 --- a/src/browser/themes/shared/identity-block/identity-block-css.patch +++ b/src/browser/themes/shared/identity-block/identity-block-css.patch @@ -1,5 +1,5 @@ diff --git a/browser/themes/shared/identity-block/identity-block.css b/browser/themes/shared/identity-block/identity-block.css -index 8edca63dc52ec207475ed9965559d28c06e27971..a5a949be1868af5d0bb04747a9f5b737c00ae49c 100644 +index d542e962d42b17140888e299ed43a838047ee48c..5e0b72f147687924c48dfed0318f53b765a4d497 100644 --- a/browser/themes/shared/identity-block/identity-block.css +++ b/browser/themes/shared/identity-block/identity-block.css @@ -81,13 +81,6 @@ @@ -11,7 +11,7 @@ index 8edca63dc52ec207475ed9965559d28c06e27971..a5a949be1868af5d0bb04747a9f5b737 - background-color: var(--urlbar-box-bgcolor); - color: var(--urlbar-box-text-color); - padding-inline: 8px; -- border-radius: var(--urlbar-icon-border-radius); +- border-radius: var(--urlbar-inner-border-radius); -} #urlbar[focused] { diff --git a/src/browser/themes/shared/jar-inc-mn.patch b/src/browser/themes/shared/jar-inc-mn.patch index 003aa4104..ca613d9f9 100644 --- a/src/browser/themes/shared/jar-inc-mn.patch +++ b/src/browser/themes/shared/jar-inc-mn.patch @@ -1,8 +1,8 @@ diff --git a/browser/themes/shared/jar.inc.mn b/browser/themes/shared/jar.inc.mn -index 94036d036a64c8845c02d4ffbcf3f99b5d88576e..2ab3f060c9952f1b0c7bee3d5c3a1d7035e6736a 100644 +index 6085ce0614c9ea7d650c9526b295953f46b30cb6..06b4af758d9ae033dd0b7436f08e6748047c8bbe 100644 --- a/browser/themes/shared/jar.inc.mn +++ b/browser/themes/shared/jar.inc.mn -@@ -316,3 +316,5 @@ +@@ -317,3 +317,5 @@ skin/classic/browser/illustrations/market-opt-in.svg (../shared/illustrations/market-opt-in.svg) skin/classic/browser/illustrations/yelpRealtime-opt-in.svg (../shared/illustrations/yelpRealtime-opt-in.svg) diff --git a/src/browser/themes/shared/tabbrowser/content-area-css.patch b/src/browser/themes/shared/tabbrowser/content-area-css.patch index d7f0e2ec5..b719d9abf 100644 --- a/src/browser/themes/shared/tabbrowser/content-area-css.patch +++ b/src/browser/themes/shared/tabbrowser/content-area-css.patch @@ -1,8 +1,8 @@ diff --git a/browser/themes/shared/tabbrowser/content-area.css b/browser/themes/shared/tabbrowser/content-area.css -index e06addf1602dc26ff4e75a8db6251231690f3f80..ffac005d5040852eda8f574f65f2eadf5ecbd642 100644 +index db68a04d85c12a383ed33b459b9c8d942fe916f7..2941cf4010e24b31a3d9b2194fe9536f23063dbd 100644 --- a/browser/themes/shared/tabbrowser/content-area.css +++ b/browser/themes/shared/tabbrowser/content-area.css -@@ -134,7 +134,6 @@ +@@ -140,7 +140,6 @@ } browser:is([blank], [pendingpaint]) { @@ -10,7 +10,7 @@ index e06addf1602dc26ff4e75a8db6251231690f3f80..ffac005d5040852eda8f574f65f2eadf } browser[type="content"] { -@@ -276,7 +275,7 @@ +@@ -323,7 +322,7 @@ .dialogStack { z-index: var(--browser-stack-z-index-dialog-stack); diff --git a/src/browser/themes/shared/tabbrowser/ctrlTab-css.patch b/src/browser/themes/shared/tabbrowser/ctrlTab-css.patch index 57b20ea25..5393678e5 100644 --- a/src/browser/themes/shared/tabbrowser/ctrlTab-css.patch +++ b/src/browser/themes/shared/tabbrowser/ctrlTab-css.patch @@ -1,5 +1,5 @@ diff --git a/browser/themes/shared/tabbrowser/ctrlTab.css b/browser/themes/shared/tabbrowser/ctrlTab.css -index aaeae8fd0e999aecda02bf287b39c4d96ad73f3c..d8196d9b1b5491d73b18a7c7d7fef55bc11fe31b 100644 +index 259e11f3c9a761e158dc32a3ecb9ee90c11d27c6..c5e30314090fe8f33b37c809bcf871c7b8c4d3da 100644 --- a/browser/themes/shared/tabbrowser/ctrlTab.css +++ b/browser/themes/shared/tabbrowser/ctrlTab.css @@ -11,6 +11,7 @@ diff --git a/src/browser/themes/shared/tabbrowser/tabs-css.patch b/src/browser/themes/shared/tabbrowser/tabs-css.patch index 1e127b19f..2bd6bb28d 100644 --- a/src/browser/themes/shared/tabbrowser/tabs-css.patch +++ b/src/browser/themes/shared/tabbrowser/tabs-css.patch @@ -1,5 +1,5 @@ diff --git a/browser/themes/shared/tabbrowser/tabs.css b/browser/themes/shared/tabbrowser/tabs.css -index 8a7499426a718a56c74daea562a50de20db706e7..7ee8d7e0bd98733341e1da0d2ff965d85fc4c91a 100644 +index 13edfa4a6975828ab8dbdce15215f2e4ee548249..9fc2cd93235eb14d8d8d5a7611ec8f2bff889716 100644 --- a/browser/themes/shared/tabbrowser/tabs.css +++ b/browser/themes/shared/tabbrowser/tabs.css @@ -21,7 +21,7 @@ @@ -23,7 +23,7 @@ index 8a7499426a718a56c74daea562a50de20db706e7..7ee8d7e0bd98733341e1da0d2ff965d8 --tab-selected-bgcolor: var(--toolbar-bgcolor); --tab-selected-color-scheme: var(--toolbar-color-scheme); &[lwt-tab-selected="light"] { -@@ -259,7 +259,6 @@ +@@ -267,7 +267,6 @@ } :root:not([uidensity="compact"], [sidebar-expand-on-hover]) &[pinned] { @@ -31,7 +31,7 @@ index 8a7499426a718a56c74daea562a50de20db706e7..7ee8d7e0bd98733341e1da0d2ff965d8 } &:is([selected], [multiselected]) { -@@ -273,6 +272,7 @@ +@@ -281,6 +280,7 @@ border-radius: inherit; position: relative; overflow: hidden; @@ -39,7 +39,7 @@ index 8a7499426a718a56c74daea562a50de20db706e7..7ee8d7e0bd98733341e1da0d2ff965d8 &::before { position: absolute; -@@ -472,14 +472,11 @@ +@@ -480,14 +480,11 @@ .tab-icon-image { -moz-context-properties: fill, stroke; fill: currentColor; @@ -55,7 +55,7 @@ index 8a7499426a718a56c74daea562a50de20db706e7..7ee8d7e0bd98733341e1da0d2ff965d8 opacity: 0.5; /* Fade the favicon out */ transition-property: filter, opacity; -@@ -496,10 +493,6 @@ +@@ -504,10 +501,6 @@ /* stylelint-disable-next-line media-query-no-invalid */ @media -moz-pref("browser.tabs.fadeOutExplicitlyUnloadedTabs") { &[pending][discarded] { @@ -66,7 +66,7 @@ index 8a7499426a718a56c74daea562a50de20db706e7..7ee8d7e0bd98733341e1da0d2ff965d8 opacity: 0.5; /* Fade the favicon out */ transition-property: filter, opacity; -@@ -572,7 +565,7 @@ +@@ -575,7 +568,7 @@ z-index: 1; /* Overlay tab title */ #tabbrowser-tabs[orient="vertical"] & { @@ -75,7 +75,7 @@ index 8a7499426a718a56c74daea562a50de20db706e7..7ee8d7e0bd98733341e1da0d2ff965d8 } &[crashed] { -@@ -580,7 +573,7 @@ +@@ -583,7 +576,7 @@ } #tabbrowser-tabs[orient="vertical"]:not([expanded]) &:not([crashed]), @@ -84,7 +84,7 @@ index 8a7499426a718a56c74daea562a50de20db706e7..7ee8d7e0bd98733341e1da0d2ff965d8 &[soundplaying] { list-style-image: url("chrome://browser/skin/tabbrowser/tab-audio-playing-small.svg"); } -@@ -637,7 +630,7 @@ +@@ -640,7 +633,7 @@ } } @@ -93,7 +93,7 @@ index 8a7499426a718a56c74daea562a50de20db706e7..7ee8d7e0bd98733341e1da0d2ff965d8 &[crashed] { display: revert; } -@@ -738,7 +731,7 @@ +@@ -741,7 +734,7 @@ has not been added to root. There are certain scenarios when that attribute is temporarily removed from root such as when toggling the sidebar to expand with the toolbar button. */ #tabbrowser-tabs[orient="horizontal"] &:not([pinned]):not([crashed]), @@ -102,7 +102,7 @@ index 8a7499426a718a56c74daea562a50de20db706e7..7ee8d7e0bd98733341e1da0d2ff965d8 &:is([soundplaying], [muted], [activemedia-blocked]) { display: flex; } -@@ -1226,7 +1219,7 @@ tab-group { +@@ -1245,7 +1238,7 @@ tab-group { } #tabbrowser-tabs[orient="vertical"][expanded] { @@ -111,7 +111,7 @@ index 8a7499426a718a56c74daea562a50de20db706e7..7ee8d7e0bd98733341e1da0d2ff965d8 &[movingtab][movingtab-addToGroup]:not([movingtab-group], [movingtab-ungroup]) .tabbrowser-tab:is(:active, [multiselected]) { margin-inline-start: var(--space-medium); } -@@ -1685,7 +1678,7 @@ tab-group { +@@ -1692,7 +1685,7 @@ tab-group { } } @@ -120,7 +120,7 @@ index 8a7499426a718a56c74daea562a50de20db706e7..7ee8d7e0bd98733341e1da0d2ff965d8 #vertical-tabs-newtab-button { appearance: none; min-height: var(--tab-min-height); -@@ -1696,7 +1689,7 @@ tab-group { +@@ -1703,7 +1696,7 @@ tab-group { margin-inline: var(--tab-inner-inline-margin); #tabbrowser-tabs[orient="vertical"]:not([expanded]) & > .toolbarbutton-text { @@ -129,7 +129,7 @@ index 8a7499426a718a56c74daea562a50de20db706e7..7ee8d7e0bd98733341e1da0d2ff965d8 } &:hover { -@@ -1720,7 +1713,7 @@ tab-group { +@@ -1727,7 +1720,7 @@ tab-group { * flex container. #tabs-newtab-button is a child of the arrowscrollbox where * we don't want a gap (between tabs), so we have to add some margin. */ @@ -138,7 +138,7 @@ index 8a7499426a718a56c74daea562a50de20db706e7..7ee8d7e0bd98733341e1da0d2ff965d8 margin-block: var(--tab-block-margin); } -@@ -1913,7 +1906,6 @@ tab-group { +@@ -1915,7 +1908,6 @@ tab-group { &:not([expanded]) { .tabbrowser-tab[pinned] { @@ -146,7 +146,7 @@ index 8a7499426a718a56c74daea562a50de20db706e7..7ee8d7e0bd98733341e1da0d2ff965d8 } .tab-background { -@@ -1953,8 +1945,8 @@ tab-group { +@@ -1955,8 +1947,8 @@ tab-group { display: block; position: absolute; inset: auto; @@ -157,7 +157,7 @@ index 8a7499426a718a56c74daea562a50de20db706e7..7ee8d7e0bd98733341e1da0d2ff965d8 &:-moz-window-inactive { background-image: -@@ -2073,7 +2065,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button { +@@ -2075,7 +2067,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button { list-style-image: url(chrome://global/skin/icons/plus.svg); } diff --git a/src/browser/themes/shared/urlbar-searchbar-css.patch b/src/browser/themes/shared/urlbar-searchbar-css.patch index 2d75c52f7..1c291ce84 100644 --- a/src/browser/themes/shared/urlbar-searchbar-css.patch +++ b/src/browser/themes/shared/urlbar-searchbar-css.patch @@ -1,5 +1,5 @@ diff --git a/browser/themes/shared/urlbar-searchbar.css b/browser/themes/shared/urlbar-searchbar.css -index 1744e627bbcfc69ccccb207ad1cbf0c262afb9be..50cc9da2076d946771fb5aca1402f1cbe6a531c8 100644 +index 15dcfbc95afab9f28bd58379da0ef3e24d1b4595..73827cc5cffe47099feea36cbeffb547e955b37e 100644 --- a/browser/themes/shared/urlbar-searchbar.css +++ b/browser/themes/shared/urlbar-searchbar.css @@ -6,7 +6,7 @@ @@ -20,7 +20,7 @@ index 1744e627bbcfc69ccccb207ad1cbf0c262afb9be..50cc9da2076d946771fb5aca1402f1cb } /* When rich suggestions are enabled the urlbar identity icon is given extra padding to -@@ -321,10 +321,14 @@ +@@ -320,10 +320,14 @@ .urlbar[breakout][breakout-extend] { height: auto; diff --git a/src/browser/themes/shared/urlbarView-css.patch b/src/browser/themes/shared/urlbarView-css.patch index 9e692c3be..4c7e0779e 100644 --- a/src/browser/themes/shared/urlbarView-css.patch +++ b/src/browser/themes/shared/urlbarView-css.patch @@ -1,17 +1,17 @@ diff --git a/browser/themes/shared/urlbarView.css b/browser/themes/shared/urlbarView.css -index ec849fc792572e75d12b9e7cd7e6b7f32c799fa9..17c7d442854b774817ef5b3b96e732c19bebef9d 100644 +index e0a05846eb0a329fc58b660f806912a1afe7c6c9..0d02e227a84ff4229104dd9cf9cd20f50a8d136c 100644 --- a/browser/themes/shared/urlbarView.css +++ b/browser/themes/shared/urlbarView.css @@ -20,7 +20,7 @@ --urlbarView-small-font-size: 0.85em; -- --urlbarView-results-padding: 4px; +- --urlbarView-results-padding: 7px; + --urlbarView-results-padding: 8px; --urlbarView-row-gutter: 2px; --urlbarView-item-inline-padding: var(--urlbar-icon-padding); --urlbarView-item-block-padding: 6px; -@@ -173,7 +173,6 @@ +@@ -171,7 +171,6 @@ min-height: 32px; } :root[uidensity="touch"] & { diff --git a/src/devtools/server/actors/animation-type-longhand-js.patch b/src/devtools/server/actors/animation-type-longhand-js.patch index 29e44807d..8ac01e934 100644 --- a/src/devtools/server/actors/animation-type-longhand-js.patch +++ b/src/devtools/server/actors/animation-type-longhand-js.patch @@ -1,8 +1,8 @@ diff --git a/devtools/server/actors/animation-type-longhand.js b/devtools/server/actors/animation-type-longhand.js -index ea27f1209ddb9b33ae044186c2b795685a0bde67..6d808a760885f0e26ff307a39d6977228359fe71 100644 +index a0026f953e8383741221d60ed5c02d0c12740f09..fd5c49d0b8997f29d3dee8dc23e2c373341eb972 100644 --- a/devtools/server/actors/animation-type-longhand.js +++ b/devtools/server/actors/animation-type-longhand.js -@@ -344,6 +344,7 @@ exports.ANIMATION_TYPE_FOR_LONGHANDS = [ +@@ -342,6 +342,7 @@ exports.ANIMATION_TYPE_FOR_LONGHANDS = [ "transform-origin", "translate", "-moz-window-transform", diff --git a/src/devtools/startup/DevToolsStartup-sys-mjs.patch b/src/devtools/startup/DevToolsStartup-sys-mjs.patch index 9f7ea1c66..2293dd2d0 100644 --- a/src/devtools/startup/DevToolsStartup-sys-mjs.patch +++ b/src/devtools/startup/DevToolsStartup-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/devtools/startup/DevToolsStartup.sys.mjs b/devtools/startup/DevToolsStartup.sys.mjs -index 95de0614e392e00036500a5b3ef9976041f37ec6..2c842055ce1d7ffd94c8f21a82305a3a13d493e0 100644 +index 7d26af162be5620649ff36d7cf7d3835a8ac7a20..c0fbd46c22f1eacc82058919714174d15e8106f1 100644 --- a/devtools/startup/DevToolsStartup.sys.mjs +++ b/devtools/startup/DevToolsStartup.sys.mjs @@ -816,6 +816,7 @@ DevToolsStartup.prototype = { diff --git a/src/docshell/base/nsAboutRedirector-cpp.patch b/src/docshell/base/nsAboutRedirector-cpp.patch index 61966825d..527a48635 100644 --- a/src/docshell/base/nsAboutRedirector-cpp.patch +++ b/src/docshell/base/nsAboutRedirector-cpp.patch @@ -1,8 +1,8 @@ diff --git a/docshell/base/nsAboutRedirector.cpp b/docshell/base/nsAboutRedirector.cpp -index 83d84537f94863d47a30887362fa1ce5a9809427..104d170d5e5114f965b7698fc59d2bad12265261 100644 +index 625640eef45baba74255c00c603f0834e1f0aa2c..8b7893cf3848edf9121f7cbefcc3a1c76894fa37 100644 --- a/docshell/base/nsAboutRedirector.cpp +++ b/docshell/base/nsAboutRedirector.cpp -@@ -108,7 +108,7 @@ static const RedirEntry kRedirMap[] = { +@@ -118,7 +118,7 @@ static const RedirEntry kRedirMap[] = { {"crashes", "chrome://global/content/crashes.html", nsIAboutModule::IS_SECURE_CHROME_UI}, #endif diff --git a/src/dom/base/Document-cpp.patch b/src/dom/base/Document-cpp.patch index 37f0f667b..18ca663f2 100644 --- a/src/dom/base/Document-cpp.patch +++ b/src/dom/base/Document-cpp.patch @@ -1,8 +1,8 @@ diff --git a/dom/base/Document.cpp b/dom/base/Document.cpp -index 0c2ef36f9765b6904659ac0ed4329468ca89225f..d06552e8d4ac102dd50a1afea10938ca32aeb788 100644 +index 55d24fe16311a286813f7668a227d2ef0cc7e5d7..1a7c2352daf1e04e38a8fb81f80a1f9a58ba2cb5 100644 --- a/dom/base/Document.cpp +++ b/dom/base/Document.cpp -@@ -466,6 +466,7 @@ +@@ -465,6 +465,7 @@ #include "prtime.h" #include "prtypes.h" #include "xpcpublic.h" @@ -10,7 +10,7 @@ index 0c2ef36f9765b6904659ac0ed4329468ca89225f..d06552e8d4ac102dd50a1afea10938ca // clang-format off #include "mozilla/Encoding.h" -@@ -3428,6 +3429,10 @@ void Document::FillStyleSetUserAndUASheets() { +@@ -3442,6 +3443,10 @@ void Document::FillStyleSetUserAndUASheets() { for (StyleSheet* sheet : *sheetService->UserStyleSheets()) { styleSet.AppendStyleSheet(*sheet); } diff --git a/src/dom/base/use_counter_metrics-yaml.patch b/src/dom/base/use_counter_metrics-yaml.patch index eeac251f7..0ec931469 100644 --- a/src/dom/base/use_counter_metrics-yaml.patch +++ b/src/dom/base/use_counter_metrics-yaml.patch @@ -1,8 +1,8 @@ diff --git a/dom/base/use_counter_metrics.yaml b/dom/base/use_counter_metrics.yaml -index 157d46c37d0a465f02f794eda4323f7e344c5e63..aec8b819dbcf853c2e6d5513000149449fae36fd 100644 +index 81d73c33af8c95e6f687c05354fb8a0e894dcd44..775742e1e4f84618dce45cbcb14229dc6c4f2b64 100644 --- a/dom/base/use_counter_metrics.yaml +++ b/dom/base/use_counter_metrics.yaml -@@ -21154,6 +21154,22 @@ use.counter.css.page: +@@ -21086,6 +21086,22 @@ use.counter.css.page: send_in_pings: - use-counters @@ -25,7 +25,7 @@ index 157d46c37d0a465f02f794eda4323f7e344c5e63..aec8b819dbcf853c2e6d551300014944 css_transform_origin: type: counter description: > -@@ -33175,6 +33191,22 @@ use.counter.css.doc: +@@ -33056,6 +33072,22 @@ use.counter.css.doc: send_in_pings: - use-counters diff --git a/src/dom/media/mediaelement/HTMLMediaElement-cpp.patch b/src/dom/media/mediaelement/HTMLMediaElement-cpp.patch index da62b610d..19c73e158 100644 --- a/src/dom/media/mediaelement/HTMLMediaElement-cpp.patch +++ b/src/dom/media/mediaelement/HTMLMediaElement-cpp.patch @@ -1,5 +1,5 @@ diff --git a/dom/media/mediaelement/HTMLMediaElement.cpp b/dom/media/mediaelement/HTMLMediaElement.cpp -index 741a8f1744f48e7db4dbda64c856efaf9f3564b0..f9a2c0878f8a923903ed8eb65cbd355d40b41715 100644 +index 3cb7a43dd9535ccf6ffaa60df39b487f07760208..ed3632e9f38ee88df39500356777ae5b3ba7202a 100644 --- a/dom/media/mediaelement/HTMLMediaElement.cpp +++ b/dom/media/mediaelement/HTMLMediaElement.cpp @@ -453,6 +453,7 @@ class HTMLMediaElement::MediaControlKeyListener final @@ -10,7 +10,7 @@ index 741a8f1744f48e7db4dbda64c856efaf9f3564b0..f9a2c0878f8a923903ed8eb65cbd355d NotifyAudibleStateChanged(mIsOwnerAudible ? MediaAudibleState::eAudible : MediaAudibleState::eInaudible); -@@ -7191,6 +7192,9 @@ void HTMLMediaElement::FireTimeUpdate(TimeupdateType aType) { +@@ -7234,6 +7235,9 @@ void HTMLMediaElement::FireTimeUpdate(TimeupdateType aType) { QueueTask(std::move(runner)); mQueueTimeUpdateRunnerTime = TimeStamp::Now(); mLastCurrentTime = CurrentTime(); diff --git a/src/firefox-patches/ff-145-tahoe-upgrade.patch b/src/firefox-patches/ff-145-tahoe-upgrade.patch deleted file mode 100644 index ff27f9aca..000000000 --- a/src/firefox-patches/ff-145-tahoe-upgrade.patch +++ /dev/null @@ -1,336 +0,0 @@ -diff --git a/mfbt/tests/TestUniquePtr.cpp b/mfbt/tests/TestUniquePtr.cpp ---- a/mfbt/tests/TestUniquePtr.cpp -+++ b/mfbt/tests/TestUniquePtr.cpp -@@ -314,43 +314,45 @@ - gADestructorCalls = 0; - gBDestructorCalls = 0; - return true; - } - --typedef void (&FreeSignature)(void*); -+struct Free { -+ void operator()(void* aPtr) { free(aPtr); } -+}; - - static size_t DeleteIntFunctionCallCount = 0; -+struct DeleteIntFunction { -+ void operator()(void* aPtr) { -+ DeleteIntFunctionCallCount++; -+ delete[] static_cast(aPtr); -+ } -+}; - --static void DeleteIntFunction(void* aPtr) { -- DeleteIntFunctionCallCount++; -- delete[] static_cast(aPtr); --} -- --static void SetMallocedInt(UniquePtr& aPtr, int aI) { -+static void SetMallocedInt(UniquePtr& aPtr, int aI) { - int* newPtr = static_cast(malloc(sizeof(int))); - *newPtr = aI; - aPtr.reset(newPtr); - } - --static UniquePtr MallocedInt(int aI) { -- UniquePtr ptr(static_cast(malloc(sizeof(int))), -- free); -+static UniquePtr MallocedInt(int aI) { -+ UniquePtr ptr(static_cast(malloc(sizeof(int))), Free{}); - *ptr = aI; - return ptr; - } - static bool TestFunctionReferenceDeleter() { - // Look for allocator mismatches and leaks to verify these bits -- UniquePtr i1(MallocedInt(17)); -+ UniquePtr i1(MallocedInt(17)); - CHECK(*i1 == 17); - - SetMallocedInt(i1, 42); - CHECK(*i1 == 42); - - // These bits use a custom deleter so we can instrument deletion. - { -- UniquePtr i2 = -- UniquePtr(new int[42], DeleteIntFunction); -+ UniquePtr i2 = -+ UniquePtr(new int[42], DeleteIntFunction{}); - CHECK(DeleteIntFunctionCallCount == 0); - - i2.reset(new int[76]); - CHECK(DeleteIntFunctionCallCount == 1); - } - -diff --git a/build/moz.configure/toolchain.configure b/build/moz.configure/toolchain.configure ---- a/build/moz.configure/toolchain.configure -+++ b/build/moz.configure/toolchain.configure -@@ -231,11 +231,11 @@ - nargs=1, - help="Location of platform SDK to use", - ) - - def mac_sdk_min_version(): -- return "15.5" -+ return "26.0" - - @depends( - "--with-macos-sdk", - host, - bootstrap_path( -diff --git a/browser/themes/osx/places/organizer.css b/browser/themes/osx/places/organizer.css -index 60e3d65d9ea5..730aa23aed6c 100644 ---- a/browser/themes/osx/places/organizer.css -+++ b/browser/themes/osx/places/organizer.css -@@ -11,13 +11,15 @@ - padding: 4px 4px 3px; - border-bottom: 1px solid ThreeDShadow; - -- &::after { -- content: ""; -- position: absolute; -- inset: 0; -- appearance: auto; -- -moz-default-appearance: -moz-window-titlebar; -- z-index: -1; -+ @media not (-moz-mac-tahoe-theme) { -+ &::after { -+ content: ""; -+ position: absolute; -+ inset: 0; -+ appearance: auto; -+ -moz-default-appearance: -moz-window-titlebar; -+ z-index: -1; -+ } - } - } - -diff --git a/browser/themes/shared/pageInfo.css b/browser/themes/shared/pageInfo.css -index 92259765b92f..e7bf5a299abe 100644 ---- a/browser/themes/shared/pageInfo.css -+++ b/browser/themes/shared/pageInfo.css -@@ -14,13 +14,15 @@ - align-items: center; - justify-content: center; - -- &::after { -- content: ""; -- position: absolute; -- inset: 0; -- appearance: auto; -- -moz-default-appearance: -moz-window-titlebar; -- z-index: -1; -+ @media not (-moz-mac-tahoe-theme) { -+ &::after { -+ content: ""; -+ position: absolute; -+ inset: 0; -+ appearance: auto; -+ -moz-default-appearance: -moz-window-titlebar; -+ z-index: -1; -+ } - } - } - } -diff --git a/layout/style/test/chrome/chrome-only-media-queries.js b/layout/style/test/chrome/chrome-only-media-queries.js -index e200152ba41b..88ba56525e99 100644 ---- a/layout/style/test/chrome/chrome-only-media-queries.js -+++ b/layout/style/test/chrome/chrome-only-media-queries.js -@@ -4,6 +4,7 @@ const CHROME_ONLY_TOGGLES = [ - "-moz-print-preview", - "-moz-overlay-scrollbars", - "-moz-mac-big-sur-theme", -+ "-moz-mac-tahoe-theme", - "-moz-menubar-drag", - "-moz-windows-accent-color-in-titlebar", - "-moz-swipe-animation-enabled", -diff --git a/servo/components/style/gecko/media_features.rs b/servo/components/style/gecko/media_features.rs -index b0082951254a..ddbcd495260b 100644 ---- a/servo/components/style/gecko/media_features.rs -+++ b/servo/components/style/gecko/media_features.rs -@@ -645,7 +645,7 @@ macro_rules! lnf_int_feature { - /// to support new types in these entries and (2) ensuring that either - /// nsPresContext::MediaFeatureValuesChanged is called when the value that - /// would be returned by the evaluator function could change. --pub static MEDIA_FEATURES: [QueryFeatureDescription; 58] = [ -+pub static MEDIA_FEATURES: [QueryFeatureDescription; 59] = [ - feature!( - atom!("width"), - AllowsRanges::Yes, -@@ -918,6 +918,7 @@ pub static MEDIA_FEATURES: [QueryFeatureDescription; 58] = [ - ), - lnf_int_feature!(atom!("-moz-menubar-drag"), MenuBarDrag), - lnf_int_feature!(atom!("-moz-mac-big-sur-theme"), MacBigSurTheme), -+ lnf_int_feature!(atom!("-moz-mac-tahoe-theme"), MacTahoeTheme), - feature!( - atom!("-moz-mac-rtl"), - AllowsRanges::No, -diff --git a/toolkit/themes/shared/menu.css b/toolkit/themes/shared/menu.css -index f1330e7dd7a3..23c04a931ae0 100644 ---- a/toolkit/themes/shared/menu.css -+++ b/toolkit/themes/shared/menu.css -@@ -31,6 +31,11 @@ panel { - } - @media (-moz-platform: macos) { - --menuitem-padding: 3px 9px; -+ -+ @media (-moz-mac-tahoe-theme) { -+ --menuitem-padding: 4px 11px; -+ --menuitem-border-radius: 7px; -+ } - } - - @media (-moz-platform: windows) { -diff --git a/widget/LookAndFeel.h b/widget/LookAndFeel.h -index fc1e28206ac2..1661476a75f0 100644 ---- a/widget/LookAndFeel.h -+++ b/widget/LookAndFeel.h -@@ -117,6 +117,12 @@ class LookAndFeel { - */ - MacBigSurTheme, - -+ /* -+ * A Boolean value to determine whether the macOS Tahoe-specific -+ * theming should be used. -+ */ -+ MacTahoeTheme, -+ - /* - * AlertNotificationOrigin indicates from which corner of the - * screen alerts slide in, and from which direction (horizontal/vertical). -diff --git a/widget/cocoa/nsCocoaWindow.h b/widget/cocoa/nsCocoaWindow.h -index 38aca9f32590..9484ef078900 100644 ---- a/widget/cocoa/nsCocoaWindow.h -+++ b/widget/cocoa/nsCocoaWindow.h -@@ -111,6 +111,9 @@ class TextInputHandler; - - (void)setEffectViewWrapperForStyle:(mozilla::WindowShadow)aStyle; - @property(nonatomic) mozilla::WindowShadow shadowStyle; - -+- (void)updateTitlebarTransparency; -+- (void)setTitlebarSeparatorStyle:(NSTitlebarSeparatorStyle)aStyle API_AVAILABLE(macos(11.0)); -+ - - (void)releaseJSObjects; - - @end -diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm -index c9991df86dc6..c746a78b8440 100644 ---- a/widget/cocoa/nsCocoaWindow.mm -+++ b/widget/cocoa/nsCocoaWindow.mm -@@ -7611,6 +7611,15 @@ - (id)initWithContentRect:(NSRect)aContentRect - // vibrancy effect and window border. - - (void)setEffectViewWrapperForStyle:(WindowShadow)aStyle { - NSView* wrapper = [&]() -> NSView* { -+ if (@available(macOS 26.0, *)) { -+ if (aStyle == WindowShadow::Menu) { -+ // Menus on macOS 26 use glass instead of vibrancy. -+ auto* effectView = -+ [[NSGlassEffectView alloc] initWithFrame:self.contentView.frame]; -+ effectView.cornerRadius = 12.0f; -+ return effectView; -+ } -+ } - if (aStyle == WindowShadow::Menu || aStyle == WindowShadow::Tooltip) { - const bool isMenu = aStyle == WindowShadow::Menu; - auto* effectView = -@@ -7721,6 +7730,7 @@ - (void)setDrawsContentsIntoWindowFrame:(BOOL)aState { - mDrawsIntoWindowFrame = aState; - if (changed) { - [self reflowTitlebarElements]; -+ [self updateTitlebarTransparency]; - } - } - -@@ -7850,6 +7860,32 @@ - (void)reflowTitlebarElements { - } - } - -+- (void)updateTitlebarTransparency { -+ if (self.drawsContentsIntoWindowFrame) { -+ // Hide the titlebar if we are drawing into it -+ self.titlebarAppearsTransparent = true; -+ return; -+ } -+ -+ if (@available(macOS 26.0, *)) { -+ // On macOS 26, the titlebar must be transparent to hide the separator. -+ // This does not affect the titlebar background on macOS 26, as it -+ // already matches the window background even when not transparent. -+ if (self.titlebarSeparatorStyle == NSTitlebarSeparatorStyleNone) { -+ self.titlebarAppearsTransparent = true; -+ return; -+ } -+ } -+ -+ // Show the titlebar otherwise. -+ self.titlebarAppearsTransparent = false; -+} -+ -+- (void)setTitlebarSeparatorStyle:(NSTitlebarSeparatorStyle)aStyle { -+ [super setTitlebarSeparatorStyle:aStyle]; -+ [self updateTitlebarTransparency]; -+} -+ - - (BOOL)respondsToSelector:(SEL)aSelector { - // Claim the window doesn't respond to this so that the system - // doesn't steal keyboard equivalents for it. Bug 613710. -@@ -8166,8 +8202,6 @@ - (void)setDrawsContentsIntoWindowFrame:(BOOL)aState { - BOOL stateChanged = self.drawsContentsIntoWindowFrame != aState; - [super setDrawsContentsIntoWindowFrame:aState]; - if (stateChanged && [self.delegate isKindOfClass:[WindowDelegate class]]) { -- // Hide the titlebar if we are drawing into it -- self.titlebarAppearsTransparent = aState; - self.titleVisibility = aState ? NSWindowTitleHidden : NSWindowTitleVisible; - - // Here we extend / shrink our mainChildView. -diff --git a/widget/cocoa/nsLookAndFeel.mm b/widget/cocoa/nsLookAndFeel.mm -index 16cf2ed9b0ea..579b2445adfe 100644 ---- a/widget/cocoa/nsLookAndFeel.mm -+++ b/widget/cocoa/nsLookAndFeel.mm -@@ -458,6 +458,9 @@ static bool PrefersNonBlinkingTextInsertionIndicator() { - case IntID::MacBigSurTheme: - aResult = nsCocoaFeatures::OnBigSurOrLater(); - break; -+ case IntID::MacTahoeTheme: -+ aResult = nsCocoaFeatures::OnTahoeOrLater(); -+ break; - case IntID::AlertNotificationOrigin: - aResult = NS_ALERT_TOP; - break; -diff --git a/widget/cocoa/nsNativeThemeCocoa.mm b/widget/cocoa/nsNativeThemeCocoa.mm -index 6ddd495b73f9..b94b8331be87 100644 ---- a/widget/cocoa/nsNativeThemeCocoa.mm -+++ b/widget/cocoa/nsNativeThemeCocoa.mm -@@ -191,6 +191,10 @@ static NSControlSize ControlSizeForEnum(CocoaSize enumControlSize) { - - static void InflateControlRect(NSRect* rect, NSControlSize cocoaControlSize, - const CellMarginArray& marginSet) { -+ if (nsCocoaFeatures::OnTahoeOrLater()) { -+ // Controls on macOS 26 fill the entire frame and do not require inflation. -+ return; -+ } - auto controlSize = EnumSizeForCocoaSize(cocoaControlSize); - const IntMargin& buttonMargins = marginSet[controlSize]; - rect->origin.x -= buttonMargins.left; -diff --git a/widget/nsXPLookAndFeel.cpp b/widget/nsXPLookAndFeel.cpp -index c0dde6e1c04a..24b6f83930a7 100644 ---- a/widget/nsXPLookAndFeel.cpp -+++ b/widget/nsXPLookAndFeel.cpp -@@ -121,6 +121,7 @@ static const char sIntPrefs[][45] = { - "ui.windowsMica", - "ui.windowsMicaPopups", - "ui.macBigSurTheme", -+ "ui.macTahoeTheme", - "ui.alertNotificationOrigin", - "ui.scrollToClick", - "ui.IMERawInputUnderlineStyle", -diff --git a/xpcom/ds/StaticAtoms.py b/xpcom/ds/StaticAtoms.py -index e1a0497dc0b9..ec88f0496378 100644 ---- a/xpcom/ds/StaticAtoms.py -+++ b/xpcom/ds/StaticAtoms.py -@@ -2283,6 +2283,7 @@ STATIC_ATOMS = [ - Atom("_moz_windows_mica", "-moz-windows-mica"), - Atom("_moz_windows_mica_popups", "-moz-windows-mica-popups"), - Atom("_moz_mac_big_sur_theme", "-moz-mac-big-sur-theme"), -+ Atom("_moz_mac_tahoe_theme", "-moz-mac-tahoe-theme"), - Atom("_moz_mac_rtl", "-moz-mac-rtl"), - Atom("_moz_mac_titlebar_height", "-moz-mac-titlebar-height"), - Atom("_moz_platform", "-moz-platform"), diff --git a/src/layout/generic/nsIFrame-cpp.patch b/src/layout/generic/nsIFrame-cpp.patch index 3a9042a12..214996601 100644 --- a/src/layout/generic/nsIFrame-cpp.patch +++ b/src/layout/generic/nsIFrame-cpp.patch @@ -1,8 +1,8 @@ diff --git a/layout/generic/nsIFrame.cpp b/layout/generic/nsIFrame.cpp -index 7c8f9c8c8ea4cc43825b388e7dd655a2ef34e75f..da5f48bb2d55ae306c72b062169a9758ad10c014 100644 +index a7b60e40e6947754374dcda2fc69cdb329c337ac..c7e025109c4c43865205cbd445d9d20305974974 100644 --- a/layout/generic/nsIFrame.cpp +++ b/layout/generic/nsIFrame.cpp -@@ -11912,6 +11912,11 @@ gfx::Matrix nsIFrame::ComputeWidgetTransform() const { +@@ -11899,6 +11899,11 @@ gfx::Matrix nsIFrame::ComputeWidgetTransform() const { gfx::Matrix4x4 matrix = nsStyleTransformMatrix::ReadTransforms( uiReset->mMozWindowTransform, refBox, float(appUnitsPerDevPixel)); diff --git a/src/layout/style/nsStyleStruct-cpp.patch b/src/layout/style/nsStyleStruct-cpp.patch index f3c81c9a9..adc1c8369 100644 --- a/src/layout/style/nsStyleStruct-cpp.patch +++ b/src/layout/style/nsStyleStruct-cpp.patch @@ -1,8 +1,8 @@ diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp -index 2413696f643246a825e184732bfba6eb33f606fd..932d3c316ee60c59b5f999e5ddd65c6acee3129d 100644 +index 9f86fdfe6a70394c5fcd9e07177e5f325c2e4951..f9b3bc2e366f0cee2fbc992c4babce068b954413 100644 --- a/layout/style/nsStyleStruct.cpp +++ b/layout/style/nsStyleStruct.cpp -@@ -3273,6 +3273,9 @@ nsStyleUIReset::nsStyleUIReset() +@@ -3233,6 +3233,9 @@ nsStyleUIReset::nsStyleUIReset() mWindowShadow(StyleWindowShadow::Auto), mWindowOpacity(1.0), mMozWindowInputRegionMargin(StyleLength::Zero()), @@ -12,7 +12,7 @@ index 2413696f643246a825e184732bfba6eb33f606fd..932d3c316ee60c59b5f999e5ddd65c6a mTransitions( nsStyleAutoArray::WITH_SINGLE_INITIAL_ELEMENT), mTransitionTimingFunctionCount(1), -@@ -3317,6 +3320,7 @@ nsStyleUIReset::nsStyleUIReset(const nsStyleUIReset& aSource) +@@ -3277,6 +3280,7 @@ nsStyleUIReset::nsStyleUIReset(const nsStyleUIReset& aSource) mWindowOpacity(aSource.mWindowOpacity), mMozWindowInputRegionMargin(aSource.mMozWindowInputRegionMargin), mMozWindowTransform(aSource.mMozWindowTransform), diff --git a/src/layout/style/nsStyleStruct-h.patch b/src/layout/style/nsStyleStruct-h.patch index 1e0c4aee3..dcc8877e3 100644 --- a/src/layout/style/nsStyleStruct-h.patch +++ b/src/layout/style/nsStyleStruct-h.patch @@ -1,8 +1,8 @@ diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h -index f40f005606946b1149bfb7b67d1df9be04ddaf07..64da397ceb4192aacd24c4cd9fb0efbad2d363ed 100644 +index 46f9312292b6f332947e68586ae770acffe8c418..2408eb06ab466faba99e83b5c92759cf3277edad 100644 --- a/layout/style/nsStyleStruct.h +++ b/layout/style/nsStyleStruct.h -@@ -2094,6 +2094,7 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleUIReset { +@@ -2055,6 +2055,7 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleUIReset { // The margin of the window region that should be transparent to events. mozilla::StyleLength mMozWindowInputRegionMargin; mozilla::StyleTransform mMozWindowTransform; diff --git a/src/modules/libpref/init/StaticPrefList-yaml.patch b/src/modules/libpref/init/StaticPrefList-yaml.patch index 4156b2b27..7fd0507a6 100644 --- a/src/modules/libpref/init/StaticPrefList-yaml.patch +++ b/src/modules/libpref/init/StaticPrefList-yaml.patch @@ -1,8 +1,8 @@ diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml -index 86dc55502b05eed6e4bb0a2ed489e1e8e76840cb..2c2918b2d3c76063662fe59d7fde745a36a92ab6 100644 +index 34f519ad1107736f47719679be7f4fa20cd718c1..7f886071259d6ddd971ca5c92180de0cca9a0f5d 100644 --- a/modules/libpref/init/StaticPrefList.yaml +++ b/modules/libpref/init/StaticPrefList.yaml -@@ -19316,6 +19316,7 @@ +@@ -19496,6 +19496,7 @@ mirror: always #endif diff --git a/src/netwerk/protocol/http/moz-build.patch b/src/netwerk/protocol/http/moz-build.patch index e77666bdc..19b407ac1 100644 --- a/src/netwerk/protocol/http/moz-build.patch +++ b/src/netwerk/protocol/http/moz-build.patch @@ -1,8 +1,8 @@ diff --git a/netwerk/protocol/http/moz.build b/netwerk/protocol/http/moz.build -index 906a2fcdcc2684ff4326aeb7f22f3441add7e56c..37e16b62d012498c66bc3a38f4ce48972298b6be 100644 +index d2330003caf35c43d6831fb0d356ece513906f78..76c2faf822ddaf645eb03d93380c58b4e3b510c0 100644 --- a/netwerk/protocol/http/moz.build +++ b/netwerk/protocol/http/moz.build -@@ -225,7 +225,7 @@ LOCAL_INCLUDES += [ +@@ -227,7 +227,7 @@ LOCAL_INCLUDES += [ "/netwerk/url-classifier", ] diff --git a/src/servo/components/style/gecko/media_features-rs.patch b/src/servo/components/style/gecko/media_features-rs.patch index 5763b5101..7c10d5265 100644 --- a/src/servo/components/style/gecko/media_features-rs.patch +++ b/src/servo/components/style/gecko/media_features-rs.patch @@ -1,5 +1,5 @@ diff --git a/servo/components/style/gecko/media_features.rs b/servo/components/style/gecko/media_features.rs -index b0082951254ad592c73caaa16c5b5c57127831a9..9b3566b08aacfcf2cfbf9941b2b3ca91a31ade59 100644 +index ddbcd495260b5bcc4f55ebf7c06fcb6b5dc595c7..c629ac40f4fe3e03ffc765d3b65f3d348f4b05c6 100644 --- a/servo/components/style/gecko/media_features.rs +++ b/servo/components/style/gecko/media_features.rs @@ -13,6 +13,9 @@ use crate::values::computed::{CSSPixelLength, Context, Ratio, Resolution}; diff --git a/src/testing/mochitest/browser-test-js.patch b/src/testing/mochitest/browser-test-js.patch index ff99dd955..231a99e9b 100644 --- a/src/testing/mochitest/browser-test-js.patch +++ b/src/testing/mochitest/browser-test-js.patch @@ -1,37 +1,30 @@ diff --git a/testing/mochitest/browser-test.js b/testing/mochitest/browser-test.js -index 979c6a0960cb8c490b612649d0fac55cd7b7d0f7..f149f248f705484b3572ca462660932dd792e312 100644 +index d5f320c5e97aae9bfd43d28e3d4a274d9bbc0787..24dc32a5bf6ae9abaa8f3fe8c37b031a76fb4d60 100644 --- a/testing/mochitest/browser-test.js +++ b/testing/mochitest/browser-test.js -@@ -440,11 +440,11 @@ Tester.prototype = { - this.currentTest && - window.gBrowser && - AppConstants.MOZ_APP_NAME != "thunderbird" && -- gBrowser.tabs.length > 1 -+ gBrowser.tabs.length > 2 - ) { - let lastURI = ""; - let lastURIcount = 0; -- while (gBrowser.tabs.length > 1) { -+ while (gBrowser.tabs.length > 2) { - let lastTab = gBrowser.tabs[gBrowser.tabs.length - 1]; - if (!lastTab.closing) { - // Report the stale tab as an error only when they're not closing. -@@ -479,12 +479,12 @@ Tester.prototype = { +@@ -438,10 +438,10 @@ Tester.prototype = { + // But not the Thunderbird window, it doesn't have these things! + if (AppConstants.MOZ_APP_NAME != "thunderbird") { + // Remove stale tabs +- if (this.currentTest && window.gBrowser && gBrowser.tabs.length > 1) { ++ if (this.currentTest && window.gBrowser && gBrowser.tabs.length > 2) { + let lastURI = ""; + let lastURIcount = 0; +- while (gBrowser.tabs.length > 1) { ++ while (gBrowser.tabs.length > 2) { + let lastTab = gBrowser.tabs[gBrowser.tabs.length - 1]; + if (!lastTab.closing) { + // Report the stale tab as an error only when they're not closing. +@@ -476,12 +476,6 @@ Tester.prototype = { - // Replace the last tab with a fresh one - if (window.gBrowser && AppConstants.MOZ_APP_NAME != "thunderbird") { -- gBrowser.addTab("about:blank", { -- skipAnimation: true, -- triggeringPrincipal: -- Services.scriptSecurityManager.getSystemPrincipal(), -- }); -- gBrowser.removeTab(gBrowser.selectedTab, { skipPermitUnload: true }); -+ // gBrowser.addTab("about:blank", { -+ // skipAnimation: true, -+ // triggeringPrincipal: -+ // Services.scriptSecurityManager.getSystemPrincipal(), -+ // }); -+ // gBrowser.removeTab(gBrowser.selectedTab, { skipPermitUnload: true }); - gBrowser.stop(); - } + // Replace the last tab with a fresh one + if (window.gBrowser) { +- gBrowser.addTab("about:blank", { +- skipAnimation: true, +- triggeringPrincipal: +- Services.scriptSecurityManager.getSystemPrincipal(), +- }); +- gBrowser.removeTab(gBrowser.selectedTab, { skipPermitUnload: true }); + gBrowser.stop(); + } diff --git a/src/toolkit/actors/PictureInPictureChild-sys-mjs.patch b/src/toolkit/actors/PictureInPictureChild-sys-mjs.patch index 68ff066c2..11a3e7f28 100644 --- a/src/toolkit/actors/PictureInPictureChild-sys-mjs.patch +++ b/src/toolkit/actors/PictureInPictureChild-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/toolkit/actors/PictureInPictureChild.sys.mjs b/toolkit/actors/PictureInPictureChild.sys.mjs -index 21b6295bf46336a70ed0a3797cf3210c8c0cb545..5a7018f1f923e977f63fae296ffdff1730ad1218 100644 +index ea47bd1029de4571a045c1ee17c313dc9d62cad8..0f8afca693e0fc112839cfb998fd8baa20227f06 100644 --- a/toolkit/actors/PictureInPictureChild.sys.mjs +++ b/toolkit/actors/PictureInPictureChild.sys.mjs -@@ -292,6 +292,7 @@ export class PictureInPictureLauncherChild extends JSWindowActorChild { +@@ -295,6 +295,7 @@ export class PictureInPictureLauncherChild extends JSWindowActorChild { if ( video && PictureInPictureChild.videoIsPlaying(video) && diff --git a/src/toolkit/content/widgets/findbar-js.patch b/src/toolkit/content/widgets/findbar-js.patch index 967c891d8..1390e7618 100644 --- a/src/toolkit/content/widgets/findbar-js.patch +++ b/src/toolkit/content/widgets/findbar-js.patch @@ -1,5 +1,5 @@ diff --git a/toolkit/content/widgets/findbar.js b/toolkit/content/widgets/findbar.js -index 8ca512e0b212bb6e25ed37e7edb4f8e2587d5bb0..5abfff92b3a8df5d138082af96419668a2c8a9bb 100644 +index 589d96886b1c9a1bd0e819957978a8968402e98b..4df4be8dbbe67063f0e1920baa2db3f5b909b11b 100644 --- a/toolkit/content/widgets/findbar.js +++ b/toolkit/content/widgets/findbar.js @@ -1188,6 +1188,7 @@ diff --git a/src/toolkit/content/widgets/tabbox-js.patch b/src/toolkit/content/widgets/tabbox-js.patch index 2cdd2d525..cc7dcea1c 100644 --- a/src/toolkit/content/widgets/tabbox-js.patch +++ b/src/toolkit/content/widgets/tabbox-js.patch @@ -1,5 +1,5 @@ diff --git a/toolkit/content/widgets/tabbox.js b/toolkit/content/widgets/tabbox.js -index 70afbfc87d543971e6f8a0661a44b682920a7bc4..2035222f4680e2eaa27b3072a12a9163b914adec 100644 +index cfe2da6e199667bd668f117cc8972212c7f57da2..bdd7dcc26139202e6e31afde47dc4d877f3db3c5 100644 --- a/toolkit/content/widgets/tabbox.js +++ b/toolkit/content/widgets/tabbox.js @@ -213,7 +213,7 @@ @@ -11,7 +11,7 @@ index 70afbfc87d543971e6f8a0661a44b682920a7bc4..2035222f4680e2eaa27b3072a12a9163 this._selectedPanel?.classList.add("deck-selected"); } this.setAttribute("selectedIndex", val); -@@ -610,7 +610,7 @@ +@@ -697,7 +697,7 @@ if (!tab) { return; } @@ -20,7 +20,7 @@ index 70afbfc87d543971e6f8a0661a44b682920a7bc4..2035222f4680e2eaa27b3072a12a9163 if (otherTab != tab && otherTab.selected) { otherTab._selected = false; } -@@ -646,6 +646,7 @@ +@@ -733,6 +733,7 @@ * @param {MozTab|null} [val] */ set selectedItem(val) { @@ -28,7 +28,7 @@ index 70afbfc87d543971e6f8a0661a44b682920a7bc4..2035222f4680e2eaa27b3072a12a9163 if (val && !val.selected) { // The selectedIndex setter ignores invalid values // such as -1 if |val| isn't one of our child nodes. -@@ -823,7 +824,7 @@ +@@ -910,7 +911,7 @@ if (tab == startTab) { return null; } @@ -37,7 +37,7 @@ index 70afbfc87d543971e6f8a0661a44b682920a7bc4..2035222f4680e2eaa27b3072a12a9163 return tab; } } -@@ -885,10 +886,11 @@ +@@ -972,10 +973,11 @@ * @param {boolean} [aWrap] */ advanceSelectedTab(aDir, aWrap) { diff --git a/src/toolkit/content/xul-css.patch b/src/toolkit/content/xul-css.patch index 3f25b9b81..fb701787d 100644 --- a/src/toolkit/content/xul-css.patch +++ b/src/toolkit/content/xul-css.patch @@ -1,11 +1,11 @@ diff --git a/toolkit/content/xul.css b/toolkit/content/xul.css -index badef34e6072da6e0e1180f5f08ab201a89fa195..2842eee9d5655444ccac8c085f19df0247886d64 100644 +index 57dd6042d2620dd64c55e0e966913047a6c3502f..40d016a0a13596439046e2bbcfa59daa30f10b2d 100644 --- a/toolkit/content/xul.css +++ b/toolkit/content/xul.css -@@ -461,7 +461,8 @@ deck > *|*:not(:-moz-native-anonymous) { - } - +@@ -463,7 +463,8 @@ deck > *|*:not(:-moz-native-anonymous) { tabpanels > .deck-selected, + tabpanels > .split-view-panel, + tabpanels > .split-view-splitter, -deck > .deck-selected { +deck > .deck-selected, +tabpanels > [zen-split="true"] { diff --git a/src/toolkit/modules/ShortcutUtils-sys-mjs.patch b/src/toolkit/modules/ShortcutUtils-sys-mjs.patch index 8dcf961a9..d544c4f4b 100644 --- a/src/toolkit/modules/ShortcutUtils-sys-mjs.patch +++ b/src/toolkit/modules/ShortcutUtils-sys-mjs.patch @@ -1,16 +1,8 @@ diff --git a/toolkit/modules/ShortcutUtils.sys.mjs b/toolkit/modules/ShortcutUtils.sys.mjs -index 3e796cb6586ad39257a29c2a6da1d0415f4c2676..98b639c726efee850456a3af8a01f0ce66423ba0 100644 +index e52e88a09a281e69ecf15e7b84b8b98736e1dbdd..f47fbe24e0860195e11fe5231ab27e52aad96d0b 100644 --- a/toolkit/modules/ShortcutUtils.sys.mjs +++ b/toolkit/modules/ShortcutUtils.sys.mjs -@@ -140,6 +140,7 @@ export var ShortcutUtils = { - key = keyCode.replace(/^VK_/, ""); - } - } else { -+ if (!keyAttribute) return ""; - key = keyAttribute.toUpperCase(); - } - -@@ -373,13 +374,11 @@ export var ShortcutUtils = { +@@ -414,13 +414,11 @@ export var ShortcutUtils = { } break; case event.DOM_VK_UP: // fall through diff --git a/src/toolkit/modules/moz-build.patch b/src/toolkit/modules/moz-build.patch index f7c21aa5f..ee6a3f71a 100644 --- a/src/toolkit/modules/moz-build.patch +++ b/src/toolkit/modules/moz-build.patch @@ -1,5 +1,5 @@ diff --git a/toolkit/modules/moz.build b/toolkit/modules/moz.build -index e43870b10c5b35165fd21b48065980060104dc52..71e3db5618c834bc4ff9d481b1e667f2b02b183e 100644 +index a17e15c74c8e627cf805d1f026438759af7e4a97..fc6e1e6b2711e474d65a688b2481b7a26cad2a71 100644 --- a/toolkit/modules/moz.build +++ b/toolkit/modules/moz.build @@ -280,6 +280,7 @@ for var in ( diff --git a/src/toolkit/moz-configure.patch b/src/toolkit/moz-configure.patch index 7cbc4274e..2427976d1 100644 --- a/src/toolkit/moz-configure.patch +++ b/src/toolkit/moz-configure.patch @@ -1,5 +1,5 @@ diff --git a/toolkit/moz.configure b/toolkit/moz.configure -index 2fdcf62bde7805e52737cb06ec67908fa40524c9..b9f9e3abeb5cf770b29e1354615184fce2162ec7 100644 +index f3032042d34766b0e94c56872f91271f307ffc89..8c8540e8bf8d3df5b33e2f0da6b94a32e75684b5 100644 --- a/toolkit/moz.configure +++ b/toolkit/moz.configure @@ -22,6 +22,7 @@ def check_moz_app_id(moz_app_id, build_project): diff --git a/src/toolkit/mozapps/extensions/AddonManager-sys-mjs.patch b/src/toolkit/mozapps/extensions/AddonManager-sys-mjs.patch index 3fd64f2b3..002478c6e 100644 --- a/src/toolkit/mozapps/extensions/AddonManager-sys-mjs.patch +++ b/src/toolkit/mozapps/extensions/AddonManager-sys-mjs.patch @@ -1,8 +1,8 @@ diff --git a/toolkit/mozapps/extensions/AddonManager.sys.mjs b/toolkit/mozapps/extensions/AddonManager.sys.mjs -index 2c1e187d14bae0dcc17a1fa2de768e7c949b3776..c322b770bdc1a0786d8e3bf1af618e3d3d3dd26e 100644 +index 3562dfc61f6462a4e46ff321d4df4df23f48949d..2afc42cae98a24ecfd129c8a3dd1e7e0a94882ab 100644 --- a/toolkit/mozapps/extensions/AddonManager.sys.mjs +++ b/toolkit/mozapps/extensions/AddonManager.sys.mjs -@@ -1227,12 +1227,12 @@ var AddonManagerInternal = { +@@ -1243,12 +1243,12 @@ var AddonManagerInternal = { ITEM_VERSION: aAddon.version, ITEM_STATUS: addonStatus, APP_ID: Services.appinfo.ID, diff --git a/src/toolkit/themes/shared/aboutReader-css.patch b/src/toolkit/themes/shared/aboutReader-css.patch index 6ea618c2e..f037197ad 100644 --- a/src/toolkit/themes/shared/aboutReader-css.patch +++ b/src/toolkit/themes/shared/aboutReader-css.patch @@ -1,5 +1,5 @@ diff --git a/toolkit/themes/shared/aboutReader.css b/toolkit/themes/shared/aboutReader.css -index 1eb2c44694bb4970134fb5d290e32c7053103461..8d8237029976960048cb9aceede918c9e20c523b 100644 +index e9dedcacb868fb0908c3432e1ccf3956b383aea7..6418c08550b9b4876df20ca5f93d093be0583f83 100644 --- a/toolkit/themes/shared/aboutReader.css +++ b/toolkit/themes/shared/aboutReader.css @@ -1181,3 +1181,43 @@ pre code { diff --git a/src/toolkit/themes/shared/in-content/common-shared-css.patch b/src/toolkit/themes/shared/in-content/common-shared-css.patch index 615b9a4e5..0f1788dfb 100644 --- a/src/toolkit/themes/shared/in-content/common-shared-css.patch +++ b/src/toolkit/themes/shared/in-content/common-shared-css.patch @@ -1,5 +1,5 @@ diff --git a/toolkit/themes/shared/in-content/common-shared.css b/toolkit/themes/shared/in-content/common-shared.css -index 96129498de63153704711bf7a21fb10922e80917..83f7b5ee2f15197dc42ec02ec1a73cc2bfc19a4d 100644 +index 2d068aa3472887e089254834d92f75b9f6d9894b..1a6d5b87fdcfb338222475bb6362820e3915955d 100644 --- a/toolkit/themes/shared/in-content/common-shared.css +++ b/toolkit/themes/shared/in-content/common-shared.css @@ -4,7 +4,7 @@ diff --git a/src/toolkit/themes/shared/menulist-css.patch b/src/toolkit/themes/shared/menulist-css.patch index a8cd61158..d295c0745 100644 --- a/src/toolkit/themes/shared/menulist-css.patch +++ b/src/toolkit/themes/shared/menulist-css.patch @@ -1,5 +1,5 @@ diff --git a/toolkit/themes/shared/menulist.css b/toolkit/themes/shared/menulist.css -index 8f9c006945e67f668075bd36ce83d5a772a9a796..08d68c015b001233548cd6c7babad17f3a638702 100644 +index 73149025f13e8805774c004820d57755d2bf89a9..f503e6bcd1c466757fc58e033aa0d68343685e28 100644 --- a/toolkit/themes/shared/menulist.css +++ b/toolkit/themes/shared/menulist.css @@ -53,7 +53,7 @@ @@ -9,5 +9,5 @@ index 8f9c006945e67f668075bd36ce83d5a772a9a796..08d68c015b001233548cd6c7babad17f - background-color: var(--button-background-color); + background-color: light-dark(rgba(0,0,0,.1), rgba(255,255,255,.1)); color: var(--button-text-color); - border-radius: var(--border-radius-small); + border-radius: var(--button-border-radius); padding-block: 4px; diff --git a/src/toolkit/themes/shared/pictureinpicture/player-css.patch b/src/toolkit/themes/shared/pictureinpicture/player-css.patch index 798902248..1bdc8564d 100644 --- a/src/toolkit/themes/shared/pictureinpicture/player-css.patch +++ b/src/toolkit/themes/shared/pictureinpicture/player-css.patch @@ -1,5 +1,5 @@ diff --git a/toolkit/themes/shared/pictureinpicture/player.css b/toolkit/themes/shared/pictureinpicture/player.css -index 33b10bebcdfe636d7ff0f61a11d5fa4664a31f78..83b53817c53f43cca3be40b490300109b4949f5b 100644 +index 12dba9ec5eee93476034b1e8b503a301fc18dbcb..b81c9e997d85e78cdf6ab460e14a5128117639bd 100644 --- a/toolkit/themes/shared/pictureinpicture/player.css +++ b/toolkit/themes/shared/pictureinpicture/player.css @@ -738,3 +738,17 @@ input:checked + .slider::before { diff --git a/src/toolkit/themes/shared/popup-css.patch b/src/toolkit/themes/shared/popup-css.patch index c6400bc28..83a79dc5d 100644 --- a/src/toolkit/themes/shared/popup-css.patch +++ b/src/toolkit/themes/shared/popup-css.patch @@ -1,5 +1,5 @@ diff --git a/toolkit/themes/shared/popup.css b/toolkit/themes/shared/popup.css -index 9533f5e0fee5fb0805ae4b65e56307986ee26417..a3a06dce50142354b78561ecfb70ba45fe10b9c1 100644 +index c2618b86d7e8bb71f9f7f71ef9916c8140ca1ead..9e2006015e22f1ac043c46066c4c9a85fe053a21 100644 --- a/toolkit/themes/shared/popup.css +++ b/toolkit/themes/shared/popup.css @@ -22,8 +22,8 @@ panel { diff --git a/src/toolkit/themes/shared/tree/tree-css.patch b/src/toolkit/themes/shared/tree/tree-css.patch index b5347977d..e60fffebe 100644 --- a/src/toolkit/themes/shared/tree/tree-css.patch +++ b/src/toolkit/themes/shared/tree/tree-css.patch @@ -1,5 +1,5 @@ diff --git a/toolkit/themes/shared/tree/tree.css b/toolkit/themes/shared/tree/tree.css -index c50cab31785eecece2bf061b9770ba90c6ed0181..dfbd227ddab802d927b6897454a86fcd7252e96f 100644 +index ee8c5fc6399092cbb45657bb3ee49178f797349e..f30ff2db77854fb4acca6279369e313da0a6a4e2 100644 --- a/toolkit/themes/shared/tree/tree.css +++ b/toolkit/themes/shared/tree/tree.css @@ -12,6 +12,7 @@ diff --git a/src/tools/signing/macos/mach_commands-py.patch b/src/tools/signing/macos/mach_commands-py.patch index be02e1b77..b448eb9c3 100644 --- a/src/tools/signing/macos/mach_commands-py.patch +++ b/src/tools/signing/macos/mach_commands-py.patch @@ -1,5 +1,5 @@ diff --git a/tools/signing/macos/mach_commands.py b/tools/signing/macos/mach_commands.py -index 721790b0d067ea1cdc6ddc9d220e423de9206d53..ca80e6f2c8bcd82eda24d03720a37a2bfdc50cfe 100644 +index 3bd0fa80c18b903e9828d2f61be3cfb71e2132e0..4d0fdd64d19cb429c19701ea008e02dc16489834 100644 --- a/tools/signing/macos/mach_commands.py +++ b/tools/signing/macos/mach_commands.py @@ -37,7 +37,6 @@ from mozbuild.base import MachCommandConditions as conditions @@ -21,7 +21,7 @@ index 721790b0d067ea1cdc6ddc9d220e423de9206d53..ca80e6f2c8bcd82eda24d03720a37a2b if use_rcodesign_arg is True: sign_with_rcodesign( command_context, -@@ -608,7 +611,7 @@ def sign_with_rcodesign( +@@ -613,7 +616,7 @@ def sign_with_rcodesign( # input path and its options are specified as standard arguments. ctx.log(logging.INFO, "macos-sign", {}, "Signing with rcodesign") diff --git a/src/widget/cocoa/nsCocoaWindow-mm.patch b/src/widget/cocoa/nsCocoaWindow-mm.patch deleted file mode 100644 index ee8b3bc7a..000000000 --- a/src/widget/cocoa/nsCocoaWindow-mm.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm -index 6c80f33454503af0840af18cb88af44a006727ee..47b318814ddd57b1e73c66b576884b8e62093906 100644 ---- a/widget/cocoa/nsCocoaWindow.mm -+++ b/widget/cocoa/nsCocoaWindow.mm -@@ -7588,7 +7588,7 @@ static NSMutableSet* gSwizzledFrameViewClasses = nil; - - // Returns an autoreleased NSImage. - static NSImage* GetMenuMaskImage() { -- const CGFloat radius = 6.0f; -+ const CGFloat radius = 10.0f; - const NSSize maskSize = {radius * 3.0f, radius * 3.0f}; - NSImage* maskImage = [NSImage imageWithSize:maskSize - flipped:FALSE diff --git a/src/zen/@types/lib.gecko.dom.d.ts b/src/zen/@types/lib.gecko.dom.d.ts index 765ef7ca1..e45189432 100644 --- a/src/zen/@types/lib.gecko.dom.d.ts +++ b/src/zen/@types/lib.gecko.dom.d.ts @@ -1649,6 +1649,11 @@ interface InspectorFontFeature { tag: string; } +interface InspectorNearestColor { + colorName: string; + exact: boolean; +} + interface InspectorRGBATuple { a?: number; b?: number; @@ -1911,12 +1916,6 @@ interface MediaConfiguration { video?: VideoConfiguration; } -interface MediaControllerPositionState { - duration: number; - playbackRate: number; - position: number; -} - interface MediaDecoderDebugInfo { PlayState?: string; channels?: number; @@ -2884,7 +2883,7 @@ interface ProfilerMarkerOptions { captureStack?: boolean; category?: string; innerWindowId?: number; - startTime?: DOMHighResTimeStamp; + startTime?: number; } interface ProgressEventInit extends EventInit { @@ -3823,6 +3822,23 @@ interface SvcOutputMetadata { temporalLayerId?: number; } +interface SynthesizeMouseEventData { + button?: number; + buttons?: number; + clickCount?: number; + identifier?: number; + inputSource?: number; + modifiers?: number; + pressure?: number; +} + +interface SynthesizeMouseEventOptions { + ignoreRootScrollFrame?: boolean; + isDOMEventSynthesized?: boolean; + isWidgetEventSynthesized?: boolean; + toWindow?: boolean; +} + interface TCPServerSocketEventInit extends EventInit { socket?: TCPSocket | null; } @@ -6491,6 +6507,12 @@ interface CSSStyleRule extends CSSGroupingRule { selectorText: string; readonly style: CSSStyleDeclaration; readonly styleMap: StylePropertyMap; + getScopeRootFor( + selectorIndex: number, + element: Element, + pseudo?: string, + includeVisitedStyle?: boolean + ): Element | null; getSelectorWarnings(): SelectorWarning[]; selectorMatchesElement( selectorIndex: number, @@ -16331,7 +16353,6 @@ interface MediaController extends EventTarget { readonly id: number; readonly isActive: boolean; readonly isAudible: boolean; - readonly isBeingUsedInPIPModeOrFullscreen: boolean; readonly isPlaying: boolean; onactivated: ((this: MediaController, ev: Event) => any) | null; ondeactivated: ((this: MediaController, ev: Event) => any) | null; @@ -16343,7 +16364,6 @@ interface MediaController extends EventTarget { readonly supportedKeys: MediaControlKey[]; focus(): void; getMetadata(): MediaMetadataInit; - getPositionState(): MediaControllerPositionState; nextTrack(): void; pause(): void; play(): void; @@ -30163,6 +30183,13 @@ interface Window shouldReportForServiceWorkerScope(aScope: string): boolean; sizeToContent(constraints?: SizeToContentConstraints): void; stop(): void; + synthesizeMouseEvent( + type: string, + offsetX: number, + offsetY: number, + mouseEventData?: SynthesizeMouseEventData, + options?: SynthesizeMouseEventOptions + ): boolean; updateCommands(action: string): void; readonly STATE_MAXIMIZED: 1; readonly STATE_MINIMIZED: 2; @@ -31580,7 +31607,7 @@ declare namespace ChromeUtils { function CreateOriginAttributesFromOriginSuffix(suffix: string): OriginAttributesDictionary; function addProfilerMarker( name: string, - options?: ProfilerMarkerOptions | DOMHighResTimeStamp, + options?: ProfilerMarkerOptions | number, text?: string ): void; function androidMoveTaskToBack(): void; @@ -31659,6 +31686,7 @@ declare namespace ChromeUtils { function nondeterministicGetWeakSetKeys(aSet: any): any; function notifyDevToolsClosed(): void; function notifyDevToolsOpened(): void; + function now(): number; function originAttributesMatchPattern( originAttrs?: OriginAttributesDictionary, pattern?: OriginAttributesPatternDictionary @@ -31796,6 +31824,7 @@ declare namespace InspectorUtils { ): InspectorFontFace[]; function hasPseudoClassLock(element: Element, pseudoClass: string): boolean; function hasRulesModifiedByCSSOM(sheet: CSSStyleSheet): boolean; + function hsvToRgb(r: number, g: number, b: number): number[] | Float32Array; function isCustomElementName(name: string | null, namespaceURI: string | null): boolean; function isElementThemed(element: Element): boolean; function isIgnorableWhitespace(dataNode: CharacterData): boolean; @@ -31803,6 +31832,7 @@ declare namespace InspectorUtils { function isUsedColorSchemeDark(element: Element): boolean; function isValidCSSColor(colorString: string): boolean; function parseStyleSheet(sheet: CSSStyleSheet, input: string): void; + function relativeLuminance(r: number, g: number, b: number): number; function removeContentState( element: Element, state: number, @@ -31816,6 +31846,8 @@ declare namespace InspectorUtils { newBodyText: string ): string | null; function rgbToColorName(r: number, g: number, b: number): string; + function rgbToHsv(r: number, g: number, b: number): number[] | Float32Array; + function rgbToNearestColorName(r: number, g: number, b: number): InspectorNearestColor; function setContentState(element: Element, state: number): boolean; function setDynamicToolbarMaxHeight(aContext: BrowsingContext | null, aHeight: number): void; function setVerticalClipping(aContext: BrowsingContext | null, aOffset: number): void; @@ -32624,6 +32656,13 @@ declare function setScrollMarks(marks: number[], onHorizontalScrollbar?: boolean declare function shouldReportForServiceWorkerScope(aScope: string): boolean; declare function sizeToContent(constraints?: SizeToContentConstraints): void; declare function stop(): void; +declare function synthesizeMouseEvent( + type: string, + offsetX: number, + offsetY: number, + mouseEventData?: SynthesizeMouseEventData, + options?: SynthesizeMouseEventOptions +): boolean; declare function updateCommands(action: string): void; declare function toString(): string; declare var ownerGlobal: WindowProxy | null; diff --git a/src/zen/@types/lib.gecko.glean.d.ts b/src/zen/@types/lib.gecko.glean.d.ts index fc46b3b26..6b62c5590 100644 --- a/src/zen/@types/lib.gecko.glean.d.ts +++ b/src/zen/@types/lib.gecko.glean.d.ts @@ -88,7 +88,6 @@ interface GleanImpl { >; cookieAccessFixupDiff: GleanCustomDistribution; cookieChipsPartitionLimitOverflow: GleanCustomDistribution; - cookieCountInvalidFirstPartyPartitionedInDb: GleanCounter; cookieCountPartByKey: GleanCustomDistribution; cookieCountPartitioned: GleanCustomDistribution; cookieCountTotal: GleanCustomDistribution; @@ -318,8 +317,6 @@ interface GleanImpl { httpContentOndatafinishedToOnstopDelay: GleanTimingDistribution; httpContentOnstartDelay: GleanTimingDistribution; httpContentOnstopDelay: GleanTimingDistribution; - httpIpAddrAnyCount: Record<'blocked_requests' | 'not_blocked_requests', GleanCounter>; - httpIpAddrAnyHostnames: Record<'failure' | 'success', GleanCounter>; httpOnstartSuspendTotalTime: GleanTimingDistribution; httpRedirectToSchemeSubresource: Record; httpRedirectToSchemeTopLevel: Record; @@ -380,6 +377,7 @@ interface GleanImpl { GleanCounter >; localNetworkAccessPort: GleanCustomDistribution; + localNetworkAccessPromptsShown: Record<'local_network' | 'localhost', GleanCounter>; localNetworkBlockedTracker: GleanCounter; osSocketLimitReached: GleanCounter; prcloseTcpBlockingTimeConnectivityChange: GleanTimingDistribution; @@ -417,7 +415,6 @@ interface GleanImpl { setCookieForeign: GleanNumerator; setCookieForeignPartitioned: GleanNumerator; setCookiePartitioned: GleanNumerator; - setInvalidFirstPartyPartitionedCookie: GleanCounter; speculativeConnectOutcome: Record< 'aborted_https_not_enabled' | 'aborted_socket_fail' | 'aborted_socket_limit' | 'successful', GleanCounter @@ -817,19 +814,6 @@ interface GleanImpl { userActionOnBlockedDownload: Record; }; - glamExperiment: { - panelShown: GleanCounter; - activeTicks: GleanCounter; - largestContentfulPaint: GleanTimingDistribution; - protectTime: GleanTimingDistribution; - httpContentHtml5parserOndatafinishedToOnstopDelay: GleanTimingDistribution; - osSocketLimitReached: GleanCounter; - subCompleteLoadNet: GleanTimingDistribution; - used: GleanCounter; - cpuTimeBogusValues: GleanCounter; - totalCpuTimeMs: GleanCounter; - }; - extensionsButton: { openViaAppMenu: GleanEventWithExtras<{ is_extensions_button_visible?: string; @@ -907,7 +891,6 @@ interface GleanImpl { onboardingFinish: GleanEventWithExtras<{ provider?: string; step?: string }>; onboardingLearnMore: GleanEventWithExtras<{ provider?: string; step?: string }>; onboardingProviderChoiceDisplayed: GleanEventWithExtras<{ provider?: string; step?: string }>; - onboardingProviderLearn: GleanEventWithExtras<{ provider?: string; step?: string }>; onboardingProviderSelection: GleanEventWithExtras<{ provider?: string; step?: string }>; onboardingProviderTerms: GleanEventWithExtras<{ provider?: string; @@ -1024,6 +1007,7 @@ interface GleanImpl { targetingExists: GleanBoolean; targetingVersion: GleanQuantity; throttled: GleanBoolean; + throttlingPreventedUpdates: GleanCounter; }; browser: { @@ -1761,6 +1745,7 @@ interface GleanImpl { sectionsImpression: GleanEventWithExtras<{ content_redacted?: string; is_section_followed?: string; + layout_name?: string; newtab_visit_id?: string; section?: string; section_position?: string; @@ -1934,6 +1919,7 @@ interface GleanImpl { }>; sectionsImpression: GleanEventWithExtras<{ is_section_followed?: string; + layout_name?: string; section?: string; section_position?: string; }>; @@ -1953,6 +1939,7 @@ interface GleanImpl { format?: string; is_list_card?: string; is_section_followed?: string; + position?: string; received_rank?: string; recommendation_id?: string; recommended_at?: string; @@ -1976,6 +1963,7 @@ interface GleanImpl { is_list_card?: string; is_section_followed?: string; is_sponsored?: string; + layout_name?: string; matches_selected_topic?: string; newtab_visit_id?: string; position?: string; @@ -2014,6 +2002,7 @@ interface GleanImpl { is_list_card?: string; is_section_followed?: string; is_sponsored?: string; + layout_name?: string; newtab_visit_id?: string; position?: string; received_rank?: string; @@ -2056,6 +2045,7 @@ interface GleanImpl { is_list_card?: string; is_section_followed?: string; newtab_visit_id?: string; + position?: string; received_rank?: string; recommendation_id?: string; recommended_at?: string; @@ -2090,10 +2080,12 @@ interface GleanImpl { }>; click: GleanEventWithExtras<{ advertiser_name?: string; + is_pinned?: string; is_sponsored?: string; newtab_visit_id?: string; position?: string; tile_id?: string; + visible_topsites?: string; }>; dismiss: GleanEventWithExtras<{ advertiser_name?: string; @@ -2115,10 +2107,12 @@ interface GleanImpl { enabled: GleanBoolean; impression: GleanEventWithExtras<{ advertiser_name?: string; + is_pinned?: string; is_sponsored?: string; newtab_visit_id?: string; position?: string; tile_id?: string; + visible_topsites?: string; }>; pin: GleanEventWithExtras<{ advertiser_name?: string; @@ -2690,7 +2684,12 @@ interface GleanImpl { tabgroup: { activeGroups: Record<'collapsed' | 'expanded', GleanQuantity>; - addTab: GleanEventWithExtras<{ layout?: string; source?: string; tabs?: string }>; + addTab: GleanEventWithExtras<{ + group_type?: string; + layout?: string; + source?: string; + tabs?: string; + }>; createGroup: GleanEventWithExtras<{ id?: string; layout?: string; @@ -2703,6 +2702,7 @@ interface GleanImpl { | 'collapse' | 'delete' | 'expand' + | 'hover_preview' | 'move_window' | 'open_recent' | 'open_suggest' @@ -2743,7 +2743,8 @@ interface GleanImpl { }>; tabCountInGroups: Record<'inside' | 'outside', GleanQuantity>; tabInteractions: Record< - | 'activate' + | 'activate_collapsed' + | 'activate_expanded' | 'add' | 'close_tab_other' | 'close_tabmenu' @@ -2901,6 +2902,7 @@ interface GleanImpl { prefSuggestNonsponsored: GleanBoolean; prefSuggestSponsored: GleanBoolean; prefSuggestTopsites: GleanBoolean; + prefSwitchTabsSearchAllContainers: GleanBoolean; quickSuggestContextualOptIn: GleanEventWithExtras<{ interaction?: string; say_hello?: string; @@ -2936,6 +2938,18 @@ interface GleanImpl { exposure: GleanCounter; }; + dataLeakBlocker: { + reportV1: GleanEventWithExtras<{ + addon_id?: string; + blocked?: string; + content_policy_type?: string; + is_addon_loading?: string; + is_addon_triggering?: string; + is_content_script?: string; + method?: string; + }>; + }; + addonsSearchDetection: { etldChangeOther: GleanEventWithExtras<{ addonId?: string; @@ -2954,6 +2968,7 @@ interface GleanImpl { sameSiteRedirect: GleanEventWithExtras<{ addonId?: string; addonVersion?: string; + origin?: string; paramChanged?: string; }>; }; @@ -4166,6 +4181,7 @@ interface GleanImpl { cssMaskType: GleanCounter; cssMasonryAutoFlow: GleanCounter; cssMathDepth: GleanCounter; + cssMathShift: GleanCounter; cssMathStyle: GleanCounter; cssMaxBlockSize: GleanCounter; cssMaxHeight: GleanCounter; @@ -4503,7 +4519,6 @@ interface GleanImpl { cssXTextScale: GleanCounter; cssY: GleanCounter; cssZIndex: GleanCounter; - cssZenWindowTransformOrigin: GleanCounter; cssZoom: GleanCounter; maxZoom: GleanCounter; minZoom: GleanCounter; @@ -4876,6 +4891,7 @@ interface GleanImpl { cssMaskType: GleanCounter; cssMasonryAutoFlow: GleanCounter; cssMathDepth: GleanCounter; + cssMathShift: GleanCounter; cssMathStyle: GleanCounter; cssMaxBlockSize: GleanCounter; cssMaxHeight: GleanCounter; @@ -5213,7 +5229,6 @@ interface GleanImpl { cssXTextScale: GleanCounter; cssY: GleanCounter; cssZIndex: GleanCounter; - cssZenWindowTransformOrigin: GleanCounter; cssZoom: GleanCounter; maxZoom: GleanCounter; minZoom: GleanCounter; @@ -5324,14 +5339,7 @@ interface GleanImpl { deprecatedTestingInterface: GleanCounter; deprecatedTestingMethod: GleanCounter; documentReleaseCapture: GleanCounter; - domattrModified: GleanCounter; - domcharacterDataModified: GleanCounter; - domnodeInserted: GleanCounter; - domnodeInsertedIntoDocument: GleanCounter; - domnodeRemoved: GleanCounter; - domnodeRemovedFromDocument: GleanCounter; domquadBoundsAttr: GleanCounter; - domsubtreeModified: GleanCounter; drawWindowCanvasRenderingContext2D: GleanCounter; elementReleaseCapture: GleanCounter; elementSetCapture: GleanCounter; @@ -5344,12 +5352,10 @@ interface GleanImpl { initMouseEvent: GleanCounter; initNsmouseEvent: GleanCounter; installTriggerDeprecated: GleanCounter; - installTriggerInstallDeprecated: GleanCounter; lenientSetter: GleanCounter; lenientThis: GleanCounter; mathMlDeprecatedMathSpaceValue2: GleanCounter; mathMlDeprecatedMathVariant: GleanCounter; - mathMlDeprecatedStixgeneralOperatorStretching: GleanCounter; motionEvent: GleanCounter; mouseEventMozPressure: GleanCounter; mozInputSource: GleanCounter; @@ -5382,14 +5388,7 @@ interface GleanImpl { deprecatedTestingInterface: GleanCounter; deprecatedTestingMethod: GleanCounter; documentReleaseCapture: GleanCounter; - domattrModified: GleanCounter; - domcharacterDataModified: GleanCounter; - domnodeInserted: GleanCounter; - domnodeInsertedIntoDocument: GleanCounter; - domnodeRemoved: GleanCounter; - domnodeRemovedFromDocument: GleanCounter; domquadBoundsAttr: GleanCounter; - domsubtreeModified: GleanCounter; drawWindowCanvasRenderingContext2D: GleanCounter; elementReleaseCapture: GleanCounter; elementSetCapture: GleanCounter; @@ -5402,12 +5401,10 @@ interface GleanImpl { initMouseEvent: GleanCounter; initNsmouseEvent: GleanCounter; installTriggerDeprecated: GleanCounter; - installTriggerInstallDeprecated: GleanCounter; lenientSetter: GleanCounter; lenientThis: GleanCounter; mathMlDeprecatedMathSpaceValue2: GleanCounter; mathMlDeprecatedMathVariant: GleanCounter; - mathMlDeprecatedStixgeneralOperatorStretching: GleanCounter; motionEvent: GleanCounter; mouseEventMozPressure: GleanCounter; mozInputSource: GleanCounter; @@ -5542,9 +5539,6 @@ interface GleanImpl { jsAsmjs: GleanCounter; jsDateparse: GleanCounter; jsDateparseImplDef: GleanCounter; - jsErrorCapturestacktrace: GleanCounter; - jsErrorCapturestacktraceCtor: GleanCounter; - jsErrorCapturestacktraceUncallableCtor: GleanCounter; jsIcStubOom: GleanCounter; jsIcStubTooLarge: GleanCounter; jsIsHtmlddaFuse: GleanCounter; @@ -5903,9 +5897,6 @@ interface GleanImpl { jsAsmjs: GleanCounter; jsDateparse: GleanCounter; jsDateparseImplDef: GleanCounter; - jsErrorCapturestacktrace: GleanCounter; - jsErrorCapturestacktraceCtor: GleanCounter; - jsErrorCapturestacktraceUncallableCtor: GleanCounter; jsIcStubOom: GleanCounter; jsIcStubTooLarge: GleanCounter; jsIsHtmlddaFuse: GleanCounter; @@ -6418,6 +6409,22 @@ interface GleanImpl { elementInPageCount: GleanCounter; error: GleanEventWithExtras<{ error_name?: string; error_type?: string; key_system?: string }>; mediaPlayTime: Record; + mkvCodecType: Record< + | 'AudioAac' + | 'AudioFlac' + | 'AudioMp3' + | 'AudioOpus' + | 'AudioPcm' + | 'AudioVorbis' + | 'NoCodecSpecified' + | 'VideoAv1' + | 'VideoAvc' + | 'VideoHevc' + | 'VideoVp8' + | 'VideoVp9', + GleanCounter + >; + mkvContentCount: GleanCounter; mseSourceBufferType: Record< | 'AudioAac' | 'AudioMp2t' @@ -6634,6 +6641,7 @@ interface GleanImpl { cipher: Record; clientHandshakeResult: Record; clientHandshakeStartedCounter: GleanCounter; + keyExchangeAlgorithm: GleanCustomDistribution; protocolVersion: Record; serverHandshakeResult: Record; serverHandshakeStartedCounter: GleanCounter; @@ -6647,7 +6655,6 @@ interface GleanImpl { fullscreenTransitionBlack: GleanTimingDistribution; gcInProgress: GleanTimingDistribution; gcSliceDuringIdle: GleanCustomDistribution; - innerwindowsWithMutationListeners: Record<'false' | 'true', GleanCounter>; scriptLoadingSource: Record<'AltData' | 'Inline' | 'Source' | 'SourceFallback', GleanCounter>; slowScriptNoticeCount: GleanCounter; slowScriptPageCount: GleanCounter; @@ -6682,15 +6689,20 @@ interface GleanImpl { }; perf: { + coldApplinkMainToLoadUri: GleanTimingDistribution; + coldApplinkProcessLaunchToLoadUri: GleanTimingDistribution; dnsFirstByte: Record; dnsFirstContentfulPaint: Record; h3pFirstContentfulPaint: Record; h3pPageLoadTime: Record; http3FirstContentfulPaint: Record; http3PageLoadTime: Record; + jsExecAsmJs: GleanTimingDistribution; largestContentfulPaint: GleanTimingDistribution; largestContentfulPaintFromResponseStart: GleanTimingDistribution; pageLoad: GleanEventWithExtras<{ + android_app_link_launch_type?: string; + android_app_link_to_navigation_start?: string; cache_disposition?: string; delazify_time?: string; dns_lookup_time?: string; @@ -6812,6 +6824,7 @@ interface GleanImpl { }; quotamanagerInitializeTemporarystorage: { + nonPersistedZeroUsageOrigins: GleanCustomDistribution; totalTimeExcludingSuspend: GleanTimingDistribution; }; @@ -6903,7 +6916,6 @@ interface GleanImpl { htmleditors: { overriddenByBeforeinputListeners: Record<'false' | 'true', GleanCounter>; withBeforeinputListeners: Record<'false' | 'true', GleanCounter>; - withMutationListenersWithoutBeforeinputListeners: Record<'false' | 'true', GleanCounter>; withMutationObserversWithoutBeforeinputListeners: Record<'false' | 'true', GleanCounter>; }; @@ -7865,15 +7877,6 @@ interface GleanImpl { >; raceCacheWithNetworkOcecOnStartDiff: GleanTimingDistribution; raceCacheWithNetworkSavedTime: GleanTimingDistribution; - raceCacheWithNetworkUsage: Record< - | 'CacheDelayedRace' - | 'CacheNoRace' - | 'CacheRace' - | 'NetworkDelayedRace' - | 'NetworkNoRace' - | 'NetworkRace', - GleanCounter - >; responseEndParentToContent: Record; responseStartParentToContentExp: Record; retriedSystemChannelAddonStatus: Record< @@ -8181,7 +8184,6 @@ interface GleanImpl { byTypePrematureEviction: GleanTimingDistribution; byTypeSucceededLookupTime: GleanTimingDistribution; cleanupAge: GleanTimingDistribution; - gracePeriodRenewal: Record<'different_record' | 'same_record', GleanCounter>; lookupAlgorithm: Record< 'nativeOnly' | 'trrFirst' | 'trrOnly' | 'trrRace' | 'trrShadow', GleanCounter @@ -8270,21 +8272,7 @@ interface GleanImpl { waitTime: GleanTimingDistribution; }; - hpack: { - bytesEvictedCompressor: GleanMemoryDistribution; - bytesEvictedDecompressor: GleanMemoryDistribution; - bytesEvictedRatioCompressor: GleanCustomDistribution; - bytesEvictedRatioDecompressor: GleanCustomDistribution; - elementsEvictedCompressor: GleanCustomDistribution; - elementsEvictedDecompressor: GleanCustomDistribution; - peakCountCompressor: GleanCustomDistribution; - peakCountDecompressor: GleanCustomDistribution; - peakSizeCompressor: GleanMemoryDistribution; - peakSizeDecompressor: GleanMemoryDistribution; - }; - http: { - altsvcEntriesPerHeader: GleanCustomDistribution; altsvcMappingChangedTarget: Record<'false' | 'true', GleanCounter>; cacheDisposition: GleanDualLabeledCounter; cacheLmInconsistent: Record<'false' | 'true', GleanCounter>; @@ -8309,7 +8297,6 @@ interface GleanImpl { requestPerPage: GleanCustomDistribution; requestPerPageFromCache: GleanCustomDistribution; responseVersion: GleanCustomDistribution; - sawQuicAltProtocol: GleanCustomDistribution; scriptBlockIncorrectMime: Record< | 'CORS_origin' | 'app_json' @@ -8443,7 +8430,6 @@ interface GleanImpl { }; spdy: { - chunkRecvd: GleanMemoryDistribution; continuedHeaders: GleanMemoryDistribution; goawayLocal: GleanCustomDistribution; goawayPeer: GleanCustomDistribution; @@ -8451,12 +8437,7 @@ interface GleanImpl { parallelStreams: GleanCustomDistribution; requestPerConn: GleanCustomDistribution; serverInitiatedStreams: GleanCustomDistribution; - settingsIw: GleanMemoryDistribution; settingsMaxStreams: GleanCustomDistribution; - synRatio: GleanCustomDistribution; - synReplyRatio: GleanCustomDistribution; - synReplySize: GleanMemoryDistribution; - synSize: GleanMemoryDistribution; }; websockets: { @@ -8587,6 +8568,7 @@ interface GleanImpl { permanentCertErrorOverrides: GleanCustomDistribution; reasonsForNotFalseStarting: GleanCustomDistribution; resumedSession: Record<'false' | 'true', GleanCounter>; + sctsFromTiledLogsPerConnection: GleanCustomDistribution; sctsOrigin: GleanCustomDistribution; sctsPerConnection: GleanCustomDistribution; sctsVerificationStatus: GleanCustomDistribution; @@ -8655,7 +8637,6 @@ interface GleanImpl { contentWin32kLockdownState: GleanQuantity; effectiveContentProcessLevel: GleanQuantity; failedLaunchKeyed: Record; - hasUserNamespaces: Record<'false' | 'true', GleanCounter>; rejectedSyscalls: Record; }; @@ -9692,12 +9673,19 @@ interface GleanImpl { autofillProfilesCount: GleanQuantity; }; + geckoTrace: { + traces: GleanObject; + }; + fog: { dataDirectoryInfo: GleanObject; failedIdleRegistration: GleanBoolean; initializations: GleanTimingDistribution; initsDuringShutdown: GleanCounter; maxPingsPerMinute: GleanQuantity; + subdirEntryErr: Record<'db' | 'events' | 'pending_pings', GleanCounter>; + subdirEntryMetadataErr: Record<'db' | 'events' | 'pending_pings', GleanCounter>; + subdirErr: Record<'db' | 'events' | 'pending_pings', GleanBoolean>; }; fogIpc: { @@ -10453,6 +10441,7 @@ interface GleanImpl { mgmtMenuItemUsedImportFromBrowser: GleanEventNoExtras; mgmtMenuItemUsedImportFromCsv: GleanEventNoExtras; mgmtMenuItemUsedPreferences: GleanEventNoExtras; + migration: GleanEventWithExtras<{ error?: string; value?: string }>; newNewLogin: GleanEventNoExtras; numImprovedGeneratedPasswords: Record<'false' | 'true', GleanCounter>; numSavedPasswords: GleanQuantity; @@ -10502,6 +10491,7 @@ interface GleanImpl { enabledOptInPanel: GleanEventWithExtras<{ value?: string }>; enabledPrefChange: GleanEventNoExtras; getUnlimitedMasksReusePanel: GleanEventWithExtras<{ value?: string }>; + placedEmailMask: GleanEventWithExtras<{ error_code?: string; value?: string }>; postponedOptInPanel: GleanEventWithExtras<{ value?: string }>; reuseMaskReusePanel: GleanEventWithExtras<{ value?: string }>; shownFillUsername: GleanEventWithExtras<{ error_code?: string; value?: string }>; @@ -10711,7 +10701,9 @@ interface GleanImpl { bookmarksCount: GleanCustomDistribution; databaseFaviconsFilesize: GleanMemoryDistribution; databaseFilesize: GleanMemoryDistribution; + databaseSemanticHistoryDefragmentTime: GleanTimingDistribution; databaseSemanticHistoryFilesize: GleanMemoryDistribution; + databaseSemanticHistoryWastedPercentage: GleanQuantity; expirationStepsToClean: GleanCustomDistribution; exportTohtml: GleanTimingDistribution; frecencyRecalcChunkTime: GleanTimingDistribution; @@ -12042,6 +12034,7 @@ interface GleanImpl { brokenSiteReportTabInfoAntitracking: { blockList: GleanString; + blockedOrigins: GleanStringList; btpHasPurgedSite: GleanBoolean; etpCategory: GleanString; hasMixedActiveContentBlocked: GleanBoolean; @@ -12421,10 +12414,6 @@ interface GleanImpl { secureOpensearchUpdateCount: GleanQuantity; }; - search: { - suggestionsLatency: Record; - }; - searchEngineDefault: { changed: GleanEventWithExtras<{ change_reason?: string; @@ -12477,9 +12466,16 @@ interface GleanImpl { searchSuggestions: { abortedRequests: Record; failedRequests: Record; + latency: Record; successfulRequests: Record; }; + searchSuggestionsOhttp: { + enabled: GleanBoolean; + latency: Record; + requestCounter: GleanDualLabeledCounter; + }; + legacyTelemetry: { clientId: GleanUuid; profileGroupId: GleanUuid; @@ -12721,7 +12717,72 @@ interface GleanImpl { completeRemoteStatus2: Record; completeServerResponseTime: Record; completeTimeout: GleanDualLabeledCounter; + completion: GleanEventWithExtras<{ hit?: string; table_name?: string }>; completionError: GleanCustomDistribution; + lookupHit: Record< + | 'ads-track-digest256' + | 'analytics-track-digest256' + | 'anti-fraud-track-digest256' + | 'base-cryptomining-track-digest256' + | 'base-email-track-digest256' + | 'base-fingerprinting-track-digest256' + | 'base-track-digest256' + | 'consent-manager-track-digest256' + | 'content-cryptomining-track-digest256' + | 'content-email-track-digest256' + | 'content-fingerprinting-track-digest256' + | 'content-track-digest256' + | 'goog-badbinurl-proto' + | 'goog-downloadwhite-proto' + | 'goog-harmful-proto' + | 'goog-malware-proto' + | 'goog-phish-proto' + | 'goog-unwanted-proto' + | 'google-trackwhite-digest256' + | 'googpub-phish-proto' + | 'mozplugin-block-digest256' + | 'mozstd-trackwhite-digest256' + | 'social-track-digest256' + | 'social-tracking-protection-digest256' + | 'social-tracking-protection-facebook-digest256' + | 'social-tracking-protection-linkedin-digest256' + | 'social-tracking-protection-twitter-digest256' + | 'test-malware-simple' + | 'test-unwanted-simple', + GleanCounter + >; + lookupMiss: Record< + | 'ads-track-digest256' + | 'analytics-track-digest256' + | 'anti-fraud-track-digest256' + | 'base-cryptomining-track-digest256' + | 'base-email-track-digest256' + | 'base-fingerprinting-track-digest256' + | 'base-track-digest256' + | 'consent-manager-track-digest256' + | 'content-cryptomining-track-digest256' + | 'content-email-track-digest256' + | 'content-fingerprinting-track-digest256' + | 'content-track-digest256' + | 'goog-badbinurl-proto' + | 'goog-downloadwhite-proto' + | 'goog-harmful-proto' + | 'goog-malware-proto' + | 'goog-phish-proto' + | 'goog-unwanted-proto' + | 'google-trackwhite-digest256' + | 'googpub-phish-proto' + | 'mozplugin-block-digest256' + | 'mozstd-trackwhite-digest256' + | 'social-track-digest256' + | 'social-tracking-protection-digest256' + | 'social-tracking-protection-facebook-digest256' + | 'social-tracking-protection-linkedin-digest256' + | 'social-tracking-protection-twitter-digest256' + | 'test-malware-simple' + | 'test-unwanted-simple', + GleanCounter + >; lookupTime2: GleanTimingDistribution; shutdownTime: GleanTimingDistribution; threathitNetworkError: GleanCustomDistribution; @@ -12915,7 +12976,6 @@ interface GleanImpl { isWow64: GleanBoolean; isWowArm64: GleanBoolean; memory: GleanQuantity; - specialDirectoryAppdataFallback: Record<'appdata' | 'localappdata', GleanBoolean>; virtualMemory: GleanQuantity; winPackageFamilyName: GleanString; }; @@ -13813,6 +13873,7 @@ interface GleanPingsImpl { quickSuggest: GleanPingNoReason; quickSuggestDeletionRequest: GleanPingNoReason; urlbarKeywordExposure: GleanPingNoReason; + dataLeakBlocker: GleanPingNoReason; contextIdDeletionRequest: GleanPingNoReason; prototypeNoCodeEvents: GleanPingNoReason; pageload: GleanPingWithReason<'startup' | 'threshold'>; @@ -13826,6 +13887,7 @@ interface GleanPingsImpl { backgroundTasks: GleanPingNoReason; captchaDetection: GleanPingNoReason; crash: GleanPingWithReason<'crash' | 'event_found'>; + traces: GleanPingWithReason<'buffer_full' | 'idle' | 'shutdown'>; dauReporting: GleanPingWithReason<'active' | 'dirty_startup' | 'inactive'>; tempFogInitialState: GleanPingWithReason<'startup'>; collectionDisabledPing: GleanPingNoReason; diff --git a/src/zen/@types/lib.gecko.linux.d.ts b/src/zen/@types/lib.gecko.linux.d.ts index d38d49d38..7308bb544 100644 --- a/src/zen/@types/lib.gecko.linux.d.ts +++ b/src/zen/@types/lib.gecko.linux.d.ts @@ -13,8 +13,6 @@ declare global { interface nsIGNOMEShellService extends nsIShellService { readonly canSetDesktopBackground: boolean; isDefaultForScheme(aScheme: string): boolean; - getGSettingsString(aScheme: string, aKey: string): string; - setGSettingsString(aScheme: string, aKey: string, aValue: string): void; } // https://searchfox.org/mozilla-central/source/browser/components/shell/nsIOpenTabsProvider.idl diff --git a/src/zen/@types/lib.gecko.modules.d.ts b/src/zen/@types/lib.gecko.modules.d.ts index 39e78034a..baaabf92f 100644 --- a/src/zen/@types/lib.gecko.modules.d.ts +++ b/src/zen/@types/lib.gecko.modules.d.ts @@ -7,27 +7,62 @@ */ export interface Modules { + 'chrome://browser/content/aboutlogins/aboutLoginsUtils.mjs': typeof import('chrome://browser/content/aboutlogins/aboutLoginsUtils.mjs'); + 'chrome://browser/content/asrouter/components/fxa-menu-message.mjs': typeof import('chrome://browser/content/asrouter/components/fxa-menu-message.mjs'); 'chrome://browser/content/backup/backup-constants.mjs': typeof import('chrome://browser/content/backup/backup-constants.mjs'); + 'chrome://browser/content/genai/content/link-preview-card-onboarding.mjs': typeof import('chrome://browser/content/genai/content/link-preview-card-onboarding.mjs'); + 'chrome://browser/content/genai/content/link-preview-card.mjs': typeof import('chrome://browser/content/genai/content/link-preview-card.mjs'); + 'chrome://browser/content/genai/content/model-optin.mjs': typeof import('chrome://browser/content/genai/content/model-optin.mjs'); + 'chrome://browser/content/ipprotection/ipprotection-constants.mjs': typeof import('chrome://browser/content/ipprotection/ipprotection-constants.mjs'); 'chrome://browser/content/migration/migration-wizard-constants.mjs': typeof import('chrome://browser/content/migration/migration-wizard-constants.mjs'); 'chrome://browser/content/nsContextMenu.sys.mjs': typeof import('chrome://browser/content/nsContextMenu.sys.mjs'); + 'chrome://browser/content/screenshots/fileHelpers.mjs': typeof import('chrome://browser/content/screenshots/fileHelpers.mjs'); + 'chrome://browser/content/sidebar/sidebar-main.mjs': typeof import('chrome://browser/content/sidebar/sidebar-main.mjs'); + 'chrome://browser/content/sidebar/sidebar-panel-header.mjs': typeof import('chrome://browser/content/sidebar/sidebar-panel-header.mjs'); + 'chrome://browser/content/tabbrowser/tab-hover-preview.mjs': typeof import('chrome://browser/content/tabbrowser/tab-hover-preview.mjs'); + 'chrome://browser/content/translations/TranslationsPanelShared.sys.mjs': typeof import('chrome://browser/content/translations/TranslationsPanelShared.sys.mjs'); + 'chrome://browser/content/webrtc/webrtc-preview.mjs': typeof import('chrome://browser/content/webrtc/webrtc-preview.mjs'); 'chrome://devtools-startup/content/DevToolsShim.sys.mjs': typeof import('chrome://devtools-startup/content/DevToolsShim.sys.mjs'); + 'chrome://formautofill/content/manageDialog.mjs': typeof import('chrome://formautofill/content/manageDialog.mjs'); + 'chrome://global/content/aboutLogging/profileStorage.mjs': typeof import('chrome://global/content/aboutLogging/profileStorage.mjs'); + 'chrome://global/content/certviewer/certDecoder.mjs': typeof import('chrome://global/content/certviewer/certDecoder.mjs'); + 'chrome://global/content/elements/browser-custom-element.mjs': typeof import('chrome://global/content/elements/browser-custom-element.mjs'); 'chrome://global/content/ml/BlockWords.sys.mjs': typeof import('chrome://global/content/ml/BlockWords.sys.mjs'); + 'chrome://global/content/ml/ClusterAlgos.sys.mjs': typeof import('chrome://global/content/ml/ClusterAlgos.sys.mjs'); 'chrome://global/content/ml/EmbeddingsGenerator.sys.mjs': typeof import('chrome://global/content/ml/EmbeddingsGenerator.sys.mjs'); 'chrome://global/content/ml/EngineProcess.sys.mjs': typeof import('chrome://global/content/ml/EngineProcess.sys.mjs'); - 'chrome://global/content/ml/HttpInference.sys.mjs': typeof import('chrome://global/content/ml/HttpInference.sys.mjs'); 'chrome://global/content/ml/ModelHub.sys.mjs': typeof import('chrome://global/content/ml/ModelHub.sys.mjs'); + 'chrome://global/content/ml/NLPUtils.sys.mjs': typeof import('chrome://global/content/ml/NLPUtils.sys.mjs'); 'chrome://global/content/ml/OPFS.sys.mjs': typeof import('chrome://global/content/ml/OPFS.sys.mjs'); - 'chrome://global/content/ml/ThomSample.sys.mjs': typeof import('chrome://global/content/ml/ThomSample.sys.mjs'); + 'chrome://global/content/ml/StopWords.sys.mjs': typeof import('chrome://global/content/ml/StopWords.sys.mjs'); 'chrome://global/content/ml/Utils.sys.mjs': typeof import('chrome://global/content/ml/Utils.sys.mjs'); + 'chrome://global/content/ml/backends/LlamaCppPipeline.mjs': typeof import('chrome://global/content/ml/backends/LlamaCppPipeline.mjs'); 'chrome://global/content/ml/backends/LlamaPipeline.mjs': typeof import('chrome://global/content/ml/backends/LlamaPipeline.mjs'); 'chrome://global/content/ml/backends/ONNXPipeline.mjs': typeof import('chrome://global/content/ml/backends/ONNXPipeline.mjs'); + 'chrome://global/content/ml/backends/OpenAIPipeline.mjs': typeof import('chrome://global/content/ml/backends/OpenAIPipeline.mjs'); 'chrome://global/content/ml/backends/Pipeline.mjs': typeof import('chrome://global/content/ml/backends/Pipeline.mjs'); + 'chrome://global/content/ml/backends/StaticEmbeddingsPipeline.mjs': typeof import('chrome://global/content/ml/backends/StaticEmbeddingsPipeline.mjs'); + 'chrome://global/content/preferences/Preferences.mjs': typeof import('chrome://global/content/preferences/Preferences.mjs'); 'chrome://global/content/translations/TranslationsTelemetry.sys.mjs': typeof import('chrome://global/content/translations/TranslationsTelemetry.sys.mjs'); 'chrome://global/content/translations/TranslationsUtils.mjs': typeof import('chrome://global/content/translations/TranslationsUtils.mjs'); 'chrome://global/content/translations/translations-document.sys.mjs': typeof import('chrome://global/content/translations/translations-document.sys.mjs'); 'chrome://global/content/translations/translations-engine.sys.mjs': typeof import('chrome://global/content/translations/translations-engine.sys.mjs'); + 'chrome://mochikit/content/ShutdownLeaksCollector.sys.mjs': typeof import('chrome://mochikit/content/ShutdownLeaksCollector.sys.mjs'); + 'chrome://mochikit/content/tests/SimpleTest/DragSourceChildContext.sys.mjs': typeof import('chrome://mochikit/content/tests/SimpleTest/DragSourceChildContext.sys.mjs'); + 'chrome://mochikit/content/tests/SimpleTest/DragSourceParentContext.sys.mjs': typeof import('chrome://mochikit/content/tests/SimpleTest/DragSourceParentContext.sys.mjs'); + 'chrome://mochikit/content/tests/SimpleTest/DragTargetChildContext.sys.mjs': typeof import('chrome://mochikit/content/tests/SimpleTest/DragTargetChildContext.sys.mjs'); + 'chrome://mochikit/content/tests/SimpleTest/DragTargetParentContext.sys.mjs': typeof import('chrome://mochikit/content/tests/SimpleTest/DragTargetParentContext.sys.mjs'); + 'chrome://mochitests/content/browser/accessible/tests/browser/Common.sys.mjs': typeof import('chrome://mochitests/content/browser/accessible/tests/browser/Common.sys.mjs'); + 'chrome://mochitests/content/browser/accessible/tests/browser/Layout.sys.mjs': typeof import('chrome://mochitests/content/browser/accessible/tests/browser/Layout.sys.mjs'); + 'chrome://mochitests/content/browser/devtools/client/debugger/test/mochitest/examples/worker-esm-dep.mjs': typeof import('chrome://mochitests/content/browser/devtools/client/debugger/test/mochitest/examples/worker-esm-dep.mjs'); + 'chrome://mochitests/content/browser/js/xpconnect/tests/browser/worker_source.mjs': typeof import('chrome://mochitests/content/browser/js/xpconnect/tests/browser/worker_source.mjs'); 'chrome://mochitests/content/browser/remote/shared/messagehandler/test/browser/resources/modules/ModuleRegistry.sys.mjs': typeof import('chrome://mochitests/content/browser/remote/shared/messagehandler/test/browser/resources/modules/ModuleRegistry.sys.mjs'); - 'chrome://pocket/content/pktApi.sys.mjs': typeof import('chrome://pocket/content/pktApi.sys.mjs'); + 'chrome://mochitests/content/browser/toolkit/components/translations/tests/browser/translations-test.mjs': typeof import('chrome://mochitests/content/browser/toolkit/components/translations/tests/browser/translations-test.mjs'); + 'chrome://mochitests/content/browser/tools/profiler/tests/browser/value_summary_reader.mjs': typeof import('chrome://mochitests/content/browser/tools/profiler/tests/browser/value_summary_reader.mjs'); + 'chrome://mochitests/content/chrome/dom/network/tests/tcpsocket_test.sys.mjs': typeof import('chrome://mochitests/content/chrome/dom/network/tests/tcpsocket_test.sys.mjs'); + 'chrome://mochitests/content/chrome/dom/url/tests/file_worker_url.sys.mjs': typeof import('chrome://mochitests/content/chrome/dom/url/tests/file_worker_url.sys.mjs'); + 'chrome://mochitests/content/chrome/dom/url/tests/test_bug883784.sys.mjs': typeof import('chrome://mochitests/content/chrome/dom/url/tests/test_bug883784.sys.mjs'); + 'chrome://mochitests/content/chrome/dom/workers/test/WorkerTest.sys.mjs': typeof import('chrome://mochitests/content/chrome/dom/workers/test/WorkerTest.sys.mjs'); 'chrome://remote/content/components/Marionette.sys.mjs': typeof import('chrome://remote/content/components/Marionette.sys.mjs'); 'chrome://remote/content/components/RemoteAgent.sys.mjs': typeof import('chrome://remote/content/components/RemoteAgent.sys.mjs'); 'chrome://remote/content/marionette/actors/MarionetteCommandsParent.sys.mjs': typeof import('chrome://remote/content/marionette/actors/MarionetteCommandsParent.sys.mjs'); @@ -75,6 +110,7 @@ export interface Modules { 'chrome://remote/content/shared/Prompt.sys.mjs': typeof import('chrome://remote/content/shared/Prompt.sys.mjs'); 'chrome://remote/content/shared/Realm.sys.mjs': typeof import('chrome://remote/content/shared/Realm.sys.mjs'); 'chrome://remote/content/shared/RecommendedPreferences.sys.mjs': typeof import('chrome://remote/content/shared/RecommendedPreferences.sys.mjs'); + 'chrome://remote/content/shared/RemoteError.sys.mjs': typeof import('chrome://remote/content/shared/RemoteError.sys.mjs'); 'chrome://remote/content/shared/Stack.sys.mjs': typeof import('chrome://remote/content/shared/Stack.sys.mjs'); 'chrome://remote/content/shared/Sync.sys.mjs': typeof import('chrome://remote/content/shared/Sync.sys.mjs'); 'chrome://remote/content/shared/TabManager.sys.mjs': typeof import('chrome://remote/content/shared/TabManager.sys.mjs'); @@ -82,7 +118,6 @@ export interface Modules { 'chrome://remote/content/shared/UserContextManager.sys.mjs': typeof import('chrome://remote/content/shared/UserContextManager.sys.mjs'); 'chrome://remote/content/shared/WindowManager.sys.mjs': typeof import('chrome://remote/content/shared/WindowManager.sys.mjs'); 'chrome://remote/content/shared/js-process-actors/WebDriverDocumentInsertedActor.sys.mjs': typeof import('chrome://remote/content/shared/js-process-actors/WebDriverDocumentInsertedActor.sys.mjs'); - 'chrome://remote/content/shared/js-window-actors/WebProgressListenerActor.sys.mjs': typeof import('chrome://remote/content/shared/js-window-actors/WebProgressListenerActor.sys.mjs'); 'chrome://remote/content/shared/listeners/BeforeStopRequestListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/BeforeStopRequestListener.sys.mjs'); 'chrome://remote/content/shared/listeners/BrowsingContextListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/BrowsingContextListener.sys.mjs'); 'chrome://remote/content/shared/listeners/CachedResourceListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/CachedResourceListener.sys.mjs'); @@ -90,6 +125,7 @@ export interface Modules { 'chrome://remote/content/shared/listeners/ConsoleListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/ConsoleListener.sys.mjs'); 'chrome://remote/content/shared/listeners/ContextualIdentityListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/ContextualIdentityListener.sys.mjs'); 'chrome://remote/content/shared/listeners/DataChannelListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/DataChannelListener.sys.mjs'); + 'chrome://remote/content/shared/listeners/DownloadListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/DownloadListener.sys.mjs'); 'chrome://remote/content/shared/listeners/LoadListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/LoadListener.sys.mjs'); 'chrome://remote/content/shared/listeners/NavigationListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/NavigationListener.sys.mjs'); 'chrome://remote/content/shared/listeners/NetworkEventRecord.sys.mjs': typeof import('chrome://remote/content/shared/listeners/NetworkEventRecord.sys.mjs'); @@ -155,21 +191,30 @@ export interface Modules { 'moz-src:///browser/components/DefaultBrowserCheck.sys.mjs': typeof import('moz-src:///browser/components/DefaultBrowserCheck.sys.mjs'); 'moz-src:///browser/components/DesktopActorRegistry.sys.mjs': typeof import('moz-src:///browser/components/DesktopActorRegistry.sys.mjs'); 'moz-src:///browser/components/ProfileDataUpgrader.sys.mjs': typeof import('moz-src:///browser/components/ProfileDataUpgrader.sys.mjs'); + 'moz-src:///browser/components/StartupTelemetry.sys.mjs': typeof import('moz-src:///browser/components/StartupTelemetry.sys.mjs'); 'moz-src:///browser/components/attribution/AttributionCode.sys.mjs': typeof import('moz-src:///browser/components/attribution/AttributionCode.sys.mjs'); 'moz-src:///browser/components/attribution/MacAttribution.sys.mjs': typeof import('moz-src:///browser/components/attribution/MacAttribution.sys.mjs'); 'moz-src:///browser/components/contentanalysis/content/ContentAnalysis.sys.mjs': typeof import('moz-src:///browser/components/contentanalysis/content/ContentAnalysis.sys.mjs'); 'moz-src:///browser/components/customizableui/CustomizableUI.sys.mjs': typeof import('moz-src:///browser/components/customizableui/CustomizableUI.sys.mjs'); 'moz-src:///browser/components/customizableui/CustomizableWidgets.sys.mjs': typeof import('moz-src:///browser/components/customizableui/CustomizableWidgets.sys.mjs'); + 'moz-src:///browser/components/customizableui/CustomizeMode.sys.mjs': typeof import('moz-src:///browser/components/customizableui/CustomizeMode.sys.mjs'); 'moz-src:///browser/components/customizableui/DragPositionManager.sys.mjs': typeof import('moz-src:///browser/components/customizableui/DragPositionManager.sys.mjs'); 'moz-src:///browser/components/customizableui/PanelMultiView.sys.mjs': typeof import('moz-src:///browser/components/customizableui/PanelMultiView.sys.mjs'); + 'moz-src:///browser/components/customizableui/SearchWidgetTracker.sys.mjs': typeof import('moz-src:///browser/components/customizableui/SearchWidgetTracker.sys.mjs'); 'moz-src:///browser/components/customizableui/ToolbarContextMenu.sys.mjs': typeof import('moz-src:///browser/components/customizableui/ToolbarContextMenu.sys.mjs'); 'moz-src:///browser/components/customizableui/ToolbarDropHandler.sys.mjs': typeof import('moz-src:///browser/components/customizableui/ToolbarDropHandler.sys.mjs'); 'moz-src:///browser/components/downloads/DownloadSpamProtection.sys.mjs': typeof import('moz-src:///browser/components/downloads/DownloadSpamProtection.sys.mjs'); 'moz-src:///browser/components/downloads/DownloadsCommon.sys.mjs': typeof import('moz-src:///browser/components/downloads/DownloadsCommon.sys.mjs'); + 'moz-src:///browser/components/downloads/DownloadsMacFinderProgress.sys.mjs': typeof import('moz-src:///browser/components/downloads/DownloadsMacFinderProgress.sys.mjs'); + 'moz-src:///browser/components/downloads/DownloadsTaskbar.sys.mjs': typeof import('moz-src:///browser/components/downloads/DownloadsTaskbar.sys.mjs'); 'moz-src:///browser/components/downloads/DownloadsViewUI.sys.mjs': typeof import('moz-src:///browser/components/downloads/DownloadsViewUI.sys.mjs'); 'moz-src:///browser/components/downloads/DownloadsViewableInternally.sys.mjs': typeof import('moz-src:///browser/components/downloads/DownloadsViewableInternally.sys.mjs'); 'moz-src:///browser/components/genai/LinkPreview.sys.mjs': typeof import('moz-src:///browser/components/genai/LinkPreview.sys.mjs'); 'moz-src:///browser/components/genai/LinkPreviewModel.sys.mjs': typeof import('moz-src:///browser/components/genai/LinkPreviewModel.sys.mjs'); + 'moz-src:///browser/components/genai/PageAssist.sys.mjs': typeof import('moz-src:///browser/components/genai/PageAssist.sys.mjs'); + 'moz-src:///browser/components/genai/SmartAssistEngine.sys.mjs': typeof import('moz-src:///browser/components/genai/SmartAssistEngine.sys.mjs'); + 'moz-src:///browser/components/mozcachedohttp/MozCachedOHTTPProtocolHandler.sys.mjs': typeof import('moz-src:///browser/components/mozcachedohttp/MozCachedOHTTPProtocolHandler.sys.mjs'); + 'moz-src:///browser/components/newtab/SponsorProtection.sys.mjs': typeof import('moz-src:///browser/components/newtab/SponsorProtection.sys.mjs'); 'moz-src:///browser/components/pagedata/OpenGraphPageData.sys.mjs': typeof import('moz-src:///browser/components/pagedata/OpenGraphPageData.sys.mjs'); 'moz-src:///browser/components/pagedata/PageDataSchema.sys.mjs': typeof import('moz-src:///browser/components/pagedata/PageDataSchema.sys.mjs'); 'moz-src:///browser/components/pagedata/PageDataService.sys.mjs': typeof import('moz-src:///browser/components/pagedata/PageDataService.sys.mjs'); @@ -200,14 +245,62 @@ export interface Modules { 'moz-src:///browser/components/tabbrowser/OpenInTabsUtils.sys.mjs': typeof import('moz-src:///browser/components/tabbrowser/OpenInTabsUtils.sys.mjs'); 'moz-src:///browser/components/tabbrowser/SmartTabGrouping.sys.mjs': typeof import('moz-src:///browser/components/tabbrowser/SmartTabGrouping.sys.mjs'); 'moz-src:///browser/components/tabbrowser/TabMetrics.sys.mjs': typeof import('moz-src:///browser/components/tabbrowser/TabMetrics.sys.mjs'); + 'moz-src:///browser/components/tabbrowser/TabUnloader.sys.mjs': typeof import('moz-src:///browser/components/tabbrowser/TabUnloader.sys.mjs'); 'moz-src:///browser/components/tabbrowser/TabsList.sys.mjs': typeof import('moz-src:///browser/components/tabbrowser/TabsList.sys.mjs'); 'moz-src:///browser/components/uitour/UITour.sys.mjs': typeof import('moz-src:///browser/components/uitour/UITour.sys.mjs'); + 'moz-src:///browser/components/uitour/UITourUtils.sys.mjs': typeof import('moz-src:///browser/components/uitour/UITourUtils.sys.mjs'); + 'moz-src:///browser/components/urlbar/ActionsProviderContextualSearch.sys.mjs': typeof import('moz-src:///browser/components/urlbar/ActionsProviderContextualSearch.sys.mjs'); + 'moz-src:///browser/components/urlbar/ActionsProviderQuickActions.sys.mjs': typeof import('moz-src:///browser/components/urlbar/ActionsProviderQuickActions.sys.mjs'); + 'moz-src:///browser/components/urlbar/MerinoClient.sys.mjs': typeof import('moz-src:///browser/components/urlbar/MerinoClient.sys.mjs'); + 'moz-src:///browser/components/urlbar/QuickActionsLoaderDefault.sys.mjs': typeof import('moz-src:///browser/components/urlbar/QuickActionsLoaderDefault.sys.mjs'); + 'moz-src:///browser/components/urlbar/QuickSuggest.sys.mjs': typeof import('moz-src:///browser/components/urlbar/QuickSuggest.sys.mjs'); + 'moz-src:///browser/components/urlbar/SearchModeSwitcher.sys.mjs': typeof import('moz-src:///browser/components/urlbar/SearchModeSwitcher.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarController.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarController.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarEventBufferer.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarEventBufferer.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarInput.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarInput.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarPrefs.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarPrefs.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarProviderAutofill.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderAutofill.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarProviderCalculator.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderCalculator.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarProviderClipboard.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderClipboard.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarProviderGlobalActions.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderGlobalActions.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarProviderInterventions.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderInterventions.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarProviderOpenTabs.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderOpenTabs.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarProviderPlaces.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderPlaces.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarProviderQuickSuggest.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderQuickSuggest.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarProviderSearchSuggestions.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderSearchSuggestions.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarProviderSearchTips.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderSearchTips.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarProviderSemanticHistorySearch.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderSemanticHistorySearch.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarProviderTabToSearch.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderTabToSearch.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarProviderTopSites.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderTopSites.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarProviderUnitConversion.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderUnitConversion.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarProvidersManager.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProvidersManager.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarResult.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarResult.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarSearchOneOffs.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarSearchOneOffs.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarSearchTermsPersistence.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarSearchTermsPersistence.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarSearchUtils.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarSearchUtils.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarTokenizer.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarTokenizer.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarUtils.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarUtils.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarValueFormatter.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarValueFormatter.sys.mjs'); + 'moz-src:///browser/components/urlbar/UrlbarView.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarView.sys.mjs'); + 'moz-src:///browser/components/urlbar/private/AmpSuggestions.sys.mjs': typeof import('moz-src:///browser/components/urlbar/private/AmpSuggestions.sys.mjs'); + 'moz-src:///browser/components/urlbar/private/GeolocationUtils.sys.mjs': typeof import('moz-src:///browser/components/urlbar/private/GeolocationUtils.sys.mjs'); + 'moz-src:///browser/components/urlbar/private/MLSuggest.sys.mjs': typeof import('moz-src:///browser/components/urlbar/private/MLSuggest.sys.mjs'); + 'moz-src:///browser/components/urlbar/private/SuggestBackendRust.sys.mjs': typeof import('moz-src:///browser/components/urlbar/private/SuggestBackendRust.sys.mjs'); 'moz-src:///browser/modules/CanvasPermissionPromptHelper.sys.mjs': typeof import('moz-src:///browser/modules/CanvasPermissionPromptHelper.sys.mjs'); 'moz-src:///browser/modules/ContextId.sys.mjs': typeof import('moz-src:///browser/modules/ContextId.sys.mjs'); + 'moz-src:///browser/modules/PrivateBrowsingUI.sys.mjs': typeof import('moz-src:///browser/modules/PrivateBrowsingUI.sys.mjs'); + 'moz-src:///browser/modules/UnexpectedScriptObserver.sys.mjs': typeof import('moz-src:///browser/modules/UnexpectedScriptObserver.sys.mjs'); + 'moz-src:///browser/modules/WebAuthnPromptHelper.sys.mjs': typeof import('moz-src:///browser/modules/WebAuthnPromptHelper.sys.mjs'); 'moz-src:///browser/themes/ToolbarIconColor.sys.mjs': typeof import('moz-src:///browser/themes/ToolbarIconColor.sys.mjs'); + 'moz-src:///dom/notification/MemoryNotificationDB.sys.mjs': typeof import('moz-src:///dom/notification/MemoryNotificationDB.sys.mjs'); + 'moz-src:///dom/notification/NotificationDB.sys.mjs': typeof import('moz-src:///dom/notification/NotificationDB.sys.mjs'); + 'moz-src:///services/crypto/modules/WeaveCrypto.sys.mjs': typeof import('moz-src:///services/crypto/modules/WeaveCrypto.sys.mjs'); + 'moz-src:///services/crypto/modules/jwcrypto.sys.mjs': typeof import('moz-src:///services/crypto/modules/jwcrypto.sys.mjs'); + 'moz-src:///services/crypto/modules/utils.sys.mjs': typeof import('moz-src:///services/crypto/modules/utils.sys.mjs'); 'moz-src:///toolkit/components/doh/DoHConfig.sys.mjs': typeof import('moz-src:///toolkit/components/doh/DoHConfig.sys.mjs'); 'moz-src:///toolkit/components/doh/DoHController.sys.mjs': typeof import('moz-src:///toolkit/components/doh/DoHController.sys.mjs'); 'moz-src:///toolkit/components/doh/DoHHeuristics.sys.mjs': typeof import('moz-src:///toolkit/components/doh/DoHHeuristics.sys.mjs'); + 'moz-src:///toolkit/components/doh/TRRPerformance.sys.mjs': typeof import('moz-src:///toolkit/components/doh/TRRPerformance.sys.mjs'); 'moz-src:///toolkit/components/reader/AboutReader.sys.mjs': typeof import('moz-src:///toolkit/components/reader/AboutReader.sys.mjs'); 'moz-src:///toolkit/components/reader/ReaderMode.sys.mjs': typeof import('moz-src:///toolkit/components/reader/ReaderMode.sys.mjs'); 'moz-src:///toolkit/components/reader/ReaderWorker.sys.mjs': typeof import('moz-src:///toolkit/components/reader/ReaderWorker.sys.mjs'); @@ -224,39 +317,55 @@ export interface Modules { 'moz-src:///toolkit/components/search/SearchSuggestionController.sys.mjs': typeof import('moz-src:///toolkit/components/search/SearchSuggestionController.sys.mjs'); 'moz-src:///toolkit/components/search/SearchUtils.sys.mjs': typeof import('moz-src:///toolkit/components/search/SearchUtils.sys.mjs'); 'moz-src:///toolkit/components/search/UserSearchEngine.sys.mjs': typeof import('moz-src:///toolkit/components/search/UserSearchEngine.sys.mjs'); + 'moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustFilterAdult.sys.mjs': typeof import('moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustFilterAdult.sys.mjs'); 'moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustRelevancy.sys.mjs': typeof import('moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustRelevancy.sys.mjs'); 'moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustSearch.sys.mjs': typeof import('moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustSearch.sys.mjs'); 'moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustSuggest.sys.mjs': typeof import('moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustSuggest.sys.mjs'); 'moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustTabs.sys.mjs': typeof import('moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustTabs.sys.mjs'); 'moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustWebextstorage.sys.mjs': typeof import('moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustWebextstorage.sys.mjs'); + 'moz-src:///toolkit/components/uniffi-bindgen-gecko-js/tests/generated/RustUniffiBindingsTests.sys.mjs': typeof import('moz-src:///toolkit/components/uniffi-bindgen-gecko-js/tests/generated/RustUniffiBindingsTests.sys.mjs'); + 'moz-src:///toolkit/components/uniffi-bindgen-gecko-js/tests/generated/RustUniffiBindingsTestsExternalTypes.sys.mjs': typeof import('moz-src:///toolkit/components/uniffi-bindgen-gecko-js/tests/generated/RustUniffiBindingsTestsExternalTypes.sys.mjs'); 'moz-src:///toolkit/profile/ProfilesDatastoreService.sys.mjs': typeof import('moz-src:///toolkit/profile/ProfilesDatastoreService.sys.mjs'); + 'resource:///actors/AboutLoginsParent.sys.mjs': typeof import('resource:///actors/AboutLoginsParent.sys.mjs'); 'resource:///actors/AboutNewTabParent.sys.mjs': typeof import('resource:///actors/AboutNewTabParent.sys.mjs'); + 'resource:///actors/AboutPrivateBrowsingParent.sys.mjs': typeof import('resource:///actors/AboutPrivateBrowsingParent.sys.mjs'); + 'resource:///actors/AboutProtectionsParent.sys.mjs': typeof import('resource:///actors/AboutProtectionsParent.sys.mjs'); 'resource:///actors/AboutReaderParent.sys.mjs': typeof import('resource:///actors/AboutReaderParent.sys.mjs'); 'resource:///actors/AboutWelcomeParent.sys.mjs': typeof import('resource:///actors/AboutWelcomeParent.sys.mjs'); 'resource:///actors/ClickHandlerParent.sys.mjs': typeof import('resource:///actors/ClickHandlerParent.sys.mjs'); 'resource:///actors/ContentSearchParent.sys.mjs': typeof import('resource:///actors/ContentSearchParent.sys.mjs'); 'resource:///actors/ContextMenuChild.sys.mjs': typeof import('resource:///actors/ContextMenuChild.sys.mjs'); 'resource:///actors/LinkHandlerParent.sys.mjs': typeof import('resource:///actors/LinkHandlerParent.sys.mjs'); + 'resource:///actors/LinkPreviewChild.sys.mjs': typeof import('resource:///actors/LinkPreviewChild.sys.mjs'); 'resource:///actors/PluginParent.sys.mjs': typeof import('resource:///actors/PluginParent.sys.mjs'); + 'resource:///actors/ScreenshotsComponentChild.sys.mjs': typeof import('resource:///actors/ScreenshotsComponentChild.sys.mjs'); 'resource:///actors/SearchSERPTelemetryChild.sys.mjs': typeof import('resource:///actors/SearchSERPTelemetryChild.sys.mjs'); 'resource:///actors/WebRTCChild.sys.mjs': typeof import('resource:///actors/WebRTCChild.sys.mjs'); + 'resource:///bar.sys.mjs': typeof import('resource:///bar.sys.mjs'); 'resource:///modules/360seMigrationUtils.sys.mjs': typeof import('resource:///modules/360seMigrationUtils.sys.mjs'); 'resource:///modules/AboutHomeStartupCache.sys.mjs': typeof import('resource:///modules/AboutHomeStartupCache.sys.mjs'); 'resource:///modules/AboutNewTab.sys.mjs': typeof import('resource:///modules/AboutNewTab.sys.mjs'); 'resource:///modules/AboutNewTabRedirector.sys.mjs': typeof import('resource:///modules/AboutNewTabRedirector.sys.mjs'); 'resource:///modules/AboutNewTabResourceMapping.sys.mjs': typeof import('resource:///modules/AboutNewTabResourceMapping.sys.mjs'); - 'resource:///modules/ActionsProviderContextualSearch.sys.mjs': typeof import('resource:///modules/ActionsProviderContextualSearch.sys.mjs'); - 'resource:///modules/ActionsProviderQuickActions.sys.mjs': typeof import('resource:///modules/ActionsProviderQuickActions.sys.mjs'); + 'resource:///modules/AccountsGlue.sys.mjs': typeof import('resource:///modules/AccountsGlue.sys.mjs'); 'resource:///modules/BrowserGlue.sys.mjs': typeof import('resource:///modules/BrowserGlue.sys.mjs'); 'resource:///modules/BrowserUIUtils.sys.mjs': typeof import('resource:///modules/BrowserUIUtils.sys.mjs'); 'resource:///modules/BrowserUsageTelemetry.sys.mjs': typeof import('resource:///modules/BrowserUsageTelemetry.sys.mjs'); 'resource:///modules/BrowserWindowTracker.sys.mjs': typeof import('resource:///modules/BrowserWindowTracker.sys.mjs'); 'resource:///modules/BuiltInThemeConfig.sys.mjs': typeof import('resource:///modules/BuiltInThemeConfig.sys.mjs'); 'resource:///modules/BuiltInThemes.sys.mjs': typeof import('resource:///modules/BuiltInThemes.sys.mjs'); + 'resource:///modules/ChromeMacOSLoginCrypto.sys.mjs': typeof import('resource:///modules/ChromeMacOSLoginCrypto.sys.mjs'); 'resource:///modules/ChromeMigrationUtils.sys.mjs': typeof import('resource:///modules/ChromeMigrationUtils.sys.mjs'); + 'resource:///modules/ChromeProfileMigrator.sys.mjs': typeof import('resource:///modules/ChromeProfileMigrator.sys.mjs'); + 'resource:///modules/ChromeWindowsLoginCrypto.sys.mjs': typeof import('resource:///modules/ChromeWindowsLoginCrypto.sys.mjs'); 'resource:///modules/ContentCrashHandlers.sys.mjs': typeof import('resource:///modules/ContentCrashHandlers.sys.mjs'); + 'resource:///modules/Dedupe.sys.mjs': typeof import('resource:///modules/Dedupe.sys.mjs'); + 'resource:///modules/DevToolsStartup.sys.mjs': typeof import('resource:///modules/DevToolsStartup.sys.mjs'); 'resource:///modules/Discovery.sys.mjs': typeof import('resource:///modules/Discovery.sys.mjs'); + 'resource:///modules/DownloadsCommon.sys.mjs': typeof import('resource:///modules/DownloadsCommon.sys.mjs'); + 'resource:///modules/DownloadsViewUI.sys.mjs': typeof import('resource:///modules/DownloadsViewUI.sys.mjs'); 'resource:///modules/ESEDBReader.sys.mjs': typeof import('resource:///modules/ESEDBReader.sys.mjs'); + 'resource:///modules/EdgeProfileMigrator.sys.mjs': typeof import('resource:///modules/EdgeProfileMigrator.sys.mjs'); 'resource:///modules/EveryWindow.sys.mjs': typeof import('resource:///modules/EveryWindow.sys.mjs'); 'resource:///modules/ExtensionBrowsingData.sys.mjs': typeof import('resource:///modules/ExtensionBrowsingData.sys.mjs'); 'resource:///modules/ExtensionControlledPopup.sys.mjs': typeof import('resource:///modules/ExtensionControlledPopup.sys.mjs'); @@ -271,25 +380,25 @@ export interface Modules { 'resource:///modules/GenAI.sys.mjs': typeof import('resource:///modules/GenAI.sys.mjs'); 'resource:///modules/HistoryController.sys.mjs': typeof import('resource:///modules/HistoryController.sys.mjs'); 'resource:///modules/HomePage.sys.mjs': typeof import('resource:///modules/HomePage.sys.mjs'); + 'resource:///modules/InstallerPrefs.sys.mjs': typeof import('resource:///modules/InstallerPrefs.sys.mjs'); 'resource:///modules/InternalTestingProfileMigrator.sys.mjs': typeof import('resource:///modules/InternalTestingProfileMigrator.sys.mjs'); 'resource:///modules/LaterRun.sys.mjs': typeof import('resource:///modules/LaterRun.sys.mjs'); 'resource:///modules/LinksCache.sys.mjs': typeof import('resource:///modules/LinksCache.sys.mjs'); 'resource:///modules/LoginBreaches.sys.mjs': typeof import('resource:///modules/LoginBreaches.sys.mjs'); + 'resource:///modules/MSMigrationUtils.sys.mjs': typeof import('resource:///modules/MSMigrationUtils.sys.mjs'); 'resource:///modules/MerinoClient.sys.mjs': typeof import('resource:///modules/MerinoClient.sys.mjs'); 'resource:///modules/MigrationUtils.sys.mjs': typeof import('resource:///modules/MigrationUtils.sys.mjs'); + 'resource:///modules/MigratorBase.sys.mjs': typeof import('resource:///modules/MigratorBase.sys.mjs'); 'resource:///modules/OpenTabs.sys.mjs': typeof import('resource:///modules/OpenTabs.sys.mjs'); 'resource:///modules/PageActions.sys.mjs': typeof import('resource:///modules/PageActions.sys.mjs'); 'resource:///modules/PartnerLinkAttribution.sys.mjs': typeof import('resource:///modules/PartnerLinkAttribution.sys.mjs'); 'resource:///modules/PermissionUI.sys.mjs': typeof import('resource:///modules/PermissionUI.sys.mjs'); - 'resource:///modules/PopupBlockerObserver.sys.mjs': typeof import('resource:///modules/PopupBlockerObserver.sys.mjs'); + 'resource:///modules/PopupAndRedirectBlockerObserver.sys.mjs': typeof import('resource:///modules/PopupAndRedirectBlockerObserver.sys.mjs'); 'resource:///modules/ProcessHangMonitor.sys.mjs': typeof import('resource:///modules/ProcessHangMonitor.sys.mjs'); - 'resource:///modules/QuickActionsLoaderDefault.sys.mjs': typeof import('resource:///modules/QuickActionsLoaderDefault.sys.mjs'); - 'resource:///modules/QuickSuggest.sys.mjs': typeof import('resource:///modules/QuickSuggest.sys.mjs'); 'resource:///modules/SafariProfileMigrator.sys.mjs': typeof import('resource:///modules/SafariProfileMigrator.sys.mjs'); 'resource:///modules/Sanitizer.sys.mjs': typeof import('resource:///modules/Sanitizer.sys.mjs'); 'resource:///modules/ScreenshotsOverlayChild.sys.mjs': typeof import('resource:///modules/ScreenshotsOverlayChild.sys.mjs'); 'resource:///modules/ScreenshotsUtils.sys.mjs': typeof import('resource:///modules/ScreenshotsUtils.sys.mjs'); - 'resource:///modules/SearchModeSwitcher.sys.mjs': typeof import('resource:///modules/SearchModeSwitcher.sys.mjs'); 'resource:///modules/SelectionChangedMenulist.sys.mjs': typeof import('resource:///modules/SelectionChangedMenulist.sys.mjs'); 'resource:///modules/SharingUtils.sys.mjs': typeof import('resource:///modules/SharingUtils.sys.mjs'); 'resource:///modules/SiteDataManager.sys.mjs': typeof import('resource:///modules/SiteDataManager.sys.mjs'); @@ -299,37 +408,10 @@ export interface Modules { 'resource:///modules/ThemeVariableMap.sys.mjs': typeof import('resource:///modules/ThemeVariableMap.sys.mjs'); 'resource:///modules/TransientPrefs.sys.mjs': typeof import('resource:///modules/TransientPrefs.sys.mjs'); 'resource:///modules/URILoadingHelper.sys.mjs': typeof import('resource:///modules/URILoadingHelper.sys.mjs'); - 'resource:///modules/UrlbarController.sys.mjs': typeof import('resource:///modules/UrlbarController.sys.mjs'); - 'resource:///modules/UrlbarEventBufferer.sys.mjs': typeof import('resource:///modules/UrlbarEventBufferer.sys.mjs'); - 'resource:///modules/UrlbarInput.sys.mjs': typeof import('resource:///modules/UrlbarInput.sys.mjs'); - 'resource:///modules/UrlbarPrefs.sys.mjs': typeof import('resource:///modules/UrlbarPrefs.sys.mjs'); - 'resource:///modules/UrlbarProviderAutofill.sys.mjs': typeof import('resource:///modules/UrlbarProviderAutofill.sys.mjs'); - 'resource:///modules/UrlbarProviderCalculator.sys.mjs': typeof import('resource:///modules/UrlbarProviderCalculator.sys.mjs'); - 'resource:///modules/UrlbarProviderClipboard.sys.mjs': typeof import('resource:///modules/UrlbarProviderClipboard.sys.mjs'); - 'resource:///modules/UrlbarProviderGlobalActions.sys.mjs': typeof import('resource:///modules/UrlbarProviderGlobalActions.sys.mjs'); - 'resource:///modules/UrlbarProviderInterventions.sys.mjs': typeof import('resource:///modules/UrlbarProviderInterventions.sys.mjs'); - 'resource:///modules/UrlbarProviderOpenTabs.sys.mjs': typeof import('resource:///modules/UrlbarProviderOpenTabs.sys.mjs'); - 'resource:///modules/UrlbarProviderPlaces.sys.mjs': typeof import('resource:///modules/UrlbarProviderPlaces.sys.mjs'); - 'resource:///modules/UrlbarProviderQuickSuggest.sys.mjs': typeof import('resource:///modules/UrlbarProviderQuickSuggest.sys.mjs'); - 'resource:///modules/UrlbarProviderQuickSuggestContextualOptIn.sys.mjs': typeof import('resource:///modules/UrlbarProviderQuickSuggestContextualOptIn.sys.mjs'); - 'resource:///modules/UrlbarProviderRecentSearches.sys.mjs': typeof import('resource:///modules/UrlbarProviderRecentSearches.sys.mjs'); - 'resource:///modules/UrlbarProviderSearchSuggestions.sys.mjs': typeof import('resource:///modules/UrlbarProviderSearchSuggestions.sys.mjs'); - 'resource:///modules/UrlbarProviderSearchTips.sys.mjs': typeof import('resource:///modules/UrlbarProviderSearchTips.sys.mjs'); - 'resource:///modules/UrlbarProviderSemanticHistorySearch.sys.mjs': typeof import('resource:///modules/UrlbarProviderSemanticHistorySearch.sys.mjs'); - 'resource:///modules/UrlbarProviderTabToSearch.sys.mjs': typeof import('resource:///modules/UrlbarProviderTabToSearch.sys.mjs'); - 'resource:///modules/UrlbarProviderTopSites.sys.mjs': typeof import('resource:///modules/UrlbarProviderTopSites.sys.mjs'); - 'resource:///modules/UrlbarProviderUnitConversion.sys.mjs': typeof import('resource:///modules/UrlbarProviderUnitConversion.sys.mjs'); - 'resource:///modules/UrlbarProvidersManager.sys.mjs': typeof import('resource:///modules/UrlbarProvidersManager.sys.mjs'); - 'resource:///modules/UrlbarResult.sys.mjs': typeof import('resource:///modules/UrlbarResult.sys.mjs'); - 'resource:///modules/UrlbarSearchOneOffs.sys.mjs': typeof import('resource:///modules/UrlbarSearchOneOffs.sys.mjs'); - 'resource:///modules/UrlbarSearchTermsPersistence.sys.mjs': typeof import('resource:///modules/UrlbarSearchTermsPersistence.sys.mjs'); - 'resource:///modules/UrlbarSearchUtils.sys.mjs': typeof import('resource:///modules/UrlbarSearchUtils.sys.mjs'); - 'resource:///modules/UrlbarTokenizer.sys.mjs': typeof import('resource:///modules/UrlbarTokenizer.sys.mjs'); 'resource:///modules/UrlbarUtils.sys.mjs': typeof import('resource:///modules/UrlbarUtils.sys.mjs'); - 'resource:///modules/UrlbarValueFormatter.sys.mjs': typeof import('resource:///modules/UrlbarValueFormatter.sys.mjs'); - 'resource:///modules/UrlbarView.sys.mjs': typeof import('resource:///modules/UrlbarView.sys.mjs'); 'resource:///modules/WebProtocolHandlerRegistrar.sys.mjs': typeof import('resource:///modules/WebProtocolHandlerRegistrar.sys.mjs'); 'resource:///modules/WindowsJumpLists.sys.mjs': typeof import('resource:///modules/WindowsJumpLists.sys.mjs'); + 'resource:///modules/WindowsPreviewPerTab.sys.mjs': typeof import('resource:///modules/WindowsPreviewPerTab.sys.mjs'); 'resource:///modules/ZoomUI.sys.mjs': typeof import('resource:///modules/ZoomUI.sys.mjs'); 'resource:///modules/aboutwelcome/AWScreenUtils.sys.mjs': typeof import('resource:///modules/aboutwelcome/AWScreenUtils.sys.mjs'); 'resource:///modules/aboutwelcome/AWToolbarUtils.sys.mjs': typeof import('resource:///modules/aboutwelcome/AWToolbarUtils.sys.mjs'); @@ -341,6 +423,7 @@ export interface Modules { 'resource:///modules/asrouter/ASRouterPreferences.sys.mjs': typeof import('resource:///modules/asrouter/ASRouterPreferences.sys.mjs'); 'resource:///modules/asrouter/ASRouterStorage.sys.mjs': typeof import('resource:///modules/asrouter/ASRouterStorage.sys.mjs'); 'resource:///modules/asrouter/ASRouterTargeting.sys.mjs': typeof import('resource:///modules/asrouter/ASRouterTargeting.sys.mjs'); + 'resource:///modules/asrouter/ASRouterTelemetry.sys.mjs': typeof import('resource:///modules/asrouter/ASRouterTelemetry.sys.mjs'); 'resource:///modules/asrouter/ASRouterTriggerListeners.sys.mjs': typeof import('resource:///modules/asrouter/ASRouterTriggerListeners.sys.mjs'); 'resource:///modules/asrouter/ActorConstants.mjs': typeof import('resource:///modules/asrouter/ActorConstants.mjs'); 'resource:///modules/asrouter/BookmarksBarButton.sys.mjs': typeof import('resource:///modules/asrouter/BookmarksBarButton.sys.mjs'); @@ -359,22 +442,39 @@ export interface Modules { 'resource:///modules/asrouter/Spotlight.sys.mjs': typeof import('resource:///modules/asrouter/Spotlight.sys.mjs'); 'resource:///modules/asrouter/ToastNotification.sys.mjs': typeof import('resource:///modules/asrouter/ToastNotification.sys.mjs'); 'resource:///modules/asrouter/ToolbarBadgeHub.sys.mjs': typeof import('resource:///modules/asrouter/ToolbarBadgeHub.sys.mjs'); + 'resource:///modules/backup/AddonsBackupResource.sys.mjs': typeof import('resource:///modules/backup/AddonsBackupResource.sys.mjs'); 'resource:///modules/backup/ArchiveEncryption.sys.mjs': typeof import('resource:///modules/backup/ArchiveEncryption.sys.mjs'); 'resource:///modules/backup/ArchiveEncryptionState.sys.mjs': typeof import('resource:///modules/backup/ArchiveEncryptionState.sys.mjs'); 'resource:///modules/backup/ArchiveUtils.sys.mjs': typeof import('resource:///modules/backup/ArchiveUtils.sys.mjs'); 'resource:///modules/backup/BackupError.mjs': typeof import('resource:///modules/backup/BackupError.mjs'); + 'resource:///modules/backup/BackupResource.sys.mjs': typeof import('resource:///modules/backup/BackupResource.sys.mjs'); 'resource:///modules/backup/BackupService.sys.mjs': typeof import('resource:///modules/backup/BackupService.sys.mjs'); + 'resource:///modules/backup/CookiesBackupResource.sys.mjs': typeof import('resource:///modules/backup/CookiesBackupResource.sys.mjs'); + 'resource:///modules/backup/CredentialsAndSecurityBackupResource.sys.mjs': typeof import('resource:///modules/backup/CredentialsAndSecurityBackupResource.sys.mjs'); + 'resource:///modules/backup/FormHistoryBackupResource.sys.mjs': typeof import('resource:///modules/backup/FormHistoryBackupResource.sys.mjs'); + 'resource:///modules/backup/MeasurementUtils.sys.mjs': typeof import('resource:///modules/backup/MeasurementUtils.sys.mjs'); + 'resource:///modules/backup/MiscDataBackupResource.sys.mjs': typeof import('resource:///modules/backup/MiscDataBackupResource.sys.mjs'); + 'resource:///modules/backup/PlacesBackupResource.sys.mjs': typeof import('resource:///modules/backup/PlacesBackupResource.sys.mjs'); + 'resource:///modules/backup/PreferencesBackupResource.sys.mjs': typeof import('resource:///modules/backup/PreferencesBackupResource.sys.mjs'); + 'resource:///modules/backup/SessionStoreBackupResource.sys.mjs': typeof import('resource:///modules/backup/SessionStoreBackupResource.sys.mjs'); 'resource:///modules/distribution.sys.mjs': typeof import('resource:///modules/distribution.sys.mjs'); 'resource:///modules/firefox-view-synced-tabs-error-handler.sys.mjs': typeof import('resource:///modules/firefox-view-synced-tabs-error-handler.sys.mjs'); 'resource:///modules/firefox-view-tabs-setup-manager.sys.mjs': typeof import('resource:///modules/firefox-view-tabs-setup-manager.sys.mjs'); + 'resource:///modules/ipprotection/GuardianClient.sys.mjs': typeof import('resource:///modules/ipprotection/GuardianClient.sys.mjs'); + 'resource:///modules/ipprotection/IPPChannelFilter.sys.mjs': typeof import('resource:///modules/ipprotection/IPPChannelFilter.sys.mjs'); + 'resource:///modules/ipprotection/IPPNetworkErrorObserver.sys.mjs': typeof import('resource:///modules/ipprotection/IPPNetworkErrorObserver.sys.mjs'); + 'resource:///modules/ipprotection/IPPProxyManager.sys.mjs': typeof import('resource:///modules/ipprotection/IPPProxyManager.sys.mjs'); 'resource:///modules/ipprotection/IPProtection.sys.mjs': typeof import('resource:///modules/ipprotection/IPProtection.sys.mjs'); 'resource:///modules/ipprotection/IPProtectionPanel.sys.mjs': typeof import('resource:///modules/ipprotection/IPProtectionPanel.sys.mjs'); + 'resource:///modules/ipprotection/IPProtectionServerlist.sys.mjs': typeof import('resource:///modules/ipprotection/IPProtectionServerlist.sys.mjs'); 'resource:///modules/ipprotection/IPProtectionService.sys.mjs': typeof import('resource:///modules/ipprotection/IPProtectionService.sys.mjs'); + 'resource:///modules/ipprotection/IPProtectionUsage.sys.mjs': typeof import('resource:///modules/ipprotection/IPProtectionUsage.sys.mjs'); 'resource:///modules/policies/BookmarksPolicies.sys.mjs': typeof import('resource:///modules/policies/BookmarksPolicies.sys.mjs'); 'resource:///modules/policies/Policies.sys.mjs': typeof import('resource:///modules/policies/Policies.sys.mjs'); 'resource:///modules/policies/ProxyPolicies.sys.mjs': typeof import('resource:///modules/policies/ProxyPolicies.sys.mjs'); 'resource:///modules/policies/WebsiteFilter.sys.mjs': typeof import('resource:///modules/policies/WebsiteFilter.sys.mjs'); 'resource:///modules/policies/schema.sys.mjs': typeof import('resource:///modules/policies/schema.sys.mjs'); + 'resource:///modules/profiles/SelectableProfile.sys.mjs': typeof import('resource:///modules/profiles/SelectableProfile.sys.mjs'); 'resource:///modules/profiles/SelectableProfileService.sys.mjs': typeof import('resource:///modules/profiles/SelectableProfileService.sys.mjs'); 'resource:///modules/sessionstore/PageWireframes.sys.mjs': typeof import('resource:///modules/sessionstore/PageWireframes.sys.mjs'); 'resource:///modules/sessionstore/RecentlyClosedTabsAndWindowsMenuUtils.sys.mjs': typeof import('resource:///modules/sessionstore/RecentlyClosedTabsAndWindowsMenuUtils.sys.mjs'); @@ -394,6 +494,11 @@ export interface Modules { 'resource:///modules/sessionstore/TabState.sys.mjs': typeof import('resource:///modules/sessionstore/TabState.sys.mjs'); 'resource:///modules/sessionstore/TabStateCache.sys.mjs': typeof import('resource:///modules/sessionstore/TabStateCache.sys.mjs'); 'resource:///modules/sessionstore/TabStateFlusher.sys.mjs': typeof import('resource:///modules/sessionstore/TabStateFlusher.sys.mjs'); + 'resource:///modules/syncedtabs/EventEmitter.sys.mjs': typeof import('resource:///modules/syncedtabs/EventEmitter.sys.mjs'); + 'resource:///modules/syncedtabs/SyncedTabsDeckComponent.sys.mjs': typeof import('resource:///modules/syncedtabs/SyncedTabsDeckComponent.sys.mjs'); + 'resource:///modules/syncedtabs/SyncedTabsDeckStore.sys.mjs': typeof import('resource:///modules/syncedtabs/SyncedTabsDeckStore.sys.mjs'); + 'resource:///modules/syncedtabs/SyncedTabsListStore.sys.mjs': typeof import('resource:///modules/syncedtabs/SyncedTabsListStore.sys.mjs'); + 'resource:///modules/syncedtabs/TabListComponent.sys.mjs': typeof import('resource:///modules/syncedtabs/TabListComponent.sys.mjs'); 'resource:///modules/taskbartabs/TaskbarTabs.sys.mjs': typeof import('resource:///modules/taskbartabs/TaskbarTabs.sys.mjs'); 'resource:///modules/taskbartabs/TaskbarTabsChrome.sys.mjs': typeof import('resource:///modules/taskbartabs/TaskbarTabsChrome.sys.mjs'); 'resource:///modules/taskbartabs/TaskbarTabsPageAction.sys.mjs': typeof import('resource:///modules/taskbartabs/TaskbarTabsPageAction.sys.mjs'); @@ -404,24 +509,49 @@ export interface Modules { 'resource:///modules/topsites/TippyTopProvider.sys.mjs': typeof import('resource:///modules/topsites/TippyTopProvider.sys.mjs'); 'resource:///modules/topsites/TopSites.sys.mjs': typeof import('resource:///modules/topsites/TopSites.sys.mjs'); 'resource:///modules/topsites/constants.mjs': typeof import('resource:///modules/topsites/constants.mjs'); - 'resource:///modules/urlbar/private/AmpSuggestions.sys.mjs': typeof import('resource:///modules/urlbar/private/AmpSuggestions.sys.mjs'); - 'resource:///modules/urlbar/private/GeolocationUtils.sys.mjs': typeof import('resource:///modules/urlbar/private/GeolocationUtils.sys.mjs'); - 'resource:///modules/urlbar/private/MLSuggest.sys.mjs': typeof import('resource:///modules/urlbar/private/MLSuggest.sys.mjs'); 'resource:///modules/webrtcUI.sys.mjs': typeof import('resource:///modules/webrtcUI.sys.mjs'); 'resource://autofill/FormAutofill.sys.mjs': typeof import('resource://autofill/FormAutofill.sys.mjs'); + 'resource://autofill/FormAutofillChild.ios.sys.mjs': typeof import('resource://autofill/FormAutofillChild.ios.sys.mjs'); + 'resource://autofill/FormAutofillChild.sys.mjs': typeof import('resource://autofill/FormAutofillChild.sys.mjs'); 'resource://autofill/FormAutofillContent.sys.mjs': typeof import('resource://autofill/FormAutofillContent.sys.mjs'); 'resource://autofill/FormAutofillParent.sys.mjs': typeof import('resource://autofill/FormAutofillParent.sys.mjs'); 'resource://autofill/FormAutofillPreferences.sys.mjs': typeof import('resource://autofill/FormAutofillPreferences.sys.mjs'); 'resource://autofill/FormAutofillPrompter.sys.mjs': typeof import('resource://autofill/FormAutofillPrompter.sys.mjs'); 'resource://autofill/FormAutofillStorage.sys.mjs': typeof import('resource://autofill/FormAutofillStorage.sys.mjs'); + 'resource://autofill/FormAutofillStorageBase.sys.mjs': typeof import('resource://autofill/FormAutofillStorageBase.sys.mjs'); + 'resource://autofill/FormAutofillSync.sys.mjs': typeof import('resource://autofill/FormAutofillSync.sys.mjs'); 'resource://autofill/ProfileAutoCompleteResult.sys.mjs': typeof import('resource://autofill/ProfileAutoCompleteResult.sys.mjs'); 'resource://devtools/client/framework/browser-toolbox/Launcher.sys.mjs': typeof import('resource://devtools/client/framework/browser-toolbox/Launcher.sys.mjs'); + 'resource://devtools/client/performance-new/popup/logic.sys.mjs': typeof import('resource://devtools/client/performance-new/popup/logic.sys.mjs'); 'resource://devtools/client/performance-new/popup/menu-button.sys.mjs': typeof import('resource://devtools/client/performance-new/popup/menu-button.sys.mjs'); + 'resource://devtools/client/performance-new/shared/background.sys.mjs': typeof import('resource://devtools/client/performance-new/shared/background.sys.mjs'); + 'resource://devtools/client/shared/components/reps/index.mjs': typeof import('resource://devtools/client/shared/components/reps/index.mjs'); + 'resource://devtools/client/shared/components/reps/reps/array.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/array.mjs'); + 'resource://devtools/client/shared/components/reps/reps/big-int.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/big-int.mjs'); 'resource://devtools/client/shared/components/reps/reps/constants.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/constants.mjs'); + 'resource://devtools/client/shared/components/reps/reps/element-node.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/element-node.mjs'); + 'resource://devtools/client/shared/components/reps/reps/error.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/error.mjs'); + 'resource://devtools/client/shared/components/reps/reps/grip-array.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/grip-array.mjs'); + 'resource://devtools/client/shared/components/reps/reps/grip-entry.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/grip-entry.mjs'); + 'resource://devtools/client/shared/components/reps/reps/grip-map.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/grip-map.mjs'); 'resource://devtools/client/shared/components/reps/reps/rep-utils.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/rep-utils.mjs'); + 'resource://devtools/client/shared/components/reps/reps/rep.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/rep.mjs'); + 'resource://devtools/client/shared/components/reps/reps/string.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/string.mjs'); + 'resource://devtools/client/shared/components/reps/reps/text-node.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/text-node.mjs'); + 'resource://devtools/client/shared/components/tabs/Tabs.mjs': typeof import('resource://devtools/client/shared/components/tabs/Tabs.mjs'); + 'resource://devtools/client/shared/components/tree/LabelCell.mjs': typeof import('resource://devtools/client/shared/components/tree/LabelCell.mjs'); + 'resource://devtools/client/shared/components/tree/ObjectProvider.mjs': typeof import('resource://devtools/client/shared/components/tree/ObjectProvider.mjs'); + 'resource://devtools/client/shared/components/tree/TreeRow.mjs': typeof import('resource://devtools/client/shared/components/tree/TreeRow.mjs'); + 'resource://devtools/client/shared/components/tree/TreeView.mjs': typeof import('resource://devtools/client/shared/components/tree/TreeView.mjs'); 'resource://devtools/client/shared/focus.mjs': typeof import('resource://devtools/client/shared/focus.mjs'); + 'resource://devtools/client/shared/scroll.mjs': typeof import('resource://devtools/client/shared/scroll.mjs'); + 'resource://devtools/client/shared/sourceeditor/codemirror6/codemirror6.bundle.mjs': typeof import('resource://devtools/client/shared/sourceeditor/codemirror6/codemirror6.bundle.mjs'); 'resource://devtools/client/storage/VariablesView.sys.mjs': typeof import('resource://devtools/client/storage/VariablesView.sys.mjs'); + 'resource://devtools/client/styleeditor/StyleEditorUI.sys.mjs': typeof import('resource://devtools/client/styleeditor/StyleEditorUI.sys.mjs'); + 'resource://devtools/client/styleeditor/StyleEditorUtil.sys.mjs': typeof import('resource://devtools/client/styleeditor/StyleEditorUtil.sys.mjs'); 'resource://devtools/server/actors/targets/target-actor-registry.sys.mjs': typeof import('resource://devtools/server/actors/targets/target-actor-registry.sys.mjs'); + 'resource://devtools/server/actors/utils/HTMLSourcesCache.sys.mjs': typeof import('resource://devtools/server/actors/utils/HTMLSourcesCache.sys.mjs'); + 'resource://devtools/server/actors/watcher/ParentProcessWatcherRegistry.sys.mjs': typeof import('resource://devtools/server/actors/watcher/ParentProcessWatcherRegistry.sys.mjs'); 'resource://devtools/server/actors/watcher/SessionDataHelpers.sys.mjs': typeof import('resource://devtools/server/actors/watcher/SessionDataHelpers.sys.mjs'); 'resource://devtools/server/actors/watcher/browsing-context-helpers.sys.mjs': typeof import('resource://devtools/server/actors/watcher/browsing-context-helpers.sys.mjs'); 'resource://devtools/server/connectors/js-process-actor/target-watchers/content_script.sys.mjs': typeof import('resource://devtools/server/connectors/js-process-actor/target-watchers/content_script.sys.mjs'); @@ -430,11 +560,15 @@ export interface Modules { 'resource://devtools/server/connectors/js-process-actor/target-watchers/shared_worker.sys.mjs': typeof import('resource://devtools/server/connectors/js-process-actor/target-watchers/shared_worker.sys.mjs'); 'resource://devtools/server/connectors/js-process-actor/target-watchers/window-global.sys.mjs': typeof import('resource://devtools/server/connectors/js-process-actor/target-watchers/window-global.sys.mjs'); 'resource://devtools/server/connectors/js-process-actor/target-watchers/worker.sys.mjs': typeof import('resource://devtools/server/connectors/js-process-actor/target-watchers/worker.sys.mjs'); + 'resource://devtools/server/startup/content-process.sys.mjs': typeof import('resource://devtools/server/startup/content-process.sys.mjs'); + 'resource://devtools/server/startup/worker.sys.mjs': typeof import('resource://devtools/server/startup/worker.sys.mjs'); 'resource://devtools/server/tracer/tracer.sys.mjs': typeof import('resource://devtools/server/tracer/tracer.sys.mjs'); 'resource://devtools/shared/DevToolsInfaillibleUtils.sys.mjs': typeof import('resource://devtools/shared/DevToolsInfaillibleUtils.sys.mjs'); 'resource://devtools/shared/highlighters.mjs': typeof import('resource://devtools/shared/highlighters.mjs'); 'resource://devtools/shared/loader/DistinctSystemPrincipalLoader.sys.mjs': typeof import('resource://devtools/shared/loader/DistinctSystemPrincipalLoader.sys.mjs'); 'resource://devtools/shared/loader/Loader.sys.mjs': typeof import('resource://devtools/shared/loader/Loader.sys.mjs'); + 'resource://devtools/shared/loader/browser-loader.sys.mjs': typeof import('resource://devtools/shared/loader/browser-loader.sys.mjs'); + 'resource://devtools/shared/loader/worker-loader.sys.mjs': typeof import('resource://devtools/shared/loader/worker-loader.sys.mjs'); 'resource://devtools/shared/network-observer/ChannelMap.sys.mjs': typeof import('resource://devtools/shared/network-observer/ChannelMap.sys.mjs'); 'resource://devtools/shared/network-observer/NetworkAuthListener.sys.mjs': typeof import('resource://devtools/shared/network-observer/NetworkAuthListener.sys.mjs'); 'resource://devtools/shared/network-observer/NetworkHelper.sys.mjs': typeof import('resource://devtools/shared/network-observer/NetworkHelper.sys.mjs'); @@ -445,16 +579,22 @@ export interface Modules { 'resource://devtools/shared/network-observer/NetworkTimings.sys.mjs': typeof import('resource://devtools/shared/network-observer/NetworkTimings.sys.mjs'); 'resource://devtools/shared/network-observer/NetworkUtils.sys.mjs': typeof import('resource://devtools/shared/network-observer/NetworkUtils.sys.mjs'); 'resource://devtools/shared/network-observer/WildcardToRegexp.sys.mjs': typeof import('resource://devtools/shared/network-observer/WildcardToRegexp.sys.mjs'); + 'resource://devtools/shared/performance-new/errors.sys.mjs': typeof import('resource://devtools/shared/performance-new/errors.sys.mjs'); + 'resource://devtools/shared/performance-new/prefs-presets.sys.mjs': typeof import('resource://devtools/shared/performance-new/prefs-presets.sys.mjs'); 'resource://devtools/shared/performance-new/recording-utils.sys.mjs': typeof import('resource://devtools/shared/performance-new/recording-utils.sys.mjs'); 'resource://devtools/shared/performance-new/symbolication.sys.mjs': typeof import('resource://devtools/shared/performance-new/symbolication.sys.mjs'); 'resource://devtools/shared/platform/CacheEntry.sys.mjs': typeof import('resource://devtools/shared/platform/CacheEntry.sys.mjs'); 'resource://devtools/shared/security/DevToolsSocketStatus.sys.mjs': typeof import('resource://devtools/shared/security/DevToolsSocketStatus.sys.mjs'); + 'resource://devtools/shared/test-helpers/dump-scope.sys.mjs': typeof import('resource://devtools/shared/test-helpers/dump-scope.sys.mjs'); + 'resource://devtools/shared/test-helpers/tracked-objects.sys.mjs': typeof import('resource://devtools/shared/test-helpers/tracked-objects.sys.mjs'); 'resource://devtools/shared/validate-breakpoint.sys.mjs': typeof import('resource://devtools/shared/validate-breakpoint.sys.mjs'); 'resource://devtools/shared/worker/worker.sys.mjs': typeof import('resource://devtools/shared/worker/worker.sys.mjs'); 'resource://gre/actors/AutoCompleteParent.sys.mjs': typeof import('resource://gre/actors/AutoCompleteParent.sys.mjs'); 'resource://gre/actors/FormHandlerChild.sys.mjs': typeof import('resource://gre/actors/FormHandlerChild.sys.mjs'); 'resource://gre/actors/MLEngineParent.sys.mjs': typeof import('resource://gre/actors/MLEngineParent.sys.mjs'); - 'resource://gre/actors/PopupBlockingParent.sys.mjs': typeof import('resource://gre/actors/PopupBlockingParent.sys.mjs'); + 'resource://gre/actors/PictureInPictureChild.sys.mjs': typeof import('resource://gre/actors/PictureInPictureChild.sys.mjs'); + 'resource://gre/actors/PopupAndRedirectBlockingParent.sys.mjs': typeof import('resource://gre/actors/PopupAndRedirectBlockingParent.sys.mjs'); + 'resource://gre/actors/SelectChild.sys.mjs': typeof import('resource://gre/actors/SelectChild.sys.mjs'); 'resource://gre/actors/SelectParent.sys.mjs': typeof import('resource://gre/actors/SelectParent.sys.mjs'); 'resource://gre/actors/TranslationsParent.sys.mjs': typeof import('resource://gre/actors/TranslationsParent.sys.mjs'); 'resource://gre/actors/ViewSourcePageChild.sys.mjs': typeof import('resource://gre/actors/ViewSourcePageChild.sys.mjs'); @@ -467,12 +607,15 @@ export interface Modules { 'resource://gre/modules/AppMenuNotifications.sys.mjs': typeof import('resource://gre/modules/AppMenuNotifications.sys.mjs'); 'resource://gre/modules/AppServicesTracing.sys.mjs': typeof import('resource://gre/modules/AppServicesTracing.sys.mjs'); 'resource://gre/modules/AppUpdater.sys.mjs': typeof import('resource://gre/modules/AppUpdater.sys.mjs'); + 'resource://gre/modules/AsanReporter.sys.mjs': typeof import('resource://gre/modules/AsanReporter.sys.mjs'); 'resource://gre/modules/AsyncPrefs.sys.mjs': typeof import('resource://gre/modules/AsyncPrefs.sys.mjs'); 'resource://gre/modules/AsyncShutdown.sys.mjs': typeof import('resource://gre/modules/AsyncShutdown.sys.mjs'); 'resource://gre/modules/BackgroundPageThumbs.sys.mjs': typeof import('resource://gre/modules/BackgroundPageThumbs.sys.mjs'); + 'resource://gre/modules/BackgroundTasksManager.sys.mjs': typeof import('resource://gre/modules/BackgroundTasksManager.sys.mjs'); 'resource://gre/modules/BackgroundTasksUtils.sys.mjs': typeof import('resource://gre/modules/BackgroundTasksUtils.sys.mjs'); 'resource://gre/modules/BackgroundUpdate.sys.mjs': typeof import('resource://gre/modules/BackgroundUpdate.sys.mjs'); 'resource://gre/modules/BinarySearch.sys.mjs': typeof import('resource://gre/modules/BinarySearch.sys.mjs'); + 'resource://gre/modules/Bits.sys.mjs': typeof import('resource://gre/modules/Bits.sys.mjs'); 'resource://gre/modules/Blocklist.sys.mjs': typeof import('resource://gre/modules/Blocklist.sys.mjs'); 'resource://gre/modules/BookmarkHTMLUtils.sys.mjs': typeof import('resource://gre/modules/BookmarkHTMLUtils.sys.mjs'); 'resource://gre/modules/BookmarkJSONUtils.sys.mjs': typeof import('resource://gre/modules/BookmarkJSONUtils.sys.mjs'); @@ -486,28 +629,38 @@ export interface Modules { 'resource://gre/modules/CaptchaResponseObserver.sys.mjs': typeof import('resource://gre/modules/CaptchaResponseObserver.sys.mjs'); 'resource://gre/modules/CertUtils.sys.mjs': typeof import('resource://gre/modules/CertUtils.sys.mjs'); 'resource://gre/modules/ChildCrashHandler.sys.mjs': typeof import('resource://gre/modules/ChildCrashHandler.sys.mjs'); + 'resource://gre/modules/ChromePushSubscription.sys.mjs': typeof import('resource://gre/modules/ChromePushSubscription.sys.mjs'); 'resource://gre/modules/ClientID.sys.mjs': typeof import('resource://gre/modules/ClientID.sys.mjs'); 'resource://gre/modules/ClipboardContextMenu.sys.mjs': typeof import('resource://gre/modules/ClipboardContextMenu.sys.mjs'); 'resource://gre/modules/Color.sys.mjs': typeof import('resource://gre/modules/Color.sys.mjs'); 'resource://gre/modules/ColorwayThemeMigration.sys.mjs': typeof import('resource://gre/modules/ColorwayThemeMigration.sys.mjs'); 'resource://gre/modules/CommonDialog.sys.mjs': typeof import('resource://gre/modules/CommonDialog.sys.mjs'); + 'resource://gre/modules/ComponentUtils.sys.mjs': typeof import('resource://gre/modules/ComponentUtils.sys.mjs'); 'resource://gre/modules/ConduitsParent.sys.mjs': typeof import('resource://gre/modules/ConduitsParent.sys.mjs'); 'resource://gre/modules/Console.sys.mjs': typeof import('resource://gre/modules/Console.sys.mjs'); 'resource://gre/modules/ContentAnalysisUtils.sys.mjs': typeof import('resource://gre/modules/ContentAnalysisUtils.sys.mjs'); 'resource://gre/modules/ContentBlockingAllowList.sys.mjs': typeof import('resource://gre/modules/ContentBlockingAllowList.sys.mjs'); 'resource://gre/modules/ContentDOMReference.sys.mjs': typeof import('resource://gre/modules/ContentDOMReference.sys.mjs'); + 'resource://gre/modules/ContentPrefServiceChild.sys.mjs': typeof import('resource://gre/modules/ContentPrefServiceChild.sys.mjs'); 'resource://gre/modules/ContentPrefUtils.sys.mjs': typeof import('resource://gre/modules/ContentPrefUtils.sys.mjs'); 'resource://gre/modules/ContentRelevancyManager.sys.mjs': typeof import('resource://gre/modules/ContentRelevancyManager.sys.mjs'); 'resource://gre/modules/ContextualIdentityService.sys.mjs': typeof import('resource://gre/modules/ContextualIdentityService.sys.mjs'); 'resource://gre/modules/CoveragePing.sys.mjs': typeof import('resource://gre/modules/CoveragePing.sys.mjs'); + 'resource://gre/modules/CrashManager.sys.mjs': typeof import('resource://gre/modules/CrashManager.sys.mjs'); 'resource://gre/modules/CrashMonitor.sys.mjs': typeof import('resource://gre/modules/CrashMonitor.sys.mjs'); + 'resource://gre/modules/CrashReports.sys.mjs': typeof import('resource://gre/modules/CrashReports.sys.mjs'); 'resource://gre/modules/CrashService.sys.mjs': typeof import('resource://gre/modules/CrashService.sys.mjs'); 'resource://gre/modules/CrashSubmit.sys.mjs': typeof import('resource://gre/modules/CrashSubmit.sys.mjs'); + 'resource://gre/modules/Credentials.sys.mjs': typeof import('resource://gre/modules/Credentials.sys.mjs'); 'resource://gre/modules/CreditCard.sys.mjs': typeof import('resource://gre/modules/CreditCard.sys.mjs'); + 'resource://gre/modules/CustomElementsListener.sys.mjs': typeof import('resource://gre/modules/CustomElementsListener.sys.mjs'); + 'resource://gre/modules/DAPIncrementality.sys.mjs': typeof import('resource://gre/modules/DAPIncrementality.sys.mjs'); + 'resource://gre/modules/DAPReportController.sys.mjs': typeof import('resource://gre/modules/DAPReportController.sys.mjs'); 'resource://gre/modules/DAPTelemetrySender.sys.mjs': typeof import('resource://gre/modules/DAPTelemetrySender.sys.mjs'); 'resource://gre/modules/DAPVisitCounter.sys.mjs': typeof import('resource://gre/modules/DAPVisitCounter.sys.mjs'); 'resource://gre/modules/DateTimePickerPanel.sys.mjs': typeof import('resource://gre/modules/DateTimePickerPanel.sys.mjs'); 'resource://gre/modules/DeferredTask.sys.mjs': typeof import('resource://gre/modules/DeferredTask.sys.mjs'); + 'resource://gre/modules/DelayedInit.sys.mjs': typeof import('resource://gre/modules/DelayedInit.sys.mjs'); 'resource://gre/modules/DownloadCore.sys.mjs': typeof import('resource://gre/modules/DownloadCore.sys.mjs'); 'resource://gre/modules/DownloadHistory.sys.mjs': typeof import('resource://gre/modules/DownloadHistory.sys.mjs'); 'resource://gre/modules/DownloadIntegration.sys.mjs': typeof import('resource://gre/modules/DownloadIntegration.sys.mjs'); @@ -519,10 +672,13 @@ export interface Modules { 'resource://gre/modules/DownloadUtils.sys.mjs': typeof import('resource://gre/modules/DownloadUtils.sys.mjs'); 'resource://gre/modules/Downloads.sys.mjs': typeof import('resource://gre/modules/Downloads.sys.mjs'); 'resource://gre/modules/E10SUtils.sys.mjs': typeof import('resource://gre/modules/E10SUtils.sys.mjs'); + 'resource://gre/modules/EnterprisePoliciesContent.sys.mjs': typeof import('resource://gre/modules/EnterprisePoliciesContent.sys.mjs'); + 'resource://gre/modules/EnterprisePoliciesParent.sys.mjs': typeof import('resource://gre/modules/EnterprisePoliciesParent.sys.mjs'); 'resource://gre/modules/EssentialDomainsRemoteSettings.sys.mjs': typeof import('resource://gre/modules/EssentialDomainsRemoteSettings.sys.mjs'); 'resource://gre/modules/EventEmitter.sys.mjs': typeof import('resource://gre/modules/EventEmitter.sys.mjs'); 'resource://gre/modules/EventPing.sys.mjs': typeof import('resource://gre/modules/EventPing.sys.mjs'); 'resource://gre/modules/Extension.sys.mjs': typeof import('resource://gre/modules/Extension.sys.mjs'); + 'resource://gre/modules/ExtensionActions.sys.mjs': typeof import('resource://gre/modules/ExtensionActions.sys.mjs'); 'resource://gre/modules/ExtensionActivityLog.sys.mjs': typeof import('resource://gre/modules/ExtensionActivityLog.sys.mjs'); 'resource://gre/modules/ExtensionChild.sys.mjs': typeof import('resource://gre/modules/ExtensionChild.sys.mjs'); 'resource://gre/modules/ExtensionChildDevToolsUtils.sys.mjs': typeof import('resource://gre/modules/ExtensionChildDevToolsUtils.sys.mjs'); @@ -547,6 +703,7 @@ export interface Modules { 'resource://gre/modules/ExtensionStorageIDB.sys.mjs': typeof import('resource://gre/modules/ExtensionStorageIDB.sys.mjs'); 'resource://gre/modules/ExtensionStorageSync.sys.mjs': typeof import('resource://gre/modules/ExtensionStorageSync.sys.mjs'); 'resource://gre/modules/ExtensionStorageSyncKinto.sys.mjs': typeof import('resource://gre/modules/ExtensionStorageSyncKinto.sys.mjs'); + 'resource://gre/modules/ExtensionTaskScheduler.sys.mjs': typeof import('resource://gre/modules/ExtensionTaskScheduler.sys.mjs'); 'resource://gre/modules/ExtensionTelemetry.sys.mjs': typeof import('resource://gre/modules/ExtensionTelemetry.sys.mjs'); 'resource://gre/modules/ExtensionUserScripts.sys.mjs': typeof import('resource://gre/modules/ExtensionUserScripts.sys.mjs'); 'resource://gre/modules/ExtensionUserScriptsContent.sys.mjs': typeof import('resource://gre/modules/ExtensionUserScriptsContent.sys.mjs'); @@ -554,11 +711,13 @@ export interface Modules { 'resource://gre/modules/ExtensionWorkerChild.sys.mjs': typeof import('resource://gre/modules/ExtensionWorkerChild.sys.mjs'); 'resource://gre/modules/FileUtils.sys.mjs': typeof import('resource://gre/modules/FileUtils.sys.mjs'); 'resource://gre/modules/FillHelpers.sys.mjs': typeof import('resource://gre/modules/FillHelpers.sys.mjs'); + 'resource://gre/modules/FindBarContent.sys.mjs': typeof import('resource://gre/modules/FindBarContent.sys.mjs'); 'resource://gre/modules/FindContent.sys.mjs': typeof import('resource://gre/modules/FindContent.sys.mjs'); 'resource://gre/modules/Finder.sys.mjs': typeof import('resource://gre/modules/Finder.sys.mjs'); 'resource://gre/modules/FinderHighlighter.sys.mjs': typeof import('resource://gre/modules/FinderHighlighter.sys.mjs'); 'resource://gre/modules/FinderIterator.sys.mjs': typeof import('resource://gre/modules/FinderIterator.sys.mjs'); 'resource://gre/modules/FinderParent.sys.mjs': typeof import('resource://gre/modules/FinderParent.sys.mjs'); + 'resource://gre/modules/FinderSound.sys.mjs': typeof import('resource://gre/modules/FinderSound.sys.mjs'); 'resource://gre/modules/FirefoxRelay.sys.mjs': typeof import('resource://gre/modules/FirefoxRelay.sys.mjs'); 'resource://gre/modules/FirstStartup.sys.mjs': typeof import('resource://gre/modules/FirstStartup.sys.mjs'); 'resource://gre/modules/ForgetAboutSite.sys.mjs': typeof import('resource://gre/modules/ForgetAboutSite.sys.mjs'); @@ -578,13 +737,16 @@ export interface Modules { 'resource://gre/modules/FxAccountsPairingChannel.sys.mjs': typeof import('resource://gre/modules/FxAccountsPairingChannel.sys.mjs'); 'resource://gre/modules/FxAccountsProfile.sys.mjs': typeof import('resource://gre/modules/FxAccountsProfile.sys.mjs'); 'resource://gre/modules/FxAccountsProfileClient.sys.mjs': typeof import('resource://gre/modules/FxAccountsProfileClient.sys.mjs'); + 'resource://gre/modules/FxAccountsPush.sys.mjs': typeof import('resource://gre/modules/FxAccountsPush.sys.mjs'); 'resource://gre/modules/FxAccountsStorage.sys.mjs': typeof import('resource://gre/modules/FxAccountsStorage.sys.mjs'); 'resource://gre/modules/FxAccountsTelemetry.sys.mjs': typeof import('resource://gre/modules/FxAccountsTelemetry.sys.mjs'); 'resource://gre/modules/FxAccountsWebChannel.sys.mjs': typeof import('resource://gre/modules/FxAccountsWebChannel.sys.mjs'); 'resource://gre/modules/GMPInstallManager.sys.mjs': typeof import('resource://gre/modules/GMPInstallManager.sys.mjs'); + 'resource://gre/modules/GMPUtils.sys.mjs': typeof import('resource://gre/modules/GMPUtils.sys.mjs'); 'resource://gre/modules/GeckoViewActorManager.sys.mjs': typeof import('resource://gre/modules/GeckoViewActorManager.sys.mjs'); 'resource://gre/modules/GeckoViewAutocomplete.sys.mjs': typeof import('resource://gre/modules/GeckoViewAutocomplete.sys.mjs'); 'resource://gre/modules/GeckoViewAutofill.sys.mjs': typeof import('resource://gre/modules/GeckoViewAutofill.sys.mjs'); + 'resource://gre/modules/GeckoViewChildModule.sys.mjs': typeof import('resource://gre/modules/GeckoViewChildModule.sys.mjs'); 'resource://gre/modules/GeckoViewClipboardPermission.sys.mjs': typeof import('resource://gre/modules/GeckoViewClipboardPermission.sys.mjs'); 'resource://gre/modules/GeckoViewIdentityCredential.sys.mjs': typeof import('resource://gre/modules/GeckoViewIdentityCredential.sys.mjs'); 'resource://gre/modules/GeckoViewPrompter.sys.mjs': typeof import('resource://gre/modules/GeckoViewPrompter.sys.mjs'); @@ -615,19 +777,25 @@ export interface Modules { 'resource://gre/modules/LoadURIDelegate.sys.mjs': typeof import('resource://gre/modules/LoadURIDelegate.sys.mjs'); 'resource://gre/modules/LocationHelper.sys.mjs': typeof import('resource://gre/modules/LocationHelper.sys.mjs'); 'resource://gre/modules/Log.sys.mjs': typeof import('resource://gre/modules/Log.sys.mjs'); + 'resource://gre/modules/LogManager.sys.mjs': typeof import('resource://gre/modules/LogManager.sys.mjs'); 'resource://gre/modules/LoginAutoComplete.sys.mjs': typeof import('resource://gre/modules/LoginAutoComplete.sys.mjs'); 'resource://gre/modules/LoginCSVImport.sys.mjs': typeof import('resource://gre/modules/LoginCSVImport.sys.mjs'); 'resource://gre/modules/LoginExport.sys.mjs': typeof import('resource://gre/modules/LoginExport.sys.mjs'); 'resource://gre/modules/LoginHelper.sys.mjs': typeof import('resource://gre/modules/LoginHelper.sys.mjs'); 'resource://gre/modules/LoginManager.shared.sys.mjs': typeof import('resource://gre/modules/LoginManager.shared.sys.mjs'); + 'resource://gre/modules/LoginManager.sys.mjs': typeof import('resource://gre/modules/LoginManager.sys.mjs'); 'resource://gre/modules/LoginManagerChild.sys.mjs': typeof import('resource://gre/modules/LoginManagerChild.sys.mjs'); 'resource://gre/modules/LoginManagerContextMenu.sys.mjs': typeof import('resource://gre/modules/LoginManagerContextMenu.sys.mjs'); 'resource://gre/modules/LoginManagerParent.sys.mjs': typeof import('resource://gre/modules/LoginManagerParent.sys.mjs'); + 'resource://gre/modules/LoginManagerPrompter.sys.mjs': typeof import('resource://gre/modules/LoginManagerPrompter.sys.mjs'); 'resource://gre/modules/LoginRecipes.sys.mjs': typeof import('resource://gre/modules/LoginRecipes.sys.mjs'); + 'resource://gre/modules/LoginRelatedRealms.sys.mjs': typeof import('resource://gre/modules/LoginRelatedRealms.sys.mjs'); 'resource://gre/modules/LoginStore.sys.mjs': typeof import('resource://gre/modules/LoginStore.sys.mjs'); + 'resource://gre/modules/Manifest.sys.mjs': typeof import('resource://gre/modules/Manifest.sys.mjs'); 'resource://gre/modules/ManifestFinder.sys.mjs': typeof import('resource://gre/modules/ManifestFinder.sys.mjs'); 'resource://gre/modules/ManifestIcons.sys.mjs': typeof import('resource://gre/modules/ManifestIcons.sys.mjs'); 'resource://gre/modules/ManifestObtainer.sys.mjs': typeof import('resource://gre/modules/ManifestObtainer.sys.mjs'); + 'resource://gre/modules/ManifestProcessor.sys.mjs': typeof import('resource://gre/modules/ManifestProcessor.sys.mjs'); 'resource://gre/modules/MatchURLFilters.sys.mjs': typeof import('resource://gre/modules/MatchURLFilters.sys.mjs'); 'resource://gre/modules/MediaUtils.sys.mjs': typeof import('resource://gre/modules/MediaUtils.sys.mjs'); 'resource://gre/modules/MessageManagerProxy.sys.mjs': typeof import('resource://gre/modules/MessageManagerProxy.sys.mjs'); @@ -644,6 +812,7 @@ export interface Modules { 'resource://gre/modules/OsEnvironment.sys.mjs': typeof import('resource://gre/modules/OsEnvironment.sys.mjs'); 'resource://gre/modules/PageThumbUtils.sys.mjs': typeof import('resource://gre/modules/PageThumbUtils.sys.mjs'); 'resource://gre/modules/PageThumbs.sys.mjs': typeof import('resource://gre/modules/PageThumbs.sys.mjs'); + 'resource://gre/modules/PasswordRulesManager.sys.mjs': typeof import('resource://gre/modules/PasswordRulesManager.sys.mjs'); 'resource://gre/modules/PermissionsUtils.sys.mjs': typeof import('resource://gre/modules/PermissionsUtils.sys.mjs'); 'resource://gre/modules/PictureInPicture.sys.mjs': typeof import('resource://gre/modules/PictureInPicture.sys.mjs'); 'resource://gre/modules/PictureInPictureControls.sys.mjs': typeof import('resource://gre/modules/PictureInPictureControls.sys.mjs'); @@ -656,8 +825,10 @@ export interface Modules { 'resource://gre/modules/PlacesSyncUtils.sys.mjs': typeof import('resource://gre/modules/PlacesSyncUtils.sys.mjs'); 'resource://gre/modules/PlacesTransactions.sys.mjs': typeof import('resource://gre/modules/PlacesTransactions.sys.mjs'); 'resource://gre/modules/PlacesUtils.sys.mjs': typeof import('resource://gre/modules/PlacesUtils.sys.mjs'); + 'resource://gre/modules/PopupNotifications.sys.mjs': typeof import('resource://gre/modules/PopupNotifications.sys.mjs'); 'resource://gre/modules/Preferences.sys.mjs': typeof import('resource://gre/modules/Preferences.sys.mjs'); 'resource://gre/modules/PrincipalsCollector.sys.mjs': typeof import('resource://gre/modules/PrincipalsCollector.sys.mjs'); + 'resource://gre/modules/PrivateAttributionService.sys.mjs': typeof import('resource://gre/modules/PrivateAttributionService.sys.mjs'); 'resource://gre/modules/PrivateBrowsingUtils.sys.mjs': typeof import('resource://gre/modules/PrivateBrowsingUtils.sys.mjs'); 'resource://gre/modules/ProcessType.sys.mjs': typeof import('resource://gre/modules/ProcessType.sys.mjs'); 'resource://gre/modules/ProfileAge.sys.mjs': typeof import('resource://gre/modules/ProfileAge.sys.mjs'); @@ -667,8 +838,10 @@ export interface Modules { 'resource://gre/modules/ProxyChannelFilter.sys.mjs': typeof import('resource://gre/modules/ProxyChannelFilter.sys.mjs'); 'resource://gre/modules/PushBroadcastService.sys.mjs': typeof import('resource://gre/modules/PushBroadcastService.sys.mjs'); 'resource://gre/modules/PushCrypto.sys.mjs': typeof import('resource://gre/modules/PushCrypto.sys.mjs'); + 'resource://gre/modules/PushRecord.sys.mjs': typeof import('resource://gre/modules/PushRecord.sys.mjs'); 'resource://gre/modules/PushService.sys.mjs': typeof import('resource://gre/modules/PushService.sys.mjs'); 'resource://gre/modules/PushServiceWebSocket.sys.mjs': typeof import('resource://gre/modules/PushServiceWebSocket.sys.mjs'); + 'resource://gre/modules/RFPHelper.sys.mjs': typeof import('resource://gre/modules/RFPHelper.sys.mjs'); 'resource://gre/modules/Readerable.sys.mjs': typeof import('resource://gre/modules/Readerable.sys.mjs'); 'resource://gre/modules/Region.sys.mjs': typeof import('resource://gre/modules/Region.sys.mjs'); 'resource://gre/modules/RemotePageAccessManager.sys.mjs': typeof import('resource://gre/modules/RemotePageAccessManager.sys.mjs'); @@ -677,6 +850,7 @@ export interface Modules { 'resource://gre/modules/ResetProfile.sys.mjs': typeof import('resource://gre/modules/ResetProfile.sys.mjs'); 'resource://gre/modules/RustSharedRemoteSettingsService.sys.mjs': typeof import('resource://gre/modules/RustSharedRemoteSettingsService.sys.mjs'); 'resource://gre/modules/SafeBrowsing.sys.mjs': typeof import('resource://gre/modules/SafeBrowsing.sys.mjs'); + 'resource://gre/modules/SandboxUtils.sys.mjs': typeof import('resource://gre/modules/SandboxUtils.sys.mjs'); 'resource://gre/modules/Schemas.sys.mjs': typeof import('resource://gre/modules/Schemas.sys.mjs'); 'resource://gre/modules/SearchService.sys.mjs': typeof import('resource://gre/modules/SearchService.sys.mjs'); 'resource://gre/modules/SecurityInfo.sys.mjs': typeof import('resource://gre/modules/SecurityInfo.sys.mjs'); @@ -693,6 +867,8 @@ export interface Modules { 'resource://gre/modules/TaskSchedulerWinImpl.sys.mjs': typeof import('resource://gre/modules/TaskSchedulerWinImpl.sys.mjs'); 'resource://gre/modules/TelemetryArchive.sys.mjs': typeof import('resource://gre/modules/TelemetryArchive.sys.mjs'); 'resource://gre/modules/TelemetryController.sys.mjs': typeof import('resource://gre/modules/TelemetryController.sys.mjs'); + 'resource://gre/modules/TelemetryControllerContent.sys.mjs': typeof import('resource://gre/modules/TelemetryControllerContent.sys.mjs'); + 'resource://gre/modules/TelemetryControllerParent.sys.mjs': typeof import('resource://gre/modules/TelemetryControllerParent.sys.mjs'); 'resource://gre/modules/TelemetryEnvironment.sys.mjs': typeof import('resource://gre/modules/TelemetryEnvironment.sys.mjs'); 'resource://gre/modules/TelemetryReportingPolicy.sys.mjs': typeof import('resource://gre/modules/TelemetryReportingPolicy.sys.mjs'); 'resource://gre/modules/TelemetryScheduler.sys.mjs': typeof import('resource://gre/modules/TelemetryScheduler.sys.mjs'); @@ -702,14 +878,18 @@ export interface Modules { 'resource://gre/modules/TelemetryTimestamps.sys.mjs': typeof import('resource://gre/modules/TelemetryTimestamps.sys.mjs'); 'resource://gre/modules/TelemetryUtils.sys.mjs': typeof import('resource://gre/modules/TelemetryUtils.sys.mjs'); 'resource://gre/modules/Timer.sys.mjs': typeof import('resource://gre/modules/Timer.sys.mjs'); + 'resource://gre/modules/Troubleshoot.sys.mjs': typeof import('resource://gre/modules/Troubleshoot.sys.mjs'); 'resource://gre/modules/UninstallPing.sys.mjs': typeof import('resource://gre/modules/UninstallPing.sys.mjs'); 'resource://gre/modules/UntrustedModulesPing.sys.mjs': typeof import('resource://gre/modules/UntrustedModulesPing.sys.mjs'); 'resource://gre/modules/UpdateListener.sys.mjs': typeof import('resource://gre/modules/UpdateListener.sys.mjs'); 'resource://gre/modules/UpdateLog.sys.mjs': typeof import('resource://gre/modules/UpdateLog.sys.mjs'); 'resource://gre/modules/UpdatePing.sys.mjs': typeof import('resource://gre/modules/UpdatePing.sys.mjs'); 'resource://gre/modules/UpdateService.sys.mjs': typeof import('resource://gre/modules/UpdateService.sys.mjs'); + 'resource://gre/modules/UpdateTimerManager.sys.mjs': typeof import('resource://gre/modules/UpdateTimerManager.sys.mjs'); 'resource://gre/modules/UpdateUtils.sys.mjs': typeof import('resource://gre/modules/UpdateUtils.sys.mjs'); + 'resource://gre/modules/UrlClassifierRemoteSettingsService.sys.mjs': typeof import('resource://gre/modules/UrlClassifierRemoteSettingsService.sys.mjs'); 'resource://gre/modules/UsageReporting.sys.mjs': typeof import('resource://gre/modules/UsageReporting.sys.mjs'); + 'resource://gre/modules/WPTEventsParent.sys.mjs': typeof import('resource://gre/modules/WPTEventsParent.sys.mjs'); 'resource://gre/modules/WebAuthnFeature.sys.mjs': typeof import('resource://gre/modules/WebAuthnFeature.sys.mjs'); 'resource://gre/modules/WebChannel.sys.mjs': typeof import('resource://gre/modules/WebChannel.sys.mjs'); 'resource://gre/modules/WebNavigation.sys.mjs': typeof import('resource://gre/modules/WebNavigation.sys.mjs'); @@ -718,14 +898,22 @@ export interface Modules { 'resource://gre/modules/WebRequestUpload.sys.mjs': typeof import('resource://gre/modules/WebRequestUpload.sys.mjs'); 'resource://gre/modules/WindowsLaunchOnLogin.sys.mjs': typeof import('resource://gre/modules/WindowsLaunchOnLogin.sys.mjs'); 'resource://gre/modules/WindowsRegistry.sys.mjs': typeof import('resource://gre/modules/WindowsRegistry.sys.mjs'); + 'resource://gre/modules/XPCOMUtils.sys.mjs': typeof import('resource://gre/modules/XPCOMUtils.sys.mjs'); 'resource://gre/modules/addons/AddonRepository.sys.mjs': typeof import('resource://gre/modules/addons/AddonRepository.sys.mjs'); 'resource://gre/modules/addons/AddonSettings.sys.mjs': typeof import('resource://gre/modules/addons/AddonSettings.sys.mjs'); + 'resource://gre/modules/addons/AddonUpdateChecker.sys.mjs': typeof import('resource://gre/modules/addons/AddonUpdateChecker.sys.mjs'); + 'resource://gre/modules/addons/GMPProvider.sys.mjs': typeof import('resource://gre/modules/addons/GMPProvider.sys.mjs'); + 'resource://gre/modules/addons/ModelHubProvider.sys.mjs': typeof import('resource://gre/modules/addons/ModelHubProvider.sys.mjs'); 'resource://gre/modules/addons/ProductAddonChecker.sys.mjs': typeof import('resource://gre/modules/addons/ProductAddonChecker.sys.mjs'); + 'resource://gre/modules/addons/SitePermsAddonProvider.sys.mjs': typeof import('resource://gre/modules/addons/SitePermsAddonProvider.sys.mjs'); 'resource://gre/modules/addons/XPIDatabase.sys.mjs': typeof import('resource://gre/modules/addons/XPIDatabase.sys.mjs'); + 'resource://gre/modules/addons/XPIExports.sys.mjs': typeof import('resource://gre/modules/addons/XPIExports.sys.mjs'); 'resource://gre/modules/addons/XPIInstall.sys.mjs': typeof import('resource://gre/modules/addons/XPIInstall.sys.mjs'); 'resource://gre/modules/addons/XPIProvider.sys.mjs': typeof import('resource://gre/modules/addons/XPIProvider.sys.mjs'); 'resource://gre/modules/addons/crypto-utils.sys.mjs': typeof import('resource://gre/modules/addons/crypto-utils.sys.mjs'); 'resource://gre/modules/addons/siteperms-addon-utils.sys.mjs': typeof import('resource://gre/modules/addons/siteperms-addon-utils.sys.mjs'); + 'resource://gre/modules/backgroundtasks/BackgroundTask_backgroundupdate.sys.mjs': typeof import('resource://gre/modules/backgroundtasks/BackgroundTask_backgroundupdate.sys.mjs'); + 'resource://gre/modules/backgroundtasks/BackgroundTask_defaultagent.sys.mjs': typeof import('resource://gre/modules/backgroundtasks/BackgroundTask_defaultagent.sys.mjs'); 'resource://gre/modules/components-utils/ClientEnvironment.sys.mjs': typeof import('resource://gre/modules/components-utils/ClientEnvironment.sys.mjs'); 'resource://gre/modules/components-utils/FilterExpressions.sys.mjs': typeof import('resource://gre/modules/components-utils/FilterExpressions.sys.mjs'); 'resource://gre/modules/components-utils/JsonSchemaValidator.sys.mjs': typeof import('resource://gre/modules/components-utils/JsonSchemaValidator.sys.mjs'); @@ -740,11 +928,18 @@ export interface Modules { 'resource://gre/modules/kvstore.sys.mjs': typeof import('resource://gre/modules/kvstore.sys.mjs'); 'resource://gre/modules/media/IdpSandbox.sys.mjs': typeof import('resource://gre/modules/media/IdpSandbox.sys.mjs'); 'resource://gre/modules/media/PeerConnectionIdp.sys.mjs': typeof import('resource://gre/modules/media/PeerConnectionIdp.sys.mjs'); + 'resource://gre/modules/megalist/MegalistViewModel.sys.mjs': typeof import('resource://gre/modules/megalist/MegalistViewModel.sys.mjs'); + 'resource://gre/modules/megalist/aggregator/Aggregator.sys.mjs': typeof import('resource://gre/modules/megalist/aggregator/Aggregator.sys.mjs'); + 'resource://gre/modules/megalist/aggregator/datasources/DataSourceBase.sys.mjs': typeof import('resource://gre/modules/megalist/aggregator/datasources/DataSourceBase.sys.mjs'); + 'resource://gre/modules/megalist/aggregator/datasources/LoginDataSource.sys.mjs': typeof import('resource://gre/modules/megalist/aggregator/datasources/LoginDataSource.sys.mjs'); 'resource://gre/modules/narrate/NarrateControls.sys.mjs': typeof import('resource://gre/modules/narrate/NarrateControls.sys.mjs'); 'resource://gre/modules/policies/WindowsGPOParser.sys.mjs': typeof import('resource://gre/modules/policies/WindowsGPOParser.sys.mjs'); 'resource://gre/modules/policies/macOSPoliciesParser.sys.mjs': typeof import('resource://gre/modules/policies/macOSPoliciesParser.sys.mjs'); 'resource://gre/modules/psm/RemoteSecuritySettings.sys.mjs': typeof import('resource://gre/modules/psm/RemoteSecuritySettings.sys.mjs'); + 'resource://gre/modules/psm/X509.sys.mjs': typeof import('resource://gre/modules/psm/X509.sys.mjs'); + 'resource://gre/modules/psm/pippki.sys.mjs': typeof import('resource://gre/modules/psm/pippki.sys.mjs'); 'resource://gre/modules/reflect.sys.mjs': typeof import('resource://gre/modules/reflect.sys.mjs'); + 'resource://gre/modules/services-automation/ServicesAutomation.sys.mjs': typeof import('resource://gre/modules/services-automation/ServicesAutomation.sys.mjs'); 'resource://gre/modules/sessionstore/PrivacyFilter.sys.mjs': typeof import('resource://gre/modules/sessionstore/PrivacyFilter.sys.mjs'); 'resource://gre/modules/sessionstore/PrivacyLevel.sys.mjs': typeof import('resource://gre/modules/sessionstore/PrivacyLevel.sys.mjs'); 'resource://gre/modules/sessionstore/SessionHistory.sys.mjs': typeof import('resource://gre/modules/sessionstore/SessionHistory.sys.mjs'); @@ -773,11 +968,16 @@ export interface Modules { 'resource://gre/modules/shared/PhoneNumberNormalizer.sys.mjs': typeof import('resource://gre/modules/shared/PhoneNumberNormalizer.sys.mjs'); 'resource://gre/modules/subprocess/subprocess_unix.sys.mjs': typeof import('resource://gre/modules/subprocess/subprocess_unix.sys.mjs'); 'resource://gre/modules/subprocess/subprocess_win.sys.mjs': typeof import('resource://gre/modules/subprocess/subprocess_win.sys.mjs'); + 'resource://gre/modules/third_party/jsesc/jsesc.mjs': typeof import('resource://gre/modules/third_party/jsesc/jsesc.mjs'); 'resource://gre/modules/translations/LanguageDetector.sys.mjs': typeof import('resource://gre/modules/translations/LanguageDetector.sys.mjs'); + 'resource://gre/modules/vtt.sys.mjs': typeof import('resource://gre/modules/vtt.sys.mjs'); 'resource://gre/modules/workers/PromiseWorker.mjs': typeof import('resource://gre/modules/workers/PromiseWorker.mjs'); + 'resource://httpd-server/httpd.sys.mjs': typeof import('resource://httpd-server/httpd.sys.mjs'); + 'resource://messaging-system/lib/Logger.sys.mjs': typeof import('resource://messaging-system/lib/Logger.sys.mjs'); 'resource://messaging-system/lib/SpecialMessageActions.sys.mjs': typeof import('resource://messaging-system/lib/SpecialMessageActions.sys.mjs'); 'resource://messaging-system/targeting/Targeting.sys.mjs': typeof import('resource://messaging-system/targeting/Targeting.sys.mjs'); 'resource://mozscreenshots/Screenshot.sys.mjs': typeof import('resource://mozscreenshots/Screenshot.sys.mjs'); + 'resource://mozscreenshots/TestRunner.sys.mjs': typeof import('resource://mozscreenshots/TestRunner.sys.mjs'); 'resource://newtab/common/Actions.mjs': typeof import('resource://newtab/common/Actions.mjs'); 'resource://newtab/common/Reducers.sys.mjs': typeof import('resource://newtab/common/Reducers.sys.mjs'); 'resource://newtab/lib/AboutPreferences.sys.mjs': typeof import('resource://newtab/lib/AboutPreferences.sys.mjs'); @@ -791,6 +991,7 @@ export interface Modules { 'resource://newtab/lib/FaviconFeed.sys.mjs': typeof import('resource://newtab/lib/FaviconFeed.sys.mjs'); 'resource://newtab/lib/HighlightsFeed.sys.mjs': typeof import('resource://newtab/lib/HighlightsFeed.sys.mjs'); 'resource://newtab/lib/InferredModel/FeatureModel.sys.mjs': typeof import('resource://newtab/lib/InferredModel/FeatureModel.sys.mjs'); + 'resource://newtab/lib/InferredModel/GreedyContentRanker.mjs': typeof import('resource://newtab/lib/InferredModel/GreedyContentRanker.mjs'); 'resource://newtab/lib/InferredPersonalizationFeed.sys.mjs': typeof import('resource://newtab/lib/InferredPersonalizationFeed.sys.mjs'); 'resource://newtab/lib/NewTabContentPing.sys.mjs': typeof import('resource://newtab/lib/NewTabContentPing.sys.mjs'); 'resource://newtab/lib/NewTabGleanUtils.sys.mjs': typeof import('resource://newtab/lib/NewTabGleanUtils.sys.mjs'); @@ -804,6 +1005,9 @@ export interface Modules { 'resource://newtab/lib/Screenshots.sys.mjs': typeof import('resource://newtab/lib/Screenshots.sys.mjs'); 'resource://newtab/lib/SectionsManager.sys.mjs': typeof import('resource://newtab/lib/SectionsManager.sys.mjs'); 'resource://newtab/lib/SmartShortcutsFeed.sys.mjs': typeof import('resource://newtab/lib/SmartShortcutsFeed.sys.mjs'); + 'resource://newtab/lib/SmartShortcutsRanker/RankShortcuts.mjs': typeof import('resource://newtab/lib/SmartShortcutsRanker/RankShortcuts.mjs'); + 'resource://newtab/lib/SmartShortcutsRanker/RankShortcutsWorkerClass.mjs': typeof import('resource://newtab/lib/SmartShortcutsRanker/RankShortcutsWorkerClass.mjs'); + 'resource://newtab/lib/SmartShortcutsRanker/ThomSample.mjs': typeof import('resource://newtab/lib/SmartShortcutsRanker/ThomSample.mjs'); 'resource://newtab/lib/StartupCacheInit.sys.mjs': typeof import('resource://newtab/lib/StartupCacheInit.sys.mjs'); 'resource://newtab/lib/Store.sys.mjs': typeof import('resource://newtab/lib/Store.sys.mjs'); 'resource://newtab/lib/SystemTickFeed.sys.mjs': typeof import('resource://newtab/lib/SystemTickFeed.sys.mjs'); @@ -812,7 +1016,7 @@ export interface Modules { 'resource://newtab/lib/TopStoriesFeed.sys.mjs': typeof import('resource://newtab/lib/TopStoriesFeed.sys.mjs'); 'resource://newtab/lib/TrendingSearchFeed.sys.mjs': typeof import('resource://newtab/lib/TrendingSearchFeed.sys.mjs'); 'resource://newtab/lib/UTEventReporting.sys.mjs': typeof import('resource://newtab/lib/UTEventReporting.sys.mjs'); - 'resource://newtab/lib/WallpaperFeed.sys.mjs': typeof import('resource://newtab/lib/WallpaperFeed.sys.mjs'); + 'resource://newtab/lib/Wallpapers/WallpaperFeed.sys.mjs': typeof import('resource://newtab/lib/Wallpapers/WallpaperFeed.sys.mjs'); 'resource://newtab/lib/WeatherFeed.sys.mjs': typeof import('resource://newtab/lib/WeatherFeed.sys.mjs'); 'resource://newtab/lib/Widgets/ListsFeed.sys.mjs': typeof import('resource://newtab/lib/Widgets/ListsFeed.sys.mjs'); 'resource://newtab/lib/Widgets/TimerFeed.sys.mjs': typeof import('resource://newtab/lib/Widgets/TimerFeed.sys.mjs'); @@ -824,6 +1028,7 @@ export interface Modules { 'resource://nimbus/lib/ExperimentStore.sys.mjs': typeof import('resource://nimbus/lib/ExperimentStore.sys.mjs'); 'resource://nimbus/lib/Migrations.sys.mjs': typeof import('resource://nimbus/lib/Migrations.sys.mjs'); 'resource://nimbus/lib/RemoteSettingsExperimentLoader.sys.mjs': typeof import('resource://nimbus/lib/RemoteSettingsExperimentLoader.sys.mjs'); + 'resource://nimbus/lib/SharedDataMap.sys.mjs': typeof import('resource://nimbus/lib/SharedDataMap.sys.mjs'); 'resource://nimbus/lib/TargetingContextRecorder.sys.mjs': typeof import('resource://nimbus/lib/TargetingContextRecorder.sys.mjs'); 'resource://nimbus/lib/Telemetry.sys.mjs': typeof import('resource://nimbus/lib/Telemetry.sys.mjs'); 'resource://normandy-content/AboutPages.sys.mjs': typeof import('resource://normandy-content/AboutPages.sys.mjs'); @@ -832,6 +1037,7 @@ export interface Modules { 'resource://normandy/actions/AddonRollbackAction.sys.mjs': typeof import('resource://normandy/actions/AddonRollbackAction.sys.mjs'); 'resource://normandy/actions/AddonRolloutAction.sys.mjs': typeof import('resource://normandy/actions/AddonRolloutAction.sys.mjs'); 'resource://normandy/actions/BaseAction.sys.mjs': typeof import('resource://normandy/actions/BaseAction.sys.mjs'); + 'resource://normandy/actions/BaseStudyAction.sys.mjs': typeof import('resource://normandy/actions/BaseStudyAction.sys.mjs'); 'resource://normandy/actions/BranchedAddonStudyAction.sys.mjs': typeof import('resource://normandy/actions/BranchedAddonStudyAction.sys.mjs'); 'resource://normandy/actions/ConsoleLogAction.sys.mjs': typeof import('resource://normandy/actions/ConsoleLogAction.sys.mjs'); 'resource://normandy/actions/PreferenceExperimentAction.sys.mjs': typeof import('resource://normandy/actions/PreferenceExperimentAction.sys.mjs'); @@ -844,6 +1050,7 @@ export interface Modules { 'resource://normandy/lib/AddonStudies.sys.mjs': typeof import('resource://normandy/lib/AddonStudies.sys.mjs'); 'resource://normandy/lib/CleanupManager.sys.mjs': typeof import('resource://normandy/lib/CleanupManager.sys.mjs'); 'resource://normandy/lib/ClientEnvironment.sys.mjs': typeof import('resource://normandy/lib/ClientEnvironment.sys.mjs'); + 'resource://normandy/lib/EventEmitter.sys.mjs': typeof import('resource://normandy/lib/EventEmitter.sys.mjs'); 'resource://normandy/lib/Heartbeat.sys.mjs': typeof import('resource://normandy/lib/Heartbeat.sys.mjs'); 'resource://normandy/lib/LegacyHeartbeat.sys.mjs': typeof import('resource://normandy/lib/LegacyHeartbeat.sys.mjs'); 'resource://normandy/lib/LogManager.sys.mjs': typeof import('resource://normandy/lib/LogManager.sys.mjs'); @@ -863,15 +1070,20 @@ export interface Modules { 'resource://pdf.js/PdfJsTelemetry.sys.mjs': typeof import('resource://pdf.js/PdfJsTelemetry.sys.mjs'); 'resource://pdf.js/PdfSandbox.sys.mjs': typeof import('resource://pdf.js/PdfSandbox.sys.mjs'); 'resource://pdf.js/PdfStreamConverter.sys.mjs': typeof import('resource://pdf.js/PdfStreamConverter.sys.mjs'); + 'resource://reftest/AsyncSpellCheckTestHelper.sys.mjs': typeof import('resource://reftest/AsyncSpellCheckTestHelper.sys.mjs'); + 'resource://reftest/PerTestCoverageUtils.sys.mjs': typeof import('resource://reftest/PerTestCoverageUtils.sys.mjs'); + 'resource://reftest/reftest.sys.mjs': typeof import('resource://reftest/reftest.sys.mjs'); 'resource://services-common/async.sys.mjs': typeof import('resource://services-common/async.sys.mjs'); + 'resource://services-common/hawkclient.sys.mjs': typeof import('resource://services-common/hawkclient.sys.mjs'); + 'resource://services-common/hawkrequest.sys.mjs': typeof import('resource://services-common/hawkrequest.sys.mjs'); 'resource://services-common/kinto-http-client.sys.mjs': typeof import('resource://services-common/kinto-http-client.sys.mjs'); 'resource://services-common/kinto-offline-client.sys.mjs': typeof import('resource://services-common/kinto-offline-client.sys.mjs'); 'resource://services-common/kinto-storage-adapter.sys.mjs': typeof import('resource://services-common/kinto-storage-adapter.sys.mjs'); 'resource://services-common/observers.sys.mjs': typeof import('resource://services-common/observers.sys.mjs'); + 'resource://services-common/rest.sys.mjs': typeof import('resource://services-common/rest.sys.mjs'); + 'resource://services-common/tokenserverclient.sys.mjs': typeof import('resource://services-common/tokenserverclient.sys.mjs'); 'resource://services-common/uptake-telemetry.sys.mjs': typeof import('resource://services-common/uptake-telemetry.sys.mjs'); 'resource://services-common/utils.sys.mjs': typeof import('resource://services-common/utils.sys.mjs'); - 'resource://services-crypto/jwcrypto.sys.mjs': typeof import('resource://services-crypto/jwcrypto.sys.mjs'); - 'resource://services-crypto/utils.sys.mjs': typeof import('resource://services-crypto/utils.sys.mjs'); 'resource://services-settings/Attachments.sys.mjs': typeof import('resource://services-settings/Attachments.sys.mjs'); 'resource://services-settings/Database.sys.mjs': typeof import('resource://services-settings/Database.sys.mjs'); 'resource://services-settings/IDBHelpers.sys.mjs': typeof import('resource://services-settings/IDBHelpers.sys.mjs'); @@ -881,58 +1093,127 @@ export interface Modules { 'resource://services-settings/SyncHistory.sys.mjs': typeof import('resource://services-settings/SyncHistory.sys.mjs'); 'resource://services-settings/Utils.sys.mjs': typeof import('resource://services-settings/Utils.sys.mjs'); 'resource://services-settings/remote-settings.sys.mjs': typeof import('resource://services-settings/remote-settings.sys.mjs'); + 'resource://services-sync/SyncDisconnect.sys.mjs': typeof import('resource://services-sync/SyncDisconnect.sys.mjs'); 'resource://services-sync/SyncedTabs.sys.mjs': typeof import('resource://services-sync/SyncedTabs.sys.mjs'); 'resource://services-sync/TabsStore.sys.mjs': typeof import('resource://services-sync/TabsStore.sys.mjs'); 'resource://services-sync/UIState.sys.mjs': typeof import('resource://services-sync/UIState.sys.mjs'); + 'resource://services-sync/addonsreconciler.sys.mjs': typeof import('resource://services-sync/addonsreconciler.sys.mjs'); + 'resource://services-sync/addonutils.sys.mjs': typeof import('resource://services-sync/addonutils.sys.mjs'); + 'resource://services-sync/bridged_engine.sys.mjs': typeof import('resource://services-sync/bridged_engine.sys.mjs'); 'resource://services-sync/constants.sys.mjs': typeof import('resource://services-sync/constants.sys.mjs'); 'resource://services-sync/doctor.sys.mjs': typeof import('resource://services-sync/doctor.sys.mjs'); + 'resource://services-sync/engines.sys.mjs': typeof import('resource://services-sync/engines.sys.mjs'); 'resource://services-sync/engines/addons.sys.mjs': typeof import('resource://services-sync/engines/addons.sys.mjs'); + 'resource://services-sync/engines/bookmarks.sys.mjs': typeof import('resource://services-sync/engines/bookmarks.sys.mjs'); + 'resource://services-sync/engines/clients.sys.mjs': typeof import('resource://services-sync/engines/clients.sys.mjs'); + 'resource://services-sync/engines/extension-storage.sys.mjs': typeof import('resource://services-sync/engines/extension-storage.sys.mjs'); 'resource://services-sync/engines/forms.sys.mjs': typeof import('resource://services-sync/engines/forms.sys.mjs'); + 'resource://services-sync/engines/history.sys.mjs': typeof import('resource://services-sync/engines/history.sys.mjs'); 'resource://services-sync/engines/passwords.sys.mjs': typeof import('resource://services-sync/engines/passwords.sys.mjs'); + 'resource://services-sync/engines/prefs.sys.mjs': typeof import('resource://services-sync/engines/prefs.sys.mjs'); + 'resource://services-sync/engines/tabs.sys.mjs': typeof import('resource://services-sync/engines/tabs.sys.mjs'); 'resource://services-sync/keys.sys.mjs': typeof import('resource://services-sync/keys.sys.mjs'); 'resource://services-sync/main.sys.mjs': typeof import('resource://services-sync/main.sys.mjs'); + 'resource://services-sync/policies.sys.mjs': typeof import('resource://services-sync/policies.sys.mjs'); 'resource://services-sync/record.sys.mjs': typeof import('resource://services-sync/record.sys.mjs'); 'resource://services-sync/resource.sys.mjs': typeof import('resource://services-sync/resource.sys.mjs'); 'resource://services-sync/service.sys.mjs': typeof import('resource://services-sync/service.sys.mjs'); + 'resource://services-sync/stages/declined.sys.mjs': typeof import('resource://services-sync/stages/declined.sys.mjs'); + 'resource://services-sync/stages/enginesync.sys.mjs': typeof import('resource://services-sync/stages/enginesync.sys.mjs'); 'resource://services-sync/status.sys.mjs': typeof import('resource://services-sync/status.sys.mjs'); 'resource://services-sync/sync_auth.sys.mjs': typeof import('resource://services-sync/sync_auth.sys.mjs'); 'resource://services-sync/telemetry.sys.mjs': typeof import('resource://services-sync/telemetry.sys.mjs'); 'resource://services-sync/util.sys.mjs': typeof import('resource://services-sync/util.sys.mjs'); + 'resource://specialpowers/AppTestDelegate.sys.mjs': typeof import('resource://specialpowers/AppTestDelegate.sys.mjs'); 'resource://talos-powers/TalosParentProfiler.sys.mjs': typeof import('resource://talos-powers/TalosParentProfiler.sys.mjs'); + 'resource://test/AllowJavascriptParent.sys.mjs': typeof import('resource://test/AllowJavascriptParent.sys.mjs'); + 'resource://test/Census.sys.mjs': typeof import('resource://test/Census.sys.mjs'); + 'resource://test/CrashTestUtils.sys.mjs': typeof import('resource://test/CrashTestUtils.sys.mjs'); + 'resource://test/GlobalObjectsModule.sys.mjs': typeof import('resource://test/GlobalObjectsModule.sys.mjs'); + 'resource://test/Match.sys.mjs': typeof import('resource://test/Match.sys.mjs'); + 'resource://test/TestRunner.sys.mjs': typeof import('resource://test/TestRunner.sys.mjs'); + 'resource://test/broadcast_handler.sys.mjs': typeof import('resource://test/broadcast_handler.sys.mjs'); + 'resource://test/contextual.sys.mjs': typeof import('resource://test/contextual.sys.mjs'); + 'resource://test/es6module.js': typeof import('resource://test/es6module.js'); + 'resource://test/es6module_absolute.js': typeof import('resource://test/es6module_absolute.js'); + 'resource://test/es6module_absolute2.js': typeof import('resource://test/es6module_absolute2.js'); + 'resource://test/es6module_cycle_a.js': typeof import('resource://test/es6module_cycle_a.js'); + 'resource://test/es6module_cycle_b.js': typeof import('resource://test/es6module_cycle_b.js'); + 'resource://test/es6module_cycle_c.js': typeof import('resource://test/es6module_cycle_c.js'); 'resource://test/es6module_devtoolsLoader.js': typeof import('resource://test/es6module_devtoolsLoader.js'); + 'resource://test/es6module_devtoolsLoader_only.js': typeof import('resource://test/es6module_devtoolsLoader_only.js'); + 'resource://test/es6module_dynamic_import_runtime_error.js': typeof import('resource://test/es6module_dynamic_import_runtime_error.js'); + 'resource://test/es6module_dynamic_import_syntax_error.js': typeof import('resource://test/es6module_dynamic_import_syntax_error.js'); + 'resource://test/es6module_import_error.js': typeof import('resource://test/es6module_import_error.js'); + 'resource://test/es6module_parse_error.js': typeof import('resource://test/es6module_parse_error.js'); + 'resource://test/es6module_parse_error_in_import.js': typeof import('resource://test/es6module_parse_error_in_import.js'); + 'resource://test/es6module_throws.js': typeof import('resource://test/es6module_throws.js'); + 'resource://test/es6module_top_level_await.js': typeof import('resource://test/es6module_top_level_await.js'); 'resource://test/esm_lazy-1.sys.mjs': typeof import('resource://test/esm_lazy-1.sys.mjs'); 'resource://test/esm_lazy-2.sys.mjs': typeof import('resource://test/esm_lazy-2.sys.mjs'); 'resource://test/esmified-1.sys.mjs': typeof import('resource://test/esmified-1.sys.mjs'); + 'resource://test/esmified-3.sys.mjs': typeof import('resource://test/esmified-3.sys.mjs'); + 'resource://test/esmified-4.sys.mjs': typeof import('resource://test/esmified-4.sys.mjs'); + 'resource://test/import_non_shared_1.mjs': typeof import('resource://test/import_non_shared_1.mjs'); + 'resource://test/non_shared_1.mjs': typeof import('resource://test/non_shared_1.mjs'); + 'resource://test/non_shared_nest_import_non_shared_1.mjs': typeof import('resource://test/non_shared_nest_import_non_shared_1.mjs'); + 'resource://test/non_shared_nest_import_non_shared_2.mjs': typeof import('resource://test/non_shared_nest_import_non_shared_2.mjs'); + 'resource://test/non_shared_nest_import_non_shared_3.mjs': typeof import('resource://test/non_shared_nest_import_non_shared_3.mjs'); + 'resource://test/non_shared_nest_import_non_shared_target_1.mjs': typeof import('resource://test/non_shared_nest_import_non_shared_target_1.mjs'); + 'resource://test/non_shared_nest_import_non_shared_target_2.mjs': typeof import('resource://test/non_shared_nest_import_non_shared_target_2.mjs'); + 'resource://test/non_shared_nest_import_non_shared_target_3.mjs': typeof import('resource://test/non_shared_nest_import_non_shared_target_3.mjs'); + 'resource://test/non_shared_nest_import_shared_1.mjs': typeof import('resource://test/non_shared_nest_import_shared_1.mjs'); + 'resource://test/non_shared_nest_import_shared_target_1.sys.mjs': typeof import('resource://test/non_shared_nest_import_shared_target_1.sys.mjs'); + 'resource://test/non_shared_nest_import_shared_target_2.sys.mjs': typeof import('resource://test/non_shared_nest_import_shared_target_2.sys.mjs'); + 'resource://test/not_found.mjs': typeof import('resource://test/not_found.mjs'); 'resource://testing-common/AddonTestUtils.sys.mjs': typeof import('resource://testing-common/AddonTestUtils.sys.mjs'); + 'resource://testing-common/AllJavascriptTypes.mjs': typeof import('resource://testing-common/AllJavascriptTypes.mjs'); 'resource://testing-common/AppData.sys.mjs': typeof import('resource://testing-common/AppData.sys.mjs'); 'resource://testing-common/AppInfo.sys.mjs': typeof import('resource://testing-common/AppInfo.sys.mjs'); 'resource://testing-common/AppUiTestDelegate.sys.mjs': typeof import('resource://testing-common/AppUiTestDelegate.sys.mjs'); 'resource://testing-common/Assert.sys.mjs': typeof import('resource://testing-common/Assert.sys.mjs'); + 'resource://testing-common/AsyncSpellCheckTestHelper.sys.mjs': typeof import('resource://testing-common/AsyncSpellCheckTestHelper.sys.mjs'); + 'resource://testing-common/BackgroundTasksTestUtils.sys.mjs': typeof import('resource://testing-common/BackgroundTasksTestUtils.sys.mjs'); 'resource://testing-common/BrowserTestUtils.sys.mjs': typeof import('resource://testing-common/BrowserTestUtils.sys.mjs'); 'resource://testing-common/ContentTask.sys.mjs': typeof import('resource://testing-common/ContentTask.sys.mjs'); 'resource://testing-common/ContentTaskUtils.sys.mjs': typeof import('resource://testing-common/ContentTaskUtils.sys.mjs'); + 'resource://testing-common/CookieXPCShellUtils.sys.mjs': typeof import('resource://testing-common/CookieXPCShellUtils.sys.mjs'); + 'resource://testing-common/CoverageUtils.sys.mjs': typeof import('resource://testing-common/CoverageUtils.sys.mjs'); + 'resource://testing-common/CrashManagerTest.sys.mjs': typeof import('resource://testing-common/CrashManagerTest.sys.mjs'); 'resource://testing-common/CustomizableUITestUtils.sys.mjs': typeof import('resource://testing-common/CustomizableUITestUtils.sys.mjs'); + 'resource://testing-common/DOMFullscreenTestUtils.sys.mjs': typeof import('resource://testing-common/DOMFullscreenTestUtils.sys.mjs'); 'resource://testing-common/DoHTestUtils.sys.mjs': typeof import('resource://testing-common/DoHTestUtils.sys.mjs'); 'resource://testing-common/EnterprisePolicyTesting.sys.mjs': typeof import('resource://testing-common/EnterprisePolicyTesting.sys.mjs'); 'resource://testing-common/ExtensionTestCommon.sys.mjs': typeof import('resource://testing-common/ExtensionTestCommon.sys.mjs'); 'resource://testing-common/ExtensionXPCShellUtils.sys.mjs': typeof import('resource://testing-common/ExtensionXPCShellUtils.sys.mjs'); 'resource://testing-common/FileTestUtils.sys.mjs': typeof import('resource://testing-common/FileTestUtils.sys.mjs'); + 'resource://testing-common/FirefoxViewTestUtils.sys.mjs': typeof import('resource://testing-common/FirefoxViewTestUtils.sys.mjs'); 'resource://testing-common/FormHistoryTestUtils.sys.mjs': typeof import('resource://testing-common/FormHistoryTestUtils.sys.mjs'); + 'resource://testing-common/HandlerServiceTestUtils.sys.mjs': typeof import('resource://testing-common/HandlerServiceTestUtils.sys.mjs'); + 'resource://testing-common/InflightAssetsMessageProvider.sys.mjs': typeof import('resource://testing-common/InflightAssetsMessageProvider.sys.mjs'); + 'resource://testing-common/JSObjectsTestUtils.sys.mjs': typeof import('resource://testing-common/JSObjectsTestUtils.sys.mjs'); + 'resource://testing-common/LangPackMatcherTestUtils.sys.mjs': typeof import('resource://testing-common/LangPackMatcherTestUtils.sys.mjs'); + 'resource://testing-common/LoginTestUtils.sys.mjs': typeof import('resource://testing-common/LoginTestUtils.sys.mjs'); 'resource://testing-common/MerinoTestUtils.sys.mjs': typeof import('resource://testing-common/MerinoTestUtils.sys.mjs'); 'resource://testing-common/MessageChannel.sys.mjs': typeof import('resource://testing-common/MessageChannel.sys.mjs'); 'resource://testing-common/MockColorPicker.sys.mjs': typeof import('resource://testing-common/MockColorPicker.sys.mjs'); + 'resource://testing-common/MockDocument.sys.mjs': typeof import('resource://testing-common/MockDocument.sys.mjs'); 'resource://testing-common/MockFilePicker.sys.mjs': typeof import('resource://testing-common/MockFilePicker.sys.mjs'); 'resource://testing-common/MockPermissionPrompt.sys.mjs': typeof import('resource://testing-common/MockPermissionPrompt.sys.mjs'); 'resource://testing-common/MockPromptCollection.sys.mjs': typeof import('resource://testing-common/MockPromptCollection.sys.mjs'); 'resource://testing-common/MockRegistrar.sys.mjs': typeof import('resource://testing-common/MockRegistrar.sys.mjs'); 'resource://testing-common/MockRegistry.sys.mjs': typeof import('resource://testing-common/MockRegistry.sys.mjs'); 'resource://testing-common/MockSound.sys.mjs': typeof import('resource://testing-common/MockSound.sys.mjs'); + 'resource://testing-common/NimbusRolloutMessageProvider.sys.mjs': typeof import('resource://testing-common/NimbusRolloutMessageProvider.sys.mjs'); 'resource://testing-common/NimbusTestUtils.sys.mjs': typeof import('resource://testing-common/NimbusTestUtils.sys.mjs'); + 'resource://testing-common/NodeServer.sys.mjs': typeof import('resource://testing-common/NodeServer.sys.mjs'); 'resource://testing-common/NormandyTestUtils.sys.mjs': typeof import('resource://testing-common/NormandyTestUtils.sys.mjs'); + 'resource://testing-common/OSKeyStoreTestUtils.sys.mjs': typeof import('resource://testing-common/OSKeyStoreTestUtils.sys.mjs'); 'resource://testing-common/PerTestCoverageUtils.sys.mjs': typeof import('resource://testing-common/PerTestCoverageUtils.sys.mjs'); 'resource://testing-common/PerfTestHelpers.sys.mjs': typeof import('resource://testing-common/PerfTestHelpers.sys.mjs'); 'resource://testing-common/PermissionTestUtils.sys.mjs': typeof import('resource://testing-common/PermissionTestUtils.sys.mjs'); 'resource://testing-common/PlacesTestUtils.sys.mjs': typeof import('resource://testing-common/PlacesTestUtils.sys.mjs'); + 'resource://testing-common/ProfilerTestUtils.sys.mjs': typeof import('resource://testing-common/ProfilerTestUtils.sys.mjs'); 'resource://testing-common/PromiseTestUtils.sys.mjs': typeof import('resource://testing-common/PromiseTestUtils.sys.mjs'); 'resource://testing-common/PromptTestUtils.sys.mjs': typeof import('resource://testing-common/PromptTestUtils.sys.mjs'); 'resource://testing-common/QuickSuggestTestUtils.sys.mjs': typeof import('resource://testing-common/QuickSuggestTestUtils.sys.mjs'); @@ -940,20 +1221,48 @@ export interface Modules { 'resource://testing-common/RemoteSettingsServer.sys.mjs': typeof import('resource://testing-common/RemoteSettingsServer.sys.mjs'); 'resource://testing-common/SearchTestUtils.sys.mjs': typeof import('resource://testing-common/SearchTestUtils.sys.mjs'); 'resource://testing-common/SearchUITestUtils.sys.mjs': typeof import('resource://testing-common/SearchUITestUtils.sys.mjs'); + 'resource://testing-common/SessionStoreTestUtils.sys.mjs': typeof import('resource://testing-common/SessionStoreTestUtils.sys.mjs'); 'resource://testing-common/Sinon.sys.mjs': typeof import('resource://testing-common/Sinon.sys.mjs'); 'resource://testing-common/SiteDataTestUtils.sys.mjs': typeof import('resource://testing-common/SiteDataTestUtils.sys.mjs'); 'resource://testing-common/SpecialPowersParent.sys.mjs': typeof import('resource://testing-common/SpecialPowersParent.sys.mjs'); 'resource://testing-common/SpecialPowersProcessActor.sys.mjs': typeof import('resource://testing-common/SpecialPowersProcessActor.sys.mjs'); 'resource://testing-common/SpecialPowersSandbox.sys.mjs': typeof import('resource://testing-common/SpecialPowersSandbox.sys.mjs'); + 'resource://testing-common/StructuredLog.sys.mjs': typeof import('resource://testing-common/StructuredLog.sys.mjs'); 'resource://testing-common/TabGroupTestUtils.sys.mjs': typeof import('resource://testing-common/TabGroupTestUtils.sys.mjs'); 'resource://testing-common/TelemetryArchiveTesting.sys.mjs': typeof import('resource://testing-common/TelemetryArchiveTesting.sys.mjs'); + 'resource://testing-common/TelemetryEnvironmentTesting.sys.mjs': typeof import('resource://testing-common/TelemetryEnvironmentTesting.sys.mjs'); 'resource://testing-common/TelemetryTestUtils.sys.mjs': typeof import('resource://testing-common/TelemetryTestUtils.sys.mjs'); 'resource://testing-common/TestIntegration.sys.mjs': typeof import('resource://testing-common/TestIntegration.sys.mjs'); 'resource://testing-common/TestUtils.sys.mjs': typeof import('resource://testing-common/TestUtils.sys.mjs'); + 'resource://testing-common/UrlClassifierTestUtils.sys.mjs': typeof import('resource://testing-common/UrlClassifierTestUtils.sys.mjs'); 'resource://testing-common/UrlbarTestUtils.sys.mjs': typeof import('resource://testing-common/UrlbarTestUtils.sys.mjs'); + 'resource://testing-common/VacuumParticipant.sys.mjs': typeof import('resource://testing-common/VacuumParticipant.sys.mjs'); 'resource://testing-common/WrapPrivileged.sys.mjs': typeof import('resource://testing-common/WrapPrivileged.sys.mjs'); 'resource://testing-common/XPCShellContentUtils.sys.mjs': typeof import('resource://testing-common/XPCShellContentUtils.sys.mjs'); + 'resource://testing-common/backgroundtasks/BackgroundTask_backgroundtask_specific_pref.sys.mjs': typeof import('resource://testing-common/backgroundtasks/BackgroundTask_backgroundtask_specific_pref.sys.mjs'); + 'resource://testing-common/backgroundtasks/BackgroundTask_shouldprocessupdates.sys.mjs': typeof import('resource://testing-common/backgroundtasks/BackgroundTask_shouldprocessupdates.sys.mjs'); + 'resource://testing-common/backgroundtasks/BackgroundTask_unique_profile.sys.mjs': typeof import('resource://testing-common/backgroundtasks/BackgroundTask_unique_profile.sys.mjs'); + 'resource://testing-common/cookie_filtering_helper.sys.mjs': typeof import('resource://testing-common/cookie_filtering_helper.sys.mjs'); + 'resource://testing-common/dom/indexedDB/test/modules/IndexedDBUtils.sys.mjs': typeof import('resource://testing-common/dom/indexedDB/test/modules/IndexedDBUtils.sys.mjs'); + 'resource://testing-common/dom/localstorage/test/modules/LocalStorageUtils.sys.mjs': typeof import('resource://testing-common/dom/localstorage/test/modules/LocalStorageUtils.sys.mjs'); + 'resource://testing-common/dom/quota/test/modules/FileUtils.sys.mjs': typeof import('resource://testing-common/dom/quota/test/modules/FileUtils.sys.mjs'); + 'resource://testing-common/dom/quota/test/modules/ModuleLoader.sys.mjs': typeof import('resource://testing-common/dom/quota/test/modules/ModuleLoader.sys.mjs'); + 'resource://testing-common/dom/quota/test/modules/PrefUtils.sys.mjs': typeof import('resource://testing-common/dom/quota/test/modules/PrefUtils.sys.mjs'); + 'resource://testing-common/dom/quota/test/modules/PrincipalUtils.sys.mjs': typeof import('resource://testing-common/dom/quota/test/modules/PrincipalUtils.sys.mjs'); + 'resource://testing-common/dom/quota/test/modules/ProcessUtils.sys.mjs': typeof import('resource://testing-common/dom/quota/test/modules/ProcessUtils.sys.mjs'); + 'resource://testing-common/dom/quota/test/modules/QuotaUtils.sys.mjs': typeof import('resource://testing-common/dom/quota/test/modules/QuotaUtils.sys.mjs'); + 'resource://testing-common/dom/quota/test/modules/StorageUtils.sys.mjs': typeof import('resource://testing-common/dom/quota/test/modules/StorageUtils.sys.mjs'); + 'resource://testing-common/dom/quota/test/modules/Utils.sys.mjs': typeof import('resource://testing-common/dom/quota/test/modules/Utils.sys.mjs'); + 'resource://testing-common/dom/quota/test/modules/WorkerDriver.sys.mjs': typeof import('resource://testing-common/dom/quota/test/modules/WorkerDriver.sys.mjs'); + 'resource://testing-common/dom/simpledb/test/modules/SimpleDBUtils.sys.mjs': typeof import('resource://testing-common/dom/simpledb/test/modules/SimpleDBUtils.sys.mjs'); + 'resource://testing-common/early_hint_preload_test_helper.sys.mjs': typeof import('resource://testing-common/early_hint_preload_test_helper.sys.mjs'); 'resource://testing-common/httpd.sys.mjs': typeof import('resource://testing-common/httpd.sys.mjs'); + 'resource://testing-common/services/common/logging.sys.mjs': typeof import('resource://testing-common/services/common/logging.sys.mjs'); + 'resource://testing-common/services/sync/fakeservices.sys.mjs': typeof import('resource://testing-common/services/sync/fakeservices.sys.mjs'); + 'resource://testing-common/services/sync/fxa_utils.sys.mjs': typeof import('resource://testing-common/services/sync/fxa_utils.sys.mjs'); + 'resource://testing-common/services/sync/rotaryengine.sys.mjs': typeof import('resource://testing-common/services/sync/rotaryengine.sys.mjs'); + 'resource://testing-common/services/sync/utils.sys.mjs': typeof import('resource://testing-common/services/sync/utils.sys.mjs'); + 'resource://testing-common/simple_unknown_uri_helpers.sys.mjs': typeof import('resource://testing-common/simple_unknown_uri_helpers.sys.mjs'); 'resource://tps/auth/fxaccounts.sys.mjs': typeof import('resource://tps/auth/fxaccounts.sys.mjs'); 'resource://tps/logger.sys.mjs': typeof import('resource://tps/logger.sys.mjs'); 'resource://tps/modules/addons.sys.mjs': typeof import('resource://tps/modules/addons.sys.mjs'); @@ -966,4 +1275,7 @@ export interface Modules { 'resource://tps/modules/prefs.sys.mjs': typeof import('resource://tps/modules/prefs.sys.mjs'); 'resource://tps/modules/tabs.sys.mjs': typeof import('resource://tps/modules/tabs.sys.mjs'); 'resource://tps/modules/windows.sys.mjs': typeof import('resource://tps/modules/windows.sys.mjs'); + 'resource://tps/quit.sys.mjs': typeof import('resource://tps/quit.sys.mjs'); + 'resource://tps/tps.sys.mjs': typeof import('resource://tps/tps.sys.mjs'); + 'resource://webcompat/AboutCompat.sys.mjs': typeof import('resource://webcompat/AboutCompat.sys.mjs'); } diff --git a/src/zen/@types/lib.gecko.services.d.ts b/src/zen/@types/lib.gecko.services.d.ts index 35c3182ff..8fd3907d1 100644 --- a/src/zen/@types/lib.gecko.services.d.ts +++ b/src/zen/@types/lib.gecko.services.d.ts @@ -62,5 +62,4 @@ interface JSServices { wm: nsIWindowMediator; ww: nsIWindowWatcher; xulStore: nsIXULStore; - zen: nsIZenCommonUtils; } diff --git a/src/zen/@types/lib.gecko.xpcom.d.ts b/src/zen/@types/lib.gecko.xpcom.d.ts index 3786f6fbc..17b7fa253 100644 --- a/src/zen/@types/lib.gecko.xpcom.d.ts +++ b/src/zen/@types/lib.gecko.xpcom.d.ts @@ -1181,6 +1181,7 @@ declare global { searchString: string; setInitiallySelectedIndex(index: i32): void; resetInternalState(): void; + resetSession(): void; } // https://searchfox.org/mozilla-central/source/toolkit/components/autocomplete/nsIAutoCompleteInput.idl @@ -1275,6 +1276,7 @@ declare global { listener: nsIAutoCompleteObserver ): void; stopSearch(): void; + resetSession(): void; } interface nsIAutoCompleteObserver extends nsISupports { @@ -1618,53 +1620,6 @@ declare global { removeValue(name: string): void; } - // https://searchfox.org/mozilla-central/source/dom/commandhandler/nsIControllerCommand.idl - - interface nsIControllerCommand extends nsISupports { - isCommandEnabled(aCommandName: string, aCommandContext: nsISupports): boolean; - getCommandStateParams( - aCommandName: string, - aParams: nsICommandParams, - aCommandContext: nsISupports - ): void; - doCommand(aCommandName: string, aCommandContext: nsISupports): void; - doCommandParams( - aCommandName: string, - aParams: nsICommandParams, - aCommandContext: nsISupports - ): void; - } - - // https://searchfox.org/mozilla-central/source/dom/commandhandler/nsIControllerCommandTable.idl - - interface nsIControllerCommandTable extends nsISupports { - makeImmutable(): void; - registerCommand(aCommandName: string, aCommand: nsIControllerCommand): void; - unregisterCommand(aCommandName: string, aCommand: nsIControllerCommand): void; - findCommandHandler(aCommandName: string): nsIControllerCommand; - isCommandEnabled(aCommandName: string, aCommandRefCon: nsISupports): boolean; - updateCommandState(aCommandName: string, aCommandRefCon: nsISupports): void; - supportsCommand(aCommandName: string, aCommandRefCon: nsISupports): boolean; - doCommand(aCommandName: string, aCommandRefCon: nsISupports): void; - doCommandParams( - aCommandName: string, - aParam: nsICommandParams, - aCommandRefCon: nsISupports - ): void; - getCommandState( - aCommandName: string, - aParam: nsICommandParams, - aCommandRefCon: nsISupports - ): void; - getSupportedCommands(): string[]; - } - - // https://searchfox.org/mozilla-central/source/dom/commandhandler/nsIControllerContext.idl - - interface nsIControllerContext extends nsISupports { - setCommandContext(aCommandContext: nsISupports): void; - } - // https://searchfox.org/mozilla-central/source/toolkit/components/commandlines/nsICommandLine.idl interface nsICommandLine extends nsISupports { @@ -1998,8 +1953,9 @@ declare enum nsIDocumentViewer_PermitUnloadAction { } declare enum nsIDocumentViewer_PermitUnloadResult { - eAllowNavigation = 0, - eRequestBlockNavigation = 1, + eContinue = 0, + eCanceledByBeforeUnload = 1, + eCanceledByNavigate = 2, } declare global { @@ -2692,6 +2648,7 @@ declare global { readonly OPEN_PRINT_BROWSER?: 4; readonly OPEN_NEWTAB_BACKGROUND?: 5; readonly OPEN_NEWTAB_FOREGROUND?: 6; + readonly OPEN_NEWTAB_AFTER_CURRENT?: 7; readonly OPEN_NEW?: 0; readonly OPEN_EXTERNAL?: 1; readonly OPEN_NO_OPENER?: 4; @@ -3001,7 +2958,6 @@ declare global { readonly MOUSE_BUTTONS_MIDDLE_BUTTON?: 4; readonly MOUSE_BUTTONS_4TH_BUTTON?: 8; readonly MOUSE_BUTTONS_5TH_BUTTON?: 16; - readonly MOUSE_BUTTONS_NOT_SPECIFIED?: -1; readonly DIRECTION_LTR?: 0; readonly DIRECTION_RTL?: 1; readonly DIRECTION_NOT_SET?: 2; @@ -3061,21 +3017,6 @@ declare global { isFirstPaint: boolean; getPresShellId(): u32; isCORSSafelistedRequestHeader(name: string, value: string): boolean; - sendMouseEvent( - aType: string, - aX: float, - aY: float, - aButton: i32, - aClickCount: i32, - aModifiers: i32, - aIgnoreRootScrollFrame?: boolean, - aPressure?: float, - aInputSourceArg?: u16, - aIsDOMEventSynthesized?: boolean, - aIsWidgetEventSynthesized?: boolean, - aButtons?: i32, - aIdentifier?: u32 - ): boolean; sendTouchEvent( aType: string, aIdentifiers: u32[], @@ -3106,21 +3047,6 @@ declare global { aModifier: i32, aAsyncEnabled?: nsIDOMWindowUtils.AsyncEnabledOption ): boolean; - sendMouseEventToWindow( - aType: string, - aX: float, - aY: float, - aButton: i32, - aClickCount: i32, - aModifiers: i32, - aIgnoreRootScrollFrame?: boolean, - aPressure?: float, - aInputSourceArg?: u16, - aIsDOMEventSynthesized?: boolean, - aIsWidgetEventSynthesized?: boolean, - aButtons?: i32, - aIdentifier?: u32 - ): void; sendTouchEventToWindow( aType: string, aIdentifiers: u32[], @@ -4722,7 +4648,7 @@ declare global { aParserCreated: boolean, aTriggeringElement: Element, aCSPEventListener: nsICSPEventListener, - aContentOfPseudoScript: string, + aSourceText: string, aLineNumber: u32, aColumnNumber: u32 ): boolean; @@ -6710,6 +6636,7 @@ declare global { removeAllLogins(): void; getAllLogins(): Promise; getAllLoginsWithCallback(aCallback: nsILoginSearchCallback): void; + reencryptAllLogins(): Promise; getAllDisabledHosts(): string[]; getLoginSavingEnabled(aHost: string): boolean; setLoginSavingEnabled(aHost: string, isEnabled: boolean): void; @@ -6921,6 +6848,7 @@ declare global { readonly totalPhysicalMemory: u64; readonly availablePhysicalMemory: u64; getOptimalCPUConcurrency(): u8; + canUseLlamaCpp(): boolean; } // https://searchfox.org/mozilla-central/source/toolkit/components/find/nsIFind.idl @@ -7755,6 +7683,8 @@ declare enum nsILoadInfo_StoragePermissionState { NoStoragePermission = 0, HasStoragePermission = 1, StoragePermissionAllowListed = 2, + DisabledStoragePermission = 3, + InactiveStoragePermission = 4, } declare enum nsILoadInfo_IPAddressSpace { @@ -8517,6 +8447,17 @@ declare global { aFailoverTimeout: u32, aFailoverProxy: nsIProxyInfo ): nsIProxyInfo; + newMASQUEProxyInfo( + aHost: string, + aPort: i32, + aPathTemplate: string, + aAlpn: string, + aProxyAuthorizationHeader: string, + aConnectionIsolationKey: string, + aFlags: u32, + aFailoverTimeout: u32, + aFailoverProxy: nsIProxyInfo + ): nsIProxyInfo; getFailoverForProxy(aProxyInfo: nsIProxyInfo, aURI: nsIURI, aReason: nsresult): nsIProxyInfo; registerFilter(aFilter: nsIProtocolProxyFilter, aPosition: u32): void; registerChannelFilter(aFilter: nsIProtocolProxyChannelFilter, aPosition: u32): void; @@ -8579,6 +8520,8 @@ declare global { sourceId: string; readonly proxyAuthorizationHeader: string; readonly connectionIsolationKey: string; + pathTemplate: string; + alpn: string; } // https://searchfox.org/mozilla-central/source/netwerk/base/nsIRandomGenerator.idl @@ -11186,6 +11129,7 @@ declare global { getErrorMessage(aXPCOMErrorCode: nsresult): string; getErrorName(aXPCOMErrorCode: nsresult): string; getErrorClass(aXPCOMErrorCode: nsresult): u32; + isErrorOverridable(aXPCOMErrorCode: nsresult): boolean; } // https://searchfox.org/mozilla-central/source/security/manager/ssl/nsINSSVersion.idl @@ -11605,6 +11549,7 @@ declare global { aFlags: u32, aHostname: string, aTime: u64, + aSctsFromTls: u8[], aCallback: nsICertVerificationCallback ): void; clearOCSPCache(): void; @@ -11770,6 +11715,13 @@ declare global { // https://searchfox.org/mozilla-central/source/toolkit/components/places/nsINavBookmarksService.idl } // global +declare enum nsINavBookmarksService_BookmarkType { + TYPE_BOOKMARK = 1, + TYPE_FOLDER = 2, + TYPE_SEPARATOR = 3, + TYPE_DYNAMIC_CONTAINER = 4, +} + declare enum nsINavBookmarksService_ChangeSource { SOURCE_DEFAULT = 0, SOURCE_SYNC = 1, @@ -11781,17 +11733,16 @@ declare enum nsINavBookmarksService_ChangeSource { declare global { namespace nsINavBookmarksService { + type BookmarkType = nsINavBookmarksService_BookmarkType; type ChangeSource = nsINavBookmarksService_ChangeSource; } interface nsINavBookmarksService extends nsISupports, - Enums { + Enums< + typeof nsINavBookmarksService_BookmarkType & typeof nsINavBookmarksService_ChangeSource + > { readonly DEFAULT_INDEX?: -1; - readonly TYPE_BOOKMARK?: 1; - readonly TYPE_FOLDER?: 2; - readonly TYPE_SEPARATOR?: 3; - readonly TYPE_DYNAMIC_CONTAINER?: 4; readonly SYNC_STATUS_UNKNOWN?: 0; readonly SYNC_STATUS_NEW?: 1; readonly SYNC_STATUS_NORMAL?: 2; @@ -11956,34 +11907,51 @@ declare global { setParents(aGuids: string[]): void; clone(): nsINavHistoryQuery; } +} // global - interface nsINavHistoryQueryOptions extends nsISupports { - readonly SORT_BY_NONE?: 0; - readonly SORT_BY_TITLE_ASCENDING?: 1; - readonly SORT_BY_TITLE_DESCENDING?: 2; - readonly SORT_BY_DATE_ASCENDING?: 3; - readonly SORT_BY_DATE_DESCENDING?: 4; - readonly SORT_BY_URI_ASCENDING?: 5; - readonly SORT_BY_URI_DESCENDING?: 6; - readonly SORT_BY_VISITCOUNT_ASCENDING?: 7; - readonly SORT_BY_VISITCOUNT_DESCENDING?: 8; - readonly SORT_BY_DATEADDED_ASCENDING?: 11; - readonly SORT_BY_DATEADDED_DESCENDING?: 12; - readonly SORT_BY_LASTMODIFIED_ASCENDING?: 13; - readonly SORT_BY_LASTMODIFIED_DESCENDING?: 14; - readonly SORT_BY_TAGS_ASCENDING?: 17; - readonly SORT_BY_TAGS_DESCENDING?: 18; - readonly SORT_BY_FRECENCY_ASCENDING?: 21; - readonly SORT_BY_FRECENCY_DESCENDING?: 22; - readonly RESULTS_AS_URI?: 0; - readonly RESULTS_AS_VISIT?: 1; - readonly RESULTS_AS_DATE_QUERY?: 3; - readonly RESULTS_AS_SITE_QUERY?: 4; - readonly RESULTS_AS_DATE_SITE_QUERY?: 5; - readonly RESULTS_AS_TAGS_ROOT?: 6; - readonly RESULTS_AS_TAG_CONTENTS?: 7; - readonly RESULTS_AS_ROOTS_QUERY?: 8; - readonly RESULTS_AS_LEFT_PANE_QUERY?: 9; +declare enum nsINavHistoryQueryOptions_SortByType { + SORT_BY_NONE = 0, + SORT_BY_TITLE_ASCENDING = 1, + SORT_BY_TITLE_DESCENDING = 2, + SORT_BY_DATE_ASCENDING = 3, + SORT_BY_DATE_DESCENDING = 4, + SORT_BY_URI_ASCENDING = 5, + SORT_BY_URI_DESCENDING = 6, + SORT_BY_VISITCOUNT_ASCENDING = 7, + SORT_BY_VISITCOUNT_DESCENDING = 8, + SORT_BY_DATEADDED_ASCENDING = 11, + SORT_BY_DATEADDED_DESCENDING = 12, + SORT_BY_LASTMODIFIED_ASCENDING = 13, + SORT_BY_LASTMODIFIED_DESCENDING = 14, + SORT_BY_TAGS_ASCENDING = 17, + SORT_BY_TAGS_DESCENDING = 18, + SORT_BY_FRECENCY_ASCENDING = 21, + SORT_BY_FRECENCY_DESCENDING = 22, +} + +declare enum nsINavHistoryQueryOptions_ResultType { + RESULTS_AS_URI = 0, + RESULTS_AS_VISIT = 1, + RESULTS_AS_DATE_QUERY = 3, + RESULTS_AS_SITE_QUERY = 4, + RESULTS_AS_DATE_SITE_QUERY = 5, + RESULTS_AS_TAGS_ROOT = 6, + RESULTS_AS_TAG_CONTENTS = 7, + RESULTS_AS_ROOTS_QUERY = 8, + RESULTS_AS_LEFT_PANE_QUERY = 9, +} + +declare global { + namespace nsINavHistoryQueryOptions { + type SortByType = nsINavHistoryQueryOptions_SortByType; + type ResultType = nsINavHistoryQueryOptions_ResultType; + } + + interface nsINavHistoryQueryOptions + extends nsISupports, + Enums< + typeof nsINavHistoryQueryOptions_SortByType & typeof nsINavHistoryQueryOptions_ResultType + > { readonly QUERY_TYPE_HISTORY?: 0; readonly QUERY_TYPE_BOOKMARKS?: 1; @@ -12050,6 +12018,7 @@ declare global { queryToQueryString(aQuery: nsINavHistoryQuery, options: nsINavHistoryQueryOptions): string; readonly historyDisabled: boolean; makeGuid(): string; + pageFrecencyThreshold(aVisitAgeInDays: i32, aNumVisits: i32, aBookmarked: boolean): i64; hashURL(aSpec: string, aMode?: string): u64; isFrecencyDecaying: boolean; readonly isAlternativeFrecencyEnabled: boolean; @@ -12116,6 +12085,13 @@ declare global { interface nsIPrefLocalizedString extends nsISupportsString {} + // https://searchfox.org/mozilla-central/source/modules/libpref/nsIPrefOverrideMap.idl + + interface nsIPrefOverrideMap extends nsISupports { + addEntry(aPrefName: string, aPrefValue: any): void; + getEntry(aPrefName: string): any; + } + // https://searchfox.org/mozilla-central/source/modules/libpref/nsIPrefService.idl type nsIPrefStatsCallback = Callable<{ @@ -12144,7 +12120,7 @@ declare global { interface nsIPrefService extends nsISupports { resetPrefs(): void; savePrefFile(aFile: nsIFile): void; - backupPrefFile(aFile: nsIFile): Promise; + backupPrefFile(aFile: nsIFile, aOverrideMap?: nsIPrefOverrideMap): Promise; getBranch(aPrefRoot: string): nsIPrefBranch; getDefaultBranch(aPrefRoot: string): nsIPrefBranch; readonly dirty: boolean; @@ -12154,6 +12130,7 @@ declare global { resetStats(): void; parsePrefsFromBuffer(bytes: u8[], observer: nsIPrefObserver, pathLabel?: string): void; readonly userPrefsFileLastModifiedAtStartup: PRTime; + readonly prefsJsPreamble: string; } // https://searchfox.org/mozilla-central/source/modules/libpref/nsIRelativeFilePref.idl @@ -12304,28 +12281,6 @@ declare global { readonly contentWin32kLockdownStateString: string; } - // https://searchfox.org/mozilla-central/source/security/sandbox/linux/interfaces/mozISandboxReporter.idl - - interface mozISandboxReport extends nsISupports { - readonly msecAgo: u64; - readonly pid: i32; - readonly tid: i32; - readonly procType: string; - readonly syscall: u32; - readonly numArgs: u32; - getArg(aIndex: u32): string; - } - - interface mozISandboxReportArray extends nsISupports { - readonly begin: u64; - readonly end: u64; - getElement(aIndex: u64): mozISandboxReport; - } - - interface mozISandboxReporter extends nsISupports { - snapshot(): mozISandboxReportArray; - } - // https://searchfox.org/mozilla-central/source/toolkit/components/satchel/nsIFormFillController.idl interface nsIFormFillController extends nsISupports { @@ -13835,7 +13790,6 @@ declare global { readonly name: string; readonly id: string; readonly telemetryId: string; - readonly identifier: string; readonly loadPath: string; readonly isAppProvided: boolean; readonly isConfigEngine: boolean; @@ -13899,7 +13853,7 @@ declare global { readonly hasSuccessfullyInitialized: boolean; runBackgroundChecks(): Promise; resetToAppDefaultEngine(): void; - addOpenSearchEngine(engineURL: string, iconURL: string): Promise; + addOpenSearchEngine(engineURL: string, iconURL: string, originAttributes?: any): Promise; addUserEngine(formInfo: any): Promise; addEnginesFromExtension(extension: any): Promise; restoreDefaultEngines(): void; @@ -14758,7 +14712,7 @@ declare global { getTables(c: nsIUrlClassifierCallback): void; setHashCompleter(tableName: string, completer: nsIUrlClassifierHashCompleter): void; clearLastResults(): void; - beginUpdate(updater: nsIUrlClassifierUpdateObserver, tables: string): void; + beginUpdate(updater: nsIUrlClassifierUpdateObserver, tables: string, provider: string): void; beginStream(table: string): void; updateStream(updateChunk: string): void; finishStream(): void; @@ -14846,7 +14800,9 @@ declare global { downloadUpdates( aRequestTables: string, aRequestPayload: string, + aRequestQueryParameters: string, aIsPostRequest: boolean, + aProvider: string, aUpdateUrl: string, aSuccessCallback: nsIUrlClassifierCallback, aUpdateErrorCallback: nsIUrlClassifierCallback, @@ -14854,6 +14810,15 @@ declare global { ): boolean; } + // https://searchfox.org/mozilla-central/source/toolkit/components/url-classifier/nsIUrlClassifierTestUtils.idl + + interface nsIUrlClassifierTestUtils extends nsISupports { + makeUpdateResponseV5(aName: string, aSingleHash: u32): string; + makeFindFullHashResponseV5(aFullHash: string): string; + generateLookupHash(aFragment: string): u32; + generateFullHash(aFragment: string): string; + } + // https://searchfox.org/mozilla-central/source/toolkit/components/url-classifier/nsIUrlClassifierUtils.idl interface nsIUrlClassifierParseFindFullHashCallback extends nsISupports { @@ -14881,11 +14846,16 @@ declare global { aListStatesBase64: string[], aPrefixes: string[] ): string; + makeFindFullHashRequestV5(aHashPrefixes: string[]): string; makeThreatHitReport(aChannel: nsIChannel, aListName: string, aHashBase64: string): string; parseFindFullHashResponseV4( aResponse: string, aCallback: nsIUrlClassifierParseFindFullHashCallback ): void; + parseFindFullHashResponseV5( + aResponse: string, + aCallback: nsIUrlClassifierParseFindFullHashCallback + ): void; } // https://searchfox.org/mozilla-central/source/toolkit/components/url-classifier/nsIUrlListManager.idl @@ -17732,15 +17702,24 @@ declare global { } // https://searchfox.org/mozilla-central/source/xpcom/threads/nsIEventTarget.idl +} // global - interface nsIEventTarget extends nsISupports { - readonly DISPATCH_NORMAL?: 0; - readonly DISPATCH_AT_END?: 2; - readonly DISPATCH_EVENT_MAY_BLOCK?: 4; - readonly DISPATCH_IGNORE_BLOCK_DISPATCH?: 8; +declare enum nsIEventTarget_DispatchFlags { + DISPATCH_NORMAL = 0, + DISPATCH_AT_END = 2, + DISPATCH_EVENT_MAY_BLOCK = 4, + DISPATCH_IGNORE_BLOCK_DISPATCH = 8, + DISPATCH_FALLIBLE = 16, +} +declare global { + namespace nsIEventTarget { + type DispatchFlags = nsIEventTarget_DispatchFlags; + } + + interface nsIEventTarget extends nsISupports, Enums { isOnCurrentThread(): boolean; - dispatch(event: nsIRunnable, flags: u32): void; + dispatch(event: nsIRunnable, flags: nsIEventTarget.DispatchFlags): void; } // https://searchfox.org/mozilla-central/source/xpcom/threads/nsIIdlePeriod.idl @@ -17947,6 +17926,8 @@ declare global { getUAWidgetScope(principal: nsIPrincipal): any; getSandboxMetadata(sandbox: any): any; setSandboxMetadata(sandbox: any, metadata: any): void; + setSandboxLocaleOverride(sandbox: any, locale: string): void; + setSandboxTimezoneOverride(sandbox: any, timezone: string): void; isESModuleLoaded(aResourceURI: string): boolean; importGlobalProperties(aPropertyList: any): void; getWeakReference(obj: any): xpcIJSWeakReference; @@ -17995,7 +17976,6 @@ declare global { getWebIDLCallerPrincipal(): nsIPrincipal; getObjectPrincipal(obj: any): nsIPrincipal; getRealmLocation(obj: any): string; - now(): double; readUTF8File(file: nsIFile): string; readUTF8URI(url: nsIURI): string; createSpellChecker(): nsIEditorSpellCheck; @@ -18291,20 +18271,6 @@ declare global { getInstallHash(): string; } - // https://searchfox.org/mozilla-central/source/zen/toolkit/common/nsIZenCommonUtils.idl - - interface nsIZenCommonUtils extends nsISupports { - share(url: nsIURI, title: string, text: string, x: u32, y: u32, width: u32, height: u32): void; - canShare(): boolean; - playHapticFeedback(): void; - } - - // https://searchfox.org/mozilla-central/source/zen/mods/nsIZenModsBackend.idl - - interface nsIZenModsBackend extends nsISupports { - rebuildModsStyles(aContents: string): void; - } - // https://searchfox.org/mozilla-central/source/modules/libjar/zipwriter/nsIZipWriter.idl interface nsIZipWriter extends nsISupports { @@ -18416,9 +18382,6 @@ declare global { nsIToolkitChromeRegistry: nsJSIID; nsICommandManager: nsJSIID; nsICommandParams: nsJSIID; - nsIControllerCommand: nsJSIID; - nsIControllerCommandTable: nsJSIID; - nsIControllerContext: nsJSIID; nsICommandLine: nsJSIID; nsICommandLineHandler: nsJSIID; nsICommandLineValidator: nsJSIID; @@ -19122,7 +19085,7 @@ declare global { nsIFavicon: nsJSIID; nsINavBookmarksService: nsJSIID< nsINavBookmarksService, - typeof nsINavBookmarksService_ChangeSource + typeof nsINavBookmarksService_BookmarkType & typeof nsINavBookmarksService_ChangeSource >; nsINavHistoryResultNode: nsJSIID< nsINavHistoryResultNode, @@ -19133,12 +19096,16 @@ declare global { nsINavHistoryResultObserver: nsJSIID; nsINavHistoryResult: nsJSIID; nsINavHistoryQuery: nsJSIID; - nsINavHistoryQueryOptions: nsJSIID; + nsINavHistoryQueryOptions: nsJSIID< + nsINavHistoryQueryOptions, + typeof nsINavHistoryQueryOptions_SortByType & typeof nsINavHistoryQueryOptions_ResultType + >; nsINavHistoryService: nsJSIID; nsIPlacesPreviewsHelperService: nsJSIID; nsITaggingService: nsJSIID; nsIPrefBranch: nsJSIID; nsIPrefLocalizedString: nsJSIID; + nsIPrefOverrideMap: nsJSIID; nsIPrefStatsCallback: nsJSIID; nsIPrefObserver: nsJSIID; nsIPrefService: nsJSIID; @@ -19154,9 +19121,6 @@ declare global { nsIApplicationReputationQuery: nsJSIID; nsIApplicationReputationCallback: nsJSIID; mozISandboxSettings: nsJSIID; - mozISandboxReport: nsJSIID; - mozISandboxReportArray: nsJSIID; - mozISandboxReporter: nsJSIID; nsIFormFillController: nsJSIID; nsIFormFillCompleteObserver: nsJSIID; mozIBridgedSyncEngineCallback: nsJSIID; @@ -19351,6 +19315,7 @@ declare global { nsIUrlClassifierPrefixSet: nsJSIID; nsIUrlClassifierRemoteSettingsService: nsJSIID; nsIUrlClassifierStreamUpdater: nsJSIID; + nsIUrlClassifierTestUtils: nsJSIID; nsIUrlClassifierParseFindFullHashCallback: nsJSIID; nsIUrlClassifierUtils: nsJSIID; nsIUrlListManager: nsJSIID; @@ -19577,7 +19542,7 @@ declare global { typeof nsIXULRuntime_FissionDecisionStatus >; nsIEnvironment: nsJSIID; - nsIEventTarget: nsJSIID; + nsIEventTarget: nsJSIID; nsINamed: nsJSIID; nsIProcess: nsJSIID; nsIRunnable: nsJSIID; @@ -19626,8 +19591,6 @@ declare global { nsIControllers: nsJSIID; nsINativeAppSupport: nsJSIID; nsIXREDirProvider: nsJSIID; - nsIZenCommonUtils: nsJSIID; - nsIZenModsBackend: nsJSIID; nsIZipWriter: nsJSIID; } } // global diff --git a/src/zen/common/styles/zen-browser-container.css b/src/zen/common/styles/zen-browser-container.css index 3bde84f83..a1715df59 100644 --- a/src/zen/common/styles/zen-browser-container.css +++ b/src/zen/common/styles/zen-browser-container.css @@ -4,41 +4,35 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ :root:not([inDOMFullscreen='true']):not([chromehidden~='location']):not([chromehidden~='toolbar']) { - & #tabbrowser-tabbox #tabbrowser-tabpanels .browserSidebarContainer, - #tabbrowser-tabpanels[dragging-split='true'] { - width: -moz-available; - position: relative; + & #tabbrowser-tabbox #tabbrowser-tabpanels .browserSidebarContainer { + overflow: clip; - &.browserSidebarContainer { - overflow: clip; + :root:not([zen-no-padding='true']) &:not(.zen-glance-overlay) { + border-radius: var(--zen-native-inner-radius); + box-shadow: var(--zen-big-shadow); + } - :root:not([zen-no-padding='true']) &:not(.zen-glance-overlay) { - border-radius: var(--zen-native-inner-radius); - box-shadow: var(--zen-big-shadow); + & browser[type='content'] { + &:not([transparent='true']) { + background: light-dark(rgb(255, 255, 255), rgb(32, 32, 32)); } + &[transparent='true'] { + background: light-dark(rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0.1)); + } + } + + @media not -moz-pref('layout.css.prefers-color-scheme.content-override', 2) { & browser[type='content'] { - &:not([transparent='true']) { - background: light-dark(rgb(255, 255, 255), rgb(32, 32, 32)); - } - - &[transparent='true'] { - background: light-dark(rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0.1)); - } + color-scheme: env(-moz-content-preferred-color-scheme); } + } - @media not -moz-pref('layout.css.prefers-color-scheme.content-override', 2) { - & browser[type='content'] { - color-scheme: env(-moz-content-preferred-color-scheme); - } - } - - @media -moz-pref('zen.theme.acrylic-elements') { - & browser[type='content'] { - /* For the rendering engine to apply layering optimizations. This + @media -moz-pref('zen.theme.acrylic-elements') { + & browser[type='content'] { + /* For the rendering engine to apply layering optimizations. This * is a hacky solution, but it works for now. */ - will-change: transform; - } + will-change: transform; } } } diff --git a/src/zen/common/styles/zen-omnibox.css b/src/zen/common/styles/zen-omnibox.css index 2634a302f..d7ee4295b 100644 --- a/src/zen/common/styles/zen-omnibox.css +++ b/src/zen/common/styles/zen-omnibox.css @@ -21,7 +21,7 @@ --urlbarView-hover-background: var(--toolbarbutton-hover-background); --urlbarView-highlight-background: var(--toolbarbutton-hover-background); border-radius: calc(var(--toolbarbutton-border-radius) - 2px); - --urlbarView-results-padding: 6px !important; + --urlbarView-results-padding: 8px !important; --urlbar-container-height: 48px !important; --urlbar-margin-inline: 5px; @@ -63,8 +63,6 @@ outline: none !important; border: none !important; - margin: 1px; - box-shadow: none !important; } @@ -712,8 +710,8 @@ max-height: 260px; overflow-y: auto; scrollbar-width: none; - margin-block-start: var(--urlbarView-results-padding); - margin-block-end: calc(var(--urlbarView-results-padding) + 2px); + margin-block-start: calc(var(--urlbarView-results-padding) - 2px); + margin-block-end: var(--urlbarView-results-padding); padding-block: 0 !important; & .action-contextualidentity { diff --git a/src/zen/common/styles/zen-single-components.css b/src/zen/common/styles/zen-single-components.css index 8c7fa89cd..094841385 100644 --- a/src/zen/common/styles/zen-single-components.css +++ b/src/zen/common/styles/zen-single-components.css @@ -296,6 +296,11 @@ body > #confetti { --arrowpanel-menuitem-border-radius: 10px; } +#unified-extensions-empty-state, +#unified-extensions-discover-extensions { + display: none !important; +} + #zen-site-data-addons { display: flex; flex-wrap: wrap; diff --git a/src/zen/split-view/ZenViewSplitter.mjs b/src/zen/split-view/ZenViewSplitter.mjs index 3fe62d6c1..5aeeaa67c 100644 --- a/src/zen/split-view/ZenViewSplitter.mjs +++ b/src/zen/split-view/ZenViewSplitter.mjs @@ -239,7 +239,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { if (!draggedTab || gBrowser.selectedTab.hasAttribute('zen-empty-tab')) { return; } - draggedTab.container.finishMoveTogetherSelectedTabs(draggedTab); + gBrowser.tabContainer.tabDragAndDrop.finishMoveTogetherSelectedTabs(draggedTab); } if ( !draggedTab || diff --git a/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs index 779f3566b..eebfadf06 100644 --- a/src/zen/tabs/ZenPinnedTabManager.mjs +++ b/src/zen/tabs/ZenPinnedTabManager.mjs @@ -778,6 +778,10 @@ return; } const existingPin = this._pinsCache.find((p) => p.uuid === pin.uuid); + if (existingPin && existingPin === pin) { + // We want to avoid unnecessary writes + return; + } if (existingPin) { Object.assign(existingPin, pin); } else { diff --git a/src/zen/urlbar/ZenUBActionsProvider.sys.mjs b/src/zen/urlbar/ZenUBActionsProvider.sys.mjs index 898aa9373..0ace9dcba 100644 --- a/src/zen/urlbar/ZenUBActionsProvider.sys.mjs +++ b/src/zen/urlbar/ZenUBActionsProvider.sys.mjs @@ -3,7 +3,10 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import { XPCOMUtils } from 'resource://gre/modules/XPCOMUtils.sys.mjs'; -import { UrlbarProvider, UrlbarUtils } from 'resource:///modules/UrlbarUtils.sys.mjs'; +import { + UrlbarProvider, + UrlbarUtils, +} from 'moz-src:///browser/components/urlbar/UrlbarUtils.sys.mjs'; import { globalActions } from 'resource:///modules/ZenUBGlobalActions.sys.mjs'; import { zenUrlbarResultsLearner } from './ZenUBResultsLearner.sys.mjs'; @@ -18,9 +21,9 @@ const MINIMUM_QUERY_SCORE = 92; const MINIMUM_PREFIXED_QUERY_SCORE = 30; ChromeUtils.defineESModuleGetters(lazy, { - UrlbarResult: 'resource:///modules/UrlbarResult.sys.mjs', - UrlbarTokenizer: 'resource:///modules/UrlbarTokenizer.sys.mjs', - QueryScorer: 'resource:///modules/UrlbarProviderInterventions.sys.mjs', + UrlbarResult: 'moz-src:///browser/components/urlbar/UrlbarResult.sys.mjs', + UrlbarTokenizer: 'moz-src:///browser/components/urlbar/UrlbarTokenizer.sys.mjs', + QueryScorer: 'moz-src:///browser/components/urlbar/UrlbarProviderInterventions.sys.mjs', BrowserWindowTracker: 'resource:///modules/BrowserWindowTracker.sys.mjs', AddonManager: 'resource://gre/modules/AddonManager.sys.mjs', zenUrlbarResultsLearner: 'resource:///modules/ZenUBResultsLearner.sys.mjs', @@ -244,7 +247,7 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider { const ownerGlobal = lazy.BrowserWindowTracker.getTopWindow(); let finalResults = []; for (const action of actionsResults) { - const [payload, payloadHighlights] = lazy.UrlbarResult.payloadAndSimpleHighlights([], { + const { payload, payloadHighlights } = lazy.UrlbarResult.payloadAndSimpleHighlights([], { suggestion: action.label, title: action.label, zenCommand: action.command, @@ -259,12 +262,12 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider { ...action.extraPayload, }); - let result = new lazy.UrlbarResult( - UrlbarUtils.RESULT_TYPE.DYNAMIC, - UrlbarUtils.RESULT_SOURCE.ZEN_ACTIONS, + let result = new lazy.UrlbarResult({ + type: UrlbarUtils.RESULT_TYPE.DYNAMIC, + source: UrlbarUtils.RESULT_SOURCE.ZEN_ACTIONS, payload, - payloadHighlights - ); + payloadHighlights, + }); if (zenUrlbarResultsLearner.shouldPrioritize(action.commandId) && !isPrefixed) { result.heuristic = true; } else { diff --git a/src/zen/urlbar/ZenUBProvider.sys.mjs b/src/zen/urlbar/ZenUBProvider.sys.mjs index 6ba14396e..740e5af4e 100644 --- a/src/zen/urlbar/ZenUBProvider.sys.mjs +++ b/src/zen/urlbar/ZenUBProvider.sys.mjs @@ -2,7 +2,7 @@ * 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/. */ -import { UrlbarProvidersManager } from 'resource:///modules/UrlbarProvidersManager.sys.mjs'; +import { UrlbarProvidersManager } from 'moz-src:///browser/components/urlbar/UrlbarProvidersManager.sys.mjs'; const providers = {}; ChromeUtils.defineESModuleGetters(providers, { diff --git a/surfer.json b/surfer.json index 9687e3680..03e2cabec 100644 --- a/surfer.json +++ b/surfer.json @@ -6,7 +6,7 @@ "version": { "product": "firefox", "version": "144.0.2", - "candidate": "144.0.2" + "candidate": "145.0" }, "buildOptions": { "generateBranding": true @@ -53,4 +53,4 @@ "licenseType": "MPL-2.0" }, "updateHostname": "updates.zen-browser.app" -} +} \ No newline at end of file From 2ec45108500e1b29a6807208ada85aae9f54c78a Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sat, 8 Nov 2025 12:31:30 +0100 Subject: [PATCH 15/41] feat: Show the correct possition for new panels, b=no-bug, c=common --- .../actors/EncryptedMediaParent-sys-mjs.patch | 12 ++++++++++++ src/browser/base/content/zen-panels/site-data.inc | 3 +-- src/zen/common/ZenUIManager.mjs | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 src/browser/actors/EncryptedMediaParent-sys-mjs.patch diff --git a/src/browser/actors/EncryptedMediaParent-sys-mjs.patch b/src/browser/actors/EncryptedMediaParent-sys-mjs.patch new file mode 100644 index 000000000..a68cec8a1 --- /dev/null +++ b/src/browser/actors/EncryptedMediaParent-sys-mjs.patch @@ -0,0 +1,12 @@ +diff --git a/browser/actors/EncryptedMediaParent.sys.mjs b/browser/actors/EncryptedMediaParent.sys.mjs +index 9d3d3db9761cf5b2fde1f70992e82b1733241863..3dc64dc395d5237bf2c290cb8588cf467fb8729a 100644 +--- a/browser/actors/EncryptedMediaParent.sys.mjs ++++ b/browser/actors/EncryptedMediaParent.sys.mjs +@@ -200,6 +200,7 @@ export class EncryptedMediaParent extends JSWindowActorParent { + "drmContentPlaying", + aBrowser + ) ++ || true // zen: We have some issues with this currently, so never show it + ) { + return; + } diff --git a/src/browser/base/content/zen-panels/site-data.inc b/src/browser/base/content/zen-panels/site-data.inc index 0f7695264..e149df52e 100644 --- a/src/browser/base/content/zen-panels/site-data.inc +++ b/src/browser/base/content/zen-panels/site-data.inc @@ -5,8 +5,7 @@ + noautofocus="true"> # We'll keep the view with this name/id in order to prevent # any sort of future issues we may have if firefox decides diff --git a/src/zen/common/ZenUIManager.mjs b/src/zen/common/ZenUIManager.mjs index 1333a34ba..f8c11d47a 100644 --- a/src/zen/common/ZenUIManager.mjs +++ b/src/zen/common/ZenUIManager.mjs @@ -659,7 +659,7 @@ var gZenUIManager = { if (anchor?.closest('#zen-sidebar-top-buttons')) { block = 'topleft'; } - if (gZenVerticalTabsManager._hasSetSingleToolbar && !gZenVerticalTabsManager._prefsRightSide) { + if (gZenVerticalTabsManager._hasSetSingleToolbar && gZenVerticalTabsManager._prefsRightSide) { block = 'bottomright'; inline = 'topright'; } From 879865e6258b84ae67792332cca664505226b693 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sat, 8 Nov 2025 12:36:48 +0100 Subject: [PATCH 16/41] fix: Add a margin to the urlbar only when closed, b=no-bug, c=common --- src/zen/common/styles/zen-omnibox.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/zen/common/styles/zen-omnibox.css b/src/zen/common/styles/zen-omnibox.css index d7ee4295b..24becb4bc 100644 --- a/src/zen/common/styles/zen-omnibox.css +++ b/src/zen/common/styles/zen-omnibox.css @@ -62,6 +62,10 @@ border-radius: var(--border-radius-medium); outline: none !important; + #urlbar:not([breakout-extend='true']) & { + margin: 1px; + } + border: none !important; box-shadow: none !important; } From c5bc5c7f091a02284f9d6d2b908d00126dd73b7f Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sat, 8 Nov 2025 13:30:23 +0100 Subject: [PATCH 17/41] fix: Fixed tab border radius. Regression from `ff 145.0`, b=no-bug, c=tabs --- src/zen/tabs/zen-tabs/vertical-tabs.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/zen/tabs/zen-tabs/vertical-tabs.css b/src/zen/tabs/zen-tabs/vertical-tabs.css index 258ea20f6..e9de513cb 100644 --- a/src/zen/tabs/zen-tabs/vertical-tabs.css +++ b/src/zen/tabs/zen-tabs/vertical-tabs.css @@ -347,6 +347,7 @@ & .tab-background { overflow: hidden; + border-radius: var(--border-radius-medium) !important; & .tab-context-line { margin: 0 0px !important; From eeb8a78741febe9d37ee5981c417147fd85aea55 Mon Sep 17 00:00:00 2001 From: Ryosuke <88011751+nrysk@users.noreply.github.com> Date: Sun, 9 Nov 2025 00:39:17 +0900 Subject: [PATCH 18/41] feat: Add three command bar actions for switching the Light/Dark Mode, p=#11122 --- src/zen/urlbar/ZenUBGlobalActions.sys.mjs | 30 +++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/zen/urlbar/ZenUBGlobalActions.sys.mjs b/src/zen/urlbar/ZenUBGlobalActions.sys.mjs index 5f09607d4..12d288346 100644 --- a/src/zen/urlbar/ZenUBGlobalActions.sys.mjs +++ b/src/zen/urlbar/ZenUBGlobalActions.sys.mjs @@ -2,6 +2,12 @@ * 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/. */ +import { XPCOMUtils } from 'resource://gre/modules/XPCOMUtils.sys.mjs'; + +const lazy = {}; + +XPCOMUtils.defineLazyPreferenceGetter(lazy, 'currentTheme', 'zen.view.window.scheme', 2); + function isNotEmptyTab(window) { return !window.gBrowser.selectedTab.hasAttribute('zen-empty-tab'); } @@ -153,6 +159,30 @@ const globalActionsTemplate = [ command: 'Tools:Addons', icon: 'chrome://browser/skin/zen-icons/extension.svg', }, + { + label: 'Switch to Automatic Appearance', + command: () => Services.prefs.setIntPref('zen.view.window.scheme', 2), + icon: 'chrome://browser/skin/zen-icons/sparkles.svg', + isAvailable: () => { + return lazy.currentTheme !== 2; + }, + }, + { + label: 'Switch to Light Mode', + command: () => Services.prefs.setIntPref('zen.view.window.scheme', 1), + icon: 'chrome://browser/skin/zen-icons/face-sun.svg', + isAvailable: () => { + return lazy.currentTheme !== 1; + }, + }, + { + label: 'Switch to Dark Mode', + command: () => Services.prefs.setIntPref('zen.view.window.scheme', 0), + icon: 'chrome://browser/skin/zen-icons/moon-stars.svg', + isAvailable: () => { + return lazy.currentTheme !== 0; + }, + }, ]; export const globalActions = globalActionsTemplate.map((action) => ({ From 8b5325ba1c15cf8285a631292f204d63bd1dd2b0 Mon Sep 17 00:00:00 2001 From: Anodev-sudo <205236663+Anodev-sudo@users.noreply.github.com> Date: Sun, 9 Nov 2025 04:26:03 -0600 Subject: [PATCH 19/41] fix: Update incorrect element picker tooltip description, b=closes #8998, p=#11213 --- .../locales/en-US/toolbox-properties.patch | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/devtools/client/locales/en-US/toolbox-properties.patch diff --git a/src/devtools/client/locales/en-US/toolbox-properties.patch b/src/devtools/client/locales/en-US/toolbox-properties.patch new file mode 100644 index 000000000..3a8ae85fe --- /dev/null +++ b/src/devtools/client/locales/en-US/toolbox-properties.patch @@ -0,0 +1,18 @@ +diff --git a/devtools/client/locales/en-US/toolbox.properties b/devtools/client/locales/en-US/toolbox.properties +index d4f986b024d3505b8c151f8e0166a20ff1862c5d..b2fb69e8897abdacb090d5a6faca203656e7cd44 100644 +--- a/devtools/client/locales/en-US/toolbox.properties ++++ b/devtools/client/locales/en-US/toolbox.properties +@@ -66,11 +66,11 @@ toolbox.androidElementPicker.mac.tooltip=Pick an element from the Android phone + + # LOCALIZATION NOTE (toolbox.elementPicker.key) + # Key shortcut used to toggle the element picker. +-toolbox.elementPicker.key=CmdOrCtrl+Shift+C ++toolbox.elementPicker.key=CmdOrCtrl+Shift+L + + # LOCALIZATION NOTE (toolbox.elementPicker.mac.key) + # Key shortcut used to toggle the element picker for macOS. +-toolbox.elementPicker.mac.key=Cmd+Opt+C ++toolbox.elementPicker.mac.key=Cmd+Opt+L + + # LOCALIZATION NOTE (toolbox.viewCssSourceInStyleEditor.label) + # Used as a message in either tooltips or contextual menu items to open the From c3820012537fe2616b3842521fde825050f0e517 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sun, 9 Nov 2025 11:49:10 +0100 Subject: [PATCH 20/41] fix: Fixed pins not saving proprely, b=closes #11217, c=tabs --- src/zen/tabs/ZenPinnedTabManager.mjs | 4 ---- src/zen/tabs/ZenPinnedTabsStorage.mjs | 23 +++++++++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs index eebfadf06..779f3566b 100644 --- a/src/zen/tabs/ZenPinnedTabManager.mjs +++ b/src/zen/tabs/ZenPinnedTabManager.mjs @@ -778,10 +778,6 @@ return; } const existingPin = this._pinsCache.find((p) => p.uuid === pin.uuid); - if (existingPin && existingPin === pin) { - // We want to avoid unnecessary writes - return; - } if (existingPin) { Object.assign(existingPin, pin); } else { diff --git a/src/zen/tabs/ZenPinnedTabsStorage.mjs b/src/zen/tabs/ZenPinnedTabsStorage.mjs index 425dbf2d1..bc11213f7 100644 --- a/src/zen/tabs/ZenPinnedTabsStorage.mjs +++ b/src/zen/tabs/ZenPinnedTabsStorage.mjs @@ -2,6 +2,8 @@ // 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/. var ZenPinnedTabsStorage = { + _saveCache: [], + async init() { await this._ensureTable(); }, @@ -74,6 +76,22 @@ var ZenPinnedTabsStorage = { }, async savePin(pin, notifyObservers = true) { + // If we find the exact same pin in the cache, skip saving + const existingIndex = this._saveCache.findIndex((cachedPin) => cachedPin.uuid === pin.uuid); + if (existingIndex !== -1) { + const existingPin = this._saveCache[existingIndex]; + const isSame = Object.keys(pin).every((key) => pin[key] === existingPin[key]); + if (isSame) { + return; // No changes, skip saving + } else { + // Update the cached pin + this._saveCache[existingIndex] = pin; + } + } else { + // Add to cache + this._saveCache.push(pin); + } + const changedUUIDs = new Set(); await PlacesUtils.withConnectionWrapper('ZenPinnedTabsStorage.savePin', async (db) => { @@ -389,6 +407,11 @@ var ZenPinnedTabsStorage = { }, async removePin(uuid, notifyObservers = true) { + const cachedIndex = this._saveCache.findIndex((cachedPin) => cachedPin.uuid === uuid); + if (cachedIndex !== -1) { + this._saveCache.splice(cachedIndex, 1); + } + const changedUUIDs = [uuid]; await PlacesUtils.withConnectionWrapper('ZenPinnedTabsStorage.removePin', async (db) => { From 421adade520932ab040a09dff4bded4241b7629a Mon Sep 17 00:00:00 2001 From: Kyle Kincer <69128842+KyleKincer@users.noreply.github.com> Date: Sun, 9 Nov 2025 12:32:13 -0500 Subject: [PATCH 21/41] feat: Close tab and switch to recent tab when going back with no history, p=#11190 Co-authored-by: mr. m <91018726+mr-cheffy@users.noreply.github.com> --- .../browser/preferences/zen-preferences.ftl | 3 +++ prefs/zen/zen.yaml | 3 +++ .../base/content/browser-commands-js.patch | 19 +++++++++++--- .../content/browser-gestureSupport-js.patch | 13 ++++++++++ src/browser/base/content/browser-js.patch | 26 ++++++++++++++----- .../preferences/zenTabsManagement.inc.xhtml | 3 +++ src/zen/common/ZenCommonUtils.mjs | 15 +++++++++++ 7 files changed, 72 insertions(+), 10 deletions(-) create mode 100644 src/browser/base/content/browser-gestureSupport-js.patch diff --git a/locales/en-US/browser/browser/preferences/zen-preferences.ftl b/locales/en-US/browser/browser/preferences/zen-preferences.ftl index ea49e2517..d053124e2 100644 --- a/locales/en-US/browser/browser/preferences/zen-preferences.ftl +++ b/locales/en-US/browser/browser/preferences/zen-preferences.ftl @@ -56,6 +56,9 @@ pane-settings-workspaces-title = Workspaces zen-tabs-unloader-enabled = .label = Enable Tab Unloader +zen-tabs-close-on-back-with-no-history = + .label = Close tab and switch to its owner tab (or most recently used tab) when going back with no history + zen-look-and-feel-compact-toolbar-themed = .label = Use themed background for compact toolbar diff --git a/prefs/zen/zen.yaml b/prefs/zen/zen.yaml index 469622931..c44a0e626 100644 --- a/prefs/zen/zen.yaml +++ b/prefs/zen/zen.yaml @@ -34,3 +34,6 @@ - name: zen.tabs.open-pinned-in-new-tab value: true + +- name: zen.tabs.close-on-back-with-no-history + value: true diff --git a/src/browser/base/content/browser-commands-js.patch b/src/browser/base/content/browser-commands-js.patch index a475e0749..3c0aabfee 100644 --- a/src/browser/base/content/browser-commands-js.patch +++ b/src/browser/base/content/browser-commands-js.patch @@ -1,8 +1,19 @@ diff --git a/browser/base/content/browser-commands.js b/browser/base/content/browser-commands.js -index 939ca497b882b3f4200141ba1b6764fb5c846f45..36c830a503b004c0a332340f686c86cad68e9381 100644 +index 939ca497b882b3f4200141ba1b6764fb5c846f45..779cba5ff3df856a246321a36caa3725c054a314 100644 --- a/browser/base/content/browser-commands.js +++ b/browser/base/content/browser-commands.js -@@ -315,6 +315,10 @@ var BrowserCommands = { +@@ -14,6 +14,10 @@ var BrowserCommands = { + const where = BrowserUtils.whereToOpenLink(aEvent, false, true); + + if (where == "current") { ++ if (!gBrowser.webNavigation.canGoBack && gZenCommonActions.shouldCloseTabOnBack()) { ++ gBrowser.removeTab(gBrowser.selectedTab); ++ return; ++ } + try { + gBrowser.goBack(); + } catch (ex) {} +@@ -315,6 +319,10 @@ var BrowserCommands = { } } @@ -13,7 +24,7 @@ index 939ca497b882b3f4200141ba1b6764fb5c846f45..36c830a503b004c0a332340f686c86ca // A notification intended to be useful for modular peformance tracking // starting as close as is reasonably possible to the time when the user // expressed the intent to open a new tab. Since there are a lot of -@@ -399,6 +403,11 @@ var BrowserCommands = { +@@ -399,6 +407,11 @@ var BrowserCommands = { return; } @@ -25,7 +36,7 @@ index 939ca497b882b3f4200141ba1b6764fb5c846f45..36c830a503b004c0a332340f686c86ca // Keyboard shortcuts that would close a tab that is pinned select the first // unpinned tab instead. if ( -@@ -406,8 +415,8 @@ var BrowserCommands = { +@@ -406,8 +419,8 @@ var BrowserCommands = { (event.ctrlKey || event.metaKey || event.altKey) && gBrowser.selectedTab.pinned ) { diff --git a/src/browser/base/content/browser-gestureSupport-js.patch b/src/browser/base/content/browser-gestureSupport-js.patch new file mode 100644 index 000000000..ef205d5df --- /dev/null +++ b/src/browser/base/content/browser-gestureSupport-js.patch @@ -0,0 +1,13 @@ +diff --git a/browser/base/content/browser-gestureSupport.js b/browser/base/content/browser-gestureSupport.js +index a28d54bf72c0e6495b9586f220d1859aac794936..66154668b9f85ffbaacea1e8351370659260227b 100644 +--- a/browser/base/content/browser-gestureSupport.js ++++ b/browser/base/content/browser-gestureSupport.js +@@ -832,7 +832,7 @@ var gHistorySwipeAnimation = { + * @return true if there is a previous page in history, false otherwise. + */ + canGoBack: function HSA_canGoBack() { +- return gBrowser.webNavigation.canGoBack; ++ return gBrowser.webNavigation.canGoBack || gZenCommonActions.shouldCloseTabOnBack(); + }, + + /** diff --git a/src/browser/base/content/browser-js.patch b/src/browser/base/content/browser-js.patch index 8d2658275..4165d22e5 100644 --- a/src/browser/base/content/browser-js.patch +++ b/src/browser/base/content/browser-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js -index b4b79e7fb3228ba91bd8afa08659be0d88883725..9e1d59b6a736107e55bda73686a4a627e4c0ba7c 100644 +index b4b79e7fb3228ba91bd8afa08659be0d88883725..b4801e2a3076139622d58f81943e61cd61ee1828 100644 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -31,6 +31,7 @@ ChromeUtils.defineESModuleGetters(this, { @@ -10,7 +10,21 @@ index b4b79e7fb3228ba91bd8afa08659be0d88883725..9e1d59b6a736107e55bda73686a4a627 DevToolsSocketStatus: "resource://devtools/shared/security/DevToolsSocketStatus.sys.mjs", DownloadUtils: "resource://gre/modules/DownloadUtils.sys.mjs", -@@ -2298,6 +2299,8 @@ var XULBrowserWindow = { +@@ -822,7 +823,12 @@ function UpdateBackForwardCommands(aWebNavigation) { + + var backDisabled = backCommand.hasAttribute("disabled"); + var forwardDisabled = forwardCommand.hasAttribute("disabled"); +- if (backDisabled == aWebNavigation.canGoBack) { ++ var canGoBack = aWebNavigation.canGoBack; ++ if (!canGoBack) { ++ canGoBack = gZenCommonActions.shouldCloseTabOnBack(); ++ } ++ ++ if (backDisabled == canGoBack) { + if (backDisabled) { + backCommand.removeAttribute("disabled"); + } else { +@@ -2298,6 +2304,8 @@ var XULBrowserWindow = { AboutReaderParent.updateReaderButton(gBrowser.selectedBrowser); TranslationsParent.onLocationChange(gBrowser.selectedBrowser); @@ -19,7 +33,7 @@ index b4b79e7fb3228ba91bd8afa08659be0d88883725..9e1d59b6a736107e55bda73686a4a627 PictureInPicture.updateUrlbarToggle(gBrowser.selectedBrowser); if (!gMultiProcessBrowser) { -@@ -3809,7 +3812,7 @@ function warnAboutClosingWindow() { +@@ -3809,7 +3817,7 @@ function warnAboutClosingWindow() { if (!isPBWindow && !toolbar.visible) { return gBrowser.warnAboutClosingTabs( @@ -28,7 +42,7 @@ index b4b79e7fb3228ba91bd8afa08659be0d88883725..9e1d59b6a736107e55bda73686a4a627 gBrowser.closingTabsEnum.ALL ); } -@@ -3849,7 +3852,7 @@ function warnAboutClosingWindow() { +@@ -3849,7 +3857,7 @@ function warnAboutClosingWindow() { return ( isPBWindow || gBrowser.warnAboutClosingTabs( @@ -37,7 +51,7 @@ index b4b79e7fb3228ba91bd8afa08659be0d88883725..9e1d59b6a736107e55bda73686a4a627 gBrowser.closingTabsEnum.ALL ) ); -@@ -3874,7 +3877,7 @@ function warnAboutClosingWindow() { +@@ -3874,7 +3882,7 @@ function warnAboutClosingWindow() { AppConstants.platform != "macosx" || isPBWindow || gBrowser.warnAboutClosingTabs( @@ -46,7 +60,7 @@ index b4b79e7fb3228ba91bd8afa08659be0d88883725..9e1d59b6a736107e55bda73686a4a627 gBrowser.closingTabsEnum.ALL ) ); -@@ -4796,6 +4799,9 @@ var ConfirmationHint = { +@@ -4796,6 +4804,9 @@ var ConfirmationHint = { MozXULElement.insertFTLIfNeeded("toolkit/branding/brandings.ftl"); MozXULElement.insertFTLIfNeeded("browser/confirmationHints.ftl"); document.l10n.setAttributes(this._message, messageId, options.l10nArgs); diff --git a/src/browser/components/preferences/zenTabsManagement.inc.xhtml b/src/browser/components/preferences/zenTabsManagement.inc.xhtml index b8693566f..2943b863b 100644 --- a/src/browser/components/preferences/zenTabsManagement.inc.xhtml +++ b/src/browser/components/preferences/zenTabsManagement.inc.xhtml @@ -26,6 +26,9 @@ + f.apply(this, args), delay); }; }, + + /** + * Determines if a tab should be closed when navigating back with no history. + * Only tabs with an owner that are not pinned and not empty are eligible. + * Respects the user preference zen.tabs.close-on-back-with-no-history. + * + * @return {boolean} True if the tab should be closed on back + */ + shouldCloseTabOnBack() { + if (!Services.prefs.getBoolPref('zen.tabs.close-on-back-with-no-history', true)) { + return false; + } + const tab = gBrowser.selectedTab; + return Boolean(tab.owner && !tab.pinned && !tab.hasAttribute('zen-empty-tab')); + }, }; From 5ecfc745daa96e8f37737199dff156868581ecc1 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Mon, 10 Nov 2025 00:08:02 +0100 Subject: [PATCH 22/41] fix: Fixed border radius regresion with `ff 145.0`, b=no-bug, c=tabs --- src/zen/tabs/zen-tabs/vertical-tabs.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/zen/tabs/zen-tabs/vertical-tabs.css b/src/zen/tabs/zen-tabs/vertical-tabs.css index e9de513cb..975acad6e 100644 --- a/src/zen/tabs/zen-tabs/vertical-tabs.css +++ b/src/zen/tabs/zen-tabs/vertical-tabs.css @@ -902,7 +902,8 @@ } .tab-reset-button, -.tab-reset-pin-button { +.tab-reset-pin-button, +.tab-close-button { display: none; -moz-context-properties: fill, fill-opacity; border-radius: var(--tab-border-radius); From 57e63a44563f3c90bf3452575f75e76e8461d6a9 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Mon, 10 Nov 2025 01:48:47 +0100 Subject: [PATCH 23/41] chore: New Crowdin updates, p=#11127 * New translations zen-preferences.ftl (Polish) * New translations zen-preferences.ftl (Portuguese) * New translations zen-workspaces.ftl (Polish) * New translations zen-workspaces.ftl (Portuguese) * New translations zen-workspaces.ftl (Dutch) * New translations zen-general.ftl (Dutch) * New translations zen-vertical-tabs.ftl (Dutch) * New translations zen-preferences.ftl (German) * New translations zen-preferences.ftl (Dutch) * New translations zen-workspaces.ftl (German) * New translations zen-workspaces.ftl (Dutch) * New translations zen-general.ftl (German) * New translations zen-general.ftl (Dutch) * New translations zen-split-view.ftl (Dutch) * New translations zen-welcome.ftl (Dutch) * New translations zen-folders.ftl (Dutch) * New translations zen-preferences.ftl (Vietnamese) * New translations zen-workspaces.ftl (Vietnamese) * New translations zen-general.ftl (Vietnamese) * New translations zen-vertical-tabs.ftl (Vietnamese) * New translations zen-welcome.ftl (Vietnamese) * New translations zen-folders.ftl (Vietnamese) * New translations zen-preferences.ftl (Portuguese, Brazilian) * New translations zen-workspaces.ftl (Portuguese, Brazilian) * New translations zen-general.ftl (Portuguese, Brazilian) --- .../browser/preferences/zen-preferences.ftl | 2 +- locales/de/browser/browser/zen-general.ftl | 12 ++-- locales/de/browser/browser/zen-workspaces.ftl | 6 +- .../browser/preferences/zen-preferences.ftl | 28 ++++----- locales/nl/browser/browser/zen-folders.ftl | 8 +-- locales/nl/browser/browser/zen-general.ftl | 58 +++++++++---------- locales/nl/browser/browser/zen-split-view.ftl | 2 +- .../nl/browser/browser/zen-vertical-tabs.ftl | 2 +- locales/nl/browser/browser/zen-welcome.ftl | 2 +- locales/nl/browser/browser/zen-workspaces.ftl | 16 ++--- .../browser/preferences/zen-preferences.ftl | 2 +- locales/pl/browser/browser/zen-workspaces.ftl | 6 +- .../browser/preferences/zen-preferences.ftl | 4 +- locales/pt-BR/browser/browser/zen-general.ftl | 26 ++++----- .../pt-BR/browser/browser/zen-workspaces.ftl | 6 +- .../browser/preferences/zen-preferences.ftl | 2 +- .../pt-PT/browser/browser/zen-workspaces.ftl | 6 +- .../browser/preferences/zen-preferences.ftl | 6 +- locales/vi/browser/browser/zen-folders.ftl | 2 +- locales/vi/browser/browser/zen-general.ftl | 56 +++++++++--------- .../vi/browser/browser/zen-vertical-tabs.ftl | 6 +- locales/vi/browser/browser/zen-welcome.ftl | 4 +- locales/vi/browser/browser/zen-workspaces.ftl | 10 ++-- 23 files changed, 136 insertions(+), 136 deletions(-) diff --git a/locales/de/browser/browser/preferences/zen-preferences.ftl b/locales/de/browser/browser/preferences/zen-preferences.ftl index 8bfea60c9..e9160ee84 100644 --- a/locales/de/browser/browser/preferences/zen-preferences.ftl +++ b/locales/de/browser/browser/preferences/zen-preferences.ftl @@ -304,4 +304,4 @@ zen-devtools-toggle-performance-shortcut = Performance umschalten zen-devtools-toggle-storage-shortcut = Speicher umschalten zen-devtools-toggle-dom-shortcut = DOM umschalten zen-devtools-toggle-accessibility-shortcut = Barrierefreiheit umschalten -zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs +zen-close-all-unpinned-tabs-shortcut = Alle nicht angehefteten Tabs schließen diff --git a/locales/de/browser/browser/zen-general.ftl b/locales/de/browser/browser/zen-general.ftl index fb06a3b31..0fdabed61 100644 --- a/locales/de/browser/browser/zen-general.ftl +++ b/locales/de/browser/browser/zen-general.ftl @@ -63,8 +63,8 @@ zen-generic-next = Weiter # These labels will be used for the site data panel settings zen-site-data-setting-allow = Erlaubt zen-site-data-setting-block = Blockiert -zen-site-data-protections-enabled = Enabled -zen-site-data-protections-disabled = Disabled +zen-site-data-protections-enabled = Aktiviert +zen-site-data-protections-disabled = Deaktiviert zen-site-data-setting-cross-site = Cross-Site-Cookie zen-site-data-security-info-extension = .label = Erweiterung @@ -79,13 +79,13 @@ zen-site-data-get-addons = zen-site-data-site-settings = .label = Alle Website-Einstellungen zen-site-data-header-share = - .tooltiptext = Share This Page + .tooltiptext = Diese Seite teilen zen-site-data-header-reader-mode = - .tooltiptext = Enter Reader Mode + .tooltiptext = Lesemodus aktivieren zen-site-data-header-screenshot = - .tooltiptext = Take a Screenshot + .tooltiptext = Screenshot erstellen zen-site-data-header-bookmark = - .tooltiptext = Bookmark This Page + .tooltiptext = Diese Seite als Lesezeichen hinzufügen zen-urlbar-copy-url-button = .tooltiptext = URL kopieren zen-site-data-setting-site-protection = Tracking-Schutz diff --git a/locales/de/browser/browser/zen-workspaces.ftl b/locales/de/browser/browser/zen-workspaces.ftl index a6975eb99..ac3ab82f7 100644 --- a/locales/de/browser/browser/zen-workspaces.ftl +++ b/locales/de/browser/browser/zen-workspaces.ftl @@ -59,7 +59,7 @@ zen-workspaces-delete-workspace-title = Arbeitsbereich löschen? zen-workspaces-delete-workspace-body = Sind Sie sicher, dass Sie { $name } löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden. # Note that the html tag MUST not be changed or removed, as it is used to better # display the shortcut in the toast notification. -zen-workspaces-close-all-unpinned-tabs-toast = Tabs Closed! Use { $shortcut } to undo. +zen-workspaces-close-all-unpinned-tabs-toast = Tabs geschlossen! Nutze { $shortcut } , um rückgängig zu machen. zen-workspaces-close-all-unpinned-tabs-title = - .label = Clear - .tooltiptext = Close all unpinned tabs + .label = Löschen + .tooltiptext = Alle nicht angehefteten Tabs schließen diff --git a/locales/nl/browser/browser/preferences/zen-preferences.ftl b/locales/nl/browser/browser/preferences/zen-preferences.ftl index 010497161..ce5e2d83b 100644 --- a/locales/nl/browser/browser/preferences/zen-preferences.ftl +++ b/locales/nl/browser/browser/preferences/zen-preferences.ftl @@ -30,8 +30,8 @@ zen-glance-trigger-shift-click = .label = Shift + klik zen-glance-trigger-meta-click = .label = Windows (Command) + klik -zen-look-and-feel-compact-view-header = Toon in compacte weergave -zen-look-and-feel-compact-view-description = Toon alleen de werkbalken die je gebruikt! +zen-look-and-feel-compact-view-header = Weergeven in compacte weergave +zen-look-and-feel-compact-view-description = Alleen de werkbalken weergeven die je gebruikt! zen-look-and-feel-compact-view-enabled = .label = { -brand-short-name }'s compacte modus inschakelen zen-look-and-feel-compact-view-top-toolbar = @@ -45,7 +45,7 @@ pane-settings-workspaces-title = Werkruimtes zen-tabs-unloader-enabled = .label = Tabblad ontlader inschakelen zen-look-and-feel-compact-toolbar-themed = - .label = Use themed background for compact toolbar + .label = Gebruik thema achtergrond voor compacte werkbalk zen-workspace-continue-where-left-off = .label = Verdergaan waar je was gebleven pane-zen-pinned-tab-manager-title = Vastgezette tabbladen @@ -76,7 +76,7 @@ zen-settings-workspaces-enabled = zen-settings-workspaces-hide-default-container-indicator = .label = Verberg de standaard container indicator in de tabbladbalk zen-key-unsaved = Snelkoppeling is niet opgeslagen! Bewaar deze door op de "Escape" knop te drukken na het opnieuw typen. -zen-key-conflict = Conflicts with { $group } -> { $shortcut } +zen-key-conflict = Conflicten met { $group } -> { $shortcut } pane-zen-theme-title = Thema instellingen zen-vertical-tabs-title = Zijbalk en tabbladen lay-out zen-vertical-tabs-header = Verticale tabbladen @@ -84,9 +84,9 @@ zen-vertical-tabs-description = Beheer je tabbladen in een verticale lay-out zen-vertical-tabs-show-expand-button = .label = Uitbreiden knop weergeven zen-vertical-tabs-newtab-on-tab-list = - .label = Laat nieuwe tabblad knop zien op de tabblad lijst + .label = Laat nieuwe tabblad knop zien op de tabbladlijst zen-vertical-tabs-newtab-top-button-up = - .label = Verplaats de nieuwe tab knop naar boven + .label = Verplaats de nieuwe tabblad knop naar boven zen-vertical-tabs-expand-tabs-by-default = Tabbladen standaard uitbreiden zen-vertical-tabs-dont-expand-tabs-by-default = Tabbladen niet standaard uitbreiden zen-vertical-tabs-expand-tabs-on-hover = Tabbladen uitbreiden bij hoveren (werkt niet in compacte modus) @@ -130,7 +130,7 @@ zen-themes-auto-update = zen-settings-workspaces-force-container-tabs-to-workspace = .label = Schakel over naar de werkruimte waar container als standaard is ingesteld bij het openen van container tabbladen zen-theme-marketplace-link = Winkel bezoeken -zen-dark-theme-styles-header = Donkere thema stijlen +zen-dark-theme-styles-header = Donker thema stijlen zen-dark-theme-styles-description = Pas het donker thema aan naar jouw voorkeur zen-dark-theme-styles-amoled = Nacht thema zen-dark-theme-styles-default = Standaard donker thema @@ -223,7 +223,7 @@ zen-key-exit-full-screen = Volledig scherm afsluiten zen-ai-chatbot-sidebar-shortcut = AI-chatbot zijbalk togglen zen-key-inspector-mac = Inspector (Mac) togglen zen-toggle-sidebar-shortcut = Firefox zijbalk togglen -zen-toggle-pin-tab-shortcut = Toggle Pin Tab +zen-toggle-pin-tab-shortcut = Tabblad vastzetten togglen zen-reader-mode-toggle-shortcut-other = Leesmodus togglen zen-picture-in-picture-toggle-shortcut = Beeld-in-beeld togglen zen-nav-reload-shortcut-2 = Pagina opnieuw laden @@ -234,7 +234,7 @@ zen-find-shortcut = Vinden op pagina zen-search-find-again-shortcut = Opnieuw zoeken zen-search-find-again-shortcut-prev = Vorige vinden zen-search-find-again-shortcut-2 = Opnieuw zoeken (alternatief) -zen-bookmark-this-page-shortcut = Bladwijzer deze pagina +zen-bookmark-this-page-shortcut = Bladwijzer toevoegen voor deze pagina zen-bookmark-show-library-shortcut = Bladwijzerbibliotheek weergeven zen-key-stop = Laden stoppen zen-full-zoom-reduce-shortcut = Uitzoomen @@ -248,8 +248,8 @@ zen-private-browsing-shortcut = Privé browsen zen-screenshot-shortcut = Schermafbeelding maken zen-key-sanitize = Browsergegevens wissen zen-quit-app-shortcut = Applicatie afsluiten -zen-key-wr-capture-cmd = WR opname opdracht -zen-key-wr-toggle-capture-sequence-cmd = WR opnamereeks togglen +zen-key-wr-capture-cmd = WR-opname opdracht +zen-key-wr-toggle-capture-sequence-cmd = WR-opnamereeks togglen zen-nav-reload-shortcut = Pagina opnieuw laden zen-nav-reload-shortcut-skip-cache = Pagina opnieuw laden (Cache overslaan) zen-close-shortcut = Venster sluiten @@ -257,7 +257,7 @@ zen-close-tab-shortcut = Tabblad sluiten zen-compact-mode-shortcut-show-sidebar = Zwevende zijbalk togglen zen-compact-mode-shortcut-show-toolbar = Zwevende werkbalk togglen zen-compact-mode-shortcut-toggle = Compacte modus togglen -zen-glance-expand = Expand Glance +zen-glance-expand = Snel bekijken uitbreiden zen-workspace-shortcut-switch-1 = Schakelen naar werkruimte 1 zen-workspace-shortcut-switch-2 = Schakelen naar werkruimte 2 zen-workspace-shortcut-switch-3 = Schakelen naar werkruimte 3 @@ -276,7 +276,7 @@ zen-split-view-shortcut-grid = Gesplitste weergave raster togglen zen-split-view-shortcut-vertical = Gesplitste weergave verticaal togglen zen-split-view-shortcut-horizontal = Gesplitste weergave horizontaal togglen zen-split-view-shortcut-unsplit = Gesplitste weergave sluiten -zen-new-empty-split-view-shortcut = New Empty Split View +zen-new-empty-split-view-shortcut = Nieuwe lege gesplitste weergave zen-key-select-tab-1 = Selecteer tabblad #1 zen-key-select-tab-2 = Selecteer tabblad #2 zen-key-select-tab-3 = Selecteer tabblad #3 @@ -304,4 +304,4 @@ zen-devtools-toggle-performance-shortcut = Prestaties togglen zen-devtools-toggle-storage-shortcut = Opslag togglen zen-devtools-toggle-dom-shortcut = DOM togglen zen-devtools-toggle-accessibility-shortcut = Toegankelijkheid togglen -zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs +zen-close-all-unpinned-tabs-shortcut = Alle niet-vastgezette tabbladen sluiten diff --git a/locales/nl/browser/browser/zen-folders.ftl b/locales/nl/browser/browser/zen-folders.ftl index 7b537e981..eb7064a9a 100644 --- a/locales/nl/browser/browser/zen-folders.ftl +++ b/locales/nl/browser/browser/zen-folders.ftl @@ -3,7 +3,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. zen-folders-search-placeholder = - .placeholder = Zoek { $folder-name }... + .placeholder = { $folder-name } zoeken... zen-folders-panel-rename-folder = .label = Map hernoemen zen-folders-panel-unpack-folder = @@ -19,7 +19,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Wijzig pictogram zen-folders-unload-all-tooltip = - .tooltiptext = Unload active in this folder + .tooltiptext = Actieven ontladen in deze map zen-folders-unload-folder = - .label = Unload All Tabs -zen-folders-search-no-results = No tabs matching that search 🤔 + .label = Alle tabbladen ontladen +zen-folders-search-no-results = Geen tabbladen die overeenkomen met die zoekopdracht 🤔 diff --git a/locales/nl/browser/browser/zen-general.ftl b/locales/nl/browser/browser/zen-general.ftl index f3bd6f4a0..7b96f0d81 100644 --- a/locales/nl/browser/browser/zen-general.ftl +++ b/locales/nl/browser/browser/zen-general.ftl @@ -28,7 +28,7 @@ pictureinpicture-minimize-btn = .tooltip = Minimaliseren zen-panel-ui-gradient-generator-custom-color = Aangepaste kleur zen-panel-ui-gradient-generator-saved-message = Verloop is succesvol opgeslagen! -zen-copy-current-url-confirmation = Copied current URL! +zen-copy-current-url-confirmation = Huidige URL gekopieerd! zen-general-cancel-label = .label = Annuleren zen-general-confirm = @@ -42,8 +42,8 @@ zen-library-sidebar-workspaces = zen-library-sidebar-mods = .label = Mods zen-toggle-compact-mode-button = - .label = Compact Mode - .tooltiptext = Toggle Compact Mode + .label = Compacte modus + .tooltiptext = Compacte modus togglen # note: Do not translate the "
" tags in the following string @@ -52,45 +52,45 @@ zen-close-label = Sluiten zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = Zoeken… zen-icons-picker-emoji = - .label = Emojis + .label = Emoji's zen-icons-picker-svg = - .label = Icons -urlbar-search-mode-zen_actions = Actions -zen-site-data-settings = Settings -zen-generic-manage = Manage -zen-generic-more = More -zen-generic-next = Next + .label = Iconen +urlbar-search-mode-zen_actions = Acties +zen-site-data-settings = Instellingen +zen-generic-manage = Beheren +zen-generic-more = Meer +zen-generic-next = Volgende # These labels will be used for the site data panel settings -zen-site-data-setting-allow = Allowed -zen-site-data-setting-block = Blocked -zen-site-data-protections-enabled = Enabled -zen-site-data-protections-disabled = Disabled -zen-site-data-setting-cross-site = Cross-Site cookie +zen-site-data-setting-allow = Toegestaan +zen-site-data-setting-block = Geblokkeerd +zen-site-data-protections-enabled = Ingeschakeld +zen-site-data-protections-disabled = Uitgeschakeld +zen-site-data-setting-cross-site = Cross-site cookie zen-site-data-security-info-extension = - .label = Extension + .label = Extensie zen-site-data-security-info-secure = - .label = Secure + .label = Beveiligd zen-site-data-security-info-not-secure = - .label = Not Secure + .label = Niet beveiligd zen-site-data-manage-addons = - .label = Manage Extensions + .label = Extensies beheren zen-site-data-get-addons = - .label = Add Extensions + .label = Extensies toevoegen zen-site-data-site-settings = - .label = All Site Settings + .label = Alle site-instellingen zen-site-data-header-share = - .tooltiptext = Share This Page + .tooltiptext = Deze pagina delen zen-site-data-header-reader-mode = - .tooltiptext = Enter Reader Mode + .tooltiptext = Leesmodus openen zen-site-data-header-screenshot = - .tooltiptext = Take a Screenshot + .tooltiptext = Maak een schermafbeelding zen-site-data-header-bookmark = - .tooltiptext = Bookmark This Page + .tooltiptext = Bladwijzer toevoegen voor deze pagina zen-urlbar-copy-url-button = - .tooltiptext = Copy URL -zen-site-data-setting-site-protection = Tracking Protection + .tooltiptext = URL kopiëren +zen-site-data-setting-site-protection = Tracking bescherming # Section: Feature callouts -zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more -zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions. +zen-site-data-panel-feature-callout-title = Een nieuw thuis voor add-ons, machtigingen en meer +zen-site-data-panel-feature-callout-subtitle = Klik op het icoon om de site-instellingen te beheren, beveiligingsinfo te bekijken, extensies te openen en gemeenschappelijke acties uit te voeren. diff --git a/locales/nl/browser/browser/zen-split-view.ftl b/locales/nl/browser/browser/zen-split-view.ftl index d0f5b1eec..d625c1de9 100644 --- a/locales/nl/browser/browser/zen-split-view.ftl +++ b/locales/nl/browser/browser/zen-split-view.ftl @@ -15,6 +15,6 @@ zen-split-link = zen-split-view-modifier-header = Gesplitste weergave zen-split-view-modifier-activate-reallocation = .label = Herverdeling activeren -zen-split-view-modifier-enabled-toast = Geplitste weergave herschikken staat AAN. +zen-split-view-modifier-enabled-toast = Gesplitste weergave herschikken staat AAN. zen-split-view-modifier-enabled-toast-description = Sleep de tabbladen om de weergave te herschikken. Druk op Esc om af te sluiten. zen-split-view-modifier-disabled-toast = Geplitste weergave herschikken staat UIT. diff --git a/locales/nl/browser/browser/zen-vertical-tabs.ftl b/locales/nl/browser/browser/zen-vertical-tabs.ftl index 57df55699..49979e38c 100644 --- a/locales/nl/browser/browser/zen-vertical-tabs.ftl +++ b/locales/nl/browser/browser/zen-vertical-tabs.ftl @@ -18,7 +18,7 @@ zen-toolbar-context-compact-mode-hide-both = .label = Beide verbergen .accesskey = U zen-toolbar-context-new-folder = - .label = New Folder + .label = Nieuwe map .accesskey = N sidebar-zen-expand = .label = Zijbalk uitklappen diff --git a/locales/nl/browser/browser/zen-welcome.ftl b/locales/nl/browser/browser/zen-welcome.ftl index b1a2c3270..011213fb0 100644 --- a/locales/nl/browser/browser/zen-welcome.ftl +++ b/locales/nl/browser/browser/zen-welcome.ftl @@ -6,7 +6,7 @@ zen-welcome-title-line1 = Welkom bij zen-welcome-title-line2 = een rustiger internet zen-welcome-import-title = Een frisse start, dezelfde bladwijzers zen-welcome-import-description-1 = Je bladwijzers, geschiedenis en wachtwoorden zijn als een spoor van broodkruimels door het internet - laat ze niet achter! -zen-welcome-import-description-2 = Easily bring them over from another browser and pick up right where you left off.. +zen-welcome-import-description-2 = Breng ze eenvoudig over vanuit een andere browser en ga verder waar je was gebleven. zen-welcome-import-button = Nu importeren zen-welcome-set-default-browser = { -brand-short-name } instellen als standaardbrowser zen-welcome-dont-set-default-browser = { -brand-short-name } NIET instellen als standaardbrowser diff --git a/locales/nl/browser/browser/zen-workspaces.ftl b/locales/nl/browser/browser/zen-workspaces.ftl index f6e77c336..a9f3b3f0e 100644 --- a/locales/nl/browser/browser/zen-workspaces.ftl +++ b/locales/nl/browser/browser/zen-workspaces.ftl @@ -6,20 +6,20 @@ zen-panel-ui-workspaces-text = Ruimtes zen-panel-ui-workspaces-create = .label = Ruimte aanmaken zen-panel-ui-folder-create = - .label = Create Folder + .label = Map aanmaken zen-panel-ui-new-empty-split = - .label = New Split + .label = Nieuwe splitsing zen-workspaces-panel-context-delete = .label = Ruimte verwijderen .accesskey = D zen-workspaces-panel-change-name = .label = Naam wijzigen zen-workspaces-panel-change-icon = - .label = Icon wijzigen + .label = Icoon wijzigen zen-workspaces-panel-context-default-profile = .label = Profiel instellen zen-workspaces-panel-unload = - .label = Unload Space + .label = Ruimte ontladen zen-workspaces-how-to-reorder-title = Hoe ruimtes te herschikken zen-workspaces-how-to-reorder-desc = Sleep het ruimte icoon onderaan de zijbalk om ze te herschikken zen-workspaces-change-theme = @@ -56,10 +56,10 @@ zen-workspace-creation-profile = Profiel zen-workspace-creation-header = Maak een ruimte zen-workspace-creation-label = Ruimtes worden gebruikt om je tabbladen en sessies te organiseren. zen-workspaces-delete-workspace-title = Ruimte verwijderen? -zen-workspaces-delete-workspace-body = Are you sure you want to delete { $name }? This action cannot be undone. +zen-workspaces-delete-workspace-body = Weet je zeker dat je { $name } wilt verwijderen? Deze actie kan niet ongedaan gemaakt worden. # Note that the html tag MUST not be changed or removed, as it is used to better # display the shortcut in the toast notification. -zen-workspaces-close-all-unpinned-tabs-toast = Tabs Closed! Use { $shortcut } to undo. +zen-workspaces-close-all-unpinned-tabs-toast = Tabbladen gesloten! Gebruik { $shortcut } om ongedaan te maken. zen-workspaces-close-all-unpinned-tabs-title = - .label = Clear - .tooltiptext = Close all unpinned tabs + .label = Wissen + .tooltiptext = Alle niet-vastgezette tabbladen sluiten diff --git a/locales/pl/browser/browser/preferences/zen-preferences.ftl b/locales/pl/browser/browser/preferences/zen-preferences.ftl index da9f785fd..18d5426b4 100644 --- a/locales/pl/browser/browser/preferences/zen-preferences.ftl +++ b/locales/pl/browser/browser/preferences/zen-preferences.ftl @@ -304,4 +304,4 @@ zen-devtools-toggle-performance-shortcut = Włącz Wydajność zen-devtools-toggle-storage-shortcut = Włącz Pamięć zen-devtools-toggle-dom-shortcut = Włącz DOM zen-devtools-toggle-accessibility-shortcut = Włącz Dostępność -zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs +zen-close-all-unpinned-tabs-shortcut = Zamknij wszystkie nieprzypięte karty diff --git a/locales/pl/browser/browser/zen-workspaces.ftl b/locales/pl/browser/browser/zen-workspaces.ftl index 8e473a525..1ac1d8c51 100644 --- a/locales/pl/browser/browser/zen-workspaces.ftl +++ b/locales/pl/browser/browser/zen-workspaces.ftl @@ -59,7 +59,7 @@ zen-workspaces-delete-workspace-title = Usunąć Przestrzeń roboczą? zen-workspaces-delete-workspace-body = Czy na pewno chcesz usunąć { $name }? Tej czynności nie można cofnąć. # Note that the html tag MUST not be changed or removed, as it is used to better # display the shortcut in the toast notification. -zen-workspaces-close-all-unpinned-tabs-toast = Tabs Closed! Use { $shortcut } to undo. +zen-workspaces-close-all-unpinned-tabs-toast = Zamknięto karty! Użyj { $shortcut } aby przywrócić. zen-workspaces-close-all-unpinned-tabs-title = - .label = Clear - .tooltiptext = Close all unpinned tabs + .label = Wyczyść + .tooltiptext = Zamknij wszystkie nieprzypięte karty diff --git a/locales/pt-BR/browser/browser/preferences/zen-preferences.ftl b/locales/pt-BR/browser/browser/preferences/zen-preferences.ftl index 8cc5f1c4c..b10064b75 100644 --- a/locales/pt-BR/browser/browser/preferences/zen-preferences.ftl +++ b/locales/pt-BR/browser/browser/preferences/zen-preferences.ftl @@ -76,7 +76,7 @@ zen-settings-workspaces-enabled = zen-settings-workspaces-hide-default-container-indicator = .label = Ocultar o indicador padrão do contêiner na barra de guias zen-key-unsaved = Atalho não salvo! Proteja-o clicando na tecla "Escape" após digitá-lo novamente. -zen-key-conflict = Conflicts with { $group } -> { $shortcut } +zen-key-conflict = Conflitos com { $group } -> { $shortcut } pane-zen-theme-title = Opções de tema zen-vertical-tabs-title = Layout de barra lateral e abas zen-vertical-tabs-header = Abas verticais @@ -304,4 +304,4 @@ zen-devtools-toggle-performance-shortcut = Ativar/Desativar Desempenho zen-devtools-toggle-storage-shortcut = Ativar/Desativar Armazenamento zen-devtools-toggle-dom-shortcut = Ativar/Desativar DOM zen-devtools-toggle-accessibility-shortcut = Ativar/Desativar Acessibilidade -zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs +zen-close-all-unpinned-tabs-shortcut = Fechar Todas as Abas Não Fixadas diff --git a/locales/pt-BR/browser/browser/zen-general.ftl b/locales/pt-BR/browser/browser/zen-general.ftl index 48eef77f8..26630077e 100644 --- a/locales/pt-BR/browser/browser/zen-general.ftl +++ b/locales/pt-BR/browser/browser/zen-general.ftl @@ -26,7 +26,7 @@ pictureinpicture-minimize-btn = .tooltip = Minimizar zen-panel-ui-gradient-generator-custom-color = Cor Personalizada zen-panel-ui-gradient-generator-saved-message = O gradiente foi salvo com sucesso! -zen-copy-current-url-confirmation = Copied current URL! +zen-copy-current-url-confirmation = URL atual copiada! zen-general-cancel-label = .label = Cancelar zen-general-confirm = @@ -57,13 +57,13 @@ urlbar-search-mode-zen_actions = Ações zen-site-data-settings = Configurações zen-generic-manage = Gerenciar zen-generic-more = Mais -zen-generic-next = Next +zen-generic-next = Próximo # These labels will be used for the site data panel settings zen-site-data-setting-allow = Permitido zen-site-data-setting-block = Bloqueado -zen-site-data-protections-enabled = Enabled -zen-site-data-protections-disabled = Disabled -zen-site-data-setting-cross-site = Cross-Site cookie +zen-site-data-protections-enabled = Habilitado +zen-site-data-protections-disabled = Desabilitado +zen-site-data-setting-cross-site = Cookie entre Sites zen-site-data-security-info-extension = .label = Extensão zen-site-data-security-info-secure = @@ -77,18 +77,18 @@ zen-site-data-get-addons = zen-site-data-site-settings = .label = Todas as Configurações do Site zen-site-data-header-share = - .tooltiptext = Share This Page + .tooltiptext = Compartilhar Esta Página zen-site-data-header-reader-mode = - .tooltiptext = Enter Reader Mode + .tooltiptext = Entrar no Modo Leitura zen-site-data-header-screenshot = - .tooltiptext = Take a Screenshot + .tooltiptext = Tirar Captura de Tela zen-site-data-header-bookmark = - .tooltiptext = Bookmark This Page + .tooltiptext = Marcar Esta Página zen-urlbar-copy-url-button = - .tooltiptext = Copy URL -zen-site-data-setting-site-protection = Tracking Protection + .tooltiptext = Copiar URL +zen-site-data-setting-site-protection = Proteção contra Rastreamento # Section: Feature callouts -zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more -zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions. +zen-site-data-panel-feature-callout-title = Um novo lar para extensões, permissões e mais +zen-site-data-panel-feature-callout-subtitle = Clique no ícone para gerenciar configurações do site, visualizar informações de segurança, acessar extensões e realizar ações comuns. diff --git a/locales/pt-BR/browser/browser/zen-workspaces.ftl b/locales/pt-BR/browser/browser/zen-workspaces.ftl index 7b032e85d..b2d5d710b 100644 --- a/locales/pt-BR/browser/browser/zen-workspaces.ftl +++ b/locales/pt-BR/browser/browser/zen-workspaces.ftl @@ -59,7 +59,7 @@ zen-workspaces-delete-workspace-title = Excluir Espaço? zen-workspaces-delete-workspace-body = Tem certeza que deseja excluir { $name }? Esta ação não pode ser desfeita. # Note that the html tag MUST not be changed or removed, as it is used to better # display the shortcut in the toast notification. -zen-workspaces-close-all-unpinned-tabs-toast = Tabs Closed! Use { $shortcut } to undo. +zen-workspaces-close-all-unpinned-tabs-toast = Abas Fechadas! Use { $shortcut } para desfazer. zen-workspaces-close-all-unpinned-tabs-title = - .label = Clear - .tooltiptext = Close all unpinned tabs + .label = Limpar + .tooltiptext = Fechar todas as abas não fixadas diff --git a/locales/pt-PT/browser/browser/preferences/zen-preferences.ftl b/locales/pt-PT/browser/browser/preferences/zen-preferences.ftl index 5d46462a5..aff4680ae 100644 --- a/locales/pt-PT/browser/browser/preferences/zen-preferences.ftl +++ b/locales/pt-PT/browser/browser/preferences/zen-preferences.ftl @@ -304,4 +304,4 @@ zen-devtools-toggle-performance-shortcut = Alternar Desempenho zen-devtools-toggle-storage-shortcut = Alternar Armazenamento zen-devtools-toggle-dom-shortcut = Alternar DOM zen-devtools-toggle-accessibility-shortcut = Alternar Acessibilidade -zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs +zen-close-all-unpinned-tabs-shortcut = Fechar Todos os Separadores Não Fixados diff --git a/locales/pt-PT/browser/browser/zen-workspaces.ftl b/locales/pt-PT/browser/browser/zen-workspaces.ftl index d6af3ae11..91e3f788e 100644 --- a/locales/pt-PT/browser/browser/zen-workspaces.ftl +++ b/locales/pt-PT/browser/browser/zen-workspaces.ftl @@ -59,7 +59,7 @@ zen-workspaces-delete-workspace-title = Eliminar Espaço de Trabalho? zen-workspaces-delete-workspace-body = Tem certeza que deseja eliminar { $name }? Esta ação não pode ser desfeita. # Note that the html tag MUST not be changed or removed, as it is used to better # display the shortcut in the toast notification. -zen-workspaces-close-all-unpinned-tabs-toast = Tabs Closed! Use { $shortcut } to undo. +zen-workspaces-close-all-unpinned-tabs-toast = Separadores Fechados! Use { $shortcut } para voltar atrás. zen-workspaces-close-all-unpinned-tabs-title = - .label = Clear - .tooltiptext = Close all unpinned tabs + .label = Limpar + .tooltiptext = Fechar todos os separadores não fixados diff --git a/locales/vi/browser/browser/preferences/zen-preferences.ftl b/locales/vi/browser/browser/preferences/zen-preferences.ftl index 9d83b2f56..b817df522 100644 --- a/locales/vi/browser/browser/preferences/zen-preferences.ftl +++ b/locales/vi/browser/browser/preferences/zen-preferences.ftl @@ -74,7 +74,7 @@ zen-settings-workspaces-description = Với các không gian làm việc, bạn zen-settings-workspaces-enabled = .label = Bật không gian làm việc zen-settings-workspaces-hide-default-container-indicator = - .label = Ẩn chỉ báo vùng chứa mặc định trên thanh thẻ + .label = Ẩn container mặc định trên thanh công cụ zen-key-unsaved = Lối tắt không an toàn! Xin hãy làm an toàn nó bằng cách ấn nút "Escape/Esc" sau khi nhập lại nó. zen-key-conflict = Conflicts with { $group } -> { $shortcut } pane-zen-theme-title = Cài đặt chủ đề @@ -145,7 +145,7 @@ zen-urlbar-behavior-label = Hành vi thanh đường dẫn zen-urlbar-behavior-normal = .label = Bình thường zen-urlbar-behavior-floating-on-type = - .label = Tách ra khi nhập + .label = Tách ra khi nhập chữ zen-urlbar-behavior-float = .label = Luôn luôn tách pane-zen-CKS-title = Phím tắt @@ -174,7 +174,7 @@ zenCKSOption-group-zen-split-view = Chế độ xem chia đôi zenCKSOption-group-devTools = Công cụ nhà phát triển zen-key-quick-restart = Khởi động lại nhanh zen-window-new-shortcut = Cửa sổ mới -zen-tab-new-shortcut = Tab mới +zen-tab-new-shortcut = Thẻ mới zen-key-redo = Hoàn tác zen-restore-last-closed-tab-shortcut = Khôi phục lại thẻ gần nhất đã đóng zen-location-open-shortcut = Mở đường dẫn diff --git a/locales/vi/browser/browser/zen-folders.ftl b/locales/vi/browser/browser/zen-folders.ftl index 953611723..4efc605a1 100644 --- a/locales/vi/browser/browser/zen-folders.ftl +++ b/locales/vi/browser/browser/zen-folders.ftl @@ -19,7 +19,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Đổi biểu tượng thư mục thẻ zen-folders-unload-all-tooltip = - .tooltiptext = Unload active in this folder + .tooltiptext = Tắt các thẻ trong thư mục zen-folders-unload-folder = .label = Tải lại tất cả các thẻ zen-folders-search-no-results = Không có thẻ nào trùng với tìm kiếm 🤔 diff --git a/locales/vi/browser/browser/zen-general.ftl b/locales/vi/browser/browser/zen-general.ftl index e037f71c2..9a3bdafd6 100644 --- a/locales/vi/browser/browser/zen-general.ftl +++ b/locales/vi/browser/browser/zen-general.ftl @@ -2,7 +2,7 @@ # 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-panel-ui-current-profile-text = hồ sơ hiện tại +zen-panel-ui-current-profile-text = Hồ sơ hiện tại unified-extensions-description = Các tiện ích mở rộng được sử dụng để mang thêm tính năng vào { -brand-short-name }. tab-context-zen-reset-pinned-tab = .label = Đặt lại thẻ đã ghim @@ -14,7 +14,7 @@ tab-context-zen-remove-essential = .label = Loại ra khỏi thẻ thường trú .accesskey = R tab-context-zen-replace-pinned-url-with-current = - .label = Thay thế đường dường dẫn đã gim với hiện tại + .label = Thay thế đường dường dẫn đã ghim với hiện tại .accesskey = C zen-themes-corrupted = Thư mục chủ đề { -brand-short-name } của bạn đã bị hư, chúng đã được trả về thiết kế gốc. zen-shortcuts-corrupted = Tệp phím tắt { -brand-short-name } của bạn đã bị hư. Chúng đã được trẻ về phím tắt gốc. @@ -42,8 +42,8 @@ zen-library-sidebar-workspaces = zen-library-sidebar-mods = .label = Mods zen-toggle-compact-mode-button = - .label = Compact Mode - .tooltiptext = Toggle Compact Mode + .label = Chế độ tối giản + .tooltiptext = Bật chế độ tối giản # note: Do not translate the "
" tags in the following string @@ -55,42 +55,42 @@ zen-icons-picker-emoji = .label = Biểu cảm zen-icons-picker-svg = .label = Biểu tượng -urlbar-search-mode-zen_actions = Actions -zen-site-data-settings = Settings -zen-generic-manage = Manage -zen-generic-more = More -zen-generic-next = Next +urlbar-search-mode-zen_actions = Hành động +zen-site-data-settings = Thiết lập +zen-generic-manage = Quản lý +zen-generic-more = Thêm +zen-generic-next = Tiếp # These labels will be used for the site data panel settings -zen-site-data-setting-allow = Allowed -zen-site-data-setting-block = Blocked -zen-site-data-protections-enabled = Enabled -zen-site-data-protections-disabled = Disabled -zen-site-data-setting-cross-site = Cross-Site cookie +zen-site-data-setting-allow = Đã cho phép +zen-site-data-setting-block = Đã chặn +zen-site-data-protections-enabled = Đã tắt +zen-site-data-protections-disabled = Đã bật +zen-site-data-setting-cross-site = Cookie liên trang web zen-site-data-security-info-extension = - .label = Extension + .label = Tiện ích mở rộng (Extensions) zen-site-data-security-info-secure = - .label = Secure + .label = Đã bảo mật zen-site-data-security-info-not-secure = - .label = Not Secure + .label = Chưa bảo mật zen-site-data-manage-addons = - .label = Manage Extensions + .label = Quản lý tiện ích mở rộng (Extensions) zen-site-data-get-addons = - .label = Add Extensions + .label = Thêm tiện ích mở rộng (Extensions) zen-site-data-site-settings = - .label = All Site Settings + .label = Cài đặt tổng quan của trang web zen-site-data-header-share = - .tooltiptext = Share This Page + .tooltiptext = Chia sẻ trang zen-site-data-header-reader-mode = - .tooltiptext = Enter Reader Mode + .tooltiptext = Bật chế độ đọc zen-site-data-header-screenshot = - .tooltiptext = Take a Screenshot + .tooltiptext = Chụp màn hình zen-site-data-header-bookmark = - .tooltiptext = Bookmark This Page + .tooltiptext = Lưu (bookmark) trang này zen-urlbar-copy-url-button = - .tooltiptext = Copy URL -zen-site-data-setting-site-protection = Tracking Protection + .tooltiptext = Sao chép đường dẫn (URL) +zen-site-data-setting-site-protection = Phòng chống theo dõi # Section: Feature callouts -zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more -zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions. +zen-site-data-panel-feature-callout-title = Diện mạo mới cho add-ons, quyền truy cập và nhiều hơn nữa +zen-site-data-panel-feature-callout-subtitle = Bấm vào biểu tượng để quản lý các thiết lập của trang web, kiểm tra thông tin bảo mật, quyền truy cập của các tiện ích và thực thiện các tác vụ cơ bản. diff --git a/locales/vi/browser/browser/zen-vertical-tabs.ftl b/locales/vi/browser/browser/zen-vertical-tabs.ftl index 879a1ad5c..86e9af51a 100644 --- a/locales/vi/browser/browser/zen-vertical-tabs.ftl +++ b/locales/vi/browser/browser/zen-vertical-tabs.ftl @@ -18,7 +18,7 @@ zen-toolbar-context-compact-mode-hide-both = .label = Ẩn cả hai .accesskey = H zen-toolbar-context-new-folder = - .label = New Folder + .label = Thư mục mới .accesskey = N sidebar-zen-expand = .label = Mở rộng thanh bên @@ -33,7 +33,7 @@ tabbrowser-unload-tab-button = tabbrowser-reset-pin-button = .tooltiptext = { $tabCount -> - [one] Tải lại và gim thẻ - *[other] Tải lại và gim { $tabCount } thẻ + [one] Tải lại và ghim thẻ + *[other] Tải lại và ghim { $tabCount } thẻ } tab-reset-pin-label = Quay trở lại đường dẫn đã ghim diff --git a/locales/vi/browser/browser/zen-welcome.ftl b/locales/vi/browser/browser/zen-welcome.ftl index 8cb2574c6..70a300267 100644 --- a/locales/vi/browser/browser/zen-welcome.ftl +++ b/locales/vi/browser/browser/zen-welcome.ftl @@ -14,13 +14,13 @@ zen-welcome-initial-essentials-title = Những thẻ quan trọng của bạn, l zen-welcome-initial-essentials-description-1 = Cho dù bạn có mở bao nhiêu, những thẻ quan trọng nhất của bạn luôn dễ dàng truy cập, luôn luôn trong tầm tay. zen-welcome-initial-essentials-description-2 = Thẻ thường trú sẽ luôn luôn ở đó, trên tất cả không gian làm việc của bạn. zen-welcome-workspace-colors-title = Không gian làm việc của bạn, màu sắc của bạn -zen-welcome-workspace-colors-description = Cá nhân của trình duyệt của bạn, cho mỗi không gian làm việc một màu sắc đặc. +zen-welcome-workspace-colors-description = Cá nhân hóa trình duyệt của bạn, cho mỗi không gian làm việc một màu sắc đặc trưng. zen-welcome-start-browsing-title = Sẵn sàng chưa?
Bắt đầu thôi nào! zen-welcome-start-browsing-description-1 = Mọi thứ đã sẵn sàng. Nhấn nút bên dưới để bắt đầu lướt web với { -brand-short-name }. zen-welcome-start-browsing = Bắt đầu nào! -zen-welcome-default-search-title = Your Default Search Engine +zen-welcome-default-search-title = Công cụ tìm kiếm mặc định của bạn là? zen-welcome-default-search-description = Hãy chọn công cụ tìm kiếm mặc đinh. Bạn luôn có thể đổi nó sau này! zen-welcome-skip-button = Bỏ qua zen-welcome-finished = Trình duyệt của bạn đã được thiết lập thành công! diff --git a/locales/vi/browser/browser/zen-workspaces.ftl b/locales/vi/browser/browser/zen-workspaces.ftl index 98cf11c50..4b66ddafb 100644 --- a/locales/vi/browser/browser/zen-workspaces.ftl +++ b/locales/vi/browser/browser/zen-workspaces.ftl @@ -8,7 +8,7 @@ zen-panel-ui-workspaces-create = zen-panel-ui-folder-create = .label = Tạo thư mục thẻ zen-panel-ui-new-empty-split = - .label = New Split + .label = Chia không gian zen-workspaces-panel-context-delete = .label = Xóa không gian làm việc .accesskey = D @@ -19,7 +19,7 @@ zen-workspaces-panel-change-icon = zen-workspaces-panel-context-default-profile = .label = Cài đặt hồ sơ zen-workspaces-panel-unload = - .label = Unload Space + .label = Tắt tất cả các trang web trong không gian làm việc zen-workspaces-how-to-reorder-title = Cách sắp xếp thứ tự của các không gian làm việc zen-workspaces-how-to-reorder-desc = Kéo và thả các biểu tượng của không gian làm việc ở dưới thanh bên để sắp xếp thứ tự của chúng zen-workspaces-change-theme = @@ -59,7 +59,7 @@ zen-workspaces-delete-workspace-title = Delete Workspace? zen-workspaces-delete-workspace-body = Bạn có chắc là bạn muốn xóa { $name }? Thao tác này sẽ không được hoàn lại. # Note that the html tag MUST not be changed or removed, as it is used to better # display the shortcut in the toast notification. -zen-workspaces-close-all-unpinned-tabs-toast = Tabs Closed! Use { $shortcut } to undo. +zen-workspaces-close-all-unpinned-tabs-toast = Thẻ đã đóng! Bấm { $shortcut } để hoàn . zen-workspaces-close-all-unpinned-tabs-title = - .label = Clear - .tooltiptext = Close all unpinned tabs + .label = Dọn sạch + .tooltiptext = Tắt tất cả các thẻ không ghim From c2f9097983b7dda7698f4209354183b7444aae58 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Mon, 10 Nov 2025 17:07:32 +0100 Subject: [PATCH 24/41] chore: Disable sccache for windows builds, b=no-bug, c=configs --- configs/windows/mozconfig | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/configs/windows/mozconfig b/configs/windows/mozconfig index 66a65ff7e..df0b0ef71 100644 --- a/configs/windows/mozconfig +++ b/configs/windows/mozconfig @@ -22,6 +22,10 @@ if test "$ZEN_CROSS_COMPILING"; then fi fi +# We wrongly detect ccache on windows, which leads to build failures. +# This line should be removed once the detection is fixed. +ac_add_options --without-ccache + ac_add_options --disable-maintenance-service ac_add_options --disable-bits-download From 47395bf3ce73eb564557eb5bb2e1c9f932a52634 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Tue, 11 Nov 2025 09:46:52 +0100 Subject: [PATCH 25/41] chore: New upstream fetch script, p=#11253, c=workflows, scripts * chore: New upstream fetch script, b=no-bug, c=workflows, scripts Signed-off-by: mr. m <91018726+mr-cheffy@users.noreply.github.com> --------- Signed-off-by: mr. m <91018726+mr-cheffy@users.noreply.github.com> --- .github/workflows/check-candidate-release.yml | 2 +- .github/workflows/pr-test.yml | 7 +- .github/workflows/sync-upstream.yml | 87 +++++++++++++++++++ package.json | 8 +- scripts/update_ff.py | 6 +- 5 files changed, 97 insertions(+), 13 deletions(-) create mode 100644 .github/workflows/sync-upstream.yml diff --git a/.github/workflows/check-candidate-release.yml b/.github/workflows/check-candidate-release.yml index 57e8c0384..b8b9a7dd8 100644 --- a/.github/workflows/check-candidate-release.yml +++ b/.github/workflows/check-candidate-release.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Check out repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Check for any updates env: diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index 8a956acd6..d0724d423 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -21,14 +21,11 @@ jobs: with: node-version-file: '.nvmrc' - - name: Install Surfer - run: npm i -g @zen-browser/surfer - - name: Install dependencies run: npm ci - name: Download Firefox and dependencies - run: surfer download + run: npm run download - name: Import patches - run: surfer i + run: npm run import diff --git a/.github/workflows/sync-upstream.yml b/.github/workflows/sync-upstream.yml new file mode 100644 index 000000000..b548eb105 --- /dev/null +++ b/.github/workflows/sync-upstream.yml @@ -0,0 +1,87 @@ +name: Sync Upstream Firefox Releases + +on: + schedule: + - cron: '59 4 * * 2' + workflow_dispatch: + inputs: + release_candidate: + description: 'Set to true to sync release candidates' + required: false + default: 'false' + +permissions: + contents: write + +jobs: + check_candidates: + runs-on: ubuntu-latest + + steps: + - name: Check out repository + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + + - name: Install dependencies + run: npm ci + + - name: Sync Upstream Releases + run: | + if [ "${{ github.event.inputs.release_candidate }}" = "true" ]; then + npm run sync:rc + else + npm run sync + fi + + - name: Check if any files changed + id: git-check + run: | + if [ -n "$(git status --porcelain)" ]; then + echo "files_changed=true" >> $GITHUB_OUTPUT + else + echo "files_changed=false" >> $GITHUB_OUTPUT + fi + + - name: Get Firefox Version + id: build-data + if: steps.git-check.outputs.files_changed == 'true' + run: | + if [ "${{ github.event.inputs.release_candidate }}" = "true" ]; then + VERSION=$(node -pe "require('./surfer.json').version.candidate") + else + VERSION=$(node -pe "require('./surfer.json').version.version") + fi + echo "version=$VERSION" >> $GITHUB_OUTPUT + + - name: Check if patches got applied + if: steps.git-check.outputs.files_changed == 'true' + id: check-patches + continue-on-error: true + run: | + echo "Checking if patches apply cleanly..." + npm run import + + - name: Create pull request + uses: peter-evans/create-pull-request@v7 + if: steps.git-check.outputs.files_changed == 'true' + env: + GIT_TRACE: 1 + GIT_CURL_VERBOSE: 1 + with: + token: ${{ secrets.DEPLOY_KEY }} + commit-message: 'chore: Sync upstream to `Firefox ${{ steps.build-data.outputs.version }}`' + branch: 'chore/sync-upstream-${{ steps.build-data.outputs.version }}' + title: 'Sync upstream Firefox to version ${{ steps.build-data.outputs.version }}' + body: | + This PR syncs the upstream Firefox to version ${{ steps.build-data.outputs.version }}. + + * ${{ steps.check-patches.outcome == 'failure' && '⚠️ Some patches did not apply cleanly. Please review them carefully.' || '✅ All patches applied cleanly.' }} + + @${{ github.actor }} please review and merge this PR. + base: dev + git-token: ${{ secrets.DEPLOY_KEY }} + delete-branch: true diff --git a/package.json b/package.json index f84997605..26985ff2e 100644 --- a/package.json +++ b/package.json @@ -16,10 +16,10 @@ "download": "surfer download", "bootstrap": "surfer bootstrap", "package": "surfer package", - "update-ff": "python3 scripts/update_ff.py", - "update-ff:raw": "surfer update", - "update-ff:rc": "python3 scripts/update_ff.py --rc", - "update-ff:l10n": "python3 scripts/update_ff.py --just-l10n", + "sync": "python3 scripts/update_ff.py", + "sync:raw": "surfer update", + "sync:rc": "python3 scripts/update_ff.py --rc", + "sync:l10n": "python3 scripts/update_ff.py --just-l10n", "pretty": "prettier . --write --cache && autopep8 -r --in-place scripts/ src/", "lint": "npx eslint src/ && prettier . --check --cache", "lint:fix": "npm run pretty && npx eslint src/ --fix", diff --git a/scripts/update_ff.py b/scripts/update_ff.py index b97912790..305b1dcc2 100644 --- a/scripts/update_ff.py +++ b/scripts/update_ff.py @@ -29,12 +29,12 @@ def update_rc(last_version: str): def update_ff(is_rc: bool = False, last_version: str = ""): - """Runs the npm command to update the 'ff' component.""" + """Runs the npm command to sync Firefox.""" if is_rc: return update_rc(last_version) - result = os.system("npm run update-ff:raw") + result = os.system("npm run sync:raw") if result != 0: - raise RuntimeError("Failed to update 'ff' component.") + raise RuntimeError("Failed to sync Firefox.") def get_version_from_file(filename, is_rc): From dbe3b346095d9812c1aae99a5ea8ff8af8e65476 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Tue, 11 Nov 2025 09:55:25 +0100 Subject: [PATCH 26/41] chore: Check for upstream updates after running rc checks, p=#11254 * chore: New upstream fetch script, b=no-bug, c=workflows, scripts * chore: Check for upstream updates after running rc checks, b=no-bug, c=workflows * chore: Lint, b=no-bug, c=workflows * Fix typo in workflow name for patch check Signed-off-by: mr. m <91018726+mr-cheffy@users.noreply.github.com> --------- Signed-off-by: mr. m <91018726+mr-cheffy@users.noreply.github.com> --- .github/workflows/check-candidate-release.yml | 10 ++++++++++ .github/workflows/sync-upstream.yml | 16 +++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/.github/workflows/check-candidate-release.yml b/.github/workflows/check-candidate-release.yml index b8b9a7dd8..25ee939c9 100644 --- a/.github/workflows/check-candidate-release.yml +++ b/.github/workflows/check-candidate-release.yml @@ -22,3 +22,13 @@ jobs: DISCORD_PING_IDS: ${{ secrets.DISCORD_PING_IDS }} run: | python3 scripts/check_rc_response.py + + sync-upstream: + name: Sync Upstream + uses: ./.github/workflows/sync-upstream.yml + permissions: + contents: write + secrets: inherit + needs: [check_candidates] + with: + release_candidate: 'true' diff --git a/.github/workflows/sync-upstream.yml b/.github/workflows/sync-upstream.yml index b548eb105..6a08b46e2 100644 --- a/.github/workflows/sync-upstream.yml +++ b/.github/workflows/sync-upstream.yml @@ -1,8 +1,6 @@ name: Sync Upstream Firefox Releases on: - schedule: - - cron: '59 4 * * 2' workflow_dispatch: inputs: release_candidate: @@ -21,15 +19,27 @@ jobs: - name: Check out repository uses: actions/checkout@v3 + - name: Check if upstream branch already exists + id: check-upstream-branch + run: | + if git ls-remote --heads origin chore/upstream-sync | grep -sw "refs/heads/chore/upstream-sync" > /dev/null; then + echo "branch_exists=true" >> $GITHUB_OUTPUT + else + echo "branch_exists=false" >> $GITHUB_OUTPUT + fi + - name: Setup Node.js uses: actions/setup-node@v4 + if: steps.check-upstream-branch.outputs.branch_exists == 'false' with: node-version-file: '.nvmrc' - name: Install dependencies + if: steps.check-upstream-branch.outputs.branch_exists == 'false' run: npm ci - name: Sync Upstream Releases + if: steps.check-upstream-branch.outputs.branch_exists == 'false' run: | if [ "${{ github.event.inputs.release_candidate }}" = "true" ]; then npm run sync:rc @@ -74,7 +84,7 @@ jobs: with: token: ${{ secrets.DEPLOY_KEY }} commit-message: 'chore: Sync upstream to `Firefox ${{ steps.build-data.outputs.version }}`' - branch: 'chore/sync-upstream-${{ steps.build-data.outputs.version }}' + branch: 'chore/upstream-sync' title: 'Sync upstream Firefox to version ${{ steps.build-data.outputs.version }}' body: | This PR syncs the upstream Firefox to version ${{ steps.build-data.outputs.version }}. From 2bed07f7c6287f92ef8276c578fb86fa437e0209 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Tue, 11 Nov 2025 10:01:23 +0100 Subject: [PATCH 27/41] feat: Make sure to download and setup CI when checking upstream, b=no-bug, c=workflows --- .github/workflows/check-candidate-release.yml | 2 +- .github/workflows/sync-upstream.yml | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check-candidate-release.yml b/.github/workflows/check-candidate-release.yml index 25ee939c9..5ea3d8f90 100644 --- a/.github/workflows/check-candidate-release.yml +++ b/.github/workflows/check-candidate-release.yml @@ -31,4 +31,4 @@ jobs: secrets: inherit needs: [check_candidates] with: - release_candidate: 'true' + release_candidate: true diff --git a/.github/workflows/sync-upstream.yml b/.github/workflows/sync-upstream.yml index 6a08b46e2..a16fe9dd4 100644 --- a/.github/workflows/sync-upstream.yml +++ b/.github/workflows/sync-upstream.yml @@ -6,13 +6,15 @@ on: release_candidate: description: 'Set to true to sync release candidates' required: false - default: 'false' + type: boolean + default: false permissions: contents: write jobs: check_candidates: + name: Sync Upstream runs-on: ubuntu-latest steps: @@ -38,6 +40,17 @@ jobs: if: steps.check-upstream-branch.outputs.branch_exists == 'false' run: npm ci + - name: Setup surfer CI + if: steps.check-upstream-branch.outputs.branch_exists == 'false' + run: | + if [ "${{ github.event.inputs.release_candidate }}" = "false" ]; then + npm run surfer -- ci --brand release + fi + + - name: Download Firefox and dependencies + if: steps.check-upstream-branch.outputs.branch_exists == 'false' + run: npm run download + - name: Sync Upstream Releases if: steps.check-upstream-branch.outputs.branch_exists == 'false' run: | From fc804acdb0df405dee47cd277b2292eada65ff88 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Tue, 11 Nov 2025 10:22:05 +0100 Subject: [PATCH 28/41] fix: Allow the sidebar to be hovered even when the pref is off, b=no-bug, c=common, compact-mode, glance, tabs, workspaces --- src/zen/common/ZenUIMigration.sys.mjs | 6 +- src/zen/common/styles/zen-omnibox.css | 2 +- src/zen/compact-mode/ZenCompactMode.mjs | 1553 +++++++++--------- src/zen/glance/actors/ZenGlanceChild.sys.mjs | 5 +- src/zen/tabs/zen-tabs/vertical-tabs.css | 2 +- src/zen/workspaces/ZenWorkspaces.mjs | 2 +- 6 files changed, 788 insertions(+), 782 deletions(-) diff --git a/src/zen/common/ZenUIMigration.sys.mjs b/src/zen/common/ZenUIMigration.sys.mjs index 7b7457012..b4f5f2d15 100644 --- a/src/zen/common/ZenUIMigration.sys.mjs +++ b/src/zen/common/ZenUIMigration.sys.mjs @@ -1,6 +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/. +/* 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/. */ import { AppConstants } from 'resource://gre/modules/AppConstants.sys.mjs'; diff --git a/src/zen/common/styles/zen-omnibox.css b/src/zen/common/styles/zen-omnibox.css index 24becb4bc..96c204d19 100644 --- a/src/zen/common/styles/zen-omnibox.css +++ b/src/zen/common/styles/zen-omnibox.css @@ -149,7 +149,7 @@ visibility 0.15s; } - #navigator-toolbox[zen-has-hover='true'] &, + #navigator-toolbox[zen-has-implicit-hover='true'] &, &[open], #urlbar[has-popup-open='true'] &, #identity-box[pageproxystate='invalid'] & { diff --git a/src/zen/compact-mode/ZenCompactMode.mjs b/src/zen/compact-mode/ZenCompactMode.mjs index 14ba11e0c..318a3b738 100644 --- a/src/zen/compact-mode/ZenCompactMode.mjs +++ b/src/zen/compact-mode/ZenCompactMode.mjs @@ -1,193 +1,202 @@ -// 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/. -const lazyCompactMode = {}; +/* 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/. */ -XPCOMUtils.defineLazyPreferenceGetter( - lazyCompactMode, - 'COMPACT_MODE_FLASH_DURATION', - 'zen.view.compact.toolbar-flash-popup.duration', - 800 -); +{ + const lazy = {}; -XPCOMUtils.defineLazyPreferenceGetter( - lazyCompactMode, - 'COMPACT_MODE_FLASH_ENABLED', - 'zen.view.compact.toolbar-flash-popup', - true -); + XPCOMUtils.defineLazyPreferenceGetter( + lazy, + 'COMPACT_MODE_FLASH_DURATION', + 'zen.view.compact.toolbar-flash-popup.duration', + 800 + ); -XPCOMUtils.defineLazyPreferenceGetter( - lazyCompactMode, - 'COMPACT_MODE_CAN_ANIMATE_SIDEBAR', - 'zen.view.compact.animate-sidebar', - true -); + XPCOMUtils.defineLazyPreferenceGetter( + lazy, + 'COMPACT_MODE_FLASH_ENABLED', + 'zen.view.compact.toolbar-flash-popup', + true + ); -ChromeUtils.defineLazyGetter(lazyCompactMode, 'mainAppWrapper', () => - document.getElementById('zen-main-app-wrapper') -); + XPCOMUtils.defineLazyPreferenceGetter( + lazy, + 'COMPACT_MODE_CAN_ANIMATE_SIDEBAR', + 'zen.view.compact.animate-sidebar', + true + ); -var gZenCompactModeManager = { - _flashTimeouts: {}, - _eventListeners: [], - _removeHoverFrames: {}, + XPCOMUtils.defineLazyPreferenceGetter( + lazy, + 'COMPACT_MODE_SHOW_SIDEBAR_AND_TOOLBAR_ON_HOVER', + 'zen.view.compact.show-sidebar-and-toolbar-on-hover', + true + ); - // Delay to avoid flickering when hovering over the sidebar - HOVER_HACK_DELAY: Services.prefs.getIntPref('zen.view.compact.hover-hack-delay', 0), + ChromeUtils.defineLazyGetter(lazy, 'mainAppWrapper', () => + document.getElementById('zen-main-app-wrapper') + ); - preInit() { - this._wasInCompactMode = Services.prefs.getBoolPref( - 'zen.view.compact.enable-at-startup', - false - ); - this._canDebugLog = Services.prefs.getBoolPref('zen.view.compact.debug', false); + window.gZenCompactModeManager = { + _flashTimeouts: {}, + _eventListeners: [], + _removeHoverFrames: {}, - this.addContextMenu(); - }, + // Delay to avoid flickering when hovering over the sidebar + HOVER_HACK_DELAY: Services.prefs.getIntPref('zen.view.compact.hover-hack-delay', 0), - init() { - this.addMouseActions(); + preInit() { + this._wasInCompactMode = Services.prefs.getBoolPref( + 'zen.view.compact.enable-at-startup', + false + ); + this._canDebugLog = Services.prefs.getBoolPref('zen.view.compact.debug', false); - const tabIsRightObserver = this._updateSidebarIsOnRight.bind(this); - Services.prefs.addObserver('zen.tabs.vertical.right-side', tabIsRightObserver); + this.addContextMenu(); + }, - window.addEventListener( - 'unload', - () => { - Services.prefs.removeObserver('zen.tabs.vertical.right-side', tabIsRightObserver); - }, - { once: true } - ); + init() { + this.addMouseActions(); - gZenUIManager.addPopupTrackingAttribute(this.sidebar); - gZenUIManager.addPopupTrackingAttribute( - document.getElementById('zen-appcontent-navbar-wrapper') - ); + const tabIsRightObserver = this._updateSidebarIsOnRight.bind(this); + Services.prefs.addObserver('zen.tabs.vertical.right-side', tabIsRightObserver); - this.addHasPolyfillObserver(); + window.addEventListener( + 'unload', + () => { + Services.prefs.removeObserver('zen.tabs.vertical.right-side', tabIsRightObserver); + }, + { once: true } + ); - // Clear hover states when window state changes (minimize, maximize, etc.) - window.addEventListener('sizemodechange', () => this._clearAllHoverStates()); + gZenUIManager.addPopupTrackingAttribute(this.sidebar); + gZenUIManager.addPopupTrackingAttribute( + document.getElementById('zen-appcontent-navbar-wrapper') + ); - this._canShowBackgroundTabToast = Services.prefs.getBoolPref( - 'zen.view.compact.show-background-tab-toast', - true - ); + this.addHasPolyfillObserver(); - if (AppConstants.platform == 'macosx') { - window.addEventListener('mouseover', (event) => { - const buttons = gZenVerticalTabsManager.actualWindowButtons; - if (event.target.closest('.titlebar-buttonbox-container') === buttons) return; - this._setElementExpandAttribute(buttons, false); - }); - } + // Clear hover states when window state changes (minimize, maximize, etc.) + window.addEventListener('sizemodechange', () => this._clearAllHoverStates()); - SessionStore.promiseAllWindowsRestored.then(() => { - this.preference = this._wasInCompactMode; - }); - }, + this._canShowBackgroundTabToast = Services.prefs.getBoolPref( + 'zen.view.compact.show-background-tab-toast', + true + ); - log(...args) { - if (this._canDebugLog) { - console.log('[Zen Compact Mode]', ...args); - } - }, - - get preference() { - return document.documentElement.getAttribute('zen-compact-mode') === 'true'; - }, - - get shouldBeCompact() { - return !document.documentElement.getAttribute('chromehidden')?.includes('toolbar'); - }, - - set preference(value) { - if (!this.shouldBeCompact) { - value = false; - } - this.log('Setting compact mode preference to', value); - if ( - this.preference === value || - document.documentElement.hasAttribute('zen-compact-animating') - ) { - if (typeof this._wasInCompactMode !== 'undefined') { - // We wont do anything with it anyway, so we remove it - delete this._wasInCompactMode; + if (AppConstants.platform == 'macosx') { + window.addEventListener('mouseover', (event) => { + const buttons = gZenVerticalTabsManager.actualWindowButtons; + if (event.target.closest('.titlebar-buttonbox-container') === buttons) return; + this._setElementExpandAttribute(buttons, false); + }); } - delete this._ignoreNextHover; - // We dont want the user to be able to spam the button - return; - } - this.sidebar.removeAttribute('zen-user-show'); - // We use this element in order to make it persis across restarts, by using the XULStore. - // main-window can't store attributes other than window sizes, so we use this instead - lazyCompactMode.mainAppWrapper.setAttribute('zen-compact-mode', value); - document.documentElement.setAttribute('zen-compact-mode', value); - if (typeof this._wasInCompactMode === 'undefined') { - Services.prefs.setBoolPref('zen.view.compact.enable-at-startup', value); - } - this._updateEvent(); - }, - get sidebarIsOnRight() { - if (typeof this._sidebarIsOnRight !== 'undefined') { + SessionStore.promiseAllWindowsRestored.then(() => { + this.preference = this._wasInCompactMode; + }); + }, + + log(...args) { + if (this._canDebugLog) { + console.log('[Zen Compact Mode]', ...args); + } + }, + + get preference() { + return document.documentElement.getAttribute('zen-compact-mode') === 'true'; + }, + + get shouldBeCompact() { + return !document.documentElement.getAttribute('chromehidden')?.includes('toolbar'); + }, + + set preference(value) { + if (!this.shouldBeCompact) { + value = false; + } + this.log('Setting compact mode preference to', value); + if ( + this.preference === value || + document.documentElement.hasAttribute('zen-compact-animating') + ) { + if (typeof this._wasInCompactMode !== 'undefined') { + // We wont do anything with it anyway, so we remove it + delete this._wasInCompactMode; + } + delete this._ignoreNextHover; + // We dont want the user to be able to spam the button + return; + } + this.sidebar.removeAttribute('zen-user-show'); + // We use this element in order to make it persis across restarts, by using the XULStore. + // main-window can't store attributes other than window sizes, so we use this instead + lazy.mainAppWrapper.setAttribute('zen-compact-mode', value); + document.documentElement.setAttribute('zen-compact-mode', value); + if (typeof this._wasInCompactMode === 'undefined') { + Services.prefs.setBoolPref('zen.view.compact.enable-at-startup', value); + } + this._updateEvent(); + }, + + get sidebarIsOnRight() { + if (typeof this._sidebarIsOnRight !== 'undefined') { + return this._sidebarIsOnRight; + } + this._sidebarIsOnRight = Services.prefs.getBoolPref('zen.tabs.vertical.right-side'); return this._sidebarIsOnRight; - } - this._sidebarIsOnRight = Services.prefs.getBoolPref('zen.tabs.vertical.right-side'); - return this._sidebarIsOnRight; - }, + }, - get sidebar() { - return gNavToolbox; - }, + get sidebar() { + return gNavToolbox; + }, - addHasPolyfillObserver() { - const attributes = ['panelopen', 'open', 'breakout-extend', 'zen-floating-urlbar']; - this.sidebarObserverId = ZenHasPolyfill.observeSelectorExistence( - this.sidebar, - [ - { - selector: - ":is([panelopen='true'], [open='true'], [breakout-extend='true']):not(#urlbar[zen-floating-urlbar='true']):not(tab):not(.zen-compact-mode-ignore)", - }, - ], - 'zen-compact-mode-active', - attributes - ); - this.toolbarObserverId = ZenHasPolyfill.observeSelectorExistence( - document.getElementById('zen-appcontent-navbar-wrapper'), - [ - { - selector: - ":is([panelopen='true'], [open='true'], #urlbar:focus-within, [breakout-extend='true']):not(.zen-compact-mode-ignore)", - }, - ], - 'zen-compact-mode-active', - attributes - ); - // Always connect this observer, we need it even if compact mode is disabled - ZenHasPolyfill.connectObserver(this.toolbarObserverId); - }, + addHasPolyfillObserver() { + const attributes = ['panelopen', 'open', 'breakout-extend', 'zen-floating-urlbar']; + this.sidebarObserverId = ZenHasPolyfill.observeSelectorExistence( + this.sidebar, + [ + { + selector: + ":is([panelopen='true'], [open='true'], [breakout-extend='true']):not(#urlbar[zen-floating-urlbar='true']):not(tab):not(.zen-compact-mode-ignore)", + }, + ], + 'zen-compact-mode-active', + attributes + ); + this.toolbarObserverId = ZenHasPolyfill.observeSelectorExistence( + document.getElementById('zen-appcontent-navbar-wrapper'), + [ + { + selector: + ":is([panelopen='true'], [open='true'], #urlbar:focus-within, [breakout-extend='true']):not(.zen-compact-mode-ignore)", + }, + ], + 'zen-compact-mode-active', + attributes + ); + // Always connect this observer, we need it even if compact mode is disabled + ZenHasPolyfill.connectObserver(this.toolbarObserverId); + }, - flashSidebarIfNecessary(aInstant = false) { - // This function is called after exiting DOM fullscreen mode, - // so we do a bit of a hack to re-calculate the URL height - if (aInstant) { - gZenVerticalTabsManager.recalculateURLBarHeight(); - } - if ( - !aInstant && - this.preference && - lazyCompactMode.COMPACT_MODE_FLASH_ENABLED && - !gZenGlanceManager._animating - ) { - this.flashSidebar(); - } - }, + flashSidebarIfNecessary(aInstant = false) { + // This function is called after exiting DOM fullscreen mode, + // so we do a bit of a hack to re-calculate the URL height + if (aInstant) { + gZenVerticalTabsManager.recalculateURLBarHeight(); + } + if ( + !aInstant && + this.preference && + lazy.COMPACT_MODE_FLASH_ENABLED && + !gZenGlanceManager._animating + ) { + this.flashSidebar(); + } + }, - addContextMenu() { - const fragment = window.MozXULElement.parseXULToFragment(` + addContextMenu() { + const fragment = window.MozXULElement.parseXULToFragment(` @@ -199,660 +208,660 @@ var gZenCompactModeManager = { `); - const idToAction = { - 'zen-context-menu-compact-mode-hide-sidebar': this.hideSidebar.bind(this), - 'zen-context-menu-compact-mode-hide-toolbar': this.hideToolbar.bind(this), - 'zen-context-menu-compact-mode-hide-both': this.hideBoth.bind(this), - }; + const idToAction = { + 'zen-context-menu-compact-mode-hide-sidebar': this.hideSidebar.bind(this), + 'zen-context-menu-compact-mode-hide-toolbar': this.hideToolbar.bind(this), + 'zen-context-menu-compact-mode-hide-both': this.hideBoth.bind(this), + }; - for (let menuitem of fragment.querySelectorAll('menuitem')) { - if (menuitem.id in idToAction) { - menuitem.addEventListener('command', idToAction[menuitem.id]); + for (let menuitem of fragment.querySelectorAll('menuitem')) { + if (menuitem.id in idToAction) { + menuitem.addEventListener('command', idToAction[menuitem.id]); + } } - } - document.getElementById('viewToolbarsMenuSeparator').before(fragment); - this.updateContextMenu(); - }, + document.getElementById('viewToolbarsMenuSeparator').before(fragment); + this.updateContextMenu(); + }, - updateCompactModeContext(isSingleToolbar) { - const isIllegalState = this.checkIfIllegalState(); - const menuitem = document.getElementById('zen-context-menu-compact-mode-toggle'); - const menu = document.getElementById('zen-context-menu-compact-mode'); - if (isSingleToolbar) { - menu.setAttribute('hidden', 'true'); - menu.before(menuitem); - } else { - menu.removeAttribute('hidden'); - menu.querySelector('menupopup').prepend(menuitem); - } - const hideToolbarMenuItem = document.getElementById( - 'zen-context-menu-compact-mode-hide-toolbar' - ); - if (isIllegalState) { - hideToolbarMenuItem.setAttribute('disabled', 'true'); - } else { - hideToolbarMenuItem.removeAttribute('disabled'); - } - }, + updateCompactModeContext(isSingleToolbar) { + const isIllegalState = this.checkIfIllegalState(); + const menuitem = document.getElementById('zen-context-menu-compact-mode-toggle'); + const menu = document.getElementById('zen-context-menu-compact-mode'); + if (isSingleToolbar) { + menu.setAttribute('hidden', 'true'); + menu.before(menuitem); + } else { + menu.removeAttribute('hidden'); + menu.querySelector('menupopup').prepend(menuitem); + } + const hideToolbarMenuItem = document.getElementById( + 'zen-context-menu-compact-mode-hide-toolbar' + ); + if (isIllegalState) { + hideToolbarMenuItem.setAttribute('disabled', 'true'); + } else { + hideToolbarMenuItem.removeAttribute('disabled'); + } + }, - hideSidebar() { - Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', true); - Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', false); - this.callAllEventListeners(); - }, - - hideToolbar() { - Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', true); - Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', false); - this.callAllEventListeners(); - }, - - hideBoth() { - Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', true); - Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', true); - this.callAllEventListeners(); - }, - - /* Check for illegal states and fix them - * @returns {boolean} If the context menu should just show the "toggle" item - * instead of a submenu with hide options - */ - checkIfIllegalState() { - // Due to how we layout the sidebar and toolbar, there are some states - // that are not allowed mainly due to the caption buttons not being accessible - // at the top left/right of the window. - const isSidebarExpanded = gZenVerticalTabsManager._prefsSidebarExpanded; - if (isSidebarExpanded) { - // Fast exit if the sidebar is expanded, as we dont have illegal states then - return false; - } - const canHideSidebar = this.canHideSidebar; - const canHideToolbar = this.canHideToolbar; - const isLeftSideButtons = !gZenVerticalTabsManager.isWindowsStyledButtons; - const isRightSidebar = gZenVerticalTabsManager._prefsRightSide; - // on macos: collapsed + left side + only toolbar - // on windows: collapsed + right side + only toolbar - const closelyIllegalState = - (isLeftSideButtons && !isRightSidebar) || (!isLeftSideButtons && isRightSidebar); - if (closelyIllegalState && canHideToolbar && !canHideSidebar) { - // This state is illegal + hideSidebar() { Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', true); Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', false); this.callAllEventListeners(); - return true; - } - return closelyIllegalState; - }, + }, - callAllEventListeners() { - this._eventListeners.forEach((callback) => callback()); - }, - - addEventListener(callback) { - this._eventListeners.push(callback); - }, - - removeEventListener(callback) { - const index = this._eventListeners.indexOf(callback); - if (index !== -1) { - this._eventListeners.splice(index, 1); - } - }, - - async _updateEvent() { - const isUrlbarFocused = gURLBar.focused; - // IF we are animating IN, call the callbacks first so we can calculate the width - // once the window buttons are shown - this.updateContextMenu(); - if (!this.preference) { + hideToolbar() { + Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', true); + Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', false); this.callAllEventListeners(); - await this.animateCompactMode(); - } else { - await this.animateCompactMode(); - this.callAllEventListeners(); - } - gZenUIManager.updateTabsToolbar(); - if (isUrlbarFocused) { - gURLBar.focus(); - } - if (this.preference) { - ZenHasPolyfill.connectObserver(this.sidebarObserverId); - } else { - ZenHasPolyfill.disconnectObserver(this.sidebarObserverId); - } - window.dispatchEvent(new CustomEvent('ZenCompactMode:Toggled', { detail: this.preference })); - }, + }, - // NOTE: Dont actually use event, it's just so we make sure - // the caller is from the ResizeObserver - getAndApplySidebarWidth(event = undefined) { - if (this._ignoreNextResize) { - delete this._ignoreNextResize; - return; - } - let sidebarWidth = this.sidebar.getBoundingClientRect().width; - const shouldRecalculate = - this.preference || document.documentElement.hasAttribute('zen-creating-workspace'); - const sidebarExpanded = document.documentElement.hasAttribute('zen-sidebar-expanded'); - if (sidebarWidth > 1) { - if (shouldRecalculate && sidebarExpanded) { - sidebarWidth = Math.max(sidebarWidth, 150); + hideBoth() { + Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', true); + Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', true); + this.callAllEventListeners(); + }, + + /* Check for illegal states and fix them + * @returns {boolean} If the context menu should just show the "toggle" item + * instead of a submenu with hide options + */ + checkIfIllegalState() { + // Due to how we layout the sidebar and toolbar, there are some states + // that are not allowed mainly due to the caption buttons not being accessible + // at the top left/right of the window. + const isSidebarExpanded = gZenVerticalTabsManager._prefsSidebarExpanded; + if (isSidebarExpanded) { + // Fast exit if the sidebar is expanded, as we dont have illegal states then + return false; } - // Second variable to get the genuine width of the sidebar - this.sidebar.style.setProperty('--actual-zen-sidebar-width', `${sidebarWidth}px`); - window.dispatchEvent(new window.Event('resize')); // To recalculate the layout - if ( - event && - shouldRecalculate && - sidebarExpanded && - !gZenVerticalTabsManager._hadSidebarCollapse - ) { + const canHideSidebar = this.canHideSidebar; + const canHideToolbar = this.canHideToolbar; + const isLeftSideButtons = !gZenVerticalTabsManager.isWindowsStyledButtons; + const isRightSidebar = gZenVerticalTabsManager._prefsRightSide; + // on macos: collapsed + left side + only toolbar + // on windows: collapsed + right side + only toolbar + const closelyIllegalState = + (isLeftSideButtons && !isRightSidebar) || (!isLeftSideButtons && isRightSidebar); + if (closelyIllegalState && canHideToolbar && !canHideSidebar) { + // This state is illegal + Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', true); + Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', false); + this.callAllEventListeners(); + return true; + } + return closelyIllegalState; + }, + + callAllEventListeners() { + this._eventListeners.forEach((callback) => callback()); + }, + + addEventListener(callback) { + this._eventListeners.push(callback); + }, + + removeEventListener(callback) { + const index = this._eventListeners.indexOf(callback); + if (index !== -1) { + this._eventListeners.splice(index, 1); + } + }, + + async _updateEvent() { + const isUrlbarFocused = gURLBar.focused; + // IF we are animating IN, call the callbacks first so we can calculate the width + // once the window buttons are shown + this.updateContextMenu(); + if (!this.preference) { + this.callAllEventListeners(); + await this.animateCompactMode(); + } else { + await this.animateCompactMode(); + this.callAllEventListeners(); + } + gZenUIManager.updateTabsToolbar(); + if (isUrlbarFocused) { + gURLBar.focus(); + } + if (this.preference) { + ZenHasPolyfill.connectObserver(this.sidebarObserverId); + } else { + ZenHasPolyfill.disconnectObserver(this.sidebarObserverId); + } + window.dispatchEvent(new CustomEvent('ZenCompactMode:Toggled', { detail: this.preference })); + }, + + // NOTE: Dont actually use event, it's just so we make sure + // the caller is from the ResizeObserver + getAndApplySidebarWidth(event = undefined) { + if (this._ignoreNextResize) { + delete this._ignoreNextResize; return; } - delete gZenVerticalTabsManager._hadSidebarCollapse; - this.sidebar.style.setProperty('--zen-sidebar-width', `${sidebarWidth}px`); - } - return sidebarWidth; - }, - - get canHideSidebar() { - return ( - Services.prefs.getBoolPref('zen.view.compact.hide-tabbar') || - gZenVerticalTabsManager._hasSetSingleToolbar - ); - }, - - get canHideToolbar() { - return ( - Services.prefs.getBoolPref('zen.view.compact.hide-toolbar') && - !gZenVerticalTabsManager._hasSetSingleToolbar - ); - }, - - animateCompactMode() { - // Get the splitter width before hiding it (we need to hide it before animating on right) - document.documentElement.setAttribute('zen-compact-animating', 'true'); - return new Promise((resolve) => { - // We need to set the splitter width before hiding it - let splitterWidth = document - .getElementById('zen-sidebar-splitter') - .getBoundingClientRect().width; - const isCompactMode = this.preference; - const canHideSidebar = this.canHideSidebar; - let canAnimate = - lazyCompactMode.COMPACT_MODE_CAN_ANIMATE_SIDEBAR && !this.isSidebarPotentiallyOpen(); - if (typeof this._wasInCompactMode !== 'undefined') { - canAnimate = false; - delete this._wasInCompactMode; - } - // Do this so we can get the correct width ONCE compact mode styled have been applied - if (canAnimate) { - this.sidebar.setAttribute('animate', 'true'); - } - if (this._ignoreNextHover) { - this._setElementExpandAttribute(this.sidebar, false); - } - this.sidebar.style.removeProperty('margin-right'); - this.sidebar.style.removeProperty('margin-left'); - this.sidebar.style.removeProperty('transform'); - window.requestAnimationFrame(() => { - delete this._ignoreNextResize; - let sidebarWidth = this.getAndApplySidebarWidth(); - const elementSeparation = ZenThemeModifier.elementSeparation; - if (!canAnimate) { - this.sidebar.removeAttribute('animate'); - document.documentElement.removeAttribute('zen-compact-animating'); - - this.getAndApplySidebarWidth({}); - this._ignoreNextResize = true; - - delete this._ignoreNextHover; - - resolve(); + let sidebarWidth = this.sidebar.getBoundingClientRect().width; + const shouldRecalculate = + this.preference || document.documentElement.hasAttribute('zen-creating-workspace'); + const sidebarExpanded = document.documentElement.hasAttribute('zen-sidebar-expanded'); + if (sidebarWidth > 1) { + if (shouldRecalculate && sidebarExpanded) { + sidebarWidth = Math.max(sidebarWidth, 150); + } + // Second variable to get the genuine width of the sidebar + this.sidebar.style.setProperty('--actual-zen-sidebar-width', `${sidebarWidth}px`); + window.dispatchEvent(new window.Event('resize')); // To recalculate the layout + if ( + event && + shouldRecalculate && + sidebarExpanded && + !gZenVerticalTabsManager._hadSidebarCollapse + ) { return; } - if (canHideSidebar && isCompactMode) { - if (document.documentElement.hasAttribute('zen-sidebar-expanded')) { - sidebarWidth -= 0.5 * splitterWidth; - if (elementSeparation < splitterWidth) { - // Subtract from the splitter width to end up with the correct element separation - sidebarWidth += 1.5 * splitterWidth - elementSeparation; - } - } else { - sidebarWidth -= elementSeparation; - } - this._setElementExpandAttribute(this.sidebar, false); - gZenUIManager.motion - .animate( - this.sidebar, - { - marginRight: [0, this.sidebarIsOnRight ? `-${sidebarWidth}px` : 0], - marginLeft: [0, this.sidebarIsOnRight ? 0 : `-${sidebarWidth}px`], - }, - { - ease: 'easeIn', - type: 'spring', - bounce: 0, - duration: 0.12, - } - ) - .then(() => { - this.sidebar.style.transition = 'none'; - this.sidebar.style.pointEvents = 'none'; - const titlebar = document.getElementById('titlebar'); - titlebar.style.visibility = 'hidden'; - titlebar.style.transition = 'none'; - this.sidebar.removeAttribute('animate'); - document.documentElement.removeAttribute('zen-compact-animating'); + delete gZenVerticalTabsManager._hadSidebarCollapse; + this.sidebar.style.setProperty('--zen-sidebar-width', `${sidebarWidth}px`); + } + return sidebarWidth; + }, - setTimeout(() => { - this.getAndApplySidebarWidth({}); - this._ignoreNextResize = true; + get canHideSidebar() { + return ( + Services.prefs.getBoolPref('zen.view.compact.hide-tabbar') || + gZenVerticalTabsManager._hasSetSingleToolbar + ); + }, + + get canHideToolbar() { + return ( + Services.prefs.getBoolPref('zen.view.compact.hide-toolbar') && + !gZenVerticalTabsManager._hasSetSingleToolbar + ); + }, + + animateCompactMode() { + // Get the splitter width before hiding it (we need to hide it before animating on right) + document.documentElement.setAttribute('zen-compact-animating', 'true'); + return new Promise((resolve) => { + // We need to set the splitter width before hiding it + let splitterWidth = document + .getElementById('zen-sidebar-splitter') + .getBoundingClientRect().width; + const isCompactMode = this.preference; + const canHideSidebar = this.canHideSidebar; + let canAnimate = lazy.COMPACT_MODE_CAN_ANIMATE_SIDEBAR && !this.isSidebarPotentiallyOpen(); + if (typeof this._wasInCompactMode !== 'undefined') { + canAnimate = false; + delete this._wasInCompactMode; + } + // Do this so we can get the correct width ONCE compact mode styled have been applied + if (canAnimate) { + this.sidebar.setAttribute('animate', 'true'); + } + if (this._ignoreNextHover) { + this._setElementExpandAttribute(this.sidebar, false); + } + this.sidebar.style.removeProperty('margin-right'); + this.sidebar.style.removeProperty('margin-left'); + this.sidebar.style.removeProperty('transform'); + window.requestAnimationFrame(() => { + delete this._ignoreNextResize; + let sidebarWidth = this.getAndApplySidebarWidth(); + const elementSeparation = ZenThemeModifier.elementSeparation; + if (!canAnimate) { + this.sidebar.removeAttribute('animate'); + document.documentElement.removeAttribute('zen-compact-animating'); + + this.getAndApplySidebarWidth({}); + this._ignoreNextResize = true; + + delete this._ignoreNextHover; + + resolve(); + return; + } + if (canHideSidebar && isCompactMode) { + if (document.documentElement.hasAttribute('zen-sidebar-expanded')) { + sidebarWidth -= 0.5 * splitterWidth; + if (elementSeparation < splitterWidth) { + // Subtract from the splitter width to end up with the correct element separation + sidebarWidth += 1.5 * splitterWidth - elementSeparation; + } + } else { + sidebarWidth -= elementSeparation; + } + this._setElementExpandAttribute(this.sidebar, false); + gZenUIManager.motion + .animate( + this.sidebar, + { + marginRight: [0, this.sidebarIsOnRight ? `-${sidebarWidth}px` : 0], + marginLeft: [0, this.sidebarIsOnRight ? 0 : `-${sidebarWidth}px`], + }, + { + ease: 'easeIn', + type: 'spring', + bounce: 0, + duration: 0.12, + } + ) + .then(() => { + this.sidebar.style.transition = 'none'; + this.sidebar.style.pointEvents = 'none'; + const titlebar = document.getElementById('titlebar'); + titlebar.style.visibility = 'hidden'; + titlebar.style.transition = 'none'; + this.sidebar.removeAttribute('animate'); + document.documentElement.removeAttribute('zen-compact-animating'); setTimeout(() => { - if (this._ignoreNextHover) { - setTimeout(() => { - delete this._ignoreNextHover; - }); - } + this.getAndApplySidebarWidth({}); + this._ignoreNextResize = true; - this.sidebar.style.removeProperty('margin-right'); - this.sidebar.style.removeProperty('margin-left'); + setTimeout(() => { + if (this._ignoreNextHover) { + setTimeout(() => { + delete this._ignoreNextHover; + }); + } + + this.sidebar.style.removeProperty('margin-right'); + this.sidebar.style.removeProperty('margin-left'); + this.sidebar.style.removeProperty('transition'); + this.sidebar.style.removeProperty('transform'); + this.sidebar.style.removeProperty('point-events'); + + titlebar.style.removeProperty('visibility'); + titlebar.style.removeProperty('transition'); + + gURLBar.textbox.style.removeProperty('visibility'); + + resolve(); + }); + }); + }); + } else if (canHideSidebar && !isCompactMode) { + // Shouldn't be ever true, but just in case + delete this._ignoreNextHover; + document.getElementById('browser').style.overflow = 'clip'; + if (this.sidebarIsOnRight) { + this.sidebar.style.marginRight = `-${sidebarWidth}px`; + } else { + this.sidebar.style.marginLeft = `-${sidebarWidth}px`; + } + gZenUIManager.motion + .animate( + this.sidebar, + this.sidebarIsOnRight + ? { + marginRight: [`-${sidebarWidth}px`, 0], + transform: ['translateX(100%)', 'translateX(0)'], + } + : { marginLeft: 0 }, + { + ease: 'easeOut', + type: 'spring', + bounce: 0, + duration: 0.12, + } + ) + .then(() => { + this.sidebar.removeAttribute('animate'); + document.getElementById('browser').style.removeProperty('overflow'); + this.sidebar.style.transition = 'none'; + this.sidebar.style.removeProperty('margin-right'); + this.sidebar.style.removeProperty('margin-left'); + this.sidebar.style.removeProperty('transform'); + document.documentElement.removeAttribute('zen-compact-animating'); + setTimeout(() => { this.sidebar.style.removeProperty('transition'); - this.sidebar.style.removeProperty('transform'); - this.sidebar.style.removeProperty('point-events'); - - titlebar.style.removeProperty('visibility'); - titlebar.style.removeProperty('transition'); - - gURLBar.textbox.style.removeProperty('visibility'); - resolve(); }); }); - }); - } else if (canHideSidebar && !isCompactMode) { - // Shouldn't be ever true, but just in case - delete this._ignoreNextHover; - document.getElementById('browser').style.overflow = 'clip'; - if (this.sidebarIsOnRight) { - this.sidebar.style.marginRight = `-${sidebarWidth}px`; } else { - this.sidebar.style.marginLeft = `-${sidebarWidth}px`; + this.sidebar.removeAttribute('animate'); // remove the attribute if we are not animating + document.documentElement.removeAttribute('zen-compact-animating'); + delete this._ignoreNextHover; + resolve(); } - gZenUIManager.motion - .animate( - this.sidebar, - this.sidebarIsOnRight - ? { - marginRight: [`-${sidebarWidth}px`, 0], - transform: ['translateX(100%)', 'translateX(0)'], - } - : { marginLeft: 0 }, - { - ease: 'easeOut', - type: 'spring', - bounce: 0, - duration: 0.12, - } - ) - .then(() => { - this.sidebar.removeAttribute('animate'); - document.getElementById('browser').style.removeProperty('overflow'); - this.sidebar.style.transition = 'none'; - this.sidebar.style.removeProperty('margin-right'); - this.sidebar.style.removeProperty('margin-left'); - this.sidebar.style.removeProperty('transform'); - document.documentElement.removeAttribute('zen-compact-animating'); - setTimeout(() => { - this.sidebar.style.removeProperty('transition'); - resolve(); - }); - }); - } else { - this.sidebar.removeAttribute('animate'); // remove the attribute if we are not animating - document.documentElement.removeAttribute('zen-compact-animating'); - delete this._ignoreNextHover; - resolve(); + }); + }); + }, + + updateContextMenu() { + document + .getElementById('zen-context-menu-compact-mode-toggle') + .setAttribute('checked', this.preference); + + const hideTabBar = this.canHideSidebar; + const hideToolbar = this.canHideToolbar; + const hideBoth = hideTabBar && hideToolbar; + + const idName = 'zen-context-menu-compact-mode-hide-'; + const sidebarItem = document.getElementById(idName + 'sidebar'); + const toolbarItem = document.getElementById(idName + 'toolbar'); + const bothItem = document.getElementById(idName + 'both'); + sidebarItem.setAttribute('checked', !hideBoth && hideTabBar); + toolbarItem.setAttribute('checked', !hideBoth && hideToolbar); + bothItem.setAttribute('checked', hideBoth); + }, + + _removeOpenStateOnUnifiedExtensions() { + // Fix for bug https://github.com/zen-browser/desktop/issues/1925 + const buttons = document.querySelectorAll( + 'toolbarbutton:is(#unified-extensions-button, .webextension-browser-action)' + ); + for (let button of buttons) { + button.removeAttribute('open'); + } + }, + + toggle(ignoreHover = false) { + // Only ignore the next hover when we are enabling compact mode + this._ignoreNextHover = ignoreHover && !this.preference; + return (this.preference = !this.preference); + }, + + _updateSidebarIsOnRight() { + this._sidebarIsOnRight = Services.prefs.getBoolPref('zen.tabs.vertical.right-side'); + }, + + toggleSidebar() { + this.sidebar.toggleAttribute('zen-user-show'); + }, + + get hideAfterHoverDuration() { + if (this._hideAfterHoverDuration) { + return this._hideAfterHoverDuration; + } + return Services.prefs.getIntPref('zen.view.compact.toolbar-hide-after-hover.duration'); + }, + + get hoverableElements() { + return [ + { + element: this.sidebar, + screenEdge: this.sidebarIsOnRight ? 'right' : 'left', + keepHoverDuration: 100, + }, + { + element: document.getElementById('zen-appcontent-navbar-wrapper'), + screenEdge: 'top', + }, + { + element: gZenVerticalTabsManager.actualWindowButtons, + }, + ]; + }, + + flashSidebar(duration = lazy.COMPACT_MODE_FLASH_DURATION) { + let tabPanels = document.getElementById('tabbrowser-tabpanels'); + if (!tabPanels.matches("[zen-split-view='true']")) { + this.flashElement(this.sidebar, duration, this.sidebar.id); + } + }, + + flashElement(element, duration, id, attrName = 'flash-popup') { + if (this._flashTimeouts[id]) { + clearTimeout(this._flashTimeouts[id]); + } else { + requestAnimationFrame(() => this._setElementExpandAttribute(element, true, attrName)); + } + this._flashTimeouts[id] = setTimeout(() => { + window.requestAnimationFrame(() => { + this._setElementExpandAttribute(element, false, attrName); + this._flashTimeouts[id] = null; + }); + }, duration); + }, + + clearFlashTimeout(id) { + clearTimeout(this._flashTimeouts[id]); + this._flashTimeouts[id] = null; + }, + + _setElementExpandAttribute(element, value, attr = 'zen-has-hover') { + const kVerifiedAttributes = ['zen-has-hover', 'has-popup-menu', 'zen-compact-mode-active']; + const isToolbar = element.id === 'zen-appcontent-navbar-wrapper'; + if (value) { + if (attr === 'zen-has-hover' && element !== gZenVerticalTabsManager.actualWindowButtons) { + element.setAttribute('zen-has-implicit-hover', 'true'); + if (!lazy.COMPACT_MODE_SHOW_SIDEBAR_AND_TOOLBAR_ON_HOVER) { + return; + } + } + element.setAttribute(attr, 'true'); + if ( + isToolbar && + ((gZenVerticalTabsManager._hasSetSingleToolbar && + (element.hasAttribute('should-hide') || + document.documentElement.hasAttribute('zen-has-bookmarks'))) || + (this.preference && + Services.prefs.getBoolPref('zen.view.compact.hide-toolbar') && + !gZenVerticalTabsManager._hasSetSingleToolbar)) + ) { + gBrowser.tabpanels.setAttribute('has-toolbar-hovered', 'true'); + } + } else { + if (attr === 'zen-has-hover') { + element.removeAttribute('zen-has-implicit-hover'); + } + element.removeAttribute(attr); + // Only remove if none of the verified attributes are present + if (isToolbar && !kVerifiedAttributes.some((attr) => element.hasAttribute(attr))) { + gBrowser.tabpanels.removeAttribute('has-toolbar-hovered'); + } + } + }, + + addMouseActions() { + gURLBar.textbox.addEventListener('mouseenter', (event) => { + if (event.target.closest('#urlbar[zen-floating-urlbar]')) { + window.requestAnimationFrame(() => { + this._setElementExpandAttribute(gZenVerticalTabsManager.actualWindowButtons, false); + }); + this._hasHoveredUrlbar = true; + return; } }); - }); - }, - updateContextMenu() { - document - .getElementById('zen-context-menu-compact-mode-toggle') - .setAttribute('checked', this.preference); + for (let i = 0; i < this.hoverableElements.length; i++) { + let target = this.hoverableElements[i].element; - const hideTabBar = this.canHideSidebar; - const hideToolbar = this.canHideToolbar; - const hideBoth = hideTabBar && hideToolbar; + // Add the attribute on startup if the mouse is already over the element + if (target.matches(':hover')) { + this._setElementExpandAttribute(target, true); + } - const idName = 'zen-context-menu-compact-mode-hide-'; - const sidebarItem = document.getElementById(idName + 'sidebar'); - const toolbarItem = document.getElementById(idName + 'toolbar'); - const bothItem = document.getElementById(idName + 'both'); - sidebarItem.setAttribute('checked', !hideBoth && hideTabBar); - toolbarItem.setAttribute('checked', !hideBoth && hideToolbar); - bothItem.setAttribute('checked', hideBoth); - }, + const onEnter = (event) => { + setTimeout(() => { + if (event.type === 'mouseenter' && !event.target.matches(':hover')) return; + if (event.target.closest('panel')) return; + // Dont register the hover if the urlbar is floating and we are hovering over it + this.clearFlashTimeout('has-hover' + target.id); + window.requestAnimationFrame(() => { + if ( + document.documentElement.getAttribute('supress-primary-adjustment') === 'true' || + this._hasHoveredUrlbar || + this._ignoreNextHover || + target.hasAttribute('zen-has-hover') + ) { + return; + } + this._setElementExpandAttribute(target, true); + }); + }, this.HOVER_HACK_DELAY); + }; - _removeOpenStateOnUnifiedExtensions() { - // Fix for bug https://github.com/zen-browser/desktop/issues/1925 - const buttons = document.querySelectorAll( - 'toolbarbutton:is(#unified-extensions-button, .webextension-browser-action)' - ); - for (let button of buttons) { - button.removeAttribute('open'); - } - }, - - toggle(ignoreHover = false) { - // Only ignore the next hover when we are enabling compact mode - this._ignoreNextHover = ignoreHover && !this.preference; - return (this.preference = !this.preference); - }, - - _updateSidebarIsOnRight() { - this._sidebarIsOnRight = Services.prefs.getBoolPref('zen.tabs.vertical.right-side'); - }, - - toggleSidebar() { - this.sidebar.toggleAttribute('zen-user-show'); - }, - - get hideAfterHoverDuration() { - if (this._hideAfterHoverDuration) { - return this._hideAfterHoverDuration; - } - return Services.prefs.getIntPref('zen.view.compact.toolbar-hide-after-hover.duration'); - }, - - get hoverableElements() { - if (typeof this._showSidebarAndToolbarOnHover === 'undefined') { - this._showSidebarAndToolbarOnHover = Services.prefs.getBoolPref( - 'zen.view.compact.show-sidebar-and-toolbar-on-hover', - true - ); - } - return [ - ...(!this._showSidebarAndToolbarOnHover - ? [] - : [ - { - element: this.sidebar, - screenEdge: this.sidebarIsOnRight ? 'right' : 'left', - keepHoverDuration: 100, - }, - { - element: document.getElementById('zen-appcontent-navbar-wrapper'), - screenEdge: 'top', - }, - ]), - { - element: gZenVerticalTabsManager.actualWindowButtons, - }, - ]; - }, - - flashSidebar(duration = lazyCompactMode.COMPACT_MODE_FLASH_DURATION) { - let tabPanels = document.getElementById('tabbrowser-tabpanels'); - if (!tabPanels.matches("[zen-split-view='true']")) { - this.flashElement(this.sidebar, duration, this.sidebar.id); - } - }, - - flashElement(element, duration, id, attrName = 'flash-popup') { - if (this._flashTimeouts[id]) { - clearTimeout(this._flashTimeouts[id]); - } else { - requestAnimationFrame(() => this._setElementExpandAttribute(element, true, attrName)); - } - this._flashTimeouts[id] = setTimeout(() => { - window.requestAnimationFrame(() => { - this._setElementExpandAttribute(element, false, attrName); - this._flashTimeouts[id] = null; - }); - }, duration); - }, - - clearFlashTimeout(id) { - clearTimeout(this._flashTimeouts[id]); - this._flashTimeouts[id] = null; - }, - - _setElementExpandAttribute(element, value, attr = 'zen-has-hover') { - const kVerifiedAttributes = ['zen-has-hover', 'has-popup-menu', 'zen-compact-mode-active']; - const isToolbar = element.id === 'zen-appcontent-navbar-wrapper'; - if (value) { - element.setAttribute(attr, 'true'); - if ( - isToolbar && - ((gZenVerticalTabsManager._hasSetSingleToolbar && - (element.hasAttribute('should-hide') || - document.documentElement.hasAttribute('zen-has-bookmarks'))) || - (this.preference && - Services.prefs.getBoolPref('zen.view.compact.hide-toolbar') && - !gZenVerticalTabsManager._hasSetSingleToolbar)) - ) { - gBrowser.tabpanels.setAttribute('has-toolbar-hovered', 'true'); - } - } else { - element.removeAttribute(attr); - // Only remove if none of the verified attributes are present - if (isToolbar && !kVerifiedAttributes.some((attr) => element.hasAttribute(attr))) { - gBrowser.tabpanels.removeAttribute('has-toolbar-hovered'); - } - } - }, - - addMouseActions() { - gURLBar.textbox.addEventListener('mouseenter', (event) => { - if (event.target.closest('#urlbar[zen-floating-urlbar]')) { - window.requestAnimationFrame(() => { - this._setElementExpandAttribute(gZenVerticalTabsManager.actualWindowButtons, false); - }); - this._hasHoveredUrlbar = true; - return; - } - }); - - for (let i = 0; i < this.hoverableElements.length; i++) { - let target = this.hoverableElements[i].element; - - // Add the attribute on startup if the mouse is already over the element - if (target.matches(':hover')) { - this._setElementExpandAttribute(target, true); - } - - const onEnter = (event) => { - setTimeout(() => { - if (event.type === 'mouseenter' && !event.target.matches(':hover')) return; - if (event.target.closest('panel')) return; - // Dont register the hover if the urlbar is floating and we are hovering over it - this.clearFlashTimeout('has-hover' + target.id); - window.requestAnimationFrame(() => { + const onLeave = (event) => { + if (AppConstants.platform == 'macosx') { + const buttonRect = gZenVerticalTabsManager.actualWindowButtons.getBoundingClientRect(); + const MAC_WINDOW_BUTTONS_X_BORDER = buttonRect.width + buttonRect.x; + const MAC_WINDOW_BUTTONS_Y_BORDER = buttonRect.height + buttonRect.y; if ( - document.documentElement.getAttribute('supress-primary-adjustment') === 'true' || - this._hasHoveredUrlbar || - this._ignoreNextHover || - target.hasAttribute('zen-has-hover') + event.clientX < MAC_WINDOW_BUTTONS_X_BORDER && + event.clientY < MAC_WINDOW_BUTTONS_Y_BORDER && + event.clientX > buttonRect.x && + event.clientY > buttonRect.y ) { return; } - this._setElementExpandAttribute(target, true); - }); - }, this.HOVER_HACK_DELAY); - }; - - const onLeave = (event) => { - if (AppConstants.platform == 'macosx') { - const buttonRect = gZenVerticalTabsManager.actualWindowButtons.getBoundingClientRect(); - const MAC_WINDOW_BUTTONS_X_BORDER = buttonRect.width + buttonRect.x; - const MAC_WINDOW_BUTTONS_Y_BORDER = buttonRect.height + buttonRect.y; - if ( - event.clientX < MAC_WINDOW_BUTTONS_X_BORDER && - event.clientY < MAC_WINDOW_BUTTONS_Y_BORDER && - event.clientX > buttonRect.x && - event.clientY > buttonRect.y - ) { - return; } - } - // See bug https://bugzilla.mozilla.org/show_bug.cgi?id=1979340 and issue https://github.com/zen-browser/desktop/issues/7746. - // If we want the toolbars to be draggable, we need to make sure to check the hover state after a short delay. - // This is because the mouse is left to be handled natively so firefox thinks the mouse left the window for a split second. + // See bug https://bugzilla.mozilla.org/show_bug.cgi?id=1979340 and issue https://github.com/zen-browser/desktop/issues/7746. + // If we want the toolbars to be draggable, we need to make sure to check the hover state after a short delay. + // This is because the mouse is left to be handled natively so firefox thinks the mouse left the window for a split second. + setTimeout(() => { + // Let's double check if the mouse is still hovering over the element, see the bug above. + if (event.target.matches(':hover')) { + return; + } + + if ( + event.explicitOriginalTarget?.closest?.('#urlbar[zen-floating-urlbar]') || + (document.documentElement.getAttribute('supress-primary-adjustment') === 'true' && + gZenVerticalTabsManager._hasSetSingleToolbar) || + this._hasHoveredUrlbar || + this._ignoreNextHover || + (event.type === 'dragleave' && + event.explicitOriginalTarget !== target && + target.contains?.(event.explicitOriginalTarget)) + ) { + return; + } + + if (this.hoverableElements[i].keepHoverDuration) { + this.flashElement( + target, + this.hoverableElements[i].keepHoverDuration, + 'has-hover' + target.id, + 'zen-has-hover' + ); + } else { + this._removeHoverFrames[target.id] = window.requestAnimationFrame(() => + this._setElementExpandAttribute(target, false) + ); + } + }, this.HOVER_HACK_DELAY); + }; + + target.addEventListener('mouseover', onEnter); + target.addEventListener('dragover', onEnter); + + target.addEventListener('mouseleave', onLeave); + target.addEventListener('dragleave', onLeave); + } + + document.documentElement.addEventListener('mouseleave', (event) => { setTimeout(() => { - // Let's double check if the mouse is still hovering over the element, see the bug above. - if (event.target.matches(':hover')) { - return; - } + const screenEdgeCrossed = this._getCrossedEdge(event.pageX, event.pageY); + if (!screenEdgeCrossed) return; + for (let entry of this.hoverableElements) { + if (screenEdgeCrossed !== entry.screenEdge) continue; + const target = entry.element; + const boundAxis = + entry.screenEdge === 'right' || entry.screenEdge === 'left' ? 'y' : 'x'; + if (!this._positionInBounds(boundAxis, target, event.pageX, event.pageY, 7)) { + continue; + } + window.cancelAnimationFrame(this._removeHoverFrames[target.id]); - if ( - event.explicitOriginalTarget?.closest?.('#urlbar[zen-floating-urlbar]') || - (document.documentElement.getAttribute('supress-primary-adjustment') === 'true' && - gZenVerticalTabsManager._hasSetSingleToolbar) || - this._hasHoveredUrlbar || - this._ignoreNextHover || - (event.type === 'dragleave' && - event.explicitOriginalTarget !== target && - target.contains?.(event.explicitOriginalTarget)) - ) { - return; - } - - if (this.hoverableElements[i].keepHoverDuration) { this.flashElement( target, - this.hoverableElements[i].keepHoverDuration, + this.hideAfterHoverDuration, 'has-hover' + target.id, 'zen-has-hover' ); - } else { - this._removeHoverFrames[target.id] = window.requestAnimationFrame(() => - this._setElementExpandAttribute(target, false) + document.addEventListener( + 'mousemove', + () => { + if (target.matches(':hover')) return; + this._setElementExpandAttribute(target, false); + this.clearFlashTimeout('has-hover' + target.id); + }, + { once: true } ); } }, this.HOVER_HACK_DELAY); - }; - - target.addEventListener('mouseover', onEnter); - target.addEventListener('dragover', onEnter); - - target.addEventListener('mouseleave', onLeave); - target.addEventListener('dragleave', onLeave); - } - - document.documentElement.addEventListener('mouseleave', (event) => { - setTimeout(() => { - const screenEdgeCrossed = this._getCrossedEdge(event.pageX, event.pageY); - if (!screenEdgeCrossed) return; - for (let entry of this.hoverableElements) { - if (screenEdgeCrossed !== entry.screenEdge) continue; - const target = entry.element; - const boundAxis = entry.screenEdge === 'right' || entry.screenEdge === 'left' ? 'y' : 'x'; - if (!this._positionInBounds(boundAxis, target, event.pageX, event.pageY, 7)) { - continue; - } - window.cancelAnimationFrame(this._removeHoverFrames[target.id]); - - this.flashElement( - target, - this.hideAfterHoverDuration, - 'has-hover' + target.id, - 'zen-has-hover' - ); - document.addEventListener( - 'mousemove', - () => { - if (target.matches(':hover')) return; - this._setElementExpandAttribute(target, false); - this.clearFlashTimeout('has-hover' + target.id); - }, - { once: true } - ); - } - }, this.HOVER_HACK_DELAY); - }); - - gURLBar.textbox.addEventListener('mouseleave', () => { - setTimeout(() => { - setTimeout(() => { - requestAnimationFrame(() => { - delete this._hasHoveredUrlbar; - }); - }, 10); - }, 0); - }); - }, - - _getCrossedEdge(posX, posY, element = document.documentElement, maxDistance = 10) { - const targetBox = element.getBoundingClientRect(); - posX = Math.max(targetBox.left, Math.min(posX, targetBox.right)); - posY = Math.max(targetBox.top, Math.min(posY, targetBox.bottom)); - return ['top', 'bottom', 'left', 'right'].find((edge, i) => { - const distance = Math.abs((i < 2 ? posY : posX) - targetBox[edge]); - return distance <= maxDistance; - }); - }, - - _positionInBounds(axis = 'x', element, x, y, error = 0) { - const bBox = element.getBoundingClientRect(); - if (axis === 'y') return bBox.top - error < y && y < bBox.bottom + error; - else return bBox.left - error < x && x < bBox.right + error; - }, - - _clearAllHoverStates() { - // Clear hover attributes from all hoverable elements - for (let entry of this.hoverableElements) { - const target = entry.element; - if (target && !target.matches(':hover') && target.hasAttribute('zen-has-hover')) { - this._setElementExpandAttribute(target, false); - this.clearFlashTimeout('has-hover' + target.id); - } - } - }, - - isSidebarPotentiallyOpen() { - if (this._ignoreNextHover) { - this._setElementExpandAttribute(this.sidebar, false); - } - return ( - this.sidebar.hasAttribute('zen-user-show') || - this.sidebar.hasAttribute('zen-has-hover') || - this.sidebar.hasAttribute('zen-has-empty-tab') - ); - }, - - async _onTabOpen(tab, inBackground) { - if ( - inBackground && - this.preference && - !this.isSidebarPotentiallyOpen() && - this._canShowBackgroundTabToast && - !gZenGlanceManager._animating && - !this._nextTimeWillBeActive - ) { - gZenUIManager.showToast('zen-background-tab-opened-toast', { - button: { - id: 'zen-open-background-tab-button', - command: () => { - const targetWindow = window.ownerGlobal.parent || window; - targetWindow.gBrowser.selectedTab = tab; - }, - }, }); - } - delete this._nextTimeWillBeActive; - }, -}; -document.addEventListener( - 'MozBeforeInitialXULLayout', - () => { - gZenCompactModeManager.preInit(); - }, - { once: true } -); + gURLBar.textbox.addEventListener('mouseleave', () => { + setTimeout(() => { + setTimeout(() => { + requestAnimationFrame(() => { + delete this._hasHoveredUrlbar; + }); + }, 10); + }, 0); + }); + }, + + _getCrossedEdge(posX, posY, element = document.documentElement, maxDistance = 10) { + const targetBox = element.getBoundingClientRect(); + posX = Math.max(targetBox.left, Math.min(posX, targetBox.right)); + posY = Math.max(targetBox.top, Math.min(posY, targetBox.bottom)); + return ['top', 'bottom', 'left', 'right'].find((edge, i) => { + const distance = Math.abs((i < 2 ? posY : posX) - targetBox[edge]); + return distance <= maxDistance; + }); + }, + + _positionInBounds(axis = 'x', element, x, y, error = 0) { + const bBox = element.getBoundingClientRect(); + if (axis === 'y') return bBox.top - error < y && y < bBox.bottom + error; + else return bBox.left - error < x && x < bBox.right + error; + }, + + _clearAllHoverStates() { + // Clear hover attributes from all hoverable elements + for (let entry of this.hoverableElements) { + const target = entry.element; + if (target && !target.matches(':hover') && target.hasAttribute('zen-has-hover')) { + this._setElementExpandAttribute(target, false); + this.clearFlashTimeout('has-hover' + target.id); + } + } + }, + + isSidebarPotentiallyOpen() { + if (this._ignoreNextHover) { + this._setElementExpandAttribute(this.sidebar, false); + } + return ( + this.sidebar.hasAttribute('zen-user-show') || + this.sidebar.hasAttribute('zen-has-hover') || + this.sidebar.hasAttribute('zen-has-empty-tab') + ); + }, + + async _onTabOpen(tab, inBackground) { + if ( + inBackground && + this.preference && + !this.isSidebarPotentiallyOpen() && + this._canShowBackgroundTabToast && + !gZenGlanceManager._animating && + !this._nextTimeWillBeActive + ) { + gZenUIManager.showToast('zen-background-tab-opened-toast', { + button: { + id: 'zen-open-background-tab-button', + command: () => { + const targetWindow = window.ownerGlobal.parent || window; + targetWindow.gBrowser.selectedTab = tab; + }, + }, + }); + } + delete this._nextTimeWillBeActive; + }, + }; + + document.addEventListener( + 'MozBeforeInitialXULLayout', + () => { + gZenCompactModeManager.preInit(); + }, + { once: true } + ); +} diff --git a/src/zen/glance/actors/ZenGlanceChild.sys.mjs b/src/zen/glance/actors/ZenGlanceChild.sys.mjs index 8ebf72eaa..e3f78f2a0 100644 --- a/src/zen/glance/actors/ZenGlanceChild.sys.mjs +++ b/src/zen/glance/actors/ZenGlanceChild.sys.mjs @@ -55,9 +55,6 @@ export class ZenGlanceChild extends JSWindowActorChild { } on_click(event) { - if (event.button !== 0 || event.defaultPrevented) { - return; - } // get closest A element const target = event.target.closest('A'); const elementToRecord = event.originalTarget || event.target; @@ -67,7 +64,7 @@ export class ZenGlanceChild extends JSWindowActorChild { // The problem is that at that stage we don't know the rect or even what // element has been clicked, so we send the data here. this.#sendClickDataToParent(target, elementToRecord); - if (this.#ensureOnlyKeyModifiers(event)) { + if (event.button !== 0 || event.defaultPrevented || this.#ensureOnlyKeyModifiers(event)) { return; } const activationMethod = this.#activationMethod; diff --git a/src/zen/tabs/zen-tabs/vertical-tabs.css b/src/zen/tabs/zen-tabs/vertical-tabs.css index 975acad6e..21694d525 100644 --- a/src/zen/tabs/zen-tabs/vertical-tabs.css +++ b/src/zen/tabs/zen-tabs/vertical-tabs.css @@ -179,7 +179,7 @@ font-weight: 500; gap: 2px; - #navigator-toolbox[zen-has-hover='true'] & { + #navigator-toolbox[zen-has-implicit-hover='true'] & { visibility: visible; opacity: 0.5; } diff --git a/src/zen/workspaces/ZenWorkspaces.mjs b/src/zen/workspaces/ZenWorkspaces.mjs index 8bce5d7e7..e2228a209 100644 --- a/src/zen/workspaces/ZenWorkspaces.mjs +++ b/src/zen/workspaces/ZenWorkspaces.mjs @@ -563,7 +563,7 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { } get _hoveringSidebar() { - return gNavToolbox.hasAttribute('zen-has-hover'); + return gNavToolbox.hasAttribute('zen-has-implicit-hover'); } _handleAppCommand(event) { From 8b649254077be86727d02aaaff255449d62fadf5 Mon Sep 17 00:00:00 2001 From: devdinc Date: Tue, 11 Nov 2025 12:53:25 +0300 Subject: [PATCH 29/41] chore: Add `Open Link in Glance` option to context menu, p=#11241 * Update zen-general.ftl Signed-off-by: devdinc * Update nsContextMenu-sys-mjs.patch Signed-off-by: devdinc * Update ZenGlanceManager.mjs Signed-off-by: devdinc * Update zen-general.ftl Signed-off-by: devdinc * Update ZenGlanceManager.mjs Signed-off-by: devdinc * chore: Cleanup and fix patches, b=no-bug, c=glance --------- Signed-off-by: devdinc Co-authored-by: mr. m --- locales/en-US/browser/browser/zen-general.ftl | 4 ++++ src/browser/base/content/nsContextMenu-sys-mjs.patch | 10 +++++----- src/zen/glance/ZenGlanceManager.mjs | 12 ++++++++++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/locales/en-US/browser/browser/zen-general.ftl b/locales/en-US/browser/browser/zen-general.ftl index 49fe38cf0..3cd708737 100644 --- a/locales/en-US/browser/browser/zen-general.ftl +++ b/locales/en-US/browser/browser/zen-general.ftl @@ -116,3 +116,7 @@ zen-site-data-setting-site-protection = Tracking Protection zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions. + +zen-open-link-in-glance = + .label = Open Link in Glance + .accesskey = G diff --git a/src/browser/base/content/nsContextMenu-sys-mjs.patch b/src/browser/base/content/nsContextMenu-sys-mjs.patch index d705ed870..b872d46b7 100644 --- a/src/browser/base/content/nsContextMenu-sys-mjs.patch +++ b/src/browser/base/content/nsContextMenu-sys-mjs.patch @@ -1,13 +1,13 @@ diff --git a/browser/base/content/nsContextMenu.sys.mjs b/browser/base/content/nsContextMenu.sys.mjs -index 259b440375c7e84d373a134fea20cdbc1c1bae4b..a9ce22a2391b4ec0bf82ceedd35f4c9d9626bb28 100644 +index 259b440375c7e84d373a134fea20cdbc1c1bae4b..c4a251f0169d22186c2766992ab40366d53582f1 100644 --- a/browser/base/content/nsContextMenu.sys.mjs +++ b/browser/base/content/nsContextMenu.sys.mjs -@@ -1104,6 +1104,8 @@ export class nsContextMenu { +@@ -1103,6 +1103,8 @@ export class nsContextMenu { + !this.onMozExtLink && !this.isSecureAboutPage() ); - + this.showItem("context-zenSplitLink", this.onLink && !this.onMailtoLink && !this.onTelLink); -+ ++ this.showItem("context-zenOpenLinkInGlance", this.onLink && !this.onMailtoLink && !this.onTelLink); + let canNotStrip = lazy.STRIP_ON_SHARE_CAN_DISABLE && !this.#canStripParams(); - diff --git a/src/zen/glance/ZenGlanceManager.mjs b/src/zen/glance/ZenGlanceManager.mjs index 52e452175..27d82b591 100644 --- a/src/zen/glance/ZenGlanceManager.mjs +++ b/src/zen/glance/ZenGlanceManager.mjs @@ -40,6 +40,7 @@ this.#setupEventListeners(); this.#setupPreferences(); this.#setupObservers(); + this.#insertIntoContextMenu(); } #setupEventListeners() { @@ -64,6 +65,17 @@ Services.obs.addObserver(this, 'quit-application-requested'); } + #insertIntoContextMenu() { + const menuitem = document.createXULElement('menuitem'); + menuitem.setAttribute('id', 'context-zenOpenLinkInGlance'); + menuitem.setAttribute('hidden', 'true'); + menuitem.setAttribute('data-l10n-id', 'zen-open-link-in-glance'); + + menuitem.addEventListener('command', () => this.openGlance({ url: gContextMenu.linkURL })); + + document.getElementById('context-sep-open').insertAdjacentElement('beforebegin', menuitem); + } + /** * Handle main command set events for glance operations * @param {Event} event - The command event From 249d793b5deab944e85728fe4273b189f3216cf4 Mon Sep 17 00:00:00 2001 From: Jun Jie <71215065+junnjiee@users.noreply.github.com> Date: Tue, 11 Nov 2025 17:53:39 +0800 Subject: [PATCH 30/41] feat: Ctrl+Tab cycling to keep within essentials/regular tabs only, p=#11242 * feat: ctrl+tab cycles within essential/workspace tabs only * add test for ctrl+tab cycling by attribute * move settings UI related code to /src/zen, revert patches for main.inc.xhtml and main.js, use simple tab filter when current tab is hidden * chore: Cleanup and add extra pref, b=no-bug, c=tests, tabs --------- Co-authored-by: mr. m --- .../browser/preferences/zen-preferences.ftl | 8 +- prefs/zen/zen.yaml | 6 ++ .../components/preferences/zen-settings.js | 41 +++++++++ .../preferences/zenTabsManagement.inc.xhtml | 8 ++ src/toolkit/content/widgets/tabbox-js.patch | 64 ++++++++++++-- src/zen/tests/tabs/browser.toml | 3 +- .../tabs/browser_tabs_cycle_by_attribute.js | 86 +++++++++++++++++++ 7 files changed, 208 insertions(+), 8 deletions(-) create mode 100644 src/zen/tests/tabs/browser_tabs_cycle_by_attribute.js diff --git a/locales/en-US/browser/browser/preferences/zen-preferences.ftl b/locales/en-US/browser/browser/preferences/zen-preferences.ftl index d053124e2..2941a5157 100644 --- a/locales/en-US/browser/browser/preferences/zen-preferences.ftl +++ b/locales/en-US/browser/browser/preferences/zen-preferences.ftl @@ -59,6 +59,12 @@ zen-tabs-unloader-enabled = zen-tabs-close-on-back-with-no-history = .label = Close tab and switch to its owner tab (or most recently used tab) when going back with no history +zen-tabs-cycle-by-attribute = + .label = Ctrl+Tab cycles within Essential or Workspace tabs only +zen-tabs-cycle-ignore-pending-tabs = + .label = Ignore Pending tabs when cycling with Ctrl+Tab +zen-tabs-cycle-by-attribute-warning = Ctrl+Tab will cycle by recently used order, as it is enabled + zen-look-and-feel-compact-toolbar-themed = .label = Use themed background for compact toolbar @@ -150,7 +156,7 @@ zen-theme-marketplace-input-default-placeholder = .placeholder = Type something... pane-zen-marketplace-title = Zen Mods zen-themes-auto-update = - .label = Automatically update installed mods on startup + .label = Automatically update installed mods on startup zen-settings-workspaces-force-container-tabs-to-workspace = .label = Switch to workspace where container is set as default when opening container tabs diff --git a/prefs/zen/zen.yaml b/prefs/zen/zen.yaml index c44a0e626..9c6e9d787 100644 --- a/prefs/zen/zen.yaml +++ b/prefs/zen/zen.yaml @@ -37,3 +37,9 @@ - name: zen.tabs.close-on-back-with-no-history value: true + +- name: zen.tabs.ctrl-tab.ignore-essential-tabs + value: false + +- name: zen.tabs.ctrl-tab.ignore-pending-tabs + value: false diff --git a/src/browser/components/preferences/zen-settings.js b/src/browser/components/preferences/zen-settings.js index a126c8a38..35fbccbf7 100644 --- a/src/browser/components/preferences/zen-settings.js +++ b/src/browser/components/preferences/zen-settings.js @@ -707,13 +707,39 @@ var gZenWorkspacesSettings = { } }, }; + + let toggleZenCycleByAttrWarning = { + observe() { + const warning = document.getElementById('zenTabsCycleByAttributeWarning'); + warning.hidden = !( + Services.prefs.getBoolPref('zen.tabs.ctrl-tab.ignore-essential-tabs', false) && + Services.prefs.getBoolPref('browser.ctrlTab.sortByRecentlyUsed', false) + ); + }, + }; + + toggleZenCycleByAttrWarning.observe(); // call it once on initial load + Services.prefs.addObserver('zen.glance.enabled', tabsUnloaderPrefListener); // We can use the same listener for both prefs Services.prefs.addObserver('zen.workspaces.separate-essentials', tabsUnloaderPrefListener); Services.prefs.addObserver('zen.glance.activation-method', tabsUnloaderPrefListener); + Services.prefs.addObserver( + 'zen.tabs.ctrl-tab.ignore-essential-tabs', + toggleZenCycleByAttrWarning + ); + Services.prefs.addObserver('browser.ctrlTab.sortByRecentlyUsed', toggleZenCycleByAttrWarning); window.addEventListener('unload', () => { Services.prefs.removeObserver('zen.glance.enabled', tabsUnloaderPrefListener); Services.prefs.removeObserver('zen.glance.activation-method', tabsUnloaderPrefListener); Services.prefs.removeObserver('zen.workspaces.separate-essentials', tabsUnloaderPrefListener); + Services.prefs.removeObserver( + 'zen.tabs.ctrl-tab.ignore-essential-tabs', + toggleZenCycleByAttrWarning + ); + Services.prefs.removeObserver( + 'browser.ctrlTab.sortByRecentlyUsed', + toggleZenCycleByAttrWarning + ); }); }, }; @@ -1135,6 +1161,21 @@ Preferences.addAll([ type: 'bool', default: true, }, + { + id: 'zen.tabs.ctrl-tab.ignore-essential-tabs', + type: 'bool', + default: false, + }, + { + id: 'zen.tabs.ctrl-tab.ignore-pending-tabs', + type: 'bool', + default: false, + }, + { + id: 'zen.tabs.close-on-back-with-no-history', + type: 'bool', + default: false, + }, ]); Preferences.addSetting({ diff --git a/src/browser/components/preferences/zenTabsManagement.inc.xhtml b/src/browser/components/preferences/zenTabsManagement.inc.xhtml index 2943b863b..6effbd1bd 100644 --- a/src/browser/components/preferences/zenTabsManagement.inc.xhtml +++ b/src/browser/components/preferences/zenTabsManagement.inc.xhtml @@ -29,6 +29,14 @@ + + +