mirror of
https://github.com/zen-browser/desktop.git
synced 2025-10-02 16:08:41 +00:00
Compare commits
36 Commits
window-syn
...
feat/permi
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c701a24db5 | ||
![]() |
f098ff9ddf | ||
![]() |
8bd7d835b4 | ||
![]() |
236abce07b | ||
![]() |
c1df4a3c3e | ||
![]() |
4f4b1cc140 | ||
![]() |
2c31564f5d | ||
![]() |
ebcd77d9ce | ||
![]() |
69a0ddd03c | ||
![]() |
bb9b7b74aa | ||
![]() |
9887871d01 | ||
![]() |
1300ae2521 | ||
![]() |
a76ce8b0f6 | ||
![]() |
a8712f9aba | ||
![]() |
58a939f2ad | ||
![]() |
428b61d6d4 | ||
![]() |
8d00b54e03 | ||
![]() |
a1a2ae0a67 | ||
![]() |
fc68cc5ab3 | ||
![]() |
1ebe5286f9 | ||
![]() |
2abba4d266 | ||
![]() |
32944f1548 | ||
![]() |
a7f853e0f0 | ||
![]() |
e59c73ae53 | ||
![]() |
d9bc654fc7 | ||
![]() |
bc5e4eb48f | ||
![]() |
028b7d35db | ||
![]() |
a091751e09 | ||
![]() |
cc8dfc693b | ||
![]() |
9a1c466368 | ||
![]() |
88f26d8829 | ||
![]() |
b0d0a79fc5 | ||
![]() |
3146ec1c3b | ||
![]() |
19fbed782d | ||
![]() |
b1d6e0eb21 | ||
![]() |
47181da49e |
8
.github/workflows/build.yml
vendored
8
.github/workflows/build.yml
vendored
@@ -266,9 +266,11 @@ jobs:
|
|||||||
|
|
||||||
- name: Compress
|
- name: Compress
|
||||||
run: |
|
run: |
|
||||||
cd engine
|
tar \
|
||||||
tar --use-compress-program=zstd -hcf ../zen.source.tar.zst *
|
--exclude='./.git' \
|
||||||
cd ..
|
--use-compress-program=zstd \
|
||||||
|
-hcf zen.source.tar.zst \
|
||||||
|
-C engine .
|
||||||
|
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
|
@@ -34,8 +34,8 @@ Zen is a firefox-based browser with the aim of pushing your productivity to a ne
|
|||||||
|
|
||||||
### Firefox Versions
|
### Firefox Versions
|
||||||
|
|
||||||
- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `143.0.1`! 🚀
|
- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `143.0.3`! 🚀
|
||||||
- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 143.0.1`!
|
- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 143.0.3`!
|
||||||
|
|
||||||
### Contributing
|
### Contributing
|
||||||
|
|
||||||
|
@@ -1 +1 @@
|
|||||||
1b0467f0c46520bbed6648f6583a9ba6710d76cb
|
c8042c4961ad61678121d8ce9ca2d17cc85fefbe
|
280
docs/issue-metrics/2025_2025-09-01..2025-09-30.md
Normal file
280
docs/issue-metrics/2025_2025-09-01..2025-09-30.md
Normal file
@@ -0,0 +1,280 @@
|
|||||||
|
# Issue Metrics
|
||||||
|
|
||||||
|
| Metric | Average | Median | 90th percentile |
|
||||||
|
| --- | --- | --- | ---: |
|
||||||
|
| Time to first response | 17:16:35 | 3:11:05 | 1 day, 7:58:23 |
|
||||||
|
| Time to close | 1 day, 8:59:53 | 8:32:05 | 3 days, 14:43:34 |
|
||||||
|
|
||||||
|
| Metric | Count |
|
||||||
|
| --- | ---: |
|
||||||
|
| Number of items that remain open | 123 |
|
||||||
|
| Number of items closed | 139 |
|
||||||
|
| Total number of items created | 262 |
|
||||||
|
|
||||||
|
| Title | URL | Time to first response | Time to close |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| Auto PIP not working upon tab switch | https://github.com/zen-browser/desktop/issues/10645 | None | None |
|
||||||
|
| URL bar Opening on the left side of the browser when clicked on new tab | https://github.com/zen-browser/desktop/issues/10642 | None | None |
|
||||||
|
| Browser opens on wrong monitor on macOS | https://github.com/zen-browser/desktop/issues/10639 | None | None |
|
||||||
|
| All tabs are lost after each update | https://github.com/zen-browser/desktop/issues/10638 | 2:25:57 | None |
|
||||||
|
| Sidebar expands independently | https://github.com/zen-browser/desktop/issues/10637 | 2:21:31 | None |
|
||||||
|
| Onboarding broken (tiny window) on flatpak version | https://github.com/zen-browser/desktop/issues/10635 | None | None |
|
||||||
|
| Bitwarden extension not synching (self hosted) | https://github.com/zen-browser/desktop/issues/10634 | None | None |
|
||||||
|
| Zen completely freezes when clicking on "New Tab" | https://github.com/zen-browser/desktop/issues/10632 | None | None |
|
||||||
|
| Zen Browser URL Bar: Search Engine Highlight Rectangle Looks Broken in Input Mode | https://github.com/zen-browser/desktop/issues/10630 | 9:01:57 | 9:01:57 |
|
||||||
|
| Url bar doesn't fully appear | https://github.com/zen-browser/desktop/issues/10629 | 1:51:21 | 9:11:03 |
|
||||||
|
| 1Password Autofill/Universal Autofill feature fails silently | https://github.com/zen-browser/desktop/issues/10627 | None | None |
|
||||||
|
| Moxfield Bug | https://github.com/zen-browser/desktop/issues/10626 | 16:58:48 | 16:58:48 |
|
||||||
|
| Tabs are not restored on Startup | https://github.com/zen-browser/desktop/issues/10625 | 0:03:14 | None |
|
||||||
|
| Zen uses `$HOME/.mozilla/native-messaging-hosts/` instead of `$HOME/.zen/native-messaging-hosts/` | https://github.com/zen-browser/desktop/issues/10622 | None | None |
|
||||||
|
| No video with supported format and MIME type found | https://github.com/zen-browser/desktop/issues/10620 | 4:38:39 | 4:38:39 |
|
||||||
|
| Youtube window size | https://github.com/zen-browser/desktop/issues/10619 | None | None |
|
||||||
|
| Webpage UI elements glitching and not fully rendering | https://github.com/zen-browser/desktop/issues/10615 | None | None |
|
||||||
|
| bookmarks toolbar failed to collapse automatically in single toolbar mode + compact mode | https://github.com/zen-browser/desktop/issues/10612 | None | 8:56:43 |
|
||||||
|
| Closing "New Tab" in the "List all tabs" toolbar widget causes zen to not exit cleanly | https://github.com/zen-browser/desktop/issues/10610 | 1:45:50 | 12:56:07 |
|
||||||
|
| Opening link in new tab switches focus to new tab instead of staying on current tab | https://github.com/zen-browser/desktop/issues/10609 | 2:14:04 | 13:39:31 |
|
||||||
|
| Webpage flickering/glitching during normal browsing | https://github.com/zen-browser/desktop/issues/10605 | None | None |
|
||||||
|
| Essentials Get jumbled when reopening the browser | https://github.com/zen-browser/desktop/issues/10602 | 0:19:34 | 0:45:36 |
|
||||||
|
| Entering ecom in URL bar shows compact mode as first suggestion. | https://github.com/zen-browser/desktop/issues/10601 | 6:27:16 | 6:27:16 |
|
||||||
|
| Loads of empty windows opening on startup and mysterious tray icon | https://github.com/zen-browser/desktop/issues/10598 | None | None |
|
||||||
|
| URLbar becomes invisible after bookmarking a tab. | https://github.com/zen-browser/desktop/issues/10597 | None | None |
|
||||||
|
| Workspace icons too small with narrow sidebar | https://github.com/zen-browser/desktop/issues/10596 | None | 8:06:55 |
|
||||||
|
| Top toolbar has no background in compact mode after changing space until the URL bar is hovered | https://github.com/zen-browser/desktop/issues/10595 | None | 1:45:30 |
|
||||||
|
| Video controls going under the screen when in fullscreen using Zen in fullscreen mode | https://github.com/zen-browser/desktop/issues/10594 | None | None |
|
||||||
|
| Multiple instances of Zen for each tab | https://github.com/zen-browser/desktop/issues/10593 | 4:55:51 | 4:55:51 |
|
||||||
|
| Tabs Disappear | https://github.com/zen-browser/desktop/issues/10592 | None | 6:02:25 |
|
||||||
|
| Cannot upgrade from `1.15.5b` to `1.16.1b` | https://github.com/zen-browser/desktop/issues/10590 | None | None |
|
||||||
|
| New windows come up with ~200 copies of the same link in the pinned tab of some workspaces | https://github.com/zen-browser/desktop/issues/10589 | None | 15:51:30 |
|
||||||
|
| on_TabGroupsCollapse is hiding currently open tabs | https://github.com/zen-browser/desktop/issues/10587 | 18:18:04 | 18:18:04 |
|
||||||
|
| websites don't properly go fullscreen in split view on Wayland and windows | https://github.com/zen-browser/desktop/issues/10586 | None | 21:23:38 |
|
||||||
|
| Active tabs and URLs not prioritized in URL bar over extensions | https://github.com/zen-browser/desktop/issues/10582 | 8:32:05 | 8:32:05 |
|
||||||
|
| Always floating URL bar does not float on new tab with replace-newtab disabled | https://github.com/zen-browser/desktop/issues/10581 | None | None |
|
||||||
|
| URL bar not respecting browser.urlbar.maxRichResults setting | https://github.com/zen-browser/desktop/issues/10580 | 0:11:00 | None |
|
||||||
|
| "Zoom" Icon is missing in the Application Menu | https://github.com/zen-browser/desktop/issues/10578 | 1 day, 2:23:42 | None |
|
||||||
|
| Search/New Tab Popup Misplaced in Compact Mode (Hidden Vertical Tab Bar) | https://github.com/zen-browser/desktop/issues/10576 | 0:50:41 | 1:38:50 |
|
||||||
|
| Essentials Tab | https://github.com/zen-browser/desktop/issues/10575 | 2:40:40 | 5:34:25 |
|
||||||
|
| Udemy - problem with movies | https://github.com/zen-browser/desktop/issues/10571 | 1:11:04 | 1:11:04 |
|
||||||
|
| Fully lost all data | https://github.com/zen-browser/desktop/issues/10568 | 9:29:58 | 10:31:54 |
|
||||||
|
| Flatpak fails to launch on Fedora 42 (clone() failure EPERM) | https://github.com/zen-browser/desktop/issues/10567 | 1:22:23 | 3:40:35 |
|
||||||
|
| The top bar in compact mode is not controlled by the theme, it appears white | https://github.com/zen-browser/desktop/issues/10566 | 1:47:24 | 1:47:24 |
|
||||||
|
| Pinned extension render bug: pinned extensions are floating on the web page | https://github.com/zen-browser/desktop/issues/10565 | None | None |
|
||||||
|
| Home link not appearing | https://github.com/zen-browser/desktop/issues/10563 | 0:42:18 | 2:59:02 |
|
||||||
|
| Connection to "incoming.telemetry.mozilla.org" on startup. | https://github.com/zen-browser/desktop/issues/10560 | 3:29:10 | 21:14:29 |
|
||||||
|
| Command bar actions not work if they are not translated to selected language | https://github.com/zen-browser/desktop/issues/10559 | None | 4:06:26 |
|
||||||
|
| the address bar does not respect the color theme when compact mode is enabled | https://github.com/zen-browser/desktop/issues/10557 | 0:14:27 | 0:14:27 |
|
||||||
|
| Browser crashing on media playback as of 1.16.1b on Nvidia Wayland (VA-API) | https://github.com/zen-browser/desktop/issues/10555 | 0:14:09 | None |
|
||||||
|
| Split View preview effect still remains after using the Escape key | https://github.com/zen-browser/desktop/issues/10554 | 3:49:15 | 1 day, 0:27:29 |
|
||||||
|
| Spotify is not working | https://github.com/zen-browser/desktop/issues/10553 | 1:42:55 | 1:42:55 |
|
||||||
|
| Command bar features doesn't work with other langage than english | https://github.com/zen-browser/desktop/issues/10551 | None | 0:01:48 |
|
||||||
|
| Nested CSS transform breaks backdrop blur | https://github.com/zen-browser/desktop/issues/10550 | 0:55:22 | 1:22:05 |
|
||||||
|
| (MINOR) URL bar: custom search engine name has uneven background fill than its icon | https://github.com/zen-browser/desktop/issues/10546 | None | None |
|
||||||
|
| Special unicode characters (Chinese, Korean, Japanese, etc.) are not showing | https://github.com/zen-browser/desktop/issues/10545 | 3:45:25 | None |
|
||||||
|
| Computer hard freezes when zen is open with performance intensive tasks going in the background | https://github.com/zen-browser/desktop/issues/10544 | None | None |
|
||||||
|
| 软件开启使用一会后,右上角关闭按钮失效 | https://github.com/zen-browser/desktop/issues/10543 | 5:28:33 | 5:28:33 |
|
||||||
|
| Bookmark menu shows up in wrong place, and its entries' context menu has weird layout problem | https://github.com/zen-browser/desktop/issues/10542 | None | None |
|
||||||
|
| Find bar changes into plain white bar when "X" is clicked | https://github.com/zen-browser/desktop/issues/10541 | 8:22:04 | 10:27:21 |
|
||||||
|
| browser.tabs.closeWindowWithLastTab doesn't work anymore on v1.16.1b | https://github.com/zen-browser/desktop/issues/10540 | 10:59:55 | None |
|
||||||
|
| Some UI Elements are Missing On Some Sites | https://github.com/zen-browser/desktop/issues/10538 | 2:19:13 | 3 days, 22:36:11 |
|
||||||
|
| Browser Freeze on Passkey Call&CallBack Failure | https://github.com/zen-browser/desktop/issues/10533 | None | None |
|
||||||
|
| Wrong sidebar color in compact mode | https://github.com/zen-browser/desktop/issues/10532 | 0:48:09 | 1 day, 17:09:58 |
|
||||||
|
| Playing Audio icon inconsistent on tabs not focused on linux | https://github.com/zen-browser/desktop/issues/10531 | None | 21:06:12 |
|
||||||
|
| Missing "Edit Theme" button in the right click menu | https://github.com/zen-browser/desktop/issues/10530 | 0:56:54 | 1 day, 17:21:25 |
|
||||||
|
| Stars are shown all over all websites | https://github.com/zen-browser/desktop/issues/10529 | 18:59:14 | None |
|
||||||
|
| v1.16b not available on flathub | https://github.com/zen-browser/desktop/issues/10528 | 3:10:02 | 5:21:21 |
|
||||||
|
| Firefox-Zen browser name inconsistency in error page | https://github.com/zen-browser/desktop/issues/10527 | None | None |
|
||||||
|
| Highlight mini window doesn't close automatically | https://github.com/zen-browser/desktop/issues/10526 | None | None |
|
||||||
|
| Zen Browser maximized window overlaps with Windows taskbar area | https://github.com/zen-browser/desktop/issues/10525 | None | 0:37:13 |
|
||||||
|
| Spotify Skipping 7 Songs | https://github.com/zen-browser/desktop/issues/10524 | 2:57:34 | 2:57:34 |
|
||||||
|
| McAfee notifactions from Zen Browser | https://github.com/zen-browser/desktop/issues/10522 | None | 0:24:17 |
|
||||||
|
| Zen Browser crashes occasionally when I download a file | https://github.com/zen-browser/desktop/issues/10520 | 13:03:32 | None |
|
||||||
|
| (SERIOUS BUG DONT IGNORE) Split tab bug report | https://github.com/zen-browser/desktop/issues/10519 | None | 0:01:36 |
|
||||||
|
| tab spliting issue | https://github.com/zen-browser/desktop/issues/10517 | None | 0:51:11 |
|
||||||
|
| Rounded window borders cause choppy scrolling. | https://github.com/zen-browser/desktop/issues/10516 | None | None |
|
||||||
|
| Closing the last tab cannot automatically create a new tab | https://github.com/zen-browser/desktop/issues/10515 | 14:08:09 | 14:08:09 |
|
||||||
|
| Pinned tabs always load from cache. | https://github.com/zen-browser/desktop/issues/10514 | 1:49:05 | None |
|
||||||
|
| Command Bar works only in english language | https://github.com/zen-browser/desktop/issues/10509 | 0:10:10 | 0:10:10 |
|
||||||
|
| Pop up windows don't close properly | https://github.com/zen-browser/desktop/issues/10506 | None | None |
|
||||||
|
| When accessing Alibaba Cloud DataWorks using the Zen browser, it will report Path Not Found: /page/errorbrowser, or Not Online? | https://github.com/zen-browser/desktop/issues/10503 | 10:29:49 | 10:30:28 |
|
||||||
|
| Floating url bar not appering where it is suposed to | https://github.com/zen-browser/desktop/issues/10502 | 3:09:03 | 11:51:16 |
|
||||||
|
| Split tabs are not aligned with other tabs | https://github.com/zen-browser/desktop/issues/10501 | 0:15:04 | 2 days, 14:12:29 |
|
||||||
|
| Microsoft Entra Platform SSO on MacOS | https://github.com/zen-browser/desktop/issues/10498 | 2 days, 12:29:33 | None |
|
||||||
|
| Dragging a split panel to the sidebar opens search for panel id | https://github.com/zen-browser/desktop/issues/10495 | 0:42:53 | None |
|
||||||
|
| After closing all tabs, cmd / ctrl + W does not close the window | https://github.com/zen-browser/desktop/issues/10493 | 1:22:58 | 1:22:58 |
|
||||||
|
| Youtube lags when adblocker is installed. [Seemingly fixed] | https://github.com/zen-browser/desktop/issues/10492 | 4:34:01 | 4:34:01 |
|
||||||
|
| URL Bar mispositioning | https://github.com/zen-browser/desktop/issues/10490 | 0:35:10 | 2:15:20 |
|
||||||
|
| Fullscreen F11 | https://github.com/zen-browser/desktop/issues/10489 | 21:42:02 | 3 days, 20:34:06 |
|
||||||
|
| Combined tabs are not shown properly in the navigation menu | https://github.com/zen-browser/desktop/issues/10488 | 0:41:09 | None |
|
||||||
|
| Translucent color codes do not appear translucent in toolbar themes | https://github.com/zen-browser/desktop/issues/10487 | 6:19:55 | None |
|
||||||
|
| Discord always requires me to log in after closing Zen | https://github.com/zen-browser/desktop/issues/10482 | 7 days, 13:26:09 | None |
|
||||||
|
| 1.16b crashes a lot on Windows 11 | https://github.com/zen-browser/desktop/issues/10481 | 0:19:54 | None |
|
||||||
|
| There is bug on perplexity.ai | https://github.com/zen-browser/desktop/issues/10480 | 2:16:15 | 1 day, 10:27:53 |
|
||||||
|
| Theme bug when Zen not focused. | https://github.com/zen-browser/desktop/issues/10479 | 2:39:03 | None |
|
||||||
|
| Hiding top bar in collapsed bar mode is white | https://github.com/zen-browser/desktop/issues/10478 | 12:23:32 | 7 days, 4:09:44 |
|
||||||
|
| URL preview in split screen always appears on focused window | https://github.com/zen-browser/desktop/issues/10477 | 1:20:54 | None |
|
||||||
|
| After the update, all loose tabs disappeared!!! | https://github.com/zen-browser/desktop/issues/10476 | None | None |
|
||||||
|
| Compact Mode Url position | https://github.com/zen-browser/desktop/issues/10475 | 2:15:11 | 4:17:47 |
|
||||||
|
| Zen captures all touchpad input and no other applications receive it, even if they're in the foreground (including desktop) | https://github.com/zen-browser/desktop/issues/10474 | None | None |
|
||||||
|
| Toolbar 'Edit Theme' features broken | https://github.com/zen-browser/desktop/issues/10473 | None | 12:09:50 |
|
||||||
|
| Camera / Microphone Permissions | https://github.com/zen-browser/desktop/issues/10471 | 0:09:35 | None |
|
||||||
|
| Cannot drag sidebar tabs | https://github.com/zen-browser/desktop/issues/10466 | 7 days, 19:48:26 | None |
|
||||||
|
| tool bar not responsive | https://github.com/zen-browser/desktop/issues/10465 | None | None |
|
||||||
|
| Zen adaptive history doesn't work (auto-suggestions don't change ranks) | https://github.com/zen-browser/desktop/issues/10464 | 6:38:12 | None |
|
||||||
|
| Udemy Videos not playing(some DRM issue) | https://github.com/zen-browser/desktop/issues/10462 | 0:26:28 | 0:26:28 |
|
||||||
|
| Clicking a link to open to a new tab from a page in a folder opens outside of the folder instead of staying inside it | https://github.com/zen-browser/desktop/issues/10461 | 1:22:00 | 1:36:41 |
|
||||||
|
| bookmark tool bar on full screen mode | https://github.com/zen-browser/desktop/issues/10460 | 7:11:57 | None |
|
||||||
|
| Compact mode: hide tab not work | https://github.com/zen-browser/desktop/issues/10459 | 7:21:59 | 7:26:31 |
|
||||||
|
| Error Building on mac, suggested fix as well | https://github.com/zen-browser/desktop/issues/10458 | None | None |
|
||||||
|
| Clicking on a duplicated tab of an essential tab causes switching to the last workspace | https://github.com/zen-browser/desktop/issues/10457 | 2 days, 11:37:42 | None |
|
||||||
|
| Very long opening times | https://github.com/zen-browser/desktop/issues/10456 | 1 day, 12:13:47 | None |
|
||||||
|
| Browser window doesn't close when closing last tab | https://github.com/zen-browser/desktop/issues/10455 | None | 22:08:46 |
|
||||||
|
| Passkeys not supported | https://github.com/zen-browser/desktop/issues/10454 | 2:29:55 | 2 days, 8:28:48 |
|
||||||
|
| Focus Bitwader | https://github.com/zen-browser/desktop/issues/10447 | 1 day, 6:48:09 | 1 day, 6:48:09 |
|
||||||
|
| Unable to change workspace name | https://github.com/zen-browser/desktop/issues/10446 | None | None |
|
||||||
|
| Udemy video's don't play in Zen. | https://github.com/zen-browser/desktop/issues/10443 | 0:52:31 | 1 day, 21:47:45 |
|
||||||
|
| SoundCloud audio stops when joining Discord voice in browser | https://github.com/zen-browser/desktop/issues/10441 | None | None |
|
||||||
|
| Calling browser.search.search (from webextensions API) opens glance window instead of new tab. | https://github.com/zen-browser/desktop/issues/10439 | 1:36:27 | None |
|
||||||
|
| Side bar expands when you remove pinned extension. | https://github.com/zen-browser/desktop/issues/10438 | 1 day, 2:34:08 | None |
|
||||||
|
| Compact mode X Bookmarks on Zen startup / Closing all pages | https://github.com/zen-browser/desktop/issues/10436 | 0:10:16 | None |
|
||||||
|
| Zen using more resources while using adblocking dns then ublock. | https://github.com/zen-browser/desktop/issues/10435 | 4:22:57 | 2 days, 3:07:53 |
|
||||||
|
| WebRender crashes and switches to Software rendering | https://github.com/zen-browser/desktop/issues/10432 | 5:25:30 | None |
|
||||||
|
| When there are 2 rows of essentials, essentials can only be moved up, not down | https://github.com/zen-browser/desktop/issues/10428 | 1:54:32 | 8 days, 4:33:00 |
|
||||||
|
| moz-extension page doesnt load for distill web monitor | https://github.com/zen-browser/desktop/issues/10427 | None | None |
|
||||||
|
| Sidebar incorrectly overlapping with address bar | https://github.com/zen-browser/desktop/issues/10426 | None | None |
|
||||||
|
| Unexpected window pops when aborting bitwarden validation | https://github.com/zen-browser/desktop/issues/10419 | 0:47:28 | 1:04:53 |
|
||||||
|
| Redundant `margin-left` on `#sidebar-box` when zen tabs are on the right | https://github.com/zen-browser/desktop/issues/10415 | None | 5:41:18 |
|
||||||
|
| Toolbar cannot be automatically hidden in the compact mode | https://github.com/zen-browser/desktop/issues/10414 | 6:26:39 | None |
|
||||||
|
| Closing and then reopening the last tab that's part of a split screen (3+ split screen tabs) breaks the split screen | https://github.com/zen-browser/desktop/issues/10413 | None | 14:22:44 |
|
||||||
|
| Opening links from external apps creates a new window but doesn’t redirect to the target URL | https://github.com/zen-browser/desktop/issues/10409 | None | None |
|
||||||
|
| No Youtube Live Chat | https://github.com/zen-browser/desktop/issues/10408 | 0:14:57 | None |
|
||||||
|
| Pinned tab is not focused when closing child tab; focus snaps to last pin instead of owner | https://github.com/zen-browser/desktop/issues/10407 | 1:28:19 | 1:28:19 |
|
||||||
|
| Huge CPU usage and RAM comsumption when idle | https://github.com/zen-browser/desktop/issues/10406 | 3:24:27 | None |
|
||||||
|
| Browsing history reset itself unexpectedly | https://github.com/zen-browser/desktop/issues/10403 | None | None |
|
||||||
|
| Opening new background tab(Middle mouse click) from within folder opens new tab outside folder | https://github.com/zen-browser/desktop/issues/10399 | 4:44:58 | 7:04:02 |
|
||||||
|
| Icons for webpages in the Essentials tab don't load on startup. | https://github.com/zen-browser/desktop/issues/10398 | None | 0:03:42 |
|
||||||
|
| Can't sign in to any Google services, says cookies are disabled | https://github.com/zen-browser/desktop/issues/10397 | 1:28:00 | 1 day, 6:18:57 |
|
||||||
|
| Zen crashes on Fedora Linux | https://github.com/zen-browser/desktop/issues/10395 | 0:53:47 | 1 day, 7:05:12 |
|
||||||
|
| Audio bugs on Google Meet | https://github.com/zen-browser/desktop/issues/10394 | 15:13:01 | None |
|
||||||
|
| Pinned split screen tabs still not preserved when opening a new window (issue #8583 remains unresolved) | https://github.com/zen-browser/desktop/issues/10388 | None | None |
|
||||||
|
| A cursor appears when I click on the screen | https://github.com/zen-browser/desktop/issues/10387 | 1:39:24 | 4:27:59 |
|
||||||
|
| Custom set images that you upload yourself for Firefox Home new tab wallpapers have been broken for a while. | https://github.com/zen-browser/desktop/issues/10384 | 15:32:44 | 3 days, 14:22:59 |
|
||||||
|
| Scrolling lag when looking at preview (glance) of a webpage when using mouse input | https://github.com/zen-browser/desktop/issues/10382 | None | 3:43:58 |
|
||||||
|
| Apple's accout verification Not Working | https://github.com/zen-browser/desktop/issues/10381 | None | 1 day, 22:20:39 |
|
||||||
|
| Find bar doesn't go away | https://github.com/zen-browser/desktop/issues/10380 | 4:16:03 | 4:16:08 |
|
||||||
|
| Cookies, data, history, and all tabs close and are deleted on every browser restart, despite turning off the settings to do so. | https://github.com/zen-browser/desktop/issues/10377 | None | None |
|
||||||
|
| Windows Navigation Icons not Showing Up on Zen | https://github.com/zen-browser/desktop/issues/10374 | None | None |
|
||||||
|
| 无法打开部分网站,显示安全问题或超时 | https://github.com/zen-browser/desktop/issues/10372 | 0:12:19 | 0:12:19 |
|
||||||
|
| Merci App extension not working - Login not working | https://github.com/zen-browser/desktop/issues/10370 | 3:56:26 | 6:10:52 |
|
||||||
|
| Compact mode tabs overlay stays fixed on top of bookmarks bar | https://github.com/zen-browser/desktop/issues/10369 | None | 4:13:01 |
|
||||||
|
| Browsing history reset itself unexpectedly | https://github.com/zen-browser/desktop/issues/10367 | 9:50:29 | 2 days, 10:39:26 |
|
||||||
|
| Choppy animation while hovering on top bar area in single toolbar compact mode with google doc file open | https://github.com/zen-browser/desktop/issues/10366 | 0:45:17 | None |
|
||||||
|
| Logged me out of everything after Restart | https://github.com/zen-browser/desktop/issues/10365 | 0:06:34 | None |
|
||||||
|
| Discord fails at uploading and playing media | https://github.com/zen-browser/desktop/issues/10364 | 1:35:04 | 17:56:18 |
|
||||||
|
| Pinned tabs inconsisntely dissapear and reappear in the sidebar | https://github.com/zen-browser/desktop/issues/10363 | 2:23:29 | None |
|
||||||
|
| 1Password no longer allowing touch ID on latest release | https://github.com/zen-browser/desktop/issues/10362 | 2:03:43 | 21:35:42 |
|
||||||
|
| [Linux: Flatpak] Can't open certain local-network URLs | https://github.com/zen-browser/desktop/issues/10360 | 4 days, 15:35:37 | None |
|
||||||
|
| Discord WebApp Issue with Audio | https://github.com/zen-browser/desktop/issues/10358 | None | 5:03:34 |
|
||||||
|
| Apple Security Blocked | https://github.com/zen-browser/desktop/issues/10354 | None | None |
|
||||||
|
| Always Blank Screen - although It's working and loading Pages | https://github.com/zen-browser/desktop/issues/10353 | 0:21:31 | 8 days, 17:02:49 |
|
||||||
|
| Tabs are lost then a workspace deletion is synced | https://github.com/zen-browser/desktop/issues/10345 | None | None |
|
||||||
|
| Fix | https://github.com/zen-browser/desktop/issues/10344 | 8:18:05 | 1 day, 9:23:10 |
|
||||||
|
| 1px white border on the top of the window which wasnt there before | https://github.com/zen-browser/desktop/issues/10342 | 2 days, 0:57:48 | None |
|
||||||
|
| zen browser isn't closing correctly | https://github.com/zen-browser/desktop/issues/10337 | 8:28:03 | 17:42:22 |
|
||||||
|
| Fix Multiple Tabs/Containers in Split View in Sidebar | https://github.com/zen-browser/desktop/issues/10335 | None | None |
|
||||||
|
| Fresh install: "Essentials" are grayed out for some sites | https://github.com/zen-browser/desktop/issues/10333 | 0:17:20 | 2:38:34 |
|
||||||
|
| Unticking 'Open Previous Tabs on Startup' messes with pinened folders | https://github.com/zen-browser/desktop/issues/10331 | None | None |
|
||||||
|
| Can't open Connection secure (certificate) 'page' anymore | https://github.com/zen-browser/desktop/issues/10330 | 1:25:14 | 4:54:22 |
|
||||||
|
| Some favicons of pins / essentials disappear when restarting without `Open previous windows and tabs` | https://github.com/zen-browser/desktop/issues/10329 | 3:12:08 | None |
|
||||||
|
| X Spaces breaks when Mic is requested | https://github.com/zen-browser/desktop/issues/10328 | 12 days, 16:06:32 | None |
|
||||||
|
| Tabs on Right , have Weird White Container that come out of nowhere | https://github.com/zen-browser/desktop/issues/10327 | None | 0:50:40 |
|
||||||
|
| Multiacccount containers + Mozilla sync deletes all custom containers | https://github.com/zen-browser/desktop/issues/10324 | None | None |
|
||||||
|
| Cannot open Links from Thunderbird emails in Zen browser | https://github.com/zen-browser/desktop/issues/10323 | 2 days, 7:50:34 | None |
|
||||||
|
| As long as the Baidu search engine exists in the search engine, the Baidu search engine in the quick search interface is at the top, regardless of whether it is checked or not. | https://github.com/zen-browser/desktop/issues/10322 | 1 day, 0:23:30 | None |
|
||||||
|
| Your tab just crashed | https://github.com/zen-browser/desktop/issues/10321 | None | None |
|
||||||
|
| Can not import bookmarks from FF | https://github.com/zen-browser/desktop/issues/10320 | None | None |
|
||||||
|
| Separate accounts across workspaces; should workspaces have different cookies and site data? | https://github.com/zen-browser/desktop/issues/10319 | 0:20:35 | None |
|
||||||
|
| folder names are a different font size | https://github.com/zen-browser/desktop/issues/10318 | 2:06:09 | 3 days, 16:05:52 |
|
||||||
|
| zen.view.experimental-no-window-controls stopped working | https://github.com/zen-browser/desktop/issues/10317 | 7:18:21 | 13:06:50 |
|
||||||
|
| Images get corrupted when uploading on Zen Browser (Flatpak + AUR, Linux + Wayland + NVIDIA) | https://github.com/zen-browser/desktop/issues/10316 | None | 4:13:56 |
|
||||||
|
| Popout Tab extensions not working | https://github.com/zen-browser/desktop/issues/10315 | None | None |
|
||||||
|
| Zen Browser freezing after waking from suspend | https://github.com/zen-browser/desktop/issues/10314 | 1 day, 7:54:39 | None |
|
||||||
|
| compact mode not working | https://github.com/zen-browser/desktop/issues/10313 | 3:21:50 | 12:27:20 |
|
||||||
|
| libnotify not used in Flatpak | https://github.com/zen-browser/desktop/issues/10310 | 19:30:48 | 19:30:48 |
|
||||||
|
| Essentials Tab order reset everytime I restart Zen Browser | https://github.com/zen-browser/desktop/issues/10309 | 1:24:30 | None |
|
||||||
|
| [ux]first keydown on fill bar is plain focus, enforce type wwhat to typeout what. on chatgpt.com | https://github.com/zen-browser/desktop/issues/10308 | 4:52:52 | 4:52:52 |
|
||||||
|
| Copying URL using shortcut when in reader mode does not work as expected | https://github.com/zen-browser/desktop/issues/10303 | 0:04:42 | None |
|
||||||
|
| Reopening Closed Tabs (Ctrl+Shift+T) Duplicates Essentials/Pinned, Causing Loss on Next Session If The Dupes Were Closed | https://github.com/zen-browser/desktop/issues/10302 | 4 days, 23:41:33 | None |
|
||||||
|
| Tabs within Folders in Workspaces switch back to the default workspace | https://github.com/zen-browser/desktop/issues/10299 | None | None |
|
||||||
|
| Can't clear the cookies and site data due to a UI bug | https://github.com/zen-browser/desktop/issues/10298 | 6:00:32 | 6:00:32 |
|
||||||
|
| Cannot move pinned tab to the top of normal tabs | https://github.com/zen-browser/desktop/issues/10295 | None | None |
|
||||||
|
| Mouse cursor position can have an undesirable effect on the tab switcher | https://github.com/zen-browser/desktop/issues/10292 | 2:12:31 | 2:29:10 |
|
||||||
|
| Essential tabs and Pinned tabs (including the ones inside a folder) do not load on startup | https://github.com/zen-browser/desktop/issues/10291 | 2:47:15 | None |
|
||||||
|
| Browser doesn't launch after update | https://github.com/zen-browser/desktop/issues/10290 | 4:30:50 | None |
|
||||||
|
| Double-click on sidebar no longer opens a new tab after recent Zen update | https://github.com/zen-browser/desktop/issues/10289 | 12:03:10 | 12:03:10 |
|
||||||
|
| ArchLinux AUR: Quellen für ‚zen-browser-bin-1.15.4b-1‘ konnten nicht heruntergeladen werden | https://github.com/zen-browser/desktop/issues/10288 | 2:39:09 | 2:39:09 |
|
||||||
|
| Ctrl+Shift+T after reopening Zen mixes tabs from multiple workspaces | https://github.com/zen-browser/desktop/issues/10286 | None | 4 days, 6:16:17 |
|
||||||
|
| Keyboard Input Delay While Typing on Monaco Editors | https://github.com/zen-browser/desktop/issues/10285 | 1 day, 6:25:04 | None |
|
||||||
|
| the top close maximize minimize are shwoing up and not going according to the theme and its just very bugged | https://github.com/zen-browser/desktop/issues/10284 | 5:13:41 | 6:27:09 |
|
||||||
|
| New Tab opens in new window. | https://github.com/zen-browser/desktop/issues/10283 | 0:29:33 | None |
|
||||||
|
| Can only open in safe mode. 1.15.5b | https://github.com/zen-browser/desktop/issues/10282 | 2:10:07 | 3:33:03 |
|
||||||
|
| Copy to Cliboard button in the url bar not working | https://github.com/zen-browser/desktop/issues/10281 | 2 days, 6:09:05 | 20 days, 2:34:28 |
|
||||||
|
| After the 1.15.4b update, the automatic hiding of the top and tab is not working | https://github.com/zen-browser/desktop/issues/10280 | 4:35:52 | 16:55:08 |
|
||||||
|
| Cannot move window when holding down left mouse button on sidebar | https://github.com/zen-browser/desktop/issues/10278 | 3 days, 19:54:46 | 3 days, 21:15:09 |
|
||||||
|
| Sidebar always visible in compact mode after right-clicking container icon when opening a new tab | https://github.com/zen-browser/desktop/issues/10276 | 1:53:46 | None |
|
||||||
|
| zen cannot play youtube livestreams | https://github.com/zen-browser/desktop/issues/10274 | 5:07:19 | None |
|
||||||
|
| Compact sidebar pops up when opening menus in menubar | https://github.com/zen-browser/desktop/issues/10273 | None | None |
|
||||||
|
| Newest Update — weird Bookmarks behavior | https://github.com/zen-browser/desktop/issues/10272 | None | 0:34:25 |
|
||||||
|
| Double-clicking no longer opens a new tab. | https://github.com/zen-browser/desktop/issues/10270 | 1:23:48 | 2:13:30 |
|
||||||
|
| Theme is inconsistent with and without focus | https://github.com/zen-browser/desktop/issues/10268 | None | None |
|
||||||
|
| Tabs inside folder goes invisible when closing folder | https://github.com/zen-browser/desktop/issues/10267 | 10:34:08 | 11:05:06 |
|
||||||
|
| Essentials/Pinned tabs are removed with middle click | https://github.com/zen-browser/desktop/issues/10266 | 2:33:21 | 11:29:40 |
|
||||||
|
| Creating split window by dragging pinned Essentials icon removes the Essential icon | https://github.com/zen-browser/desktop/issues/10264 | None | None |
|
||||||
|
| Macos: extention pop-ups open up at a different desktop in fullscreen | https://github.com/zen-browser/desktop/issues/10260 | None | None |
|
||||||
|
| Split tabs can't be moved to new workspace | https://github.com/zen-browser/desktop/issues/10256 | None | 11:32:53 |
|
||||||
|
| Google account not shared between spaces — must re-add to sign in to Figma | https://github.com/zen-browser/desktop/issues/10255 | 8:43:21 | None |
|
||||||
|
| Split tabs context menu does not show when selecting already split tabs | https://github.com/zen-browser/desktop/issues/10254 | 1 day, 8:31:56 | None |
|
||||||
|
| Netflix Error F7121-1331 | https://github.com/zen-browser/desktop/issues/10251 | 2:31:38 | 0:02:34 |
|
||||||
|
| Gradient themes get cut off if using vertical taskbar on W10 | https://github.com/zen-browser/desktop/issues/10250 | 20 days, 21:52:53 | None |
|
||||||
|
| White/Transparent search bar and bookmarks | https://github.com/zen-browser/desktop/issues/10247 | 11:15:56 | 1 day, 14:35:40 |
|
||||||
|
| Pin tabs duplication | https://github.com/zen-browser/desktop/issues/10246 | 13:43:00 | 13:43:00 |
|
||||||
|
| Zen window transparency only works when window is maximized | https://github.com/zen-browser/desktop/issues/10243 | None | None |
|
||||||
|
| Cursor rapid flickering on random places within the browser window when graphic tablet is used | https://github.com/zen-browser/desktop/issues/10242 | 21:55:18 | 21:57:24 |
|
||||||
|
| MIssing last second(s) in certain audios | https://github.com/zen-browser/desktop/issues/10240 | None | None |
|
||||||
|
| Issue with Transparency Effect in background in Zen Browser | https://github.com/zen-browser/desktop/issues/10239 | 3:36:39 | 18 days, 3:00:45 |
|
||||||
|
| Zen icon does not load even apon restart. | https://github.com/zen-browser/desktop/issues/10238 | 1 day, 7:03:03 | 1 day, 7:03:03 |
|
||||||
|
| Discord login page does not load | https://github.com/zen-browser/desktop/issues/10234 | None | None |
|
||||||
|
| Native window title doesn't show Page title(document.title) when tab is pinned and renamed, shows only profile name and app name | https://github.com/zen-browser/desktop/issues/10232 | None | None |
|
||||||
|
| Enabling "Always use private browsing mode" results in totally black UI | https://github.com/zen-browser/desktop/issues/10231 | None | None |
|
||||||
|
| After newest Update there is now a ugly white Border around the Hidden Compact Sidebar | https://github.com/zen-browser/desktop/issues/10230 | 1 day, 13:55:29 | 2 days, 20:51:00 |
|
||||||
|
| File manager not opening in Arch linux | https://github.com/zen-browser/desktop/issues/10226 | 0:12:51 | None |
|
||||||
|
| Default color back to orange | https://github.com/zen-browser/desktop/issues/10225 | 0:07:41 | 3:10:01 |
|
||||||
|
| NAVEGADOR CONSUMINDO 12 GIGAS? CARALHOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO | https://github.com/zen-browser/desktop/issues/10224 | None | 0:24:57 |
|
||||||
|
| gemini style bug | https://github.com/zen-browser/desktop/issues/10222 | 1:32:02 | 1:04:01 |
|
||||||
|
| Zen Browser opens on the last used virtual desktop instead of the current one | https://github.com/zen-browser/desktop/issues/10221 | 2:07:09 | None |
|
||||||
|
| Tabs having weird behaviour when moving them form one window to the other | https://github.com/zen-browser/desktop/issues/10220 | None | None |
|
||||||
|
| Web pages in the workspace cannot be synced | https://github.com/zen-browser/desktop/issues/10219 | 5 days, 0:56:10 | 5 days, 6:23:07 |
|
||||||
|
| Swipe workspaces gesture freezes on "Mute Tab" icon hover | https://github.com/zen-browser/desktop/issues/10217 | None | None |
|
||||||
|
| Sub-folders of Tabs, Dump Tabs when moved in a Folder List | https://github.com/zen-browser/desktop/issues/10216 | 2 days, 13:52:56 | 4 days, 22:25:16 |
|
||||||
|
| Labels rendering bug | https://github.com/zen-browser/desktop/issues/10215 | 11:10:14 | 3 days, 22:48:16 |
|
||||||
|
| Browser doesn't allow completion of TOTP number on Paypal site | https://github.com/zen-browser/desktop/issues/10214 | None | None |
|
||||||
|
| Unable to use Option+Cmd+ArrowLeft or Option+Cmd+ArrowRight to change spaces. | https://github.com/zen-browser/desktop/issues/10211 | 14:39:09 | 15:34:26 |
|
||||||
|
| The Workspace Icon can't be hided anymore | https://github.com/zen-browser/desktop/issues/10209 | 1:41:32 | 1:41:32 |
|
||||||
|
| Tabs move into Folders | https://github.com/zen-browser/desktop/issues/10208 | 0:24:03 | 7:25:32 |
|
||||||
|
| Native select low contrast theme | https://github.com/zen-browser/desktop/issues/10207 | None | None |
|
||||||
|
| Trackpad zooming on PDF no longer working | https://github.com/zen-browser/desktop/issues/10205 | None | None |
|
||||||
|
| Can’t add tab to Essentials | https://github.com/zen-browser/desktop/issues/10204 | 1:15:16 | 8:15:36 |
|
||||||
|
| Zen browser can't go through system proxies on Linux | https://github.com/zen-browser/desktop/issues/10203 | None | None |
|
||||||
|
| The Browser's adressbar is not visible because it blends into the current viewed page. | https://github.com/zen-browser/desktop/issues/10202 | 0:13:50 | 2 days, 23:44:36 |
|
||||||
|
| Wrong favicon instead of cached icons bug is back | https://github.com/zen-browser/desktop/issues/10199 | 1 day, 6:59:45 | 2 days, 21:44:37 |
|
||||||
|
| iCloud not working | https://github.com/zen-browser/desktop/issues/10192 | 6:18:44 | 11:56:51 |
|
||||||
|
| Truncated folder name in the search inside folders feature | https://github.com/zen-browser/desktop/issues/10189 | 2:31:02 | None |
|
||||||
|
| Missing translations in the search inside folders feature | https://github.com/zen-browser/desktop/issues/10188 | 2:16:01 | 2:16:01 |
|
||||||
|
| New "floadting" tab bar window covers bookmark bar | https://github.com/zen-browser/desktop/issues/10186 | 6:07:17 | 16:21:43 |
|
||||||
|
| Revert 1.15.3b!!!! | https://github.com/zen-browser/desktop/issues/10185 | 1:12:24 | 1:03:18 |
|
||||||
|
| "New Tab Below" menu item when right clicking on a tab no longer shows after upgrading from 1.14.11b | https://github.com/zen-browser/desktop/issues/10184 | None | 2:40:19 |
|
||||||
|
| Multiple bugs with new folder Feature | https://github.com/zen-browser/desktop/issues/10182 | 1:37:43 | None |
|
||||||
|
| New window bug - unpinned tabs disappear, folders expand | https://github.com/zen-browser/desktop/issues/10180 | 2:22:55 | 2:22:55 |
|
||||||
|
| Essentials not syncing across all spaces in same container | https://github.com/zen-browser/desktop/issues/10179 | 3:37:37 | 24 days, 5:11:42 |
|
||||||
|
| Macos Universal download installer | https://github.com/zen-browser/desktop/issues/10175 | 7:10:27 | 7:10:27 |
|
||||||
|
|
||||||
|
_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-09-01..2025-09-30`
|
@@ -48,4 +48,4 @@ zen-icons-picker-emoji =
|
|||||||
.label = Emojis
|
.label = Emojis
|
||||||
zen-icons-picker-svg =
|
zen-icons-picker-svg =
|
||||||
.label = Icones
|
.label = Icones
|
||||||
urlbar-search-mode-zen_actions = Actions
|
urlbar-search-mode-zen_actions = Accions
|
||||||
|
@@ -48,4 +48,4 @@ zen-icons-picker-emoji =
|
|||||||
.label = Emojis
|
.label = Emojis
|
||||||
zen-icons-picker-svg =
|
zen-icons-picker-svg =
|
||||||
.label = Symbole
|
.label = Symbole
|
||||||
urlbar-search-mode-zen_actions = Actions
|
urlbar-search-mode-zen_actions = Aktionen
|
||||||
|
@@ -64,3 +64,24 @@ zen-icons-picker-svg =
|
|||||||
.label = Icons
|
.label = Icons
|
||||||
|
|
||||||
urlbar-search-mode-zen_actions = Actions
|
urlbar-search-mode-zen_actions = Actions
|
||||||
|
zen-site-data-settings = Settings
|
||||||
|
|
||||||
|
zen-generic-manage = Manage
|
||||||
|
zen-generic-more = More
|
||||||
|
|
||||||
|
# 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-security-info-extension =
|
||||||
|
.label = Extension
|
||||||
|
zen-site-data-security-info-secure =
|
||||||
|
.label = Secure
|
||||||
|
zen-site-data-security-info-not-secure =
|
||||||
|
.label = Not Secure
|
||||||
|
|
||||||
|
zen-site-data-manage-addons =
|
||||||
|
.label = Manage Extensions
|
||||||
|
zen-site-data-get-addons =
|
||||||
|
.label = Add Extensions
|
||||||
|
zen-site-data-site-settings =
|
||||||
|
.label = All Site Settings
|
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Réinitialiser l’onglet épinglé
|
.label = Réinitialiser l’onglet épinglé
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Ajouter aux Essentials ({ $num } / 12 emplacements remplis)
|
.label = Ajouter aux Essentials ({ $num }/12 emplacements occupés)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Retirer des Essentials
|
.label = Retirer des Essentials
|
||||||
|
@@ -48,4 +48,4 @@ zen-icons-picker-emoji =
|
|||||||
.label = Emojis
|
.label = Emojis
|
||||||
zen-icons-picker-svg =
|
zen-icons-picker-svg =
|
||||||
.label = Deilbhíní
|
.label = Deilbhíní
|
||||||
urlbar-search-mode-zen_actions = Actions
|
urlbar-search-mode-zen_actions = Gníomhartha
|
||||||
|
@@ -48,4 +48,4 @@ zen-icons-picker-emoji =
|
|||||||
.label = Emoji
|
.label = Emoji
|
||||||
zen-icons-picker-svg =
|
zen-icons-picker-svg =
|
||||||
.label = Ikon
|
.label = Ikon
|
||||||
urlbar-search-mode-zen_actions = Actions
|
urlbar-search-mode-zen_actions = Aksi
|
||||||
|
@@ -48,4 +48,4 @@ zen-icons-picker-emoji =
|
|||||||
.label = 이모티콘
|
.label = 이모티콘
|
||||||
zen-icons-picker-svg =
|
zen-icons-picker-svg =
|
||||||
.label = 아이콘
|
.label = 아이콘
|
||||||
urlbar-search-mode-zen_actions = Actions
|
urlbar-search-mode-zen_actions = 액션
|
||||||
|
@@ -48,4 +48,4 @@ zen-icons-picker-emoji =
|
|||||||
.label = Emojis
|
.label = Emojis
|
||||||
zen-icons-picker-svg =
|
zen-icons-picker-svg =
|
||||||
.label = Ícones
|
.label = Ícones
|
||||||
urlbar-search-mode-zen_actions = Actions
|
urlbar-search-mode-zen_actions = Ações
|
||||||
|
@@ -48,4 +48,4 @@ zen-icons-picker-emoji =
|
|||||||
.label = Емоджі
|
.label = Емоджі
|
||||||
zen-icons-picker-svg =
|
zen-icons-picker-svg =
|
||||||
.label = Значки
|
.label = Значки
|
||||||
urlbar-search-mode-zen_actions = Actions
|
urlbar-search-mode-zen_actions = Дії
|
||||||
|
@@ -27,7 +27,7 @@ zen-glance-trigger-shift-click =
|
|||||||
zen-glance-trigger-meta-click =
|
zen-glance-trigger-meta-click =
|
||||||
.label = Meta (Command) + 左鍵
|
.label = Meta (Command) + 左鍵
|
||||||
zen-glance-trigger-mantain-click =
|
zen-glance-trigger-mantain-click =
|
||||||
.label = 長按(即將上線!)
|
.label = 長按(即將推出!)
|
||||||
zen-look-and-feel-compact-view-header = 在緊湊模式下顯示
|
zen-look-and-feel-compact-view-header = 在緊湊模式下顯示
|
||||||
zen-look-and-feel-compact-view-description = 只顯示你需要用的工具欄!
|
zen-look-and-feel-compact-view-description = 只顯示你需要用的工具欄!
|
||||||
zen-look-and-feel-compact-view-enabled =
|
zen-look-and-feel-compact-view-enabled =
|
||||||
@@ -92,12 +92,12 @@ zen-vertical-tabs-expand-tabs-header = 如何擴展分頁
|
|||||||
zen-vertical-tabs-expand-tabs-description = 選擇要如何擴展側邊欄中的分頁
|
zen-vertical-tabs-expand-tabs-description = 選擇要如何擴展側邊欄中的分頁
|
||||||
zen-theme-marketplace-header = Zen 模組
|
zen-theme-marketplace-header = Zen 模組
|
||||||
zen-theme-disable-all-enabled =
|
zen-theme-disable-all-enabled =
|
||||||
.title = 啟用所有主題
|
.title = 啟用所有模組
|
||||||
zen-theme-disable-all-disabled =
|
zen-theme-disable-all-disabled =
|
||||||
.title = 停用所有主題
|
.title = 停用所有模組
|
||||||
zen-theme-marketplace-description = 從商店尋找並安裝主題。
|
zen-theme-marketplace-description = 從商店尋找並安裝模組。
|
||||||
zen-theme-marketplace-remove-button =
|
zen-theme-marketplace-remove-button =
|
||||||
.label = 移除主題
|
.label = 移除模組
|
||||||
zen-theme-marketplace-check-for-updates-button =
|
zen-theme-marketplace-check-for-updates-button =
|
||||||
.label = 檢查更新
|
.label = 檢查更新
|
||||||
zen-theme-marketplace-import-button =
|
zen-theme-marketplace-import-button =
|
||||||
@@ -114,15 +114,15 @@ zen-theme-marketplace-toggle-enabled-button =
|
|||||||
.title = 關閉佈景主題
|
.title = 關閉佈景主題
|
||||||
zen-theme-marketplace-toggle-disabled-button =
|
zen-theme-marketplace-toggle-disabled-button =
|
||||||
.title = 啟用佈景主題
|
.title = 啟用佈景主題
|
||||||
zen-theme-marketplace-remove-confirmation = 您確定要移除此模組?
|
zen-theme-marketplace-remove-confirmation = 您確定要移除此模組?
|
||||||
zen-theme-marketplace-close-modal = 關閉
|
zen-theme-marketplace-close-modal = 關閉
|
||||||
zen-theme-marketplace-theme-header-title =
|
zen-theme-marketplace-theme-header-title =
|
||||||
.title = CSS 選擇器:{ $name }
|
.title = CSS 選擇器:{ $name }
|
||||||
zen-theme-marketplace-dropdown-default-label =
|
zen-theme-marketplace-dropdown-default-label =
|
||||||
.label = 無
|
.label = 無
|
||||||
zen-theme-marketplace-input-default-placeholder =
|
zen-theme-marketplace-input-default-placeholder =
|
||||||
.placeholder = 請輸入
|
.placeholder = 請輸入...
|
||||||
pane-zen-marketplace-title = Zen 模式
|
pane-zen-marketplace-title = Zen 模組
|
||||||
zen-themes-auto-update =
|
zen-themes-auto-update =
|
||||||
.label = 啟動時自動更新已安裝模組
|
.label = 啟動時自動更新已安裝模組
|
||||||
zen-settings-workspaces-force-container-tabs-to-workspace =
|
zen-settings-workspaces-force-container-tabs-to-workspace =
|
||||||
@@ -150,12 +150,12 @@ pane-zen-CKS-title = 快捷鍵
|
|||||||
category-zen-CKS =
|
category-zen-CKS =
|
||||||
.tooltiptext = { pane-zen-CKS-title }
|
.tooltiptext = { pane-zen-CKS-title }
|
||||||
pane-settings-CKS-title = { -brand-short-name } 快捷鍵
|
pane-settings-CKS-title = { -brand-short-name } 快捷鍵
|
||||||
zen-settings-CKS-header = 自定義你的快捷鍵
|
zen-settings-CKS-header = 自定義您的快捷鍵
|
||||||
zen-settings-CKS-description = 依據你的愛好來更改預設的快捷鍵以近一步改善你的瀏覽體驗
|
zen-settings-CKS-description = 依據您的愛好來更改預設的快捷鍵以近一步改善你的瀏覽體驗
|
||||||
zen-settings-CKS-disable-firefox =
|
zen-settings-CKS-disable-firefox =
|
||||||
.label = 停用 { -brand-short-name } 的預設快捷鍵
|
.label = 停用 { -brand-short-name } 的預設快捷鍵
|
||||||
zen-settings-CKS-duplicate-shortcut =
|
zen-settings-CKS-duplicate-shortcut =
|
||||||
.label = 重複的快捷鍵
|
.label = 複製快捷鍵
|
||||||
zen-settings-CKS-reset-shortcuts =
|
zen-settings-CKS-reset-shortcuts =
|
||||||
.label = 重設為預設值
|
.label = 重設為預設值
|
||||||
zenCKSOption-group-other = 其它
|
zenCKSOption-group-other = 其它
|
||||||
@@ -173,13 +173,13 @@ zenCKSOption-group-devTools = 開發人員工具
|
|||||||
zen-key-quick-restart = 快速重啟
|
zen-key-quick-restart = 快速重啟
|
||||||
zen-window-new-shortcut = 開新視窗
|
zen-window-new-shortcut = 開新視窗
|
||||||
zen-tab-new-shortcut = 開新分頁
|
zen-tab-new-shortcut = 開新分頁
|
||||||
zen-key-redo = 重做
|
zen-key-redo = 取消復原
|
||||||
zen-restore-last-closed-tab-shortcut = 復原上次關閉的分頁
|
zen-restore-last-closed-tab-shortcut = 復原上次關閉的分頁
|
||||||
zen-location-open-shortcut = 選取網址列
|
zen-location-open-shortcut = 選取網址列
|
||||||
zen-location-open-shortcut-alt = 選取網址列(備用)
|
zen-location-open-shortcut-alt = 選取網址列(備用)
|
||||||
zen-key-undo-close-window = 還原已關閉視窗
|
zen-key-undo-close-window = 還原已關閉視窗
|
||||||
zen-text-action-undo-shortcut = 復原
|
zen-text-action-undo-shortcut = 復原
|
||||||
zen-text-action-redo-shortcut = 取消「復原」
|
zen-text-action-redo-shortcut = 取消復原
|
||||||
zen-text-action-cut-shortcut = 剪下
|
zen-text-action-cut-shortcut = 剪下
|
||||||
zen-text-action-copy-shortcut = 複製
|
zen-text-action-copy-shortcut = 複製
|
||||||
zen-text-action-copy-url-shortcut = 複製目前網址
|
zen-text-action-copy-url-shortcut = 複製目前網址
|
||||||
@@ -219,9 +219,9 @@ zen-history-show-all-shortcut = 顯示所有歷史
|
|||||||
zen-key-enter-full-screen = 進入全畫面模式
|
zen-key-enter-full-screen = 進入全畫面模式
|
||||||
zen-key-exit-full-screen = 離開全畫面模式
|
zen-key-exit-full-screen = 離開全畫面模式
|
||||||
zen-ai-chatbot-sidebar-shortcut = 開啟 AI 聊天側邊欄
|
zen-ai-chatbot-sidebar-shortcut = 開啟 AI 聊天側邊欄
|
||||||
zen-key-inspector-mac = 開啟檢測器(Mac)
|
zen-key-inspector-mac = 開啟檢測器 (Mac)
|
||||||
zen-toggle-sidebar-shortcut = 開啟 Firefox 側邊欄
|
zen-toggle-sidebar-shortcut = 開啟 Firefox 側邊欄
|
||||||
zen-toggle-pin-tab-shortcut = Toggle Pin Tab
|
zen-toggle-pin-tab-shortcut = 切換釘選分頁
|
||||||
zen-reader-mode-toggle-shortcut-other = 切換閱讀模式
|
zen-reader-mode-toggle-shortcut-other = 切換閱讀模式
|
||||||
zen-picture-in-picture-toggle-shortcut = 切換子母畫面
|
zen-picture-in-picture-toggle-shortcut = 切換子母畫面
|
||||||
zen-nav-reload-shortcut-2 = 重新整理
|
zen-nav-reload-shortcut-2 = 重新整理
|
||||||
|
@@ -1,21 +1,21 @@
|
|||||||
zen-folders-search-placeholder =
|
zen-folders-search-placeholder =
|
||||||
.placeholder = Search { $folder-name }...
|
.placeholder = 搜尋 { $folder-name }...
|
||||||
zen-folders-panel-rename-folder =
|
zen-folders-panel-rename-folder =
|
||||||
.label = Rename Folder
|
.label = 重新命名分頁夾
|
||||||
zen-folders-panel-unpack-folder =
|
zen-folders-panel-unpack-folder =
|
||||||
.label = Unpack Folder
|
.label = 解散分頁夾
|
||||||
zen-folders-new-subfolder =
|
zen-folders-new-subfolder =
|
||||||
.label = New Subfolder
|
.label = 新增子分頁夾
|
||||||
zen-folders-panel-delete-folder =
|
zen-folders-panel-delete-folder =
|
||||||
.label = Delete Folder
|
.label = 刪除分頁夾
|
||||||
zen-folders-panel-convert-folder-to-space =
|
zen-folders-panel-convert-folder-to-space =
|
||||||
.label = Convert folder to Space
|
.label = 將分頁夾轉換為工作區
|
||||||
zen-folders-panel-change-folder-space =
|
zen-folders-panel-change-folder-space =
|
||||||
.label = Change Space...
|
.label = 變更工作區...
|
||||||
zen-folders-panel-change-icon-folder =
|
zen-folders-panel-change-icon-folder =
|
||||||
.label = Change Icon
|
.label = 變更圖示
|
||||||
zen-folders-unload-all-tooltip =
|
zen-folders-unload-all-tooltip =
|
||||||
.tooltiptext = Unload active in this folder
|
.tooltiptext = 卸載此分頁夾中所有分頁
|
||||||
zen-folders-unload-folder =
|
zen-folders-unload-folder =
|
||||||
.label = Unload All Tabs
|
.label = 卸載所有分頁
|
||||||
zen-folders-search-no-results = 沒有找到搜尋的分頁 🤔
|
zen-folders-search-no-results = 找不到符合搜尋的分頁 🤔
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
zen-panel-ui-current-profile-text = 當前設定檔
|
zen-panel-ui-current-profile-text = 當前設定檔
|
||||||
unified-extensions-description = 擴充功能用於為 { -brand-short-name } 帶來更多功能。
|
unified-extensions-description = 擴充功能可為 { -brand-short-name } 帶來更多額外功能。
|
||||||
tab-context-zen-reset-pinned-tab =
|
tab-context-zen-reset-pinned-tab =
|
||||||
.label = 重置釘選的分頁
|
.label = 重置釘選的分頁
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
@@ -12,25 +12,25 @@ tab-context-zen-remove-essential =
|
|||||||
tab-context-zen-replace-pinned-url-with-current =
|
tab-context-zen-replace-pinned-url-with-current =
|
||||||
.label = 將釘選的網址換成目前的網址
|
.label = 將釘選的網址換成目前的網址
|
||||||
.accesskey = C
|
.accesskey = C
|
||||||
zen-themes-corrupted = 你的 { -brand-short-name } 模組文件已損壞,它們已重置為預設佈景主題。
|
zen-themes-corrupted = 你的 { -brand-short-name } 模組文件已損壞,它們已重設為預設主題。
|
||||||
zen-shortcuts-corrupted = 你的 { -brand-short-name } 快捷文件已損壞。它們已被重設為預設值。
|
zen-shortcuts-corrupted = 你的 { -brand-short-name } 快捷文件已損壞。它們已被重設為預設值。
|
||||||
# note: Do not translate the "<br/>" tags in the following string
|
# note: Do not translate the "<br/>" tags in the following string
|
||||||
zen-new-urlbar-notification = 新的 URL 欄已啟用,你不再需要新增新分頁。<br/><br/>馬上打開新分頁來看看新的 URL 欄!
|
zen-new-urlbar-notification = 新的 URL 欄已啟用,你不再需要新增新分頁。<br/><br/>馬上打開新分頁來看看新的 URL 欄!
|
||||||
zen-disable = 禁用
|
zen-disable = 停用
|
||||||
pictureinpicture-minimize-btn =
|
pictureinpicture-minimize-btn =
|
||||||
.aria-label = Minimize
|
.aria-label = 最小化
|
||||||
.tooltip = Minimize
|
.tooltip = 最小化
|
||||||
zen-panel-ui-gradient-generator-custom-color = 自訂顏色
|
zen-panel-ui-gradient-generator-custom-color = 自訂顏色
|
||||||
zen-panel-ui-gradient-generator-saved-message = 漸層儲存成功!
|
zen-panel-ui-gradient-generator-saved-message = 已成功儲存漸層!
|
||||||
zen-copy-current-url-confirmation = 網址已複製到剪貼簿。
|
zen-copy-current-url-confirmation = 網址已複製到剪貼簿。
|
||||||
zen-general-cancel-label =
|
zen-general-cancel-label =
|
||||||
.label = 取消
|
.label = 取消
|
||||||
zen-general-confirm =
|
zen-general-confirm =
|
||||||
.label = 確認
|
.label = 確認
|
||||||
zen-pinned-tab-replaced = 釘選分頁網址已替換為當前當前網址。
|
zen-pinned-tab-replaced = 釘選分頁網址已替換為當前當前網址。
|
||||||
zen-tabs-renamed = 分頁重新命名成功!
|
zen-tabs-renamed = 已成功重新命名分頁!
|
||||||
zen-background-tab-opened-toast = New background tab opened!
|
zen-background-tab-opened-toast = 已在背景開啟新分頁!
|
||||||
zen-workspace-renamed-toast = Workspace has been successfully renamed!
|
zen-workspace-renamed-toast = 已成功重新命名工作區!
|
||||||
zen-library-sidebar-workspaces =
|
zen-library-sidebar-workspaces =
|
||||||
.label = 工作區
|
.label = 工作區
|
||||||
zen-library-sidebar-mods =
|
zen-library-sidebar-mods =
|
||||||
@@ -45,5 +45,5 @@ zen-singletoolbar-urlbar-placeholder-with-name =
|
|||||||
zen-icons-picker-emoji =
|
zen-icons-picker-emoji =
|
||||||
.label = 表情符號
|
.label = 表情符號
|
||||||
zen-icons-picker-svg =
|
zen-icons-picker-svg =
|
||||||
.label = Icons
|
.label = 圖示
|
||||||
urlbar-search-mode-zen_actions = Actions
|
urlbar-search-mode-zen_actions = 操作
|
||||||
|
@@ -10,7 +10,7 @@ zen-split-link =
|
|||||||
.accesskey = S
|
.accesskey = S
|
||||||
zen-split-view-modifier-header = 分割畫面
|
zen-split-view-modifier-header = 分割畫面
|
||||||
zen-split-view-modifier-activate-reallocation =
|
zen-split-view-modifier-activate-reallocation =
|
||||||
.label = 啟用重新分配
|
.label = 啟用重新排列
|
||||||
zen-split-view-modifier-enabled-toast = 分割畫面重新排列已開啟。
|
zen-split-view-modifier-enabled-toast = 已開啟分割畫面重新排列功能。
|
||||||
zen-split-view-modifier-enabled-toast-description = 拖曳畫面以重新排列。按 Esc 鍵退出
|
zen-split-view-modifier-enabled-toast-description = 拖曳畫面以重新排列。按 Esc 鍵退出。
|
||||||
zen-split-view-modifier-disabled-toast = 分割畫面重新排列已關閉
|
zen-split-view-modifier-disabled-toast = 已關閉分割畫面重新排列功能。
|
||||||
|
@@ -15,12 +15,12 @@ zen-toolbar-context-compact-mode-hide-both =
|
|||||||
.label = 兩者皆隱藏
|
.label = 兩者皆隱藏
|
||||||
.accesskey = H
|
.accesskey = H
|
||||||
zen-toolbar-context-new-folder =
|
zen-toolbar-context-new-folder =
|
||||||
.label = New Folder
|
.label = 新增分頁夾
|
||||||
.accesskey = N
|
.accesskey = N
|
||||||
sidebar-zen-expand =
|
sidebar-zen-expand =
|
||||||
.label = 展開側邊欄
|
.label = 展開側邊欄
|
||||||
sidebar-zen-create-new =
|
sidebar-zen-create-new =
|
||||||
.label = Create New...
|
.label = 新增...
|
||||||
tabbrowser-unload-tab-button =
|
tabbrowser-unload-tab-button =
|
||||||
.tooltiptext =
|
.tooltiptext =
|
||||||
{ $tabCount ->
|
{ $tabCount ->
|
||||||
|
@@ -2,26 +2,26 @@
|
|||||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
zen-welcome-title-line1 = Welcome to
|
zen-welcome-title-line1 = 歡迎使用
|
||||||
zen-welcome-title-line2 = a calmer internet
|
zen-welcome-title-line2 = 更寧靜的網路體驗
|
||||||
zen-welcome-import-title = A Fresh Start, Same Bookmarks
|
zen-welcome-import-title = 全新開始,書籤依舊
|
||||||
zen-welcome-import-description-1 = Your bookmarks, history, and passwords are like a trail of breadcrumbs through the internet—don’t leave them behind!
|
zen-welcome-import-description-1 = 您的書籤、歷史記錄和密碼,是您網路足跡的珍貴紀錄——別把它們遺忘了!
|
||||||
zen-welcome-import-description-2 = 輕鬆匯入其他瀏覽器的資料,無縫接續瀏覽體驗。
|
zen-welcome-import-description-2 = 輕鬆匯入其他瀏覽器的資料,無縫接續瀏覽體驗。
|
||||||
zen-welcome-import-button = Import now
|
zen-welcome-import-button = 立即匯入
|
||||||
zen-welcome-set-default-browser = Set { -brand-short-name } as your default browser
|
zen-welcome-set-default-browser = 將 { -brand-short-name } 設為您的預設瀏覽器
|
||||||
zen-welcome-dont-set-default-browser = DON’T set { -brand-short-name } as your default browser
|
zen-welcome-dont-set-default-browser = 不要將 { -brand-short-name } 設為您的預設瀏覽器
|
||||||
zen-welcome-initial-essentials-title = Your Key Tabs, Always Within Reach
|
zen-welcome-initial-essentials-title = 重要分頁,隨手可及
|
||||||
zen-welcome-initial-essentials-description-1 = Keep your most important tabs easily accessible and always at hand, no matter how many you open.
|
zen-welcome-initial-essentials-description-1 = 無論開啟多少分頁,最重要的分頁將永遠顯示,讓您輕鬆存取。
|
||||||
zen-welcome-initial-essentials-description-2 = Essential tabs are always visible, no matter what workspace you are in.
|
zen-welcome-initial-essentials-description-2 = 無論您在哪個工作區,Essential 分頁會永遠顯示。
|
||||||
zen-welcome-workspace-colors-title = Your Workspaces, Your Colors
|
zen-welcome-workspace-colors-title = 您的工作區,您的色彩
|
||||||
zen-welcome-workspace-colors-description = Personalize your browser by giving each workspace its own unique color identity.
|
zen-welcome-workspace-colors-description = 為每個工作區賦予獨特的色彩,打造個人化瀏覽器。
|
||||||
zen-welcome-start-browsing-title =
|
zen-welcome-start-browsing-title =
|
||||||
All set?<br/>
|
準備好了嗎?<br/>
|
||||||
Let’s get rolling!
|
馬上開始體驗吧!
|
||||||
zen-welcome-start-browsing-description-1 = You’re all set up and ready to go. Click the button below to start browsing with { -brand-short-name }.
|
zen-welcome-start-browsing-description-1 = 您已完成所有設定並準備就緒。點擊下方按鈕,開始使用 { -brand-short-name } 瀏覽網路吧。
|
||||||
zen-welcome-start-browsing = Dive in!
|
zen-welcome-start-browsing = 立即開始!
|
||||||
zen-welcome-default-search-title = Your Default Search Engine
|
zen-welcome-default-search-title = 您的預設搜尋引擎
|
||||||
zen-welcome-default-search-description = Choose your default search engine. You can always change it later!
|
zen-welcome-default-search-description = 選擇您的預設搜尋引擎,您可以隨時更改它!
|
||||||
zen-welcome-skip-button = Skip
|
zen-welcome-skip-button = 跳過
|
||||||
zen-welcome-next-action = Next
|
zen-welcome-next-action = 下一步
|
||||||
zen-welcome-finished = Your Zen has been set up correctly!
|
zen-welcome-finished = 您的 Zen 瀏覽器已成功設定!
|
||||||
|
@@ -1,8 +1,8 @@
|
|||||||
zen-panel-ui-workspaces-text = 工作區
|
zen-panel-ui-workspaces-text = 工作區
|
||||||
zen-panel-ui-workspaces-create =
|
zen-panel-ui-workspaces-create =
|
||||||
.label = 創建工作區
|
.label = 建立工作區
|
||||||
zen-panel-ui-folder-create =
|
zen-panel-ui-folder-create =
|
||||||
.label = Create Folder
|
.label = 建立分頁夾
|
||||||
zen-panel-ui-new-empty-split =
|
zen-panel-ui-new-empty-split =
|
||||||
.label = New Split
|
.label = New Split
|
||||||
zen-workspaces-panel-context-delete =
|
zen-workspaces-panel-context-delete =
|
||||||
@@ -13,7 +13,7 @@ zen-workspaces-panel-change-name =
|
|||||||
zen-workspaces-panel-change-icon =
|
zen-workspaces-panel-change-icon =
|
||||||
.label = 變更圖示
|
.label = 變更圖示
|
||||||
zen-workspaces-panel-context-default-profile =
|
zen-workspaces-panel-context-default-profile =
|
||||||
.label = Set Profile
|
.label = 設定設定檔
|
||||||
zen-workspaces-how-to-reorder-title = 如何排序工作區
|
zen-workspaces-how-to-reorder-title = 如何排序工作區
|
||||||
zen-workspaces-how-to-reorder-desc = 拖曳側邊欄底部工作區圖示以重新排序
|
zen-workspaces-how-to-reorder-desc = 拖曳側邊欄底部工作區圖示以重新排序
|
||||||
zen-workspaces-change-theme =
|
zen-workspaces-change-theme =
|
||||||
@@ -25,7 +25,7 @@ zen-workspaces-panel-context-edit =
|
|||||||
.label = 編輯工作區
|
.label = 編輯工作區
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
context-zen-change-workspace-tab =
|
context-zen-change-workspace-tab =
|
||||||
.label = 將分頁(含多個)移至工作區
|
.label = 將分頁移至工作區
|
||||||
.accesskey = C
|
.accesskey = C
|
||||||
zen-bookmark-edit-panel-workspace-selector =
|
zen-bookmark-edit-panel-workspace-selector =
|
||||||
.value = 選擇工作區
|
.value = 選擇工作區
|
||||||
@@ -45,9 +45,9 @@ zen-workspace-creation-name =
|
|||||||
.placeholder = 工作區名稱
|
.placeholder = 工作區名稱
|
||||||
zen-workspaces-panel-context-reorder =
|
zen-workspaces-panel-context-reorder =
|
||||||
.label = 排序工作區
|
.label = 排序工作區
|
||||||
zen-workspace-creation-profile = Profile
|
zen-workspace-creation-profile = 設定檔
|
||||||
.tooltiptext = Profiles are used to separate cookies and site data between spaces.
|
.tooltiptext = 設定檔用於隔離不同工作區的 Cookie 和網站資料。
|
||||||
zen-workspace-creation-header = 創建工作區
|
zen-workspace-creation-header = 建立工作區
|
||||||
zen-workspace-creation-label = Spaces are used to organize your tabs and sessions.
|
zen-workspace-creation-label = 工作區用於組織您的分頁與工作階段。
|
||||||
zen-workspaces-delete-workspace-title = 刪除工作區?
|
zen-workspaces-delete-workspace-title = 刪除工作區?
|
||||||
zen-workspaces-delete-workspace-body = 你確定要刪除 { $name } 嗎?該動作無法物復原。
|
zen-workspaces-delete-workspace-body = 您確定要刪除 { $name } 嗎?此操錯無法復原。
|
||||||
|
@@ -3,8 +3,7 @@
|
|||||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
- name: browser.startup.page
|
- name: browser.startup.page
|
||||||
value: 0
|
value: 3
|
||||||
locked: true
|
|
||||||
|
|
||||||
- name: browser.sessionstore.restore_pinned_tabs_on_demand
|
- name: browser.sessionstore.restore_pinned_tabs_on_demand
|
||||||
value: true
|
value: true
|
||||||
|
@@ -53,9 +53,6 @@
|
|||||||
- name: browser.formfill.enable
|
- name: browser.formfill.enable
|
||||||
value: false
|
value: false
|
||||||
|
|
||||||
- name: network.IDN_show_punycode
|
|
||||||
value: true
|
|
||||||
|
|
||||||
- name: browser.urlbar.suggest.topsites
|
- name: browser.urlbar.suggest.topsites
|
||||||
value: true
|
value: true
|
||||||
locked: true
|
locked: true
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
diff --git a/browser/base/content/browser-addons.js b/browser/base/content/browser-addons.js
|
diff --git a/browser/base/content/browser-addons.js b/browser/base/content/browser-addons.js
|
||||||
index d7542a38a0242dd9c9c6390171d59992d75a0c19..d20e5a9fa42c88c7ba28fac1ef13dd693f1f1135 100644
|
index d7542a38a0242dd9c9c6390171d59992d75a0c19..baa5d84c26f7e74c779bc7e1a2b83b543b413441 100644
|
||||||
--- a/browser/base/content/browser-addons.js
|
--- a/browser/base/content/browser-addons.js
|
||||||
+++ b/browser/base/content/browser-addons.js
|
+++ b/browser/base/content/browser-addons.js
|
||||||
@@ -1064,7 +1064,7 @@ var gXPInstallObserver = {
|
@@ -1064,7 +1064,7 @@ var gXPInstallObserver = {
|
||||||
@@ -20,7 +20,38 @@ index d7542a38a0242dd9c9c6390171d59992d75a0c19..d20e5a9fa42c88c7ba28fac1ef13dd69
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2608,7 +2608,7 @@ var gUnifiedExtensions = {
|
@@ -2205,7 +2205,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) {
|
||||||
|
- const anchorID = "unified-extensions-button";
|
||||||
|
+ const anchorID = "zen-site-data-icon-button";
|
||||||
|
const attr = anchorID + "popupnotificationanchor";
|
||||||
|
|
||||||
|
if (!aBrowser[attr]) {
|
||||||
|
@@ -2216,7 +2216,7 @@ var gUnifiedExtensions = {
|
||||||
|
anchorID
|
||||||
|
// Anchor on the toolbar icon to position the popup right below the
|
||||||
|
// button.
|
||||||
|
- ).firstElementChild;
|
||||||
|
+ );
|
||||||
|
}
|
||||||
|
|
||||||
|
return anchorID;
|
||||||
|
@@ -2509,11 +2509,7 @@ var gUnifiedExtensions = {
|
||||||
|
// Lazy load the unified-extensions-panel panel the first time we need to
|
||||||
|
// display it.
|
||||||
|
if (!this._panel) {
|
||||||
|
- let template = document.getElementById(
|
||||||
|
- "unified-extensions-panel-template"
|
||||||
|
- );
|
||||||
|
- template.replaceWith(template.content);
|
||||||
|
- this._panel = document.getElementById("unified-extensions-panel");
|
||||||
|
+ this._panel = document.getElementById("zen-unified-site-data-panel");
|
||||||
|
let customizationArea = this._panel.querySelector(
|
||||||
|
"#unified-extensions-area"
|
||||||
|
);
|
||||||
|
@@ -2608,7 +2604,7 @@ var gUnifiedExtensions = {
|
||||||
this.recordButtonTelemetry(reason || "extensions_panel_showing");
|
this.recordButtonTelemetry(reason || "extensions_panel_showing");
|
||||||
this.ensureButtonShownBeforeAttachingPanel(panel);
|
this.ensureButtonShownBeforeAttachingPanel(panel);
|
||||||
PanelMultiView.openPopup(panel, this._button, {
|
PanelMultiView.openPopup(panel, this._button, {
|
||||||
@@ -29,7 +60,7 @@ index d7542a38a0242dd9c9c6390171d59992d75a0c19..d20e5a9fa42c88c7ba28fac1ef13dd69
|
|||||||
triggerEvent: aEvent,
|
triggerEvent: aEvent,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -2795,18 +2795,20 @@ var gUnifiedExtensions = {
|
@@ -2795,18 +2791,20 @@ var gUnifiedExtensions = {
|
||||||
this._maybeMoveWidgetNodeBack(widgetId);
|
this._maybeMoveWidgetNodeBack(widgetId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
diff --git a/browser/base/content/navigator-toolbox.js b/browser/base/content/navigator-toolbox.js
|
diff --git a/browser/base/content/navigator-toolbox.js b/browser/base/content/navigator-toolbox.js
|
||||||
index 413bad2a62058a1c434d6a44e927e44eb397289d..b621c586e679bb8686fe9a5e6743512e71604425 100644
|
index 413bad2a62058a1c434d6a44e927e44eb397289d..472eab5d3bca2bc665920707a71105167cbe75ec 100644
|
||||||
--- a/browser/base/content/navigator-toolbox.js
|
--- a/browser/base/content/navigator-toolbox.js
|
||||||
+++ b/browser/base/content/navigator-toolbox.js
|
+++ b/browser/base/content/navigator-toolbox.js
|
||||||
@@ -8,7 +8,7 @@
|
@@ -8,7 +8,7 @@
|
||||||
@@ -11,6 +11,24 @@ index 413bad2a62058a1c434d6a44e927e44eb397289d..b621c586e679bb8686fe9a5e6743512e
|
|||||||
const widgetOverflow = document.getElementById("widget-overflow");
|
const widgetOverflow = document.getElementById("widget-overflow");
|
||||||
|
|
||||||
function onPopupShowing(event) {
|
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(
|
@@ -187,6 +187,7 @@ document.addEventListener(
|
||||||
#reload-button ,
|
#reload-button ,
|
||||||
#urlbar-go-button,
|
#urlbar-go-button,
|
||||||
@@ -27,3 +45,21 @@ index 413bad2a62058a1c434d6a44e927e44eb397289d..b621c586e679bb8686fe9a5e6743512e
|
|||||||
gBrowser.handleNewTabMiddleClick(element, event);
|
gBrowser.handleNewTabMiddleClick(element, event);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@@ -317,7 +319,7 @@ document.addEventListener(
|
||||||
|
#pageActionButton,
|
||||||
|
#downloads-button,
|
||||||
|
#fxa-toolbar-menu-button,
|
||||||
|
- #unified-extensions-button,
|
||||||
|
+ #zen-site-data-icon-button,
|
||||||
|
#library-button
|
||||||
|
`);
|
||||||
|
if (!element) {
|
||||||
|
@@ -396,7 +398,7 @@ document.addEventListener(
|
||||||
|
gSync.toggleAccountPanel(element, event);
|
||||||
|
break;
|
||||||
|
|
||||||
|
- case "unified-extensions-button":
|
||||||
|
+ case "zen-site-data-icon-button":
|
||||||
|
gUnifiedExtensions.togglePanel(event);
|
||||||
|
break;
|
||||||
|
|
||||||
|
@@ -58,4 +58,3 @@
|
|||||||
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenDownloadAnimation.mjs"></script>
|
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenDownloadAnimation.mjs"></script>
|
||||||
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenEmojiPicker.mjs"></script>
|
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenEmojiPicker.mjs"></script>
|
||||||
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenWorkspaceCreation.mjs"></script>
|
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenWorkspaceCreation.mjs"></script>
|
||||||
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenWindowSyncing.mjs"></script>
|
|
||||||
|
@@ -42,7 +42,6 @@
|
|||||||
content/browser/zen-components/ZenWorkspaceIcons.mjs (../../zen/workspaces/ZenWorkspaceIcons.mjs)
|
content/browser/zen-components/ZenWorkspaceIcons.mjs (../../zen/workspaces/ZenWorkspaceIcons.mjs)
|
||||||
content/browser/zen-components/ZenWorkspace.mjs (../../zen/workspaces/ZenWorkspace.mjs)
|
content/browser/zen-components/ZenWorkspace.mjs (../../zen/workspaces/ZenWorkspace.mjs)
|
||||||
content/browser/zen-components/ZenWorkspaces.mjs (../../zen/workspaces/ZenWorkspaces.mjs)
|
content/browser/zen-components/ZenWorkspaces.mjs (../../zen/workspaces/ZenWorkspaces.mjs)
|
||||||
content/browser/zen-components/ZenWindowSyncing.mjs (../../zen/workspaces/ZenWindowSyncing.mjs)
|
|
||||||
content/browser/zen-components/ZenWorkspaceCreation.mjs (../../zen/workspaces/ZenWorkspaceCreation.mjs)
|
content/browser/zen-components/ZenWorkspaceCreation.mjs (../../zen/workspaces/ZenWorkspaceCreation.mjs)
|
||||||
content/browser/zen-components/ZenWorkspacesStorage.mjs (../../zen/workspaces/ZenWorkspacesStorage.mjs)
|
content/browser/zen-components/ZenWorkspacesStorage.mjs (../../zen/workspaces/ZenWorkspacesStorage.mjs)
|
||||||
content/browser/zen-components/ZenWorkspacesSync.mjs (../../zen/workspaces/ZenWorkspacesSync.mjs)
|
content/browser/zen-components/ZenWorkspacesSync.mjs (../../zen/workspaces/ZenWorkspacesSync.mjs)
|
||||||
|
@@ -49,3 +49,12 @@
|
|||||||
<menuitem id="context_zenFolderUnpack" data-l10n-id="zen-folders-panel-unpack-folder"/>
|
<menuitem id="context_zenFolderUnpack" data-l10n-id="zen-folders-panel-unpack-folder"/>
|
||||||
<menuitem id="context_zenFolderDelete" data-l10n-id="zen-folders-panel-delete-folder"/>
|
<menuitem id="context_zenFolderDelete" data-l10n-id="zen-folders-panel-delete-folder"/>
|
||||||
</menupopup>
|
</menupopup>
|
||||||
|
|
||||||
|
<menupopup id="zenSiteDataActions">
|
||||||
|
<menuitem id="context_zenClearSiteData" data-l10n-id="identity-clear-site-data"/>
|
||||||
|
<menuseparator />
|
||||||
|
<menuitem command="Tools:Addons" data-l10n-id="zen-site-data-manage-addons"/>
|
||||||
|
<menuitem id="context_zenOpenGetAddons" data-l10n-id="zen-site-data-get-addons"/>
|
||||||
|
<menuseparator />
|
||||||
|
<menuitem id="context_zenOpenSiteSettings" data-l10n-id="zen-site-data-site-settings"/>
|
||||||
|
</menupopup>
|
||||||
|
80
src/browser/base/content/zen-panels/site-data.inc
Normal file
80
src/browser/base/content/zen-panels/site-data.inc
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
# 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/.
|
||||||
|
|
||||||
|
<panel id="zen-unified-site-data-panel"
|
||||||
|
role="group"
|
||||||
|
type="arrow"
|
||||||
|
noautofocus="true"
|
||||||
|
position="bottomright topright">
|
||||||
|
<panelmultiview mainViewId="unified-extensions-view">
|
||||||
|
# We'll keep the view with this name/id in order to prevent
|
||||||
|
# any sort of future issues we may have if firefox decides
|
||||||
|
# to change the functionality of this view
|
||||||
|
<panelview id="unified-extensions-view"
|
||||||
|
class="cui-widget-panelview"
|
||||||
|
mainview-with-header="true">
|
||||||
|
<hbox id="zen-site-data-header">
|
||||||
|
<toolbarbutton id="zen-site-data-header-share"
|
||||||
|
data-l10n-id="zen-site-data-share" />
|
||||||
|
<toolbarbutton id="zen-site-data-header-reader-mode"
|
||||||
|
command="View:ReaderView" />
|
||||||
|
<toolbarbutton id="zen-site-data-header-screenshot"
|
||||||
|
command="Browser:Screenshot" />
|
||||||
|
</hbox>
|
||||||
|
<vbox class="zen-site-data-section">
|
||||||
|
<hbox class="zen-site-data-section-header">
|
||||||
|
<label data-l10n-id="unified-extensions-header-title" flex="1" />
|
||||||
|
<label data-l10n-id="zen-generic-manage" id="zen-site-data-manage-addons" />
|
||||||
|
</hbox>
|
||||||
|
<hbox class="panel-subview-body" context="unified-extensions-context-menu" id="zen-site-data-addons">
|
||||||
|
<html:div id="unified-extensions-messages-container">
|
||||||
|
<!-- messages will be inserted here -->
|
||||||
|
</html:div>
|
||||||
|
|
||||||
|
<vbox id="overflowed-extensions-list">
|
||||||
|
<!-- overflowed extension buttons from the nav-bar will go here -->
|
||||||
|
</vbox>
|
||||||
|
|
||||||
|
<vbox id="unified-extensions-area">
|
||||||
|
<!-- default area for extension browser action buttons -->
|
||||||
|
</vbox>
|
||||||
|
|
||||||
|
<vbox class="unified-extensions-list">
|
||||||
|
<!-- active visible extensions go here -->
|
||||||
|
</vbox>
|
||||||
|
|
||||||
|
<vbox id="zen-site-data-new-addon-button-container">
|
||||||
|
<toolbarbutton id="zen-site-data-new-addon-button"
|
||||||
|
class="subviewbutton toolbarbutton-1" />
|
||||||
|
</vbox>
|
||||||
|
</hbox>
|
||||||
|
|
||||||
|
# Keep this button on the DOM even though we hide it for ever,
|
||||||
|
# again, to keep firefox happy if they decide to change functionality
|
||||||
|
# for this specific button / id
|
||||||
|
<toolbarbutton id="unified-extensions-manage-extensions"
|
||||||
|
class="subviewbutton panel-subview-footer-button unified-extensions-manage-extensions"
|
||||||
|
data-l10n-id="unified-extensions-manage-extensions"
|
||||||
|
hidden="true" />
|
||||||
|
</vbox>
|
||||||
|
<vbox class="zen-site-data-section">
|
||||||
|
<hbox class="zen-site-data-section-header">
|
||||||
|
<label data-l10n-id="zen-site-data-settings" flex="1" />
|
||||||
|
<label data-l10n-id="zen-generic-more" id="zen-site-data-settings-more" />
|
||||||
|
</hbox>
|
||||||
|
<vbox id="zen-site-data-settings-list">
|
||||||
|
<!-- settings will be inserted here -->
|
||||||
|
</vbox>
|
||||||
|
</vbox>
|
||||||
|
<hbox id="zen-site-data-footer">
|
||||||
|
<toolbarbutton id="zen-site-data-security-info"
|
||||||
|
class="subviewbutton zen-interactive-button" />
|
||||||
|
<toolbarbutton id="zen-site-data-actions"
|
||||||
|
class="subviewbutton zen-interactive-button"
|
||||||
|
closemenu="none"
|
||||||
|
context="zenSiteDataActions" />
|
||||||
|
</hbox>
|
||||||
|
</panelview>
|
||||||
|
</panelmultiview>
|
||||||
|
</panel>
|
@@ -5,5 +5,6 @@
|
|||||||
#include zen-panels/gradient-generator.inc
|
#include zen-panels/gradient-generator.inc
|
||||||
#include zen-panels/emojis-picker.inc
|
#include zen-panels/emojis-picker.inc
|
||||||
#include zen-panels/folders-search.inc
|
#include zen-panels/folders-search.inc
|
||||||
|
#include zen-panels/site-data.inc
|
||||||
|
|
||||||
#include zen-panels/popups.inc
|
#include zen-panels/popups.inc
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
diff --git a/browser/components/customizableui/CustomizableUI.sys.mjs b/browser/components/customizableui/CustomizableUI.sys.mjs
|
diff --git a/browser/components/customizableui/CustomizableUI.sys.mjs b/browser/components/customizableui/CustomizableUI.sys.mjs
|
||||||
index 4f62449d670701c77c681ae36e00bae8bf2f636c..132c77e396cb259181ed13ca8ff784e0ade05e3b 100644
|
index 4f62449d670701c77c681ae36e00bae8bf2f636c..ac542f33927f9de9040bab9cd98351a4d74ede4e 100644
|
||||||
--- a/browser/components/customizableui/CustomizableUI.sys.mjs
|
--- a/browser/components/customizableui/CustomizableUI.sys.mjs
|
||||||
+++ b/browser/components/customizableui/CustomizableUI.sys.mjs
|
+++ b/browser/components/customizableui/CustomizableUI.sys.mjs
|
||||||
@@ -14,6 +14,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
|
@@ -14,6 +14,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
|
||||||
@@ -10,6 +10,15 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..132c77e396cb259181ed13ca8ff784e0
|
|||||||
HomePage: "resource:///modules/HomePage.sys.mjs",
|
HomePage: "resource:///modules/HomePage.sys.mjs",
|
||||||
PanelMultiView:
|
PanelMultiView:
|
||||||
"moz-src:///browser/components/customizableui/PanelMultiView.sys.mjs",
|
"moz-src:///browser/components/customizableui/PanelMultiView.sys.mjs",
|
||||||
|
@@ -323,7 +324,7 @@ var CustomizableUIInternal = {
|
||||||
|
{
|
||||||
|
type: CustomizableUI.TYPE_PANEL,
|
||||||
|
defaultPlacements: [],
|
||||||
|
- anchor: "unified-extensions-button",
|
||||||
|
+ anchor: "zen-site-data-icon-button",
|
||||||
|
},
|
||||||
|
false
|
||||||
|
);
|
||||||
@@ -333,19 +334,14 @@ var CustomizableUIInternal = {
|
@@ -333,19 +334,14 @@ var CustomizableUIInternal = {
|
||||||
"back-button",
|
"back-button",
|
||||||
"forward-button",
|
"forward-button",
|
||||||
|
13
src/browser/components/tabbrowser/TabsList-sys-mjs.patch
Normal file
13
src/browser/components/tabbrowser/TabsList-sys-mjs.patch
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
diff --git a/browser/components/tabbrowser/TabsList.sys.mjs b/browser/components/tabbrowser/TabsList.sys.mjs
|
||||||
|
index 97990af166b63cae4b0343c77da5084850890504..b58d20eb3db82867030292625d45277afce1bbea 100644
|
||||||
|
--- a/browser/components/tabbrowser/TabsList.sys.mjs
|
||||||
|
+++ b/browser/components/tabbrowser/TabsList.sys.mjs
|
||||||
|
@@ -87,7 +87,7 @@ class TabsListBase {
|
||||||
|
/** @type {function(MozTabbrowserTab):boolean} */
|
||||||
|
this.filterFn = onlyHiddenTabs
|
||||||
|
? tab => filterFn(tab) && tab.hidden
|
||||||
|
- : filterFn;
|
||||||
|
+ : tab => !tab.hasAttribute("zen-empty-tab") && filterFn(tab);
|
||||||
|
/** @type {Element} */
|
||||||
|
this.containerNode = containerNode;
|
||||||
|
/** @type {Element|null} */
|
@@ -1,5 +1,5 @@
|
|||||||
diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js
|
diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js
|
||||||
index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536322388ea 100644
|
index b2d54218ca51f86d4591730054d0e7e1138adb94..d2c1f7f5b68ecc531c4e9e597457221fb51207c6 100644
|
||||||
--- a/browser/components/tabbrowser/content/tabs.js
|
--- a/browser/components/tabbrowser/content/tabs.js
|
||||||
+++ b/browser/components/tabbrowser/content/tabs.js
|
+++ b/browser/components/tabbrowser/content/tabs.js
|
||||||
@@ -44,6 +44,9 @@
|
@@ -44,6 +44,9 @@
|
||||||
@@ -361,7 +361,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
|
|||||||
#ensureTabIsVisible(tab, shouldScrollInstantly = false) {
|
#ensureTabIsVisible(tab, shouldScrollInstantly = false) {
|
||||||
- let arrowScrollbox = tab.closest("arrowscrollbox");
|
- let arrowScrollbox = tab.closest("arrowscrollbox");
|
||||||
+ let arrowScrollbox = this.arrowScrollbox;
|
+ let arrowScrollbox = this.arrowScrollbox;
|
||||||
if (arrowScrollbox.overflowing) {
|
if (arrowScrollbox?.overflowing) {
|
||||||
arrowScrollbox.ensureElementIsVisible(tab, shouldScrollInstantly);
|
arrowScrollbox.ensureElementIsVisible(tab, shouldScrollInstantly);
|
||||||
}
|
}
|
||||||
@@ -2288,6 +2343,16 @@
|
@@ -2288,6 +2343,16 @@
|
||||||
@@ -410,9 +410,9 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
|
|||||||
translateX = Math.min(Math.max(translateX, firstBoundX), lastBoundX);
|
translateX = Math.min(Math.max(translateX, firstBoundX), lastBoundX);
|
||||||
translateY = Math.min(Math.max(translateY, firstBoundY), lastBoundY);
|
translateY = Math.min(Math.max(translateY, firstBoundY), lastBoundY);
|
||||||
|
|
||||||
@@ -2743,13 +2810,18 @@
|
@@ -2744,13 +2811,18 @@
|
||||||
|
|
||||||
this.#clearDragOverGroupingTimer();
|
this.#clearDragOverGroupingTimer();
|
||||||
|
this.#clearPinnedDropIndicatorTimer();
|
||||||
|
|
||||||
- let isPinned = draggedTab.pinned;
|
- let isPinned = draggedTab.pinned;
|
||||||
- let numPinned = gBrowser.pinnedTabCount;
|
- let numPinned = gBrowser.pinnedTabCount;
|
||||||
@@ -433,7 +433,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
|
|||||||
|
|
||||||
if (this.#rtlMode) {
|
if (this.#rtlMode) {
|
||||||
tabs.reverse();
|
tabs.reverse();
|
||||||
@@ -2760,7 +2832,7 @@
|
@@ -2761,7 +2833,7 @@
|
||||||
let screenAxis = this.verticalMode ? "screenY" : "screenX";
|
let screenAxis = this.verticalMode ? "screenY" : "screenX";
|
||||||
let size = this.verticalMode ? "height" : "width";
|
let size = this.verticalMode ? "height" : "width";
|
||||||
let translateAxis = this.verticalMode ? "translateY" : "translateX";
|
let translateAxis = this.verticalMode ? "translateY" : "translateX";
|
||||||
@@ -442,7 +442,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
|
|||||||
let tabSize = this.verticalMode ? tabHeight : tabWidth;
|
let tabSize = this.verticalMode ? tabHeight : tabWidth;
|
||||||
let translateX = event.screenX - dragData.screenX;
|
let translateX = event.screenX - dragData.screenX;
|
||||||
let translateY = event.screenY - dragData.screenY;
|
let translateY = event.screenY - dragData.screenY;
|
||||||
@@ -2776,6 +2848,12 @@
|
@@ -2777,6 +2849,12 @@
|
||||||
);
|
);
|
||||||
let lastMovingTab = movingTabs.at(-1);
|
let lastMovingTab = movingTabs.at(-1);
|
||||||
let firstMovingTab = movingTabs[0];
|
let firstMovingTab = movingTabs[0];
|
||||||
@@ -455,7 +455,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
|
|||||||
let endEdge = ele => ele[screenAxis] + bounds(ele)[size];
|
let endEdge = ele => ele[screenAxis] + bounds(ele)[size];
|
||||||
let lastMovingTabScreen = endEdge(lastMovingTab);
|
let lastMovingTabScreen = endEdge(lastMovingTab);
|
||||||
let firstMovingTabScreen = firstMovingTab[screenAxis];
|
let firstMovingTabScreen = firstMovingTab[screenAxis];
|
||||||
@@ -2790,6 +2868,11 @@
|
@@ -2791,6 +2869,11 @@
|
||||||
let endBound = this.#rtlMode
|
let endBound = this.#rtlMode
|
||||||
? endEdge(this) - lastMovingTabScreen
|
? endEdge(this) - lastMovingTabScreen
|
||||||
: periphery[screenAxis] - 1 - lastMovingTabScreen;
|
: periphery[screenAxis] - 1 - lastMovingTabScreen;
|
||||||
@@ -467,7 +467,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
|
|||||||
translate = Math.min(Math.max(translate, startBound), endBound);
|
translate = Math.min(Math.max(translate, startBound), endBound);
|
||||||
|
|
||||||
// Center the tab under the cursor if the tab is not under the cursor while dragging
|
// Center the tab under the cursor if the tab is not under the cursor while dragging
|
||||||
@@ -2979,6 +3062,8 @@
|
@@ -2980,6 +3063,8 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
let dropElement = getOverlappedElement();
|
let dropElement = getOverlappedElement();
|
||||||
@@ -476,7 +476,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
|
|||||||
|
|
||||||
let newDropElementIndex;
|
let newDropElementIndex;
|
||||||
if (dropElement) {
|
if (dropElement) {
|
||||||
@@ -3060,7 +3145,7 @@
|
@@ -3061,7 +3146,7 @@
|
||||||
? Services.prefs.getIntPref(
|
? Services.prefs.getIntPref(
|
||||||
"browser.tabs.dragDrop.moveOverThresholdPercent"
|
"browser.tabs.dragDrop.moveOverThresholdPercent"
|
||||||
) / 100
|
) / 100
|
||||||
@@ -485,7 +485,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
|
|||||||
moveOverThreshold = Math.min(1, Math.max(0, moveOverThreshold));
|
moveOverThreshold = Math.min(1, Math.max(0, moveOverThreshold));
|
||||||
let shouldMoveOver = overlapPercent > moveOverThreshold;
|
let shouldMoveOver = overlapPercent > moveOverThreshold;
|
||||||
if (logicalForward && shouldMoveOver) {
|
if (logicalForward && shouldMoveOver) {
|
||||||
@@ -3093,6 +3178,7 @@
|
@@ -3094,6 +3179,7 @@
|
||||||
// If dragging a group over another group, don't make it look like it is
|
// 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.
|
// possible to drop the dragged group inside the other group.
|
||||||
if (
|
if (
|
||||||
@@ -493,7 +493,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
|
|||||||
isTabGroupLabel(draggedTab) &&
|
isTabGroupLabel(draggedTab) &&
|
||||||
dropElement?.group &&
|
dropElement?.group &&
|
||||||
(!dropElement.group.collapsed ||
|
(!dropElement.group.collapsed ||
|
||||||
@@ -3119,20 +3205,13 @@
|
@@ -3120,20 +3206,13 @@
|
||||||
let isOutOfBounds = isPinned
|
let isOutOfBounds = isPinned
|
||||||
? dropElement.elementIndex >= numPinned
|
? dropElement.elementIndex >= numPinned
|
||||||
: dropElement.elementIndex < numPinned;
|
: dropElement.elementIndex < numPinned;
|
||||||
@@ -518,7 +518,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
|
|||||||
let groupingDelay = Services.prefs.getIntPref(
|
let groupingDelay = Services.prefs.getIntPref(
|
||||||
"browser.tabs.dragDrop.createGroup.delayMS"
|
"browser.tabs.dragDrop.createGroup.delayMS"
|
||||||
);
|
);
|
||||||
@@ -3140,6 +3219,7 @@
|
@@ -3141,6 +3220,7 @@
|
||||||
// When dragging tab(s) over an ungrouped tab, signal to the user
|
// When dragging tab(s) over an ungrouped tab, signal to the user
|
||||||
// that dropping the tab(s) will create a new tab group.
|
// that dropping the tab(s) will create a new tab group.
|
||||||
let shouldCreateGroupOnDrop =
|
let shouldCreateGroupOnDrop =
|
||||||
@@ -526,7 +526,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
|
|||||||
!movingTabsSet.has(dropElement) &&
|
!movingTabsSet.has(dropElement) &&
|
||||||
isTab(dropElement) &&
|
isTab(dropElement) &&
|
||||||
!dropElement?.group &&
|
!dropElement?.group &&
|
||||||
@@ -3148,6 +3228,7 @@
|
@@ -3149,6 +3229,7 @@
|
||||||
// When dragging tab(s) over a collapsed tab group label, signal to the
|
// 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.
|
// user that dropping the tab(s) will add them to the group.
|
||||||
let shouldDropIntoCollapsedTabGroup =
|
let shouldDropIntoCollapsedTabGroup =
|
||||||
@@ -534,7 +534,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
|
|||||||
isTabGroupLabel(dropElement) &&
|
isTabGroupLabel(dropElement) &&
|
||||||
dropElement.group.collapsed &&
|
dropElement.group.collapsed &&
|
||||||
overlapPercent > dragOverGroupingThreshold;
|
overlapPercent > dragOverGroupingThreshold;
|
||||||
@@ -3192,19 +3273,14 @@
|
@@ -3193,19 +3274,14 @@
|
||||||
dropElement = dropElementGroup;
|
dropElement = dropElementGroup;
|
||||||
colorCode = undefined;
|
colorCode = undefined;
|
||||||
} else if (isTabGroupLabel(dropElement)) {
|
} else if (isTabGroupLabel(dropElement)) {
|
||||||
@@ -562,7 +562,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
|
|||||||
}
|
}
|
||||||
this.#setDragOverGroupColor(colorCode);
|
this.#setDragOverGroupColor(colorCode);
|
||||||
this.toggleAttribute("movingtab-addToGroup", colorCode);
|
this.toggleAttribute("movingtab-addToGroup", colorCode);
|
||||||
@@ -3223,11 +3299,11 @@
|
@@ -3224,11 +3300,11 @@
|
||||||
dragData.dropElement = dropElement;
|
dragData.dropElement = dropElement;
|
||||||
dragData.dropBefore = dropBefore;
|
dragData.dropBefore = dropBefore;
|
||||||
dragData.animDropElementIndex = newDropElementIndex;
|
dragData.animDropElementIndex = newDropElementIndex;
|
||||||
@@ -576,7 +576,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3346,12 +3422,14 @@
|
@@ -3350,12 +3426,14 @@
|
||||||
element?.removeAttribute("dragover-groupTarget");
|
element?.removeAttribute("dragover-groupTarget");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -593,7 +593,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
|
|||||||
|
|
||||||
for (let item of this.ariaFocusableItems) {
|
for (let item of this.ariaFocusableItems) {
|
||||||
this.#resetGroupTarget(item);
|
this.#resetGroupTarget(item);
|
||||||
@@ -3394,16 +3472,15 @@
|
@@ -3402,16 +3480,15 @@
|
||||||
tab.style.left = "";
|
tab.style.left = "";
|
||||||
tab.style.top = "";
|
tab.style.top = "";
|
||||||
tab.style.maxWidth = "";
|
tab.style.maxWidth = "";
|
||||||
@@ -612,7 +612,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
|
|||||||
}
|
}
|
||||||
let periphery = draggedTabDocument.getElementById(
|
let periphery = draggedTabDocument.getElementById(
|
||||||
"tabbrowser-arrowscrollbox-periphery"
|
"tabbrowser-arrowscrollbox-periphery"
|
||||||
@@ -3475,7 +3552,7 @@
|
@@ -3483,7 +3560,7 @@
|
||||||
let postTransitionCleanup = () => {
|
let postTransitionCleanup = () => {
|
||||||
movingTab._moveTogetherSelectedTabsData.animate = false;
|
movingTab._moveTogetherSelectedTabsData.animate = false;
|
||||||
};
|
};
|
||||||
@@ -621,7 +621,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
|
|||||||
postTransitionCleanup();
|
postTransitionCleanup();
|
||||||
} else {
|
} else {
|
||||||
let onTransitionEnd = transitionendEvent => {
|
let onTransitionEnd = transitionendEvent => {
|
||||||
@@ -3639,7 +3716,7 @@
|
@@ -3647,7 +3724,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
_notifyBackgroundTab(aTab) {
|
_notifyBackgroundTab(aTab) {
|
||||||
@@ -630,7 +630,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3748,7 +3825,10 @@
|
@@ -3756,7 +3833,10 @@
|
||||||
#getDragTarget(event, { ignoreSides = false } = {}) {
|
#getDragTarget(event, { ignoreSides = false } = {}) {
|
||||||
let { target } = event;
|
let { target } = event;
|
||||||
while (target) {
|
while (target) {
|
||||||
@@ -642,7 +642,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
target = target.parentNode;
|
target = target.parentNode;
|
||||||
@@ -3765,6 +3845,9 @@
|
@@ -3773,6 +3853,9 @@
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,12 +1,12 @@
|
|||||||
diff --git a/browser/components/urlbar/UrlbarController.sys.mjs b/browser/components/urlbar/UrlbarController.sys.mjs
|
diff --git a/browser/components/urlbar/UrlbarController.sys.mjs b/browser/components/urlbar/UrlbarController.sys.mjs
|
||||||
index 36e3ab4a5a153230bb488b66dda7e3e7c763ca23..81f2944b939ac0963c129f86aab0b55817349401 100644
|
index 36e3ab4a5a153230bb488b66dda7e3e7c763ca23..cc4ea61914a316451fa54b01a5c8c6a305e4038a 100644
|
||||||
--- a/browser/components/urlbar/UrlbarController.sys.mjs
|
--- a/browser/components/urlbar/UrlbarController.sys.mjs
|
||||||
+++ b/browser/components/urlbar/UrlbarController.sys.mjs
|
+++ b/browser/components/urlbar/UrlbarController.sys.mjs
|
||||||
@@ -434,6 +434,8 @@ export class UrlbarController {
|
@@ -434,6 +434,8 @@ export class UrlbarController {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
+ } else {
|
+ } else if (!this.input.value && !(event.ctrlKey || event.altKey || event.shiftKey)) {
|
||||||
+ this.browserWindow.gZenUIManager.enableCommandsMode(event);
|
+ this.browserWindow.gZenUIManager.enableCommandsMode(event);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@@ -0,0 +1,12 @@
|
|||||||
|
diff --git a/browser/components/urlbar/UrlbarProvidersManager.sys.mjs b/browser/components/urlbar/UrlbarProvidersManager.sys.mjs
|
||||||
|
index 555273f6ea1efd77aa3062b9910bbfe28568775d..5c4a46c926913ab592f5e12908b8817410abe6b6 100644
|
||||||
|
--- a/browser/components/urlbar/UrlbarProvidersManager.sys.mjs
|
||||||
|
+++ b/browser/components/urlbar/UrlbarProvidersManager.sys.mjs
|
||||||
|
@@ -716,6 +716,7 @@ export class Query {
|
||||||
|
if (
|
||||||
|
result.heuristic &&
|
||||||
|
this.context.searchMode &&
|
||||||
|
+ !(this.context.searchMode.source === lazy.UrlbarUtils.RESULT_SOURCE.ZEN_ACTIONS && result.payload?.zenAction) &&
|
||||||
|
(!this.context.trimmedSearchString ||
|
||||||
|
(!this.context.searchMode.engineName && !result.autofill))
|
||||||
|
) {
|
@@ -74,7 +74,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
#appMenu-zoom-controls,
|
#appMenu-zoom-controls,
|
||||||
#PanelUI-zen-gradient-generator-color-add {
|
#PanelUI-zen-gradient-generator-color-add,
|
||||||
|
#zen-site-data-new-addon-button {
|
||||||
list-style-image: url('plus.svg') !important;
|
list-style-image: url('plus.svg') !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,7 +214,8 @@
|
|||||||
.search-setting-button > .button-box > .button-icon,
|
.search-setting-button > .button-box > .button-icon,
|
||||||
#appMenu-settings-button,
|
#appMenu-settings-button,
|
||||||
#PanelUI-zen-profiles-managePrfs,
|
#PanelUI-zen-profiles-managePrfs,
|
||||||
.unified-extensions-item-open-menu.subviewbutton {
|
.unified-extensions-item-open-menu.subviewbutton,
|
||||||
|
.zen-site-data-permission-icon {
|
||||||
list-style-image: url('settings.svg') !important;
|
list-style-image: url('settings.svg') !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -466,8 +468,15 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* permissions */
|
/* permissions */
|
||||||
#permissions-granted-icon {
|
#identity-permission-box,
|
||||||
list-style-image: url('permissions.svg') !important;
|
#identity-icon-box {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#zen-site-data-icon-button image {
|
||||||
|
list-style-image: url('permissions.svg');
|
||||||
|
-moz-context-properties: fill, fill-opacity;
|
||||||
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.geo-icon {
|
.geo-icon {
|
||||||
@@ -558,7 +567,8 @@
|
|||||||
list-style-image: url('midi.svg') !important;
|
list-style-image: url('midi.svg') !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.install-icon {
|
.install-icon,
|
||||||
|
.zen-permission-extension-icon {
|
||||||
list-style-image: url('extension.svg') !important;
|
list-style-image: url('extension.svg') !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -811,3 +821,57 @@
|
|||||||
-moz-context-properties: fill;
|
-moz-context-properties: fill;
|
||||||
fill: currentColor;
|
fill: currentColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#zen-site-data-security-info {
|
||||||
|
-moz-context-properties: fill, fill-opacity;
|
||||||
|
fill: currentColor;
|
||||||
|
appearance: none;
|
||||||
|
border-radius: 4px;
|
||||||
|
padding: 5px;
|
||||||
|
|
||||||
|
&[identity='secure'] {
|
||||||
|
list-style-image: url('security.svg');
|
||||||
|
}
|
||||||
|
|
||||||
|
&[identity='not-secure'] {
|
||||||
|
list-style-image: url('security-broken.svg');
|
||||||
|
}
|
||||||
|
|
||||||
|
&[identity='extension'] {
|
||||||
|
list-style-image: url('extension.svg');
|
||||||
|
}
|
||||||
|
|
||||||
|
&:not([identity='secure']) * {
|
||||||
|
color: light-dark(var(--color-red-70), var(--color-red-30));
|
||||||
|
}
|
||||||
|
|
||||||
|
& .toolbarbutton-text {
|
||||||
|
padding-inline-start: 4px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .toolbarbutton-icon {
|
||||||
|
width: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > * {
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#zen-site-data-actions {
|
||||||
|
-moz-context-properties: fill, fill-opacity;
|
||||||
|
fill: currentColor;
|
||||||
|
appearance: none;
|
||||||
|
width: 26px;
|
||||||
|
height: 26px;
|
||||||
|
border-radius: 99px;
|
||||||
|
margin-left: auto !important;
|
||||||
|
list-style-image: url('menu.svg');
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0;
|
||||||
|
|
||||||
|
& label {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -2,4 +2,4 @@
|
|||||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
# 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
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" height="18" width="18" viewBox="0 0 18 18"><g stroke-linecap="round" stroke-width="1.5" fill="none" stroke="context-fill" stroke-opacity="context-fill-opacity" stroke-linejoin="round" class="nc-icon-wrapper"><path d="M7.638,3.495L2.213,12.891c-.605,1.048,.151,2.359,1.362,2.359H14.425c1.211,0,1.967-1.31,1.362-2.359L10.362,3.495c-.605-1.048-2.119-1.048-2.724,0Z"></path><line x1="9" y1="6.5" x2="9" y2="10" data-color="color-2"></line><path d="M9,13.569c-.552,0-1-.449-1-1s.448-1,1-1,1,.449,1,1-.448,1-1,1Z" fill="currentColor" data-color="color-2" data-stroke="none" stroke="none"></path></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" height="18" width="18" viewBox="0 0 18 18"><g stroke-linecap="round" stroke-width="1.5" fill="none" stroke="context-fill" stroke-opacity="context-fill-opacity" stroke-linejoin="round"><path d="M7.638,3.495L2.213,12.891c-.605,1.048,.151,2.359,1.362,2.359H14.425c1.211,0,1.967-1.31,1.362-2.359L10.362,3.495c-.605-1.048-2.119-1.048-2.724,0Z"></path><line x1="9" y1="6.5" x2="9" y2="10"></line><path d="M9,13.569c-.552,0-1-.449-1-1s.448-1,1-1,1,.449,1,1-.448,1-1,1Z" fill="context-fill" data-stroke="none" stroke="none"></path></g></svg>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
diff --git a/browser/themes/windows/browser.css b/browser/themes/windows/browser.css
|
diff --git a/browser/themes/windows/browser.css b/browser/themes/windows/browser.css
|
||||||
index 4485369284ee762bc8b35afb84fec0874a831fff..7096e2e5d50cda99b62a2aa7118fea6371e76b85 100644
|
index 4485369284ee762bc8b35afb84fec0874a831fff..6a1ad15f657437aa4ef98fda63ae921a378f7310 100644
|
||||||
--- a/browser/themes/windows/browser.css
|
--- a/browser/themes/windows/browser.css
|
||||||
+++ b/browser/themes/windows/browser.css
|
+++ b/browser/themes/windows/browser.css
|
||||||
@@ -31,7 +31,6 @@
|
@@ -31,7 +31,6 @@
|
||||||
@@ -10,13 +10,14 @@ index 4485369284ee762bc8b35afb84fec0874a831fff..7096e2e5d50cda99b62a2aa7118fea63
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Using a semitransparent background preserves the tinting from the backdrop.
|
/* Using a semitransparent background preserves the tinting from the backdrop.
|
||||||
@@ -60,14 +59,12 @@
|
@@ -60,14 +59,13 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This is needed for Windows 10, see bug 1961257 */
|
/* This is needed for Windows 10, see bug 1961257 */
|
||||||
-@media (-moz-windows-accent-color-in-titlebar) {
|
-@media (-moz-windows-accent-color-in-titlebar) {
|
||||||
- :root[customtitlebar][sizemode="normal"] #navigator-toolbox {
|
- :root[customtitlebar][sizemode="normal"] #navigator-toolbox {
|
||||||
+ :root[customtitlebar][sizemode="normal"] #browser {
|
+ :root[customtitlebar][sizemode="normal"] #browser {
|
||||||
|
+ --zen-sidebar-compact-top-offset: 1px;
|
||||||
border-top: 0.5px solid ActiveBorder;
|
border-top: 0.5px solid ActiveBorder;
|
||||||
&:-moz-window-inactive {
|
&:-moz-window-inactive {
|
||||||
border-top-color: InactiveBorder;
|
border-top-color: InactiveBorder;
|
||||||
|
@@ -106,12 +106,20 @@ export var ZenCustomizableUI = new (class {
|
|||||||
|
|
||||||
_initCreateNewButton(window) {
|
_initCreateNewButton(window) {
|
||||||
const button = window.document.getElementById('zen-create-new-button');
|
const button = window.document.getElementById('zen-create-new-button');
|
||||||
button.addEventListener('command', () => {
|
button.addEventListener('command', (event) => {
|
||||||
if (button.hasAttribute('open')) {
|
if (button.hasAttribute('open')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const popup = window.document.getElementById('zenCreateNewPopup');
|
const popup = window.document.getElementById('zenCreateNewPopup');
|
||||||
popup.openPopup(button, 'before_start');
|
popup.openPopup(
|
||||||
|
button,
|
||||||
|
'before_start',
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
true /* isContextMenu */,
|
||||||
|
false /* attributesOverride */,
|
||||||
|
event
|
||||||
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -15,7 +15,11 @@
|
|||||||
observeSelectorExistence(element, descendantSelectors, stateAttribute, attributeFilter = []) {
|
observeSelectorExistence(element, descendantSelectors, stateAttribute, attributeFilter = []) {
|
||||||
const updateState = () => {
|
const updateState = () => {
|
||||||
const exists = descendantSelectors.some(({ selector }) => {
|
const exists = descendantSelectors.some(({ selector }) => {
|
||||||
return element.querySelector(selector);
|
let selected = element.querySelector(selector);
|
||||||
|
if (selected?.tagName?.toLowerCase() === 'menu') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return selected;
|
||||||
});
|
});
|
||||||
const { exists: shouldExist = true } = descendantSelectors;
|
const { exists: shouldExist = true } = descendantSelectors;
|
||||||
if (exists === shouldExist) {
|
if (exists === shouldExist) {
|
||||||
|
@@ -1,6 +1,11 @@
|
|||||||
// This Source Code Form is subject to the terms of the Mozilla Public
|
// 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
|
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
|
ChromeUtils.defineESModuleGetters(this, {
|
||||||
|
nsZenSiteDataPanel: 'resource:///modules/ZenSiteDataPanel.sys.mjs',
|
||||||
|
});
|
||||||
|
|
||||||
var gZenUIManager = {
|
var gZenUIManager = {
|
||||||
_popupTrackingElements: [],
|
_popupTrackingElements: [],
|
||||||
_hoverPausedForExpand: false,
|
_hoverPausedForExpand: false,
|
||||||
@@ -14,19 +19,6 @@ var gZenUIManager = {
|
|||||||
init() {
|
init() {
|
||||||
document.addEventListener('popupshowing', this.onPopupShowing.bind(this));
|
document.addEventListener('popupshowing', this.onPopupShowing.bind(this));
|
||||||
document.addEventListener('popuphidden', this.onPopupHidden.bind(this));
|
document.addEventListener('popuphidden', this.onPopupHidden.bind(this));
|
||||||
XPCOMUtils.defineLazyPreferenceGetter(
|
|
||||||
this,
|
|
||||||
'contentElementSeparation',
|
|
||||||
'zen.theme.content-element-separation',
|
|
||||||
0
|
|
||||||
);
|
|
||||||
XPCOMUtils.defineLazyPreferenceGetter(this, 'urlbarWaitToClear', 'zen.urlbar.wait-to-clear', 0);
|
|
||||||
XPCOMUtils.defineLazyPreferenceGetter(
|
|
||||||
this,
|
|
||||||
'urlbarShowDomainOnly',
|
|
||||||
'zen.urlbar.show-domain-only-in-sidebar',
|
|
||||||
true
|
|
||||||
);
|
|
||||||
|
|
||||||
document.addEventListener('mousedown', this.handleMouseDown.bind(this), true);
|
document.addEventListener('mousedown', this.handleMouseDown.bind(this), true);
|
||||||
|
|
||||||
@@ -44,6 +36,8 @@ var gZenUIManager = {
|
|||||||
return document.getElementById('zen-toast-container');
|
return document.getElementById('zen-toast-container');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
window.gZenSiteDataPanel = new nsZenSiteDataPanel(window);
|
||||||
|
|
||||||
gURLBar._zenTrimURL = this.urlbarTrim.bind(this);
|
gURLBar._zenTrimURL = this.urlbarTrim.bind(this);
|
||||||
|
|
||||||
new ResizeObserver(
|
new ResizeObserver(
|
||||||
@@ -215,8 +209,10 @@ var gZenUIManager = {
|
|||||||
!el.contains(showEvent.explicitOriginalTarget) ||
|
!el.contains(showEvent.explicitOriginalTarget) ||
|
||||||
(showEvent.explicitOriginalTarget instanceof Element &&
|
(showEvent.explicitOriginalTarget instanceof Element &&
|
||||||
showEvent.explicitOriginalTarget?.closest('panel')) ||
|
showEvent.explicitOriginalTarget?.closest('panel')) ||
|
||||||
// See bug #7590: Ignore menupopup elements opening
|
// See bug #7590: Ignore menupopup elements opening.
|
||||||
showEvent.explicitOriginalTarget.tagName === 'menupopup'
|
// Also see #10612 for the exclusion of the zen-appcontent-navbar-wrapper
|
||||||
|
(showEvent.explicitOriginalTarget.tagName === 'menupopup' &&
|
||||||
|
el.id !== 'zen-appcontent-navbar-wrapper')
|
||||||
) {
|
) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -260,7 +256,7 @@ var gZenUIManager = {
|
|||||||
gURLBar.removeAttribute('animate-searchmode');
|
gURLBar.removeAttribute('animate-searchmode');
|
||||||
delete this._animatingSearchModeTimeout;
|
delete this._animatingSearchModeTimeout;
|
||||||
});
|
});
|
||||||
}, 700);
|
}, 1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -594,6 +590,26 @@ var gZenUIManager = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
XPCOMUtils.defineLazyPreferenceGetter(
|
||||||
|
gZenUIManager,
|
||||||
|
'contentElementSeparation',
|
||||||
|
'zen.theme.content-element-separation',
|
||||||
|
0
|
||||||
|
);
|
||||||
|
|
||||||
|
XPCOMUtils.defineLazyPreferenceGetter(
|
||||||
|
gZenUIManager,
|
||||||
|
'urlbarWaitToClear',
|
||||||
|
'zen.urlbar.wait-to-clear',
|
||||||
|
0
|
||||||
|
);
|
||||||
|
XPCOMUtils.defineLazyPreferenceGetter(
|
||||||
|
gZenUIManager,
|
||||||
|
'urlbarShowDomainOnly',
|
||||||
|
'zen.urlbar.show-domain-only-in-sidebar',
|
||||||
|
true
|
||||||
|
);
|
||||||
|
|
||||||
var gZenVerticalTabsManager = {
|
var gZenVerticalTabsManager = {
|
||||||
init() {
|
init() {
|
||||||
this._multiWindowFeature = new nsZenMultiWindowFeature();
|
this._multiWindowFeature = new nsZenMultiWindowFeature();
|
||||||
|
@@ -103,10 +103,15 @@
|
|||||||
/* Mark: URL Bar */
|
/* Mark: URL Bar */
|
||||||
@keyframes zen-urlbar-searchmode {
|
@keyframes zen-urlbar-searchmode {
|
||||||
0% {
|
0% {
|
||||||
box-shadow: 0 0 20px color-mix(in srgb, var(--zen-primary-color), var(--toolbox-textcolor) 20%);
|
box-shadow: 0 0 20px
|
||||||
|
color-mix(
|
||||||
|
in srgb,
|
||||||
|
color-mix(in srgb, var(--zen-primary-color), var(--toolbox-textcolor) 20%),
|
||||||
|
light-dark(rgba(0, 0, 0, 0.3), transparent) 50%
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
100% {
|
100% {
|
||||||
box-shadow: 0 0 300px color-mix(in srgb, var(--zen-primary-color), transparent 100%);
|
box-shadow: 0 0 250px color-mix(in srgb, var(--zen-primary-color), transparent 100%);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -120,6 +120,20 @@
|
|||||||
border-radius: 10px !important;
|
border-radius: 10px !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.identity-box-button {
|
||||||
|
opacity: 0;
|
||||||
|
transition:
|
||||||
|
opacity 0.2s,
|
||||||
|
visibility 0.2s;
|
||||||
|
visibility: collapse;
|
||||||
|
|
||||||
|
#navigator-toolbox:hover &,
|
||||||
|
&[open] {
|
||||||
|
opacity: 1;
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.urlbar-page-action,
|
.urlbar-page-action,
|
||||||
@@ -155,8 +169,11 @@
|
|||||||
order: 2 !important;
|
order: 2 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
#urlbar[breakout-extend='true'] {
|
#urlbar[breakout] {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
|
}
|
||||||
|
|
||||||
|
#urlbar[breakout-extend='true'] {
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
|
|
||||||
& .urlbar-input-container {
|
& .urlbar-input-container {
|
||||||
@@ -172,8 +189,8 @@
|
|||||||
|
|
||||||
& .urlbar-background {
|
& .urlbar-background {
|
||||||
--zen-urlbar-background-base: light-dark(
|
--zen-urlbar-background-base: light-dark(
|
||||||
white,
|
#fbfbfb,
|
||||||
color-mix(in srgb, hsl(0, 0%, 1%), var(--zen-colors-primary) 25%)
|
color-mix(in srgb, hsl(0, 0%, 1%), var(--zen-colors-primary) 30%)
|
||||||
);
|
);
|
||||||
@media -moz-pref('zen.theme.acrylic-elements') {
|
@media -moz-pref('zen.theme.acrylic-elements') {
|
||||||
--zen-urlbar-background-transparent: color-mix(
|
--zen-urlbar-background-transparent: color-mix(
|
||||||
@@ -186,7 +203,7 @@
|
|||||||
--zen-urlbar-background-transparent,
|
--zen-urlbar-background-transparent,
|
||||||
var(--zen-urlbar-background-base)
|
var(--zen-urlbar-background-base)
|
||||||
) !important;
|
) !important;
|
||||||
box-shadow: 0px 0px 90px -10px light-dark(rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.75)) !important;
|
box-shadow: 0px 30px 140px -15px light-dark(rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.6)) !important;
|
||||||
backdrop-filter: none !important;
|
backdrop-filter: none !important;
|
||||||
outline: 0.5px solid light-dark(rgba(0, 0, 0, 0.2), rgba(255, 255, 255, 0.2)) !important;
|
outline: 0.5px solid light-dark(rgba(0, 0, 0, 0.2), rgba(255, 255, 255, 0.2)) !important;
|
||||||
outline-offset: var(--zen-urlbar-outline-offset) !important;
|
outline-offset: var(--zen-urlbar-outline-offset) !important;
|
||||||
@@ -208,7 +225,7 @@
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
border-radius: inherit;
|
border-radius: inherit;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
animation: zen-urlbar-searchmode ease-out 0.7s forwards;
|
animation: zen-urlbar-searchmode ease-out 1s forwards;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,22 +236,12 @@
|
|||||||
:root[zen-single-toolbar='true'] {
|
:root[zen-single-toolbar='true'] {
|
||||||
--urlbar-icon-border-radius: 10px !important;
|
--urlbar-icon-border-radius: 10px !important;
|
||||||
|
|
||||||
.urlbar-page-action:not([open]):not(#identity-permission-box),
|
.urlbar-page-action:not([open]):not([showing]):not(#identity-permission-box),
|
||||||
#tracking-protection-icon-container {
|
#tracking-protection-icon-container {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
#identity-box:not([pageproxystate='invalid']):not(.notSecure) #identity-icon-box:not([open]) {
|
#identity-permission-box > *:not(#zen-site-data-icon-button) {
|
||||||
margin-inline-start: calc(-8px - 2 * var(--urlbar-icon-padding));
|
|
||||||
transform: translateX(100%);
|
|
||||||
opacity: 0;
|
|
||||||
|
|
||||||
:root:not([supress-primary-adjustment]) & {
|
|
||||||
transition: all 0.1s ease;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#identity-permission-box > *:not(#permissions-granted-icon) {
|
|
||||||
visibility: collapse;
|
visibility: collapse;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -242,25 +249,11 @@
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
#urlbar[open]
|
|
||||||
:is(#tracking-protection-icon-container, .urlbar-page-action, .identity-box-button):not(
|
|
||||||
[hidden]
|
|
||||||
):not(#identity-permission-box),
|
|
||||||
#urlbar:hover #identity-icon-box {
|
|
||||||
opacity: 1 !important;
|
|
||||||
margin-inline-start: 0 !important;
|
|
||||||
transform: none !important;
|
|
||||||
display: flex;
|
|
||||||
#urlbar:not(:hover) & {
|
|
||||||
transition: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#urlbar:not([open]) #userContext-icons {
|
#urlbar:not([open]) #userContext-icons {
|
||||||
margin-inline: 0;
|
margin-inline: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#urlbar:not([open]) {
|
#urlbar:not([breakout-extend='true']) {
|
||||||
#identity-box:not([pageproxystate='invalid']) {
|
#identity-box:not([pageproxystate='invalid']) {
|
||||||
order: 2;
|
order: 2;
|
||||||
}
|
}
|
||||||
@@ -678,4 +671,8 @@
|
|||||||
|
|
||||||
#urlbar-search-mode-indicator-title {
|
#urlbar-search-mode-indicator-title {
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#reader-mode-button {
|
||||||
}
|
}
|
||||||
|
@@ -31,7 +31,6 @@
|
|||||||
--uc-autocomplete-panel-separator-margin-vertical: 4px;
|
--uc-autocomplete-panel-separator-margin-vertical: 4px;
|
||||||
|
|
||||||
--uc-permission-itemcontainer-padding-block: 8px;
|
--uc-permission-itemcontainer-padding-block: 8px;
|
||||||
--uc-permission-item-margin-block: 4px;
|
|
||||||
--uc-permission-item-padding-inline: 16px;
|
--uc-permission-item-padding-inline: 16px;
|
||||||
--zen-panel-separator-width: 1px;
|
--zen-panel-separator-width: 1px;
|
||||||
}
|
}
|
||||||
@@ -228,12 +227,8 @@ panel {
|
|||||||
|
|
||||||
.permission-popup-permission-item,
|
.permission-popup-permission-item,
|
||||||
#permission-popup-storage-access-permission-list-header {
|
#permission-popup-storage-access-permission-list-header {
|
||||||
margin-block: var(--uc-permission-item-margin-block);
|
padding-block: 4px;
|
||||||
}
|
margin-block: 0px;
|
||||||
|
|
||||||
.permission-popup-permission-label,
|
|
||||||
.permission-popup-permission-header-label {
|
|
||||||
margin-inline-start: var(--uc-arrowpanel-menuicon-margin-inline);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#editBookmarkPanel > #editBookmarkHeaderSeparator,
|
#editBookmarkPanel > #editBookmarkHeaderSeparator,
|
||||||
@@ -241,12 +236,6 @@ panel {
|
|||||||
margin-inline: 0;
|
margin-inline: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#identity-popup-mainView > toolbarseparator:first-child,
|
|
||||||
#unified-extensions-view > toolbarseparator:first-child {
|
|
||||||
display: none;
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
menupopup,
|
menupopup,
|
||||||
panel {
|
panel {
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
|
@@ -43,7 +43,8 @@ body > #confetti {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Firefox View */
|
/* Firefox View */
|
||||||
#firefox-view-button {
|
#firefox-view-button,
|
||||||
|
#wrapper-firefox-view-button {
|
||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,6 +189,21 @@ body > #confetti {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.zen-interactive-button {
|
||||||
|
background: color-mix(in srgb, currentColor 6%, transparent) !important;
|
||||||
|
transition:
|
||||||
|
background-color 0.12s ease-in-out,
|
||||||
|
transform 0.12s ease-in-out;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: color-mix(in srgb, currentColor 10%, transparent) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active:hover {
|
||||||
|
transform: scale(0.95);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Update animation */
|
/** Update animation */
|
||||||
|
|
||||||
#zen-update-animation {
|
#zen-update-animation {
|
||||||
@@ -260,3 +276,187 @@ body > #confetti {
|
|||||||
#customization-container {
|
#customization-container {
|
||||||
--toolbar-bgcolor: var(--zen-dialog-background);
|
--toolbar-bgcolor: var(--zen-dialog-background);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Site Data popup */
|
||||||
|
|
||||||
|
#zen-unified-site-data-panel {
|
||||||
|
--panel-padding: 0px;
|
||||||
|
--panel-width: 228px;
|
||||||
|
--menu-panel-width-wide: calc(var(--panel-width) - var(--panel-padding) * 2);
|
||||||
|
--uei-icon-size: 14px;
|
||||||
|
--arrowpanel-menuitem-border-radius: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#unified-extensions-messages-container {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#zen-site-data-addons {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 8px;
|
||||||
|
overflow: visible;
|
||||||
|
|
||||||
|
.unified-extensions-item-name,
|
||||||
|
.unified-extensions-item-message,
|
||||||
|
.unified-extensions-item-message-hover,
|
||||||
|
.unified-extensions-item-message-hover-menu-button,
|
||||||
|
.unified-extensions-item-menu-button {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#overflowed-extensions-list,
|
||||||
|
#unified-extensions-area,
|
||||||
|
.unified-extensions-list,
|
||||||
|
#zen-site-data-new-addon-button-container {
|
||||||
|
display: contents;
|
||||||
|
|
||||||
|
&:empty {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > * {
|
||||||
|
background-color: color-mix(in srgb, currentcolor 6%, transparent);
|
||||||
|
width: 46px;
|
||||||
|
height: 34px;
|
||||||
|
margin: 0;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
border-radius: 6px;
|
||||||
|
transition:
|
||||||
|
background-color 0.1s ease-in-out,
|
||||||
|
transform 0.12s ease-in-out;
|
||||||
|
|
||||||
|
& toolbarbutton {
|
||||||
|
background: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
& .toolbarbutton-badge-stack {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: scale(1.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active:hover {
|
||||||
|
transform: scale(0.95);
|
||||||
|
background-color: color-mix(in srgb, currentcolor 10%, transparent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.zen-site-data-section {
|
||||||
|
gap: 6px;
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.zen-site-data-section-header {
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: small;
|
||||||
|
|
||||||
|
& label {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > label:nth-child(2) {
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: smaller;
|
||||||
|
transition: opacity 0.15s ease-in-out;
|
||||||
|
opacity: 0;
|
||||||
|
padding: 0px 4px;
|
||||||
|
|
||||||
|
.zen-site-data-section:hover & {
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#zen-site-data-new-addon-button .toolbarbutton-text {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.permission-popup-permission-item {
|
||||||
|
gap: 8px;
|
||||||
|
overflow: hidden;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.permission-popup-permission-label {
|
||||||
|
margin: 0px;
|
||||||
|
font-weight: 500;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
|
.permission-popup-permission-icon {
|
||||||
|
fill: var(--button-primary-color);
|
||||||
|
padding: 8px;
|
||||||
|
width: 34px;
|
||||||
|
height: 34px;
|
||||||
|
overflow: visible;
|
||||||
|
position: relative;
|
||||||
|
appearance: none;
|
||||||
|
|
||||||
|
& label {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
& image {
|
||||||
|
-moz-context-properties: fill;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
inset: 1px;
|
||||||
|
border-radius: 99px;
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
background: var(--button-primary-bgcolor);
|
||||||
|
opacity: 0.6;
|
||||||
|
transition:
|
||||||
|
transform 0.12s ease-in-out,
|
||||||
|
opacity 0.12s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.permission-popup-permission-item:hover &::before {
|
||||||
|
transform: scale(1.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.permission-popup-permission-item:active:hover &::before {
|
||||||
|
transform: scale(0.95);
|
||||||
|
}
|
||||||
|
|
||||||
|
.permission-popup-permission-item[state='allow'] &::before {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.zen-permission-popup-permission-state-label {
|
||||||
|
opacity: 0.8;
|
||||||
|
font-size: smaller;
|
||||||
|
font-weight: 400;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#identity-box {
|
||||||
|
opacity: 0.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
#zen-site-data-footer {
|
||||||
|
border-top: 1px solid color-mix(in srgb, currentColor 6%, transparent);
|
||||||
|
padding-top: 8px;
|
||||||
|
margin: 2px 8px 8px 8px;
|
||||||
|
|
||||||
|
& toolbarbutton {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#unified-extensions-button:not([showing]) {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
@@ -661,7 +661,7 @@ var gZenCompactModeManager = {
|
|||||||
requestAnimationFrame(() => {
|
requestAnimationFrame(() => {
|
||||||
delete this._hasHoveredUrlbar;
|
delete this._hasHoveredUrlbar;
|
||||||
});
|
});
|
||||||
}, 0);
|
}, 10);
|
||||||
}, 0);
|
}, 0);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@@ -29,7 +29,7 @@
|
|||||||
&,
|
&,
|
||||||
&::before,
|
&::before,
|
||||||
&::after {
|
&::after {
|
||||||
border-radius: calc(var(--zen-native-inner-radius) + var(--zen-element-separation) / 4 - var(--zen-compact-mode-no-padding-radius-fix, 0px));
|
border-radius: calc(var(--zen-native-inner-radius) - var(--zen-compact-mode-no-padding-radius-fix, 0px));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,7 +97,10 @@
|
|||||||
bottom: var(--zen-compact-float);
|
bottom: var(--zen-compact-float);
|
||||||
padding: 0 var(--zen-compact-float) !important;
|
padding: 0 var(--zen-compact-float) !important;
|
||||||
:root[zen-single-toolbar='true'] & {
|
:root[zen-single-toolbar='true'] & {
|
||||||
top: calc(var(--zen-compact-float) / 2);
|
/* We add an extra offset since windows users have a border top
|
||||||
|
* in the window in order to compensate how windows renders the
|
||||||
|
* titlebar */
|
||||||
|
top: calc(var(--zen-compact-float) / 2 + var(--zen-sidebar-compact-top-offset, 0px));
|
||||||
height: calc(100% - var(--zen-compact-float));
|
height: calc(100% - var(--zen-compact-float));
|
||||||
}
|
}
|
||||||
:root:not([zen-single-toolbar='true']) & {
|
:root:not([zen-single-toolbar='true']) & {
|
||||||
@@ -322,6 +325,9 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
& #zen-appcontent-navbar-wrapper {
|
& #zen-appcontent-navbar-wrapper {
|
||||||
|
& .zen-toolbar-background {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
--zen-compact-toolbar-offset: 5px;
|
--zen-compact-toolbar-offset: 5px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: calc(-1 * var(--zen-toolbar-height) + 1px);
|
top: calc(-1 * var(--zen-toolbar-height) + 1px);
|
||||||
@@ -360,9 +366,6 @@
|
|||||||
) {
|
) {
|
||||||
& #zen-appcontent-navbar-container {
|
& #zen-appcontent-navbar-container {
|
||||||
visibility: visible !important;
|
visibility: visible !important;
|
||||||
& .zen-toolbar-background {
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
border-top-width: 0px;
|
border-top-width: 0px;
|
||||||
|
|
||||||
|
@@ -1,27 +0,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/.
|
|
||||||
|
|
||||||
const FILE_NAME = 'zen-sessions.jsonlz4';
|
|
||||||
|
|
||||||
export class nsZenSessionFile {
|
|
||||||
#path;
|
|
||||||
|
|
||||||
#windows;
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
this.#path = PathUtils.join(profileDir, FILE_NAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
async read() {
|
|
||||||
try {
|
|
||||||
return await IOUtils.readJSON(this.#path, { compress: true });
|
|
||||||
} catch (e) {
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async write(data) {
|
|
||||||
await IOUtils.writeJSON(this.#path, data, { compress: true });
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,50 +0,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 {
|
|
||||||
cancelIdleCallback,
|
|
||||||
clearTimeout,
|
|
||||||
requestIdleCallback,
|
|
||||||
setTimeout,
|
|
||||||
} from 'resource://gre/modules/Timer.sys.mjs';
|
|
||||||
|
|
||||||
const lazy = {};
|
|
||||||
|
|
||||||
ChromeUtils.defineESModuleGetters(lazy, {
|
|
||||||
ZenSessionFile: 'resource://gre/modules/ZenSessionFile.sys.mjs',
|
|
||||||
PrivateBrowsingUtils: 'resource://gre/modules/PrivateBrowsingUtils.sys.mjs',
|
|
||||||
RunState: 'resource:///modules/sessionstore/RunState.sys.mjs',
|
|
||||||
});
|
|
||||||
|
|
||||||
class nsZenSessionManager {
|
|
||||||
#file;
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
this.#file = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
get file() {
|
|
||||||
if (!this.#file) {
|
|
||||||
this.#file = lazy.ZenSessionFile;
|
|
||||||
}
|
|
||||||
return this.#file;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Saves the current session state. Collects data and writes to disk.
|
|
||||||
*
|
|
||||||
* @param forceUpdateAllWindows (optional)
|
|
||||||
* Forces us to recollect data for all windows and will bypass and
|
|
||||||
* update the corresponding caches.
|
|
||||||
*/
|
|
||||||
saveState(forceUpdateAllWindows = false) {
|
|
||||||
if (lazy.PrivateBrowsingUtils.permanentPrivateBrowsing) {
|
|
||||||
// Don't save (or even collect) anything in permanent private
|
|
||||||
// browsing mode
|
|
||||||
return Promise.resolve();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const ZenSessionStore = new nsZenSessionManager();
|
|
@@ -1,35 +0,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/.
|
|
||||||
|
|
||||||
export class ZenSessionWindow {
|
|
||||||
#id;
|
|
||||||
#selectedWorkspace;
|
|
||||||
#selectedTab;
|
|
||||||
|
|
||||||
constructor(id) {
|
|
||||||
this.#id = id;
|
|
||||||
this.#selectedWorkspace = null;
|
|
||||||
this.#selectedTab = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
get id() {
|
|
||||||
return this.#id;
|
|
||||||
}
|
|
||||||
|
|
||||||
get selectedWorkspace() {
|
|
||||||
return this.#selectedWorkspace;
|
|
||||||
}
|
|
||||||
|
|
||||||
set selectedWorkspace(workspace) {
|
|
||||||
this.#selectedWorkspace = workspace;
|
|
||||||
}
|
|
||||||
|
|
||||||
get selectedTab() {
|
|
||||||
return this.#selectedTab;
|
|
||||||
}
|
|
||||||
|
|
||||||
set selectedTab(tab) {
|
|
||||||
this.#selectedTab = tab;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -97,7 +97,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
onTabIconChanged(tab, url = null) {
|
onTabIconChanged(tab, url = null) {
|
||||||
tab.dispatchEvent(new CustomEvent('ZenTabIconChanged', { bubbles: true, detail: { tab } }));
|
|
||||||
const iconUrl = url ?? tab.iconImage.src;
|
const iconUrl = url ?? tab.iconImage.src;
|
||||||
if (!iconUrl && tab.hasAttribute('zen-pin-id')) {
|
if (!iconUrl && tab.hasAttribute('zen-pin-id')) {
|
||||||
try {
|
try {
|
||||||
@@ -1512,7 +1511,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
async onTabLabelChanged(tab) {
|
async onTabLabelChanged(tab) {
|
||||||
tab.dispatchEvent(new CustomEvent('ZenTabLabelChanged', { detail: { tab } }));
|
|
||||||
if (!this._pinsCache) {
|
if (!this._pinsCache) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@@ -978,9 +978,6 @@
|
|||||||
& #PanelUI-button {
|
& #PanelUI-button {
|
||||||
order: -2;
|
order: -2;
|
||||||
}
|
}
|
||||||
& #unified-extensions-button {
|
|
||||||
order: -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
& #zen-sidebar-top-buttons-customization-target {
|
& #zen-sidebar-top-buttons-customization-target {
|
||||||
|
382
src/zen/urlbar/ZenSiteDataPanel.sys.mjs
Normal file
382
src/zen/urlbar/ZenSiteDataPanel.sys.mjs
Normal file
@@ -0,0 +1,382 @@
|
|||||||
|
/* 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/. */
|
||||||
|
|
||||||
|
export class nsZenSiteDataPanel {
|
||||||
|
#iconMap = {
|
||||||
|
install: 'extension',
|
||||||
|
};
|
||||||
|
|
||||||
|
constructor(window) {
|
||||||
|
this.window = window;
|
||||||
|
this.document = window.document;
|
||||||
|
|
||||||
|
this.panel = this.document.getElementById('zen-unified-site-data-panel');
|
||||||
|
this.#init();
|
||||||
|
}
|
||||||
|
|
||||||
|
#init() {
|
||||||
|
// Add a new button to the urlbar popup
|
||||||
|
const button = this.window.MozXULElement.parseXULToFragment(`
|
||||||
|
<box id="zen-site-data-icon-button" role="button" align="center" class="identity-box-button" delegatesanchor="true">
|
||||||
|
<image />
|
||||||
|
</box>
|
||||||
|
`);
|
||||||
|
this.anchor = button.querySelector('#zen-site-data-icon-button');
|
||||||
|
this.document.getElementById('identity-icon-box').after(button);
|
||||||
|
this.window.gUnifiedExtensions._button = this.anchor;
|
||||||
|
|
||||||
|
this.document
|
||||||
|
.getElementById('nav-bar')
|
||||||
|
.setAttribute('addon-webext-overflowbutton', 'zen-site-data-icon-button');
|
||||||
|
|
||||||
|
// Remove the old permissions dialog
|
||||||
|
this.document.getElementById('unified-extensions-panel-template').remove();
|
||||||
|
|
||||||
|
this.#initEventListeners();
|
||||||
|
}
|
||||||
|
|
||||||
|
#initEventListeners() {
|
||||||
|
this.panel.addEventListener('popupshowing', this);
|
||||||
|
this.document
|
||||||
|
.getElementById('zen-site-data-new-addon-button')
|
||||||
|
.addEventListener('command', this);
|
||||||
|
this.document.getElementById('zen-site-data-manage-addons').addEventListener('click', this);
|
||||||
|
this.document.getElementById('zen-site-data-settings-more').addEventListener('click', this);
|
||||||
|
this.document.getElementById('zen-site-data-security-info').addEventListener('command', this);
|
||||||
|
this.document.getElementById('zen-site-data-actions').addEventListener('command', this);
|
||||||
|
|
||||||
|
this.#initContextMenuEventListener();
|
||||||
|
}
|
||||||
|
|
||||||
|
#initContextMenuEventListener() {
|
||||||
|
const kCommands = {
|
||||||
|
context_zenClearSiteData: (event) => {
|
||||||
|
this.window.gIdentityHandler.clearSiteData(event);
|
||||||
|
},
|
||||||
|
context_zenOpenGetAddons: () => {
|
||||||
|
this.#openGetAddons();
|
||||||
|
},
|
||||||
|
context_zenOpenSiteSettings: () => {
|
||||||
|
const { BrowserCommands } = this.window;
|
||||||
|
BrowserCommands.pageInfo(null, 'permTab');
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
for (let [id, handler] of Object.entries(kCommands)) {
|
||||||
|
this.document.getElementById(id).addEventListener('command', handler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#preparePanel() {
|
||||||
|
this.#setSitePermissions();
|
||||||
|
this.#setSiteSecurityInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
#setSiteSecurityInfo() {
|
||||||
|
const { gIdentityHandler } = this.window;
|
||||||
|
const button = this.document.getElementById('zen-site-data-security-info');
|
||||||
|
|
||||||
|
if (gIdentityHandler._isSecureInternalUI) {
|
||||||
|
button.parentNode.hidden = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let identity;
|
||||||
|
if (gIdentityHandler._pageExtensionPolicy) {
|
||||||
|
this.document.l10n.setAttributes(button, 'zen-site-data-security-info-extension');
|
||||||
|
identity = 'extension';
|
||||||
|
} else if (gIdentityHandler._uriHasHost && gIdentityHandler._isSecureConnection) {
|
||||||
|
this.document.l10n.setAttributes(button, 'zen-site-data-security-info-secure');
|
||||||
|
identity = 'secure';
|
||||||
|
} else {
|
||||||
|
this.document.l10n.setAttributes(button, 'zen-site-data-security-info-not-secure');
|
||||||
|
identity = 'not-secure';
|
||||||
|
}
|
||||||
|
|
||||||
|
button.parentNode.hidden = false;
|
||||||
|
button.setAttribute('identity', identity);
|
||||||
|
}
|
||||||
|
|
||||||
|
#setSitePermissions() {
|
||||||
|
const { gBrowser, SitePermissions } = this.window;
|
||||||
|
const list = this.document.getElementById('zen-site-data-settings-list');
|
||||||
|
const section = list.closest('.zen-site-data-section');
|
||||||
|
|
||||||
|
// show permission icons
|
||||||
|
let permissions = SitePermissions.getAllPermissionDetailsForBrowser(gBrowser.selectedBrowser);
|
||||||
|
|
||||||
|
// Don't display origin-keyed 3rdPartyStorage permissions that are covered by
|
||||||
|
// site-keyed 3rdPartyFrameStorage permissions.
|
||||||
|
let thirdPartyStorageSites = new Set(
|
||||||
|
permissions
|
||||||
|
.map(function (permission) {
|
||||||
|
let [id, key] = permission.id.split(SitePermissions.PERM_KEY_DELIMITER);
|
||||||
|
if (id == '3rdPartyFrameStorage') {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
})
|
||||||
|
.filter(function (key) {
|
||||||
|
return key != null;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
permissions = permissions.filter(function (permission) {
|
||||||
|
let [id, key] = permission.id.split(SitePermissions.PERM_KEY_DELIMITER);
|
||||||
|
if (id != '3rdPartyStorage') {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
let origin = Services.io.newURI(key);
|
||||||
|
let site = Services.eTLD.getSite(origin);
|
||||||
|
return !thirdPartyStorageSites.has(site);
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this._sharingState = gBrowser.selectedTab._sharingState;
|
||||||
|
|
||||||
|
if (this._sharingState?.geo) {
|
||||||
|
let geoPermission = permissions.find((perm) => perm.id === 'geo');
|
||||||
|
if (geoPermission) {
|
||||||
|
geoPermission.sharingState = true;
|
||||||
|
} else {
|
||||||
|
permissions.push({
|
||||||
|
id: 'geo',
|
||||||
|
state: SitePermissions.ALLOW,
|
||||||
|
scope: SitePermissions.SCOPE_REQUEST,
|
||||||
|
sharingState: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._sharingState?.xr) {
|
||||||
|
let xrPermission = permissions.find((perm) => perm.id === 'xr');
|
||||||
|
if (xrPermission) {
|
||||||
|
xrPermission.sharingState = true;
|
||||||
|
} else {
|
||||||
|
permissions.push({
|
||||||
|
id: 'xr',
|
||||||
|
state: SitePermissions.ALLOW,
|
||||||
|
scope: SitePermissions.SCOPE_REQUEST,
|
||||||
|
sharingState: true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._sharingState?.webRTC) {
|
||||||
|
let webrtcState = this._sharingState.webRTC;
|
||||||
|
// If WebRTC device or screen are in use, we need to find
|
||||||
|
// the associated ALLOW permission item to set the sharingState field.
|
||||||
|
for (let id of ['camera', 'microphone', 'screen']) {
|
||||||
|
if (webrtcState[id]) {
|
||||||
|
let found = false;
|
||||||
|
for (let permission of permissions) {
|
||||||
|
let [permId] = permission.id.split(SitePermissions.PERM_KEY_DELIMITER);
|
||||||
|
if (permId != id || permission.state != SitePermissions.ALLOW) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
found = true;
|
||||||
|
permission.sharingState = webrtcState[id];
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
// If the ALLOW permission item we were looking for doesn't exist,
|
||||||
|
// the user has temporarily allowed sharing and we need to add
|
||||||
|
// an item in the permissions array to reflect this.
|
||||||
|
permissions.push({
|
||||||
|
id,
|
||||||
|
state: SitePermissions.ALLOW,
|
||||||
|
scope: SitePermissions.SCOPE_REQUEST,
|
||||||
|
sharingState: webrtcState[id],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
list.innerHTML = '';
|
||||||
|
for (let permission of permissions) {
|
||||||
|
let [id, key] = permission.id.split(SitePermissions.PERM_KEY_DELIMITER);
|
||||||
|
|
||||||
|
if (id == 'storage-access') {
|
||||||
|
// Ignore storage access permissions here, they are made visible inside
|
||||||
|
// the Content Blocking UI.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (permission.state == SitePermissions.PROMPT) {
|
||||||
|
// We don't display "ask" permissions in the site data panel.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let item = this.#createPermissionItem(id, key, permission);
|
||||||
|
if (item) {
|
||||||
|
list.appendChild(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
section.hidden = list.childElementCount == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#getPermissionStateLabelId(permission) {
|
||||||
|
const { SitePermissions } = this.window;
|
||||||
|
switch (permission.state) {
|
||||||
|
// There should only be these types being displayed in the panel.
|
||||||
|
case SitePermissions.ALLOW:
|
||||||
|
return 'zen-site-data-setting-allow';
|
||||||
|
case SitePermissions.BLOCK:
|
||||||
|
case SitePermissions.AUTOPLAY_BLOCKED_ALL:
|
||||||
|
return 'zen-site-data-setting-block';
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#createPermissionItem(id, key, permission) {
|
||||||
|
const { SitePermissions } = this.window;
|
||||||
|
|
||||||
|
// Create a permission item for the site data panel.
|
||||||
|
let container = this.document.createXULElement('hbox');
|
||||||
|
const idNoSuffix = permission.id;
|
||||||
|
container.classList.add(
|
||||||
|
'permission-popup-permission-item',
|
||||||
|
`permission-popup-permission-item-${idNoSuffix}`
|
||||||
|
);
|
||||||
|
container.setAttribute('align', 'center');
|
||||||
|
container.setAttribute('role', 'group');
|
||||||
|
|
||||||
|
container.setAttribute('state', permission.state == SitePermissions.ALLOW ? 'allow' : 'block');
|
||||||
|
|
||||||
|
let img = this.document.createXULElement('toolbarbutton');
|
||||||
|
img.classList.add('permission-popup-permission-icon', 'zen-site-data-permission-icon');
|
||||||
|
if (this.#iconMap[id]) {
|
||||||
|
img.classList.add(`zen-permission-${this.#iconMap[id]}-icon`);
|
||||||
|
}
|
||||||
|
|
||||||
|
let labelContainer = this.document.createXULElement('vbox');
|
||||||
|
labelContainer.setAttribute('flex', '1');
|
||||||
|
labelContainer.setAttribute('align', 'start');
|
||||||
|
labelContainer.classList.add('permission-popup-permission-label-container');
|
||||||
|
labelContainer._permission = permission;
|
||||||
|
labelContainer.addEventListener('click', this);
|
||||||
|
|
||||||
|
let nameLabel = this.document.createXULElement('label');
|
||||||
|
nameLabel.setAttribute('flex', '1');
|
||||||
|
nameLabel.setAttribute('class', 'permission-popup-permission-label');
|
||||||
|
let label = SitePermissions.getPermissionLabel(permission.id);
|
||||||
|
if (label === null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
nameLabel.textContent = label;
|
||||||
|
labelContainer.appendChild(nameLabel);
|
||||||
|
|
||||||
|
let stateLabel = this.document.createXULElement('label');
|
||||||
|
stateLabel.setAttribute('class', 'zen-permission-popup-permission-state-label');
|
||||||
|
stateLabel.setAttribute('data-l10n-id', this.#getPermissionStateLabelId(permission));
|
||||||
|
labelContainer.appendChild(stateLabel);
|
||||||
|
|
||||||
|
container.appendChild(img);
|
||||||
|
container.appendChild(labelContainer);
|
||||||
|
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
|
||||||
|
#openGetAddons() {
|
||||||
|
const { switchToTabHavingURI } = this.window;
|
||||||
|
let amoUrl = Services.urlFormatter.formatURLPref('extensions.getAddons.link.url');
|
||||||
|
switchToTabHavingURI(amoUrl, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
#onCommandEvent(event) {
|
||||||
|
const id = event.target.id;
|
||||||
|
switch (id) {
|
||||||
|
case 'zen-site-data-new-addon-button': {
|
||||||
|
this.#openGetAddons();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'zen-site-data-security-info': {
|
||||||
|
this.window.displaySecurityInfo();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'zen-site-data-actions': {
|
||||||
|
const button = this.document.getElementById('zen-site-data-actions');
|
||||||
|
const popup = this.document.getElementById('zenSiteDataActions');
|
||||||
|
popup.openPopup(
|
||||||
|
button,
|
||||||
|
'after_start',
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
/* context menu */ true,
|
||||||
|
false,
|
||||||
|
this.window.event
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#onPermissionClick(label) {
|
||||||
|
const { SitePermissions, gBrowser } = this.window;
|
||||||
|
const permission = label._permission;
|
||||||
|
|
||||||
|
let newState;
|
||||||
|
switch (permission.state) {
|
||||||
|
case SitePermissions.ALLOW:
|
||||||
|
newState = SitePermissions.BLOCK;
|
||||||
|
break;
|
||||||
|
case SitePermissions.BLOCK:
|
||||||
|
case SitePermissions.AUTOPLAY_BLOCKED_ALL:
|
||||||
|
newState = SitePermissions.ALLOW;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SitePermissions.setForPrincipal(gBrowser.contentPrincipal, permission.id, newState);
|
||||||
|
|
||||||
|
label.parentNode.setAttribute('state', newState == SitePermissions.ALLOW ? 'allow' : 'block');
|
||||||
|
label
|
||||||
|
.querySelector('.zen-permission-popup-permission-state-label')
|
||||||
|
.setAttribute('data-l10n-id', this.#getPermissionStateLabelId({ state: newState }));
|
||||||
|
label._permission.state = newState;
|
||||||
|
}
|
||||||
|
|
||||||
|
#onClickEvent(event) {
|
||||||
|
const id = event.target.id;
|
||||||
|
switch (id) {
|
||||||
|
case 'zen-site-data-manage-addons': {
|
||||||
|
const { BrowserAddonUI } = this.window;
|
||||||
|
BrowserAddonUI.openAddonsMgr('addons://list/extension');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'zen-site-data-settings-more': {
|
||||||
|
const { BrowserCommands } = this.window;
|
||||||
|
BrowserCommands.pageInfo(null, 'permTab');
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
const label = event.target.closest('.permission-popup-permission-label-container');
|
||||||
|
if (label?._permission) {
|
||||||
|
this.#onPermissionClick(label);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
handleEvent(event) {
|
||||||
|
const type = event.type;
|
||||||
|
switch (type) {
|
||||||
|
case 'click':
|
||||||
|
this.#onClickEvent(event);
|
||||||
|
break;
|
||||||
|
case 'command':
|
||||||
|
this.#onCommandEvent(event);
|
||||||
|
break;
|
||||||
|
case 'popupshowing':
|
||||||
|
this.#preparePanel();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -15,7 +15,7 @@ const DYNAMIC_TYPE_NAME = 'zen-actions';
|
|||||||
const MAX_RECENT_ACTIONS = 5;
|
const MAX_RECENT_ACTIONS = 5;
|
||||||
|
|
||||||
const MINIMUM_QUERY_SCORE = 92;
|
const MINIMUM_QUERY_SCORE = 92;
|
||||||
const MINIMUM_PREFIXED_QUERY_SCORE = 50;
|
const MINIMUM_PREFIXED_QUERY_SCORE = 30;
|
||||||
|
|
||||||
ChromeUtils.defineESModuleGetters(lazy, {
|
ChromeUtils.defineESModuleGetters(lazy, {
|
||||||
UrlbarResult: 'resource:///modules/UrlbarResult.sys.mjs',
|
UrlbarResult: 'resource:///modules/UrlbarResult.sys.mjs',
|
||||||
@@ -242,15 +242,15 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const ownerGlobal = lazy.BrowserWindowTracker.getTopWindow();
|
const ownerGlobal = lazy.BrowserWindowTracker.getTopWindow();
|
||||||
const finalResults = [];
|
let finalResults = [];
|
||||||
for (const action of actionsResults) {
|
for (const action of actionsResults) {
|
||||||
const [payload, payloadHighlights] = lazy.UrlbarResult.payloadAndSimpleHighlights([], {
|
const [payload, payloadHighlights] = lazy.UrlbarResult.payloadAndSimpleHighlights([], {
|
||||||
suggestion: action.label,
|
suggestion: action.label,
|
||||||
title: action.label,
|
title: action.label,
|
||||||
query: queryContext.searchString,
|
|
||||||
zenCommand: action.command,
|
zenCommand: action.command,
|
||||||
dynamicType: DYNAMIC_TYPE_NAME,
|
dynamicType: DYNAMIC_TYPE_NAME,
|
||||||
zenAction: true,
|
zenAction: true,
|
||||||
|
query: isPrefixed ? action.label.trimStart() : queryContext.searchString,
|
||||||
icon: action.icon,
|
icon: action.icon,
|
||||||
shortcutContent: ownerGlobal.gZenKeyboardShortcutsManager.getShortcutDisplayFromCommand(
|
shortcutContent: ownerGlobal.gZenKeyboardShortcutsManager.getShortcutDisplayFromCommand(
|
||||||
action.command
|
action.command
|
||||||
@@ -265,7 +265,7 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider {
|
|||||||
payload,
|
payload,
|
||||||
payloadHighlights
|
payloadHighlights
|
||||||
);
|
);
|
||||||
if (zenUrlbarResultsLearner.shouldPrioritize(action.commandId)) {
|
if (zenUrlbarResultsLearner.shouldPrioritize(action.commandId) && !isPrefixed) {
|
||||||
result.heuristic = true;
|
result.heuristic = true;
|
||||||
} else {
|
} else {
|
||||||
result.suggestedIndex = zenUrlbarResultsLearner.getDeprioritizeIndex(action.commandId);
|
result.suggestedIndex = zenUrlbarResultsLearner.getDeprioritizeIndex(action.commandId);
|
||||||
@@ -278,8 +278,14 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider {
|
|||||||
}
|
}
|
||||||
finalResults.push(result);
|
finalResults.push(result);
|
||||||
}
|
}
|
||||||
|
let i = 0;
|
||||||
zenUrlbarResultsLearner.sortCommandsByPriority(finalResults).forEach((result) => {
|
zenUrlbarResultsLearner.sortCommandsByPriority(finalResults).forEach((result) => {
|
||||||
|
if (isPrefixed && i === 0 && query.length > 1) {
|
||||||
|
result.heuristic = true;
|
||||||
|
delete result.suggestedIndex;
|
||||||
|
}
|
||||||
addCallback(this, result);
|
addCallback(this, result);
|
||||||
|
i++;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -37,16 +37,16 @@ const globalActionsTemplate = [
|
|||||||
command: (window) => window.openPreferences(),
|
command: (window) => window.openPreferences(),
|
||||||
icon: 'chrome://browser/skin/zen-icons/settings.svg',
|
icon: 'chrome://browser/skin/zen-icons/settings.svg',
|
||||||
},
|
},
|
||||||
{
|
|
||||||
label: 'Open New Window',
|
|
||||||
command: 'cmd_newNavigator',
|
|
||||||
icon: 'chrome://browser/skin/zen-icons/window.svg',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: 'Open Private Window',
|
label: 'Open Private Window',
|
||||||
command: 'Tools:PrivateBrowsing',
|
command: 'Tools:PrivateBrowsing',
|
||||||
icon: 'chrome://browser/skin/zen-icons/private-window.svg',
|
icon: 'chrome://browser/skin/zen-icons/private-window.svg',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
label: 'Open New Window',
|
||||||
|
command: 'cmd_newNavigator',
|
||||||
|
icon: 'chrome://browser/skin/zen-icons/window.svg',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
label: 'Pin Tab',
|
label: 'Pin Tab',
|
||||||
command: 'cmd_zenTogglePinTab',
|
command: 'cmd_zenTogglePinTab',
|
||||||
|
@@ -7,7 +7,7 @@ import { XPCOMUtils } from 'resource://gre/modules/XPCOMUtils.sys.mjs';
|
|||||||
const lazy = {};
|
const lazy = {};
|
||||||
|
|
||||||
const DEFAULT_DB_DATA = '{}';
|
const DEFAULT_DB_DATA = '{}';
|
||||||
const DEPRIORITIZE_MAX = -4;
|
const DEPRIORITIZE_MAX = -5;
|
||||||
const PRIORITIZE_MAX = 5;
|
const PRIORITIZE_MAX = 5;
|
||||||
|
|
||||||
function addDataToLazy(data) {
|
function addDataToLazy(data) {
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|
||||||
EXTRA_JS_MODULES += [
|
EXTRA_JS_MODULES += [
|
||||||
|
"ZenSiteDataPanel.sys.mjs",
|
||||||
"ZenUBActionsProvider.sys.mjs",
|
"ZenUBActionsProvider.sys.mjs",
|
||||||
"ZenUBGlobalActions.sys.mjs",
|
"ZenUBGlobalActions.sys.mjs",
|
||||||
"ZenUBProvider.sys.mjs",
|
"ZenUBProvider.sys.mjs",
|
||||||
|
@@ -1,308 +0,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/.
|
|
||||||
{
|
|
||||||
class nsZenWorkspaceWindowSync extends nsZenMultiWindowFeature {
|
|
||||||
#ignoreNextEvents = false;
|
|
||||||
#waitForPromise = null;
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super();
|
|
||||||
if (!window.closed) {
|
|
||||||
this.init();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async init() {
|
|
||||||
await gZenWorkspaces.promiseInitialized;
|
|
||||||
this.#makeSureAllTabsHaveIds();
|
|
||||||
this.#setUpEventListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
#makeSureAllTabsHaveIds() {
|
|
||||||
const allTabs = gZenWorkspaces.allStoredTabs;
|
|
||||||
for (const tab of allTabs) {
|
|
||||||
if (!tab.hasAttribute('zen-sync-id') && !tab.hasAttribute('zen-empty-tab')) {
|
|
||||||
const tabId = gZenUIManager.generateUuidv4();
|
|
||||||
tab.setAttribute('zen-sync-id', tabId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#setUpEventListeners() {
|
|
||||||
const kEvents = [
|
|
||||||
'TabClose',
|
|
||||||
'TabOpen',
|
|
||||||
'TabMove',
|
|
||||||
|
|
||||||
'TabPinned',
|
|
||||||
'TabUnpinned',
|
|
||||||
|
|
||||||
'TabAddedToEssentials',
|
|
||||||
'TabRemovedFromEssentials',
|
|
||||||
|
|
||||||
'TabHide',
|
|
||||||
'TabShow',
|
|
||||||
|
|
||||||
'ZenTabIconChanged',
|
|
||||||
'ZenTabLabelChanged',
|
|
||||||
|
|
||||||
'TabGroupCreate',
|
|
||||||
'TabGroupRemoved',
|
|
||||||
'TabGrouped',
|
|
||||||
'TabUngrouped',
|
|
||||||
'TabGroupMoved',
|
|
||||||
];
|
|
||||||
const eventListener = this.#handleEvent.bind(this);
|
|
||||||
for (const event of kEvents) {
|
|
||||||
window.addEventListener(event, eventListener);
|
|
||||||
}
|
|
||||||
|
|
||||||
window.addEventListener('unload', () => {
|
|
||||||
for (const event of kEvents) {
|
|
||||||
window.removeEventListener(event, eventListener);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
#handleEvent(event) {
|
|
||||||
this.#propagateToOtherWindows(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
async #propagateToOtherWindows(event) {
|
|
||||||
if (this.#ignoreNextEvents) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (this.#waitForPromise) {
|
|
||||||
await this.#waitForPromise;
|
|
||||||
}
|
|
||||||
this.#waitForPromise = new Promise((resolve) => {
|
|
||||||
this.foreachWindowAsActive(async (browser) => {
|
|
||||||
if (browser.gZenWorkspaceWindowSync && !this.windowIsActive(browser)) {
|
|
||||||
await browser.gZenWorkspaceWindowSync.onExternalTabEvent(event);
|
|
||||||
}
|
|
||||||
}).then(() => {
|
|
||||||
resolve();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async onExternalTabEvent(event) {
|
|
||||||
this.#ignoreNextEvents = true;
|
|
||||||
switch (event.type) {
|
|
||||||
case 'TabClose':
|
|
||||||
this.#onTabClose(event);
|
|
||||||
break;
|
|
||||||
case 'TabOpen':
|
|
||||||
await this.#onTabOpen(event);
|
|
||||||
break;
|
|
||||||
case 'TabPinned':
|
|
||||||
this.#onTabPinned(event);
|
|
||||||
break;
|
|
||||||
case 'TabUnpinned':
|
|
||||||
this.#onTabUnpinned(event);
|
|
||||||
break;
|
|
||||||
case 'TabAddedToEssentials':
|
|
||||||
this.#onTabAddedToEssentials(event);
|
|
||||||
break;
|
|
||||||
case 'TabRemovedFromEssentials':
|
|
||||||
this.#onTabRemovedFromEssentials(event);
|
|
||||||
break;
|
|
||||||
case 'TabHide':
|
|
||||||
this.#onTabHide(event);
|
|
||||||
break;
|
|
||||||
case 'TabShow':
|
|
||||||
this.#onTabShow(event);
|
|
||||||
break;
|
|
||||||
case 'TabMove':
|
|
||||||
case 'TabGroupMoved':
|
|
||||||
this.#onTabMove(event);
|
|
||||||
break;
|
|
||||||
case 'ZenTabIconChanged':
|
|
||||||
this.#onTabIconChanged(event);
|
|
||||||
break;
|
|
||||||
case 'ZenTabLabelChanged':
|
|
||||||
this.#onTabLabelChanged(event);
|
|
||||||
break;
|
|
||||||
case 'TabGroupCreate':
|
|
||||||
this.#onTabGroupCreate(event);
|
|
||||||
break;
|
|
||||||
case 'TabGroupRemoved':
|
|
||||||
case 'TabGrouped':
|
|
||||||
case 'TabUngrouped':
|
|
||||||
// Tab grouping changes are automatically synced by Firefox
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
console.warn(`Unhandled event type: ${event.type}`);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
this.#ignoreNextEvents = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#getTabId(tab) {
|
|
||||||
return tab.getAttribute('zen-sync-id');
|
|
||||||
}
|
|
||||||
|
|
||||||
#getTabWithId(tabId) {
|
|
||||||
for (const tab of gZenWorkspaces.allStoredTabs) {
|
|
||||||
if (this.#getTabId(tab) === tabId) {
|
|
||||||
return tab;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
#onTabClose(event) {
|
|
||||||
const targetTab = event.target;
|
|
||||||
const tabId = this.#getTabId(targetTab);
|
|
||||||
const tabToClose = this.#getTabWithId(tabId);
|
|
||||||
if (tabToClose) {
|
|
||||||
gBrowser.removeTab(tabToClose);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#onTabPinned(event) {
|
|
||||||
const targetTab = event.target;
|
|
||||||
if (targetTab.hasAttribute('zen-essential')) {
|
|
||||||
return this.#onTabAddedToEssentials(event);
|
|
||||||
}
|
|
||||||
const tabId = this.#getTabId(targetTab);
|
|
||||||
const elementIndex = targetTab.elementIndex;
|
|
||||||
const tabToPin = this.#getTabWithId(tabId);
|
|
||||||
if (tabToPin) {
|
|
||||||
gBrowser.pinTab(tabToPin);
|
|
||||||
gBrowser.moveTabTo(tabToPin, { elementIndex, forceUngrouped: !!targetTab.group });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#onTabUnpinned(event) {
|
|
||||||
const targetTab = event.target;
|
|
||||||
const tabId = this.#getTabId(targetTab);
|
|
||||||
const tabToUnpin = this.#getTabWithId(tabId);
|
|
||||||
if (tabToUnpin) {
|
|
||||||
gBrowser.unpinTab(tabToUnpin);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#onTabIconChanged(event) {
|
|
||||||
this.#updateTabIconAndLabel(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
#onTabLabelChanged(event) {
|
|
||||||
this.#updateTabIconAndLabel(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
#updateTabIconAndLabel(event) {
|
|
||||||
const targetTab = event.target;
|
|
||||||
const tabId = this.#getTabId(targetTab);
|
|
||||||
const tabToChange = this.#getTabWithId(tabId);
|
|
||||||
if (tabToChange && tabToChange.hasAttribute('pending')) {
|
|
||||||
gBrowser.setIcon(tabToChange, gBrowser.getIcon(targetTab));
|
|
||||||
gBrowser._setTabLabel(tabToChange, targetTab.label);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#onTabAddedToEssentials(event) {
|
|
||||||
const targetTab = event.target;
|
|
||||||
const tabId = this.#getTabId(targetTab);
|
|
||||||
const tabToAdd = this.#getTabWithId(tabId);
|
|
||||||
if (tabToAdd) {
|
|
||||||
gZenPinnedTabManager.addToEssentials(tabToAdd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#onTabRemovedFromEssentials(event) {
|
|
||||||
const targetTab = event.target;
|
|
||||||
const tabId = this.#getTabId(targetTab);
|
|
||||||
const tabToRemove = this.#getTabWithId(tabId);
|
|
||||||
if (tabToRemove) {
|
|
||||||
gZenPinnedTabManager.removeFromEssentials(tabToRemove);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#onTabHide(event) {
|
|
||||||
const targetTab = event.target;
|
|
||||||
const tabId = this.#getTabId(targetTab);
|
|
||||||
const tabToHide = this.#getTabWithId(tabId);
|
|
||||||
if (tabToHide) {
|
|
||||||
gBrowser.hideTab(tabToHide);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#onTabShow(event) {
|
|
||||||
const targetTab = event.target;
|
|
||||||
const tabId = this.#getTabId(targetTab);
|
|
||||||
const tabToShow = this.#getTabWithId(tabId);
|
|
||||||
if (tabToShow) {
|
|
||||||
gBrowser.showTab(tabToShow);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#onTabMove(event) {
|
|
||||||
const targetTab = event.target;
|
|
||||||
const tabId = this.#getTabId(targetTab);
|
|
||||||
const tabToMove = this.#getTabWithId(tabId);
|
|
||||||
const workspaceId = targetTab.getAttribute('zen-workspace-id');
|
|
||||||
const isEssential = targetTab.hasAttribute('zen-essential');
|
|
||||||
if (tabToMove) {
|
|
||||||
let tabSibling = targetTab.previousElementSibling;
|
|
||||||
let isFirst = false;
|
|
||||||
if (!tabSibling?.hasAttribute('zen-sync-id')) {
|
|
||||||
isFirst = true;
|
|
||||||
}
|
|
||||||
gBrowser.zenHandleTabMove(tabToMove, () => {
|
|
||||||
if (isFirst) {
|
|
||||||
let container;
|
|
||||||
if (isEssential) {
|
|
||||||
container = gZenWorkspaces.getEssentialsSection(tabToMove);
|
|
||||||
} else {
|
|
||||||
const workspaceElement = gZenWorkspaces.workspaceElement(workspaceId);
|
|
||||||
container = tabToMove.pinned
|
|
||||||
? workspaceElement.pinnedTabsContainer
|
|
||||||
: workspaceElement.tabsContainer;
|
|
||||||
}
|
|
||||||
container.insertBefore(tabToMove, container.firstChild);
|
|
||||||
} else {
|
|
||||||
let relativeTab = gZenWorkspaces.allStoredTabs.find((tab) => {
|
|
||||||
return this.#getTabId(tab) === this.#getTabId(tabSibling);
|
|
||||||
});
|
|
||||||
if (relativeTab) {
|
|
||||||
relativeTab.after(tabToMove);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async #onTabOpen(event) {
|
|
||||||
const targetTab = event.target;
|
|
||||||
const isPinned = targetTab.pinned;
|
|
||||||
const isEssential = isPinned && targetTab.hasAttribute('zen-essential');
|
|
||||||
if (!this.#getTabId(targetTab) && !targetTab.hasAttribute('zen-empty-tab')) {
|
|
||||||
const tabId = gZenUIManager.generateUuidv4();
|
|
||||||
targetTab.setAttribute('zen-sync-id', tabId);
|
|
||||||
}
|
|
||||||
const duplicatedTab = gBrowser.addTrustedTab(targetTab.linkedBrowser.currentURI.spec, {
|
|
||||||
createLazyBrowser: true,
|
|
||||||
essential: isEssential,
|
|
||||||
pinned: isPinned,
|
|
||||||
});
|
|
||||||
if (!isEssential) {
|
|
||||||
gZenWorkspaces.moveTabToWorkspace(
|
|
||||||
duplicatedTab,
|
|
||||||
targetTab.getAttribute('zen-workspace-id')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
duplicatedTab.setAttribute('zen-pin-id', targetTab.getAttribute('zen-pin-id'));
|
|
||||||
duplicatedTab.setAttribute('zen-sync-id', targetTab.getAttribute('zen-sync-id'));
|
|
||||||
}
|
|
||||||
|
|
||||||
#onTabGroupCreate(event) {
|
|
||||||
const targetGroup = event.target;
|
|
||||||
const isSplitView = targetGroup.classList.contains('zen-split-view');
|
|
||||||
const isFolder = targetGroup.isZenFolder;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
window.gZenWorkspaceWindowSync = new nsZenWorkspaceWindowSync();
|
|
||||||
}
|
|
@@ -3002,6 +3002,7 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature {
|
|||||||
|
|
||||||
onWindowResize(event = undefined) {
|
onWindowResize(event = undefined) {
|
||||||
if (!(!event || event.target === window)) return;
|
if (!(!event || event.target === window)) return;
|
||||||
|
gZenUIManager.updateTabsToolbar();
|
||||||
// Check if workspace icons overflow the parent container
|
// Check if workspace icons overflow the parent container
|
||||||
const parent = this.workspaceIcons;
|
const parent = this.workspaceIcons;
|
||||||
if (!parent || this._processingResize) {
|
if (!parent || this._processingResize) {
|
||||||
|
@@ -47,7 +47,7 @@
|
|||||||
line-height: 0;
|
line-height: 0;
|
||||||
|
|
||||||
&:is(img) {
|
&:is(img) {
|
||||||
padding: 6px;
|
width: 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&[no-icon='true'] {
|
&[no-icon='true'] {
|
||||||
@@ -237,7 +237,10 @@
|
|||||||
--toolbarbutton-inner-padding: 6px;
|
--toolbarbutton-inner-padding: 6px;
|
||||||
|
|
||||||
& image {
|
& image {
|
||||||
border-radius: calc(var(--border-radius-medium) - 4px);
|
border-radius: calc(var(--border-radius-medium) - 4px) !important;
|
||||||
|
width: 26px;
|
||||||
|
height: 26px;
|
||||||
|
margin-right: -1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
:root[zen-renaming-tab='true'] & {
|
:root[zen-renaming-tab='true'] & {
|
||||||
|
@@ -7,6 +7,8 @@ export default [
|
|||||||
'nsZenDOMOperatedFeature',
|
'nsZenDOMOperatedFeature',
|
||||||
'nsZenPreloadedFeature',
|
'nsZenPreloadedFeature',
|
||||||
|
|
||||||
|
'nsZenSiteDataPanel',
|
||||||
|
|
||||||
'ZenThemeModifier',
|
'ZenThemeModifier',
|
||||||
'ZenHasPolyfill',
|
'ZenHasPolyfill',
|
||||||
|
|
||||||
|
@@ -5,8 +5,8 @@
|
|||||||
"binaryName": "zen",
|
"binaryName": "zen",
|
||||||
"version": {
|
"version": {
|
||||||
"product": "firefox",
|
"product": "firefox",
|
||||||
"version": "143.0.1",
|
"version": "143.0.3",
|
||||||
"candidate": "143.0.1"
|
"candidate": "143.0.3"
|
||||||
},
|
},
|
||||||
"buildOptions": {
|
"buildOptions": {
|
||||||
"generateBranding": true
|
"generateBranding": true
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
"brandShortName": "Zen",
|
"brandShortName": "Zen",
|
||||||
"brandFullName": "Zen Browser",
|
"brandFullName": "Zen Browser",
|
||||||
"release": {
|
"release": {
|
||||||
"displayVersion": "1.16.2b",
|
"displayVersion": "1.16.3b",
|
||||||
"github": {
|
"github": {
|
||||||
"repo": "zen-browser/desktop"
|
"repo": "zen-browser/desktop"
|
||||||
},
|
},
|
||||||
|
Reference in New Issue
Block a user