mirror of
https://github.com/zen-browser/desktop.git
synced 2025-11-21 09:36:22 +00:00
Compare commits
27 Commits
l10n_dev
...
window-syn
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ce986beb2f | ||
|
|
c86875b7b0 | ||
|
|
eefc8cb20c | ||
|
|
12c921fd87 | ||
|
|
e419c4dc9f | ||
|
|
68b37ac736 | ||
|
|
7f225ac3ee | ||
|
|
3e39ef2538 | ||
|
|
e5517eb164 | ||
|
|
c4dd470864 | ||
|
|
bf1b0dcd48 | ||
|
|
76acc8b0e4 | ||
|
|
1b83b77cad | ||
|
|
79ff574978 | ||
|
|
af20a65fa1 | ||
|
|
4a7f8fc9c0 | ||
|
|
a738a829de | ||
|
|
240a031e38 | ||
|
|
9bc7b9ce4e | ||
|
|
86006c8891 | ||
|
|
a55b1c7495 | ||
|
|
6e6337a95b | ||
|
|
6b12153c8a | ||
|
|
f6922ef2ba | ||
|
|
91f5d58fbc | ||
|
|
7a4cdaa45c | ||
|
|
81e854a89f |
@@ -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 `145.0.1`! 🚀
|
- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `145.0`! 🚀
|
||||||
- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 145.0.1`!
|
- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 145.0`!
|
||||||
|
|
||||||
### Contributing
|
### Contributing
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
99a389c2413be0374ee04b10021ed269c0387b45
|
1e325bc45d9111518958446ac966fd4e4136d6d5
|
||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = إعادة تعيين علامة التبويب المثبتة
|
.label = إعادة تعيين علامة التبويب المثبتة
|
||||||
.accesskey = ر
|
.accesskey = ر
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Add to Essentials ({ $num } / { $max } slots filled)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Remove from Essentials
|
.label = Remove from Essentials
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Restableix la pestanya fixada
|
.label = Restableix la pestanya fixada
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Afegeix als essencials
|
.label = Afegeix als essentials ({ $num } / { $max } espais ocupats)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } espais ocupats
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Elimina dels essencials
|
.label = Elimina dels essencials
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -45,12 +45,12 @@ pane-settings-workspaces-title = Pracoviště
|
|||||||
zen-tabs-unloader-enabled =
|
zen-tabs-unloader-enabled =
|
||||||
.label = Povolit uspání karet
|
.label = Povolit uspání karet
|
||||||
zen-tabs-close-on-back-with-no-history =
|
zen-tabs-close-on-back-with-no-history =
|
||||||
.label = „Zavřít panel a přepnout na jeho nadřazený panel (nebo naposledy použitý panel), když se vracíte zpět bez historie.“
|
.label = Close tab and switch to its owner tab (or most recently used tab) when going back with no history
|
||||||
zen-tabs-cycle-by-attribute =
|
zen-tabs-cycle-by-attribute =
|
||||||
.label = Ctrl+Tab cykly pouze v Essentials nebo pracovních kartách
|
.label = Ctrl+Tab cycles within Essential or Workspace tabs only
|
||||||
zen-tabs-cycle-ignore-pending-tabs =
|
zen-tabs-cycle-ignore-pending-tabs =
|
||||||
.label = Ignorovat čekající panely při cyklování s Ctrl+Tab
|
.label = Ignore Pending tabs when cycling with Ctrl+Tab
|
||||||
zen-tabs-cycle-by-attribute-warning = Ctrl+Tab bude cyklovat v nedávno použitém pořadí
|
zen-tabs-cycle-by-attribute-warning = Ctrl+Tab will cycle by recently used order, as it is enabled
|
||||||
zen-look-and-feel-compact-toolbar-themed =
|
zen-look-and-feel-compact-toolbar-themed =
|
||||||
.label = Použít tématické pozadí pro kompaktní panel karet
|
.label = Použít tématické pozadí pro kompaktní panel karet
|
||||||
zen-workspace-continue-where-left-off =
|
zen-workspace-continue-where-left-off =
|
||||||
@@ -83,7 +83,7 @@ zen-settings-workspaces-enabled =
|
|||||||
zen-settings-workspaces-hide-default-container-indicator =
|
zen-settings-workspaces-hide-default-container-indicator =
|
||||||
.label = Skrýt výchozí indikátor kontejneru v panelu záložek
|
.label = Skrýt výchozí indikátor kontejneru v panelu záložek
|
||||||
zen-key-unsaved = Neuložený zástupce! Ubezpečte jej po repsaní kliknutím na klávesu "Escap".
|
zen-key-unsaved = Neuložený zástupce! Ubezpečte jej po repsaní kliknutím na klávesu "Escap".
|
||||||
zen-key-conflict = Je v konfliktu s { $group } -> { $shortcut }
|
zen-key-conflict = Conflicts with { $group } -> { $shortcut }
|
||||||
pane-zen-theme-title = Nastavení motivu
|
pane-zen-theme-title = Nastavení motivu
|
||||||
zen-vertical-tabs-title = Boční panel a rozložení karet
|
zen-vertical-tabs-title = Boční panel a rozložení karet
|
||||||
zen-vertical-tabs-header = Vertikální karty
|
zen-vertical-tabs-header = Vertikální karty
|
||||||
@@ -311,4 +311,4 @@ zen-devtools-toggle-performance-shortcut = Přepnout výkon
|
|||||||
zen-devtools-toggle-storage-shortcut = Přepnout úložiště
|
zen-devtools-toggle-storage-shortcut = Přepnout úložiště
|
||||||
zen-devtools-toggle-dom-shortcut = Přepnout DOM
|
zen-devtools-toggle-dom-shortcut = Přepnout DOM
|
||||||
zen-devtools-toggle-accessibility-shortcut = Přepnout přístupnost
|
zen-devtools-toggle-accessibility-shortcut = Přepnout přístupnost
|
||||||
zen-close-all-unpinned-tabs-shortcut = Zavřít všechny nepřipnuté panely
|
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Resetovat připnuté karty
|
.label = Resetovat připnuté karty
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Přidat do Essentials
|
.label = Přidat do Essentials ({ $num } / { $max } zaplněných slotů)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } zaplněných slotů
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Odstranit z Essentials
|
.label = Odstranit z Essentials
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
@@ -29,7 +28,7 @@ pictureinpicture-minimize-btn =
|
|||||||
.tooltip = Minimalizovat
|
.tooltip = Minimalizovat
|
||||||
zen-panel-ui-gradient-generator-custom-color = Vlastní barva
|
zen-panel-ui-gradient-generator-custom-color = Vlastní barva
|
||||||
zen-panel-ui-gradient-generator-saved-message = Gradient byl úspěšně uložen!
|
zen-panel-ui-gradient-generator-saved-message = Gradient byl úspěšně uložen!
|
||||||
zen-copy-current-url-confirmation = URL adresa byla zkopírována!
|
zen-copy-current-url-confirmation = Copied current URL!
|
||||||
zen-general-cancel-label =
|
zen-general-cancel-label =
|
||||||
.label = Zrušit
|
.label = Zrušit
|
||||||
zen-general-confirm =
|
zen-general-confirm =
|
||||||
@@ -43,7 +42,7 @@ zen-library-sidebar-workspaces =
|
|||||||
zen-library-sidebar-mods =
|
zen-library-sidebar-mods =
|
||||||
.label = Módy
|
.label = Módy
|
||||||
zen-toggle-compact-mode-button =
|
zen-toggle-compact-mode-button =
|
||||||
.label = Kompaktní režim
|
.label = Compact Mode
|
||||||
.tooltiptext = Přepnout kompaktní režim
|
.tooltiptext = Přepnout kompaktní režim
|
||||||
|
|
||||||
# note: Do not translate the "<br/>" tags in the following string
|
# note: Do not translate the "<br/>" tags in the following string
|
||||||
@@ -60,13 +59,13 @@ urlbar-search-mode-zen_actions = Akce
|
|||||||
zen-site-data-settings = Nastavení
|
zen-site-data-settings = Nastavení
|
||||||
zen-generic-manage = Spravovat
|
zen-generic-manage = Spravovat
|
||||||
zen-generic-more = Více
|
zen-generic-more = Více
|
||||||
zen-generic-next = Další
|
zen-generic-next = Next
|
||||||
# These labels will be used for the site data panel settings
|
# These labels will be used for the site data panel settings
|
||||||
zen-site-data-setting-allow = Povoleno
|
zen-site-data-setting-allow = Povoleno
|
||||||
zen-site-data-setting-block = Blokováno
|
zen-site-data-setting-block = Blokováno
|
||||||
zen-site-data-protections-enabled = Zapnuto
|
zen-site-data-protections-enabled = Enabled
|
||||||
zen-site-data-protections-disabled = Vypnuto
|
zen-site-data-protections-disabled = Disabled
|
||||||
zen-site-data-setting-cross-site = Mezi stránkové cookies
|
zen-site-data-setting-cross-site = Cross-Site cookie
|
||||||
zen-site-data-security-info-extension =
|
zen-site-data-security-info-extension =
|
||||||
.label = Rozšíření
|
.label = Rozšíření
|
||||||
zen-site-data-security-info-secure =
|
zen-site-data-security-info-secure =
|
||||||
@@ -80,21 +79,21 @@ zen-site-data-get-addons =
|
|||||||
zen-site-data-site-settings =
|
zen-site-data-site-settings =
|
||||||
.label = Nastavení všech stránek
|
.label = Nastavení všech stránek
|
||||||
zen-site-data-header-share =
|
zen-site-data-header-share =
|
||||||
.tooltiptext = Sdílet tuto stránku
|
.tooltiptext = Share This Page
|
||||||
zen-site-data-header-reader-mode =
|
zen-site-data-header-reader-mode =
|
||||||
.tooltiptext = Zapnout čtecí režim
|
.tooltiptext = Enter Reader Mode
|
||||||
zen-site-data-header-screenshot =
|
zen-site-data-header-screenshot =
|
||||||
.tooltiptext = Pořídit snímek obrazovky
|
.tooltiptext = Take a Screenshot
|
||||||
zen-site-data-header-bookmark =
|
zen-site-data-header-bookmark =
|
||||||
.tooltiptext = Přidat tuto stránku do záložek
|
.tooltiptext = Bookmark This Page
|
||||||
zen-urlbar-copy-url-button =
|
zen-urlbar-copy-url-button =
|
||||||
.tooltiptext = Kopírovat URL
|
.tooltiptext = Copy URL
|
||||||
zen-site-data-setting-site-protection = Ochrana proti sledování
|
zen-site-data-setting-site-protection = Tracking Protection
|
||||||
|
|
||||||
# Section: Feature callouts
|
# Section: Feature callouts
|
||||||
|
|
||||||
zen-site-data-panel-feature-callout-title = Nový domov pro doplňky, oprávnění a další
|
zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
|
||||||
zen-site-data-panel-feature-callout-subtitle = Klikněte na ikonu pro správu nastavení webu, zobrazení bezpečnostních informací, přístup k rozšíření a provádění běžných akcí.
|
zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
|
||||||
zen-open-link-in-glance =
|
zen-open-link-in-glance =
|
||||||
.label = Otevřít odkaz v Glance
|
.label = Open Link in Glance
|
||||||
.accesskey = G
|
.accesskey = G
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ zen-workspaces-delete-workspace-title = Odstranit prostor?
|
|||||||
zen-workspaces-delete-workspace-body = Opravdu chcete smazat { $name }? Tuto akci nelze vrátit zpět.
|
zen-workspaces-delete-workspace-body = Opravdu chcete smazat { $name }? Tuto akci nelze vrátit zpět.
|
||||||
# Note that the html tag MUST not be changed or removed, as it is used to better
|
# Note that the html tag MUST not be changed or removed, as it is used to better
|
||||||
# display the shortcut in the toast notification.
|
# display the shortcut in the toast notification.
|
||||||
zen-workspaces-close-all-unpinned-tabs-toast = Karty byly zavřeny! Použijte <span>{ $shortcut }</span> pro zrušení.
|
zen-workspaces-close-all-unpinned-tabs-toast = Tabs Closed! Use <span>{ $shortcut }</span> to undo.
|
||||||
zen-workspaces-close-all-unpinned-tabs-title =
|
zen-workspaces-close-all-unpinned-tabs-title =
|
||||||
.label = Vyčistit
|
.label = Clear
|
||||||
.tooltiptext = Zavřít všechny nepřipnuté panely
|
.tooltiptext = Close all unpinned tabs
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Ailosod Tab wedi'i Binio
|
.label = Ailosod Tab wedi'i Binio
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Add to Essentials ({ $num } / { $max } slots filled)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Diddymu o Hanfodion
|
.label = Diddymu o Hanfodion
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Nulstil fastgjort fane
|
.label = Nulstil fastgjort fane
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Føj til Essentielle ({ $num } / { $max } pladser fyldt)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Fjern fra Essentielle
|
.label = Fjern fra Essentielle
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
# 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/.
|
||||||
|
|
||||||
pane-zen-looks-title = Aussehen
|
pane-zen-looks-title = Erscheinungsbild
|
||||||
category-zen-looks =
|
category-zen-looks =
|
||||||
.tooltiptext = { pane-zen-looks-title }
|
.tooltiptext = { pane-zen-looks-title }
|
||||||
zen-warning-language = Das Ändern der Standardsprache könnte es Websites einfacher machen, Sie zu verfolgen.
|
zen-warning-language = Das Ändern der Standardsprache könnte es Websites einfacher machen, Sie zu verfolgen.
|
||||||
@@ -47,10 +47,10 @@ zen-tabs-unloader-enabled =
|
|||||||
zen-tabs-close-on-back-with-no-history =
|
zen-tabs-close-on-back-with-no-history =
|
||||||
.label = Tab schließen und zum Besitzer-Tab (oder den zuletzt benutzten Tab) wechseln, wenn kein Tab-Verlauf vorhanden ist
|
.label = Tab schließen und zum Besitzer-Tab (oder den zuletzt benutzten Tab) wechseln, wenn kein Tab-Verlauf vorhanden ist
|
||||||
zen-tabs-cycle-by-attribute =
|
zen-tabs-cycle-by-attribute =
|
||||||
.label = Strg+Tab wechselt nur zwischen Essential- oder Arbeitsbereich-Tabs
|
.label = Ctrl+Tab cycles within Essential or Workspace tabs only
|
||||||
zen-tabs-cycle-ignore-pending-tabs =
|
zen-tabs-cycle-ignore-pending-tabs =
|
||||||
.label = Ausstehende Tabs beim Wechseln mit Strg+Tab ignorieren
|
.label = Ignore Pending tabs when cycling with Ctrl+Tab
|
||||||
zen-tabs-cycle-by-attribute-warning = Strg+Tab wechselt in der zuletzt verwendeten Reihenfolge, da diese Option aktiviert ist
|
zen-tabs-cycle-by-attribute-warning = Ctrl+Tab will cycle by recently used order, as it is enabled
|
||||||
zen-look-and-feel-compact-toolbar-themed =
|
zen-look-and-feel-compact-toolbar-themed =
|
||||||
.label = Theme Hintergrund für kompakte Symbolleiste verwenden
|
.label = Theme Hintergrund für kompakte Symbolleiste verwenden
|
||||||
zen-workspace-continue-where-left-off =
|
zen-workspace-continue-where-left-off =
|
||||||
@@ -77,38 +77,38 @@ zen-pinned-tab-manager-close-close-shortcut-option =
|
|||||||
.label = Tab schließen
|
.label = Tab schließen
|
||||||
pane-zen-workspaces-header = Arbeitsbereiche
|
pane-zen-workspaces-header = Arbeitsbereiche
|
||||||
zen-settings-workspaces-header = Allgemeine Einstellungen für Arbeitsbereiche
|
zen-settings-workspaces-header = Allgemeine Einstellungen für Arbeitsbereiche
|
||||||
zen-settings-workspaces-description = Mit Arbeitsbereichen kannst du mehrere Browser-Sitzungen gleichzeitig haben
|
zen-settings-workspaces-description = Mit Arbeitsbereichen können Sie mehrere Browser-Sitzungen gleichzeitig haben!
|
||||||
zen-settings-workspaces-enabled =
|
zen-settings-workspaces-enabled =
|
||||||
.label = Arbeitsbereiche aktivieren (Experimentell)
|
.label = Arbeitsbereiche aktivieren
|
||||||
zen-settings-workspaces-hide-default-container-indicator =
|
zen-settings-workspaces-hide-default-container-indicator =
|
||||||
.label = Container-Indikator in der Tab-Leiste ausblenden
|
.label = Standard-Container-Anzeige in der Tab-Leiste ausblenden
|
||||||
zen-key-unsaved = Nicht gespeichertes Tastenkürzel! Bitte speichern Sie es, indem Sie nach der Neueingabe die "Escape"-Taste drücken.
|
zen-key-unsaved = Nicht gespeichertes Tastenkürzel! Bitte speichern Sie es, indem Sie nach der Neueingabe die "Escape"-Taste drücken.
|
||||||
zen-key-conflict = Konflikt mit { $group } -> { $shortcut }
|
zen-key-conflict = Konflikt mit { $group } -> { $shortcut }
|
||||||
pane-zen-theme-title = Design-Einstellungen
|
pane-zen-theme-title = Design-Einstellungen
|
||||||
zen-vertical-tabs-title = Seitenleiste und Tab-Layout
|
zen-vertical-tabs-title = Seitenleiste und Tab-Layout
|
||||||
zen-vertical-tabs-header = Vertikale Tabs
|
zen-vertical-tabs-header = Vertikale Tabs
|
||||||
zen-vertical-tabs-description = Verwalte die Ausrichtung der Tabs und andere Layout-Einstellungen
|
zen-vertical-tabs-description = Verwalten Sie Ihre Tabs in einem vertikalen Layout
|
||||||
zen-vertical-tabs-show-expand-button =
|
zen-vertical-tabs-show-expand-button =
|
||||||
.label = Erweitern-Schaltfläche anzeigen
|
.label = Erweitern-Schaltfläche anzeigen
|
||||||
zen-vertical-tabs-newtab-on-tab-list =
|
zen-vertical-tabs-newtab-on-tab-list =
|
||||||
.label = "Neuen Tab"-Button in der Tab-Liste anzeigen
|
.label = Schaltfläche "Neuer Tab" in der Tab-Liste anzeigen
|
||||||
zen-vertical-tabs-newtab-top-button-up =
|
zen-vertical-tabs-newtab-top-button-up =
|
||||||
.label = Schaltfläche "Neuer Tab" nach oben verschieben
|
.label = Schaltfläche "Neuer Tab" nach oben verschieben
|
||||||
zen-vertical-tabs-expand-tabs-by-default = Tabs standardmäßig erweitern
|
zen-vertical-tabs-expand-tabs-by-default = Tabs standardmäßig erweitern
|
||||||
zen-vertical-tabs-dont-expand-tabs-by-default = Tabs standardmäßig nicht erweitern
|
zen-vertical-tabs-dont-expand-tabs-by-default = Tabs standardmäßig nicht erweitern
|
||||||
zen-vertical-tabs-expand-tabs-on-hover = Tabs bei Hover erweitern (funktioniert nicht im Kompaktmodus)
|
zen-vertical-tabs-expand-tabs-on-hover = Tabs beim Drüberfahren erweitern (funktioniert nicht im Kompaktmodus)
|
||||||
zen-vertical-tabs-expand-tabs-header = Wie Tabs erweitert werden sollen
|
zen-vertical-tabs-expand-tabs-header = Wie Tabs erweitert werden sollen
|
||||||
zen-vertical-tabs-expand-tabs-description = Wähle aus, wie Tabs in der Seitenleiste erweitert werden sollen
|
zen-vertical-tabs-expand-tabs-description = Wählen Sie, wie Tabs in der Seitenleiste erweitert werden sollen
|
||||||
zen-theme-marketplace-header = Zen Mods
|
zen-theme-marketplace-header = Zen Mods
|
||||||
zen-theme-disable-all-enabled =
|
zen-theme-disable-all-enabled =
|
||||||
.title = Alle Mods deaktivieren
|
.title = Alle Mods deaktivieren
|
||||||
zen-theme-disable-all-disabled =
|
zen-theme-disable-all-disabled =
|
||||||
.title = Alle Mods aktivieren
|
.title = Alle Mods aktivieren
|
||||||
zen-theme-marketplace-description = Finde und installiere Designs aus dem Store.
|
zen-theme-marketplace-description = Finden und installieren Sie Mods aus dem Store.
|
||||||
zen-theme-marketplace-remove-button =
|
zen-theme-marketplace-remove-button =
|
||||||
.label = Design entfernen
|
.label = Mod entfernen
|
||||||
zen-theme-marketplace-check-for-updates-button =
|
zen-theme-marketplace-check-for-updates-button =
|
||||||
.label = Nach Updates suchen
|
.label = Auf Updates prüfen
|
||||||
zen-theme-marketplace-import-button =
|
zen-theme-marketplace-import-button =
|
||||||
.label = Mods importieren
|
.label = Mods importieren
|
||||||
zen-theme-marketplace-export-button =
|
zen-theme-marketplace-export-button =
|
||||||
@@ -117,20 +117,20 @@ zen-theme-marketplace-import-success = Mods erfolgreich importiert
|
|||||||
zen-theme-marketplace-import-failure = Beim Importieren der Mods ist ein Fehler aufgetreten
|
zen-theme-marketplace-import-failure = Beim Importieren der Mods ist ein Fehler aufgetreten
|
||||||
zen-theme-marketplace-export-success = Mods erfolgreich exportiert
|
zen-theme-marketplace-export-success = Mods erfolgreich exportiert
|
||||||
zen-theme-marketplace-export-failure = Beim Exportieren der Mods ist ein Fehler aufgetreten
|
zen-theme-marketplace-export-failure = Beim Exportieren der Mods ist ein Fehler aufgetreten
|
||||||
zen-theme-marketplace-updates-success = Design erfolgreich aktualisiert
|
zen-theme-marketplace-updates-success = Mods wurden erfolgreich aktualisiert
|
||||||
zen-theme-marketplace-updates-failure = Es konnten keine Updates gefunden werden!
|
zen-theme-marketplace-updates-failure = Es konnten keine Updates gefunden werden!
|
||||||
zen-theme-marketplace-toggle-enabled-button =
|
zen-theme-marketplace-toggle-enabled-button =
|
||||||
.title = Design deaktivieren
|
.title = Mod deaktivieren
|
||||||
zen-theme-marketplace-toggle-disabled-button =
|
zen-theme-marketplace-toggle-disabled-button =
|
||||||
.title = Design aktivieren
|
.title = Mod aktivieren
|
||||||
zen-theme-marketplace-remove-confirmation = Möchtest du dieses Mod wirklich entfernen?
|
zen-theme-marketplace-remove-confirmation = Sind Sie sicher, dass Sie diesen Mod entfernen möchten?
|
||||||
zen-theme-marketplace-close-modal = Schließen
|
zen-theme-marketplace-close-modal = Schließen
|
||||||
zen-theme-marketplace-theme-header-title =
|
zen-theme-marketplace-theme-header-title =
|
||||||
.title = CSS-Selektor: { $name }
|
.title = CSS-Selektor: { $name }
|
||||||
zen-theme-marketplace-dropdown-default-label =
|
zen-theme-marketplace-dropdown-default-label =
|
||||||
.label = Keine
|
.label = Keine
|
||||||
zen-theme-marketplace-input-default-placeholder =
|
zen-theme-marketplace-input-default-placeholder =
|
||||||
.placeholder = Gib etwas ein...
|
.placeholder = Etwas eingeben...
|
||||||
pane-zen-marketplace-title = Zen Mods
|
pane-zen-marketplace-title = Zen Mods
|
||||||
zen-themes-auto-update =
|
zen-themes-auto-update =
|
||||||
.label = Installierte Mods beim Start automatisch aktualisieren
|
.label = Installierte Mods beim Start automatisch aktualisieren
|
||||||
@@ -160,24 +160,24 @@ category-zen-CKS =
|
|||||||
.tooltiptext = { pane-zen-CKS-title }
|
.tooltiptext = { pane-zen-CKS-title }
|
||||||
pane-settings-CKS-title = { -brand-short-name } Tastenkürzel
|
pane-settings-CKS-title = { -brand-short-name } Tastenkürzel
|
||||||
zen-settings-CKS-header = Passen Sie Ihre Tastenkürzel an
|
zen-settings-CKS-header = Passen Sie Ihre Tastenkürzel an
|
||||||
zen-settings-CKS-description = Ändere die Standard-Tastenkürzel nach deinen Wünschen und verbessere dein Browser-Erlebnis
|
zen-settings-CKS-description = Ändern Sie die Standard-Tastenkürzel nach Ihren Wünschen und verbessern Sie Ihr Browser-Erlebnis
|
||||||
zen-settings-CKS-disable-firefox =
|
zen-settings-CKS-disable-firefox =
|
||||||
.label = { -brand-short-name } Standard-Tastenkürzel deaktivieren
|
.label = { -brand-short-name } Standard-Tastenkürzel deaktivieren
|
||||||
zen-settings-CKS-duplicate-shortcut =
|
zen-settings-CKS-duplicate-shortcut =
|
||||||
.label = Doppeltes Tastenkürzel
|
.label = Tastenkürzel duplizieren
|
||||||
zen-settings-CKS-reset-shortcuts =
|
zen-settings-CKS-reset-shortcuts =
|
||||||
.label = Auf Standard zurücksetzen
|
.label = Auf Standard zurücksetzen
|
||||||
zenCKSOption-group-other = Sonstiges
|
zenCKSOption-group-other = Sonstige
|
||||||
zenCKSOption-group-windowAndTabManagement = Fenster- und Tab-Verwaltung
|
zenCKSOption-group-windowAndTabManagement = Fenster- & Tab-Verwaltung
|
||||||
zenCKSOption-group-navigation = Navigation
|
zenCKSOption-group-navigation = Navigation
|
||||||
zenCKSOption-group-searchAndFind = Suchen und Finden
|
zenCKSOption-group-searchAndFind = Suchen & Finden
|
||||||
zenCKSOption-group-pageOperations = Seitenoperationen
|
zenCKSOption-group-pageOperations = Seitenoperationen
|
||||||
zenCKSOption-group-historyAndBookmarks = Verlauf & Lesezeichen
|
zenCKSOption-group-historyAndBookmarks = Verlauf & Lesezeichen
|
||||||
zenCKSOption-group-mediaAndDisplay = Medien & Anzeige
|
zenCKSOption-group-mediaAndDisplay = Medien & Anzeige
|
||||||
zenCKSOption-group-zen-compact-mode = Kompaktmodus
|
zenCKSOption-group-zen-compact-mode = Kompaktmodus
|
||||||
zenCKSOption-group-zen-workspace = Zen Arbeitsbereiche
|
zenCKSOption-group-zen-workspace = Arbeitsbereiche
|
||||||
zenCKSOption-group-zen-other = Andere Zen-Funktionen
|
zenCKSOption-group-zen-other = Andere Zen-Funktionen
|
||||||
zenCKSOption-group-zen-split-view = Zen Geteilte Ansicht
|
zenCKSOption-group-zen-split-view = Geteilte Ansicht
|
||||||
zenCKSOption-group-devTools = Entwicklertools
|
zenCKSOption-group-devTools = Entwicklertools
|
||||||
zen-key-quick-restart = Schneller Neustart
|
zen-key-quick-restart = Schneller Neustart
|
||||||
zen-window-new-shortcut = Neues Fenster
|
zen-window-new-shortcut = Neues Fenster
|
||||||
@@ -186,7 +186,7 @@ zen-key-redo = Wiederholen
|
|||||||
zen-restore-last-closed-tab-shortcut = Letzten geschlossenen Tab wiederherstellen
|
zen-restore-last-closed-tab-shortcut = Letzten geschlossenen Tab wiederherstellen
|
||||||
zen-location-open-shortcut = Adresse öffnen
|
zen-location-open-shortcut = Adresse öffnen
|
||||||
zen-location-open-shortcut-alt = Adresse öffnen (Alt)
|
zen-location-open-shortcut-alt = Adresse öffnen (Alt)
|
||||||
zen-key-undo-close-window = Geschlossenes Fenster wiederherstellen
|
zen-key-undo-close-window = Fenster schließen rückgängig machen
|
||||||
zen-text-action-undo-shortcut = Rückgängig
|
zen-text-action-undo-shortcut = Rückgängig
|
||||||
zen-text-action-redo-shortcut = Wiederholen
|
zen-text-action-redo-shortcut = Wiederholen
|
||||||
zen-text-action-cut-shortcut = Ausschneiden
|
zen-text-action-cut-shortcut = Ausschneiden
|
||||||
@@ -196,15 +196,15 @@ zen-text-action-copy-url-markdown-shortcut = Aktuelle URL als Markdown kopieren
|
|||||||
zen-text-action-paste-shortcut = Einfügen
|
zen-text-action-paste-shortcut = Einfügen
|
||||||
zen-text-action-select-all-shortcut = Alles auswählen
|
zen-text-action-select-all-shortcut = Alles auswählen
|
||||||
zen-text-action-delete-shortcut = Löschen
|
zen-text-action-delete-shortcut = Löschen
|
||||||
zen-history-show-all-shortcut-mac = Verlauf anzeigen (Mac)
|
zen-history-show-all-shortcut-mac = Gesamten Verlauf anzeigen (Mac)
|
||||||
zen-full-screen-shortcut = Vollbild umschalten
|
zen-full-screen-shortcut = Vollbild umschalten
|
||||||
zen-reader-mode-toggle-shortcut-windows = Lesemodus umschalten (Windows)
|
zen-reader-mode-toggle-shortcut-windows = Lesemodus umschalten (Windows)
|
||||||
zen-picture-in-picture-toggle-shortcut-alt = Bild-im-Bild umschalten (Alt)
|
zen-picture-in-picture-toggle-shortcut-alt = Bild-in-Bild umschalten (Alt)
|
||||||
zen-picture-in-picture-toggle-shortcut-mac = Bild-im-Bild umschalten (Mac)
|
zen-picture-in-picture-toggle-shortcut-mac = Bild-in-Bild umschalten (Mac)
|
||||||
zen-picture-in-picture-toggle-shortcut-mac-alt = Bild-im-Bild umschalten (Mac Alternative)
|
zen-picture-in-picture-toggle-shortcut-mac-alt = Bild-in-Bild umschalten (Mac Alt)
|
||||||
zen-page-source-shortcut-safari = Seitenquelltext (Safari)
|
zen-page-source-shortcut-safari = Seitenquelltext anzeigen (Safari)
|
||||||
zen-nav-stop-shortcut = Navigation stoppen
|
zen-nav-stop-shortcut = Laden stoppen
|
||||||
zen-history-sidebar-shortcut = Verlaufs-Seitenleiste
|
zen-history-sidebar-shortcut = Verlauf-Seitenleiste anzeigen
|
||||||
zen-window-minimize-shortcut = Fenster minimieren
|
zen-window-minimize-shortcut = Fenster minimieren
|
||||||
zen-help-shortcut = Hilfe öffnen
|
zen-help-shortcut = Hilfe öffnen
|
||||||
zen-preferences-shortcut = Einstellungen öffnen
|
zen-preferences-shortcut = Einstellungen öffnen
|
||||||
@@ -218,11 +218,11 @@ zen-file-open-shortcut = Datei öffnen
|
|||||||
zen-save-page-shortcut = Seite speichern
|
zen-save-page-shortcut = Seite speichern
|
||||||
zen-print-shortcut = Seite drucken
|
zen-print-shortcut = Seite drucken
|
||||||
zen-close-shortcut-2 = Tab schließen
|
zen-close-shortcut-2 = Tab schließen
|
||||||
zen-mute-toggle-shortcut = Stumm schalten umschalten
|
zen-mute-toggle-shortcut = Stummschaltung umschalten
|
||||||
zen-key-delete = Löschen-Taste
|
zen-key-delete = Entfernen-Taste
|
||||||
zen-key-go-back = Zurück gehen
|
zen-key-go-back = Zurück gehen
|
||||||
zen-key-go-forward = Vorwärts gehen
|
zen-key-go-forward = Vorwärts gehen
|
||||||
zen-nav-back-shortcut-alt = Zurück navigieren (Alt)
|
zen-nav-back-shortcut-alt = Rückwärts navigieren (Alt)
|
||||||
zen-nav-fwd-shortcut-alt = Vorwärts navigieren (Alt)
|
zen-nav-fwd-shortcut-alt = Vorwärts navigieren (Alt)
|
||||||
zen-history-show-all-shortcut = Gesamten Verlauf anzeigen
|
zen-history-show-all-shortcut = Gesamten Verlauf anzeigen
|
||||||
zen-key-enter-full-screen = Vollbild aktivieren
|
zen-key-enter-full-screen = Vollbild aktivieren
|
||||||
@@ -232,15 +232,15 @@ zen-key-inspector-mac = Inspektor umschalten (Mac)
|
|||||||
zen-toggle-sidebar-shortcut = Firefox-Seitenleiste umschalten
|
zen-toggle-sidebar-shortcut = Firefox-Seitenleiste umschalten
|
||||||
zen-toggle-pin-tab-shortcut = Angepinnter Tab umschalten
|
zen-toggle-pin-tab-shortcut = Angepinnter Tab umschalten
|
||||||
zen-reader-mode-toggle-shortcut-other = Lesemodus umschalten
|
zen-reader-mode-toggle-shortcut-other = Lesemodus umschalten
|
||||||
zen-picture-in-picture-toggle-shortcut = Bild-im-Bild umschalten
|
zen-picture-in-picture-toggle-shortcut = Bild-in-Bild umschalten
|
||||||
zen-nav-reload-shortcut-2 = Seite neu laden
|
zen-nav-reload-shortcut-2 = Seite neu laden
|
||||||
zen-key-about-processes = Über Prozesse
|
zen-key-about-processes = Über Prozesse
|
||||||
zen-page-source-shortcut = Seitenquelltext anzeigen
|
zen-page-source-shortcut = Seitenquelltext anzeigen
|
||||||
zen-page-info-shortcut = Seiteninformationen anzeigen
|
zen-page-info-shortcut = Seiteninformationen anzeigen
|
||||||
zen-find-shortcut = Auf Seite suchen
|
zen-find-shortcut = Auf Seite suchen
|
||||||
zen-search-find-again-shortcut = Weitersuchen
|
zen-search-find-again-shortcut = Erneut suchen
|
||||||
zen-search-find-again-shortcut-prev = Vorheriges suchen
|
zen-search-find-again-shortcut-prev = Vorheriges suchen
|
||||||
zen-search-find-again-shortcut-2 = Weitersuchen (Alt)
|
zen-search-find-again-shortcut-2 = Erneut suchen (Alt)
|
||||||
zen-bookmark-this-page-shortcut = Diese Seite zu Lesezeichen hinzufügen
|
zen-bookmark-this-page-shortcut = Diese Seite zu Lesezeichen hinzufügen
|
||||||
zen-bookmark-show-library-shortcut = Lesezeichen-Bibliothek anzeigen
|
zen-bookmark-show-library-shortcut = Lesezeichen-Bibliothek anzeigen
|
||||||
zen-key-stop = Laden stoppen
|
zen-key-stop = Laden stoppen
|
||||||
@@ -250,13 +250,13 @@ zen-full-zoom-reset-shortcut = Zoom zurücksetzen
|
|||||||
zen-full-zoom-reset-shortcut-alt = Zoom zurücksetzen (Alt)
|
zen-full-zoom-reset-shortcut-alt = Zoom zurücksetzen (Alt)
|
||||||
zen-full-zoom-enlarge-shortcut-alt = Hineinzoomen (Alt)
|
zen-full-zoom-enlarge-shortcut-alt = Hineinzoomen (Alt)
|
||||||
zen-full-zoom-enlarge-shortcut-alt2 = Hineinzoomen (Alt 2)
|
zen-full-zoom-enlarge-shortcut-alt2 = Hineinzoomen (Alt 2)
|
||||||
zen-bidi-switch-direction-shortcut = Text-Richtung wechseln
|
zen-bidi-switch-direction-shortcut = Textrichtung wechseln
|
||||||
zen-private-browsing-shortcut = Privaten Modus öffnen
|
zen-private-browsing-shortcut = Privates Surfen
|
||||||
zen-screenshot-shortcut = Screenshot machen
|
zen-screenshot-shortcut = Screenshot erstellen
|
||||||
zen-key-sanitize = Browser-Daten löschen
|
zen-key-sanitize = Browserdaten löschen
|
||||||
zen-quit-app-shortcut = Anwendung beenden
|
zen-quit-app-shortcut = Anwendung beenden
|
||||||
zen-key-wr-capture-cmd = WR-Aufnahme-Befehl
|
zen-key-wr-capture-cmd = WR Aufnahmebefehl
|
||||||
zen-key-wr-toggle-capture-sequence-cmd = WR-Aufnahmesequenz umschalten
|
zen-key-wr-toggle-capture-sequence-cmd = WR Aufnahmesequenz umschalten
|
||||||
zen-nav-reload-shortcut = Seite neu laden
|
zen-nav-reload-shortcut = Seite neu laden
|
||||||
zen-nav-reload-shortcut-skip-cache = Seite neu laden (Cache überspringen)
|
zen-nav-reload-shortcut-skip-cache = Seite neu laden (Cache überspringen)
|
||||||
zen-close-shortcut = Fenster schließen
|
zen-close-shortcut = Fenster schließen
|
||||||
@@ -275,13 +275,13 @@ zen-workspace-shortcut-switch-7 = Zu Arbeitsbereich 7 wechseln
|
|||||||
zen-workspace-shortcut-switch-8 = Zu Arbeitsbereich 8 wechseln
|
zen-workspace-shortcut-switch-8 = Zu Arbeitsbereich 8 wechseln
|
||||||
zen-workspace-shortcut-switch-9 = Zu Arbeitsbereich 9 wechseln
|
zen-workspace-shortcut-switch-9 = Zu Arbeitsbereich 9 wechseln
|
||||||
zen-workspace-shortcut-switch-10 = Zu Arbeitsbereich 10 wechseln
|
zen-workspace-shortcut-switch-10 = Zu Arbeitsbereich 10 wechseln
|
||||||
zen-workspace-shortcut-forward = Zum nächsten Arbeitsbereich wechseln
|
zen-workspace-shortcut-forward = Nächster Arbeitsbereich
|
||||||
zen-workspace-shortcut-backward = Zum vorherigen Arbeitsbereich wechseln
|
zen-workspace-shortcut-backward = Vorheriger Arbeitsbereich
|
||||||
zen-sidebar-shortcut-toggle = Seitenleisten-Breite umschalten
|
zen-sidebar-shortcut-toggle = Seitenleisten-Breite umschalten
|
||||||
zen-pinned-tab-shortcut-reset = Angehefteten Tab zurücksetzen
|
zen-pinned-tab-shortcut-reset = Angepinnten Tab auf angepinnte URL zurücksetzen
|
||||||
zen-split-view-shortcut-grid = Raster-Layout für geteilte Ansicht umschalten
|
zen-split-view-shortcut-grid = Geteilte Ansicht Raster umschalten
|
||||||
zen-split-view-shortcut-vertical = Vertikales Layout für geteilte Ansicht umschalten
|
zen-split-view-shortcut-vertical = Geteilte Ansicht vertikal umschalten
|
||||||
zen-split-view-shortcut-horizontal = Horizontales Layout für geteilte Ansicht umschalten
|
zen-split-view-shortcut-horizontal = Geteilte Ansicht horizontal umschalten
|
||||||
zen-split-view-shortcut-unsplit = Geteilte Ansicht schließen
|
zen-split-view-shortcut-unsplit = Geteilte Ansicht schließen
|
||||||
zen-new-empty-split-view-shortcut = Neuer leerer Split View
|
zen-new-empty-split-view-shortcut = Neuer leerer Split View
|
||||||
zen-key-select-tab-1 = Tab #1 auswählen
|
zen-key-select-tab-1 = Tab #1 auswählen
|
||||||
|
|||||||
@@ -22,4 +22,4 @@ zen-folders-unload-all-tooltip =
|
|||||||
.tooltiptext = Aktive Tabs in diesem Ordner entladen
|
.tooltiptext = Aktive Tabs in diesem Ordner entladen
|
||||||
zen-folders-unload-folder =
|
zen-folders-unload-folder =
|
||||||
.label = Alle Tabs entladen
|
.label = Alle Tabs entladen
|
||||||
zen-folders-search-no-results = Keine passenden Tabs gefunden
|
zen-folders-search-no-results = Keine passenden Tabs gefunden 🤔
|
||||||
|
|||||||
@@ -5,24 +5,23 @@
|
|||||||
zen-panel-ui-current-profile-text = Aktuelles Profil
|
zen-panel-ui-current-profile-text = Aktuelles Profil
|
||||||
unified-extensions-description = Erweiterungen werden verwendet, um { -brand-short-name } zusätzliche Funktionen hinzuzufügen.
|
unified-extensions-description = Erweiterungen werden verwendet, um { -brand-short-name } zusätzliche Funktionen hinzuzufügen.
|
||||||
tab-context-zen-reset-pinned-tab =
|
tab-context-zen-reset-pinned-tab =
|
||||||
.label = Angehefteten Tab zurücksetzen
|
.label = Angepinnten Tab zurücksetzen
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Zu Essentials hinzufügen ({ $num } / { $max } Plätze belegt)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Aus Essentials entfernen
|
.label = Aus Essentials entfernen
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-replace-pinned-url-with-current =
|
tab-context-zen-replace-pinned-url-with-current =
|
||||||
.label = Angeheftete URL durch aktuelle ersetzen
|
.label = Angepinnte URL durch aktuelle ersetzen
|
||||||
.accesskey = C
|
.accesskey = C
|
||||||
zen-themes-corrupted = Deine { -brand-short-name } Mods-Datei ist beschädigt. Sie wurde auf das Standard-Design zurückgesetzt.
|
zen-themes-corrupted = Ihre { -brand-short-name } Mods-Datei ist beschädigt. Sie wurde auf das Standard-Design zurückgesetzt.
|
||||||
zen-shortcuts-corrupted = Deine { -brand-short-name } Tastenkürzel-Datei ist beschädigt. Sie wurde auf die Standard-Tastenkürzel zurückgesetzt.
|
zen-shortcuts-corrupted = Ihre { -brand-short-name } Tastenkürzel-Datei ist beschädigt. Sie wurde auf die Standard-Tastenkürzel zurückgesetzt.
|
||||||
# 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 =
|
zen-new-urlbar-notification =
|
||||||
Die neue Adressleiste wurde aktiviert und macht neue Tab-Seiten überflüssig.<br/><br/>
|
Die neue Adressleiste wurde aktiviert und macht neue Tab-Seiten überflüssig.<br/><br/>
|
||||||
Öffne einen neuen Tab, um die neue Adressleiste in Aktion zu sehen!
|
Öffnen Sie einen neuen Tab, um die neue Adressleiste in Aktion zu sehen!
|
||||||
zen-disable = Deaktivieren
|
zen-disable = Deaktivieren
|
||||||
pictureinpicture-minimize-btn =
|
pictureinpicture-minimize-btn =
|
||||||
.aria-label = Minimieren
|
.aria-label = Minimieren
|
||||||
@@ -34,7 +33,7 @@ zen-general-cancel-label =
|
|||||||
.label = Abbrechen
|
.label = Abbrechen
|
||||||
zen-general-confirm =
|
zen-general-confirm =
|
||||||
.label = Bestätigen
|
.label = Bestätigen
|
||||||
zen-pinned-tab-replaced = Die URL des angehefteten Tabs wurde durch die aktuelle URL ersetzt!
|
zen-pinned-tab-replaced = Die URL des angepinnten Tabs wurde durch die aktuelle URL ersetzt!
|
||||||
zen-tabs-renamed = Tab wurde erfolgreich umbenannt!
|
zen-tabs-renamed = Tab wurde erfolgreich umbenannt!
|
||||||
zen-background-tab-opened-toast = Neuer Hintergrund-Tab geöffnet!
|
zen-background-tab-opened-toast = Neuer Hintergrund-Tab geöffnet!
|
||||||
zen-workspace-renamed-toast = Arbeitsbereich wurde erfolgreich umbenannt!
|
zen-workspace-renamed-toast = Arbeitsbereich wurde erfolgreich umbenannt!
|
||||||
@@ -44,7 +43,7 @@ zen-library-sidebar-mods =
|
|||||||
.label = Mods
|
.label = Mods
|
||||||
zen-toggle-compact-mode-button =
|
zen-toggle-compact-mode-button =
|
||||||
.label = Kompakter Modus
|
.label = Kompakter Modus
|
||||||
.tooltiptext = Kompakten Modus umschalten
|
.tooltiptext = Compact Mode umschalten
|
||||||
|
|
||||||
# note: Do not translate the "<br/>" tags in the following string
|
# note: Do not translate the "<br/>" tags in the following string
|
||||||
|
|
||||||
@@ -93,8 +92,8 @@ zen-site-data-setting-site-protection = Tracking-Schutz
|
|||||||
|
|
||||||
# Section: Feature callouts
|
# Section: Feature callouts
|
||||||
|
|
||||||
zen-site-data-panel-feature-callout-title = Ein neuer Ort für Add-ons, Berechtigungen und mehr
|
zen-site-data-panel-feature-callout-title = Eine neue Heimat für Add-ons, Berechtigungen und mehr
|
||||||
zen-site-data-panel-feature-callout-subtitle = Klicke auf das Symbol, um Website-Einstellungen zu verwalten, Sicherheitsinformationen anzuzeigen, auf Erweiterungen zuzugreifen und häufige Aktionen auszuführen.
|
zen-site-data-panel-feature-callout-subtitle = Klicken Sie auf das Symbol, um Website-Einstellungen zu verwalten, Sicherheitsinformationen anzuzeigen, auf Erweiterungen zuzugreifen und häufige Aktionen auszuführen.
|
||||||
zen-open-link-in-glance =
|
zen-open-link-in-glance =
|
||||||
.label = Link in Glance öffnen
|
.label = Open Link in Glance
|
||||||
.accesskey = G
|
.accesskey = G
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ tabbrowser-unload-tab-button =
|
|||||||
tabbrowser-reset-pin-button =
|
tabbrowser-reset-pin-button =
|
||||||
.tooltiptext =
|
.tooltiptext =
|
||||||
{ $tabCount ->
|
{ $tabCount ->
|
||||||
[one] Tab zurücksetzen und anheften
|
[one] Tab zurücksetzen und anpinnen
|
||||||
*[other] { $tabCount } Tabs zurücksetzen und anheften
|
*[other] { $tabCount } Tabs zurücksetzen und anpinnen
|
||||||
}
|
}
|
||||||
tab-reset-pin-label = Zurück zur angehefteten URL
|
tab-reset-pin-label = Zurück zur angepinnten URL
|
||||||
|
|||||||
@@ -6,21 +6,21 @@ zen-welcome-title-line1 = Willkommen zu
|
|||||||
zen-welcome-title-line2 = einem ruhigeren Internet
|
zen-welcome-title-line2 = einem ruhigeren Internet
|
||||||
zen-welcome-import-title = Ein neuer Anfang, dieselben Lesezeichen
|
zen-welcome-import-title = Ein neuer Anfang, dieselben Lesezeichen
|
||||||
zen-welcome-import-description-1 = Ihre Lesezeichen, Ihr Verlauf und Ihre Passwörter sind wie eine Spur durch das Internet – lassen Sie sie nicht zurück!
|
zen-welcome-import-description-1 = Ihre Lesezeichen, Ihr Verlauf und Ihre Passwörter sind wie eine Spur durch das Internet – lassen Sie sie nicht zurück!
|
||||||
zen-welcome-import-description-2 = Übertrage sie ganz einfach aus einem anderen Browser und mache genau dort weiter, wo du aufgehört hast.
|
zen-welcome-import-description-2 = Übertragen Sie sie ganz einfach aus einem anderen Browser und machen Sie genau dort weiter, wo Sie aufgehört haben.
|
||||||
zen-welcome-import-button = Jetzt importieren
|
zen-welcome-import-button = Jetzt importieren
|
||||||
zen-welcome-set-default-browser = { -brand-short-name } als Standardbrowser festlegen
|
zen-welcome-set-default-browser = { -brand-short-name } als Standardbrowser festlegen
|
||||||
zen-welcome-dont-set-default-browser = { -brand-short-name } NICHT als Standardbrowser festlegen
|
zen-welcome-dont-set-default-browser = { -brand-short-name } NICHT als Standardbrowser festlegen
|
||||||
zen-welcome-initial-essentials-title = Deine wichtigsten Tabs, immer in Reichweite
|
zen-welcome-initial-essentials-title = Ihre wichtigsten Tabs, immer in Reichweite
|
||||||
zen-welcome-initial-essentials-description-1 = Halte deine wichtigsten Tabs leicht zugänglich und immer griffbereit, egal wie viele du öffnest.
|
zen-welcome-initial-essentials-description-1 = Halten Sie Ihre wichtigsten Tabs leicht zugänglich und immer griffbereit, egal wie viele Sie öffnen.
|
||||||
zen-welcome-initial-essentials-description-2 = Essential-Tabs sind immer sichtbar, unabhängig davon, in welchem Arbeitsbereich du dich befindest.
|
zen-welcome-initial-essentials-description-2 = Essential-Tabs sind immer sichtbar, unabhängig davon, in welchem Arbeitsbereich Sie sich befinden.
|
||||||
zen-welcome-workspace-colors-title = Deine Arbeitsbereiche, deine Farben
|
zen-welcome-workspace-colors-title = Ihre Arbeitsbereiche, Ihre Farben
|
||||||
zen-welcome-workspace-colors-description = Personalisieren Sie Ihren Browser, indem Sie jedem Arbeitsbereich eine eigene Farbidentität geben.
|
zen-welcome-workspace-colors-description = Personalisieren Sie Ihren Browser, indem Sie jedem Arbeitsbereich eine eigene Farbidentität geben.
|
||||||
zen-welcome-start-browsing-title =
|
zen-welcome-start-browsing-title =
|
||||||
Alles bereit?<br/>
|
Alles bereit?<br/>
|
||||||
Dann kann es losgehen!
|
Dann kann es losgehen!
|
||||||
zen-welcome-start-browsing-description-1 = Du bist startklar! Klicke auf die Schaltfläche unten, um mit { -brand-short-name } zu beginnen.
|
zen-welcome-start-browsing-description-1 = Sie sind startklar! Klicken Sie auf die Schaltfläche unten, um mit { -brand-short-name } zu beginnen.
|
||||||
zen-welcome-start-browsing = Los geht's!
|
zen-welcome-start-browsing = Los geht's!
|
||||||
zen-welcome-default-search-title = Ihre Standard-Suchmaschine
|
zen-welcome-default-search-title = Ihre Standard-Suchmaschine
|
||||||
zen-welcome-default-search-description = Wähle deine Standard-Suchmaschine. Du kannst sie jederzeit später ändern!
|
zen-welcome-default-search-description = Wählen Sie Ihre Standard-Suchmaschine. Sie können diese später jederzeit ändern!
|
||||||
zen-welcome-skip-button = Überspringen
|
zen-welcome-skip-button = Überspringen
|
||||||
zen-welcome-finished = Dein Zen wurde erfolgreich eingerichtet!
|
zen-welcome-finished = Ihr Zen wurde erfolgreich eingerichtet!
|
||||||
|
|||||||
@@ -8,20 +8,20 @@ zen-panel-ui-workspaces-create =
|
|||||||
zen-panel-ui-folder-create =
|
zen-panel-ui-folder-create =
|
||||||
.label = Ordner erstellen
|
.label = Ordner erstellen
|
||||||
zen-panel-ui-new-empty-split =
|
zen-panel-ui-new-empty-split =
|
||||||
.label = Neuen Split erstellen
|
.label = Split View erstellen
|
||||||
zen-workspaces-panel-context-delete =
|
zen-workspaces-panel-context-delete =
|
||||||
.label = Arbeitsbereich löschen
|
.label = Arbeitsbereich löschen
|
||||||
.accesskey = D
|
.accesskey = D
|
||||||
zen-workspaces-panel-change-name =
|
zen-workspaces-panel-change-name =
|
||||||
.label = Namen ändern
|
.label = Name ändern
|
||||||
zen-workspaces-panel-change-icon =
|
zen-workspaces-panel-change-icon =
|
||||||
.label = Symbol ändern
|
.label = Symbol ändern
|
||||||
zen-workspaces-panel-context-default-profile =
|
zen-workspaces-panel-context-default-profile =
|
||||||
.label = Profil festlegen
|
.label = Profil festlegen
|
||||||
zen-workspaces-panel-unload =
|
zen-workspaces-panel-unload =
|
||||||
.label = Arbeitsbereich entladen
|
.label = Arbeitsbereich entladen
|
||||||
zen-workspaces-how-to-reorder-title = So ordnest du Arbeitsbereiche neu an
|
zen-workspaces-how-to-reorder-title = Wie Arbeitsbereiche neu angeordnet werden
|
||||||
zen-workspaces-how-to-reorder-desc = Ziehe die Arbeitsbereich-Symbole am unteren Rand der Seitenleiste, um sie neu anzuordnen
|
zen-workspaces-how-to-reorder-desc = Ziehen Sie die Arbeitsbereich-Symbole am unteren Rand der Seitenleiste, um sie neu anzuordnen
|
||||||
zen-workspaces-change-theme =
|
zen-workspaces-change-theme =
|
||||||
.label = Design bearbeiten
|
.label = Design bearbeiten
|
||||||
zen-workspaces-panel-context-open =
|
zen-workspaces-panel-context-open =
|
||||||
@@ -54,12 +54,12 @@ zen-workspaces-panel-context-reorder =
|
|||||||
zen-workspace-creation-profile = Profil
|
zen-workspace-creation-profile = Profil
|
||||||
.tooltiptext = Profile werden verwendet, um Cookies und Website-Daten zwischen Arbeitsbereichen zu trennen.
|
.tooltiptext = Profile werden verwendet, um Cookies und Website-Daten zwischen Arbeitsbereichen zu trennen.
|
||||||
zen-workspace-creation-header = Arbeitsbereich erstellen
|
zen-workspace-creation-header = Arbeitsbereich erstellen
|
||||||
zen-workspace-creation-label = Arbeitsbereiche helfen dir, deine Tabs und Sitzungen zu organisieren.
|
zen-workspace-creation-label = Arbeitsbereiche werden verwendet, um Ihre Tabs und Sitzungen zu organisieren.
|
||||||
zen-workspaces-delete-workspace-title = Arbeitsbereich löschen?
|
zen-workspaces-delete-workspace-title = Arbeitsbereich löschen?
|
||||||
zen-workspaces-delete-workspace-body = Möchtest du { $name } wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden.
|
zen-workspaces-delete-workspace-body = Sind Sie sicher, dass Sie { $name } löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.
|
||||||
# Note that the html tag MUST not be changed or removed, as it is used to better
|
# Note that the html tag MUST not be changed or removed, as it is used to better
|
||||||
# display the shortcut in the toast notification.
|
# display the shortcut in the toast notification.
|
||||||
zen-workspaces-close-all-unpinned-tabs-toast = Tabs geschlossen! Nutze <span>{ $shortcut }</span>, um rückgängig zu machen.
|
zen-workspaces-close-all-unpinned-tabs-toast = Tabs geschlossen! Nutze <span>{ $shortcut }</span> , um rückgängig zu machen.
|
||||||
zen-workspaces-close-all-unpinned-tabs-title =
|
zen-workspaces-close-all-unpinned-tabs-title =
|
||||||
.label = Aufräumen
|
.label = Löschen
|
||||||
.tooltiptext = Alle nicht angehefteten Tabs schließen
|
.tooltiptext = Alle nicht angehefteten Tabs schließen
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Επαναφορά Καρφιτσωμένης Καρτέλας
|
.label = Επαναφορά Καρφιτσωμένης Καρτέλας
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Προσθήκη στα Απαραίτητα ({ $num } / { $max } θέσεις γεμάτες)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Αφαίρεση από Απαραίτητα
|
.label = Αφαίρεση από Απαραίτητα
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Reset Pinned Tab
|
.label = Reset Pinned Tab
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Add to Essentials ({ $num } / { $max } slots filled)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Remove from Essentials
|
.label = Remove from Essentials
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -9,9 +9,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Reset Pinned Tab
|
.label = Reset Pinned Tab
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Add to Essentials ({ $num } / { $max } slots filled)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Remove from Essentials
|
.label = Remove from Essentials
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Restablecer pestaña fijada
|
.label = Restablecer pestaña fijada
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Añadir a esenciales
|
.label = Añadir a esenciales ({ $num } / { $max } huecos llenos)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } huecos llenos
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Quitar de esenciales
|
.label = Quitar de esenciales
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Lähtesta püsikaart
|
.label = Lähtesta püsikaart
|
||||||
.accesskey = p
|
.accesskey = p
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Märgi oluliseks ({ $num } / { $max } täidetud)
|
||||||
.accesskey = o
|
.accesskey = o
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Eemalda olulistest
|
.label = Eemalda olulistest
|
||||||
.accesskey = o
|
.accesskey = o
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Reset Pinned Tab
|
.label = Reset Pinned Tab
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Add to Essentials ({ $num } / { $max } slots filled)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Remove from Essentials
|
.label = Remove from Essentials
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ pane-zen-looks-title = Katso ja tunne
|
|||||||
category-zen-looks =
|
category-zen-looks =
|
||||||
.tooltiptext = { pane-zen-looks-title }
|
.tooltiptext = { pane-zen-looks-title }
|
||||||
zen-warning-language = Muuttaminen oletuskieli voisi helpottaa Websites seurata sinua.
|
zen-warning-language = Muuttaminen oletuskieli voisi helpottaa Websites seurata sinua.
|
||||||
zen-vertical-tabs-layout-header = Selaimen asettelu
|
zen-vertical-tabs-layout-header = Browser Layout
|
||||||
zen-vertical-tabs-layout-description = Valitse asettelu, joka sopii sinulle parhaiten
|
zen-vertical-tabs-layout-description = Choose the layout that suits you best
|
||||||
zen-layout-single-toolbar = Single toolbar
|
zen-layout-single-toolbar = Single toolbar
|
||||||
zen-layout-multiple-toolbar = Multiple toolbars
|
zen-layout-multiple-toolbar = Multiple toolbars
|
||||||
zen-layout-collapsed-toolbar = Collapsed toolbar
|
zen-layout-collapsed-toolbar = Collapsed toolbar
|
||||||
@@ -45,16 +45,16 @@ pane-settings-workspaces-title = Työtilat
|
|||||||
zen-tabs-unloader-enabled =
|
zen-tabs-unloader-enabled =
|
||||||
.label = Ota Käyttöön välilehden purkaminen
|
.label = Ota Käyttöön välilehden purkaminen
|
||||||
zen-tabs-close-on-back-with-no-history =
|
zen-tabs-close-on-back-with-no-history =
|
||||||
.label = Sulje välilehti ja vaihda sen omistajavälilehteen (tai viimeksi käytettyyn välilehteen) kun palataan ilman historiaa
|
.label = Close tab and switch to its owner tab (or most recently used tab) when going back with no history
|
||||||
zen-tabs-cycle-by-attribute =
|
zen-tabs-cycle-by-attribute =
|
||||||
.label = Ctrl+Tab kiertää vain keskeisissä tai Työtilojen välilehdissä
|
.label = Ctrl+Tab cycles within Essential or Workspace tabs only
|
||||||
zen-tabs-cycle-ignore-pending-tabs =
|
zen-tabs-cycle-ignore-pending-tabs =
|
||||||
.label = Ohita odottavat välilehdet Ctrl+Tab kanssa
|
.label = Ignore Pending tabs when cycling with Ctrl+Tab
|
||||||
zen-tabs-cycle-by-attribute-warning = Ctrl+Tab selaa välilehtiä käyttöjärjestyksessä alkaen viimeisimmästä
|
zen-tabs-cycle-by-attribute-warning = Ctrl+Tab will cycle by recently used order, as it is enabled
|
||||||
zen-look-and-feel-compact-toolbar-themed =
|
zen-look-and-feel-compact-toolbar-themed =
|
||||||
.label = Käytä teemoitettua taustaa kompaktissa työkalupalkissa
|
.label = Use themed background for compact toolbar
|
||||||
zen-workspace-continue-where-left-off =
|
zen-workspace-continue-where-left-off =
|
||||||
.label = Jatka siitä, mihin jäit
|
.label = Continue where you left off
|
||||||
pane-zen-pinned-tab-manager-title = Kiinnitetyt Välilehdet
|
pane-zen-pinned-tab-manager-title = Kiinnitetyt Välilehdet
|
||||||
zen-pinned-tab-manager-header = Yleiset asetukset kiinnitettäville välilehteille
|
zen-pinned-tab-manager-header = Yleiset asetukset kiinnitettäville välilehteille
|
||||||
zen-pinned-tab-manager-description = Hallitse lisäkäyttäytymistä kiinnitettyjen välilehtien osalta
|
zen-pinned-tab-manager-description = Hallitse lisäkäyttäytymistä kiinnitettyjen välilehtien osalta
|
||||||
@@ -72,7 +72,7 @@ zen-pinned-tab-manager-reset-switch-close-shortcut-option =
|
|||||||
zen-pinned-tab-manager-switch-close-shortcut-option =
|
zen-pinned-tab-manager-switch-close-shortcut-option =
|
||||||
.label = Siirry seuraavaan välilehteen
|
.label = Siirry seuraavaan välilehteen
|
||||||
zen-pinned-tab-manager-reset-close-shortcut-option =
|
zen-pinned-tab-manager-reset-close-shortcut-option =
|
||||||
.label = Resetoi URL
|
.label = Reset URL
|
||||||
zen-pinned-tab-manager-close-close-shortcut-option =
|
zen-pinned-tab-manager-close-close-shortcut-option =
|
||||||
.label = Sulje välilehti
|
.label = Sulje välilehti
|
||||||
pane-zen-workspaces-header = Työtilat
|
pane-zen-workspaces-header = Työtilat
|
||||||
@@ -83,7 +83,7 @@ zen-settings-workspaces-enabled =
|
|||||||
zen-settings-workspaces-hide-default-container-indicator =
|
zen-settings-workspaces-hide-default-container-indicator =
|
||||||
.label = Piilota säiliön oletusmerkkivalo välilehdessä - palkki
|
.label = Piilota säiliön oletusmerkkivalo välilehdessä - palkki
|
||||||
zen-key-unsaved = Tallentamaton pikakuvake! Ole hyvä ja turvaa se painamalla "Escape" -näppäintä kirjoittamisen jälkeen.
|
zen-key-unsaved = Tallentamaton pikakuvake! Ole hyvä ja turvaa se painamalla "Escape" -näppäintä kirjoittamisen jälkeen.
|
||||||
zen-key-conflict = Ristiriidat { $group } -> { $shortcut }
|
zen-key-conflict = Conflicts with { $group } -> { $shortcut }
|
||||||
pane-zen-theme-title = Teeman Asetukset
|
pane-zen-theme-title = Teeman Asetukset
|
||||||
zen-vertical-tabs-title = Sivupalkin ja välilehtien asettelu
|
zen-vertical-tabs-title = Sivupalkin ja välilehtien asettelu
|
||||||
zen-vertical-tabs-header = Pystysuorat Välilehdet
|
zen-vertical-tabs-header = Pystysuorat Välilehdet
|
||||||
@@ -99,7 +99,7 @@ zen-vertical-tabs-dont-expand-tabs-by-default = Älä laajenna välilehtiä olet
|
|||||||
zen-vertical-tabs-expand-tabs-on-hover = Laajenna välilehdet leijailemalla (Ei toimi kompaktitilassa)
|
zen-vertical-tabs-expand-tabs-on-hover = Laajenna välilehdet leijailemalla (Ei toimi kompaktitilassa)
|
||||||
zen-vertical-tabs-expand-tabs-header = Kuinka laajentaa välilehdet
|
zen-vertical-tabs-expand-tabs-header = Kuinka laajentaa välilehdet
|
||||||
zen-vertical-tabs-expand-tabs-description = Valitse, miten voit laajentaa välilehtiä sivupalkissa
|
zen-vertical-tabs-expand-tabs-description = Valitse, miten voit laajentaa välilehtiä sivupalkissa
|
||||||
zen-theme-marketplace-header = Zen modit
|
zen-theme-marketplace-header = Zen Mods
|
||||||
zen-theme-disable-all-enabled =
|
zen-theme-disable-all-enabled =
|
||||||
.title = Poista kaikki teemat käytöstä
|
.title = Poista kaikki teemat käytöstä
|
||||||
zen-theme-disable-all-disabled =
|
zen-theme-disable-all-disabled =
|
||||||
@@ -110,15 +110,15 @@ zen-theme-marketplace-remove-button =
|
|||||||
zen-theme-marketplace-check-for-updates-button =
|
zen-theme-marketplace-check-for-updates-button =
|
||||||
.label = Tarkista päivitykset
|
.label = Tarkista päivitykset
|
||||||
zen-theme-marketplace-import-button =
|
zen-theme-marketplace-import-button =
|
||||||
.label = Tuo modeja
|
.label = Import mods
|
||||||
zen-theme-marketplace-export-button =
|
zen-theme-marketplace-export-button =
|
||||||
.label = Vie Modit
|
.label = Export Mods
|
||||||
zen-theme-marketplace-import-success = Modit tuotu onnistuneesti
|
zen-theme-marketplace-import-success = Mods imported successfully
|
||||||
zen-theme-marketplace-import-failure = Modeja tuodessa tapahtui virhe
|
zen-theme-marketplace-import-failure = There was an error importing the mods
|
||||||
zen-theme-marketplace-export-success = Modit viety onnistuneesti
|
zen-theme-marketplace-export-success = Mods exported successfully
|
||||||
zen-theme-marketplace-export-failure = Modien viennissä tapahtui virhe
|
zen-theme-marketplace-export-failure = There was an error exporting the mods
|
||||||
zen-theme-marketplace-updates-success = Teema päivitetty onnistuneesti
|
zen-theme-marketplace-updates-success = Teema päivitetty onnistuneesti
|
||||||
zen-theme-marketplace-updates-failure = Päivityksiä ei löytynt!
|
zen-theme-marketplace-updates-failure = Couldn't find any updates!
|
||||||
zen-theme-marketplace-toggle-enabled-button =
|
zen-theme-marketplace-toggle-enabled-button =
|
||||||
.title = Poista Teema Käytöstä
|
.title = Poista Teema Käytöstä
|
||||||
zen-theme-marketplace-toggle-disabled-button =
|
zen-theme-marketplace-toggle-disabled-button =
|
||||||
@@ -131,9 +131,9 @@ zen-theme-marketplace-dropdown-default-label =
|
|||||||
.label = Ei Mitään
|
.label = Ei Mitään
|
||||||
zen-theme-marketplace-input-default-placeholder =
|
zen-theme-marketplace-input-default-placeholder =
|
||||||
.placeholder = Kirjoita jotain...
|
.placeholder = Kirjoita jotain...
|
||||||
pane-zen-marketplace-title = Zen modit
|
pane-zen-marketplace-title = Zen Mods
|
||||||
zen-themes-auto-update =
|
zen-themes-auto-update =
|
||||||
.label = Päivitä asennetut modit automaattisesti käynnistyksessä
|
.label = Automatically update installed mods on startup
|
||||||
zen-settings-workspaces-force-container-tabs-to-workspace =
|
zen-settings-workspaces-force-container-tabs-to-workspace =
|
||||||
.label = Vaihda työtilaan, jossa säiliö on asetettu oletusarvoiseksi avattaessa säiliön välilehtiä
|
.label = Vaihda työtilaan, jossa säiliö on asetettu oletusarvoiseksi avattaessa säiliön välilehtiä
|
||||||
zen-theme-marketplace-link = Vieraile Kaupassa
|
zen-theme-marketplace-link = Vieraile Kaupassa
|
||||||
@@ -145,16 +145,16 @@ zen-dark-theme-styles-colorful = Värikäs Tumma Teema
|
|||||||
zen-compact-mode-styles-left = Piilota välilehti
|
zen-compact-mode-styles-left = Piilota välilehti
|
||||||
zen-compact-mode-styles-top = Piilota yläpalkki
|
zen-compact-mode-styles-top = Piilota yläpalkki
|
||||||
zen-compact-mode-styles-both = Piilota Molemmat
|
zen-compact-mode-styles-both = Piilota Molemmat
|
||||||
zen-urlbar-title = Zen URL-palkki
|
zen-urlbar-title = Zen URL Bar
|
||||||
zen-urlbar-header = URL palkin yleiset asetukset
|
zen-urlbar-header = General settings for the URL bar
|
||||||
zen-urlbar-description = Muokkaa URL-palkkia sinun mielesi mukaan
|
zen-urlbar-description = Customize the URL bar to your liking
|
||||||
zen-urlbar-behavior-label = Toiminnot
|
zen-urlbar-behavior-label = Behavior
|
||||||
zen-urlbar-behavior-normal =
|
zen-urlbar-behavior-normal =
|
||||||
.label = Normaali
|
.label = Normal
|
||||||
zen-urlbar-behavior-floating-on-type =
|
zen-urlbar-behavior-floating-on-type =
|
||||||
.label = Kelluva vain kirjoittaessasi
|
.label = Floating only when typing
|
||||||
zen-urlbar-behavior-float =
|
zen-urlbar-behavior-float =
|
||||||
.label = Aina kelluva
|
.label = Always floating
|
||||||
pane-zen-CKS-title = Näppäimistön Pikanäppäimet
|
pane-zen-CKS-title = Näppäimistön Pikanäppäimet
|
||||||
category-zen-CKS =
|
category-zen-CKS =
|
||||||
.tooltiptext = { pane-zen-CKS-title }
|
.tooltiptext = { pane-zen-CKS-title }
|
||||||
@@ -164,7 +164,7 @@ zen-settings-CKS-description = Muuta oletus näppäimistön pikakuvakkeet mielty
|
|||||||
zen-settings-CKS-disable-firefox =
|
zen-settings-CKS-disable-firefox =
|
||||||
.label = Poista { -brand-short-name }oletusnäppäimistön pikakuvakkeet käytöstä
|
.label = Poista { -brand-short-name }oletusnäppäimistön pikakuvakkeet käytöstä
|
||||||
zen-settings-CKS-duplicate-shortcut =
|
zen-settings-CKS-duplicate-shortcut =
|
||||||
.label = Monista pikanäppäin
|
.label = Duplicate Shortcut
|
||||||
zen-settings-CKS-reset-shortcuts =
|
zen-settings-CKS-reset-shortcuts =
|
||||||
.label = Palauta oletukset
|
.label = Palauta oletukset
|
||||||
zenCKSOption-group-other = Muu
|
zenCKSOption-group-other = Muu
|
||||||
@@ -178,10 +178,10 @@ zenCKSOption-group-zen-compact-mode = Kompakti Tila
|
|||||||
zenCKSOption-group-zen-workspace = Työtilat
|
zenCKSOption-group-zen-workspace = Työtilat
|
||||||
zenCKSOption-group-zen-other = Muut Zen-ominaisuudet
|
zenCKSOption-group-zen-other = Muut Zen-ominaisuudet
|
||||||
zenCKSOption-group-zen-split-view = Jaettu Näkymä
|
zenCKSOption-group-zen-split-view = Jaettu Näkymä
|
||||||
zenCKSOption-group-devTools = Kehitystyökalut
|
zenCKSOption-group-devTools = Developer Tools
|
||||||
zen-key-quick-restart = Nopea Uudelleenkäynnistys
|
zen-key-quick-restart = Nopea Uudelleenkäynnistys
|
||||||
zen-window-new-shortcut = Uusi Ikkuna
|
zen-window-new-shortcut = Uusi Ikkuna
|
||||||
zen-tab-new-shortcut = Uusi välilehti
|
zen-tab-new-shortcut = New Tab
|
||||||
zen-key-redo = Toista
|
zen-key-redo = Toista
|
||||||
zen-restore-last-closed-tab-shortcut = Palauta Viimeksi Suljettu Välilehti
|
zen-restore-last-closed-tab-shortcut = Palauta Viimeksi Suljettu Välilehti
|
||||||
zen-location-open-shortcut = Avaa Sijainti
|
zen-location-open-shortcut = Avaa Sijainti
|
||||||
@@ -191,8 +191,8 @@ zen-text-action-undo-shortcut = Kumoa
|
|||||||
zen-text-action-redo-shortcut = Toista
|
zen-text-action-redo-shortcut = Toista
|
||||||
zen-text-action-cut-shortcut = Leikkaa
|
zen-text-action-cut-shortcut = Leikkaa
|
||||||
zen-text-action-copy-shortcut = Kopioi
|
zen-text-action-copy-shortcut = Kopioi
|
||||||
zen-text-action-copy-url-shortcut = Kopioi nykyinen URL-osoite
|
zen-text-action-copy-url-shortcut = Copy current URL
|
||||||
zen-text-action-copy-url-markdown-shortcut = Kopioi nykyinen URL-osoite Markdownina
|
zen-text-action-copy-url-markdown-shortcut = Copy current URL as Markdown
|
||||||
zen-text-action-paste-shortcut = Liitä
|
zen-text-action-paste-shortcut = Liitä
|
||||||
zen-text-action-select-all-shortcut = Valitse Kaikki
|
zen-text-action-select-all-shortcut = Valitse Kaikki
|
||||||
zen-text-action-delete-shortcut = Poista
|
zen-text-action-delete-shortcut = Poista
|
||||||
@@ -204,7 +204,7 @@ zen-picture-in-picture-toggle-shortcut-mac = Ota käyttöön kuva-kuvassa (Mac)
|
|||||||
zen-picture-in-picture-toggle-shortcut-mac-alt = Ota käyttöön kuva-kuvassa (Mac Alt)
|
zen-picture-in-picture-toggle-shortcut-mac-alt = Ota käyttöön kuva-kuvassa (Mac Alt)
|
||||||
zen-page-source-shortcut-safari = Näytä Sivulähde (Safari)
|
zen-page-source-shortcut-safari = Näytä Sivulähde (Safari)
|
||||||
zen-nav-stop-shortcut = Lopeta Lataaminen
|
zen-nav-stop-shortcut = Lopeta Lataaminen
|
||||||
zen-history-sidebar-shortcut = Näytä historia sivupalkissa
|
zen-history-sidebar-shortcut = Show History Sidebar
|
||||||
zen-window-minimize-shortcut = Pienennä Ikkuna
|
zen-window-minimize-shortcut = Pienennä Ikkuna
|
||||||
zen-help-shortcut = Avaa Ohje
|
zen-help-shortcut = Avaa Ohje
|
||||||
zen-preferences-shortcut = Avoimet Asetukset
|
zen-preferences-shortcut = Avoimet Asetukset
|
||||||
@@ -216,7 +216,7 @@ zen-downloads-shortcut = Avaa Lataukset
|
|||||||
zen-addons-shortcut = Avaa Lisäosat
|
zen-addons-shortcut = Avaa Lisäosat
|
||||||
zen-file-open-shortcut = Avaa Tiedosto
|
zen-file-open-shortcut = Avaa Tiedosto
|
||||||
zen-save-page-shortcut = Tallenna Sivu
|
zen-save-page-shortcut = Tallenna Sivu
|
||||||
zen-print-shortcut = Tulosta sivu
|
zen-print-shortcut = Print Page
|
||||||
zen-close-shortcut-2 = Sulje Välilehti
|
zen-close-shortcut-2 = Sulje Välilehti
|
||||||
zen-mute-toggle-shortcut = Vaihda Mykistystä
|
zen-mute-toggle-shortcut = Vaihda Mykistystä
|
||||||
zen-key-delete = Poista Avain
|
zen-key-delete = Poista Avain
|
||||||
@@ -227,10 +227,10 @@ zen-nav-fwd-shortcut-alt = Siirry Eteenpäin (Alt)
|
|||||||
zen-history-show-all-shortcut = Näytä Kaikki Historia
|
zen-history-show-all-shortcut = Näytä Kaikki Historia
|
||||||
zen-key-enter-full-screen = Anna Koko Näyttö
|
zen-key-enter-full-screen = Anna Koko Näyttö
|
||||||
zen-key-exit-full-screen = Poistu Koko Näyttötilasta
|
zen-key-exit-full-screen = Poistu Koko Näyttötilasta
|
||||||
zen-ai-chatbot-sidebar-shortcut = Ota käyttöön AI chatbot sivupalkkiin
|
zen-ai-chatbot-sidebar-shortcut = Toggle AI Chatbot Sidebar
|
||||||
zen-key-inspector-mac = Vaihda Tarkastaja (Mac)
|
zen-key-inspector-mac = Toggle Inspector (Mac)
|
||||||
zen-toggle-sidebar-shortcut = Vaihda Firefoxin Sivupalkkia
|
zen-toggle-sidebar-shortcut = Toggle Firefox Sidebar
|
||||||
zen-toggle-pin-tab-shortcut = Kiinnitä välilehti
|
zen-toggle-pin-tab-shortcut = Toggle Pin Tab
|
||||||
zen-reader-mode-toggle-shortcut-other = Vaihda Lukijan Tila
|
zen-reader-mode-toggle-shortcut-other = Vaihda Lukijan Tila
|
||||||
zen-picture-in-picture-toggle-shortcut = Vaihda Kuva Kuvaksi
|
zen-picture-in-picture-toggle-shortcut = Vaihda Kuva Kuvaksi
|
||||||
zen-nav-reload-shortcut-2 = Lataa Sivu Uudelleen
|
zen-nav-reload-shortcut-2 = Lataa Sivu Uudelleen
|
||||||
@@ -247,9 +247,9 @@ zen-key-stop = Lopeta Lataaminen
|
|||||||
zen-full-zoom-reduce-shortcut = Zoomaa Ulos
|
zen-full-zoom-reduce-shortcut = Zoomaa Ulos
|
||||||
zen-full-zoom-enlarge-shortcut = Zoomaa Sisään
|
zen-full-zoom-enlarge-shortcut = Zoomaa Sisään
|
||||||
zen-full-zoom-reset-shortcut = Resetoi Zoomaus
|
zen-full-zoom-reset-shortcut = Resetoi Zoomaus
|
||||||
zen-full-zoom-reset-shortcut-alt = Nollaa Zoomaus (Alt)
|
zen-full-zoom-reset-shortcut-alt = Reset Zoom (Alt)
|
||||||
zen-full-zoom-enlarge-shortcut-alt = Suurenna (Alt)
|
zen-full-zoom-enlarge-shortcut-alt = Zoom In (Alt)
|
||||||
zen-full-zoom-enlarge-shortcut-alt2 = Suurenna (Alt 2)
|
zen-full-zoom-enlarge-shortcut-alt2 = Zoom In (Alt 2)
|
||||||
zen-bidi-switch-direction-shortcut = Vaihda Tekstin Suuntaa
|
zen-bidi-switch-direction-shortcut = Vaihda Tekstin Suuntaa
|
||||||
zen-private-browsing-shortcut = Yksityinen Selaus
|
zen-private-browsing-shortcut = Yksityinen Selaus
|
||||||
zen-screenshot-shortcut = Ota Kuvakaappaus
|
zen-screenshot-shortcut = Ota Kuvakaappaus
|
||||||
@@ -264,7 +264,7 @@ zen-close-tab-shortcut = Sulje Välilehti
|
|||||||
zen-compact-mode-shortcut-show-sidebar = Ota käyttöön Kelluva Sivupalkki
|
zen-compact-mode-shortcut-show-sidebar = Ota käyttöön Kelluva Sivupalkki
|
||||||
zen-compact-mode-shortcut-show-toolbar = Ota käyttöön Kelluva Työkalurivi
|
zen-compact-mode-shortcut-show-toolbar = Ota käyttöön Kelluva Työkalurivi
|
||||||
zen-compact-mode-shortcut-toggle = Ota käyttöön Kompaktitila
|
zen-compact-mode-shortcut-toggle = Ota käyttöön Kompaktitila
|
||||||
zen-glance-expand = Laajenna Vilkaisu
|
zen-glance-expand = Expand Glance
|
||||||
zen-workspace-shortcut-switch-1 = Vaihda työtilaan 1
|
zen-workspace-shortcut-switch-1 = Vaihda työtilaan 1
|
||||||
zen-workspace-shortcut-switch-2 = Vaihda työtilaan 2
|
zen-workspace-shortcut-switch-2 = Vaihda työtilaan 2
|
||||||
zen-workspace-shortcut-switch-3 = Vaihda työtilaan 3
|
zen-workspace-shortcut-switch-3 = Vaihda työtilaan 3
|
||||||
@@ -283,7 +283,7 @@ zen-split-view-shortcut-grid = Vaihda Jaettu Näkymä ruudukkoon
|
|||||||
zen-split-view-shortcut-vertical = Vaihda Jaettu Näkymä Pystysuunnassa
|
zen-split-view-shortcut-vertical = Vaihda Jaettu Näkymä Pystysuunnassa
|
||||||
zen-split-view-shortcut-horizontal = Vaihda Jaettu Näkymä Vaakasuoraan
|
zen-split-view-shortcut-horizontal = Vaihda Jaettu Näkymä Vaakasuoraan
|
||||||
zen-split-view-shortcut-unsplit = Sulje Jaettu Näkymä
|
zen-split-view-shortcut-unsplit = Sulje Jaettu Näkymä
|
||||||
zen-new-empty-split-view-shortcut = Uusi Tyhjä Jaettu Näkymä
|
zen-new-empty-split-view-shortcut = New Empty Split View
|
||||||
zen-key-select-tab-1 = Valitse välilehti #1
|
zen-key-select-tab-1 = Valitse välilehti #1
|
||||||
zen-key-select-tab-2 = Valitse välilehti #2
|
zen-key-select-tab-2 = Valitse välilehti #2
|
||||||
zen-key-select-tab-3 = Valitse välilehti #3
|
zen-key-select-tab-3 = Valitse välilehti #3
|
||||||
@@ -298,17 +298,17 @@ zen-key-goto-history = Siirry historiaan
|
|||||||
zen-key-go-home = Siirry Kotiin
|
zen-key-go-home = Siirry Kotiin
|
||||||
zen-bookmark-show-sidebar-shortcut = Näytä Kirjanmerkkien Sivupalkki
|
zen-bookmark-show-sidebar-shortcut = Näytä Kirjanmerkkien Sivupalkki
|
||||||
zen-bookmark-show-toolbar-shortcut = Näytä Kirjanmerkkipalkki
|
zen-bookmark-show-toolbar-shortcut = Näytä Kirjanmerkkipalkki
|
||||||
zen-devtools-toggle-shortcut = Vaihda DevTools
|
zen-devtools-toggle-shortcut = Toggle DevTools
|
||||||
zen-devtools-toggle-browser-toolbox-shortcut = Vaihda Selaimen Työkalupakkia
|
zen-devtools-toggle-browser-toolbox-shortcut = Toggle Browser Toolbox
|
||||||
zen-devtools-toggle-browser-console-shortcut = Vaihda Selaimen Konsoli
|
zen-devtools-toggle-browser-console-shortcut = Toggle Browser Console
|
||||||
zen-devtools-toggle-responsive-design-mode-shortcut = Vaihda Reagoiva Suunnittelu -tila
|
zen-devtools-toggle-responsive-design-mode-shortcut = Toggle Responsive Design Mode
|
||||||
zen-devtools-toggle-inspector-shortcut = Vaihda Tarkastajaa
|
zen-devtools-toggle-inspector-shortcut = Toggle Inspector
|
||||||
zen-devtools-toggle-web-console-shortcut = Vaihda Selaimen Konsoli
|
zen-devtools-toggle-web-console-shortcut = Toggle Web Console
|
||||||
zen-devtools-toggle-js-debugger-shortcut = Vaihda Javascript- Debuggeria
|
zen-devtools-toggle-js-debugger-shortcut = Toggle JavaScript Debugger
|
||||||
zen-devtools-toggle-net-monitor-shortcut = Vaihda Verkon Valvontaa
|
zen-devtools-toggle-net-monitor-shortcut = Toggle Network Monitor
|
||||||
zen-devtools-toggle-style-editor-shortcut = Vaihda Tyylin Muokkainta
|
zen-devtools-toggle-style-editor-shortcut = Toggle Style Editor
|
||||||
zen-devtools-toggle-performance-shortcut = Vaihda Suorituskykyä
|
zen-devtools-toggle-performance-shortcut = Toggle Performance
|
||||||
zen-devtools-toggle-storage-shortcut = Vaihda Tallennustilaa
|
zen-devtools-toggle-storage-shortcut = Toggle Storage
|
||||||
zen-devtools-toggle-dom-shortcut = Vaihda DOM:ia
|
zen-devtools-toggle-dom-shortcut = Toggle DOM
|
||||||
zen-devtools-toggle-accessibility-shortcut = Vaihda Esteettömyystilaa
|
zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility
|
||||||
zen-close-all-unpinned-tabs-shortcut = Sulje kaikki kiinnittämättömät välilehdet
|
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
|
||||||
|
|||||||
@@ -3,23 +3,23 @@
|
|||||||
# 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-folders-search-placeholder =
|
zen-folders-search-placeholder =
|
||||||
.placeholder = Etsi { $folder-name }...
|
.placeholder = Search { $folder-name }...
|
||||||
zen-folders-panel-rename-folder =
|
zen-folders-panel-rename-folder =
|
||||||
.label = Nimeä kansio uudelleen
|
.label = Rename Folder
|
||||||
zen-folders-panel-unpack-folder =
|
zen-folders-panel-unpack-folder =
|
||||||
.label = Pura Kansio
|
.label = Unpack Folder
|
||||||
zen-folders-new-subfolder =
|
zen-folders-new-subfolder =
|
||||||
.label = Uusi Alikansio
|
.label = New Subfolder
|
||||||
zen-folders-panel-delete-folder =
|
zen-folders-panel-delete-folder =
|
||||||
.label = Poista kansio
|
.label = Delete Folder
|
||||||
zen-folders-panel-convert-folder-to-space =
|
zen-folders-panel-convert-folder-to-space =
|
||||||
.label = Muunna kansio työtilaksi
|
.label = Convert folder to Space
|
||||||
zen-folders-panel-change-folder-space =
|
zen-folders-panel-change-folder-space =
|
||||||
.label = Muuta Työtilaa...
|
.label = Change Space...
|
||||||
zen-folders-panel-change-icon-folder =
|
zen-folders-panel-change-icon-folder =
|
||||||
.label = Vaihda kuvake
|
.label = Change Icon
|
||||||
zen-folders-unload-all-tooltip =
|
zen-folders-unload-all-tooltip =
|
||||||
.tooltiptext = Poista käytöstä aktiivinen kansio
|
.tooltiptext = Unload active in this folder
|
||||||
zen-folders-unload-folder =
|
zen-folders-unload-folder =
|
||||||
.label = Tyhjennä Kaikki Välilehdet
|
.label = Unload All Tabs
|
||||||
zen-folders-search-no-results = Ei hakua vastaavia välilehtiä 🤔
|
zen-folders-search-no-results = No tabs matching that search 🤔
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Nollaa Kiinnitetty Välilehti
|
.label = Nollaa Kiinnitetty Välilehti
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Lisää olennaisiin
|
.label = Add to Essentials ({ $num } / { $max } slots filled)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } täytetty paikka
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Poista olennaisista
|
.label = Poista olennaisista
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
@@ -18,83 +17,83 @@ tab-context-zen-replace-pinned-url-with-current =
|
|||||||
.label = Korvaa kiinnitetty URL-osoite nykyisellä
|
.label = Korvaa kiinnitetty URL-osoite nykyisellä
|
||||||
.accesskey = C
|
.accesskey = C
|
||||||
zen-themes-corrupted = { -brand-short-name } modejasi tiedosto on vioittunut. Ne on palautettu oletusteemaan.
|
zen-themes-corrupted = { -brand-short-name } modejasi tiedosto on vioittunut. Ne on palautettu oletusteemaan.
|
||||||
zen-shortcuts-corrupted = { -brand-short-name } Oikotietä sisältävä tiedosto on korruptoitunut. Ne on palautettu oletus oikoteihin.
|
zen-shortcuts-corrupted = Your { -brand-short-name } shortcuts file is corrupted. They have been reset to the default shortcuts.
|
||||||
# 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 =
|
zen-new-urlbar-notification =
|
||||||
Uusi URL-palkki on otettu käyttöön, uusia välilehtisivuja ei enää tarvita.<br/><br/>
|
The new URL bar has been enabled, removing the need for new tab pages.<br/><br/>
|
||||||
Kokeile avata uusi välilehti nähdäksesi uuden URL-palkin toiminnassa!
|
Try opening a new tab to see the new URL bar in action!
|
||||||
zen-disable = Poista käytöstä
|
zen-disable = Disable
|
||||||
pictureinpicture-minimize-btn =
|
pictureinpicture-minimize-btn =
|
||||||
.aria-label = Minimoi
|
.aria-label = Minimize
|
||||||
.tooltip = Minimoi
|
.tooltip = Minimize
|
||||||
zen-panel-ui-gradient-generator-custom-color = Muokattu Väri
|
zen-panel-ui-gradient-generator-custom-color = Muokattu Väri
|
||||||
zen-panel-ui-gradient-generator-saved-message = Kaltevuus tallennettu onnistuneesti!
|
zen-panel-ui-gradient-generator-saved-message = Kaltevuus tallennettu onnistuneesti!
|
||||||
zen-copy-current-url-confirmation = Nykyinen URL-osoite kopioitu!
|
zen-copy-current-url-confirmation = Copied current URL!
|
||||||
zen-general-cancel-label =
|
zen-general-cancel-label =
|
||||||
.label = Peruuta
|
.label = Cancel
|
||||||
zen-general-confirm =
|
zen-general-confirm =
|
||||||
.label = Vahvista
|
.label = Confirm
|
||||||
zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL.
|
zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL.
|
||||||
zen-tabs-renamed = Välilehti on nimetty uudelleen!
|
zen-tabs-renamed = Tab has been successfully renamed!
|
||||||
zen-background-tab-opened-toast = Uusi taustavälilehti avattu!
|
zen-background-tab-opened-toast = New background tab opened!
|
||||||
zen-workspace-renamed-toast = Työtila on nimetty uudelleen!
|
zen-workspace-renamed-toast = Workspace has been successfully renamed!
|
||||||
zen-library-sidebar-workspaces =
|
zen-library-sidebar-workspaces =
|
||||||
.label = Työtilat
|
.label = Spaces
|
||||||
zen-library-sidebar-mods =
|
zen-library-sidebar-mods =
|
||||||
.label = Modit
|
.label = Mods
|
||||||
zen-toggle-compact-mode-button =
|
zen-toggle-compact-mode-button =
|
||||||
.label = Kompakti Tila
|
.label = Compact Mode
|
||||||
.tooltiptext = Ota käyttöön Kompakti tila
|
.tooltiptext = Toggle Compact Mode
|
||||||
|
|
||||||
# note: Do not translate the "<br/>" tags in the following string
|
# note: Do not translate the "<br/>" tags in the following string
|
||||||
|
|
||||||
zen-learn-more-text = Lue Lisää
|
zen-learn-more-text = Learn More
|
||||||
zen-close-label = Sulje
|
zen-close-label = Close
|
||||||
zen-singletoolbar-urlbar-placeholder-with-name =
|
zen-singletoolbar-urlbar-placeholder-with-name =
|
||||||
.placeholder = Hae...
|
.placeholder = Search...
|
||||||
zen-icons-picker-emoji =
|
zen-icons-picker-emoji =
|
||||||
.label = Emojit
|
.label = Emojis
|
||||||
zen-icons-picker-svg =
|
zen-icons-picker-svg =
|
||||||
.label = Kuvakkeet
|
.label = Icons
|
||||||
urlbar-search-mode-zen_actions = Toiminnot
|
urlbar-search-mode-zen_actions = Actions
|
||||||
zen-site-data-settings = Asetukset
|
zen-site-data-settings = Settings
|
||||||
zen-generic-manage = Hallitse
|
zen-generic-manage = Manage
|
||||||
zen-generic-more = Lisää
|
zen-generic-more = More
|
||||||
zen-generic-next = Seuraava
|
zen-generic-next = Next
|
||||||
# These labels will be used for the site data panel settings
|
# These labels will be used for the site data panel settings
|
||||||
zen-site-data-setting-allow = Sallittu
|
zen-site-data-setting-allow = Allowed
|
||||||
zen-site-data-setting-block = Estetty
|
zen-site-data-setting-block = Blocked
|
||||||
zen-site-data-protections-enabled = Käytössä
|
zen-site-data-protections-enabled = Enabled
|
||||||
zen-site-data-protections-disabled = Pois käytöstä
|
zen-site-data-protections-disabled = Disabled
|
||||||
zen-site-data-setting-cross-site = Sivuston välinen eväste
|
zen-site-data-setting-cross-site = Cross-Site cookie
|
||||||
zen-site-data-security-info-extension =
|
zen-site-data-security-info-extension =
|
||||||
.label = Laajennus
|
.label = Extension
|
||||||
zen-site-data-security-info-secure =
|
zen-site-data-security-info-secure =
|
||||||
.label = Turvallinen
|
.label = Secure
|
||||||
zen-site-data-security-info-not-secure =
|
zen-site-data-security-info-not-secure =
|
||||||
.label = Ei turvallinen
|
.label = Not Secure
|
||||||
zen-site-data-manage-addons =
|
zen-site-data-manage-addons =
|
||||||
.label = Hallita Laajennuksia
|
.label = Manage Extensions
|
||||||
zen-site-data-get-addons =
|
zen-site-data-get-addons =
|
||||||
.label = Lisää Laajennuksia
|
.label = Add Extensions
|
||||||
zen-site-data-site-settings =
|
zen-site-data-site-settings =
|
||||||
.label = Kaikki Sivuston Asetukset
|
.label = All Site Settings
|
||||||
zen-site-data-header-share =
|
zen-site-data-header-share =
|
||||||
.tooltiptext = Jaa Tämä Sivu
|
.tooltiptext = Share This Page
|
||||||
zen-site-data-header-reader-mode =
|
zen-site-data-header-reader-mode =
|
||||||
.tooltiptext = Siirry lukutilaan
|
.tooltiptext = Enter Reader Mode
|
||||||
zen-site-data-header-screenshot =
|
zen-site-data-header-screenshot =
|
||||||
.tooltiptext = Ota kuvakaappaus
|
.tooltiptext = Take a Screenshot
|
||||||
zen-site-data-header-bookmark =
|
zen-site-data-header-bookmark =
|
||||||
.tooltiptext = Lisää Tämä Sivu Kirjanmerkkeihin
|
.tooltiptext = Bookmark This Page
|
||||||
zen-urlbar-copy-url-button =
|
zen-urlbar-copy-url-button =
|
||||||
.tooltiptext = Kopioi URL
|
.tooltiptext = Copy URL
|
||||||
zen-site-data-setting-site-protection = Seuranta Suojaus
|
zen-site-data-setting-site-protection = Tracking Protection
|
||||||
|
|
||||||
# Section: Feature callouts
|
# Section: Feature callouts
|
||||||
|
|
||||||
zen-site-data-panel-feature-callout-title = Uusi koti lisäosille, käyttöoikeuksille ja paljon muuta
|
zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
|
||||||
zen-site-data-panel-feature-callout-subtitle = Klikkaa kuvaketta hallitaksesi sivuston asetuksia, tarkastella tietoturvatietoja, käyttää laajennuksia ja suorittaa yhteisiä toimintoja.
|
zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
|
||||||
zen-open-link-in-glance =
|
zen-open-link-in-glance =
|
||||||
.label = Avaa linkki vilkaisussa
|
.label = Open Link in Glance
|
||||||
.accesskey = G
|
.accesskey = G
|
||||||
|
|||||||
@@ -11,29 +11,29 @@ zen-toolbar-context-compact-mode-enable =
|
|||||||
.label = Ota kompakti tila käyttöön
|
.label = Ota kompakti tila käyttöön
|
||||||
.accesskey = D
|
.accesskey = D
|
||||||
zen-toolbar-context-compact-mode-just-tabs =
|
zen-toolbar-context-compact-mode-just-tabs =
|
||||||
.label = Piilota sivupalkki
|
.label = Hide sidebar
|
||||||
zen-toolbar-context-compact-mode-just-toolbar =
|
zen-toolbar-context-compact-mode-just-toolbar =
|
||||||
.label = Piilota työkalupalkki
|
.label = Piilota työkalupalkki
|
||||||
zen-toolbar-context-compact-mode-hide-both =
|
zen-toolbar-context-compact-mode-hide-both =
|
||||||
.label = Piilota molemmat
|
.label = Piilota molemmat
|
||||||
.accesskey = H
|
.accesskey = H
|
||||||
zen-toolbar-context-new-folder =
|
zen-toolbar-context-new-folder =
|
||||||
.label = Uusi kansio
|
.label = New Folder
|
||||||
.accesskey = N
|
.accesskey = N
|
||||||
sidebar-zen-expand =
|
sidebar-zen-expand =
|
||||||
.label = Laajenna sivupalkkia
|
.label = Expand Sidebar
|
||||||
sidebar-zen-create-new =
|
sidebar-zen-create-new =
|
||||||
.label = Luo uusi...
|
.label = Create New...
|
||||||
tabbrowser-unload-tab-button =
|
tabbrowser-unload-tab-button =
|
||||||
.tooltiptext =
|
.tooltiptext =
|
||||||
{ $tabCount ->
|
{ $tabCount ->
|
||||||
[one] Pura ja vaihda välilehteen
|
[one] Unload and switch to tab
|
||||||
*[other] Pura { $tabCount } välilehdet ja vaihda ensimmäiseen
|
*[other] Unload { $tabCount } tabs and switch to the first
|
||||||
}
|
}
|
||||||
tabbrowser-reset-pin-button =
|
tabbrowser-reset-pin-button =
|
||||||
.tooltiptext =
|
.tooltiptext =
|
||||||
{ $tabCount ->
|
{ $tabCount ->
|
||||||
[one] Nollaa ja kiinnitä välilehti
|
[one] Reset and pin tab
|
||||||
*[other] Nollaa ja kiinnitä { $tabCount } välilehdet
|
*[other] Reset and pin { $tabCount } tabs
|
||||||
}
|
}
|
||||||
tab-reset-pin-label = Takaisin kiinnitettyyn URL-osoitteeseen
|
tab-reset-pin-label = Back to pinned url
|
||||||
|
|||||||
@@ -2,25 +2,25 @@
|
|||||||
# 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 = Tervetuloa
|
zen-welcome-title-line1 = Welcome to
|
||||||
zen-welcome-title-line2 = rauhellisempaan internettiin
|
zen-welcome-title-line2 = a calmer internet
|
||||||
zen-welcome-import-title = Tuore Aloitus, Samat Kirjanmerkit
|
zen-welcome-import-title = A Fresh Start, Same Bookmarks
|
||||||
zen-welcome-import-description-1 = Kirjanmerkit, historia ja salasanat ovat kuin polku leivänmurteita Internetin kautta - älä jätä niitä taakse!
|
zen-welcome-import-description-1 = Your bookmarks, history, and passwords are like a trail of breadcrumbs through the internet—don’t leave them behind!
|
||||||
zen-welcome-import-description-2 = Tuo ne helposti toisesta selaimesta ja jatka eteenpäin siitä, mihin jäit.
|
zen-welcome-import-description-2 = Easily bring them over from another browser and pick up right where you left off..
|
||||||
zen-welcome-import-button = Tuo nyt
|
zen-welcome-import-button = Import now
|
||||||
zen-welcome-set-default-browser = Aseta { -brand-short-name } oletusselaimeksi
|
zen-welcome-set-default-browser = Set { -brand-short-name } as your default browser
|
||||||
zen-welcome-dont-set-default-browser = ÄLÄ asettanut { -brand-short-name } oletusselaimeksi
|
zen-welcome-dont-set-default-browser = DON’T set { -brand-short-name } as your default browser
|
||||||
zen-welcome-initial-essentials-title = Tärkeimmät Välilehtesi, Aina Saavutuksen Sisällä
|
zen-welcome-initial-essentials-title = Your Key Tabs, Always Within Reach
|
||||||
zen-welcome-initial-essentials-description-1 = Pidä tärkeimmät välilehdet helposti saatavilla riippumatta siitä, kuinka monta olet avannut.
|
zen-welcome-initial-essentials-description-1 = Keep your most important tabs easily accessible and always at hand, no matter how many you open.
|
||||||
zen-welcome-initial-essentials-description-2 = Olennaiset välilehdet ovat aina näkyvissä, riippumatta siitä, missä työtilassa olet.
|
zen-welcome-initial-essentials-description-2 = Essential tabs are always visible, no matter what workspace you are in.
|
||||||
zen-welcome-workspace-colors-title = Sinun Työtilasi, Sinun Värisi
|
zen-welcome-workspace-colors-title = Your Workspaces, Your Colors
|
||||||
zen-welcome-workspace-colors-description = Mukauta selainta antamalla jokaiselle työtilalle oma väri-identiteetti.
|
zen-welcome-workspace-colors-description = Personalize your browser by giving each workspace its own unique color identity.
|
||||||
zen-welcome-start-browsing-title =
|
zen-welcome-start-browsing-title =
|
||||||
Kaikki asetettu?<br/>
|
All set?<br/>
|
||||||
Aletaan toimiin!
|
Let’s get rolling!
|
||||||
zen-welcome-start-browsing-description-1 = Kaikki on asetettu ja olet valmis menemään. Napsauta alla olevaa painiketta aloittaaksesi selailun { -brand-short-name } -sovelluksella.
|
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 = Sukella sisään!
|
zen-welcome-start-browsing = Dive in!
|
||||||
zen-welcome-default-search-title = Sinun Oletushakukone
|
zen-welcome-default-search-title = Your Default Search Engine
|
||||||
zen-welcome-default-search-description = Valitse oletushakukone. Voit aina muuttaa sitä myöhemmin!
|
zen-welcome-default-search-description = Choose your default search engine. You can always change it later!
|
||||||
zen-welcome-skip-button = Ohita
|
zen-welcome-skip-button = Skip
|
||||||
zen-welcome-finished = Zen on määritetty oikein!
|
zen-welcome-finished = Your Zen has been set up correctly!
|
||||||
|
|||||||
@@ -4,26 +4,26 @@
|
|||||||
|
|
||||||
zen-panel-ui-workspaces-text = Työtilat
|
zen-panel-ui-workspaces-text = Työtilat
|
||||||
zen-panel-ui-workspaces-create =
|
zen-panel-ui-workspaces-create =
|
||||||
.label = Luo työtila
|
.label = Create Space
|
||||||
zen-panel-ui-folder-create =
|
zen-panel-ui-folder-create =
|
||||||
.label = Luo kansio
|
.label = Create Folder
|
||||||
zen-panel-ui-new-empty-split =
|
zen-panel-ui-new-empty-split =
|
||||||
.label = Uusi Jako
|
.label = New Split
|
||||||
zen-workspaces-panel-context-delete =
|
zen-workspaces-panel-context-delete =
|
||||||
.label = Poista Työtila
|
.label = Poista Työtila
|
||||||
.accesskey = D
|
.accesskey = D
|
||||||
zen-workspaces-panel-change-name =
|
zen-workspaces-panel-change-name =
|
||||||
.label = Vaihda nimi
|
.label = Change Name
|
||||||
zen-workspaces-panel-change-icon =
|
zen-workspaces-panel-change-icon =
|
||||||
.label = Vaihda kuvake
|
.label = Change Icon
|
||||||
zen-workspaces-panel-context-default-profile =
|
zen-workspaces-panel-context-default-profile =
|
||||||
.label = Aseta Profiili
|
.label = Set Profile
|
||||||
zen-workspaces-panel-unload =
|
zen-workspaces-panel-unload =
|
||||||
.label = Poista Työtila
|
.label = Unload Space
|
||||||
zen-workspaces-how-to-reorder-title = Kuinka järjestää työtiloja
|
zen-workspaces-how-to-reorder-title = How to reorder spaces
|
||||||
zen-workspaces-how-to-reorder-desc = Vedä työtilan kuvakkeet sivupalkin alareunaan järjestääksesi ne uudelleen
|
zen-workspaces-how-to-reorder-desc = Drag the space icons at the bottom of the sidebar to reorder them
|
||||||
zen-workspaces-change-theme =
|
zen-workspaces-change-theme =
|
||||||
.label = Muokkaa teemaa
|
.label = Edit Theme
|
||||||
zen-workspaces-panel-context-open =
|
zen-workspaces-panel-context-open =
|
||||||
.label = Avaa Työtila
|
.label = Avaa Työtila
|
||||||
.accesskey = O
|
.accesskey = O
|
||||||
@@ -37,29 +37,29 @@ zen-bookmark-edit-panel-workspace-selector =
|
|||||||
.value = Työtilat
|
.value = Työtilat
|
||||||
.accesskey = W
|
.accesskey = W
|
||||||
zen-panel-ui-gradient-generator-algo-complementary =
|
zen-panel-ui-gradient-generator-algo-complementary =
|
||||||
.label = Täydentävä
|
.label = Complementary
|
||||||
zen-panel-ui-gradient-generator-algo-splitComplementary =
|
zen-panel-ui-gradient-generator-algo-splitComplementary =
|
||||||
.label = Jaa osiin
|
.label = Split
|
||||||
zen-panel-ui-gradient-generator-algo-analogous =
|
zen-panel-ui-gradient-generator-algo-analogous =
|
||||||
.label = Analoginen
|
.label = Analogous
|
||||||
zen-panel-ui-gradient-generator-algo-triadic =
|
zen-panel-ui-gradient-generator-algo-triadic =
|
||||||
.label = Triadiikki
|
.label = Triadic
|
||||||
zen-panel-ui-gradient-generator-algo-floating =
|
zen-panel-ui-gradient-generator-algo-floating =
|
||||||
.label = Kelluva
|
.label = Floating
|
||||||
zen-panel-ui-gradient-click-to-add = Klikkaa lisätäksesi väri
|
zen-panel-ui-gradient-click-to-add = Click to add a color
|
||||||
zen-workspace-creation-name =
|
zen-workspace-creation-name =
|
||||||
.placeholder = Työtilan nimi
|
.placeholder = Space Name
|
||||||
zen-workspaces-panel-context-reorder =
|
zen-workspaces-panel-context-reorder =
|
||||||
.label = Järjestä Työtilat Uudelleen
|
.label = Reorder Spaces
|
||||||
zen-workspace-creation-profile = Profiili
|
zen-workspace-creation-profile = Profile
|
||||||
.tooltiptext = Profiileja käytetään erottamaan evästeet ja sivustontiedot tiloihin.
|
.tooltiptext = Profiles are used to separate cookies and site data between spaces.
|
||||||
zen-workspace-creation-header = Luo työtila
|
zen-workspace-creation-header = Create a Space
|
||||||
zen-workspace-creation-label = Työtiloja käytetään järjestämään sinun välilehtiä ja istuntoja.
|
zen-workspace-creation-label = Spaces are used to organize your tabs and sessions.
|
||||||
zen-workspaces-delete-workspace-title = Poista Työtila?
|
zen-workspaces-delete-workspace-title = Delete Workspace?
|
||||||
zen-workspaces-delete-workspace-body = Oletko varma, että haluat poistaa { $name }? Tätä toimintoa ei voi peruuttaa.
|
zen-workspaces-delete-workspace-body = Are you sure you want to delete { $name }? This action cannot be undone.
|
||||||
# Note that the html tag MUST not be changed or removed, as it is used to better
|
# Note that the html tag MUST not be changed or removed, as it is used to better
|
||||||
# display the shortcut in the toast notification.
|
# display the shortcut in the toast notification.
|
||||||
zen-workspaces-close-all-unpinned-tabs-toast = Välilehdet suljettu! Peruuta toiminto käyttämällä <span>{ $shortcut }</span>.
|
zen-workspaces-close-all-unpinned-tabs-toast = Tabs Closed! Use <span>{ $shortcut }</span> to undo.
|
||||||
zen-workspaces-close-all-unpinned-tabs-title =
|
zen-workspaces-close-all-unpinned-tabs-title =
|
||||||
.label = Tyhjennä
|
.label = Clear
|
||||||
.tooltiptext = Sulje kaikki kiinnittämättömät välilehdet
|
.tooltiptext = Close all unpinned tabs
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ 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
|
.label = Ajouter aux Essentials ({ $num } / { $max } emplacements occupés)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } emplacements occupés
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Retirer des Essentials
|
.label = Retirer des Essentials
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Athshocraigh an Cluaisín Prionáilte
|
.label = Athshocraigh an Cluaisín Prionáilte
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Cuir leis na Bunriachtanais
|
.label = Cuir le Bunriachtanais ({ $num } / { $max } sliotán líonta)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } sliotán líonta
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Bain de na Bunriachtanais
|
.label = Bain de na Bunriachtanais
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = אפס כרטיסייה מוצמדת
|
.label = אפס כרטיסייה מוצמדת
|
||||||
.accesskey = ר
|
.accesskey = ר
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = הוסף לנחוצים ({ $num } / { $max } מקומות מלאים)
|
||||||
.accesskey = ק
|
.accesskey = ק
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = הסר מנחוצים
|
.label = הסר מנחוצים
|
||||||
.accesskey = ר
|
.accesskey = ר
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Kitűzött lap visszaállítása
|
.label = Kitűzött lap visszaállítása
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Felvétel az alapvetőkbe
|
.label = Felvétel az alapvetőkbe ({ $num } / { $max } hely foglalt)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } hely foglalt
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Eltávolítás az alapvetőkből
|
.label = Eltávolítás az alapvetőkből
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
@@ -96,5 +95,5 @@ zen-site-data-setting-site-protection = Nyomkövetés védelem
|
|||||||
zen-site-data-panel-feature-callout-title = Új hely az add-onok, engedélyek és egyéb elemek számára
|
zen-site-data-panel-feature-callout-title = Új hely az add-onok, engedélyek és egyéb elemek számára
|
||||||
zen-site-data-panel-feature-callout-subtitle = Kattints az ikonra a webhely beállításainak kezeléséhez, a biztonsági információk megtekintéséhez, a kiegészítők eléréséhez és a gyakori műveletek végrehajtásához.
|
zen-site-data-panel-feature-callout-subtitle = Kattints az ikonra a webhely beállításainak kezeléséhez, a biztonsági információk megtekintéséhez, a kiegészítők eléréséhez és a gyakori műveletek végrehajtásához.
|
||||||
zen-open-link-in-glance =
|
zen-open-link-in-glance =
|
||||||
.label = Hivatkozás megnyitása a bepillantóban
|
.label = Link megnyitása a bepillantóban
|
||||||
.accesskey = G
|
.accesskey = G
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ tab-zen-split-tabs =
|
|||||||
}
|
}
|
||||||
.accesskey = S
|
.accesskey = S
|
||||||
zen-split-link =
|
zen-split-link =
|
||||||
.label = Hivatkozás felosztása új lapban
|
.label = Link felosztása új lapban
|
||||||
.accesskey = S
|
.accesskey = S
|
||||||
zen-split-view-modifier-header = Osztott nézet
|
zen-split-view-modifier-header = Osztott nézet
|
||||||
zen-split-view-modifier-activate-reallocation =
|
zen-split-view-modifier-activate-reallocation =
|
||||||
|
|||||||
@@ -45,9 +45,9 @@ pane-settings-workspaces-title = Ruang Kerja
|
|||||||
zen-tabs-unloader-enabled =
|
zen-tabs-unloader-enabled =
|
||||||
.label = Aktifkan Pelepas Tab
|
.label = Aktifkan Pelepas Tab
|
||||||
zen-tabs-close-on-back-with-no-history =
|
zen-tabs-close-on-back-with-no-history =
|
||||||
.label = Tutup tab dan beralih ke tab pemiliknya (atau tab yang terakhir digunakan) saat kembali tanpa riwayat
|
.label = Close tab and switch to its owner tab (or most recently used tab) when going back with no history
|
||||||
zen-tabs-cycle-by-attribute =
|
zen-tabs-cycle-by-attribute =
|
||||||
.label = Ctrl+Tab berputar hanya dalam tab Esensial atau Ruang Kerja
|
.label = Ctrl+Tab cycles within Essential or Workspace tabs only
|
||||||
zen-tabs-cycle-ignore-pending-tabs =
|
zen-tabs-cycle-ignore-pending-tabs =
|
||||||
.label = Ignore Pending tabs when cycling with Ctrl+Tab
|
.label = Ignore Pending tabs when cycling with Ctrl+Tab
|
||||||
zen-tabs-cycle-by-attribute-warning = Ctrl+Tab will cycle by recently used order, as it is enabled
|
zen-tabs-cycle-by-attribute-warning = Ctrl+Tab will cycle by recently used order, as it is enabled
|
||||||
@@ -311,4 +311,4 @@ zen-devtools-toggle-performance-shortcut = Ubah Performance
|
|||||||
zen-devtools-toggle-storage-shortcut = Ubah Penyimpanan
|
zen-devtools-toggle-storage-shortcut = Ubah Penyimpanan
|
||||||
zen-devtools-toggle-dom-shortcut = Ubah DOM
|
zen-devtools-toggle-dom-shortcut = Ubah DOM
|
||||||
zen-devtools-toggle-accessibility-shortcut = Ubah Aksesibilitas
|
zen-devtools-toggle-accessibility-shortcut = Ubah Aksesibilitas
|
||||||
zen-close-all-unpinned-tabs-shortcut = Tutup Semua Tab yang Tidak Disematkan
|
zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Kembalikan ke URL Awal
|
.label = Kembalikan ke URL Awal
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Tambahkan ke Essentials
|
.label = Tambahkan ke Essentials ({ $num } / { $max } slot terisi)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slot terisi
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Hapus dari Essentials
|
.label = Hapus dari Essentials
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
@@ -96,5 +95,5 @@ zen-site-data-setting-site-protection = Perlindungan Pelacakan
|
|||||||
zen-site-data-panel-feature-callout-title = Rumah baru untuk add-on, izin, dan lainnya
|
zen-site-data-panel-feature-callout-title = Rumah baru untuk add-on, izin, dan lainnya
|
||||||
zen-site-data-panel-feature-callout-subtitle = Klik ikon untuk mengelola pengaturan situs, melihat info keamanan, mengakses ekstensi, dan melakukan tindakan umum.
|
zen-site-data-panel-feature-callout-subtitle = Klik ikon untuk mengelola pengaturan situs, melihat info keamanan, mengakses ekstensi, dan melakukan tindakan umum.
|
||||||
zen-open-link-in-glance =
|
zen-open-link-in-glance =
|
||||||
.label = Buka Tautan di Glance
|
.label = Open Link in Glance
|
||||||
.accesskey = G
|
.accesskey = G
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ zen-workspaces-delete-workspace-title = Delete Workspace?
|
|||||||
zen-workspaces-delete-workspace-body = Apakah Anda yakin ingin menghapus { $name }? Tindakan ini tidak bisa dibatalkan.
|
zen-workspaces-delete-workspace-body = Apakah Anda yakin ingin menghapus { $name }? Tindakan ini tidak bisa dibatalkan.
|
||||||
# Note that the html tag MUST not be changed or removed, as it is used to better
|
# Note that the html tag MUST not be changed or removed, as it is used to better
|
||||||
# display the shortcut in the toast notification.
|
# display the shortcut in the toast notification.
|
||||||
zen-workspaces-close-all-unpinned-tabs-toast = Tab Ditutup! Gunakan <span>{ $shortcut }</span> untuk membatalkan.
|
zen-workspaces-close-all-unpinned-tabs-toast = Tabs Closed! Use <span>{ $shortcut }</span> to undo.
|
||||||
zen-workspaces-close-all-unpinned-tabs-title =
|
zen-workspaces-close-all-unpinned-tabs-title =
|
||||||
.label = Bersihkan
|
.label = Clear
|
||||||
.tooltiptext = Tutup semua tab yang tidak disematkan
|
.tooltiptext = Close all unpinned tabs
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Endursetja Festan Flipa
|
.label = Endursetja Festan Flipa
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Add to Essentials ({ $num } / { $max } slots filled)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Fjarlægja frá Höfuðatriði
|
.label = Fjarlægja frá Höfuðatriði
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Reimposta scheda fissata
|
.label = Reimposta scheda fissata
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Aggiungi a Essenziali ({ $num } / { $max } slot riempiti)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Rimuovi dagli Essenziali
|
.label = Rimuovi dagli Essenziali
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = ピン留めされたタブをリセット
|
.label = ピン留めされたタブをリセット
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Add to Essentials ({ $num } / { $max } slots filled)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Essentialsから削除
|
.label = Essentialsから削除
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = 고정된 탭 초기화
|
.label = 고정된 탭 초기화
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = 에센셜에 추가
|
.label = 에센셜에 추가 ({ $num } / { $max } 개 추가됨)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max }개 추가됨
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = 에센셜에서 제거하기
|
.label = 에센셜에서 제거하기
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Atkurti prisegtą kortelę
|
.label = Atkurti prisegtą kortelę
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Įtraukti į būtiniausius ({ $num } / { $max } užpildytų vietų)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Šalinti iš būtiniausių
|
.label = Šalinti iš būtiniausių
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Vastgezette tabblad resetten
|
.label = Vastgezette tabblad resetten
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Toevoegen aan Essentials ({ $num } / { $max } plekken gevuld)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Verwijderen uit Essentials
|
.label = Verwijderen uit Essentials
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Reset Pinned Tab
|
.label = Reset Pinned Tab
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Add to Essentials ({ $num } / { $max } slots filled)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Remove from Essentials
|
.label = Remove from Essentials
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Resetuj przypiętą kartę
|
.label = Resetuj przypiętą kartę
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Dodaj do Niezbędnych ({ $num } / { $max } miejsc wypełnione)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Usuń z Niezbędnych
|
.label = Usuń z Niezbędnych
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Redefinir Guia Fixada
|
.label = Redefinir Guia Fixada
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Adicionar aos Essenciais ({ $num } / { $max } espaços preenchidos)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Remover dos Essenciais
|
.label = Remover dos Essenciais
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Repor o Separador Fixado
|
.label = Repor o Separador Fixado
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Adicionar aos Essenciais ({ $num } / { $max } espaços preenchidos)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Remover dos Essenciais
|
.label = Remover dos Essenciais
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Сбросить закреплённую вкладку
|
.label = Сбросить закреплённую вкладку
|
||||||
.accesskey = К
|
.accesskey = К
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Добавить в важное ({ $num } из { $max } слотов занято)
|
||||||
.accesskey = У
|
.accesskey = У
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Удалить из важного
|
.label = Удалить из важного
|
||||||
.accesskey = К
|
.accesskey = К
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Återställ Fäst flik
|
.label = Återställ Fäst flik
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Lägg till Essentials ({ $num } / { $max } platser fyllda)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Ta bort från Essentials
|
.label = Ta bort från Essentials
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Reset Pinned Tab
|
.label = Reset Pinned Tab
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Add to Essentials ({ $num } / { $max } slots filled)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Remove from Essentials
|
.label = Remove from Essentials
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Sabitlenen Sekmeyi Sıfırla
|
.label = Sabitlenen Sekmeyi Sıfırla
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Add to Essentials ({ $num } / { $max } slots filled)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Temel Ögelerden Kaldır
|
.label = Temel Ögelerden Kaldır
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Скинути прикріплену вкладку
|
.label = Скинути прикріплену вкладку
|
||||||
.accesskey = Р
|
.accesskey = Р
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Додати до необхідного
|
.label = Додати до Основного ({ $num } / { $max } комірок заповнено)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } комірок заповнено
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Вилучити з основних елементів
|
.label = Вилучити з основних елементів
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = Đặt lại thẻ đã ghim
|
.label = Đặt lại thẻ đã ghim
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Thêm thẻ vào thường trú (đã thêm { $num } / { $max } )
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = Loại ra khỏi thẻ thường trú
|
.label = Loại ra khỏi thẻ thường trú
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = 重置固定标签页
|
.label = 重置固定标签页
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = 添加到常驻标签页(已使用 { $num } / { $max })
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = 从常驻标签页中移除
|
.label = 从常驻标签页中移除
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -8,9 +8,8 @@ tab-context-zen-reset-pinned-tab =
|
|||||||
.label = 重置釘選的分頁
|
.label = 重置釘選的分頁
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
tab-context-zen-add-essential =
|
tab-context-zen-add-essential =
|
||||||
.label = Add to Essentials
|
.label = Add to Essentials ({ $num } / { $max } slots filled)
|
||||||
.accesskey = E
|
.accesskey = E
|
||||||
tab-context-zen-add-essential-badge = { $num } / { $max } slots filled
|
|
||||||
tab-context-zen-remove-essential =
|
tab-context-zen-remove-essential =
|
||||||
.label = 從 Essentials 中移除
|
.label = 從 Essentials 中移除
|
||||||
.accesskey = R
|
.accesskey = R
|
||||||
|
|||||||
@@ -36,7 +36,7 @@
|
|||||||
value: '@IS_TWILIGHT@'
|
value: '@IS_TWILIGHT@'
|
||||||
|
|
||||||
- name: zen.theme.hide-unified-extensions-button
|
- name: zen.theme.hide-unified-extensions-button
|
||||||
value: true
|
value: false
|
||||||
|
|
||||||
# ==== Mark: border radius ====
|
# ==== Mark: border radius ====
|
||||||
|
|
||||||
|
|||||||
@@ -43,8 +43,11 @@
|
|||||||
- name: zen.view.drag-and-drop.move-over-threshold
|
- name: zen.view.drag-and-drop.move-over-threshold
|
||||||
value: 70
|
value: 70
|
||||||
|
|
||||||
- name: zen.view.drag-and-drop.edge-zone-threshold
|
- name: zen.view.drag-and-drop.drop-inside-upper-threshold
|
||||||
value: 25
|
value: 80
|
||||||
|
|
||||||
|
- name: zen.view.drag-and-drop.drop-inside-lower-threshold
|
||||||
|
value: 30
|
||||||
|
|
||||||
- name: zen.view.context-menu.refresh
|
- name: zen.view.context-menu.refresh
|
||||||
value: false
|
value: false
|
||||||
@@ -57,6 +60,3 @@
|
|||||||
|
|
||||||
- name: zen.view.show-clear-tabs-button
|
- name: zen.view.show-clear-tabs-button
|
||||||
value: true
|
value: true
|
||||||
|
|
||||||
- name: zen.view.draggable-sidebar
|
|
||||||
value: true
|
|
||||||
|
|||||||
@@ -48,7 +48,6 @@
|
|||||||
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenFolders.mjs"></script>
|
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenFolders.mjs"></script>
|
||||||
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenMods.mjs"></script>
|
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenMods.mjs"></script>
|
||||||
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenCompactMode.mjs"></script>
|
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenCompactMode.mjs"></script>
|
||||||
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenPinnedTabsStorage.mjs"></script>
|
|
||||||
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenWorkspacesStorage.mjs"></script>
|
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenWorkspacesStorage.mjs"></script>
|
||||||
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenPinnedTabManager.mjs"></script>
|
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenPinnedTabManager.mjs"></script>
|
||||||
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenGradientGenerator.mjs"></script>
|
<script type="text/javascript" src="chrome://browser/content/zen-components/ZenGradientGenerator.mjs"></script>
|
||||||
|
|||||||
@@ -8,11 +8,12 @@
|
|||||||
content/browser/zen-sets.js (../../zen/common/zen-sets.js)
|
content/browser/zen-sets.js (../../zen/common/zen-sets.js)
|
||||||
content/browser/ZenUIManager.mjs (../../zen/common/ZenUIManager.mjs)
|
content/browser/ZenUIManager.mjs (../../zen/common/ZenUIManager.mjs)
|
||||||
content/browser/zen-components/ZenCommonUtils.mjs (../../zen/common/ZenCommonUtils.mjs)
|
content/browser/zen-components/ZenCommonUtils.mjs (../../zen/common/ZenCommonUtils.mjs)
|
||||||
content/browser/zen-components/ZenSessionStore.mjs (../../zen/common/ZenSessionStore.mjs)
|
|
||||||
content/browser/zen-components/ZenEmojisData.min.mjs (../../zen/common/emojis/ZenEmojisData.min.mjs)
|
content/browser/zen-components/ZenEmojisData.min.mjs (../../zen/common/emojis/ZenEmojisData.min.mjs)
|
||||||
content/browser/zen-components/ZenEmojiPicker.mjs (../../zen/common/emojis/ZenEmojiPicker.mjs)
|
content/browser/zen-components/ZenEmojiPicker.mjs (../../zen/common/emojis/ZenEmojiPicker.mjs)
|
||||||
content/browser/zen-components/ZenHasPolyfill.mjs (../../zen/common/ZenHasPolyfill.mjs)
|
content/browser/zen-components/ZenHasPolyfill.mjs (../../zen/common/ZenHasPolyfill.mjs)
|
||||||
|
|
||||||
|
content/browser/zen-components/ZenSessionStore.mjs (../../zen/sessionstore/ZenSessionStore.mjs)
|
||||||
|
|
||||||
* content/browser/zen-styles/zen-theme.css (../../zen/common/styles/zen-theme.css)
|
* content/browser/zen-styles/zen-theme.css (../../zen/common/styles/zen-theme.css)
|
||||||
content/browser/zen-styles/zen-buttons.css (../../zen/common/styles/zen-buttons.css)
|
content/browser/zen-styles/zen-buttons.css (../../zen/common/styles/zen-buttons.css)
|
||||||
content/browser/zen-styles/zen-browser-ui.css (../../zen/common/styles/zen-browser-ui.css)
|
content/browser/zen-styles/zen-browser-ui.css (../../zen/common/styles/zen-browser-ui.css)
|
||||||
@@ -50,7 +51,6 @@
|
|||||||
|
|
||||||
content/browser/zen-components/ZenKeyboardShortcuts.mjs (../../zen/kbs/ZenKeyboardShortcuts.mjs)
|
content/browser/zen-components/ZenKeyboardShortcuts.mjs (../../zen/kbs/ZenKeyboardShortcuts.mjs)
|
||||||
|
|
||||||
content/browser/zen-components/ZenPinnedTabsStorage.mjs (../../zen/tabs/ZenPinnedTabsStorage.mjs)
|
|
||||||
content/browser/zen-components/ZenPinnedTabManager.mjs (../../zen/tabs/ZenPinnedTabManager.mjs)
|
content/browser/zen-components/ZenPinnedTabManager.mjs (../../zen/tabs/ZenPinnedTabManager.mjs)
|
||||||
* content/browser/zen-styles/zen-tabs.css (../../zen/tabs/zen-tabs.css)
|
* content/browser/zen-styles/zen-tabs.css (../../zen/tabs/zen-tabs.css)
|
||||||
content/browser/zen-styles/zen-tabs/vertical-tabs.css (../../zen/tabs/zen-tabs/vertical-tabs.css)
|
content/browser/zen-styles/zen-tabs/vertical-tabs.css (../../zen/tabs/zen-tabs/vertical-tabs.css)
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
diff --git a/browser/components/sessionstore/SessionFile.sys.mjs b/browser/components/sessionstore/SessionFile.sys.mjs
|
||||||
|
index 31140cb8be3b529a0952ca8dc55165690b0e2120..605c9e0aa84da0a2d3171a0573e8cd95e27bd0c4 100644
|
||||||
|
--- a/browser/components/sessionstore/SessionFile.sys.mjs
|
||||||
|
+++ b/browser/components/sessionstore/SessionFile.sys.mjs
|
||||||
|
@@ -22,6 +22,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
|
||||||
|
RunState: "resource:///modules/sessionstore/RunState.sys.mjs",
|
||||||
|
SessionStore: "resource:///modules/sessionstore/SessionStore.sys.mjs",
|
||||||
|
SessionWriter: "resource:///modules/sessionstore/SessionWriter.sys.mjs",
|
||||||
|
+ ZenSessionStore: "resource:///modules/zen/ZenSessionManager.sys.mjs",
|
||||||
|
});
|
||||||
|
|
||||||
|
const PREF_UPGRADE_BACKUP = "browser.sessionstore.upgradeBackup.latestBuildID";
|
||||||
|
@@ -380,7 +381,7 @@ var SessionFileInternal = {
|
||||||
|
this._readOrigin = result.origin;
|
||||||
|
|
||||||
|
result.noFilesFound = noFilesFound;
|
||||||
|
-
|
||||||
|
+ await lazy.ZenSessionStore.readFile();
|
||||||
|
return result;
|
||||||
|
},
|
||||||
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
diff --git a/browser/components/sessionstore/SessionStartup.sys.mjs b/browser/components/sessionstore/SessionStartup.sys.mjs
|
||||||
|
index be23213ae9ec7e59358a17276c6c3764d38d9996..ca5a8ccc916ceeab5140f1278d15233cefbe5815 100644
|
||||||
|
--- a/browser/components/sessionstore/SessionStartup.sys.mjs
|
||||||
|
+++ b/browser/components/sessionstore/SessionStartup.sys.mjs
|
||||||
|
@@ -40,6 +40,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
|
||||||
|
StartupPerformance:
|
||||||
|
"resource:///modules/sessionstore/StartupPerformance.sys.mjs",
|
||||||
|
sessionStoreLogger: "resource:///modules/sessionstore/SessionLogger.sys.mjs",
|
||||||
|
+ ZenSessionStore: "resource:///modules/zen/ZenSessionManager.sys.mjs",
|
||||||
|
});
|
||||||
|
|
||||||
|
const STATE_RUNNING_STR = "running";
|
||||||
|
@@ -179,6 +180,8 @@ export var SessionStartup = {
|
||||||
|
this._initialState = parsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ lazy.ZenSessionStore.onFileRead(this._initialState);
|
||||||
|
+
|
||||||
|
if (this._initialState == null) {
|
||||||
|
// No valid session found.
|
||||||
|
this._sessionType = this.NO_SESSION;
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs
|
diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs
|
||||||
index 1cdbc0f41bf5b55dfbbd850cb618c6d870f7a261..4eac2fed26d779908107ef60f1c2bd0eeba2381c 100644
|
index 1cdbc0f41bf5b55dfbbd850cb618c6d870f7a261..ad80ed937f696ba2800e62dfc11fcfb90e3f1092 100644
|
||||||
--- a/browser/components/sessionstore/SessionStore.sys.mjs
|
--- a/browser/components/sessionstore/SessionStore.sys.mjs
|
||||||
+++ b/browser/components/sessionstore/SessionStore.sys.mjs
|
+++ b/browser/components/sessionstore/SessionStore.sys.mjs
|
||||||
@@ -127,6 +127,8 @@ const TAB_EVENTS = [
|
@@ -127,6 +127,8 @@ const TAB_EVENTS = [
|
||||||
@@ -11,7 +11,15 @@ index 1cdbc0f41bf5b55dfbbd850cb618c6d870f7a261..4eac2fed26d779908107ef60f1c2bd0e
|
|||||||
];
|
];
|
||||||
|
|
||||||
const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
|
const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
|
||||||
@@ -1911,6 +1913,8 @@ var SessionStoreInternal = {
|
@@ -196,6 +198,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
|
||||||
|
TabStateCache: "resource:///modules/sessionstore/TabStateCache.sys.mjs",
|
||||||
|
TabStateFlusher: "resource:///modules/sessionstore/TabStateFlusher.sys.mjs",
|
||||||
|
setTimeout: "resource://gre/modules/Timer.sys.mjs",
|
||||||
|
+ ZenSessionStore: "resource:///modules/zen/ZenSessionManager.sys.mjs",
|
||||||
|
});
|
||||||
|
|
||||||
|
ChromeUtils.defineLazyGetter(lazy, "blankURI", () => {
|
||||||
|
@@ -1911,6 +1914,8 @@ var SessionStoreInternal = {
|
||||||
case "TabPinned":
|
case "TabPinned":
|
||||||
case "TabUnpinned":
|
case "TabUnpinned":
|
||||||
case "SwapDocShells":
|
case "SwapDocShells":
|
||||||
@@ -20,7 +28,7 @@ index 1cdbc0f41bf5b55dfbbd850cb618c6d870f7a261..4eac2fed26d779908107ef60f1c2bd0e
|
|||||||
this.saveStateDelayed(win);
|
this.saveStateDelayed(win);
|
||||||
break;
|
break;
|
||||||
case "TabGroupCreate":
|
case "TabGroupCreate":
|
||||||
@@ -2151,7 +2155,6 @@ var SessionStoreInternal = {
|
@@ -2151,7 +2156,6 @@ var SessionStoreInternal = {
|
||||||
if (closedWindowState) {
|
if (closedWindowState) {
|
||||||
let newWindowState;
|
let newWindowState;
|
||||||
if (
|
if (
|
||||||
@@ -28,7 +36,17 @@ index 1cdbc0f41bf5b55dfbbd850cb618c6d870f7a261..4eac2fed26d779908107ef60f1c2bd0e
|
|||||||
!lazy.SessionStartup.willRestore()
|
!lazy.SessionStartup.willRestore()
|
||||||
) {
|
) {
|
||||||
// We want to split the window up into pinned tabs and unpinned tabs.
|
// We want to split the window up into pinned tabs and unpinned tabs.
|
||||||
@@ -2384,11 +2387,9 @@ var SessionStoreInternal = {
|
@@ -2215,6 +2219,9 @@ var SessionStoreInternal = {
|
||||||
|
});
|
||||||
|
this._shouldRestoreLastSession = false;
|
||||||
|
}
|
||||||
|
+ else if (!aInitialState && isRegularWindow) {
|
||||||
|
+ lazy.ZenSessionStore.restoreNewWindow(aWindow, this);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (this._restoreLastWindow && aWindow.toolbar.visible) {
|
||||||
|
// always reset (if not a popup window)
|
||||||
|
@@ -2384,11 +2391,9 @@ var SessionStoreInternal = {
|
||||||
tabbrowser.selectedTab.label;
|
tabbrowser.selectedTab.label;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,7 +58,7 @@ index 1cdbc0f41bf5b55dfbbd850cb618c6d870f7a261..4eac2fed26d779908107ef60f1c2bd0e
|
|||||||
|
|
||||||
// Store the window's close date to figure out when each individual tab
|
// Store the window's close date to figure out when each individual tab
|
||||||
// was closed. This timestamp should allow re-arranging data based on how
|
// was closed. This timestamp should allow re-arranging data based on how
|
||||||
@@ -3373,7 +3374,7 @@ var SessionStoreInternal = {
|
@@ -3373,7 +3378,7 @@ var SessionStoreInternal = {
|
||||||
if (!isPrivateWindow && tabState.isPrivate) {
|
if (!isPrivateWindow && tabState.isPrivate) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -49,7 +67,7 @@ index 1cdbc0f41bf5b55dfbbd850cb618c6d870f7a261..4eac2fed26d779908107ef60f1c2bd0e
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4089,6 +4090,12 @@ var SessionStoreInternal = {
|
@@ -4089,6 +4094,11 @@ var SessionStoreInternal = {
|
||||||
Math.min(tabState.index, tabState.entries.length)
|
Math.min(tabState.index, tabState.entries.length)
|
||||||
);
|
);
|
||||||
tabState.pinned = false;
|
tabState.pinned = false;
|
||||||
@@ -58,11 +76,10 @@ index 1cdbc0f41bf5b55dfbbd850cb618c6d870f7a261..4eac2fed26d779908107ef60f1c2bd0e
|
|||||||
+ tabState.zenIsGlance = false;
|
+ tabState.zenIsGlance = false;
|
||||||
+ tabState.zenGlanceId = null;
|
+ tabState.zenGlanceId = null;
|
||||||
+ tabState.zenHasStaticLabel = false;
|
+ tabState.zenHasStaticLabel = false;
|
||||||
+ tabState.zenWorkspace = aWindow.gZenWorkspaces.activeWorkspace;
|
|
||||||
|
|
||||||
if (inBackground === false) {
|
if (inBackground === false) {
|
||||||
aWindow.gBrowser.selectedTab = newTab;
|
aWindow.gBrowser.selectedTab = newTab;
|
||||||
@@ -4525,6 +4532,7 @@ var SessionStoreInternal = {
|
@@ -4525,6 +4535,7 @@ var SessionStoreInternal = {
|
||||||
// Append the tab if we're opening into a different window,
|
// Append the tab if we're opening into a different window,
|
||||||
tabIndex: aSource == aTargetWindow ? pos : Infinity,
|
tabIndex: aSource == aTargetWindow ? pos : Infinity,
|
||||||
pinned: state.pinned,
|
pinned: state.pinned,
|
||||||
@@ -70,7 +87,7 @@ index 1cdbc0f41bf5b55dfbbd850cb618c6d870f7a261..4eac2fed26d779908107ef60f1c2bd0e
|
|||||||
userContextId: state.userContextId,
|
userContextId: state.userContextId,
|
||||||
skipLoad: true,
|
skipLoad: true,
|
||||||
preferredRemoteType,
|
preferredRemoteType,
|
||||||
@@ -5374,7 +5382,7 @@ var SessionStoreInternal = {
|
@@ -5374,7 +5385,7 @@ var SessionStoreInternal = {
|
||||||
|
|
||||||
for (let i = tabbrowser.pinnedTabCount; i < tabbrowser.tabs.length; i++) {
|
for (let i = tabbrowser.pinnedTabCount; i < tabbrowser.tabs.length; i++) {
|
||||||
let tab = tabbrowser.tabs[i];
|
let tab = tabbrowser.tabs[i];
|
||||||
@@ -79,7 +96,7 @@ index 1cdbc0f41bf5b55dfbbd850cb618c6d870f7a261..4eac2fed26d779908107ef60f1c2bd0e
|
|||||||
removableTabs.push(tab);
|
removableTabs.push(tab);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -5434,7 +5442,7 @@ var SessionStoreInternal = {
|
@@ -5434,7 +5445,7 @@ var SessionStoreInternal = {
|
||||||
}
|
}
|
||||||
|
|
||||||
let workspaceID = aWindow.getWorkspaceID();
|
let workspaceID = aWindow.getWorkspaceID();
|
||||||
@@ -88,7 +105,7 @@ index 1cdbc0f41bf5b55dfbbd850cb618c6d870f7a261..4eac2fed26d779908107ef60f1c2bd0e
|
|||||||
winData.workspaceID = workspaceID;
|
winData.workspaceID = workspaceID;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -5625,11 +5633,12 @@ var SessionStoreInternal = {
|
@@ -5625,11 +5636,12 @@ var SessionStoreInternal = {
|
||||||
}
|
}
|
||||||
|
|
||||||
let tabbrowser = aWindow.gBrowser;
|
let tabbrowser = aWindow.gBrowser;
|
||||||
@@ -102,7 +119,7 @@ index 1cdbc0f41bf5b55dfbbd850cb618c6d870f7a261..4eac2fed26d779908107ef60f1c2bd0e
|
|||||||
// update the internal state data for this window
|
// update the internal state data for this window
|
||||||
for (let tab of tabs) {
|
for (let tab of tabs) {
|
||||||
if (tab == aWindow.FirefoxViewHandler.tab) {
|
if (tab == aWindow.FirefoxViewHandler.tab) {
|
||||||
@@ -5640,6 +5649,7 @@ var SessionStoreInternal = {
|
@@ -5640,6 +5652,7 @@ var SessionStoreInternal = {
|
||||||
tabsData.push(tabData);
|
tabsData.push(tabData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,7 +127,7 @@ index 1cdbc0f41bf5b55dfbbd850cb618c6d870f7a261..4eac2fed26d779908107ef60f1c2bd0e
|
|||||||
// update tab group state for this window
|
// update tab group state for this window
|
||||||
winData.groups = [];
|
winData.groups = [];
|
||||||
for (let tabGroup of aWindow.gBrowser.tabGroups) {
|
for (let tabGroup of aWindow.gBrowser.tabGroups) {
|
||||||
@@ -5652,7 +5662,7 @@ var SessionStoreInternal = {
|
@@ -5652,7 +5665,7 @@ var SessionStoreInternal = {
|
||||||
// a window is closed, point to the first item in the tab strip instead (it will never be the Firefox View tab,
|
// a window is closed, point to the first item in the tab strip instead (it will never be the Firefox View tab,
|
||||||
// since it's only inserted into the tab strip after it's selected).
|
// since it's only inserted into the tab strip after it's selected).
|
||||||
if (aWindow.FirefoxViewHandler.tab?.selected) {
|
if (aWindow.FirefoxViewHandler.tab?.selected) {
|
||||||
@@ -119,7 +136,7 @@ index 1cdbc0f41bf5b55dfbbd850cb618c6d870f7a261..4eac2fed26d779908107ef60f1c2bd0e
|
|||||||
winData.title = tabbrowser.tabs[0].label;
|
winData.title = tabbrowser.tabs[0].label;
|
||||||
}
|
}
|
||||||
winData.selected = selectedIndex;
|
winData.selected = selectedIndex;
|
||||||
@@ -5764,8 +5774,8 @@ var SessionStoreInternal = {
|
@@ -5764,8 +5777,8 @@ var SessionStoreInternal = {
|
||||||
// selectTab represents.
|
// selectTab represents.
|
||||||
let selectTab = 0;
|
let selectTab = 0;
|
||||||
if (overwriteTabs) {
|
if (overwriteTabs) {
|
||||||
@@ -130,7 +147,7 @@ index 1cdbc0f41bf5b55dfbbd850cb618c6d870f7a261..4eac2fed26d779908107ef60f1c2bd0e
|
|||||||
selectTab = Math.min(selectTab, winData.tabs.length);
|
selectTab = Math.min(selectTab, winData.tabs.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5808,6 +5818,8 @@ var SessionStoreInternal = {
|
@@ -5808,6 +5821,8 @@ var SessionStoreInternal = {
|
||||||
winData.tabs,
|
winData.tabs,
|
||||||
winData.groups ?? []
|
winData.groups ?? []
|
||||||
);
|
);
|
||||||
@@ -139,7 +156,7 @@ index 1cdbc0f41bf5b55dfbbd850cb618c6d870f7a261..4eac2fed26d779908107ef60f1c2bd0e
|
|||||||
this._log.debug(
|
this._log.debug(
|
||||||
`restoreWindow, createTabsForSessionRestore returned ${tabs.length} tabs`
|
`restoreWindow, createTabsForSessionRestore returned ${tabs.length} tabs`
|
||||||
);
|
);
|
||||||
@@ -6371,6 +6383,25 @@ var SessionStoreInternal = {
|
@@ -6371,6 +6386,25 @@ var SessionStoreInternal = {
|
||||||
|
|
||||||
// Most of tabData has been restored, now continue with restoring
|
// Most of tabData has been restored, now continue with restoring
|
||||||
// attributes that may trigger external events.
|
// attributes that may trigger external events.
|
||||||
@@ -153,8 +170,8 @@ index 1cdbc0f41bf5b55dfbbd850cb618c6d870f7a261..4eac2fed26d779908107ef60f1c2bd0e
|
|||||||
+ if (tabData.zenHasStaticLabel) {
|
+ if (tabData.zenHasStaticLabel) {
|
||||||
+ tab.setAttribute("zen-has-static-label", "true");
|
+ tab.setAttribute("zen-has-static-label", "true");
|
||||||
+ }
|
+ }
|
||||||
+ if (tabData.zenPinnedId) {
|
+ if (tabData.zenSyncId) {
|
||||||
+ tab.setAttribute("zen-pin-id", tabData.zenPinnedId);
|
+ tab.setAttribute("zen-sync-id", tabData.zenSyncId);
|
||||||
+ }
|
+ }
|
||||||
+ if (tabData.zenDefaultUserContextId) {
|
+ if (tabData.zenDefaultUserContextId) {
|
||||||
+ tab.setAttribute("zenDefaultUserContextId", true);
|
+ tab.setAttribute("zenDefaultUserContextId", true);
|
||||||
@@ -165,7 +182,7 @@ index 1cdbc0f41bf5b55dfbbd850cb618c6d870f7a261..4eac2fed26d779908107ef60f1c2bd0e
|
|||||||
|
|
||||||
if (tabData.pinned) {
|
if (tabData.pinned) {
|
||||||
tabbrowser.pinTab(tab);
|
tabbrowser.pinTab(tab);
|
||||||
@@ -7289,7 +7320,7 @@ var SessionStoreInternal = {
|
@@ -7289,7 +7323,7 @@ var SessionStoreInternal = {
|
||||||
|
|
||||||
let groupsToSave = new Map();
|
let groupsToSave = new Map();
|
||||||
for (let tIndex = 0; tIndex < window.tabs.length; ) {
|
for (let tIndex = 0; tIndex < window.tabs.length; ) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
diff --git a/browser/components/sessionstore/TabState.sys.mjs b/browser/components/sessionstore/TabState.sys.mjs
|
diff --git a/browser/components/sessionstore/TabState.sys.mjs b/browser/components/sessionstore/TabState.sys.mjs
|
||||||
index 82721356d191055bec0d4b0ca49e481221988801..1ea5c394c704da295149443d7794961a12f2060b 100644
|
index 82721356d191055bec0d4b0ca49e481221988801..d1323fe17c995611ebdfe2869b0ccd2d45bcfa11 100644
|
||||||
--- a/browser/components/sessionstore/TabState.sys.mjs
|
--- a/browser/components/sessionstore/TabState.sys.mjs
|
||||||
+++ b/browser/components/sessionstore/TabState.sys.mjs
|
+++ b/browser/components/sessionstore/TabState.sys.mjs
|
||||||
@@ -85,7 +85,22 @@ class _TabState {
|
@@ -85,7 +85,22 @@ class _TabState {
|
||||||
@@ -7,7 +7,7 @@ index 82721356d191055bec0d4b0ca49e481221988801..1ea5c394c704da295149443d7794961a
|
|||||||
}
|
}
|
||||||
|
|
||||||
+ tabData.zenWorkspace = tab.getAttribute("zen-workspace-id");
|
+ tabData.zenWorkspace = tab.getAttribute("zen-workspace-id");
|
||||||
+ tabData.zenPinnedId = tab.getAttribute("zen-pin-id");
|
+ tabData.zenSyncId = tab.getAttribute("zen-sync-id");
|
||||||
+ tabData.zenEssential = tab.getAttribute("zen-essential");
|
+ tabData.zenEssential = tab.getAttribute("zen-essential");
|
||||||
+ tabData.pinned = tabData.pinned || tabData.zenEssential;
|
+ tabData.pinned = tabData.pinned || tabData.zenEssential;
|
||||||
+ tabData.zenDefaultUserContextId = tab.getAttribute("zenDefaultUserContextId");
|
+ tabData.zenDefaultUserContextId = tab.getAttribute("zenDefaultUserContextId");
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
diff --git a/browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs b/browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs
|
diff --git a/browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs b/browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs
|
||||||
index bcd7689e9d68ef8b171c327188174334c4271e21..0a95e1137fdf4b63e0d841776ad934da1a513c6f 100644
|
index bcd7689e9d68ef8b171c327188174334c4271e21..f69180acb87644f109aa91b871e347f1b1835f53 100644
|
||||||
--- a/browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs
|
--- a/browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs
|
||||||
+++ b/browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs
|
+++ b/browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs
|
||||||
@@ -938,6 +938,7 @@ export class AsyncTabSwitcher {
|
@@ -938,6 +938,7 @@ export class AsyncTabSwitcher {
|
||||||
this.tabbrowser._printPreviewBrowsers.has(browser) ||
|
this.tabbrowser._printPreviewBrowsers.has(browser) ||
|
||||||
this.tabbrowser.splitViewBrowsers.includes(browser) ||
|
this.tabbrowser.splitViewBrowsers.includes(browser) ||
|
||||||
lazy.PictureInPicture.isOriginatingBrowser(browser)
|
lazy.PictureInPicture.isOriginatingBrowser(browser)
|
||||||
+ || browser?.zenModeActive
|
+ || browser?.parentNode?.parentNode?.parentNode?.classList?.contains("zen-glance-background")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
diff --git a/browser/components/tabbrowser/content/drag-and-drop.js b/browser/components/tabbrowser/content/drag-and-drop.js
|
diff --git a/browser/components/tabbrowser/content/drag-and-drop.js b/browser/components/tabbrowser/content/drag-and-drop.js
|
||||||
index c97c661656868bc7faaf7c66c9702eea056aafe1..3a2b4bd1a017697539a3b81432199812307b9a04 100644
|
index c97c661656868bc7faaf7c66c9702eea056aafe1..aa9f0ed071e4898cac2b98a4d81e95df6a41b8dd 100644
|
||||||
--- a/browser/components/tabbrowser/content/drag-and-drop.js
|
--- a/browser/components/tabbrowser/content/drag-and-drop.js
|
||||||
+++ b/browser/components/tabbrowser/content/drag-and-drop.js
|
+++ b/browser/components/tabbrowser/content/drag-and-drop.js
|
||||||
@@ -32,6 +32,9 @@
|
@@ -32,6 +32,9 @@
|
||||||
@@ -149,8 +149,8 @@ index c97c661656868bc7faaf7c66c9702eea056aafe1..3a2b4bd1a017697539a3b81432199812
|
|||||||
this.#tabbrowserTabs.verticalMode &&
|
this.#tabbrowserTabs.verticalMode &&
|
||||||
- tab.pinned &&
|
- tab.pinned &&
|
||||||
- this.#tabbrowserTabs.hasAttribute("expanded") &&
|
- this.#tabbrowserTabs.hasAttribute("expanded") &&
|
||||||
+ tab.hasAttribute("zen-essential") &&
|
+ (tab.hasAttribute("zen-essential")) &&
|
||||||
+ (this.#tabbrowserTabs.hasAttribute("expanded") || document.documentElement.hasAttribute("zen-sidebar-expanded")) &&
|
+ (this.hasAttribute("expanded") || document.documentElement.hasAttribute("zen-sidebar-expanded")) &&
|
||||||
!this.#tabbrowserTabs.expandOnHover
|
!this.#tabbrowserTabs.expandOnHover
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
diff --git a/browser/components/tabbrowser/content/tab.js b/browser/components/tabbrowser/content/tab.js
|
diff --git a/browser/components/tabbrowser/content/tab.js b/browser/components/tabbrowser/content/tab.js
|
||||||
index 4c1a48424316b29d27ae2bc8b64004df41c87bb6..f1ff9bf0947127a8e9115357cedac577b5fad08c 100644
|
index 4c1a48424316b29d27ae2bc8b64004df41c87bb6..ce54ed0c8a93d5521a436c55c9432c090b0420ac 100644
|
||||||
--- a/browser/components/tabbrowser/content/tab.js
|
--- a/browser/components/tabbrowser/content/tab.js
|
||||||
+++ b/browser/components/tabbrowser/content/tab.js
|
+++ b/browser/components/tabbrowser/content/tab.js
|
||||||
@@ -21,6 +21,7 @@
|
@@ -21,6 +21,7 @@
|
||||||
@@ -121,15 +121,7 @@ index 4c1a48424316b29d27ae2bc8b64004df41c87bb6..f1ff9bf0947127a8e9115357cedac577
|
|||||||
on_click(event) {
|
on_click(event) {
|
||||||
if (event.button != 0) {
|
if (event.button != 0) {
|
||||||
return;
|
return;
|
||||||
@@ -572,6 +594,7 @@
|
@@ -584,6 +606,14 @@
|
||||||
)
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
+ gZenPinnedTabManager._removePinnedAttributes(this, true);
|
|
||||||
gBrowser.removeTab(this, {
|
|
||||||
animate: true,
|
|
||||||
triggeringEvent: event,
|
|
||||||
@@ -584,6 +607,14 @@
|
|
||||||
// (see tabbrowser-tabs 'click' handler).
|
// (see tabbrowser-tabs 'click' handler).
|
||||||
gBrowser.tabContainer._blockDblClick = true;
|
gBrowser.tabContainer._blockDblClick = true;
|
||||||
}
|
}
|
||||||
@@ -144,7 +136,7 @@ index 4c1a48424316b29d27ae2bc8b64004df41c87bb6..f1ff9bf0947127a8e9115357cedac577
|
|||||||
}
|
}
|
||||||
|
|
||||||
on_dblclick(event) {
|
on_dblclick(event) {
|
||||||
@@ -607,6 +638,8 @@
|
@@ -607,6 +637,8 @@
|
||||||
animate: true,
|
animate: true,
|
||||||
triggeringEvent: event,
|
triggeringEvent: event,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,16 +1,8 @@
|
|||||||
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
|
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
|
||||||
index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e6923fe5f 100644
|
index c0eafd4faf8d57b8486c5bf8917375850ec8147e..30c8fd7e978eb3036f35b17ae3f6ea4cd44d980e 100644
|
||||||
--- a/browser/components/tabbrowser/content/tabbrowser.js
|
--- a/browser/components/tabbrowser/content/tabbrowser.js
|
||||||
+++ b/browser/components/tabbrowser/content/tabbrowser.js
|
+++ b/browser/components/tabbrowser/content/tabbrowser.js
|
||||||
@@ -386,6 +386,7 @@
|
@@ -450,15 +450,64 @@
|
||||||
* @type {MozBrowser[]}
|
|
||||||
*/
|
|
||||||
get splitViewBrowsers() {
|
|
||||||
+ return gZenViewSplitter.splitViewBrowsers;
|
|
||||||
const browsers = [];
|
|
||||||
if (this.#activeSplitView) {
|
|
||||||
for (const tab of this.#activeSplitView.tabs) {
|
|
||||||
@@ -450,15 +451,64 @@
|
|
||||||
return this.tabContainer.visibleTabs;
|
return this.tabContainer.visibleTabs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,7 +69,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
set selectedTab(val) {
|
set selectedTab(val) {
|
||||||
if (
|
if (
|
||||||
gSharedTabWarning.willShowSharedTabWarning(val) ||
|
gSharedTabWarning.willShowSharedTabWarning(val) ||
|
||||||
@@ -613,6 +663,7 @@
|
@@ -613,6 +662,7 @@
|
||||||
this.tabpanels.appendChild(panel);
|
this.tabpanels.appendChild(panel);
|
||||||
|
|
||||||
let tab = this.tabs[0];
|
let tab = this.tabs[0];
|
||||||
@@ -85,7 +77,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
tab.linkedPanel = uniqueId;
|
tab.linkedPanel = uniqueId;
|
||||||
this._selectedTab = tab;
|
this._selectedTab = tab;
|
||||||
this._selectedBrowser = browser;
|
this._selectedBrowser = browser;
|
||||||
@@ -898,13 +949,17 @@
|
@@ -898,13 +948,17 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
this.showTab(aTab);
|
this.showTab(aTab);
|
||||||
@@ -104,7 +96,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
|
|
||||||
aTab.setAttribute("pinned", "true");
|
aTab.setAttribute("pinned", "true");
|
||||||
this._updateTabBarForPinnedTabs();
|
this._updateTabBarForPinnedTabs();
|
||||||
@@ -917,11 +972,15 @@
|
@@ -917,11 +971,15 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
this.#handleTabMove(aTab, () => {
|
this.#handleTabMove(aTab, () => {
|
||||||
@@ -121,7 +113,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
});
|
});
|
||||||
|
|
||||||
aTab.style.marginInlineStart = "";
|
aTab.style.marginInlineStart = "";
|
||||||
@@ -1098,6 +1157,8 @@
|
@@ -1098,6 +1156,8 @@
|
||||||
|
|
||||||
let LOCAL_PROTOCOLS = ["chrome:", "about:", "resource:", "data:"];
|
let LOCAL_PROTOCOLS = ["chrome:", "about:", "resource:", "data:"];
|
||||||
|
|
||||||
@@ -130,7 +122,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
if (
|
if (
|
||||||
aIconURL &&
|
aIconURL &&
|
||||||
!LOCAL_PROTOCOLS.some(protocol => aIconURL.startsWith(protocol))
|
!LOCAL_PROTOCOLS.some(protocol => aIconURL.startsWith(protocol))
|
||||||
@@ -1107,6 +1168,9 @@
|
@@ -1107,6 +1167,9 @@
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -140,7 +132,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
|
|
||||||
let browser = this.getBrowserForTab(aTab);
|
let browser = this.getBrowserForTab(aTab);
|
||||||
browser.mIconURL = aIconURL;
|
browser.mIconURL = aIconURL;
|
||||||
@@ -1379,7 +1443,6 @@
|
@@ -1379,7 +1442,6 @@
|
||||||
|
|
||||||
// Preview mode should not reset the owner
|
// Preview mode should not reset the owner
|
||||||
if (!this._previewMode && !oldTab.selected) {
|
if (!this._previewMode && !oldTab.selected) {
|
||||||
@@ -148,7 +140,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
}
|
}
|
||||||
|
|
||||||
let lastRelatedTab = this._lastRelatedTabMap.get(oldTab);
|
let lastRelatedTab = this._lastRelatedTabMap.get(oldTab);
|
||||||
@@ -1470,6 +1533,7 @@
|
@@ -1470,6 +1532,7 @@
|
||||||
if (!this._previewMode) {
|
if (!this._previewMode) {
|
||||||
newTab.recordTimeFromUnloadToReload();
|
newTab.recordTimeFromUnloadToReload();
|
||||||
newTab.updateLastAccessed();
|
newTab.updateLastAccessed();
|
||||||
@@ -156,7 +148,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
oldTab.updateLastAccessed();
|
oldTab.updateLastAccessed();
|
||||||
// if this is the foreground window, update the last-seen timestamps.
|
// if this is the foreground window, update the last-seen timestamps.
|
||||||
if (this.ownerGlobal == BrowserWindowTracker.getTopWindow()) {
|
if (this.ownerGlobal == BrowserWindowTracker.getTopWindow()) {
|
||||||
@@ -1622,6 +1686,9 @@
|
@@ -1622,6 +1685,9 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
let activeEl = document.activeElement;
|
let activeEl = document.activeElement;
|
||||||
@@ -166,7 +158,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
// If focus is on the old tab, move it to the new tab.
|
// If focus is on the old tab, move it to the new tab.
|
||||||
if (activeEl == oldTab) {
|
if (activeEl == oldTab) {
|
||||||
newTab.focus();
|
newTab.focus();
|
||||||
@@ -1945,7 +2012,8 @@
|
@@ -1945,7 +2011,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
_setTabLabel(aTab, aLabel, { beforeTabOpen, isContentTitle, isURL } = {}) {
|
_setTabLabel(aTab, aLabel, { beforeTabOpen, isContentTitle, isURL } = {}) {
|
||||||
@@ -176,7 +168,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2053,7 +2121,7 @@
|
@@ -2053,7 +2120,7 @@
|
||||||
newIndex = this.selectedTab._tPos + 1;
|
newIndex = this.selectedTab._tPos + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -185,7 +177,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
if (this.isTabGroupLabel(targetTab)) {
|
if (this.isTabGroupLabel(targetTab)) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"Replacing a tab group label with a tab is not supported"
|
"Replacing a tab group label with a tab is not supported"
|
||||||
@@ -2328,6 +2396,7 @@
|
@@ -2328,6 +2395,7 @@
|
||||||
uriIsAboutBlank,
|
uriIsAboutBlank,
|
||||||
userContextId,
|
userContextId,
|
||||||
skipLoad,
|
skipLoad,
|
||||||
@@ -193,7 +185,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
} = {}) {
|
} = {}) {
|
||||||
let b = document.createXULElement("browser");
|
let b = document.createXULElement("browser");
|
||||||
// Use the JSM global to create the permanentKey, so that if the
|
// Use the JSM global to create the permanentKey, so that if the
|
||||||
@@ -2401,8 +2470,7 @@
|
@@ -2401,8 +2469,7 @@
|
||||||
// we use a different attribute name for this?
|
// we use a different attribute name for this?
|
||||||
b.setAttribute("name", name);
|
b.setAttribute("name", name);
|
||||||
}
|
}
|
||||||
@@ -203,7 +195,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
b.setAttribute("transparent", "true");
|
b.setAttribute("transparent", "true");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2567,7 +2635,7 @@
|
@@ -2567,7 +2634,7 @@
|
||||||
|
|
||||||
let panel = this.getPanel(browser);
|
let panel = this.getPanel(browser);
|
||||||
let uniqueId = this._generateUniquePanelID();
|
let uniqueId = this._generateUniquePanelID();
|
||||||
@@ -212,7 +204,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
aTab.linkedPanel = uniqueId;
|
aTab.linkedPanel = uniqueId;
|
||||||
|
|
||||||
// Inject the <browser> into the DOM if necessary.
|
// Inject the <browser> into the DOM if necessary.
|
||||||
@@ -2626,8 +2694,8 @@
|
@@ -2626,8 +2693,8 @@
|
||||||
// If we transitioned from one browser to two browsers, we need to set
|
// If we transitioned from one browser to two browsers, we need to set
|
||||||
// hasSiblings=false on both the existing browser and the new browser.
|
// hasSiblings=false on both the existing browser and the new browser.
|
||||||
if (this.tabs.length == 2) {
|
if (this.tabs.length == 2) {
|
||||||
@@ -223,7 +215,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
} else {
|
} else {
|
||||||
aTab.linkedBrowser.browsingContext.hasSiblings = this.tabs.length > 1;
|
aTab.linkedBrowser.browsingContext.hasSiblings = this.tabs.length > 1;
|
||||||
}
|
}
|
||||||
@@ -2814,7 +2882,6 @@
|
@@ -2814,7 +2881,6 @@
|
||||||
this.selectedTab = this.addTrustedTab(BROWSER_NEW_TAB_URL, {
|
this.selectedTab = this.addTrustedTab(BROWSER_NEW_TAB_URL, {
|
||||||
tabIndex: tab._tPos + 1,
|
tabIndex: tab._tPos + 1,
|
||||||
userContextId: tab.userContextId,
|
userContextId: tab.userContextId,
|
||||||
@@ -231,7 +223,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
focusUrlBar: true,
|
focusUrlBar: true,
|
||||||
});
|
});
|
||||||
resolve(this.selectedBrowser);
|
resolve(this.selectedBrowser);
|
||||||
@@ -2923,6 +2990,8 @@
|
@@ -2923,6 +2989,8 @@
|
||||||
schemelessInput,
|
schemelessInput,
|
||||||
hasValidUserGestureActivation = false,
|
hasValidUserGestureActivation = false,
|
||||||
textDirectiveUserActivation = false,
|
textDirectiveUserActivation = false,
|
||||||
@@ -240,7 +232,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
} = {}
|
} = {}
|
||||||
) {
|
) {
|
||||||
// all callers of addTab that pass a params object need to pass
|
// all callers of addTab that pass a params object need to pass
|
||||||
@@ -2933,10 +3002,17 @@
|
@@ -2933,10 +3001,17 @@
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -258,7 +250,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
// If we're opening a foreground tab, set the owner by default.
|
// If we're opening a foreground tab, set the owner by default.
|
||||||
ownerTab ??= inBackground ? null : this.selectedTab;
|
ownerTab ??= inBackground ? null : this.selectedTab;
|
||||||
|
|
||||||
@@ -2944,6 +3020,7 @@
|
@@ -2944,6 +3019,7 @@
|
||||||
if (this.selectedTab.owner) {
|
if (this.selectedTab.owner) {
|
||||||
this.selectedTab.owner = null;
|
this.selectedTab.owner = null;
|
||||||
}
|
}
|
||||||
@@ -266,7 +258,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
|
|
||||||
// Find the tab that opened this one, if any. This is used for
|
// Find the tab that opened this one, if any. This is used for
|
||||||
// determining positioning, and inherited attributes such as the
|
// determining positioning, and inherited attributes such as the
|
||||||
@@ -2996,6 +3073,19 @@
|
@@ -2996,6 +3072,19 @@
|
||||||
noInitialLabel,
|
noInitialLabel,
|
||||||
skipBackgroundNotify,
|
skipBackgroundNotify,
|
||||||
});
|
});
|
||||||
@@ -286,7 +278,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
if (insertTab) {
|
if (insertTab) {
|
||||||
// Insert the tab into the tab container in the correct position.
|
// Insert the tab into the tab container in the correct position.
|
||||||
this.#insertTabAtIndex(t, {
|
this.#insertTabAtIndex(t, {
|
||||||
@@ -3004,6 +3094,7 @@
|
@@ -3004,6 +3093,7 @@
|
||||||
ownerTab,
|
ownerTab,
|
||||||
openerTab,
|
openerTab,
|
||||||
pinned,
|
pinned,
|
||||||
@@ -294,7 +286,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
bulkOrderedOpen,
|
bulkOrderedOpen,
|
||||||
tabGroup: tabGroup ?? openerTab?.group,
|
tabGroup: tabGroup ?? openerTab?.group,
|
||||||
});
|
});
|
||||||
@@ -3022,6 +3113,7 @@
|
@@ -3022,6 +3112,7 @@
|
||||||
openWindowInfo,
|
openWindowInfo,
|
||||||
skipLoad,
|
skipLoad,
|
||||||
triggeringRemoteType,
|
triggeringRemoteType,
|
||||||
@@ -302,7 +294,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
if (focusUrlBar) {
|
if (focusUrlBar) {
|
||||||
@@ -3146,6 +3238,12 @@
|
@@ -3146,6 +3237,12 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -315,7 +307,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
// Additionally send pinned tab events
|
// Additionally send pinned tab events
|
||||||
if (pinned) {
|
if (pinned) {
|
||||||
this.#notifyPinnedStatus(t);
|
this.#notifyPinnedStatus(t);
|
||||||
@@ -3330,10 +3428,10 @@
|
@@ -3330,10 +3427,10 @@
|
||||||
isAdoptingGroup = false,
|
isAdoptingGroup = false,
|
||||||
isUserTriggered = false,
|
isUserTriggered = false,
|
||||||
telemetryUserCreateSource = "unknown",
|
telemetryUserCreateSource = "unknown",
|
||||||
@@ -327,7 +319,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!color) {
|
if (!color) {
|
||||||
@@ -3354,9 +3452,14 @@
|
@@ -3354,9 +3451,14 @@
|
||||||
label,
|
label,
|
||||||
isAdoptingGroup
|
isAdoptingGroup
|
||||||
);
|
);
|
||||||
@@ -344,7 +336,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
);
|
);
|
||||||
group.addTabs(tabs);
|
group.addTabs(tabs);
|
||||||
|
|
||||||
@@ -3477,7 +3580,7 @@
|
@@ -3477,7 +3579,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
this.#handleTabMove(tab, () =>
|
this.#handleTabMove(tab, () =>
|
||||||
@@ -353,7 +345,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3679,6 +3782,7 @@
|
@@ -3679,6 +3781,7 @@
|
||||||
openWindowInfo,
|
openWindowInfo,
|
||||||
skipLoad,
|
skipLoad,
|
||||||
triggeringRemoteType,
|
triggeringRemoteType,
|
||||||
@@ -361,7 +353,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
// If we don't have a preferred remote type (or it is `NOT_REMOTE`), and
|
// If we don't have a preferred remote type (or it is `NOT_REMOTE`), and
|
||||||
@@ -3748,6 +3852,7 @@
|
@@ -3748,6 +3851,7 @@
|
||||||
openWindowInfo,
|
openWindowInfo,
|
||||||
name,
|
name,
|
||||||
skipLoad,
|
skipLoad,
|
||||||
@@ -369,7 +361,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3935,7 +4040,7 @@
|
@@ -3935,7 +4039,7 @@
|
||||||
// Add a new tab if needed.
|
// Add a new tab if needed.
|
||||||
if (!tab) {
|
if (!tab) {
|
||||||
let createLazyBrowser =
|
let createLazyBrowser =
|
||||||
@@ -378,7 +370,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
|
|
||||||
let url = "about:blank";
|
let url = "about:blank";
|
||||||
if (tabData.entries?.length) {
|
if (tabData.entries?.length) {
|
||||||
@@ -3972,8 +4077,10 @@
|
@@ -3972,8 +4076,10 @@
|
||||||
insertTab: false,
|
insertTab: false,
|
||||||
skipLoad: true,
|
skipLoad: true,
|
||||||
preferredRemoteType,
|
preferredRemoteType,
|
||||||
@@ -390,7 +382,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
if (select) {
|
if (select) {
|
||||||
tabToSelect = tab;
|
tabToSelect = tab;
|
||||||
}
|
}
|
||||||
@@ -3985,7 +4092,8 @@
|
@@ -3985,7 +4091,8 @@
|
||||||
this.pinTab(tab);
|
this.pinTab(tab);
|
||||||
// Then ensure all the tab open/pinning information is sent.
|
// Then ensure all the tab open/pinning information is sent.
|
||||||
this._fireTabOpen(tab, {});
|
this._fireTabOpen(tab, {});
|
||||||
@@ -400,7 +392,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
let { groupId } = tabData;
|
let { groupId } = tabData;
|
||||||
const tabGroup = tabGroupWorkingData.get(groupId);
|
const tabGroup = tabGroupWorkingData.get(groupId);
|
||||||
// if a tab refers to a tab group we don't know, skip any group
|
// if a tab refers to a tab group we don't know, skip any group
|
||||||
@@ -3999,7 +4107,10 @@
|
@@ -3999,7 +4106,10 @@
|
||||||
tabGroup.stateData.id,
|
tabGroup.stateData.id,
|
||||||
tabGroup.stateData.color,
|
tabGroup.stateData.color,
|
||||||
tabGroup.stateData.collapsed,
|
tabGroup.stateData.collapsed,
|
||||||
@@ -412,7 +404,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
);
|
);
|
||||||
tabsFragment.appendChild(tabGroup.node);
|
tabsFragment.appendChild(tabGroup.node);
|
||||||
}
|
}
|
||||||
@@ -4044,9 +4155,23 @@
|
@@ -4044,9 +4154,23 @@
|
||||||
// to remove the old selected tab.
|
// to remove the old selected tab.
|
||||||
if (tabToSelect) {
|
if (tabToSelect) {
|
||||||
let leftoverTab = this.selectedTab;
|
let leftoverTab = this.selectedTab;
|
||||||
@@ -436,7 +428,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
|
|
||||||
if (tabs.length > 1 || !tabs[0].selected) {
|
if (tabs.length > 1 || !tabs[0].selected) {
|
||||||
this._updateTabsAfterInsert();
|
this._updateTabsAfterInsert();
|
||||||
@@ -4237,11 +4362,14 @@
|
@@ -4237,11 +4361,14 @@
|
||||||
if (ownerTab) {
|
if (ownerTab) {
|
||||||
tab.owner = ownerTab;
|
tab.owner = ownerTab;
|
||||||
}
|
}
|
||||||
@@ -452,7 +444,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
if (
|
if (
|
||||||
!bulkOrderedOpen &&
|
!bulkOrderedOpen &&
|
||||||
((openerTab &&
|
((openerTab &&
|
||||||
@@ -4253,7 +4381,7 @@
|
@@ -4253,7 +4380,7 @@
|
||||||
let lastRelatedTab =
|
let lastRelatedTab =
|
||||||
openerTab && this._lastRelatedTabMap.get(openerTab);
|
openerTab && this._lastRelatedTabMap.get(openerTab);
|
||||||
let previousTab = lastRelatedTab || openerTab || this.selectedTab;
|
let previousTab = lastRelatedTab || openerTab || this.selectedTab;
|
||||||
@@ -461,7 +453,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
tabGroup = previousTab.group;
|
tabGroup = previousTab.group;
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
@@ -4264,7 +4392,7 @@
|
@@ -4264,7 +4391,7 @@
|
||||||
) {
|
) {
|
||||||
elementIndex = Infinity;
|
elementIndex = Infinity;
|
||||||
} else if (previousTab.visible) {
|
} else if (previousTab.visible) {
|
||||||
@@ -470,7 +462,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
} else if (previousTab == FirefoxViewHandler.tab) {
|
} else if (previousTab == FirefoxViewHandler.tab) {
|
||||||
elementIndex = 0;
|
elementIndex = 0;
|
||||||
}
|
}
|
||||||
@@ -4292,14 +4420,14 @@
|
@@ -4292,14 +4419,14 @@
|
||||||
}
|
}
|
||||||
// Ensure index is within bounds.
|
// Ensure index is within bounds.
|
||||||
if (tab.pinned) {
|
if (tab.pinned) {
|
||||||
@@ -489,7 +481,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
|
|
||||||
if (pinned && !itemAfter?.pinned) {
|
if (pinned && !itemAfter?.pinned) {
|
||||||
itemAfter = null;
|
itemAfter = null;
|
||||||
@@ -4310,7 +4438,7 @@
|
@@ -4310,7 +4437,7 @@
|
||||||
|
|
||||||
this.tabContainer._invalidateCachedTabs();
|
this.tabContainer._invalidateCachedTabs();
|
||||||
|
|
||||||
@@ -498,19 +490,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
if (this.isTab(itemAfter) && itemAfter.group == tabGroup) {
|
if (this.isTab(itemAfter) && itemAfter.group == tabGroup) {
|
||||||
// Place at the front of, or between tabs in, the same tab group
|
// Place at the front of, or between tabs in, the same tab group
|
||||||
this.tabContainer.insertBefore(tab, itemAfter);
|
this.tabContainer.insertBefore(tab, itemAfter);
|
||||||
@@ -4338,7 +4466,11 @@
|
@@ -4346,6 +4473,7 @@
|
||||||
const tabContainer = pinned
|
|
||||||
? this.tabContainer.pinnedTabsContainer
|
|
||||||
: this.tabContainer;
|
|
||||||
+ if (itemAfter) {
|
|
||||||
+ itemAfter.before(tab);
|
|
||||||
+ } else {
|
|
||||||
tabContainer.insertBefore(tab, itemAfter);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
this._updateTabsAfterInsert();
|
|
||||||
@@ -4346,6 +4478,7 @@
|
|
||||||
if (pinned) {
|
if (pinned) {
|
||||||
this._updateTabBarForPinnedTabs();
|
this._updateTabBarForPinnedTabs();
|
||||||
}
|
}
|
||||||
@@ -518,17 +498,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
|
|
||||||
TabBarVisibility.update();
|
TabBarVisibility.update();
|
||||||
}
|
}
|
||||||
@@ -4635,6 +4768,9 @@
|
@@ -4896,6 +5024,7 @@
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ for (let tab of selectedTabs) {
|
|
||||||
+ gZenPinnedTabManager._removePinnedAttributes(tab, true);
|
|
||||||
+ }
|
|
||||||
this.removeTabs(selectedTabs, { isUserTriggered, telemetrySource });
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -4896,6 +5032,7 @@
|
|
||||||
telemetrySource,
|
telemetrySource,
|
||||||
} = {}
|
} = {}
|
||||||
) {
|
) {
|
||||||
@@ -536,7 +506,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
// When 'closeWindowWithLastTab' pref is enabled, closing all tabs
|
// When 'closeWindowWithLastTab' pref is enabled, closing all tabs
|
||||||
// can be considered equivalent to closing the window.
|
// can be considered equivalent to closing the window.
|
||||||
if (
|
if (
|
||||||
@@ -4985,6 +5122,7 @@
|
@@ -4985,6 +5114,7 @@
|
||||||
if (lastToClose) {
|
if (lastToClose) {
|
||||||
this.removeTab(lastToClose, aParams);
|
this.removeTab(lastToClose, aParams);
|
||||||
}
|
}
|
||||||
@@ -544,7 +514,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
}
|
}
|
||||||
@@ -5023,6 +5161,12 @@
|
@@ -5023,6 +5153,12 @@
|
||||||
aTab._closeTimeNoAnimTimerId = Glean.browserTabclose.timeNoAnim.start();
|
aTab._closeTimeNoAnimTimerId = Glean.browserTabclose.timeNoAnim.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -557,7 +527,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
// Handle requests for synchronously removing an already
|
// Handle requests for synchronously removing an already
|
||||||
// asynchronously closing tab.
|
// asynchronously closing tab.
|
||||||
if (!animate && aTab.closing) {
|
if (!animate && aTab.closing) {
|
||||||
@@ -5037,6 +5181,9 @@
|
@@ -5037,6 +5173,9 @@
|
||||||
// state).
|
// state).
|
||||||
let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width;
|
let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width;
|
||||||
let isLastTab = this.#isLastTabInWindow(aTab);
|
let isLastTab = this.#isLastTabInWindow(aTab);
|
||||||
@@ -567,7 +537,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
if (
|
if (
|
||||||
!this._beginRemoveTab(aTab, {
|
!this._beginRemoveTab(aTab, {
|
||||||
closeWindowFastpath: true,
|
closeWindowFastpath: true,
|
||||||
@@ -5085,7 +5232,13 @@
|
@@ -5085,7 +5224,13 @@
|
||||||
// We're not animating, so we can cancel the animation stopwatch.
|
// We're not animating, so we can cancel the animation stopwatch.
|
||||||
Glean.browserTabclose.timeAnim.cancel(aTab._closeTimeAnimTimerId);
|
Glean.browserTabclose.timeAnim.cancel(aTab._closeTimeAnimTimerId);
|
||||||
aTab._closeTimeAnimTimerId = null;
|
aTab._closeTimeAnimTimerId = null;
|
||||||
@@ -582,7 +552,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5219,7 +5372,7 @@
|
@@ -5219,7 +5364,7 @@
|
||||||
closeWindowWithLastTab != null
|
closeWindowWithLastTab != null
|
||||||
? closeWindowWithLastTab
|
? closeWindowWithLastTab
|
||||||
: !window.toolbar.visible ||
|
: !window.toolbar.visible ||
|
||||||
@@ -591,7 +561,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
|
|
||||||
if (closeWindow) {
|
if (closeWindow) {
|
||||||
// We've already called beforeunload on all the relevant tabs if we get here,
|
// We've already called beforeunload on all the relevant tabs if we get here,
|
||||||
@@ -5243,6 +5396,7 @@
|
@@ -5243,6 +5388,7 @@
|
||||||
|
|
||||||
newTab = true;
|
newTab = true;
|
||||||
}
|
}
|
||||||
@@ -599,7 +569,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
aTab._endRemoveArgs = [closeWindow, newTab];
|
aTab._endRemoveArgs = [closeWindow, newTab];
|
||||||
|
|
||||||
// swapBrowsersAndCloseOther will take care of closing the window without animation.
|
// swapBrowsersAndCloseOther will take care of closing the window without animation.
|
||||||
@@ -5283,13 +5437,7 @@
|
@@ -5283,13 +5429,7 @@
|
||||||
aTab._mouseleave();
|
aTab._mouseleave();
|
||||||
|
|
||||||
if (newTab) {
|
if (newTab) {
|
||||||
@@ -614,7 +584,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
} else {
|
} else {
|
||||||
TabBarVisibility.update();
|
TabBarVisibility.update();
|
||||||
}
|
}
|
||||||
@@ -5422,6 +5570,7 @@
|
@@ -5422,6 +5562,7 @@
|
||||||
this.tabs[i]._tPos = i;
|
this.tabs[i]._tPos = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -622,7 +592,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
if (!this._windowIsClosing) {
|
if (!this._windowIsClosing) {
|
||||||
// update tab close buttons state
|
// update tab close buttons state
|
||||||
this.tabContainer._updateCloseButtons();
|
this.tabContainer._updateCloseButtons();
|
||||||
@@ -5643,6 +5792,7 @@
|
@@ -5643,6 +5784,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
let excludeTabs = new Set(aExcludeTabs);
|
let excludeTabs = new Set(aExcludeTabs);
|
||||||
@@ -630,7 +600,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
|
|
||||||
// If this tab has a successor, it should be selectable, since
|
// If this tab has a successor, it should be selectable, since
|
||||||
// hiding or closing a tab removes that tab as a successor.
|
// hiding or closing a tab removes that tab as a successor.
|
||||||
@@ -5655,13 +5805,13 @@
|
@@ -5655,13 +5797,13 @@
|
||||||
!excludeTabs.has(aTab.owner) &&
|
!excludeTabs.has(aTab.owner) &&
|
||||||
Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose")
|
Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose")
|
||||||
) {
|
) {
|
||||||
@@ -646,7 +616,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
);
|
);
|
||||||
|
|
||||||
let tab = this.tabContainer.findNextTab(aTab, {
|
let tab = this.tabContainer.findNextTab(aTab, {
|
||||||
@@ -5677,7 +5827,7 @@
|
@@ -5677,7 +5819,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tab) {
|
if (tab) {
|
||||||
@@ -655,7 +625,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If no qualifying visible tab was found, see if there is a tab in
|
// If no qualifying visible tab was found, see if there is a tab in
|
||||||
@@ -5698,7 +5848,7 @@
|
@@ -5698,7 +5840,7 @@
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -664,7 +634,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
}
|
}
|
||||||
|
|
||||||
_blurTab(aTab) {
|
_blurTab(aTab) {
|
||||||
@@ -6104,10 +6254,10 @@
|
@@ -6104,10 +6246,10 @@
|
||||||
SessionStore.deleteCustomTabValue(aTab, "hiddenBy");
|
SessionStore.deleteCustomTabValue(aTab, "hiddenBy");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -677,7 +647,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
aTab.selected ||
|
aTab.selected ||
|
||||||
aTab.closing ||
|
aTab.closing ||
|
||||||
// Tabs that are sharing the screen, microphone or camera cannot be hidden.
|
// Tabs that are sharing the screen, microphone or camera cannot be hidden.
|
||||||
@@ -6166,6 +6316,7 @@
|
@@ -6166,6 +6308,7 @@
|
||||||
* @param {MozTabbrowserTab|MozTabbrowserTabGroup|MozTabbrowserTabGroup.labelElement} aTab
|
* @param {MozTabbrowserTab|MozTabbrowserTabGroup|MozTabbrowserTabGroup.labelElement} aTab
|
||||||
*/
|
*/
|
||||||
replaceTabWithWindow(aTab, aOptions) {
|
replaceTabWithWindow(aTab, aOptions) {
|
||||||
@@ -685,7 +655,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
if (this.tabs.length == 1) {
|
if (this.tabs.length == 1) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -6299,7 +6450,7 @@
|
@@ -6299,7 +6442,7 @@
|
||||||
* `true` if element is a `<tab-group>`
|
* `true` if element is a `<tab-group>`
|
||||||
*/
|
*/
|
||||||
isTabGroup(element) {
|
isTabGroup(element) {
|
||||||
@@ -694,7 +664,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -6375,8 +6526,8 @@
|
@@ -6375,8 +6518,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't allow mixing pinned and unpinned tabs.
|
// Don't allow mixing pinned and unpinned tabs.
|
||||||
@@ -705,7 +675,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
} else {
|
} else {
|
||||||
tabIndex = Math.max(tabIndex, this.pinnedTabCount);
|
tabIndex = Math.max(tabIndex, this.pinnedTabCount);
|
||||||
}
|
}
|
||||||
@@ -6402,10 +6553,16 @@
|
@@ -6402,10 +6545,16 @@
|
||||||
this.#handleTabMove(
|
this.#handleTabMove(
|
||||||
element,
|
element,
|
||||||
() => {
|
() => {
|
||||||
@@ -724,7 +694,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
if (neighbor && this.isTab(element) && tabIndex > element._tPos) {
|
if (neighbor && this.isTab(element) && tabIndex > element._tPos) {
|
||||||
neighbor.after(element);
|
neighbor.after(element);
|
||||||
} else {
|
} else {
|
||||||
@@ -6463,23 +6620,28 @@
|
@@ -6463,23 +6612,28 @@
|
||||||
#moveTabNextTo(element, targetElement, moveBefore = false, metricsContext) {
|
#moveTabNextTo(element, targetElement, moveBefore = false, metricsContext) {
|
||||||
if (this.isTabGroupLabel(targetElement)) {
|
if (this.isTabGroupLabel(targetElement)) {
|
||||||
targetElement = targetElement.group;
|
targetElement = targetElement.group;
|
||||||
@@ -759,7 +729,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
} else if (!element.pinned && targetElement && targetElement.pinned) {
|
} else if (!element.pinned && targetElement && targetElement.pinned) {
|
||||||
// If the caller asks to move an unpinned element next to a pinned
|
// If the caller asks to move an unpinned element next to a pinned
|
||||||
// tab, move the unpinned element to be the first unpinned element
|
// tab, move the unpinned element to be the first unpinned element
|
||||||
@@ -6492,14 +6654,34 @@
|
@@ -6492,14 +6646,34 @@
|
||||||
// move the tab group right before the first unpinned tab.
|
// move the tab group right before the first unpinned tab.
|
||||||
// 4. Moving a tab group and the first unpinned tab is grouped:
|
// 4. Moving a tab group and the first unpinned tab is grouped:
|
||||||
// move the tab group right before the first unpinned tab's tab group.
|
// move the tab group right before the first unpinned tab's tab group.
|
||||||
@@ -795,7 +765,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
element.pinned
|
element.pinned
|
||||||
? this.tabContainer.pinnedTabsContainer
|
? this.tabContainer.pinnedTabsContainer
|
||||||
: this.tabContainer;
|
: this.tabContainer;
|
||||||
@@ -6508,7 +6690,7 @@
|
@@ -6508,7 +6682,7 @@
|
||||||
element,
|
element,
|
||||||
() => {
|
() => {
|
||||||
if (moveBefore) {
|
if (moveBefore) {
|
||||||
@@ -804,7 +774,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
} else if (targetElement) {
|
} else if (targetElement) {
|
||||||
targetElement.after(element);
|
targetElement.after(element);
|
||||||
} else {
|
} else {
|
||||||
@@ -6580,10 +6762,10 @@
|
@@ -6580,10 +6754,10 @@
|
||||||
* @param {TabMetricsContext} [metricsContext]
|
* @param {TabMetricsContext} [metricsContext]
|
||||||
*/
|
*/
|
||||||
moveTabToGroup(aTab, aGroup, metricsContext) {
|
moveTabToGroup(aTab, aGroup, metricsContext) {
|
||||||
@@ -817,7 +787,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (aTab.group && aTab.group.id === aGroup.id) {
|
if (aTab.group && aTab.group.id === aGroup.id) {
|
||||||
@@ -6613,6 +6795,7 @@
|
@@ -6613,6 +6787,7 @@
|
||||||
|
|
||||||
let state = {
|
let state = {
|
||||||
tabIndex: tab._tPos,
|
tabIndex: tab._tPos,
|
||||||
@@ -825,7 +795,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
};
|
};
|
||||||
if (tab.visible) {
|
if (tab.visible) {
|
||||||
state.elementIndex = tab.elementIndex;
|
state.elementIndex = tab.elementIndex;
|
||||||
@@ -6639,7 +6822,7 @@
|
@@ -6639,7 +6814,7 @@
|
||||||
let changedTabGroup =
|
let changedTabGroup =
|
||||||
previousTabState.tabGroupId != currentTabState.tabGroupId;
|
previousTabState.tabGroupId != currentTabState.tabGroupId;
|
||||||
|
|
||||||
@@ -834,7 +804,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
tab.dispatchEvent(
|
tab.dispatchEvent(
|
||||||
new CustomEvent("TabMove", {
|
new CustomEvent("TabMove", {
|
||||||
bubbles: true,
|
bubbles: true,
|
||||||
@@ -6676,6 +6859,10 @@
|
@@ -6676,6 +6851,10 @@
|
||||||
|
|
||||||
moveActionCallback();
|
moveActionCallback();
|
||||||
|
|
||||||
@@ -845,7 +815,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
// Clear tabs cache after moving nodes because the order of tabs may have
|
// Clear tabs cache after moving nodes because the order of tabs may have
|
||||||
// changed.
|
// changed.
|
||||||
this.tabContainer._invalidateCachedTabs();
|
this.tabContainer._invalidateCachedTabs();
|
||||||
@@ -7576,7 +7763,7 @@
|
@@ -7576,7 +7755,7 @@
|
||||||
// preventDefault(). It will still raise the window if appropriate.
|
// preventDefault(). It will still raise the window if appropriate.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -854,7 +824,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
window.focus();
|
window.focus();
|
||||||
aEvent.preventDefault();
|
aEvent.preventDefault();
|
||||||
break;
|
break;
|
||||||
@@ -7593,7 +7780,6 @@
|
@@ -7593,7 +7772,6 @@
|
||||||
}
|
}
|
||||||
case "TabGroupCollapse":
|
case "TabGroupCollapse":
|
||||||
aEvent.target.tabs.forEach(tab => {
|
aEvent.target.tabs.forEach(tab => {
|
||||||
@@ -862,7 +832,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case "TabGroupCreateByUser":
|
case "TabGroupCreateByUser":
|
||||||
@@ -8542,6 +8728,7 @@
|
@@ -8542,6 +8720,7 @@
|
||||||
aWebProgress.isTopLevel
|
aWebProgress.isTopLevel
|
||||||
) {
|
) {
|
||||||
this.mTab.setAttribute("busy", "true");
|
this.mTab.setAttribute("busy", "true");
|
||||||
@@ -870,7 +840,7 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
gBrowser._tabAttrModified(this.mTab, ["busy"]);
|
gBrowser._tabAttrModified(this.mTab, ["busy"]);
|
||||||
this.mTab._notselectedsinceload = !this.mTab.selected;
|
this.mTab._notselectedsinceload = !this.mTab.selected;
|
||||||
}
|
}
|
||||||
@@ -9543,7 +9730,7 @@ var TabContextMenu = {
|
@@ -9543,7 +9722,7 @@ var TabContextMenu = {
|
||||||
);
|
);
|
||||||
contextUnpinSelectedTabs.hidden =
|
contextUnpinSelectedTabs.hidden =
|
||||||
!this.contextTab.pinned || !this.multiselected;
|
!this.contextTab.pinned || !this.multiselected;
|
||||||
@@ -879,11 +849,3 @@ index c0eafd4faf8d57b8486c5bf8917375850ec8147e..cead9e6e52f7354e20b8b64ad06a075e
|
|||||||
// Build Ask Chat items
|
// Build Ask Chat items
|
||||||
TabContextMenu.GenAI.buildTabMenu(
|
TabContextMenu.GenAI.buildTabMenu(
|
||||||
document.getElementById("context_askChat"),
|
document.getElementById("context_askChat"),
|
||||||
@@ -9863,6 +10050,7 @@ var TabContextMenu = {
|
|
||||||
)
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
+ gZenPinnedTabManager._removePinnedAttributes(this.contextTab, true);
|
|
||||||
gBrowser.removeTab(this.contextTab, {
|
|
||||||
animate: true,
|
|
||||||
...gBrowser.TabMetrics.userTriggeredContext(
|
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
diff --git a/browser/components/urlbar/UrlbarResult.sys.mjs b/browser/components/urlbar/UrlbarResult.sys.mjs
|
|
||||||
index 0882c0a01d17184cadb56aa1236ca97adf7f866b..4a5842eda6280205b96f9aee9b6f3b49fac7077c 100644
|
|
||||||
--- a/browser/components/urlbar/UrlbarResult.sys.mjs
|
|
||||||
+++ b/browser/components/urlbar/UrlbarResult.sys.mjs
|
|
||||||
@@ -172,6 +172,10 @@ export class UrlbarResult {
|
|
||||||
return this.#heuristic;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ set heuristic(value) {
|
|
||||||
+ this.#heuristic = value;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
get hideRowLabel() {
|
|
||||||
return this.#hideRowLabel;
|
|
||||||
}
|
|
||||||
@@ -1,16 +1,7 @@
|
|||||||
diff --git a/browser/themes/shared/identity-block/identity-block.css b/browser/themes/shared/identity-block/identity-block.css
|
diff --git a/browser/themes/shared/identity-block/identity-block.css b/browser/themes/shared/identity-block/identity-block.css
|
||||||
index d542e962d42b17140888e299ed43a838047ee48c..806bc4f9d7b7557abf316a84858046e04c4f7ff5 100644
|
index d542e962d42b17140888e299ed43a838047ee48c..5e0b72f147687924c48dfed0318f53b765a4d497 100644
|
||||||
--- a/browser/themes/shared/identity-block/identity-block.css
|
--- a/browser/themes/shared/identity-block/identity-block.css
|
||||||
+++ b/browser/themes/shared/identity-block/identity-block.css
|
+++ b/browser/themes/shared/identity-block/identity-block.css
|
||||||
@@ -7,7 +7,7 @@
|
|
||||||
#identity-box {
|
|
||||||
margin-inline-end: var(--identity-box-margin-inline);
|
|
||||||
|
|
||||||
- &[pageproxystate="invalid"] {
|
|
||||||
+ :root[zen-has-empty-tab='true'] & {
|
|
||||||
pointer-events: none;
|
|
||||||
-moz-user-focus: ignore;
|
|
||||||
}
|
|
||||||
@@ -81,13 +81,6 @@
|
@@ -81,13 +81,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,8 +91,8 @@ groupbox button {
|
|||||||
|
|
||||||
groupbox button,
|
groupbox button,
|
||||||
groupbox menulist {
|
groupbox menulist {
|
||||||
background-color: light-dark(#f1f1f1, #363636);
|
background-color: light-dark(#f1f1f1, #363636) !important;
|
||||||
color: light-dark(black, white);
|
color: light-dark(black, white) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
groupbox h2 {
|
groupbox h2 {
|
||||||
|
|||||||
@@ -504,17 +504,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
#identity-permission-box,
|
#identity-permission-box,
|
||||||
:root:not([zen-has-empty-tab='true'])
|
#identity-box:not([pageproxystate='invalid']) #identity-icon-box:not([open]),
|
||||||
#urlbar:not([breakout-extend='true'])
|
#identity-box[pageproxystate='invalid'] #zen-site-data-icon-button {
|
||||||
#identity-icon-box:not([open]),
|
|
||||||
:root[zen-has-empty-tab='true'] #zen-site-data-icon-button,
|
|
||||||
#urlbar[breakout-extend='true'] #zen-site-data-icon-button {
|
|
||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
#zen-site-data-icon-button {
|
#zen-site-data-icon-button {
|
||||||
padding: 0 6px !important;
|
padding: 0 6px;
|
||||||
border-radius: var(--urlbar-icon-border-radius) !important;
|
|
||||||
|
|
||||||
& image {
|
& image {
|
||||||
list-style-image: url('permissions.svg');
|
list-style-image: url('permissions.svg');
|
||||||
|
|||||||
@@ -1,64 +0,0 @@
|
|||||||
diff --git a/toolkit/components/extensions/parent/ext-tabs-base.js b/toolkit/components/extensions/parent/ext-tabs-base.js
|
|
||||||
index d3c2d62406d17a14b0288752c34b6dd4350f032a..2f970d41b8ada9a13fc18b8d2a6607b973983072 100644
|
|
||||||
--- a/toolkit/components/extensions/parent/ext-tabs-base.js
|
|
||||||
+++ b/toolkit/components/extensions/parent/ext-tabs-base.js
|
|
||||||
@@ -1942,6 +1942,7 @@ class TabManagerBase {
|
|
||||||
*/
|
|
||||||
addActiveTabPermission(nativeTab) {
|
|
||||||
let tab = this.getWrapper(nativeTab);
|
|
||||||
+ if (!tab) return; // Empty tabs aren't tracked, nothing to add
|
|
||||||
if (
|
|
||||||
this.extension.hasPermission("activeTab") ||
|
|
||||||
(this.extension.originControls &&
|
|
||||||
@@ -1963,7 +1964,9 @@ class TabManagerBase {
|
|
||||||
* The native tab for which to revoke permissions.
|
|
||||||
*/
|
|
||||||
revokeActiveTabPermission(nativeTab) {
|
|
||||||
- this.getWrapper(nativeTab).activeTabWindowID = null;
|
|
||||||
+ let wrapper = this.getWrapper(nativeTab);
|
|
||||||
+ if (!wrapper) return; // Empty tabs arent tracked, nothing to revoke
|
|
||||||
+ wrapper.activeTabWindowID = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@@ -1976,7 +1979,9 @@ class TabManagerBase {
|
|
||||||
* True if the extension has activeTab permissions for this tab.
|
|
||||||
*/
|
|
||||||
hasActiveTabPermission(nativeTab) {
|
|
||||||
- return this.getWrapper(nativeTab).hasActiveTabPermission;
|
|
||||||
+ let wrapper = this.getWrapper(nativeTab);
|
|
||||||
+ if (!wrapper) return false; // Empty tabs arent tracked, nothing to check
|
|
||||||
+ return wrapper.hasActiveTabPermission;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@@ -1987,6 +1992,7 @@ class TabManagerBase {
|
|
||||||
*/
|
|
||||||
activateScripts(nativeTab) {
|
|
||||||
let tab = this.getWrapper(nativeTab);
|
|
||||||
+ if (!tab) return; // Empty tabs aren't tracked, nothing to activate
|
|
||||||
if (
|
|
||||||
this.extension.originControls &&
|
|
||||||
!tab.matchesHostPermission &&
|
|
||||||
@@ -2019,7 +2025,9 @@ class TabManagerBase {
|
|
||||||
* True if the extension has permissions for this tab.
|
|
||||||
*/
|
|
||||||
hasTabPermission(nativeTab) {
|
|
||||||
- return this.getWrapper(nativeTab).hasTabPermission;
|
|
||||||
+ let wrapper = this.getWrapper(nativeTab);
|
|
||||||
+ if (!wrapper) return false; // Empty tabs arent tracked, nothing to check
|
|
||||||
+ return wrapper.hasTabPermission;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@@ -2066,7 +2074,9 @@ class TabManagerBase {
|
|
||||||
* @returns {object}
|
|
||||||
*/
|
|
||||||
convert(nativeTab, fallbackTabSize = null) {
|
|
||||||
- return this.getWrapper(nativeTab).convert(fallbackTabSize);
|
|
||||||
+ let wrapper = this.getWrapper(nativeTab);
|
|
||||||
+ if (!wrapper) return null; // Empty tabs aren't tracked, can't convert
|
|
||||||
+ return wrapper.convert(fallbackTabSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
@@ -13,3 +13,4 @@
|
|||||||
category app-startup nsBrowserGlue @mozilla.org/browser/browserglue;1 application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
|
category app-startup nsBrowserGlue @mozilla.org/browser/browserglue;1 application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
|
||||||
|
|
||||||
#include common/Components.manifest
|
#include common/Components.manifest
|
||||||
|
#include sessionstore/SessionComponents.manifest
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ let JSWINDOWACTORS = {
|
|||||||
esModuleURI: 'resource:///actors/ZenGlanceChild.sys.mjs',
|
esModuleURI: 'resource:///actors/ZenGlanceChild.sys.mjs',
|
||||||
events: {
|
events: {
|
||||||
DOMContentLoaded: {},
|
DOMContentLoaded: {},
|
||||||
mousedown: {
|
click: {
|
||||||
capture: true,
|
capture: true,
|
||||||
},
|
},
|
||||||
keydown: {
|
keydown: {
|
||||||
|
|||||||
@@ -444,29 +444,29 @@ var gZenUIManager = {
|
|||||||
gURLBar._zenHandleUrlbarClose = null;
|
gURLBar._zenHandleUrlbarClose = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
const isFocusedBefore = gURLBar.focused;
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
// We use this attribute on Tabbrowser::addTab
|
// We use this attribute on Tabbrowser::addTab
|
||||||
gURLBar.removeAttribute('zen-newtab');
|
gURLBar.removeAttribute('zen-newtab');
|
||||||
|
}, 0);
|
||||||
|
|
||||||
// Safely restore tab visual state with proper validation
|
// Safely restore tab visual state with proper validation
|
||||||
if (
|
if (
|
||||||
this._lastTab &&
|
this._lastTab &&
|
||||||
!this._lastTab.closing &&
|
!this._lastTab.closing &&
|
||||||
this._lastTab.ownerGlobal &&
|
this._lastTab.ownerGlobal &&
|
||||||
!this._lastTab.ownerGlobal.closed &&
|
!this._lastTab.ownerGlobal.closed
|
||||||
!onSwitch
|
) {
|
||||||
) {
|
this._lastTab._visuallySelected = true;
|
||||||
this._lastTab._visuallySelected = true;
|
this._lastTab = null;
|
||||||
this._lastTab = null;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Reset newtab buttons
|
// Reset newtab buttons
|
||||||
for (const button of this.newtabButtons) {
|
for (const button of this.newtabButtons) {
|
||||||
button.removeAttribute('in-urlbar');
|
button.removeAttribute('in-urlbar');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle search data
|
// Handle search data
|
||||||
|
if (!onElementPicked) {
|
||||||
if (onSwitch) {
|
if (onSwitch) {
|
||||||
this.clearUrlbarData();
|
this.clearUrlbarData();
|
||||||
} else {
|
} else {
|
||||||
@@ -487,30 +487,28 @@ var gZenUIManager = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
gURLBar.handleRevert();
|
gURLBar.handleRevert();
|
||||||
|
} else if (onElementPicked && onSwitch) {
|
||||||
|
this.clearUrlbarData();
|
||||||
|
}
|
||||||
|
|
||||||
if (isFocusedBefore) {
|
if (gURLBar.focused) {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
window.dispatchEvent(
|
window.dispatchEvent(
|
||||||
new CustomEvent('ZenURLBarClosed', { detail: { onSwitch, onElementPicked } })
|
new CustomEvent('ZenURLBarClosed', { detail: { onSwitch, onElementPicked } })
|
||||||
);
|
);
|
||||||
gURLBar.view.close({ elementPicked: onElementPicked });
|
gURLBar.view.close({ elementPicked: onElementPicked });
|
||||||
gURLBar.updateTextOverflow();
|
gURLBar.updateTextOverflow();
|
||||||
|
|
||||||
if (onElementPicked && onSwitch) {
|
// Ensure tab and browser are valid before updating state
|
||||||
gURLBar.setURI(null, onSwitch);
|
const selectedTab = gBrowser.selectedTab;
|
||||||
|
if (selectedTab && selectedTab.linkedBrowser && !selectedTab.closing && onSwitch) {
|
||||||
|
const browserState = gURLBar.getBrowserState(selectedTab.linkedBrowser);
|
||||||
|
if (browserState) {
|
||||||
|
browserState.urlbarFocused = false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// Ensure tab and browser are valid before updating state
|
}, 0);
|
||||||
const selectedTab = gBrowser.selectedTab;
|
}
|
||||||
if (selectedTab && selectedTab.linkedBrowser && !selectedTab.closing && onSwitch) {
|
|
||||||
const browserState = gURLBar.getBrowserState(selectedTab.linkedBrowser);
|
|
||||||
if (browserState) {
|
|
||||||
browserState.urlbarFocused = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, 0);
|
|
||||||
}
|
|
||||||
}, 0);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
urlbarTrim(aURL) {
|
urlbarTrim(aURL) {
|
||||||
@@ -665,10 +663,7 @@ var gZenUIManager = {
|
|||||||
if (anchor?.closest('#zen-sidebar-top-buttons')) {
|
if (anchor?.closest('#zen-sidebar-top-buttons')) {
|
||||||
block = 'topleft';
|
block = 'topleft';
|
||||||
}
|
}
|
||||||
if (
|
if (gZenVerticalTabsManager._hasSetSingleToolbar && gZenVerticalTabsManager._prefsRightSide) {
|
||||||
(gZenVerticalTabsManager._hasSetSingleToolbar && gZenVerticalTabsManager._prefsRightSide) ||
|
|
||||||
(panel?.id === 'zen-unified-site-data-panel' && !gZenVerticalTabsManager._hasSetSingleToolbar)
|
|
||||||
) {
|
|
||||||
block = 'bottomright';
|
block = 'bottomright';
|
||||||
inline = 'topright';
|
inline = 'topright';
|
||||||
}
|
}
|
||||||
@@ -1308,14 +1303,6 @@ var gZenVerticalTabsManager = {
|
|||||||
} else {
|
} else {
|
||||||
gBrowser.setTabTitle(this._tabEdited);
|
gBrowser.setTabTitle(this._tabEdited);
|
||||||
}
|
}
|
||||||
if (this._tabEdited.getAttribute('zen-pin-id')) {
|
|
||||||
// Update pin title in storage
|
|
||||||
await gZenPinnedTabManager.updatePinTitle(
|
|
||||||
this._tabEdited,
|
|
||||||
this._tabEdited.label,
|
|
||||||
!!newName
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Maybe add some confetti here?!?
|
// Maybe add some confetti here?!?
|
||||||
gZenUIManager.motion.animate(
|
gZenUIManager.motion.animate(
|
||||||
|
|||||||
@@ -152,16 +152,16 @@
|
|||||||
#navigator-toolbox[zen-has-implicit-hover='true'] &,
|
#navigator-toolbox[zen-has-implicit-hover='true'] &,
|
||||||
&[open],
|
&[open],
|
||||||
#urlbar[has-popup-open='true'] &,
|
#urlbar[has-popup-open='true'] &,
|
||||||
:root[zen-has-empty-tab='true'] & {
|
#identity-box[pageproxystate='invalid'] & {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
visibility: visible;
|
visibility: visible;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
:root:not([zen-single-toolbar='true']):not([zen-has-empty-tab='true'])
|
:root:not([zen-single-toolbar='true'])
|
||||||
#urlbar:not([breakout-extend='true'])
|
#urlbar:not([breakout-extend='true'])
|
||||||
.urlbar-input-container {
|
.urlbar-input-container:not([pageproxystate='invalid']) {
|
||||||
padding: 2px 3px;
|
padding: 2px 3px;
|
||||||
gap: 2px;
|
gap: 2px;
|
||||||
|
|
||||||
@@ -184,7 +184,8 @@
|
|||||||
background: transparent !important;
|
background: transparent !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
:root:is([zen-single-toolbar='true'], [zen-has-empty-tab='true']) {
|
:root[zen-single-toolbar='true'],
|
||||||
|
#urlbar[pageproxystate='invalid'] {
|
||||||
#zen-copy-url-button[disabled] {
|
#zen-copy-url-button[disabled] {
|
||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
@@ -312,7 +313,6 @@
|
|||||||
|
|
||||||
:root[zen-single-toolbar='true'] {
|
:root[zen-single-toolbar='true'] {
|
||||||
--urlbar-icon-border-radius: 8px !important;
|
--urlbar-icon-border-radius: 8px !important;
|
||||||
--urlbar-inner-border-radius: var(--toolbarbutton-border-radius) !important;
|
|
||||||
|
|
||||||
#identity-permission-box > *:not(#zen-site-data-icon-button) {
|
#identity-permission-box > *:not(#zen-site-data-icon-button) {
|
||||||
visibility: collapse;
|
visibility: collapse;
|
||||||
@@ -322,8 +322,10 @@
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:not([zen-has-empty-tab='true']) #urlbar:not([breakout-extend='true']) #identity-box {
|
#urlbar:not([breakout-extend='true']) {
|
||||||
order: 2;
|
#identity-box:not([pageproxystate='invalid']) {
|
||||||
|
order: 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#notification-popup-box:not([open]) {
|
#notification-popup-box:not([open]) {
|
||||||
@@ -355,8 +357,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
:root:not([zen-single-toolbar='true']) {
|
:root:not([zen-single-toolbar='true']) {
|
||||||
--urlbar-icon-border-radius: 6px !important;
|
|
||||||
|
|
||||||
#notification-popup-box {
|
#notification-popup-box {
|
||||||
margin: 0 4px 0 0 !important;
|
margin: 0 4px 0 0 !important;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|||||||
@@ -374,9 +374,8 @@ body > #confetti {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.zen-site-data-section {
|
.zen-site-data-section {
|
||||||
gap: 2px;
|
gap: 6px;
|
||||||
padding: 9px;
|
padding: 8px;
|
||||||
padding-bottom: 8px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.zen-site-data-section-header {
|
.zen-site-data-section-header {
|
||||||
@@ -493,7 +492,7 @@ body > #confetti {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media -moz-pref('zen.theme.hide-unified-extensions-button') {
|
@media (-moz-pref('zen.theme.hide-unified-extensions-button')) {
|
||||||
#unified-extensions-button {
|
#unified-extensions-button {
|
||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
@@ -551,7 +550,7 @@ body > #confetti {
|
|||||||
);
|
);
|
||||||
|
|
||||||
box-shadow:
|
box-shadow:
|
||||||
0px 2px 4px rgba(0, 0, 0, 0.1),
|
0px 2px 4px rgba(0, 0, 0, 0.075),
|
||||||
inset 0px 1px 0px light-dark(transparent, rgba(255, 255, 255, 0.15));
|
inset 0px 1px 0px light-dark(transparent, rgba(255, 255, 255, 0.15));
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
--base-border-color: light-dark(rgba(0, 0, 0, 0.175), rgba(255, 255, 255, 0.1));
|
--base-border-color: light-dark(rgba(0, 0, 0, 0.175), rgba(255, 255, 255, 0.1));
|
||||||
|
|||||||
@@ -106,7 +106,7 @@
|
|||||||
right: calc(-1 * var(--actual-zen-sidebar-width) + var(--zen-element-separation) / 2 + 1px);
|
right: calc(-1 * var(--actual-zen-sidebar-width) + var(--zen-element-separation) / 2 + 1px);
|
||||||
}
|
}
|
||||||
|
|
||||||
& .browserSidebarContainer:not([is-zen-split='true']) {
|
& .browserSidebarContainer {
|
||||||
margin-left: 0 !important;
|
margin-left: 0 !important;
|
||||||
margin-right: 0 !important;
|
margin-right: 0 !important;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -150,7 +150,6 @@
|
|||||||
for (let tab of this.allItems.reverse()) {
|
for (let tab of this.allItems.reverse()) {
|
||||||
tab = tab.group.hasAttribute('split-view-group') ? tab.group : tab;
|
tab = tab.group.hasAttribute('split-view-group') ? tab.group : tab;
|
||||||
if (tab.hasAttribute('zen-empty-tab')) {
|
if (tab.hasAttribute('zen-empty-tab')) {
|
||||||
await ZenPinnedTabsStorage.removePin(tab.getAttribute('zen-pin-id'));
|
|
||||||
gBrowser.removeTab(tab);
|
gBrowser.removeTab(tab);
|
||||||
} else {
|
} else {
|
||||||
gBrowser.ungroupTab(tab);
|
gBrowser.ungroupTab(tab);
|
||||||
@@ -160,7 +159,6 @@
|
|||||||
|
|
||||||
async delete() {
|
async delete() {
|
||||||
for (const tab of this.allItemsRecursive) {
|
for (const tab of this.allItemsRecursive) {
|
||||||
await ZenPinnedTabsStorage.removePin(tab.getAttribute('zen-pin-id'));
|
|
||||||
if (tab.hasAttribute('zen-empty-tab')) {
|
if (tab.hasAttribute('zen-empty-tab')) {
|
||||||
// Manually remove the empty tabs as removeTabs() inside removeTabGroup
|
// Manually remove the empty tabs as removeTabs() inside removeTabGroup
|
||||||
// does ignore them.
|
// does ignore them.
|
||||||
|
|||||||
@@ -29,11 +29,9 @@
|
|||||||
return `${month} month${month === 1 ? '' : 's'} ago`;
|
return `${month} month${month === 1 ? '' : 's'} ago`;
|
||||||
}
|
}
|
||||||
|
|
||||||
class nsZenFolders extends nsZenDOMOperatedFeature {
|
const ZEN_MAX_SUBFOLDERS = Services.prefs.getIntPref('zen.folders.max-subfolders');
|
||||||
#ZEN_MAX_SUBFOLDERS = Services.prefs.getIntPref('zen.folders.max-subfolders', 5);
|
|
||||||
#ZEN_EDGE_ZONE_THRESHOLD =
|
|
||||||
Services.prefs.getIntPref('zen.view.drag-and-drop.edge-zone-threshold', 25) / 100;
|
|
||||||
|
|
||||||
|
class nsZenFolders extends nsZenDOMOperatedFeature {
|
||||||
#popup = null;
|
#popup = null;
|
||||||
#popupTimer = null;
|
#popupTimer = null;
|
||||||
#mouseTimer = null;
|
#mouseTimer = null;
|
||||||
@@ -91,7 +89,7 @@
|
|||||||
const newSubfolderItem = document.getElementById('context_zenFolderNewSubfolder');
|
const newSubfolderItem = document.getElementById('context_zenFolderNewSubfolder');
|
||||||
newSubfolderItem.setAttribute(
|
newSubfolderItem.setAttribute(
|
||||||
'disabled',
|
'disabled',
|
||||||
folder.level >= this.#ZEN_MAX_SUBFOLDERS - 1 ? 'true' : 'false'
|
folder.level >= ZEN_MAX_SUBFOLDERS - 1 ? 'true' : 'false'
|
||||||
);
|
);
|
||||||
|
|
||||||
const changeFolderSpace = document
|
const changeFolderSpace = document
|
||||||
@@ -472,7 +470,7 @@
|
|||||||
canDropElement(element, targetElement) {
|
canDropElement(element, targetElement) {
|
||||||
const isZenFolder = element?.isZenFolder;
|
const isZenFolder = element?.isZenFolder;
|
||||||
const level = targetElement?.group?.level + 1;
|
const level = targetElement?.group?.level + 1;
|
||||||
if (isZenFolder && level >= this.#ZEN_MAX_SUBFOLDERS) {
|
if (isZenFolder && level >= ZEN_MAX_SUBFOLDERS) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -510,9 +508,6 @@
|
|||||||
tabs = [emptyTab, ...filteredTabs];
|
tabs = [emptyTab, ...filteredTabs];
|
||||||
|
|
||||||
const folder = this._createFolderNode(options);
|
const folder = this._createFolderNode(options);
|
||||||
if (options.initialPinId) {
|
|
||||||
folder.setAttribute('zen-pin-id', options.initialPinId);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options.insertAfter) {
|
if (options.insertAfter) {
|
||||||
options.insertAfter.after(folder);
|
options.insertAfter.after(folder);
|
||||||
@@ -901,11 +896,7 @@
|
|||||||
const labelContainer = group.querySelector('.tab-group-label-container');
|
const labelContainer = group.querySelector('.tab-group-label-container');
|
||||||
// Setup mouseenter/mouseleave events for the folder
|
// Setup mouseenter/mouseleave events for the folder
|
||||||
labelContainer.addEventListener('mouseenter', (event) => {
|
labelContainer.addEventListener('mouseenter', (event) => {
|
||||||
if (
|
if (!group.collapsed || !Services.prefs.getBoolPref('zen.folders.search.enabled')) {
|
||||||
!group.collapsed ||
|
|
||||||
!Services.prefs.getBoolPref('zen.folders.search.enabled') ||
|
|
||||||
gBrowser.tabContainer.hasAttribute('movingtab')
|
|
||||||
) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.#mouseTimer = setTimeout(() => {
|
this.#mouseTimer = setTimeout(() => {
|
||||||
@@ -946,7 +937,7 @@
|
|||||||
if (!parentFolder && folder.hasAttribute('split-view-group')) continue;
|
if (!parentFolder && folder.hasAttribute('split-view-group')) continue;
|
||||||
const emptyFolderTabs = folder.tabs
|
const emptyFolderTabs = folder.tabs
|
||||||
.filter((tab) => tab.hasAttribute('zen-empty-tab'))
|
.filter((tab) => tab.hasAttribute('zen-empty-tab'))
|
||||||
.map((tab) => tab.getAttribute('zen-pin-id'));
|
.map((tab) => tab.getAttribute('zen-sync-id'));
|
||||||
|
|
||||||
let prevSiblingInfo = null;
|
let prevSiblingInfo = null;
|
||||||
const prevSibling = folder.previousElementSibling;
|
const prevSibling = folder.previousElementSibling;
|
||||||
@@ -955,8 +946,8 @@
|
|||||||
if (prevSibling) {
|
if (prevSibling) {
|
||||||
if (gBrowser.isTabGroup(prevSibling)) {
|
if (gBrowser.isTabGroup(prevSibling)) {
|
||||||
prevSiblingInfo = { type: 'group', id: prevSibling.id };
|
prevSiblingInfo = { type: 'group', id: prevSibling.id };
|
||||||
} else if (gBrowser.isTab(prevSibling) && prevSibling.hasAttribute('zen-pin-id')) {
|
} else if (gBrowser.isTab(prevSibling) && prevSibling.hasAttribute('zen-sync-id')) {
|
||||||
const zenPinId = prevSibling.getAttribute('zen-pin-id');
|
const zenPinId = prevSibling.getAttribute('zen-sync-id');
|
||||||
prevSiblingInfo = { type: 'tab', id: zenPinId };
|
prevSiblingInfo = { type: 'tab', id: zenPinId };
|
||||||
} else {
|
} else {
|
||||||
prevSiblingInfo = { type: 'start', id: null };
|
prevSiblingInfo = { type: 'start', id: null };
|
||||||
@@ -975,7 +966,7 @@
|
|||||||
prevSiblingInfo: prevSiblingInfo,
|
prevSiblingInfo: prevSiblingInfo,
|
||||||
emptyTabIds: emptyFolderTabs,
|
emptyTabIds: emptyFolderTabs,
|
||||||
userIcon: userIcon?.getAttribute('href'),
|
userIcon: userIcon?.getAttribute('href'),
|
||||||
pinId: folder.getAttribute('zen-pin-id'),
|
syncId: folder.getAttribute('zen-sync-id'),
|
||||||
// note: We shouldn't be using the workspace-id anywhere, we are just
|
// note: We shouldn't be using the workspace-id anywhere, we are just
|
||||||
// remembering it for the pinned tabs manager to use it later.
|
// remembering it for the pinned tabs manager to use it later.
|
||||||
workspaceId: folder.getAttribute('zen-workspace-id'),
|
workspaceId: folder.getAttribute('zen-workspace-id'),
|
||||||
@@ -1002,9 +993,9 @@
|
|||||||
tabFolderWorkingData.set(folderData.id, workingData);
|
tabFolderWorkingData.set(folderData.id, workingData);
|
||||||
|
|
||||||
const oldGroup = document.getElementById(folderData.id);
|
const oldGroup = document.getElementById(folderData.id);
|
||||||
folderData.emptyTabIds.forEach((zenPinId) => {
|
folderData.emptyTabIds.forEach((zenSyncId) => {
|
||||||
oldGroup
|
oldGroup
|
||||||
?.querySelector(`tab[zen-pin-id="${zenPinId}"]`)
|
?.querySelector(`tab[zen-sync-id="${zenSyncId}"]`)
|
||||||
?.setAttribute('zen-empty-tab', true);
|
?.setAttribute('zen-empty-tab', true);
|
||||||
});
|
});
|
||||||
if (oldGroup) {
|
if (oldGroup) {
|
||||||
@@ -1017,7 +1008,7 @@
|
|||||||
saveOnWindowClose: folderData.saveOnWindowClose,
|
saveOnWindowClose: folderData.saveOnWindowClose,
|
||||||
workspaceId: folderData.workspaceId,
|
workspaceId: folderData.workspaceId,
|
||||||
});
|
});
|
||||||
folder.setAttribute('zen-pin-id', folderData.pinId);
|
folder.setAttribute('zen-sync-id', folderData.syncId);
|
||||||
workingData.node = folder;
|
workingData.node = folder;
|
||||||
oldGroup.before(folder);
|
oldGroup.before(folder);
|
||||||
} else {
|
} else {
|
||||||
@@ -1050,7 +1041,7 @@
|
|||||||
switch (stateData?.prevSiblingInfo?.type) {
|
switch (stateData?.prevSiblingInfo?.type) {
|
||||||
case 'tab': {
|
case 'tab': {
|
||||||
const tab = parentWorkingData.node.querySelector(
|
const tab = parentWorkingData.node.querySelector(
|
||||||
`[zen-pin-id="${stateData.prevSiblingInfo.id}"]`
|
`[zen-sync-id="${stateData.prevSiblingInfo.id}"]`
|
||||||
);
|
);
|
||||||
tab.after(node);
|
tab.after(node);
|
||||||
break;
|
break;
|
||||||
@@ -1110,8 +1101,7 @@
|
|||||||
(!folder.hasAttribute('split-view-group') || !folder.hasAttribute('selected')) &&
|
(!folder.hasAttribute('split-view-group') || !folder.hasAttribute('selected')) &&
|
||||||
folder !== tab?.group &&
|
folder !== tab?.group &&
|
||||||
!(
|
!(
|
||||||
folder.level >= this.#ZEN_MAX_SUBFOLDERS &&
|
folder.level >= ZEN_MAX_SUBFOLDERS && movingTabs?.some((t) => gBrowser.isTabGroupLabel(t))
|
||||||
movingTabs?.some((t) => gBrowser.isTabGroupLabel(t))
|
|
||||||
)
|
)
|
||||||
) {
|
) {
|
||||||
folder.setAttribute('selected', 'true');
|
folder.setAttribute('selected', 'true');
|
||||||
@@ -1158,24 +1148,40 @@
|
|||||||
let dropElement = currentDropElement;
|
let dropElement = currentDropElement;
|
||||||
let dropBefore = currentDropBefore;
|
let dropBefore = currentDropBefore;
|
||||||
let colorCode = currentColorCode;
|
let colorCode = currentColorCode;
|
||||||
|
let dragUpThreshold =
|
||||||
|
Services.prefs.getIntPref('zen.view.drag-and-drop.drop-inside-upper-threshold') / 100;
|
||||||
|
let dragDownThreshold =
|
||||||
|
Services.prefs.getIntPref('zen.view.drag-and-drop.drop-inside-lower-threshold') / 100;
|
||||||
|
|
||||||
const dropElementGroup = dropElement?.isZenFolder ? dropElement : dropElement?.group;
|
const dropElementGroup = dropElement.group;
|
||||||
|
if (!dropElementGroup) {
|
||||||
|
return { dropElement, colorCode, dropBefore };
|
||||||
|
}
|
||||||
const isSplitGroup = dropElement?.group?.hasAttribute('split-view-group');
|
const isSplitGroup = dropElement?.group?.hasAttribute('split-view-group');
|
||||||
let firstGroupElem =
|
let firstGroupElem =
|
||||||
dropElementGroup.querySelector('.zen-tab-group-start').nextElementSibling;
|
dropElementGroup.querySelector('.zen-tab-group-start').nextElementSibling;
|
||||||
if (gBrowser.isTabGroup(firstGroupElem)) firstGroupElem = firstGroupElem.labelElement;
|
if (gBrowser.isTabGroup(firstGroupElem)) firstGroupElem = firstGroupElem.labelElement;
|
||||||
|
|
||||||
const isInMiddleZone =
|
const isRestrictedGroup = isSplitGroup || dropElementGroup.collapsed;
|
||||||
overlapPercent >= this.#ZEN_EDGE_ZONE_THRESHOLD &&
|
|
||||||
overlapPercent <= 1 - this.#ZEN_EDGE_ZONE_THRESHOLD;
|
const shouldDropInside =
|
||||||
const shouldDropInside = isInMiddleZone && !isSplitGroup;
|
!dropBefore &&
|
||||||
|
overlapPercent >= dragDownThreshold &&
|
||||||
|
overlapPercent <= dragUpThreshold &&
|
||||||
|
!isSplitGroup;
|
||||||
|
const shouldDropNear = overlapPercent < dragUpThreshold || overlapPercent > dragDownThreshold;
|
||||||
|
|
||||||
if (shouldDropInside) {
|
if (shouldDropInside) {
|
||||||
dropElement = firstGroupElem;
|
dropElement = firstGroupElem;
|
||||||
dropBefore = true;
|
dropBefore = true;
|
||||||
this.highlightGroupOnDragOver(dropElementGroup, movingTabs);
|
this.highlightGroupOnDragOver(dropElementGroup, movingTabs);
|
||||||
} else {
|
} else if (shouldDropNear) {
|
||||||
colorCode = undefined;
|
if (dropBefore) {
|
||||||
|
colorCode = undefined;
|
||||||
|
} else if (!isRestrictedGroup) {
|
||||||
|
dropElement = firstGroupElem;
|
||||||
|
dropBefore = true;
|
||||||
|
}
|
||||||
this.highlightGroupOnDragOver(null);
|
this.highlightGroupOnDragOver(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1415,9 +1415,8 @@
|
|||||||
this.overlay.classList.remove('zen-glance-overlay');
|
this.overlay.classList.remove('zen-glance-overlay');
|
||||||
this.#clearContainerStyles(this.browserWrapper);
|
this.#clearContainerStyles(this.browserWrapper);
|
||||||
this.animatingFullOpen = false;
|
this.animatingFullOpen = false;
|
||||||
const glanceID = this.#currentGlanceID;
|
|
||||||
this.closeGlance({ noAnimation: true, skipPermitUnload: true });
|
this.closeGlance({ noAnimation: true, skipPermitUnload: true });
|
||||||
this.#glances.delete(glanceID);
|
this.#glances.delete(this.#currentGlanceID);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -35,12 +35,9 @@ export class ZenGlanceChild extends JSWindowActorChild {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#sendClickDataToParent(target, element) {
|
#sendClickDataToParent(target, element) {
|
||||||
if (!element && !target) {
|
if (!element || !target) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!target) {
|
|
||||||
target = element;
|
|
||||||
}
|
|
||||||
// Get the largest element we can get. If the `A` element
|
// Get the largest element we can get. If the `A` element
|
||||||
// is a parent of the original target, use the anchor element,
|
// is a parent of the original target, use the anchor element,
|
||||||
// otherwise use the original target.
|
// otherwise use the original target.
|
||||||
@@ -57,7 +54,7 @@ export class ZenGlanceChild extends JSWindowActorChild {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
on_mousedown(event) {
|
on_click(event) {
|
||||||
// get closest A element
|
// get closest A element
|
||||||
const target = event.target.closest('A');
|
const target = event.target.closest('A');
|
||||||
const elementToRecord = event.originalTarget || event.target;
|
const elementToRecord = event.originalTarget || event.target;
|
||||||
|
|||||||
@@ -13,4 +13,5 @@ DIRS += [
|
|||||||
"tests",
|
"tests",
|
||||||
"urlbar",
|
"urlbar",
|
||||||
"toolkit",
|
"toolkit",
|
||||||
|
"sessionstore",
|
||||||
]
|
]
|
||||||
|
|||||||
11
src/zen/sessionstore/SessionComponents.manifest
Normal file
11
src/zen/sessionstore/SessionComponents.manifest
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# 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/.
|
||||||
|
|
||||||
|
# Browser global components initializing before UI startup
|
||||||
|
category browser-before-ui-startup resource:///modules/zen/ZenSessionManager.sys.mjs ZenSessionStore.init
|
||||||
|
category browser-before-ui-startup resource:///modules/zen/ZenWindowSync.sys.mjs ZenWindowSync.init
|
||||||
|
|
||||||
|
# App shutdown consumers
|
||||||
|
category browser-quit-application-granted resource:///modules/zen/ZenSessionManager.sys.mjs ZenSessionStore.uninit
|
||||||
|
category browser-quit-application-granted resource:///modules/zen/ZenWindowSync.sys.mjs ZenWindowSync.uninit
|
||||||
40
src/zen/sessionstore/ZenSessionFile.sys.mjs
Normal file
40
src/zen/sessionstore/ZenSessionFile.sys.mjs
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
// 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/.
|
||||||
|
|
||||||
|
// Note that changing this hidden pref will make the previous session file
|
||||||
|
// unused, causing a new session file to be created on next write.
|
||||||
|
const SHOULD_COMPRESS_FILE = Services.prefs.getBoolPref('zen.session-store.compress-file', true);
|
||||||
|
|
||||||
|
const FILE_NAME = SHOULD_COMPRESS_FILE ? 'zen-sessions.jsonlz4' : 'zen-sessions.json';
|
||||||
|
|
||||||
|
export class nsZenSessionFile {
|
||||||
|
#path = PathUtils.join(PathUtils.profileDir, FILE_NAME);
|
||||||
|
#sidebar = [];
|
||||||
|
|
||||||
|
async read() {
|
||||||
|
try {
|
||||||
|
const data = await IOUtils.readJSON(this.#path, { compress: SHOULD_COMPRESS_FILE });
|
||||||
|
this.#sidebar = data.sidebar || [];
|
||||||
|
} catch {
|
||||||
|
// File doesn't exist yet, that's fine.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get sidebar() {
|
||||||
|
return this.#sidebar;
|
||||||
|
}
|
||||||
|
|
||||||
|
set sidebar(data) {
|
||||||
|
this.#sidebar = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
async #write(data) {
|
||||||
|
await IOUtils.writeJSON(this.#path, data, { compress: SHOULD_COMPRESS_FILE });
|
||||||
|
}
|
||||||
|
|
||||||
|
async store() {
|
||||||
|
const data = { sidebar: this.#sidebar };
|
||||||
|
await this.#write(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
172
src/zen/sessionstore/ZenSessionManager.sys.mjs
Normal file
172
src/zen/sessionstore/ZenSessionManager.sys.mjs
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
// 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 lazy = {};
|
||||||
|
|
||||||
|
ChromeUtils.defineESModuleGetters(lazy, {
|
||||||
|
nsZenSessionFile: 'resource:///modules/zen/ZenSessionFile.sys.mjs',
|
||||||
|
PrivateBrowsingUtils: 'resource://gre/modules/PrivateBrowsingUtils.sys.mjs',
|
||||||
|
BrowserWindowTracker: 'resource:///modules/BrowserWindowTracker.sys.mjs',
|
||||||
|
TabGroupState: 'resource:///modules/sessionstore/TabGroupState.sys.mjs',
|
||||||
|
SessionStore: 'resource:///modules/sessionstore/SessionStore.sys.mjs',
|
||||||
|
SessionSaver: 'resource:///modules/sessionstore/SessionSaver.sys.mjs',
|
||||||
|
});
|
||||||
|
|
||||||
|
const LAZY_COLLECT_THRESHOLD = 5 * 60 * 1000; // 5 minutes
|
||||||
|
const OBSERVING = ['sessionstore-state-write-complete', 'browser-window-before-show'];
|
||||||
|
|
||||||
|
class nsZenSessionManager {
|
||||||
|
#file;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.#file = new lazy.nsZenSessionFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called from SessionComponents.manifest on app-startup
|
||||||
|
init() {
|
||||||
|
for (let topic of OBSERVING) {
|
||||||
|
Services.obs.addObserver(this, topic);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uninit() {
|
||||||
|
for (let topic of OBSERVING) {
|
||||||
|
Services.obs.removeObserver(this, topic);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async readFile() {
|
||||||
|
await this.#file.read();
|
||||||
|
}
|
||||||
|
|
||||||
|
onFileRead(initialState) {
|
||||||
|
for (const winData of initialState.windows || []) {
|
||||||
|
this.restoreWindowData(winData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get #sidebar() {
|
||||||
|
return this.#file.sidebar;
|
||||||
|
}
|
||||||
|
|
||||||
|
set #sidebar(data) {
|
||||||
|
this.#file.sidebar = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
observe(aSubject, aTopic) {
|
||||||
|
switch (aTopic) {
|
||||||
|
case 'sessionstore-state-write-complete': {
|
||||||
|
this.#saveState(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'browser-window-before-show': // catch new windows
|
||||||
|
this.#onBeforeBrowserWindowShown(aSubject);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Handles the browser-window-before-show observer notification. */
|
||||||
|
#onBeforeBrowserWindowShown(aWindow) {
|
||||||
|
// TODO: Initialize new window
|
||||||
|
void aWindow;
|
||||||
|
}
|
||||||
|
|
||||||
|
get #topMostWindow() {
|
||||||
|
return lazy.BrowserWindowTracker.getTopWindow();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
async #saveState(forceUpdateAllWindows = false) {
|
||||||
|
if (lazy.PrivateBrowsingUtils.permanentPrivateBrowsing) {
|
||||||
|
// Don't save (or even collect) anything in permanent private
|
||||||
|
// browsing mode
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Collect an initial snapshot of window data before we do the flush.
|
||||||
|
const window = this.#topMostWindow;
|
||||||
|
// We don't have any normal windows or no windows at all
|
||||||
|
if (!window) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.#collectWindowData(this.#topMostWindow, forceUpdateAllWindows);
|
||||||
|
this.#file.store();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collects session data for a given window.
|
||||||
|
*
|
||||||
|
* @param window
|
||||||
|
* The window to collect data for.
|
||||||
|
* @param forceUpdate
|
||||||
|
* Forces us to recollect data and will bypass and update the
|
||||||
|
* corresponding caches.
|
||||||
|
*/
|
||||||
|
#collectWindowData(window, forceUpdate = false) {
|
||||||
|
let sidebarData = this.#sidebar;
|
||||||
|
if (!sidebarData || forceUpdate) {
|
||||||
|
sidebarData = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
// If it hasn't changed, don't update.
|
||||||
|
if (
|
||||||
|
!forceUpdate &&
|
||||||
|
sidebarData.lastCollected &&
|
||||||
|
Date.now() - sidebarData.lastCollected < LAZY_COLLECT_THRESHOLD
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sidebarData.lastCollected = Date.now();
|
||||||
|
this.#collectTabsData(window, sidebarData);
|
||||||
|
this.#sidebar = sidebarData;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collects session data for all tabs in a given window.
|
||||||
|
*
|
||||||
|
* @param aWindow
|
||||||
|
* The window to collect tab data for.
|
||||||
|
* @param winData
|
||||||
|
* The window data object to populate.
|
||||||
|
*/
|
||||||
|
#collectTabsData(aWindow, sidebarData) {
|
||||||
|
const winData = lazy.SessionStore.getWindowState(aWindow).windows[0];
|
||||||
|
if (!winData) return;
|
||||||
|
sidebarData.tabs = winData.tabs;
|
||||||
|
sidebarData.folders = winData.folders;
|
||||||
|
sidebarData.splitViewData = winData.splitViewData;
|
||||||
|
sidebarData.groups = winData.groups;
|
||||||
|
}
|
||||||
|
|
||||||
|
restoreWindowData(aWindowData) {
|
||||||
|
const sidebar = this.#file.sidebar;
|
||||||
|
if (!sidebar) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
aWindowData.tabs = sidebar.tabs || [];
|
||||||
|
aWindowData.splitViewData = sidebar.splitViewData;
|
||||||
|
aWindowData.folders = sidebar.folders;
|
||||||
|
aWindowData.groups = sidebar.groups;
|
||||||
|
}
|
||||||
|
|
||||||
|
restoreNewWindow(aWindow, SessionStoreInternal) {
|
||||||
|
lazy.SessionSaver.run().then(() => {
|
||||||
|
const state = lazy.SessionStore.getCurrentState(true);
|
||||||
|
const windows = state.windows || {};
|
||||||
|
let newWindow = Cu.cloneInto(windows[0], {});
|
||||||
|
delete newWindow.selected;
|
||||||
|
const newState = { windows: [newWindow] };
|
||||||
|
SessionStoreInternal.restoreWindows(aWindow, newState, {});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ZenSessionStore = new nsZenSessionManager();
|
||||||
@@ -15,8 +15,8 @@
|
|||||||
if (tabData.zenWorkspace) {
|
if (tabData.zenWorkspace) {
|
||||||
tab.setAttribute('zen-workspace-id', tabData.zenWorkspace);
|
tab.setAttribute('zen-workspace-id', tabData.zenWorkspace);
|
||||||
}
|
}
|
||||||
if (tabData.zenPinnedId) {
|
if (tabData.zenSyncId) {
|
||||||
tab.setAttribute('zen-pin-id', tabData.zenPinnedId);
|
tab.setAttribute('zen-sync-id', tabData.zenSyncId);
|
||||||
}
|
}
|
||||||
if (tabData.zenHasStaticLabel) {
|
if (tabData.zenHasStaticLabel) {
|
||||||
tab.setAttribute('zen-has-static-label', 'true');
|
tab.setAttribute('zen-has-static-label', 'true');
|
||||||
25
src/zen/sessionstore/ZenWindowSync.sys.mjs
Normal file
25
src/zen/sessionstore/ZenWindowSync.sys.mjs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
// 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 OBSERVING = ['browser-window-before-show'];
|
||||||
|
|
||||||
|
class nsZenWindowSync {
|
||||||
|
constructor() {}
|
||||||
|
|
||||||
|
init() {
|
||||||
|
for (let topic of OBSERVING) {
|
||||||
|
Services.obs.addObserver(this, topic);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uninit() {
|
||||||
|
for (let topic of OBSERVING) {
|
||||||
|
Services.obs.removeObserver(this, topic);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
observe(aSubject, aTopic) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ZenWindowSync = new nsZenWindowSync();
|
||||||
9
src/zen/sessionstore/moz.build
Normal file
9
src/zen/sessionstore/moz.build
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# 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/.
|
||||||
|
|
||||||
|
EXTRA_JS_MODULES.zen += [
|
||||||
|
"ZenSessionFile.sys.mjs",
|
||||||
|
"ZenSessionManager.sys.mjs",
|
||||||
|
"ZenWindowSync.sys.mjs",
|
||||||
|
]
|
||||||
@@ -1067,88 +1067,86 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
|
|||||||
* @param {string|undefined} gridType - The type of grid layout.
|
* @param {string|undefined} gridType - The type of grid layout.
|
||||||
*/
|
*/
|
||||||
splitTabs(tabs, gridType, initialIndex = 0) {
|
splitTabs(tabs, gridType, initialIndex = 0) {
|
||||||
this.#withoutSplitViewTransition(() => {
|
// TODO: Add support for splitting essential tabs
|
||||||
// TODO: Add support for splitting essential tabs
|
tabs = tabs.filter((t) => !t.hidden && !t.hasAttribute('zen-empty-tab'));
|
||||||
tabs = tabs.filter((t) => !t.hidden && !t.hasAttribute('zen-empty-tab'));
|
if (tabs.length < 2 || tabs.length > this.MAX_TABS) {
|
||||||
if (tabs.length < 2 || tabs.length > this.MAX_TABS) {
|
return;
|
||||||
return;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
const existingSplitTab = tabs.find((tab) => tab.splitView);
|
const existingSplitTab = tabs.find((tab) => tab.splitView);
|
||||||
if (existingSplitTab) {
|
if (existingSplitTab) {
|
||||||
this._moveTabsToContainer(tabs, tabs[initialIndex]);
|
this._moveTabsToContainer(tabs, tabs[initialIndex]);
|
||||||
const groupIndex = this._data.findIndex((group) => group.tabs.includes(existingSplitTab));
|
const groupIndex = this._data.findIndex((group) => group.tabs.includes(existingSplitTab));
|
||||||
const group = this._data[groupIndex];
|
const group = this._data[groupIndex];
|
||||||
const gridTypeChange = gridType && group.gridType !== gridType;
|
const gridTypeChange = gridType && group.gridType !== gridType;
|
||||||
const newTabsAdded = tabs.find((t) => !group.tabs.includes(t));
|
const newTabsAdded = tabs.find((t) => !group.tabs.includes(t));
|
||||||
if (gridTypeChange || !newTabsAdded) {
|
if (gridTypeChange || !newTabsAdded) {
|
||||||
// reset layout
|
// reset layout
|
||||||
group.gridType = gridType;
|
group.gridType = gridType;
|
||||||
group.layoutTree = this.calculateLayoutTree(
|
group.layoutTree = this.calculateLayoutTree(
|
||||||
[...new Set(group.tabs.concat(tabs))],
|
[...new Set(group.tabs.concat(tabs))],
|
||||||
gridType
|
gridType
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
// Add any tabs that are not already in the group
|
// Add any tabs that are not already in the group
|
||||||
for (let i = 0; i < tabs.length; i++) {
|
|
||||||
const tab = tabs[i];
|
|
||||||
if (!group.tabs.includes(tab)) {
|
|
||||||
gBrowser.moveTabToGroup(tab, this._getSplitViewGroup(tabs));
|
|
||||||
group.tabs.push(tab);
|
|
||||||
this.addTabToSplit(tab, group.layoutTree);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (this._sessionRestoring) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.activateSplitView(group, true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We are here if none of the tabs have been previously split
|
|
||||||
// If there's ANY pinned tab on the list, we clone the pinned tab
|
|
||||||
// state to all the tabs
|
|
||||||
const allArePinned = tabs.every((tab) => tab.pinned);
|
|
||||||
const thereIsOnePinned = tabs.some((tab) => tab.pinned);
|
|
||||||
const thereIsOneEssential = tabs.some((tab) => tab.hasAttribute('zen-essential'));
|
|
||||||
|
|
||||||
if (thereIsOneEssential || (thereIsOnePinned && !allArePinned)) {
|
|
||||||
for (let i = 0; i < tabs.length; i++) {
|
for (let i = 0; i < tabs.length; i++) {
|
||||||
const tab = tabs[i];
|
const tab = tabs[i];
|
||||||
if (tab.pinned) {
|
if (!group.tabs.includes(tab)) {
|
||||||
tabs[i] = gBrowser.duplicateTab(tab, true);
|
gBrowser.moveTabToGroup(tab, this._getSplitViewGroup(tabs));
|
||||||
|
group.tabs.push(tab);
|
||||||
|
this.addTabToSplit(tab, group.layoutTree);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gridType ??= 'grid';
|
|
||||||
|
|
||||||
const splitData = {
|
|
||||||
tabs,
|
|
||||||
gridType,
|
|
||||||
layoutTree: this.calculateLayoutTree(tabs, gridType),
|
|
||||||
};
|
|
||||||
this._data.push(splitData);
|
|
||||||
if (!this._sessionRestoring) {
|
|
||||||
window.gBrowser.selectedTab = tabs[initialIndex] ?? tabs[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add tabs to the split view group
|
|
||||||
let splitGroup = this._getSplitViewGroup(tabs);
|
|
||||||
if (splitGroup) {
|
|
||||||
for (const tab of tabs) {
|
|
||||||
if (!tab.group || tab.group !== splitGroup) {
|
|
||||||
gBrowser.moveTabToGroup(tab, splitGroup);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._sessionRestoring) {
|
if (this._sessionRestoring) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.activateSplitView(splitData);
|
this.activateSplitView(group, true);
|
||||||
});
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We are here if none of the tabs have been previously split
|
||||||
|
// If there's ANY pinned tab on the list, we clone the pinned tab
|
||||||
|
// state to all the tabs
|
||||||
|
const allArePinned = tabs.every((tab) => tab.pinned);
|
||||||
|
const thereIsOnePinned = tabs.some((tab) => tab.pinned);
|
||||||
|
const thereIsOneEssential = tabs.some((tab) => tab.hasAttribute('zen-essential'));
|
||||||
|
|
||||||
|
if (thereIsOneEssential || (thereIsOnePinned && !allArePinned)) {
|
||||||
|
for (let i = 0; i < tabs.length; i++) {
|
||||||
|
const tab = tabs[i];
|
||||||
|
if (tab.pinned) {
|
||||||
|
tabs[i] = gBrowser.duplicateTab(tab, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gridType ??= 'grid';
|
||||||
|
|
||||||
|
const splitData = {
|
||||||
|
tabs,
|
||||||
|
gridType,
|
||||||
|
layoutTree: this.calculateLayoutTree(tabs, gridType),
|
||||||
|
};
|
||||||
|
this._data.push(splitData);
|
||||||
|
if (!this._sessionRestoring) {
|
||||||
|
window.gBrowser.selectedTab = tabs[initialIndex] ?? tabs[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add tabs to the split view group
|
||||||
|
let splitGroup = this._getSplitViewGroup(tabs);
|
||||||
|
if (splitGroup) {
|
||||||
|
for (const tab of tabs) {
|
||||||
|
if (!tab.group || tab.group !== splitGroup) {
|
||||||
|
gBrowser.moveTabToGroup(tab, splitGroup);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._sessionRestoring) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.activateSplitView(splitData);
|
||||||
}
|
}
|
||||||
|
|
||||||
addTabToSplit(tab, splitNode, prepend = true) {
|
addTabToSplit(tab, splitNode, prepend = true) {
|
||||||
@@ -1931,17 +1929,6 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#withoutSplitViewTransition(callback) {
|
|
||||||
this.tabBrowserPanel.classList.add('zen-split-view-no-transition');
|
|
||||||
try {
|
|
||||||
callback();
|
|
||||||
} finally {
|
|
||||||
requestAnimationFrame(() => {
|
|
||||||
this.tabBrowserPanel.classList.remove('zen-split-view-no-transition');
|
|
||||||
}, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
createEmptySplit() {
|
createEmptySplit() {
|
||||||
const selectedTab = gBrowser.selectedTab;
|
const selectedTab = gBrowser.selectedTab;
|
||||||
const emptyTab = gZenWorkspaces._emptyTab;
|
const emptyTab = gZenWorkspaces._emptyTab;
|
||||||
@@ -1988,13 +1975,6 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
|
|||||||
gZenUIManager.handleNewTab(false, false, 'tab', true);
|
gZenUIManager.handleNewTab(false, false, 'tab', true);
|
||||||
}, 0);
|
}, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
get splitViewBrowsers() {
|
|
||||||
if (this.currentView < 0) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
return this._data[this.currentView].tabs.map((tab) => tab.linkedBrowser);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
window.gZenViewSplitter = new nsZenViewSplitter();
|
window.gZenViewSplitter = new nsZenViewSplitter();
|
||||||
|
|||||||
@@ -58,7 +58,7 @@
|
|||||||
margin-top: 0 !important;
|
margin-top: 0 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
#tabbrowser-tabpanels[zen-split-view='true']:not(.zen-split-view-no-transition):not([zen-split-resizing]) > [zen-split='true'] {
|
#tabbrowser-tabpanels[zen-split-view='true']:not([zen-split-resizing]) > [zen-split='true'] {
|
||||||
transition: inset 0.09s ease-out !important;
|
transition: inset 0.09s ease-out !important;
|
||||||
& browser {
|
& browser {
|
||||||
transition: opacity 0.2s ease-out !important;
|
transition: opacity 0.2s ease-out !important;
|
||||||
|
|||||||
@@ -5,23 +5,7 @@
|
|||||||
const lazy = {};
|
const lazy = {};
|
||||||
|
|
||||||
class ZenPinnedTabsObserver {
|
class ZenPinnedTabsObserver {
|
||||||
static ALL_EVENTS = [
|
static ALL_EVENTS = ['TabPinned', 'TabUnpinned'];
|
||||||
'TabPinned',
|
|
||||||
'TabUnpinned',
|
|
||||||
'TabMove',
|
|
||||||
'TabGroupCreate',
|
|
||||||
'TabGroupRemoved',
|
|
||||||
'TabGroupMoved',
|
|
||||||
'ZenFolderRenamed',
|
|
||||||
'ZenFolderIconChanged',
|
|
||||||
'TabGroupCollapse',
|
|
||||||
'TabGroupExpand',
|
|
||||||
'TabGrouped',
|
|
||||||
'TabUngrouped',
|
|
||||||
'ZenFolderChangedWorkspace',
|
|
||||||
'TabAddedToEssentials',
|
|
||||||
'TabRemovedFromEssentials',
|
|
||||||
];
|
|
||||||
|
|
||||||
#listeners = [];
|
#listeners = [];
|
||||||
|
|
||||||
@@ -101,22 +85,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
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 (tab.hasAttribute('zen-essential')) {
|
||||||
try {
|
tab.style.setProperty('--zen-essential-tab-icon', `url(${iconUrl})`);
|
||||||
setTimeout(async () => {
|
|
||||||
const favicon = await this.getFaviconAsBase64(tab.linkedBrowser.currentURI);
|
|
||||||
if (favicon) {
|
|
||||||
gBrowser.setIcon(tab, favicon);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} catch {
|
|
||||||
// Handle error
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (tab.hasAttribute('zen-essential')) {
|
|
||||||
tab.style.setProperty('--zen-essential-tab-icon', `url(${iconUrl})`);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -148,261 +120,6 @@
|
|||||||
return lazy.zenTabsEssentialsMax;
|
return lazy.zenTabsEssentialsMax;
|
||||||
}
|
}
|
||||||
|
|
||||||
async refreshPinnedTabs({ init = false } = {}) {
|
|
||||||
if (!this.enabled) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
await ZenPinnedTabsStorage.promiseInitialized;
|
|
||||||
await this.#initializePinsCache();
|
|
||||||
setTimeout(async () => {
|
|
||||||
// Execute in a separate task to avoid blocking the main thread
|
|
||||||
await SessionStore.promiseAllWindowsRestored;
|
|
||||||
await gZenWorkspaces.promiseInitialized;
|
|
||||||
await this.#initializePinnedTabs(init);
|
|
||||||
if (init) {
|
|
||||||
this._hasFinishedLoading = true;
|
|
||||||
}
|
|
||||||
}, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
async #initializePinsCache() {
|
|
||||||
try {
|
|
||||||
// Get pin data
|
|
||||||
const pins = await ZenPinnedTabsStorage.getPins();
|
|
||||||
|
|
||||||
// Enhance pins with favicons
|
|
||||||
this._pinsCache = await Promise.all(
|
|
||||||
pins.map(async (pin) => {
|
|
||||||
try {
|
|
||||||
if (pin.isGroup) {
|
|
||||||
return pin; // Skip groups for now
|
|
||||||
}
|
|
||||||
const image = await this.getFaviconAsBase64(Services.io.newURI(pin.url));
|
|
||||||
return {
|
|
||||||
...pin,
|
|
||||||
iconUrl: image || null,
|
|
||||||
};
|
|
||||||
} catch {
|
|
||||||
// If favicon fetch fails, continue without icon
|
|
||||||
return {
|
|
||||||
...pin,
|
|
||||||
iconUrl: null,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
} catch (ex) {
|
|
||||||
console.error('Failed to initialize pins cache:', ex);
|
|
||||||
this._pinsCache = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
this.log(`Initialized pins cache with ${this._pinsCache.length} pins`);
|
|
||||||
return this._pinsCache;
|
|
||||||
}
|
|
||||||
|
|
||||||
#finishedInitializingPins() {
|
|
||||||
if (this.hasInitializedPins) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this._resolvePinnedInitializedInternal();
|
|
||||||
delete this._resolvePinnedInitializedInternal;
|
|
||||||
this.hasInitializedPins = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
async #initializePinnedTabs(init = false) {
|
|
||||||
const pins = this._pinsCache;
|
|
||||||
if (!pins?.length || !init) {
|
|
||||||
this.#finishedInitializingPins();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const pinnedTabsByUUID = new Map();
|
|
||||||
const pinsToCreate = new Set(pins.map((p) => p.uuid));
|
|
||||||
|
|
||||||
// First pass: identify existing tabs and remove those without pins
|
|
||||||
for (let tab of gZenWorkspaces.allStoredTabs) {
|
|
||||||
const pinId = tab.getAttribute('zen-pin-id');
|
|
||||||
if (!pinId) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pinsToCreate.has(pinId)) {
|
|
||||||
// This is a valid pinned tab that matches a pin
|
|
||||||
pinnedTabsByUUID.set(pinId, tab);
|
|
||||||
pinsToCreate.delete(pinId);
|
|
||||||
|
|
||||||
if (lazy.zenPinnedTabRestorePinnedTabsToPinnedUrl && init) {
|
|
||||||
this._resetTabToStoredState(tab);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// This is a pinned tab that no longer has a corresponding pin
|
|
||||||
gBrowser.removeTab(tab);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const group of gZenWorkspaces.allTabGroups) {
|
|
||||||
const pinId = group.getAttribute('zen-pin-id');
|
|
||||||
if (!pinId) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (pinsToCreate.has(pinId)) {
|
|
||||||
// This is a valid pinned group that matches a pin
|
|
||||||
pinsToCreate.delete(pinId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Second pass: For every existing tab, update its label
|
|
||||||
// and set 'zen-has-static-label' attribute if it's been edited
|
|
||||||
for (let pin of pins) {
|
|
||||||
const tab = pinnedTabsByUUID.get(pin.uuid);
|
|
||||||
if (!tab) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
tab.removeAttribute('zen-has-static-label'); // So we can set it again
|
|
||||||
if (pin.title && pin.editedTitle) {
|
|
||||||
gBrowser._setTabLabel(tab, pin.title, { beforeTabOpen: true });
|
|
||||||
tab.setAttribute('zen-has-static-label', 'true');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const groups = new Map();
|
|
||||||
const pendingTabsInsideGroups = {};
|
|
||||||
|
|
||||||
// Third pass: create new tabs for pins that don't have tabs
|
|
||||||
for (let pin of pins) {
|
|
||||||
try {
|
|
||||||
if (!pinsToCreate.has(pin.uuid)) {
|
|
||||||
continue; // Skip pins that already have tabs
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pin.isGroup) {
|
|
||||||
const tabs = [];
|
|
||||||
// If there's already existing tabs, let's use them
|
|
||||||
for (const [uuid, existingTab] of pinnedTabsByUUID) {
|
|
||||||
const pinObject = this._pinsCache.find((p) => p.uuid === uuid);
|
|
||||||
if (pinObject && pinObject.parentUuid === pin.uuid) {
|
|
||||||
tabs.push(existingTab);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// We still need to iterate through pending tabs since the database
|
|
||||||
// query doesn't guarantee the order of insertion
|
|
||||||
for (const [parentUuid, folderTabs] of Object.entries(pendingTabsInsideGroups)) {
|
|
||||||
if (parentUuid === pin.uuid) {
|
|
||||||
tabs.push(...folderTabs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const group = gZenFolders.createFolder(tabs, {
|
|
||||||
label: pin.title,
|
|
||||||
collapsed: pin.isFolderCollapsed,
|
|
||||||
initialPinId: pin.uuid,
|
|
||||||
workspaceId: pin.workspaceUuid,
|
|
||||||
insertAfter:
|
|
||||||
groups.get(pin.parentUuid)?.querySelector('.tab-group-container')?.lastChild ||
|
|
||||||
null,
|
|
||||||
});
|
|
||||||
gZenFolders.setFolderUserIcon(group, pin.folderIcon);
|
|
||||||
groups.set(pin.uuid, group);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
let params = {
|
|
||||||
skipAnimation: true,
|
|
||||||
allowInheritPrincipal: false,
|
|
||||||
skipBackgroundNotify: true,
|
|
||||||
userContextId: pin.containerTabId || 0,
|
|
||||||
createLazyBrowser: true,
|
|
||||||
skipLoad: true,
|
|
||||||
noInitialLabel: false,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Create and initialize the tab
|
|
||||||
let newTab = gBrowser.addTrustedTab(pin.url, params);
|
|
||||||
newTab.setAttribute('zenDefaultUserContextId', true);
|
|
||||||
|
|
||||||
// Set initial label/title
|
|
||||||
if (pin.title) {
|
|
||||||
gBrowser.setInitialTabTitle(newTab, pin.title);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the icon if we have it cached
|
|
||||||
if (pin.iconUrl) {
|
|
||||||
gBrowser.setIcon(newTab, pin.iconUrl);
|
|
||||||
}
|
|
||||||
|
|
||||||
newTab.setAttribute('zen-pin-id', pin.uuid);
|
|
||||||
|
|
||||||
if (pin.workspaceUuid) {
|
|
||||||
newTab.setAttribute('zen-workspace-id', pin.workspaceUuid);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pin.isEssential) {
|
|
||||||
newTab.setAttribute('zen-essential', 'true');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pin.editedTitle) {
|
|
||||||
newTab.setAttribute('zen-has-static-label', 'true');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize browser state if needed
|
|
||||||
if (!newTab.linkedBrowser._remoteAutoRemoved) {
|
|
||||||
let state = {
|
|
||||||
entries: [
|
|
||||||
{
|
|
||||||
url: pin.url,
|
|
||||||
title: pin.title,
|
|
||||||
triggeringPrincipal_base64: E10SUtils.SERIALIZED_SYSTEMPRINCIPAL,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
userContextId: pin.containerTabId || 0,
|
|
||||||
image: pin.iconUrl,
|
|
||||||
};
|
|
||||||
|
|
||||||
SessionStore.setTabState(newTab, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.log(`Created new pinned tab for pin ${pin.uuid} (isEssential: ${pin.isEssential})`);
|
|
||||||
gBrowser.pinTab(newTab);
|
|
||||||
|
|
||||||
if (pin.parentUuid) {
|
|
||||||
const parentGroup = groups.get(pin.parentUuid);
|
|
||||||
if (parentGroup) {
|
|
||||||
parentGroup.querySelector('.tab-group-container').appendChild(newTab);
|
|
||||||
} else {
|
|
||||||
if (pendingTabsInsideGroups[pin.parentUuid]) {
|
|
||||||
pendingTabsInsideGroups[pin.parentUuid].push(newTab);
|
|
||||||
} else {
|
|
||||||
pendingTabsInsideGroups[pin.parentUuid] = [newTab];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (!pin.isEssential) {
|
|
||||||
const container = gZenWorkspaces.workspaceElement(
|
|
||||||
pin.workspaceUuid
|
|
||||||
)?.pinnedTabsContainer;
|
|
||||||
if (container) {
|
|
||||||
container.insertBefore(newTab, container.lastChild);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
gZenWorkspaces.getEssentialsSection(pin.containerTabId).appendChild(newTab);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gBrowser.tabContainer._invalidateCachedTabs();
|
|
||||||
newTab.initialize();
|
|
||||||
} catch (ex) {
|
|
||||||
console.error('Failed to initialize pinned tabs:', ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
setTimeout(() => {
|
|
||||||
this.#finishedInitializingPins();
|
|
||||||
}, 0);
|
|
||||||
|
|
||||||
gBrowser._updateTabBarForPinnedTabs();
|
|
||||||
gZenUIManager.updateTabsToolbar();
|
|
||||||
}
|
|
||||||
|
|
||||||
_onPinnedTabEvent(action, event) {
|
_onPinnedTabEvent(action, event) {
|
||||||
if (!this.enabled) return;
|
if (!this.enabled) return;
|
||||||
const tab = event.target;
|
const tab = event.target;
|
||||||
@@ -412,238 +129,22 @@
|
|||||||
}
|
}
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case 'TabPinned':
|
case 'TabPinned':
|
||||||
case 'TabAddedToEssentials':
|
|
||||||
tab._zenClickEventListener = this._zenClickEventListener;
|
tab._zenClickEventListener = this._zenClickEventListener;
|
||||||
tab.addEventListener('click', tab._zenClickEventListener);
|
tab.addEventListener('click', tab._zenClickEventListener);
|
||||||
this._setPinnedAttributes(tab);
|
|
||||||
break;
|
break;
|
||||||
case 'TabRemovedFromEssentials':
|
|
||||||
if (tab.pinned) {
|
|
||||||
this.#onTabMove(tab);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// [Fall through]
|
// [Fall through]
|
||||||
case 'TabUnpinned':
|
case 'TabUnpinned':
|
||||||
this._removePinnedAttributes(tab);
|
|
||||||
if (tab._zenClickEventListener) {
|
if (tab._zenClickEventListener) {
|
||||||
tab.removeEventListener('click', tab._zenClickEventListener);
|
tab.removeEventListener('click', tab._zenClickEventListener);
|
||||||
delete tab._zenClickEventListener;
|
delete tab._zenClickEventListener;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'TabMove':
|
|
||||||
this.#onTabMove(tab);
|
|
||||||
break;
|
|
||||||
case 'TabGroupCreate':
|
|
||||||
this.#onTabGroupCreate(event);
|
|
||||||
break;
|
|
||||||
case 'TabGroupRemoved':
|
|
||||||
this.#onTabGroupRemoved(event);
|
|
||||||
break;
|
|
||||||
case 'TabGroupMoved':
|
|
||||||
this.#onTabGroupMoved(event);
|
|
||||||
break;
|
|
||||||
case 'ZenFolderRenamed':
|
|
||||||
case 'ZenFolderIconChanged':
|
|
||||||
case 'TabGroupCollapse':
|
|
||||||
case 'TabGroupExpand':
|
|
||||||
case 'ZenFolderChangedWorkspace':
|
|
||||||
this.#updateGroupInfo(event.originalTarget, action);
|
|
||||||
break;
|
|
||||||
case 'TabGrouped':
|
|
||||||
this.#onTabGrouped(event);
|
|
||||||
break;
|
|
||||||
case 'TabUngrouped':
|
|
||||||
this.#onTabUngrouped(event);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
console.warn('ZenPinnedTabManager: Unhandled tab event', action);
|
console.warn('ZenPinnedTabManager: Unhandled tab event', action);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async #onTabGroupCreate(event) {
|
|
||||||
const group = event.originalTarget;
|
|
||||||
if (!group.isZenFolder) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (group.hasAttribute('zen-pin-id')) {
|
|
||||||
return; // Group already exists in storage
|
|
||||||
}
|
|
||||||
const workspaceId = group.getAttribute('zen-workspace-id');
|
|
||||||
let id = await ZenPinnedTabsStorage.createGroup(
|
|
||||||
group.name,
|
|
||||||
group.iconURL,
|
|
||||||
group.collapsed,
|
|
||||||
workspaceId,
|
|
||||||
group.getAttribute('zen-pin-id'),
|
|
||||||
group._pPos
|
|
||||||
);
|
|
||||||
group.setAttribute('zen-pin-id', id);
|
|
||||||
for (const tab of group.tabs) {
|
|
||||||
// Only add it if the tab is directly under the group
|
|
||||||
if (
|
|
||||||
tab.pinned &&
|
|
||||||
tab.hasAttribute('zen-pin-id') &&
|
|
||||||
tab.group === group &&
|
|
||||||
this.hasInitializedPins
|
|
||||||
) {
|
|
||||||
const tabPinId = tab.getAttribute('zen-pin-id');
|
|
||||||
await ZenPinnedTabsStorage.addTabToGroup(tabPinId, id, /* position */ tab._pPos);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
await this.refreshPinnedTabs();
|
|
||||||
}
|
|
||||||
|
|
||||||
async #onTabGrouped(event) {
|
|
||||||
const tab = event.detail;
|
|
||||||
const group = tab.group;
|
|
||||||
if (!group.isZenFolder) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const pinId = group.getAttribute('zen-pin-id');
|
|
||||||
const tabPinId = tab.getAttribute('zen-pin-id');
|
|
||||||
const tabPin = this._pinsCache?.find((p) => p.uuid === tabPinId);
|
|
||||||
if (!tabPin || !tabPin.group) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ZenPinnedTabsStorage.addTabToGroup(tabPinId, pinId, /* position */ tab._pPos);
|
|
||||||
}
|
|
||||||
|
|
||||||
async #onTabUngrouped(event) {
|
|
||||||
const tab = event.detail;
|
|
||||||
const group = tab.group;
|
|
||||||
if (!group?.isZenFolder) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const tabPinId = tab.getAttribute('zen-pin-id');
|
|
||||||
const tabPin = this._pinsCache?.find((p) => p.uuid === tabPinId);
|
|
||||||
if (!tabPin) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ZenPinnedTabsStorage.removeTabFromGroup(tabPinId, /* position */ tab._pPos);
|
|
||||||
}
|
|
||||||
|
|
||||||
async #updateGroupInfo(group, action) {
|
|
||||||
if (!group?.isZenFolder) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const pinId = group.getAttribute('zen-pin-id');
|
|
||||||
const groupPin = this._pinsCache?.find((p) => p.uuid === pinId);
|
|
||||||
if (groupPin) {
|
|
||||||
groupPin.title = group.name;
|
|
||||||
groupPin.folderIcon = group.iconURL;
|
|
||||||
groupPin.isFolderCollapsed = group.collapsed;
|
|
||||||
groupPin.position = group._pPos;
|
|
||||||
groupPin.parentUuid = group.group?.getAttribute('zen-pin-id') || null;
|
|
||||||
groupPin.workspaceUuid = group.getAttribute('zen-workspace-id') || null;
|
|
||||||
await this.savePin(groupPin);
|
|
||||||
switch (action) {
|
|
||||||
case 'ZenFolderRenamed':
|
|
||||||
case 'ZenFolderIconChanged':
|
|
||||||
case 'TabGroupCollapse':
|
|
||||||
case 'TabGroupExpand':
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
for (const item of group.allItems) {
|
|
||||||
if (gBrowser.isTabGroup(item)) {
|
|
||||||
await this.#updateGroupInfo(item, action);
|
|
||||||
} else {
|
|
||||||
await this.#onTabMove(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async #onTabGroupRemoved(event) {
|
|
||||||
const group = event.originalTarget;
|
|
||||||
if (!group.isZenFolder) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
await ZenPinnedTabsStorage.removePin(group.getAttribute('zen-pin-id'));
|
|
||||||
group.removeAttribute('zen-pin-id');
|
|
||||||
}
|
|
||||||
|
|
||||||
async #onTabGroupMoved(event) {
|
|
||||||
const group = event.originalTarget;
|
|
||||||
if (!group.isZenFolder) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const newIndex = group._pPos;
|
|
||||||
const pinId = group.getAttribute('zen-pin-id');
|
|
||||||
if (!pinId) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (const tab of group.allItemsRecursive) {
|
|
||||||
if (tab.pinned && tab.getAttribute('zen-pin-id') === pinId) {
|
|
||||||
const pin = this._pinsCache.find((p) => p.uuid === pinId);
|
|
||||||
if (pin) {
|
|
||||||
pin.position = tab._pPos;
|
|
||||||
pin.parentUuid = tab.group?.getAttribute('zen-pin-id') || null;
|
|
||||||
pin.workspaceUuid = group.getAttribute('zen-workspace-id');
|
|
||||||
await this.savePin(pin, false);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const groupPin = this._pinsCache?.find((p) => p.uuid === pinId);
|
|
||||||
if (groupPin) {
|
|
||||||
groupPin.position = newIndex;
|
|
||||||
groupPin.parentUuid = group.group?.getAttribute('zen-pin-id');
|
|
||||||
groupPin.workspaceUuid = group.getAttribute('zen-workspace-id');
|
|
||||||
await this.savePin(groupPin);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async #onTabMove(tab) {
|
|
||||||
if (!tab.pinned || !this._pinsCache) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const allTabs = [...gBrowser.tabs, ...gBrowser.tabGroups];
|
|
||||||
for (let i = 0; i < allTabs.length; i++) {
|
|
||||||
const otherTab = allTabs[i];
|
|
||||||
if (
|
|
||||||
otherTab.pinned &&
|
|
||||||
otherTab.getAttribute('zen-pin-id') !== tab.getAttribute('zen-pin-id')
|
|
||||||
) {
|
|
||||||
const actualPin = this._pinsCache.find(
|
|
||||||
(pin) => pin.uuid === otherTab.getAttribute('zen-pin-id')
|
|
||||||
);
|
|
||||||
if (!actualPin) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
actualPin.position = otherTab._pPos;
|
|
||||||
actualPin.workspaceUuid = otherTab.getAttribute('zen-workspace-id');
|
|
||||||
actualPin.parentUuid = otherTab.group?.getAttribute('zen-pin-id') || null;
|
|
||||||
await this.savePin(actualPin, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const actualPin = this._pinsCache.find((pin) => pin.uuid === tab.getAttribute('zen-pin-id'));
|
|
||||||
|
|
||||||
if (!actualPin) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
actualPin.position = tab._pPos;
|
|
||||||
actualPin.isEssential = tab.hasAttribute('zen-essential');
|
|
||||||
actualPin.parentUuid = tab.group?.getAttribute('zen-pin-id') || null;
|
|
||||||
actualPin.workspaceUuid = tab.getAttribute('zen-workspace-id') || null;
|
|
||||||
|
|
||||||
// There was a bug where the title and hasStaticLabel attribute were not being set
|
|
||||||
// This is a workaround to fix that
|
|
||||||
if (tab.hasAttribute('zen-has-static-label')) {
|
|
||||||
actualPin.editedTitle = true;
|
|
||||||
actualPin.title = tab.label;
|
|
||||||
}
|
|
||||||
await this.savePin(actualPin);
|
|
||||||
tab.dispatchEvent(
|
|
||||||
new CustomEvent('ZenPinnedTabMoved', {
|
|
||||||
detail: { tab },
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
async _onTabClick(e) {
|
async _onTabClick(e) {
|
||||||
const tab = e.target?.closest('tab');
|
const tab = e.target?.closest('tab');
|
||||||
if (e.button === 1 && tab) {
|
if (e.button === 1 && tab) {
|
||||||
@@ -673,106 +174,10 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const browser = tab.linkedBrowser;
|
|
||||||
|
|
||||||
const pin = this._pinsCache.find((pin) => pin.uuid === tab.getAttribute('zen-pin-id'));
|
|
||||||
|
|
||||||
if (!pin) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const userContextId = tab.getAttribute('usercontextid');
|
|
||||||
|
|
||||||
pin.title = tab.label || browser.contentTitle;
|
|
||||||
pin.url = browser.currentURI.spec;
|
|
||||||
pin.workspaceUuid = tab.getAttribute('zen-workspace-id');
|
|
||||||
pin.userContextId = userContextId ? parseInt(userContextId, 10) : 0;
|
|
||||||
|
|
||||||
await this.savePin(pin);
|
|
||||||
this.resetPinChangedUrl(tab);
|
this.resetPinChangedUrl(tab);
|
||||||
await this.refreshPinnedTabs();
|
|
||||||
gZenUIManager.showToast('zen-pinned-tab-replaced');
|
gZenUIManager.showToast('zen-pinned-tab-replaced');
|
||||||
}
|
}
|
||||||
|
|
||||||
async _setPinnedAttributes(tab) {
|
|
||||||
if (
|
|
||||||
tab.hasAttribute('zen-pin-id') ||
|
|
||||||
!this._hasFinishedLoading ||
|
|
||||||
tab.hasAttribute('zen-empty-tab')
|
|
||||||
) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.log(`Setting pinned attributes for tab ${tab.linkedBrowser.currentURI.spec}`);
|
|
||||||
const browser = tab.linkedBrowser;
|
|
||||||
|
|
||||||
const uuid = gZenUIManager.generateUuidv4();
|
|
||||||
const userContextId = tab.getAttribute('usercontextid');
|
|
||||||
|
|
||||||
let entry = null;
|
|
||||||
|
|
||||||
if (tab.getAttribute('zen-pinned-entry')) {
|
|
||||||
entry = JSON.parse(tab.getAttribute('zen-pinned-entry'));
|
|
||||||
}
|
|
||||||
|
|
||||||
await this.savePin({
|
|
||||||
uuid,
|
|
||||||
title: entry?.title || tab.label || browser.contentTitle,
|
|
||||||
url: entry?.url || browser.currentURI.spec,
|
|
||||||
containerTabId: userContextId ? parseInt(userContextId, 10) : 0,
|
|
||||||
workspaceUuid: tab.getAttribute('zen-workspace-id'),
|
|
||||||
isEssential: tab.getAttribute('zen-essential') === 'true',
|
|
||||||
parentUuid: tab.group?.getAttribute('zen-pin-id') || null,
|
|
||||||
position: tab._pPos,
|
|
||||||
});
|
|
||||||
|
|
||||||
tab.setAttribute('zen-pin-id', uuid);
|
|
||||||
tab.dispatchEvent(
|
|
||||||
new CustomEvent('ZenPinnedTabCreated', {
|
|
||||||
detail: { tab },
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
// This is used while migrating old pins to new system - we don't want to refresh when migrating
|
|
||||||
if (tab.getAttribute('zen-pinned-entry')) {
|
|
||||||
tab.removeAttribute('zen-pinned-entry');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.onLocationChange(browser);
|
|
||||||
await this.refreshPinnedTabs();
|
|
||||||
}
|
|
||||||
|
|
||||||
async _removePinnedAttributes(tab, isClosing = false) {
|
|
||||||
tab.removeAttribute('zen-has-static-label');
|
|
||||||
if (!tab.getAttribute('zen-pin-id') || this._temporarilyUnpiningEssential) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Services.startup.shuttingDown || window.skipNextCanClose) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.log(`Removing pinned attributes for tab ${tab.getAttribute('zen-pin-id')}`);
|
|
||||||
await ZenPinnedTabsStorage.removePin(tab.getAttribute('zen-pin-id'));
|
|
||||||
this.resetPinChangedUrl(tab);
|
|
||||||
|
|
||||||
if (!isClosing) {
|
|
||||||
tab.removeAttribute('zen-pin-id');
|
|
||||||
tab.removeAttribute('zen-essential'); // Just in case
|
|
||||||
|
|
||||||
if (!tab.hasAttribute('zen-workspace-id') && gZenWorkspaces.workspaceEnabled) {
|
|
||||||
const workspace = await gZenWorkspaces.getActiveWorkspace();
|
|
||||||
tab.setAttribute('zen-workspace-id', workspace.uuid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
await this.refreshPinnedTabs();
|
|
||||||
tab.dispatchEvent(
|
|
||||||
new CustomEvent('ZenPinnedTabRemoved', {
|
|
||||||
detail: { tab },
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
_initClosePinnedTabShortcut() {
|
_initClosePinnedTabShortcut() {
|
||||||
let cmdClose = document.getElementById('cmd_close');
|
let cmdClose = document.getElementById('cmd_close');
|
||||||
|
|
||||||
@@ -781,21 +186,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async savePin(pin, notifyObservers = true) {
|
|
||||||
if (!this.hasInitializedPins && !gZenUIManager.testingEnabled) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const existingPin = this._pinsCache.find((p) => p.uuid === pin.uuid);
|
|
||||||
if (existingPin) {
|
|
||||||
Object.assign(existingPin, pin);
|
|
||||||
} else {
|
|
||||||
// We shouldn't need it, but just in case there's
|
|
||||||
// a race condition while making new pinned tabs.
|
|
||||||
this._pinsCache.push(pin);
|
|
||||||
}
|
|
||||||
await ZenPinnedTabsStorage.savePin(pin, notifyObservers);
|
|
||||||
}
|
|
||||||
|
|
||||||
async onCloseTabShortcut(
|
async onCloseTabShortcut(
|
||||||
event,
|
event,
|
||||||
selectedTab = gBrowser.selectedTab,
|
selectedTab = gBrowser.selectedTab,
|
||||||
@@ -842,7 +232,6 @@
|
|||||||
switch (behavior) {
|
switch (behavior) {
|
||||||
case 'close': {
|
case 'close': {
|
||||||
for (const tab of pinnedTabs) {
|
for (const tab of pinnedTabs) {
|
||||||
this._removePinnedAttributes(tab, true);
|
|
||||||
gBrowser.removeTab(tab, { animate: true });
|
gBrowser.removeTab(tab, { animate: true });
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1018,12 +407,6 @@
|
|||||||
tab.removeAttribute('zen-workspace-id');
|
tab.removeAttribute('zen-workspace-id');
|
||||||
}
|
}
|
||||||
if (tab.pinned && tab.hasAttribute('zen-pin-id')) {
|
if (tab.pinned && tab.hasAttribute('zen-pin-id')) {
|
||||||
const pin = this._pinsCache.find((pin) => pin.uuid === tab.getAttribute('zen-pin-id'));
|
|
||||||
if (pin) {
|
|
||||||
pin.isEssential = true;
|
|
||||||
pin.workspaceUuid = null;
|
|
||||||
this.savePin(pin);
|
|
||||||
}
|
|
||||||
gBrowser.zenHandleTabMove(tab, () => {
|
gBrowser.zenHandleTabMove(tab, () => {
|
||||||
if (tab.ownerGlobal !== window) {
|
if (tab.ownerGlobal !== window) {
|
||||||
tab = gBrowser.adoptTab(tab, {
|
tab = gBrowser.adoptTab(tab, {
|
||||||
@@ -1106,6 +489,7 @@
|
|||||||
const element = window.MozXULElement.parseXULToFragment(`
|
const element = window.MozXULElement.parseXULToFragment(`
|
||||||
<menuitem id="context_zen-add-essential"
|
<menuitem id="context_zen-add-essential"
|
||||||
data-l10n-id="tab-context-zen-add-essential"
|
data-l10n-id="tab-context-zen-add-essential"
|
||||||
|
data-l10n-args='{"num": "0", "max": "${this.maxEssentialTabs}"}'
|
||||||
hidden="true"
|
hidden="true"
|
||||||
disabled="true"
|
disabled="true"
|
||||||
command="cmd_contextZenAddToEssentials"/>
|
command="cmd_contextZenAddToEssentials"/>
|
||||||
@@ -1118,24 +502,21 @@
|
|||||||
document.getElementById('context_pinTab')?.before(element);
|
document.getElementById('context_pinTab')?.before(element);
|
||||||
}
|
}
|
||||||
|
|
||||||
async updatePinnedTabContextMenu(contextTab) {
|
updatePinnedTabContextMenu(contextTab) {
|
||||||
if (!this.enabled) {
|
if (!this.enabled) {
|
||||||
document.getElementById('context_pinTab').hidden = true;
|
document.getElementById('context_pinTab').hidden = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const isVisible = contextTab.pinned && !contextTab.multiselected;
|
const isVisible = contextTab.pinned && !contextTab.multiselected;
|
||||||
const zenAddEssential = document.getElementById('context_zen-add-essential');
|
|
||||||
document.getElementById('context_zen-reset-pinned-tab').hidden =
|
document.getElementById('context_zen-reset-pinned-tab').hidden =
|
||||||
!isVisible || !contextTab.getAttribute('zen-pin-id');
|
!isVisible || !contextTab.getAttribute('zen-pin-id');
|
||||||
document.getElementById('context_zen-replace-pinned-url-with-current').hidden = !isVisible;
|
document.getElementById('context_zen-replace-pinned-url-with-current').hidden = !isVisible;
|
||||||
zenAddEssential.hidden = contextTab.getAttribute('zen-essential') || !!contextTab.group;
|
document.getElementById('context_zen-add-essential').hidden =
|
||||||
zenAddEssential.setAttribute(
|
contextTab.getAttribute('zen-essential') || !!contextTab.group;
|
||||||
'badge',
|
document.l10n.setArgs(document.getElementById('context_zen-add-essential'), {
|
||||||
await document.l10n.formatValue('tab-context-zen-add-essential-badge', {
|
num: gBrowser._numZenEssentials,
|
||||||
num: gBrowser._numZenEssentials,
|
max: this.maxEssentialTabs,
|
||||||
max: this.maxEssentialTabs,
|
});
|
||||||
})
|
|
||||||
);
|
|
||||||
document
|
document
|
||||||
.getElementById('cmd_contextZenAddToEssentials')
|
.getElementById('cmd_contextZenAddToEssentials')
|
||||||
.setAttribute('disabled', !this.canEssentialBeAdded(contextTab));
|
.setAttribute('disabled', !this.canEssentialBeAdded(contextTab));
|
||||||
@@ -1416,11 +797,8 @@
|
|||||||
return document.documentElement.getAttribute('zen-sidebar-expanded') === 'true';
|
return document.documentElement.getAttribute('zen-sidebar-expanded') === 'true';
|
||||||
}
|
}
|
||||||
|
|
||||||
async updatePinTitle(tab, newTitle, isEdited = true, notifyObservers = true) {
|
async updatePinTitle(tab, newTitle, isEdited = true) {
|
||||||
const uuid = tab.getAttribute('zen-pin-id');
|
const uuid = tab.getAttribute('zen-pin-id');
|
||||||
await ZenPinnedTabsStorage.updatePinTitle(uuid, newTitle, isEdited, notifyObservers);
|
|
||||||
|
|
||||||
await this.refreshPinnedTabs();
|
|
||||||
|
|
||||||
const browsers = Services.wm.getEnumerator('navigator:browser');
|
const browsers = Services.wm.getEnumerator('navigator:browser');
|
||||||
|
|
||||||
@@ -1565,6 +943,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
async onTabLabelChanged(tab) {
|
async onTabLabelChanged(tab) {
|
||||||
|
tab.dispatchEvent(new CustomEvent('ZenTabLabelChanged', { detail: { tab } }));
|
||||||
if (!this._pinsCache) {
|
if (!this._pinsCache) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -329,13 +329,6 @@
|
|||||||
scale: 0.92;
|
scale: 0.92;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:not(:hover) {
|
|
||||||
.tab-close-button,
|
|
||||||
.tab-reset-button {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
& .tab-icon-image {
|
& .tab-icon-image {
|
||||||
&:not([src]),
|
&:not([src]),
|
||||||
&:-moz-broken {
|
&:-moz-broken {
|
||||||
@@ -521,8 +514,10 @@
|
|||||||
& #nav-bar {
|
& #nav-bar {
|
||||||
padding-right: 0;
|
padding-right: 0;
|
||||||
|
|
||||||
:root[zen-single-toolbar='true']:not([zen-has-empty-tab='true']) & {
|
:root[zen-single-toolbar='true'] & {
|
||||||
& #urlbar:not([breakout-extend='true']) .urlbar-input-container {
|
&
|
||||||
|
#urlbar:not([breakout-extend='true']):not([pageproxystate='invalid'])
|
||||||
|
.urlbar-input-container {
|
||||||
padding-left: 8px;
|
padding-left: 8px;
|
||||||
padding-right: 4px;
|
padding-right: 4px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,9 @@ nsresult ZenCommonUtils::PlayHapticFeedbackInternal() {
|
|||||||
id<NSHapticFeedbackPerformer> performer = [NSHapticFeedbackManager defaultPerformer];
|
id<NSHapticFeedbackPerformer> performer = [NSHapticFeedbackManager defaultPerformer];
|
||||||
[performer performFeedbackPattern:NSHapticFeedbackPatternAlignment
|
[performer performFeedbackPattern:NSHapticFeedbackPatternAlignment
|
||||||
performanceTime:NSHapticFeedbackPerformanceTimeDefault];
|
performanceTime:NSHapticFeedbackPerformanceTimeDefault];
|
||||||
|
} else {
|
||||||
|
// Fallback on earlier versions
|
||||||
|
// Note: This is a no-op on older versions of iOS/macOS
|
||||||
}
|
}
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
NS_OBJC_END_TRY_BLOCK_RETURN(NS_OK);
|
NS_OBJC_END_TRY_BLOCK_RETURN(NS_OK);
|
||||||
|
|||||||
@@ -932,7 +932,6 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature {
|
|||||||
await this.workspaceBookmarks();
|
await this.workspaceBookmarks();
|
||||||
await this.initializeTabsStripSections();
|
await this.initializeTabsStripSections();
|
||||||
this._initializeEmptyTab();
|
this._initializeEmptyTab();
|
||||||
await gZenPinnedTabManager.refreshPinnedTabs({ init: true });
|
|
||||||
await this.changeWorkspace(activeWorkspace, { onInit: true });
|
await this.changeWorkspace(activeWorkspace, { onInit: true });
|
||||||
this.#fixTabPositions();
|
this.#fixTabPositions();
|
||||||
this.onWindowResize();
|
this.onWindowResize();
|
||||||
@@ -1471,11 +1470,6 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature {
|
|||||||
!tab.hasAttribute('zen-empty-tab') &&
|
!tab.hasAttribute('zen-empty-tab') &&
|
||||||
!tab.hasAttribute('zen-essential')
|
!tab.hasAttribute('zen-essential')
|
||||||
);
|
);
|
||||||
for (const tab of tabs) {
|
|
||||||
if (tab.pinned) {
|
|
||||||
await ZenPinnedTabsStorage.removePin(tab.getAttribute('zen-pin-id'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
gBrowser.removeTabs(tabs, {
|
gBrowser.removeTabs(tabs, {
|
||||||
animate: false,
|
animate: false,
|
||||||
skipSessionStore: true,
|
skipSessionStore: true,
|
||||||
@@ -2555,7 +2549,6 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature {
|
|||||||
|
|
||||||
async onPinnedTabsResize(entries, forAnimation = false, animateContainer = false) {
|
async onPinnedTabsResize(entries, forAnimation = false, animateContainer = false) {
|
||||||
if (
|
if (
|
||||||
document.documentElement.hasAttribute('inDOMFullscreen') ||
|
|
||||||
!this._hasInitializedTabsStrip ||
|
!this._hasInitializedTabsStrip ||
|
||||||
(this._organizingWorkspaceStrip && !forAnimation) ||
|
(this._organizingWorkspaceStrip && !forAnimation) ||
|
||||||
document.documentElement.hasAttribute('zen-creating-workspace') ||
|
document.documentElement.hasAttribute('zen-creating-workspace') ||
|
||||||
@@ -2656,7 +2649,6 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature {
|
|||||||
#changeToEmptyTab() {
|
#changeToEmptyTab() {
|
||||||
const isEmpty = gBrowser.selectedTab.hasAttribute('zen-empty-tab');
|
const isEmpty = gBrowser.selectedTab.hasAttribute('zen-empty-tab');
|
||||||
gZenCompactModeManager.sidebar.toggleAttribute('zen-has-empty-tab', isEmpty);
|
gZenCompactModeManager.sidebar.toggleAttribute('zen-has-empty-tab', isEmpty);
|
||||||
document.documentElement.setAttribute('zen-has-empty-tab', isEmpty);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async onLocationChange(event) {
|
async onLocationChange(event) {
|
||||||
|
|||||||
@@ -330,10 +330,8 @@ zen-workspace {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media -moz-pref('zen.view.draggable-sidebar') {
|
&[active] .zen-workspace-empty-space {
|
||||||
&[active] .zen-workspace-empty-space {
|
-moz-window-dragging: drag;
|
||||||
-moz-window-dragging: drag;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ export default [
|
|||||||
'ZenWorkspaceBookmarksStorage',
|
'ZenWorkspaceBookmarksStorage',
|
||||||
|
|
||||||
'gZenPinnedTabManager',
|
'gZenPinnedTabManager',
|
||||||
'ZenPinnedTabsStorage',
|
|
||||||
|
|
||||||
'gZenEmojiPicker',
|
'gZenEmojiPicker',
|
||||||
'gZenSessionStore',
|
'gZenSessionStore',
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
"binaryName": "zen",
|
"binaryName": "zen",
|
||||||
"version": {
|
"version": {
|
||||||
"product": "firefox",
|
"product": "firefox",
|
||||||
"version": "145.0.1",
|
"version": "145.0",
|
||||||
"candidate": "145.0.1"
|
"candidate": "145.0"
|
||||||
},
|
},
|
||||||
"buildOptions": {
|
"buildOptions": {
|
||||||
"generateBranding": true
|
"generateBranding": true
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
"brandShortName": "Zen",
|
"brandShortName": "Zen",
|
||||||
"brandFullName": "Zen Browser",
|
"brandFullName": "Zen Browser",
|
||||||
"release": {
|
"release": {
|
||||||
"displayVersion": "1.17.8b",
|
"displayVersion": "1.17.7b",
|
||||||
"github": {
|
"github": {
|
||||||
"repo": "zen-browser/desktop"
|
"repo": "zen-browser/desktop"
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user