From 37eed5fcfeaea373f13ee36b50bcab3d90231170 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Mon, 12 Jan 2026 15:11:43 +0100 Subject: [PATCH] fix: Start working on more eslint rules, p=#11874 * fix: Start working on more eslint rules, b=no-bug, c=common, mods, workspaces * chore: Continue migration, b=no-bug, c=workflows, windows, glance, mods, welcome, workspaces, common, compact-mode, folders, tests, kbs, media, split-view, tabs * chore: Finish, b=no-bug, c=common, compact-mode, folders, glance, tests, kbs, media, mods, split-view, tabs, workspaces, welcome * fix: Fix installing deps, b=no-bug, c=common * feat: Dont initialize git on download checks, b=no-bug, c=workflows * feat: Remove empty JS docs, b=no-bug, c=common, compact-mode, folders, glance, kbs, media, mods, split-view, tabs, tests, workspaces * chore: Run lint, b=no-bug, c=common, folders, glance, kbs, mods, split-view, tabs, workspaces --- .github/advanced-issue-labeler.yml | 98 +- .github/workflows/build.yml | 56 +- .github/workflows/check-candidate-release.yml | 2 +- .github/workflows/code-linter.yml | 11 +- .github/workflows/issue-metrics.yml | 6 +- .github/workflows/linux-release-build.yml | 10 +- .github/workflows/macos-release-build.yml | 10 +- .../macos-universal-release-build.yml | 8 +- .github/workflows/pr-test.yml | 7 +- .github/workflows/sync-upstream.yml | 12 +- .../workflows/twilight-release-schedule.yml | 6 +- .github/workflows/windows-profile-build.yml | 8 +- .github/workflows/windows-release-build.yml | 12 +- .prettierrc.json | 12 +- build/ts/transform-ts.js | 10 +- eslint.config.mjs | 507 +- package-lock.json | 1098 ++- package.json | 20 +- prefs/fastfox/smoothscroll.yaml | 26 +- prefs/firefox/browser.yaml | 4 +- prefs/firefox/fullscreen.yaml | 4 +- prefs/firefox/performance.yaml | 6 +- prefs/privatefox/disablemozilla.yaml | 2 +- prefs/privatefox/privacy.yaml | 6 +- prefs/zen/glance.yaml | 2 +- prefs/zen/gtk.yaml | 4 +- prefs/zen/macos.yaml | 4 +- prefs/zen/mods.yaml | 12 +- prefs/zen/session-store.yaml | 2 +- prefs/zen/theme.yaml | 6 +- prefs/zen/view.yaml | 6 +- prefs/zen/watermark.yaml | 4 +- prefs/zen/welcome.yaml | 4 +- prefs/zen/windows.yaml | 6 +- prefs/zen/workspaces.yaml | 4 +- .../components/preferences/zen-settings.js | 656 +- .../shared/preferences/zen-preferences.css | 32 +- src/browser/themes/shared/zen-icons/icons.css | 460 +- src/zen/@types/index.d.ts | 2 +- src/zen/@types/lib.gecko.dom.d.ts | 2398 +++--- src/zen/@types/lib.gecko.glean.d.ts | 6788 ++++++++--------- src/zen/@types/lib.gecko.modules.d.ts | 2566 +++---- src/zen/@types/lib.gecko.tweaks.d.ts | 8 +- src/zen/@types/zen.d.ts | 34 +- src/zen/common/ZenPreloadedScripts.js | 2 +- src/zen/common/emojis/ZenEmojiPicker.mjs | 109 +- src/zen/common/emojis/ZenEmojisData.min.mjs | 2 +- src/zen/common/modules/ZenCommonUtils.mjs | 44 +- src/zen/common/modules/ZenHasPolyfill.mjs | 15 +- src/zen/common/modules/ZenMenubar.mjs | 36 +- src/zen/common/modules/ZenSessionStore.mjs | 10 +- .../common/modules/ZenSidebarNotification.mjs | 24 +- src/zen/common/modules/ZenStartup.mjs | 90 +- src/zen/common/modules/ZenUIManager.mjs | 581 +- src/zen/common/modules/ZenUpdates.mjs | 46 +- src/zen/common/styles/zen-animations.css | 6 +- src/zen/common/styles/zen-branding.css | 14 +- .../common/styles/zen-browser-container.css | 32 +- src/zen/common/styles/zen-browser-ui.css | 54 +- src/zen/common/styles/zen-buttons.css | 4 +- src/zen/common/styles/zen-omnibox.css | 147 +- src/zen/common/styles/zen-panel-ui.css | 12 +- src/zen/common/styles/zen-popup.css | 51 +- .../styles/zen-sidebar-notification.css | 8 +- .../common/styles/zen-single-components.css | 50 +- src/zen/common/styles/zen-toolbar.css | 2 +- src/zen/common/sys/ZenActorsManager.sys.mjs | 18 +- src/zen/common/sys/ZenCustomizableUI.sys.mjs | 87 +- src/zen/common/sys/ZenUIMigration.sys.mjs | 42 +- src/zen/common/zen-sets.js | 93 +- src/zen/common/zenThemeModifier.js | 62 +- src/zen/compact-mode/ZenCompactMode.mjs | 392 +- src/zen/downloads/ZenDownloadAnimation.mjs | 94 +- .../downloads/zen-download-arc-animation.css | 2 +- .../downloads/zen-download-box-animation.css | 2 +- src/zen/drag-and-drop/ZenDragAndDrop.js | 224 +- src/zen/folders/ZenFolder.mjs | 56 +- src/zen/folders/ZenFolders.mjs | 694 +- src/zen/folders/zen-folders.css | 31 +- src/zen/glance/ZenGlanceManager.mjs | 428 +- src/zen/glance/actors/ZenGlanceChild.sys.mjs | 25 +- src/zen/glance/actors/ZenGlanceParent.sys.mjs | 13 +- src/zen/glance/tests/GlanceTestUtils.sys.mjs | 3 +- src/zen/glance/zen-glance.css | 26 +- src/zen/kbs/ZenKeyboardShortcuts.mjs | 676 +- src/zen/media/ZenMediaController.mjs | 337 +- src/zen/media/zen-media-controls.css | 8 +- src/zen/mods/ZenMods.mjs | 164 +- .../actors/ZenModsMarketplaceChild.sys.mjs | 52 +- .../actors/ZenModsMarketplaceParent.sys.mjs | 17 +- .../sessionstore/ZenSessionManager.sys.mjs | 143 +- src/zen/sessionstore/ZenWindowSync.sys.mjs | 199 +- src/zen/split-view/ZenViewSplitter.mjs | 729 +- src/zen/tabs/ZenPinnedTabManager.mjs | 293 +- .../zen-tabs/vertical-tabs-topbuttons-fix.css | 7 +- src/zen/tabs/zen-tabs/vertical-tabs.css | 187 +- .../browser_compact_mode_width.js | 19 +- .../browser_container_auto_switch.js | 20 +- .../browser_container_specific_essentials.js | 22 +- .../folders/browser_folder_basic_toggle.js | 10 +- .../tests/folders/browser_folder_create.js | 22 +- .../tests/folders/browser_folder_density.js | 10 +- .../tests/folders/browser_folder_empty_tab.js | 12 +- .../folders/browser_folder_issue_9885.js | 16 +- .../folders/browser_folder_issue_9981.js | 28 +- .../folders/browser_folder_level_checks.js | 10 +- .../folders/browser_folder_max_subfolders.js | 19 +- .../folders/browser_folder_multiselected.js | 18 +- .../folders/browser_folder_owner_tabs.js | 23 +- .../folders/browser_folder_reset_button.js | 25 +- .../tests/folders/browser_folder_subfolder.js | 16 +- .../folders/browser_folder_visible_tabs.js | 42 +- src/zen/tests/folders/head.js | 16 +- src/zen/tests/glance/browser_glance_basic.js | 6 +- src/zen/tests/glance/browser_glance_close.js | 11 +- .../glance/browser_glance_close_select.js | 18 +- src/zen/tests/glance/browser_glance_expand.js | 34 +- .../tests/glance/browser_glance_next_tab.js | 6 +- .../tests/glance/browser_glance_prev_tab.js | 6 +- .../glance/browser_glance_select_parent.js | 10 +- src/zen/tests/glance/head.js | 2 +- .../tests/mochitests/reportbrokensite/head.js | 4 + .../reportbrokensite/send_more_info.js | 1 + .../safebrowsing/browser_bug400731.js | 6 +- .../safebrowsing/browser_bug415846.js | 11 +- .../safebrowsing/browser_whitelisted.js | 2 +- src/zen/tests/mochitests/safebrowsing/head.js | 13 +- .../test_macOS_showSecurityPreferences.js | 1 + .../tooltiptext/browser_bug581947.js | 3 + .../browser_input_file_tooltips.js | 1 + src/zen/tests/pinned/browser_issue_8726.js | 28 +- .../tests/pinned/browser_pinned_changed.js | 14 +- src/zen/tests/pinned/browser_pinned_close.js | 11 +- .../tests/pinned/browser_pinned_created.js | 24 +- .../pinned/browser_pinned_nounload_reset.js | 29 +- .../pinned/browser_pinned_reset_noswitch.js | 29 +- src/zen/tests/pinned/browser_pinned_switch.js | 29 +- .../pinned/browser_pinned_to_essential.js | 10 +- .../pinned/browser_pinned_unload_changed.js | 29 +- .../pinned/browser_pinned_unload_noreset.js | 30 +- .../browser_private_mode_no_ctx_menu.js | 18 +- .../browser_private_mode_no_essentials.js | 41 - .../split_view/browser_basic_split_view.js | 18 +- .../browser_split_browser_duplication.js | 95 +- .../tests/split_view/browser_split_groups.js | 38 +- .../split_view/browser_split_inset_checks.js | 46 +- .../split_view/browser_split_view_empty.js | 27 +- .../browser_split_view_with_folders.js | 36 +- .../browser_split_view_with_glance.js | 59 +- src/zen/tests/split_view/head.js | 14 +- .../tests/tabs/browser_drag_drop_vertical.js | 32 +- .../tabs/browser_tabs_cycle_by_attribute.js | 52 +- .../tests/tabs/browser_tabs_empty_checks.js | 18 +- .../tests/tabs/browser_tabs_fetch_checks.js | 18 +- src/zen/tests/tabs/head.js | 197 +- .../ub-actions/browser_ub_actions_search.js | 10 +- .../tests/urlbar/browser_floating_urlbar.js | 27 +- src/zen/tests/urlbar/browser_issue_7385.js | 12 +- src/zen/tests/urlbar/head.js | 17 +- src/zen/tests/welcome/browser_welcome.js | 103 +- src/zen/tests/welcome/head.js | 1 + .../window_sync/browser_sync_tab_label.js | 16 +- .../window_sync/browser_sync_tab_open.js | 8 +- src/zen/tests/window_sync/head.js | 6 +- .../workspaces/browser_basic_workspaces.js | 30 +- .../workspaces/browser_change_to_empty.js | 22 +- .../workspaces/browser_double_click_newtab.js | 16 +- .../tests/workspaces/browser_issue_10455.js | 24 +- .../tests/workspaces/browser_issue_8699.js | 14 +- .../tests/workspaces/browser_issue_9900.js | 20 +- .../workspaces/browser_overflow_scrollbox.js | 16 +- .../tests/workspaces/browser_private_mode.js | 8 +- .../browser_private_mode_startup.js | 5 +- .../workspaces/browser_workspace_bookmarks.js | 58 +- .../workspaces/browser_workspace_unload.js | 50 +- src/zen/tests/workspaces/head.js | 164 +- src/zen/urlbar/ZenSiteDataPanel.sys.mjs | 322 +- src/zen/urlbar/ZenUBActionsProvider.sys.mjs | 118 +- src/zen/urlbar/ZenUBGlobalActions.sys.mjs | 176 +- src/zen/urlbar/ZenUBProvider.sys.mjs | 15 +- src/zen/urlbar/ZenUBResultsLearner.sys.mjs | 21 +- src/zen/welcome/ZenWelcome.mjs | 295 +- src/zen/welcome/zen-welcome.css | 8 +- src/zen/workspaces/ZenGradientGenerator.mjs | 663 +- src/zen/workspaces/ZenWorkspace.mjs | 173 +- .../ZenWorkspaceBookmarksStorage.js | 36 +- src/zen/workspaces/ZenWorkspaceCreation.mjs | 120 +- src/zen/workspaces/ZenWorkspaceIcons.mjs | 99 +- src/zen/workspaces/ZenWorkspaces.mjs | 848 +- src/zen/workspaces/create-workspace-form.css | 6 +- src/zen/workspaces/zen-gradient-generator.css | 28 +- src/zen/zen.globals.js | 306 - src/zen/zen.globals.mjs | 308 + svgo.config.js | 26 +- tools/eslint-plugin-spidermonkey-js/LICENSE | 363 + .../lib/environments/self-hosted.js | 182 + .../lib/index.js | 21 + .../lib/processors/self-hosted.js | 128 + .../package.json | 28 + tsconfig.json | 113 - 200 files changed, 15153 insertions(+), 12664 deletions(-) delete mode 100644 src/zen/tests/pinned/browser_private_mode_no_essentials.js delete mode 100644 src/zen/zen.globals.js create mode 100644 src/zen/zen.globals.mjs create mode 100644 tools/eslint-plugin-spidermonkey-js/LICENSE create mode 100644 tools/eslint-plugin-spidermonkey-js/lib/environments/self-hosted.js create mode 100644 tools/eslint-plugin-spidermonkey-js/lib/index.js create mode 100644 tools/eslint-plugin-spidermonkey-js/lib/processors/self-hosted.js create mode 100644 tools/eslint-plugin-spidermonkey-js/package.json delete mode 100644 tsconfig.json diff --git a/.github/advanced-issue-labeler.yml b/.github/advanced-issue-labeler.yml index b5c0c7ef1..bd46276e3 100644 --- a/.github/advanced-issue-labeler.yml +++ b/.github/advanced-issue-labeler.yml @@ -3,56 +3,56 @@ policy: - id: [component] label: # Make sure it's in sync with the dropdown in the issue template - - name: 'component: sync' - keys: ['Sync'] - - name: 'component: compact-mode' - keys: ['Compact Mode'] - - name: 'component: workspaces' - keys: ['Workspaces'] - - name: 'component: mods-themes' - keys: ['Mods / Themes'] - - name: 'component: bookmarks' - keys: ['Bookmarks'] - - name: 'component: glance' - keys: ['Glance'] - - name: 'component: url-bar' - keys: ['URL Bar'] - - name: 'component: tabs' - keys: ['Tabs'] - - name: 'component: settings' - keys: ['Settings'] - - name: 'component: privacy' - keys: ['Privacy'] - - name: 'component: split-view' - keys: ['Split View'] - - name: 'component: performance' - keys: ['Performance'] - - name: 'component: media-controller' - keys: ['Media Controler'] - - name: 'component: tab-unloading' - keys: ['Tab unloading'] - - name: 'component: tab-folders' - keys: ['Tab Folders'] - - name: 'component: keyboard-shortcuts' - keys: ['Keyboard Shortcuts'] - - name: 'component: security' - keys: ['Security'] - - name: 'component: extensions' - keys: ['Extensions'] - - name: 'component: customizable-ui-toolbars' - keys: ['Customizable UI / Toolbars'] - - name: 'component: localization' - keys: ['Localization'] - - name: 'component: other' - keys: ['Other'] + - name: "component: sync" + keys: ["Sync"] + - name: "component: compact-mode" + keys: ["Compact Mode"] + - name: "component: workspaces" + keys: ["Workspaces"] + - name: "component: mods-themes" + keys: ["Mods / Themes"] + - name: "component: bookmarks" + keys: ["Bookmarks"] + - name: "component: glance" + keys: ["Glance"] + - name: "component: url-bar" + keys: ["URL Bar"] + - name: "component: tabs" + keys: ["Tabs"] + - name: "component: settings" + keys: ["Settings"] + - name: "component: privacy" + keys: ["Privacy"] + - name: "component: split-view" + keys: ["Split View"] + - name: "component: performance" + keys: ["Performance"] + - name: "component: media-controller" + keys: ["Media Controler"] + - name: "component: tab-unloading" + keys: ["Tab unloading"] + - name: "component: tab-folders" + keys: ["Tab Folders"] + - name: "component: keyboard-shortcuts" + keys: ["Keyboard Shortcuts"] + - name: "component: security" + keys: ["Security"] + - name: "component: extensions" + keys: ["Extensions"] + - name: "component: customizable-ui-toolbars" + keys: ["Customizable UI / Toolbars"] + - name: "component: localization" + keys: ["Localization"] + - name: "component: other" + keys: ["Other"] - id: [platform] - block-list: ['Other'] + block-list: ["Other"] label: # Make sure it's in sync with the dropdown in the issue template - - name: 'platform: linux' - keys: ['Linux (AppImage)', 'Linux (Flatpak)', 'Linux (Tarball)'] - - name: 'platform: macOS' - keys: ['macOS - aarch64', 'macOS - Intel'] - - name: 'platform: windows' - keys: ['Windows - x64', 'Windows - aarch64'] + - name: "platform: linux" + keys: ["Linux (AppImage)", "Linux (Flatpak)", "Linux (Tarball)"] + - name: "platform: macOS" + keys: ["macOS - aarch64", "macOS - Intel"] + - name: "platform: windows" + keys: ["Windows - x64", "Windows - aarch64"] diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 46dbbffc2..37323a234 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,49 +4,49 @@ on: workflow_dispatch: inputs: create_release: - description: 'Create a new release for this build' + description: "Create a new release for this build" required: false default: false - type: 'boolean' + type: "boolean" update_version: - description: 'Update the version number' + description: "Update the version number" required: false default: false - type: 'boolean' + type: "boolean" update_branch: - description: 'Update branch with new version' + description: "Update branch with new version" required: true - default: 'release' - type: 'choice' + default: "release" + type: "choice" options: - - 'release' - - 'twilight' + - "release" + - "twilight" use-sccache: - description: 'Use sccache' + description: "Use sccache" required: true - type: 'boolean' + type: "boolean" default: false workflow_call: inputs: create_release: - description: 'Create a new release for this build' + description: "Create a new release for this build" required: false default: false - type: 'boolean' + type: "boolean" update_version: - description: 'Update the version number' + description: "Update the version number" required: false default: false - type: 'boolean' + type: "boolean" update_branch: - description: 'Update branch with new version' + description: "Update branch with new version" required: true - default: 'release' - type: 'string' + default: "release" + type: "string" use-sccache: - description: 'Use sccache' + description: "Use sccache" required: true - type: 'boolean' + type: "boolean" default: false jobs: @@ -142,7 +142,7 @@ jobs: - name: Setup Node.js uses: useblacksmith/setup-node@v5 with: - node-version-file: '.nvmrc' + node-version-file: ".nvmrc" - name: Install dependencies run: | @@ -202,7 +202,7 @@ jobs: - name: Setup Node.js uses: useblacksmith/setup-node@v5 with: - node-version-file: '.nvmrc' + node-version-file: ".nvmrc" - name: Install dependencies run: | @@ -244,7 +244,7 @@ jobs: - name: Setup Node.js uses: useblacksmith/setup-node@v5 with: - node-version-file: '.nvmrc' + node-version-file: ".nvmrc" - name: Setup Git run: | @@ -379,7 +379,7 @@ jobs: - name: Setup Node.js uses: useblacksmith/setup-node@v5 with: - node-version-file: '.nvmrc' + node-version-file: ".nvmrc" - name: Install dependencies run: | @@ -565,8 +565,8 @@ jobs: ./zen.installer.exe/* ./zen.installer-arm64.exe/* ./zen.macos-universal.dmg/* - tag_name: 'twilight' - name: 'Twilight build - ${{ needs.build-data.outputs.version }} (${{ needs.build-data.outputs.build_date }} at ${{ needs.build-data.outputs.build_time }})' + tag_name: "twilight" + name: "Twilight build - ${{ needs.build-data.outputs.version }} (${{ needs.build-data.outputs.build_date }} at ${{ needs.build-data.outputs.build_time }})" draft: false generate_release_notes: false prerelease: true @@ -584,7 +584,7 @@ jobs: prerelease: false fail_on_unmatched_files: false generate_release_notes: false - name: 'Release build - ${{ needs.build-data.outputs.version }} (${{ needs.build-data.outputs.build_date }})' + name: "Release build - ${{ needs.build-data.outputs.version }} (${{ needs.build-data.outputs.build_date }})" body_path: release_notes.md files: | ./zen.source.tar.zst/* @@ -656,7 +656,7 @@ jobs: - name: Commit uses: stefanzweifel/git-auto-commit-action@v5 with: - commit_message: '[release]: Update Flatpak manifest' + commit_message: "[release]: Update Flatpak manifest" commit_user_name: Zen Browser Robot commit_user_email: zen-browser-auto@users.noreply.github.com repository: ./flatpak diff --git a/.github/workflows/check-candidate-release.yml b/.github/workflows/check-candidate-release.yml index 5ea3d8f90..a83f0fc87 100644 --- a/.github/workflows/check-candidate-release.yml +++ b/.github/workflows/check-candidate-release.yml @@ -2,7 +2,7 @@ name: Check Firefox Candidate Release on: schedule: - - cron: '59 4 * * 2' + - cron: "59 4 * * 2" workflow_dispatch: permissions: diff --git a/.github/workflows/code-linter.yml b/.github/workflows/code-linter.yml index decb9dcac..65fcbb052 100644 --- a/.github/workflows/code-linter.yml +++ b/.github/workflows/code-linter.yml @@ -5,9 +5,6 @@ on: branches: - dev workflow_call: - pull_request: - branches: - - dev permissions: contents: read @@ -25,7 +22,13 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version-file: '.nvmrc' + node-version-file: ".nvmrc" + + - name: Download Firefox + env: + ZEN_DOWNLOAD_DONT_INIT_GIT: "1" + run: | + npm run download - name: Setup and run autopep8 if: ${{ contains(join(github.event.commits.*.modified, ' '), '.py') || contains(join(github.event.commits.*.added, ' '), '.py') || contains(join(github.event.commits.*.removed, ' '), '.py') }} diff --git a/.github/workflows/issue-metrics.yml b/.github/workflows/issue-metrics.yml index 1444c53a1..56ac6763e 100644 --- a/.github/workflows/issue-metrics.yml +++ b/.github/workflows/issue-metrics.yml @@ -5,7 +5,7 @@ permissions: on: workflow_dispatch: schedule: - - cron: '3 2 1 * *' + - cron: "3 2 1 * *" jobs: build: @@ -47,7 +47,7 @@ jobs: GH_TOKEN: ${{ secrets.DEPLOY_KEY }} HIDE_AUTHOR: true HIDE_TIME_TO_ANSWER: true - SEARCH_QUERY: 'repo:zen-browser/desktop is:issue created:${{ env.last_month }}' + SEARCH_QUERY: "repo:zen-browser/desktop is:issue created:${{ env.last_month }}" - name: Move metrics to docs folder run: | @@ -62,6 +62,6 @@ jobs: - name: Commit changes uses: stefanzweifel/git-auto-commit-action@v5 with: - commit_message: 'docs: Update monthly issue metrics, b=(no bug), c={docs}' + commit_message: "docs: Update monthly issue metrics, b=(no bug), c={docs}" commit_user_name: Zen Browser Robot commit_user_email: zen-browser-auto@users.noreply.github.com diff --git a/.github/workflows/linux-release-build.yml b/.github/workflows/linux-release-build.yml index 48d9f044f..724db83a7 100644 --- a/.github/workflows/linux-release-build.yml +++ b/.github/workflows/linux-release-build.yml @@ -4,19 +4,19 @@ on: workflow_call: inputs: build-version: - description: 'The version to build' + description: "The version to build" required: true type: string release-branch: - description: 'The branch to build' + description: "The branch to build" required: true type: string MOZ_BUILD_DATE: type: string required: true - default: '' + default: "" use-sccache: - description: 'Use sccache' + description: "Use sccache" required: true type: boolean default: false @@ -53,7 +53,7 @@ jobs: - name: Setup Node.js uses: useblacksmith/setup-node@v5 with: - node-version-file: '.nvmrc' + node-version-file: ".nvmrc" - name: Run sccache-cache uses: mozilla-actions/sccache-action@main diff --git a/.github/workflows/macos-release-build.yml b/.github/workflows/macos-release-build.yml index 8f4cf7c22..877fbb604 100644 --- a/.github/workflows/macos-release-build.yml +++ b/.github/workflows/macos-release-build.yml @@ -6,19 +6,19 @@ on: workflow_call: inputs: build-version: - description: 'The version to build' + description: "The version to build" required: true type: string release-branch: - description: 'The branch to build' + description: "The branch to build" required: true type: string MOZ_BUILD_DATE: type: string required: true - default: '' + default: "" use-sccache: - description: 'Use sccache' + description: "Use sccache" required: true type: boolean default: false @@ -47,7 +47,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version-file: '.nvmrc' + node-version-file: ".nvmrc" - name: Run sccache-cache uses: mozilla-actions/sccache-action@main diff --git a/.github/workflows/macos-universal-release-build.yml b/.github/workflows/macos-universal-release-build.yml index 1ddcb9f78..ea9063d8d 100644 --- a/.github/workflows/macos-universal-release-build.yml +++ b/.github/workflows/macos-universal-release-build.yml @@ -4,18 +4,18 @@ on: workflow_call: inputs: build-version: - description: 'The version to build' + description: "The version to build" required: true type: string release-branch: - description: 'The branch to build' + description: "The branch to build" required: true type: string jobs: mac-build: name: Unify macOS (Universal) - runs-on: 'macos-26' + runs-on: "macos-26" strategy: fail-fast: false @@ -30,7 +30,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version-file: '.nvmrc' + node-version-file: ".nvmrc" - name: Setup Python uses: actions/setup-python@v5 diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index d0724d423..916c435e5 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -19,13 +19,18 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version-file: '.nvmrc' + node-version-file: ".nvmrc" - name: Install dependencies run: npm ci - name: Download Firefox and dependencies + env: + ZEN_DOWNLOAD_DONT_INIT_GIT: "1" run: npm run download - name: Import patches run: npm run import + + - name: Run linting + run: npm run lint diff --git a/.github/workflows/sync-upstream.yml b/.github/workflows/sync-upstream.yml index f4d11f78c..44241aa7f 100644 --- a/.github/workflows/sync-upstream.yml +++ b/.github/workflows/sync-upstream.yml @@ -4,14 +4,14 @@ on: workflow_dispatch: inputs: release_candidate: - description: 'Set to true to sync release candidates' + description: "Set to true to sync release candidates" required: false type: boolean default: false workflow_call: inputs: release_candidate: - description: 'Set to true to sync release candidates' + description: "Set to true to sync release candidates" required: false type: boolean default: false @@ -41,7 +41,7 @@ jobs: uses: actions/setup-node@v4 if: steps.check-upstream-branch.outputs.branch_exists == 'false' with: - node-version-file: '.nvmrc' + node-version-file: ".nvmrc" - name: Install dependencies if: steps.check-upstream-branch.outputs.branch_exists == 'false' @@ -119,9 +119,9 @@ jobs: GIT_CURL_VERBOSE: 1 with: token: ${{ secrets.DEPLOY_KEY }} - commit-message: 'chore: Sync upstream to `Firefox ${{ steps.build-data.outputs.version }}`' - branch: 'chore/upstream-sync' - title: 'Sync upstream Firefox to version ${{ steps.build-data.outputs.version }}' + commit-message: "chore: Sync upstream to `Firefox ${{ steps.build-data.outputs.version }}`" + branch: "chore/upstream-sync" + title: "Sync upstream Firefox to version ${{ steps.build-data.outputs.version }}" body: | This PR syncs the upstream Firefox to version ${{ steps.build-data.outputs.version }}. diff --git a/.github/workflows/twilight-release-schedule.yml b/.github/workflows/twilight-release-schedule.yml index 96a0b8202..c32ad1224 100644 --- a/.github/workflows/twilight-release-schedule.yml +++ b/.github/workflows/twilight-release-schedule.yml @@ -2,11 +2,11 @@ name: Zen Twilight Scheduled Releases on: schedule: - - cron: '0 23 * * *' + - cron: "0 23 * * *" workflow_dispatch: inputs: create_release: - description: 'Whether to do a release' + description: "Whether to do a release" required: false type: boolean default: true @@ -34,4 +34,4 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version-file: '.nvmrc' + node-version-file: ".nvmrc" diff --git a/.github/workflows/windows-profile-build.yml b/.github/workflows/windows-profile-build.yml index 0a5e78d91..04df4a057 100644 --- a/.github/workflows/windows-profile-build.yml +++ b/.github/workflows/windows-profile-build.yml @@ -7,15 +7,15 @@ on: workflow_call: inputs: build-version: - description: 'The version to build' + description: "The version to build" required: true type: string profile-data-path-archive: - description: 'The path to the zip archive containing the profile data' + description: "The path to the zip archive containing the profile data" required: false type: string release-branch: - description: 'The branch to build' + description: "The branch to build" required: true type: string @@ -37,7 +37,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version-file: '.nvmrc' + node-version-file: ".nvmrc" - name: Setup Git run: | diff --git a/.github/workflows/windows-release-build.yml b/.github/workflows/windows-release-build.yml index 63cf18205..43934dfee 100644 --- a/.github/workflows/windows-release-build.yml +++ b/.github/workflows/windows-release-build.yml @@ -11,22 +11,22 @@ on: type: boolean default: false build-version: - description: 'The version to build' + description: "The version to build" required: true type: string profile-data-path-archive: - description: 'The path to the zip archive containing the profile data' + description: "The path to the zip archive containing the profile data" type: string release-branch: - description: 'The branch to build' + description: "The branch to build" required: true type: string MOZ_BUILD_DATE: type: string required: true - default: '' + default: "" use-sccache: - description: 'Use sccache' + description: "Use sccache" required: true type: boolean default: false @@ -62,7 +62,7 @@ jobs: - name: Setup Node.js uses: useblacksmith/setup-node@v5 with: - node-version-file: '.nvmrc' + node-version-file: ".nvmrc" - name: Run sccache-cache uses: mozilla-actions/sccache-action@main diff --git a/.prettierrc.json b/.prettierrc.json index 1fb5f7894..967de9106 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -2,11 +2,19 @@ "bracketSameLine": true, "endOfLine": "lf", "trailingComma": "es5", - "singleQuote": true, "tabWidth": 2, "useTabs": false, "jsxSingleQuote": false, "semi": true, "printWidth": 100, - "plugins": ["prettier-plugin-sh"] + "plugins": ["prettier-plugin-sh"], + "overrides": [ + { + "files": "*.css", + "options": { + "parser": "css", + "printWidth": 160 + } + } + ] } diff --git a/build/ts/transform-ts.js b/build/ts/transform-ts.js index ba94763a3..fb3c01565 100644 --- a/build/ts/transform-ts.js +++ b/build/ts/transform-ts.js @@ -2,13 +2,13 @@ // 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 fs = require('fs'); -const MJS_FILES = ['src/zen/split-view/ZenViewSplitter.ts']; +const fs = require("fs"); +const MJS_FILES = ["src/zen/split-view/ZenViewSplitter.ts"]; for (const file of MJS_FILES) { - const code = fs.readFileSync(file, 'utf8'); - require('@babel/core').transformSync(code, { - presets: ['@babel/preset-typescript'], + const code = fs.readFileSync(file, "utf8"); + require("@babel/core").transformSync(code, { + presets: ["@babel/preset-typescript"], filename: file, }); } diff --git a/eslint.config.mjs b/eslint.config.mjs index 19ed43515..68ead2cdd 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,27 +1,492 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import js from '@eslint/js'; -import globals from 'globals'; -import { defineConfig, globalIgnores } from 'eslint/config'; -import zenGlobals from './src/zen/zen.globals.js'; +import sdl from "@microsoft/eslint-plugin-sdl"; +import eslintConfigPrettier from "eslint-config-prettier/flat"; +import html from "eslint-plugin-html"; +import importPlugin from "eslint-plugin-import"; +import json from "@eslint/json"; +import lit from "eslint-plugin-lit"; +import mozilla from "eslint-plugin-mozilla"; +import reactHooks from "eslint-plugin-react-hooks"; +import zenGlobals from "./src/zen/zen.globals.mjs"; -export default defineConfig([ +import fs from "fs"; +import globals from "globals"; +import path from "path"; + +import globalIgnores from "./engine/eslint-ignores.config.mjs"; +import testPathsConfig from "./engine/eslint-test-paths.config.mjs"; +import repositoryGlobals from "./engine/eslint-file-globals.config.mjs"; +import rollouts from "./engine/eslint-rollouts.config.mjs"; +import subdirConfigs from "./engine/eslint-subdirs.config.mjs"; + +const testPaths = testPathsConfig.testPaths; + +function readFile(filePath) { + return fs + .readFileSync(filePath, { encoding: "utf-8" }) + .split("\n") + .filter((p) => p && !p.startsWith("#")); +} + +const httpTestingPaths = [ + `**/*mixedcontent*.{${mozilla.allFileExtensions.join(",")}}`, + `**/*CrossOrigin*.{${mozilla.allFileExtensions.join(",")}}`, + `**/*crossorigin*.{${mozilla.allFileExtensions.join(",")}}`, + `**/*cors*.{${mozilla.allFileExtensions.join(",")}}`, + `**/*downgrade*.{${mozilla.allFileExtensions.join(",")}}`, + `**/*Downgrade*.{${mozilla.allFileExtensions.join(",")}}`, +]; + +globals.browser = { + ...globals.browser, + ...zenGlobals.reduce((obj, key) => { + obj[key] = "readonly"; + return obj; + }, {}), +}; + +testPaths.browser = testPaths.browser.concat("src/zen/tests/"); + +/** + * Takes each path in the paths array, and expands it with the list of extensions + * that ESLint is watching. + * + * @param {object} options + * @param {string[]} options.paths + * The list of paths to wrap. + * @param {string[]} [options.excludedExtensions] + * The list of extensions to be excluded from the wrapping. + */ +function wrapPaths({ paths, excludedExtensions }) { + let extensions = excludedExtensions + ? mozilla.allFileExtensions.filter((f) => !excludedExtensions.includes(f)) + : mozilla.allFileExtensions; + return paths.map((p) => { + if (p.endsWith("**")) { + return p + `/*.{${extensions.join(",")}}`; + } + if (p.endsWith("/")) { + return p + `**/*.{${extensions.join(",")}}`; + } + if (p.endsWith("*")) { + return p + `.{${extensions.join(",")}}`; + } + return p; + }); +} + +/** + * Wraps the paths listed in the files section of a configuration with the + * file extensions that ESLint is watching. + * + * @param {object} configs + */ +function wrapPathsInConfig(configs) { + for (let config of configs) { + // add "engine/" to the paths in the files section. + config.files = wrapPaths({ paths: config.files.map((p) => "engine/" + p) }); + } + return configs; +} + +let config = [ { - files: ['**/*.{js,mjs,cjs}'], - plugins: { js }, - extends: ['js/recommended'], - languageOptions: { - globals: { - ...globals.browser, - ...zenGlobals.reduce((acc, global) => { - acc[global] = 'readable'; - return acc; - }, {}), + name: "import-plugin-settings", + settings: { + "import/extensions": [".mjs"], + "import/resolver": { + [path.resolve(import.meta.dirname, "engine", "srcdir-resolver.js")]: {}, + node: {}, }, }, - ignores: ['**/vendor/**', '**/tests/**'], }, - globalIgnores(['**/mochitests/**']), -]); + { + name: "ignores", + ignores: [...globalIgnores, "src/zen/vendor/*"], + }, + { + name: "all-files", + files: wrapPaths({ paths: ["**"] }), + linterOptions: { + // With this option on, if an inline comment disables a rule, and the + // rule is able to be automatically fixed, then ESLint will remove the + // inline comment and apply the fix. We don't want this because we have + // some rules that intentionally need to be turned off in specific cases, + // e.g. @microsoft/sdl/no-insecure-url. + reportUnusedDisableDirectives: "off", + }, + plugins: { lit }, + rules: { + "lit/quoted-expressions": ["error", "never"], + "lit/no-invalid-html": "error", + "lit/no-value-attribute": "error", + }, + }, + { + name: "source-type-script", + files: ["**/*.{js,json,html,sjs,xhtml}"], + languageOptions: { + sourceType: "script", + }, + }, + ...mozilla.configs["flat/recommended"], + { + name: "json-recommended-with-comments", + files: ["**/*.json"], + language: "json/jsonc", + ...json.configs.recommended, + }, + { + name: "json-recommended-no-comments", + files: ["**/package.json"], + language: "json/json", + ...json.configs.recommended, + }, + { + name: "json-empty-keys-off-for-image_builder", + files: ["taskcluster/docker/image_builder/policy.json"], + rules: { + "json/no-empty-keys": "off", + }, + }, + { + name: "eslint-plugin-html", + files: ["**/*.html", "**/*.xhtml"], + plugins: { html }, + }, + + { + name: "define-globals-for-browser-env", + // Not available for sjs files. + files: wrapPaths({ paths: ["**"], excludedExtensions: ["sjs"] }), + ignores: [ + // Also not available for various other scopes and tools. + "**/*.sys.mjs", + "**/?(*.)worker.?(m)js", + "**/?(*.)serviceworker.?(m)js", + ...wrapPaths({ + paths: testPaths.xpcshell, + excludedExtensions: ["mjs", "sjs"], + }), + "tools/lint/eslint/**", + ], + languageOptions: { + globals: globals.browser, + }, + }, + { + // Generally we assume that all files, except mjs ones are in our + // privileged and specific environment. mjs are handled separately by + // the recommended configuration in eslint-plugin-mozilla. + name: "define-privileged-and-specific-globals-for-most-files", + files: wrapPaths({ paths: ["**"], excludedExtensions: ["json"] }), + ignores: ["browser/components/storybook/**", "tools"], + languageOptions: { + globals: { + ...mozilla.environments.privileged.globals, + ...mozilla.environments.specific.globals, + }, + }, + }, + { + name: "define-globals-for-node-files", + files: [ + // All .eslintrc.mjs files are in the node environment, so turn that + // on here. + "**/.eslintrc*.mjs", + // .js files in the top-level are generally assumed to be node. + "\.*.js", + // *.config.js files are generally assumed to be configuration files + // based for node. + "**/*.config.js", + // The resolver for moz-src for eslint, vscode etc. + "engine/srcdir-resolver.js", + ], + languageOptions: { + globals: { ...globals.node, ...mozilla.turnOff(globals.browser) }, + }, + }, + + { + name: "browser-no-more-globals", + files: ["browser/base/content/browser.js"], + rules: { + "mozilla/no-more-globals": "error", + }, + }, + { + name: "jsx-files", + files: ["**/*.jsx", "browser/components/storybook/.storybook/**/*.mjs"], + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + }, + { + name: "eslint-plugin-import-rules", + files: ["**/*.mjs"], + plugins: { import: importPlugin }, + rules: { + "import/default": "error", + "import/export": "error", + "import/named": "error", + "import/namespace": "error", + "import/newline-after-import": "error", + "import/no-duplicates": "error", + "import/no-absolute-path": "error", + "import/no-named-default": "error", + "import/no-named-as-default": "error", + "import/no-named-as-default-member": "error", + "import/no-self-import": "error", + "import/no-unassigned-import": "error", + "import/no-unresolved": [ + "error", + // Bug 1773473 - Ignore resolver URLs for chrome and resource as we + // do not yet have a resolver for them. + { ignore: ["chrome://", "resource://"] }, + ], + "import/no-useless-path-segments": "error", + }, + }, + { + name: "turn-off-unassigned-import-for-stories", + // Turn off no-unassigned-import for files that typically test our + // custom elements, which are imported for the side effects (ie + // the custom element being registered) rather than any particular + // export: + files: ["**/*.stories.mjs"], + plugins: { import: importPlugin }, + rules: { + "import/no-unassigned-import": "off", + }, + }, + { + ...mozilla.configs["flat/general-test"], + files: wrapPaths({ paths: ["**/test/**", "**/tests/**"] }), + }, + { + ...mozilla.configs["flat/xpcshell-test"], + files: wrapPaths({ + paths: testPaths.xpcshell, + excludedExtensions: ["mjs", "sjs"], + }), + }, + { + name: "no-unused-vars-disable-on-headjs", + // If it is an xpcshell head file, we turn off global unused variable checks, as it + // would require searching the other test files to know if they are used or not. + // This would be expensive and slow, and it isn't worth it for head files. + // We could get developers to declare as exported, but that doesn't seem worth it. + files: testPaths.xpcshell.map((filePath) => `${filePath}head*.js`), + rules: { + "no-unused-vars": [ + "error", + { + argsIgnorePattern: "^_", + caughtErrors: "none", + vars: "local", + }, + ], + }, + }, + { + name: "no-unused-vars-for-xpcshell", + // This section enables errors of no-unused-vars globally for all test*.js + // files in xpcshell test paths. + // This is not done in the xpcshell-test configuration as we cannot pull + // in overrides from there. We should at some stage, aim to enable this + // for all files in xpcshell-tests. + files: testPaths.xpcshell.map((filePath) => `${filePath}test*.js`), + rules: { + // No declaring variables that are never used + "no-unused-vars": [ + "error", + { + argsIgnorePattern: "^_", + caughtErrors: "none", + vars: "all", + }, + ], + }, + }, + { + ...mozilla.configs["flat/browser-test"], + files: wrapPaths({ + paths: testPaths.browser, + excludedExtensions: ["mjs", "sjs"], + }), + }, + { + ...mozilla.configs["flat/mochitest-test"], + files: wrapPaths({ + paths: testPaths.mochitest, + excludedExtensions: ["mjs"], + }), + ignores: ["security/manager/ssl/tests/mochitest/browser/**"], + }, + { + ...mozilla.configs["flat/chrome-test"], + files: wrapPaths({ + paths: testPaths.chrome, + excludedExtensions: ["mjs", "sjs"], + }), + }, + { + name: "simpletest", + languageOptions: { + globals: { + ...mozilla.environments.simpletest.globals, + }, + }, + files: [ + ...testPaths.mochitest.map((filePath) => `${filePath}/**/*.js`), + ...testPaths.chrome.map((filePath) => `${filePath}/**/*.js`), + ], + }, + { + name: "multiple-test-kinds", + // Some directories have multiple kinds of tests, and some rules + // don't work well for HTML-based mochitests, so disable those. + files: testPaths.xpcshell + .concat(testPaths.browser) + .map((filePath) => [`${filePath}/**/*.html`, `${filePath}/**/*.xhtml`]) + .flat(), + rules: { + // plain/chrome mochitests don't automatically include Assert, so + // autofixing `ok()` to Assert.something is bad. + "mozilla/no-comparison-or-assignment-inside-ok": "off", + }, + }, + { + name: "test-file-reuse", + // Some directories reuse `test_foo.js` files between mochitest-plain and + // unit tests, or use custom postMessage-based assertion propagation into + // browser tests. Ignore those too: + files: wrapPaths({ + paths: [ + // Reuses xpcshell unit test scripts in mochitest-plain HTML files. + "dom/indexedDB/test/**", + // Dispatches functions to the webpage in ways that are hard to detect. + "toolkit/components/antitracking/test/**", + ], + }), + rules: { + "mozilla/no-comparison-or-assignment-inside-ok": "off", + }, + }, + { + // Rules of Hooks broadly checks for camelCase "use" identifiers, so + // enable only for paths actually using React to avoid false positives. + name: "react-hooks", + files: [ + "browser/components/aboutwelcome/**", + "browser/components/asrouter/**", + "browser/extensions/newtab/**", + "devtools/**", + ], + ...reactHooks.configs["recommended-latest"], + plugins: { "react-hooks": reactHooks }, + rules: { + // react-hooks/recommended has exhaustive-deps as a warning, we prefer + // errors, so that raised issues get addressed one way or the other. + "react-hooks/exhaustive-deps": "error", + }, + }, + { + name: "disable-no-insecure-url-for-http-testing", + // Exempt files with these paths since they have to use http for full coverage + files: httpTestingPaths, + plugins: { "@microsoft/sdl": sdl }, + rules: { + "@microsoft/sdl/no-insecure-url": "off", + }, + }, + { + name: "mozilla/valid-jsdoc", + files: wrapPaths({ paths: ["**"] }), + ...mozilla.configs["flat/valid-jsdoc"], + }, + { + name: "mozilla/require-jsdoc", + files: wrapPaths({ paths: ["**"] }), + ...mozilla.configs["flat/require-jsdoc"], + }, + { + name: "rollout-no-browser-refs-in-toolkit", + files: ["toolkit/**"], + ignores: ["toolkit/**/test/**", "toolkit/**/tests/**"], + plugins: { mozilla }, + rules: { + "mozilla/no-browser-refs-in-toolkit": "error", + }, + }, + { + name: "no-newtab-refs-outside-newtab", + files: ["**/*.mjs", "**/*.js", "**/*.sys.mjs"], + ignores: [ + "tools/@types/generated/**", + "tools/lint/eslint/eslint-plugin-mozilla/lib/rules/no-newtab-refs-outside-newtab.mjs", + "tools/lint/eslint/eslint-plugin-mozilla/tests/no-newtab-refs-outside-newtab.mjs", + ], + plugins: { mozilla }, + rules: { + "mozilla/no-newtab-refs-outside-newtab": "error", + }, + }, + { + name: "jsdoc/require-jsdoc", + ignores: wrapPaths({ paths: ["**"] }), + ...mozilla.configs["flat/jsdoc-require-jsdoc"], + }, + + ...wrapPathsInConfig(subdirConfigs), + ...wrapPathsInConfig(repositoryGlobals), + + /** + * The items below should always be the last items in this order: + * + * - Enable eslint-config-prettier. + * - Enable curly. + * - Rollouts + */ + + // Turn off rules that conflict with Prettier. + { name: "eslint-config-prettier", ...eslintConfigPrettier }, + { + name: "enable-curly", + files: wrapPaths({ paths: ["**/"] }), + rules: { + // Require braces around blocks that start a new line. This must be + // configured after eslint-config-prettier is included, as otherwise + // eslint-config-prettier disables the curly rule. Hence, we do + // not include it in + // `tools/lint/eslint/eslint-plugin-mozilla/lib/configs/recommended.js`. + curly: ["error", "all"], + }, + }, + ...wrapPathsInConfig(rollouts), +]; + +// The various places we get our globals from use true/false rather than +// the strings required by ESLint, so translate those here. +config.map((entry) => { + if (entry.languageOptions?.globals) { + let newGlobals = {}; + for (let [key, value] of Object.entries(entry.languageOptions.globals)) { + if (typeof entry.languageOptions.globals[key] == "boolean") { + newGlobals[key] = value ? "writable" : "readonly"; + } else { + newGlobals[key] = value; + } + } + } + return entry; +}); + +export default config; diff --git a/package-lock.json b/package-lock.json index 94b0635cf..35395adda 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,21 +10,41 @@ "license": "MPL-2.0", "devDependencies": { "@babel/preset-typescript": "^7.27.0", - "@eslint/js": "^9.32.0", + "@eslint/js": "^9.39.2", + "@eslint/json": "^0.14.0", "@microsoft/eslint-plugin-sdl": "^1.1.0", - "@zen-browser/surfer": "^1.13.0", - "eslint": "^9.32.0", + "@zen-browser/surfer": "^1.13.1", + "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.8", + "eslint-plugin-eslint-plugin": "^7.3.0", "eslint-plugin-html": "^8.1.3", "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jest": "^29.12.1", "eslint-plugin-json": "^4.0.1", + "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-lit": "^2.1.1", + "eslint-plugin-mozilla": "^4.3.3", + "eslint-plugin-no-unsanitized": "4.1.4", + "eslint-plugin-promise": "7.2.1", + "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-spidermonkey-js": "file:tools/eslint-plugin-spidermonkey-js", "formal-git": "^1.2.9", "globals": "^16.3.0", "husky": "^9.1.7", "lint-staged": "^15.3.0", "prettier": "^3.4.2", - "prettier-plugin-sh": "^0.14.0" + "prettier-plugin-sh": "^0.14.0", + "typescript": "^5.9.3", + "typescript-eslint": "^8.52.0" + } + }, + "engine/tools/lint/eslint/eslint-plugin-spidermonkey-js": { + "extraneous": true, + "license": "MPL-2.0", + "devDependencies": {}, + "engines": { + "node": ">=6.9.1" } }, "node_modules/@ampproject/remapping": { @@ -511,10 +531,39 @@ "node": ">=6.9.0" } }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.78.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.78.0.tgz", + "integrity": "sha512-rQkU5u8hNAq2NVRzHnIUUvR6arbO0b6AOlvpTNS48CkiKSn/xtNfOzBK23JE4SiW89DgvU7GtxLVgV4Vn2HBAw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "^1.0.8", + "@typescript-eslint/types": "^8.46.4", + "comment-parser": "1.4.1", + "esquery": "^1.6.0", + "jsdoc-type-pratt-parser": "~7.0.0" + }, + "engines": { + "node": ">=20.11.0" + } + }, + "node_modules/@es-joy/resolve.exports": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz", + "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + } + }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -544,9 +593,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -554,13 +603,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.6", + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -569,19 +618,22 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", - "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", - "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -642,9 +694,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.32.0.tgz", - "integrity": "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true, "license": "MIT", "engines": { @@ -654,10 +706,26 @@ "url": "https://eslint.org/donate" } }, + "node_modules/@eslint/json": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/json/-/json-0.14.0.tgz", + "integrity": "sha512-rvR/EZtvUG3p9uqrSmcDJPYSH7atmWr0RnFWN6m917MAPx82+zQgPUmDu0whPFG6XTyM0vB/hR6c1Q63OaYtCQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "@eslint/plugin-kit": "^0.4.1", + "@humanwhocodes/momoa": "^3.3.10", + "natural-compare": "^1.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -665,13 +733,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", - "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.1", + "@eslint/core": "^0.17.0", "levn": "^0.4.1" }, "engines": { @@ -730,6 +798,16 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@humanwhocodes/momoa": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-3.3.10.tgz", + "integrity": "sha512-KWiFQpSAqEIyrTXko3hFNLeQvSK8zXlJQzhhxsyVn58WFRYXST99b3Nqnu+ttOtjds2Pl2grUHGpe2NzhPynuQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, "node_modules/@humanwhocodes/retry": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", @@ -815,6 +893,49 @@ "eslint": "^9" } }, + "node_modules/@microsoft/eslint-plugin-sdl/node_modules/eslint-plugin-react": { + "version": "7.37.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz", + "integrity": "sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/@microsoft/eslint-plugin-sdl/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@oozcitak/dom": { "version": "1.15.10", "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.10.tgz", @@ -1102,6 +1223,20 @@ "dev": true, "license": "MIT" }, + "node_modules/@sindresorhus/base62": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz", + "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -1130,10 +1265,266 @@ "dev": true, "license": "MIT" }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.52.0.tgz", + "integrity": "sha512-okqtOgqu2qmZJ5iN4TWlgfF171dZmx2FzdOv2K/ixL2LZWDStL8+JgQerI2sa8eAEfoydG9+0V96m7V+P8yE1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.52.0", + "@typescript-eslint/type-utils": "8.52.0", + "@typescript-eslint/utils": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.52.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.52.0.tgz", + "integrity": "sha512-iIACsx8pxRnguSYhHiMn2PvhvfpopO9FXHyn1mG5txZIsAaB6F0KwbFnUQN3KCiG3Jcuad/Cao2FAs1Wp7vAyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.52.0.tgz", + "integrity": "sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.52.0", + "@typescript-eslint/types": "^8.52.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.52.0.tgz", + "integrity": "sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.52.0.tgz", + "integrity": "sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.52.0.tgz", + "integrity": "sha512-JD3wKBRWglYRQkAtsyGz1AewDu3mTc7NtRjR/ceTyGoPqmdS5oCdx/oZMWD5Zuqmo6/MpsYs0wp6axNt88/2EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0", + "@typescript-eslint/utils": "8.52.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.52.0.tgz", + "integrity": "sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.52.0.tgz", + "integrity": "sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.52.0", + "@typescript-eslint/tsconfig-utils": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/visitor-keys": "8.52.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.52.0.tgz", + "integrity": "sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.52.0", + "@typescript-eslint/types": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.52.0.tgz", + "integrity": "sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.52.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@zen-browser/surfer": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.13.0.tgz", - "integrity": "sha512-iecPvDKVVHSI/vdP8nbmJwp7cuc9MuU6k/gVbCVhli5gP4XSd72/8QzH1jpLZftwSMDJkXNNoy/KK+os59FU+w==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.13.1.tgz", + "integrity": "sha512-IMi/A+ee/z5tfwblvP/melZEzqczLhA7hU2hzQajW1bS7HLIvJN2vjfl1oT0TElmIHC6amrWNGl8HI3k4pgWog==", "dev": true, "license": "MPL-2.0", "dependencies": { @@ -1249,6 +1640,17 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=14" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1256,6 +1658,16 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", @@ -1423,6 +1835,13 @@ "dev": true, "license": "MIT" }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, "node_modules/async-compat": { "version": "1.6.8", "resolved": "https://registry.npmjs.org/async-compat/-/async-compat-1.6.8.tgz", @@ -1493,6 +1912,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axe-core": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", + "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, "node_modules/axios": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", @@ -1505,6 +1934,16 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/b4a": { "version": "1.6.7", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", @@ -2039,6 +2478,17 @@ "node": ">= 6" } }, + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2101,6 +2551,13 @@ "node": ">= 8" } }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -2156,9 +2613,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -2657,25 +3114,24 @@ } }, "node_modules/eslint": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz", - "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.0", - "@eslint/core": "^0.15.0", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.32.0", - "@eslint/plugin-kit": "^0.3.4", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", @@ -2842,6 +3298,23 @@ "eslint": ">=8" } }, + "node_modules/eslint-plugin-eslint-plugin": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-plugin/-/eslint-plugin-eslint-plugin-7.3.0.tgz", + "integrity": "sha512-M9S7ihAFD91+FnSja0Joky+0xrJlgMqmy3WmbOJVNpnUqy49YqEImSdfuVbpnggVz3QinzIVPJh2cPYaJ1Z4TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "estraverse": "^5.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.1 || >=24.0.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0" + } + }, "node_modules/eslint-plugin-html": { "version": "8.1.3", "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-8.1.3.tgz", @@ -2909,6 +3382,95 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-jest": { + "version": "29.12.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.12.1.tgz", + "integrity": "sha512-Rxo7r4jSANMBkXLICJKS0gjacgyopfNAsoS0e3R9AHnjoKuQOaaPfmsDJPi8UWwygI099OV/K/JhpYRVkxD4AA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.0.0" + }, + "engines": { + "node": "^20.12.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "61.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.7.1.tgz", + "integrity": "sha512-36DpldF95MlTX//n3/naULFVt8d1cV4jmSkx7ZKrE9ikkKHAgMLesuWp1SmwpVwAs5ndIM6abKd6PeOYZUgdWg==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@es-joy/jsdoccomment": "~0.78.0", + "@es-joy/resolve.exports": "1.2.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.1", + "debug": "^4.4.3", + "escape-string-regexp": "^4.0.0", + "espree": "^11.0.0", + "esquery": "^1.7.0", + "html-entities": "^2.6.0", + "object-deep-merge": "^2.0.0", + "parse-imports-exports": "^0.2.4", + "semver": "^7.7.3", + "spdx-expression-parse": "^4.0.0", + "to-valid-identifier": "^1.0.0" + }, + "engines": { + "node": ">=20.11.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", + "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/espree": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.0.0.tgz", + "integrity": "sha512-+gMeWRrIh/NsG+3NaLeWHuyeyk70p2tbvZIWBYcqQ4/7Xvars6GYTZNhF1sIeLcc6Wb11He5ffz3hsHyXFrw5A==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint-plugin-json": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-json/-/eslint-plugin-json-4.0.1.tgz", @@ -2923,6 +3485,93 @@ "node": ">=18.0" } }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-lit": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-lit/-/eslint-plugin-lit-2.1.1.tgz", + "integrity": "sha512-qmyAOnnTCdS+vDnNxtCoF0icSKIio4GUv6ZLnaCtTX6G/YezRa6Ag6tOQ+MfV5Elvtw9CIXeliRX4mIBSwrPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "eslint": ">= 8" + } + }, + "node_modules/eslint-plugin-mozilla": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-mozilla/-/eslint-plugin-mozilla-4.3.3.tgz", + "integrity": "sha512-Caxrl4pZoEV612oU4iGcRP+R4G7ooO1MpV5rTPCGKFTYVY6Iw3FEJ0AA+1mUY/rDIdqw7CxyV7+Hllzyh3UYlQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "estraverse": "^5.3.0", + "htmlparser2": "^10.0.0", + "toml-eslint-parser": "0.10.0" + }, + "engines": { + "node": ">=22.0.0" + }, + "peerDependencies": { + "@microsoft/eslint-plugin-sdl": "^1.0.0", + "eslint": "^9.0.0", + "eslint-plugin-jsdoc": "^61.0.0", + "eslint-plugin-no-unsanitized": "^4.1.0", + "eslint-plugin-promise": "^7.2.1" + }, + "peerDependenciesMeta": { + "@eslint-plugin-jsdoc": { + "optional": true + }, + "@microsoft/eslint-plugin-sdl": { + "optional": true + } + } + }, "node_modules/eslint-plugin-n": { "version": "17.10.3", "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.10.3.tgz", @@ -2988,10 +3637,39 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/eslint-plugin-no-unsanitized": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-4.1.4.tgz", + "integrity": "sha512-cjAoZoq3J+5KJuycYYOWrc0/OpZ7pl2Z3ypfFq4GtaAgheg+L7YGxUo2YS3avIvo/dYU5/zR2hXu3v81M9NxhQ==", + "dev": true, + "license": "MPL-2.0", + "peerDependencies": { + "eslint": "^8 || ^9" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-7.2.1.tgz", + "integrity": "sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, "node_modules/eslint-plugin-react": { - "version": "7.37.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz", - "integrity": "sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==", + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", "dev": true, "license": "MIT", "dependencies": { @@ -3005,7 +3683,7 @@ "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.8", + "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", @@ -3054,6 +3732,10 @@ "safe-regex": "^1.1.0" } }, + "node_modules/eslint-plugin-spidermonkey-js": { + "resolved": "tools/eslint-plugin-spidermonkey-js", + "link": true + }, "node_modules/eslint-scope": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", @@ -3117,9 +3799,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -3819,6 +4501,24 @@ "node": ">= 0.4" } }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT", + "peer": true + }, "node_modules/htmlparser2": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", @@ -4511,6 +5211,17 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.0.0.tgz", + "integrity": "sha512-c7YbokssPOSHmqTbSAmTtnVgAVa/7lumWNYqomgd5KOMyPrRve2anx6lonfOsXEQacqF9FKVUj7bLg4vRSvdYA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", @@ -4615,6 +5326,26 @@ "node": ">=6" } }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -5258,6 +5989,14 @@ "node": ">=0.10.0" } }, + "node_modules/object-deep-merge": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.0.tgz", + "integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -5497,6 +6236,42 @@ "node": ">=6" } }, + "node_modules/parse-imports-exports": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz", + "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "parse-statements": "1.0.11" + } + }, + "node_modules/parse-statements": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz", + "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^6.0.1" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -5947,6 +6722,20 @@ "semver": "bin/semver" } }, + "node_modules/reserved-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz", + "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -6174,9 +6963,9 @@ } }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "bin": { @@ -6492,6 +7281,34 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0", + "peer": true + }, + "node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "dev": true, + "license": "CC0-1.0", + "peer": true + }, "node_modules/speedometer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-1.0.0.tgz", @@ -6632,6 +7449,21 @@ "node": ">=8" } }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.12", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", @@ -6940,6 +7772,54 @@ "globrex": "^0.1.2" } }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6960,6 +7840,66 @@ "dev": true, "license": "MIT" }, + "node_modules/to-valid-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz", + "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@sindresorhus/base62": "^1.0.0", + "reserved-identifiers": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/toml-eslint-parser": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/toml-eslint-parser/-/toml-eslint-parser-0.10.0.tgz", + "integrity": "sha512-khrZo4buq4qVmsGzS5yQjKe/WsFvV8fGfOjDQN0q4iy9FjRfPWRgTFrU8u1R2iu/SfWLhY9WnCi4Jhdrcbtg+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/toml-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -7097,6 +8037,44 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.52.0.tgz", + "integrity": "sha512-atlQQJ2YkO4pfTVQmQ+wvYQwexPDOIgo+RaVcD7gHgzy/IQA+XTyuxNM9M9TVXvttkF7koBHmcwisKdOAf2EcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.52.0", + "@typescript-eslint/parser": "8.52.0", + "@typescript-eslint/typescript-estree": "8.52.0", + "@typescript-eslint/utils": "8.52.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", @@ -7541,6 +8519,14 @@ "engines": { "node": ">=0.8" } + }, + "tools/eslint-plugin-spidermonkey-js": { + "dev": true, + "license": "MPL-2.0", + "devDependencies": {}, + "engines": { + "node": ">=6.9.1" + } } } } diff --git a/package.json b/package.json index 051c10475..d7e359ae9 100644 --- a/package.json +++ b/package.json @@ -51,20 +51,32 @@ "homepage": "https://github.com/zen-browser/desktop#readme", "devDependencies": { "@babel/preset-typescript": "^7.27.0", - "@eslint/js": "^9.32.0", + "@eslint/js": "^9.39.2", + "@eslint/json": "^0.14.0", "@microsoft/eslint-plugin-sdl": "^1.1.0", - "@zen-browser/surfer": "^1.13.0", - "eslint": "^9.32.0", + "@zen-browser/surfer": "^1.13.1", + "eslint": "^9.39.2", "eslint-config-prettier": "^10.1.8", + "eslint-plugin-eslint-plugin": "^7.3.0", "eslint-plugin-html": "^8.1.3", "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jest": "^29.12.1", "eslint-plugin-json": "^4.0.1", + "eslint-plugin-jsx-a11y": "^6.10.2", + "eslint-plugin-lit": "^2.1.1", + "eslint-plugin-mozilla": "^4.3.3", + "eslint-plugin-no-unsanitized": "4.1.4", + "eslint-plugin-promise": "7.2.1", + "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-spidermonkey-js": "file:tools/eslint-plugin-spidermonkey-js", "formal-git": "^1.2.9", "globals": "^16.3.0", "husky": "^9.1.7", "lint-staged": "^15.3.0", "prettier": "^3.4.2", - "prettier-plugin-sh": "^0.14.0" + "prettier-plugin-sh": "^0.14.0", + "typescript": "^5.9.3", + "typescript-eslint": "^8.52.0" } } diff --git a/prefs/fastfox/smoothscroll.yaml b/prefs/fastfox/smoothscroll.yaml index 186a07e89..943c097a4 100644 --- a/prefs/fastfox/smoothscroll.yaml +++ b/prefs/fastfox/smoothscroll.yaml @@ -5,45 +5,45 @@ # Smooth scrolling and mousewheel tuning preferences - name: general.smoothScroll.msdPhysics.enabled - condition: '!defined(XP_MACOSX)' + condition: "!defined(XP_MACOSX)" value: true - name: general.smoothScroll.currentVelocityWeighting - condition: '!defined(XP_MACOSX)' - value: '0.15' + condition: "!defined(XP_MACOSX)" + value: "0.15" - name: general.smoothScroll.stopDecelerationWeighting - condition: '!defined(XP_MACOSX)' - value: '0.6' + condition: "!defined(XP_MACOSX)" + value: "0.6" - name: mousewheel.min_line_scroll_amount - condition: '!defined(XP_MACOSX)' + condition: "!defined(XP_MACOSX)" value: 10 - name: general.smoothScroll.mouseWheel.durationMinMS - condition: '!defined(XP_MACOSX)' + condition: "!defined(XP_MACOSX)" value: 80 - name: general.smoothScroll.msdPhysics.continuousMotionMaxDeltaMS - condition: '!defined(XP_MACOSX)' + condition: "!defined(XP_MACOSX)" value: 12 - name: general.smoothScroll.msdPhysics.motionBeginSpringConstant - condition: '!defined(XP_MACOSX)' + condition: "!defined(XP_MACOSX)" value: 600 - name: general.smoothScroll.msdPhysics.regularSpringConstant - condition: '!defined(XP_MACOSX)' + condition: "!defined(XP_MACOSX)" value: 650 - name: general.smoothScroll.msdPhysics.slowdownMinDeltaMS - condition: '!defined(XP_MACOSX)' + condition: "!defined(XP_MACOSX)" value: 25 - name: general.smoothScroll.msdPhysics.slowdownSpringConstant - condition: '!defined(XP_MACOSX)' + condition: "!defined(XP_MACOSX)" value: 250 - name: mousewheel.default.delta_multiplier_y - condition: '!defined(XP_MACOSX)' + condition: "!defined(XP_MACOSX)" value: 200 diff --git a/prefs/firefox/browser.yaml b/prefs/firefox/browser.yaml index 63eeb7844..beea8da27 100644 --- a/prefs/firefox/browser.yaml +++ b/prefs/firefox/browser.yaml @@ -18,7 +18,7 @@ value: true - name: browser.toolbars.bookmarks.visibility - value: 'never' + value: "never" - name: widget.non-native-theme.scrollbar.style value: 2 @@ -48,7 +48,7 @@ - name: app.update.checkInstallTime.days value: 6 - condition: 'defined(MOZILLA_OFFICIAL)' + condition: "defined(MOZILLA_OFFICIAL)" - name: browser.profiles.enabled value: false diff --git a/prefs/firefox/fullscreen.yaml b/prefs/firefox/fullscreen.yaml index 9b9ef1e17..269f46209 100644 --- a/prefs/firefox/fullscreen.yaml +++ b/prefs/firefox/fullscreen.yaml @@ -4,10 +4,10 @@ # Fullscreen API preferences - name: full-screen-api.transition-duration.enter - value: '0 0' + value: "0 0" - name: full-screen-api.transition-duration.leave - value: '0 0' + value: "0 0" - name: full-screen-api.warning.delay value: -1 diff --git a/prefs/firefox/performance.yaml b/prefs/firefox/performance.yaml index fcc1d294f..c58582064 100644 --- a/prefs/firefox/performance.yaml +++ b/prefs/firefox/performance.yaml @@ -4,7 +4,7 @@ - name: browser.lowMemoryResponseMask value: 3 - condition: 'defined(XP_MACOSX)' + condition: "defined(XP_MACOSX)" - name: network.predictor.enable-hover-on-ssl value: true @@ -14,6 +14,6 @@ # Make sure its in sync with: # https://searchfox.org/firefox-main/rev/1477feb9706f4ccc5bd571c1c215832a6fbb7464/modules/libpref/init/StaticPrefList.yaml#7741-7748 - name: gfx.webrender.compositor - condition: 'defined(XP_WIN) || defined(XP_DARWIN)' - value: '@cond' + condition: "defined(XP_WIN) || defined(XP_DARWIN)" + value: "@cond" mirror: once diff --git a/prefs/privatefox/disablemozilla.yaml b/prefs/privatefox/disablemozilla.yaml index 8e80fc91f..41b7d06e7 100644 --- a/prefs/privatefox/disablemozilla.yaml +++ b/prefs/privatefox/disablemozilla.yaml @@ -3,7 +3,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. - name: browser.privatebrowsing.vpnpromourl - value: '' + value: "" locked: true - name: extensions.getAddons.showPane diff --git a/prefs/privatefox/privacy.yaml b/prefs/privatefox/privacy.yaml index 31b439091..dfe89b769 100644 --- a/prefs/privatefox/privacy.yaml +++ b/prefs/privatefox/privacy.yaml @@ -20,7 +20,7 @@ locked: true - name: toolkit.telemetry.server - value: 'data:,' + value: "data:," locked: true - name: toolkit.telemetry.archive.enabled @@ -56,7 +56,7 @@ locked: true - name: toolkit.coverage.endpoint.base - value: '' + value: "" locked: true - name: browser.newtabpage.activity-stream.feeds.telemetry @@ -84,7 +84,7 @@ value: false - name: app.normandy.api_url - value: '' + value: "" locked: true # Crash Reports diff --git a/prefs/zen/glance.yaml b/prefs/zen/glance.yaml index b0daa7558..2246aa916 100644 --- a/prefs/zen/glance.yaml +++ b/prefs/zen/glance.yaml @@ -12,7 +12,7 @@ value: true - name: zen.glance.activation-method - value: 'alt' # ctrl, alt, shift + value: "alt" # ctrl, alt, shift - name: zen.glance.animation-duration value: 350 # in milliseconds diff --git a/prefs/zen/gtk.yaml b/prefs/zen/gtk.yaml index d68eb68a7..a2c88535b 100644 --- a/prefs/zen/gtk.yaml +++ b/prefs/zen/gtk.yaml @@ -5,8 +5,8 @@ # GTK-specific preferences - name: widget.gtk.rounded-bottom-corners.enabled value: true - condition: 'defined(MOZ_WIDGET_GTK)' + condition: "defined(MOZ_WIDGET_GTK)" - name: zen.widget.linux.transparency value: false - condition: 'defined(MOZ_WIDGET_GTK)' + condition: "defined(MOZ_WIDGET_GTK)" diff --git a/prefs/zen/macos.yaml b/prefs/zen/macos.yaml index 55d86a13f..29d7010d7 100644 --- a/prefs/zen/macos.yaml +++ b/prefs/zen/macos.yaml @@ -5,7 +5,7 @@ # Enable transparent background for macos - name: widget.macos.sidebar-blend-mode.behind-window value: true - condition: 'defined(XP_MACOSX)' + condition: "defined(XP_MACOSX)" # 1. hudWindow # 2. fullScreenUI @@ -16,7 +16,7 @@ # 7. underlay - name: zen.widget.macos.window-material value: 1 - condition: 'defined(XP_MACOSX)' + condition: "defined(XP_MACOSX)" cpptype: uint32_t mirror: always type: static diff --git a/prefs/zen/mods.yaml b/prefs/zen/mods.yaml index d9c12991f..207c7e074 100644 --- a/prefs/zen/mods.yaml +++ b/prefs/zen/mods.yaml @@ -9,8 +9,8 @@ value: 20 # In days - name: zen.mods.auto-update - value: '@cond' - condition: 'defined(MOZILLA_OFFICIAL)' + value: "@cond" + condition: "defined(MOZILLA_OFFICIAL)" - name: zen.rice.share.notice.accepted value: false @@ -18,10 +18,10 @@ # === Mark: Site Injection === - name: zen.injections.match-urls - value: 'https://zen-browser.app/*' + value: "https://zen-browser.app/*" locked: true - condition: 'defined(MOZILLA_OFFICIAL)' + condition: "defined(MOZILLA_OFFICIAL)" - name: zen.injections.match-urls - value: 'http://localhost/*' - condition: '!defined(MOZILLA_OFFICIAL)' + value: "http://localhost/*" + condition: "!defined(MOZILLA_OFFICIAL)" diff --git a/prefs/zen/session-store.yaml b/prefs/zen/session-store.yaml index 73d185eae..6f6911592 100644 --- a/prefs/zen/session-store.yaml +++ b/prefs/zen/session-store.yaml @@ -6,7 +6,7 @@ value: true - name: zen.session-store.log - value: '@IS_TWILIGHT@' + value: "@IS_TWILIGHT@" - name: zen.session-store.restore-unsynced-windows value: true diff --git a/prefs/zen/theme.yaml b/prefs/zen/theme.yaml index 4ec634e9a..a77cff584 100644 --- a/prefs/zen/theme.yaml +++ b/prefs/zen/theme.yaml @@ -3,7 +3,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. - name: zen.theme.accent-color - value: 'AccentColor' + value: "AccentColor" - name: zen.theme.content-element-separation value: 8 @@ -30,11 +30,11 @@ value: true - name: zen.theme.styled-status-panel - value: '@IS_TWILIGHT@' + value: "@IS_TWILIGHT@" - name: zen.theme.styled-status-panel value: true - condition: 'defined(XP_MACOSX)' + condition: "defined(XP_MACOSX)" - name: zen.theme.hide-unified-extensions-button value: true diff --git a/prefs/zen/view.yaml b/prefs/zen/view.yaml index df33af7c9..b6a158026 100644 --- a/prefs/zen/view.yaml +++ b/prefs/zen/view.yaml @@ -10,11 +10,11 @@ - name: zen.view.mac.show-three-dot-menu value: false - condition: 'defined(XP_MACOSX)' + condition: "defined(XP_MACOSX)" - name: zen.widget.mac.mono-window-controls value: true - condition: 'defined(XP_MACOSX)' + condition: "defined(XP_MACOSX)" - name: zen.view.use-single-toolbar value: true @@ -41,7 +41,7 @@ value: 2 - name: zen.view.context-menu.refresh - value: '@IS_TWILIGHT@' + value: "@IS_TWILIGHT@" - name: zen.view.borderless-fullscreen value: true diff --git a/prefs/zen/watermark.yaml b/prefs/zen/watermark.yaml index a3e443c2a..1d5cf3324 100644 --- a/prefs/zen/watermark.yaml +++ b/prefs/zen/watermark.yaml @@ -3,6 +3,6 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. - name: zen.watermark.enabled - value: '@cond' + value: "@cond" sticky: true - condition: 'defined(MOZILLA_OFFICIAL)' + condition: "defined(MOZILLA_OFFICIAL)" diff --git a/prefs/zen/welcome.yaml b/prefs/zen/welcome.yaml index b0a7940b2..ec44edc18 100644 --- a/prefs/zen/welcome.yaml +++ b/prefs/zen/welcome.yaml @@ -3,6 +3,6 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. - name: zen.welcome-screen.seen - value: '@cond' + value: "@cond" sticky: true - condition: '!defined(MOZILLA_OFFICIAL)' + condition: "!defined(MOZILLA_OFFICIAL)" diff --git a/prefs/zen/windows.yaml b/prefs/zen/windows.yaml index 9ef32f574..effae25bb 100644 --- a/prefs/zen/windows.yaml +++ b/prefs/zen/windows.yaml @@ -5,15 +5,15 @@ # Mica effect preferences for Windows - name: widget.windows.mica value: true - condition: 'defined(XP_WIN)' + condition: "defined(XP_WIN)" - name: widget.windows.mica.popups value: true - condition: 'defined(XP_WIN)' + condition: "defined(XP_WIN)" # 1 = DWMSBT_MAINWINDOW # 2 = DWMSBT_TRANSIENTWINDOW (default, also used for popups) # 3 = DWMSBT_TABBEDWINDOW - name: widget.windows.mica.toplevel-backdrop value: 2 - condition: 'defined(XP_WIN)' + condition: "defined(XP_WIN)" diff --git a/prefs/zen/workspaces.yaml b/prefs/zen/workspaces.yaml index fdd9a2877..8bf9a57be 100644 --- a/prefs/zen/workspaces.yaml +++ b/prefs/zen/workspaces.yaml @@ -36,8 +36,8 @@ value: 10 - name: zen.workspaces.debug - value: '@cond' - condition: '!defined(MOZILLA_OFFICIAL)' # Section: Pinned tabs management + value: "@cond" + condition: "!defined(MOZILLA_OFFICIAL)" # Section: Pinned tabs management - name: zen.pinned-tab-manager.wheel-close-if-pending value: true diff --git a/src/browser/components/preferences/zen-settings.js b/src/browser/components/preferences/zen-settings.js index 06dfd78c3..690aab4cf 100644 --- a/src/browser/components/preferences/zen-settings.js +++ b/src/browser/components/preferences/zen-settings.js @@ -1,24 +1,24 @@ -/* eslint-disable no-undef, no-unused-vars */ +/* eslint-disable no-undef */ // 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 { nsZenMultiWindowFeature } = ChromeUtils.importESModule( - 'chrome://browser/content/zen-components/ZenCommonUtils.mjs', - { global: 'current' } + "chrome://browser/content/zen-components/ZenCommonUtils.mjs", + { global: "current" } ); const { nsKeyShortcutModifiers } = ChromeUtils.importESModule( - 'chrome://browser/content/zen-components/ZenKeyboardShortcuts.mjs', + "chrome://browser/content/zen-components/ZenKeyboardShortcuts.mjs", { - global: 'current', + global: "current", } ); var gZenMarketplaceManager = { async init() { - const checkForUpdates = document.getElementById('zenThemeMarketplaceCheckForUpdates'); - const header = document.getElementById('zenMarketplaceHeader'); + const checkForUpdates = document.getElementById("zenThemeMarketplaceCheckForUpdates"); + const header = document.getElementById("zenMarketplaceHeader"); if (!checkForUpdates || !header) { return; // We haven't entered the settings page yet. @@ -50,14 +50,14 @@ var gZenMarketplaceManager = { } }; - checkForUpdates.addEventListener('click', checkForUpdateClick); + checkForUpdates.addEventListener("click", checkForUpdateClick); - document.addEventListener('ZenModsMarketplace:CheckForUpdatesFinished', (event) => { + document.addEventListener("ZenModsMarketplace:CheckForUpdatesFinished", (event) => { checkForUpdates.disabled = false; const updates = event.detail.updates; - const success = document.getElementById('zenThemeMarketplaceUpdatesSuccess'); - const error = document.getElementById('zenThemeMarketplaceUpdatesFailure'); + const success = document.getElementById("zenThemeMarketplaceUpdatesSuccess"); + const error = document.getElementById("zenThemeMarketplaceUpdatesFailure"); if (updates) { success.hidden = false; @@ -68,60 +68,60 @@ var gZenMarketplaceManager = { } }); - window.addEventListener('unload', () => { + window.addEventListener("unload", () => { Services.prefs.removeObserver(gZenMods.updatePref, this); this.__hasInitializedEvents = false; - document.removeEventListener('ZenModsMarketplace:CheckForUpdatesFinished', this); - document.removeEventListener('ZenCheckForModUpdates', this); + document.removeEventListener("ZenModsMarketplace:CheckForUpdatesFinished", this); + document.removeEventListener("ZenCheckForModUpdates", this); - checkForUpdates.removeEventListener('click', checkForUpdateClick); + checkForUpdates.removeEventListener("click", checkForUpdateClick); - this.modsList.innerHTML = ''; + this.modsList.innerHTML = ""; this._doNotRebuildModsList = false; }); }, _initImportExport() { - const importButton = document.getElementById('zenThemeMarketplaceImport'); - const exportButton = document.getElementById('zenThemeMarketplaceExport'); + const importButton = document.getElementById("zenThemeMarketplaceImport"); + const exportButton = document.getElementById("zenThemeMarketplaceExport"); if (importButton) { - importButton.addEventListener('click', this._importThemes.bind(this)); + importButton.addEventListener("click", this._importThemes.bind(this)); } if (exportButton) { - exportButton.addEventListener('click', this._exportThemes.bind(this)); + exportButton.addEventListener("click", this._exportThemes.bind(this)); } }, _initDisableAll() { - const areModsDisabled = Services.prefs.getBoolPref('zen.themes.disable-all', false); + const areModsDisabled = Services.prefs.getBoolPref("zen.themes.disable-all", false); const browser = nsZenMultiWindowFeature.currentBrowser; - const mozToggle = document.createElement('moz-toggle'); + const mozToggle = document.createElement("moz-toggle"); mozToggle.className = - 'zenThemeMarketplaceItemPreferenceToggle zenThemeMarketplaceDisableAllToggle'; + "zenThemeMarketplaceItemPreferenceToggle zenThemeMarketplaceDisableAllToggle"; mozToggle.pressed = !areModsDisabled; browser.document.l10n.setAttributes( mozToggle, - `zen-theme-disable-all-${!areModsDisabled ? 'enabled' : 'disabled'}` + `zen-theme-disable-all-${!areModsDisabled ? "enabled" : "disabled"}` ); - mozToggle.addEventListener('toggle', async (event) => { + mozToggle.addEventListener("toggle", async (event) => { const { pressed = false } = event.target || {}; - this.modsList.style.display = pressed ? '' : 'none'; - Services.prefs.setBoolPref('zen.themes.disable-all', !pressed); + this.modsList.style.display = pressed ? "" : "none"; + Services.prefs.setBoolPref("zen.themes.disable-all", !pressed); browser.document.l10n.setAttributes( mozToggle, - `zen-theme-disable-all-${pressed ? 'enabled' : 'disabled'}` + `zen-theme-disable-all-${pressed ? "enabled" : "disabled"}` ); }); if (areModsDisabled) { - this.modsList.style.display = 'none'; + this.modsList.style.display = "none"; } return mozToggle; @@ -135,12 +135,12 @@ var gZenMarketplaceManager = { // Send a message to the child to check for theme updates. event.target.disabled = true; // send an event that will be listened by the child process. - document.dispatchEvent(new CustomEvent('ZenCheckForModUpdates')); + document.dispatchEvent(new CustomEvent("ZenCheckForModUpdates")); }, get modsList() { if (!this._modsList) { - this._modsList = document.getElementById('zenThemeMarketplaceList'); + this._modsList = document.getElementById("zenThemeMarketplaceList"); } return this._modsList; }, @@ -169,24 +169,24 @@ var gZenMarketplaceManager = { }, async _importThemes() { - const errorBox = document.getElementById('zenThemeMarketplaceImportFailure'); - const successBox = document.getElementById('zenThemeMarketplaceImportSuccess'); + const errorBox = document.getElementById("zenThemeMarketplaceImportFailure"); + const successBox = document.getElementById("zenThemeMarketplaceImportSuccess"); successBox.hidden = true; errorBox.hidden = true; - const input = document.createElement('input'); + const input = document.createElement("input"); - input.type = 'file'; - input.accept = '.json'; - input.style.display = 'none'; - input.setAttribute('moz-accept', '.json'); - input.setAttribute('accept', '.json'); + input.type = "file"; + input.accept = ".json"; + input.style.display = "none"; + input.setAttribute("moz-accept", ".json"); + input.setAttribute("accept", ".json"); let timeout; const filePromise = new Promise((resolve) => { - input.addEventListener('change', (event) => { + input.addEventListener("change", (event) => { if (timeout) { clearTimeout(timeout); } @@ -196,13 +196,13 @@ var gZenMarketplaceManager = { }); timeout = setTimeout(() => { - console.warn('[ZenSettings:ZenMods]: Import timeout reached, aborting.'); + console.warn("[ZenSettings:ZenMods]: Import timeout reached, aborting."); resolve(null); }, 60000); }); - input.addEventListener('cancel', () => { - console.warn('[ZenSettings:ZenMods]: Import cancelled by user.'); + input.addEventListener("cancel", () => { + console.warn("[ZenSettings:ZenMods]: Import cancelled by user."); clearTimeout(timeout); }); @@ -224,7 +224,7 @@ var gZenMarketplaceManager = { await window.ZenInstallMod(mod); } } catch (error) { - console.error('[ZenSettings:ZenMods]: Error while importing mods:', error); + console.error("[ZenSettings:ZenMods]: Error while importing mods:", error); errorBox.hidden = false; } @@ -234,8 +234,8 @@ var gZenMarketplaceManager = { }, async _exportThemes() { - const errorBox = document.getElementById('zenThemeMarketplaceExportFailure'); - const successBox = document.getElementById('zenThemeMarketplaceExportSuccess'); + const errorBox = document.getElementById("zenThemeMarketplaceExportFailure"); + const successBox = document.getElementById("zenThemeMarketplaceExportSuccess"); successBox.hidden = true; errorBox.hidden = true; @@ -244,13 +244,13 @@ var gZenMarketplaceManager = { try { const mods = await gZenMods.getMods(); const modsJson = JSON.stringify(mods, null, 2); - const blob = new Blob([modsJson], { type: 'application/json' }); + const blob = new Blob([modsJson], { type: "application/json" }); temporalUrl = URL.createObjectURL(blob); // Creating a link to download the JSON file - temporalAnchor = document.createElement('a'); + temporalAnchor = document.createElement("a"); temporalAnchor.href = temporalUrl; - temporalAnchor.download = 'zen-mods-export.json'; + temporalAnchor.download = "zen-mods-export.json"; document.body.appendChild(temporalAnchor); temporalAnchor.click(); @@ -258,7 +258,7 @@ var gZenMarketplaceManager = { successBox.hidden = false; } catch (error) { - console.error('[ZenSettings:ZenMods]: Error while exporting mods:', error); + console.error("[ZenSettings:ZenMods]: Error while exporting mods:", error); errorBox.hidden = false; } @@ -283,7 +283,7 @@ var gZenMarketplaceManager = { const mods = await gZenMods.getMods(); const browser = nsZenMultiWindowFeature.currentBrowser; - const modList = document.createElement('div'); + const modList = document.createElement("div"); for (const mod of Object.values(mods).sort((a, b) => a.name.localeCompare(b.name))) { const sanitizedName = gZenMods.sanitizeModName(mod.name); @@ -297,43 +297,43 @@ var gZenMarketplaceManager = { - ${mod.preferences ? `` : ''} - ${mod.homepage ? `` : ''} + ${mod.preferences ? `` : ""} + ${mod.homepage ? `` : ""} `); - const modName = `${mod.name} (v${mod.version ?? '1.0.0'})`; + const modName = `${mod.name} (v${mod.version ?? "1.0.0"})`; - const base = fragment.querySelector('.zenThemeMarketplaceItem'); - const baseHeader = fragment.querySelector('#zenThemeMarketplaceItemContentHeader'); + const base = fragment.querySelector(".zenThemeMarketplaceItem"); + const baseHeader = fragment.querySelector("#zenThemeMarketplaceItemContentHeader"); - const dialog = document.createElement('dialog'); - const mainDialogDiv = document.createElement('div'); - const headerDiv = document.createElement('div'); - const headerTitle = document.createElement('h3'); - const closeButton = document.createElement('button'); - const contentDiv = document.createElement('div'); - const mozToggle = document.createElement('moz-toggle'); + const dialog = document.createElement("dialog"); + const mainDialogDiv = document.createElement("div"); + const headerDiv = document.createElement("div"); + const headerTitle = document.createElement("h3"); + const closeButton = document.createElement("button"); + const contentDiv = document.createElement("div"); + const mozToggle = document.createElement("moz-toggle"); - mainDialogDiv.className = 'zenThemeMarketplaceItemPreferenceDialog'; - headerDiv.className = 'zenThemeMarketplaceItemPreferenceDialogTopBar'; + mainDialogDiv.className = "zenThemeMarketplaceItemPreferenceDialog"; + headerDiv.className = "zenThemeMarketplaceItemPreferenceDialogTopBar"; headerTitle.textContent = modName; - browser.document.l10n.setAttributes(headerTitle, 'zen-theme-marketplace-theme-header-title', { + browser.document.l10n.setAttributes(headerTitle, "zen-theme-marketplace-theme-header-title", { name: sanitizedName, }); - headerTitle.className = 'zenThemeMarketplaceItemTitle'; + headerTitle.className = "zenThemeMarketplaceItemTitle"; closeButton.id = `${sanitizedName}-modal-close`; - browser.document.l10n.setAttributes(closeButton, 'zen-theme-marketplace-close-modal'); + browser.document.l10n.setAttributes(closeButton, "zen-theme-marketplace-close-modal"); contentDiv.id = `${sanitizedName}-preferences-content`; - contentDiv.className = 'zenThemeMarketplaceItemPreferenceDialogContent'; - mozToggle.className = 'zenThemeMarketplaceItemPreferenceToggle'; + contentDiv.className = "zenThemeMarketplaceItemPreferenceDialogContent"; + mozToggle.className = "zenThemeMarketplaceItemPreferenceToggle"; mozToggle.pressed = isModEnabled; browser.document.l10n.setAttributes( mozToggle, - `zen-theme-marketplace-toggle-${isModEnabled ? 'enabled' : 'disabled'}-button` + `zen-theme-marketplace-toggle-${isModEnabled ? "enabled" : "disabled"}-button` ); baseHeader.appendChild(mozToggle); @@ -346,192 +346,191 @@ var gZenMarketplaceManager = { dialog.appendChild(mainDialogDiv); base.appendChild(dialog); - closeButton.addEventListener('click', () => { + closeButton.addEventListener("click", () => { dialog.close(); }); - mozToggle.addEventListener('toggle', async (event) => { + mozToggle.addEventListener("toggle", async (event) => { const modId = event.target - .closest('.zenThemeMarketplaceItem') - .querySelector('.zenThemeMarketplaceItemUninstallButton') - .getAttribute('zen-mod-id'); - event.target.setAttribute('disabled', true); + .closest(".zenThemeMarketplaceItem") + .querySelector(".zenThemeMarketplaceItemUninstallButton") + .getAttribute("zen-mod-id"); + event.target.setAttribute("disabled", true); - if (!event.target.hasAttribute('pressed')) { + if (!event.target.hasAttribute("pressed")) { await this.disableMod(modId); browser.document.l10n.setAttributes( mozToggle, - 'zen-theme-marketplace-toggle-disabled-button' + "zen-theme-marketplace-toggle-disabled-button" ); if (mod.preferences) { document .getElementById(`zenThemeMarketplaceItemConfigureButton-${sanitizedName}`) - .setAttribute('hidden', true); + .setAttribute("hidden", true); } } else { await this.enableMod(modId); browser.document.l10n.setAttributes( mozToggle, - 'zen-theme-marketplace-toggle-enabled-button' + "zen-theme-marketplace-toggle-enabled-button" ); if (mod.preferences) { document .getElementById(`zenThemeMarketplaceItemConfigureButton-${sanitizedName}`) - .removeAttribute('hidden'); + .removeAttribute("hidden"); } } setTimeout(() => { // We use a timeout to make sure the theme list has been updated before re-enabling the button. - event.target.removeAttribute('disabled'); + event.target.removeAttribute("disabled"); }, 400); }); - fragment.querySelector('.zenThemeMarketplaceItemTitle').textContent = modName; - fragment.querySelector('.zenThemeMarketplaceItemDescription').textContent = mod.description; + fragment.querySelector(".zenThemeMarketplaceItemTitle").textContent = modName; + fragment.querySelector(".zenThemeMarketplaceItemDescription").textContent = mod.description; fragment - .querySelector('.zenThemeMarketplaceItemUninstallButton') - .addEventListener('click', async (event) => { + .querySelector(".zenThemeMarketplaceItemUninstallButton") + .addEventListener("click", async (event) => { const [msg] = await document.l10n.formatValues([ - { id: 'zen-theme-marketplace-remove-confirmation' }, + { id: "zen-theme-marketplace-remove-confirmation" }, ]); if (!confirm(msg)) { return; } - await this.removeMod(event.target.getAttribute('zen-mod-id')); + await this.removeMod(event.target.getAttribute("zen-mod-id")); }); if (mod.homepage) { - const homepageButton = fragment.querySelector('.zenThemeMarketplaceItemHomepageButton'); - homepageButton.addEventListener('click', () => { + const homepageButton = fragment.querySelector(".zenThemeMarketplaceItemHomepageButton"); + homepageButton.addEventListener("click", () => { // open the homepage url in a new tab const url = mod.homepage; - window.open(url, '_blank'); + window.open(url, "_blank"); }); } if (mod.preferences) { fragment - .querySelector('.zenThemeMarketplaceItemConfigureButton') - .addEventListener('click', () => { + .querySelector(".zenThemeMarketplaceItemConfigureButton") + .addEventListener("click", () => { dialog.showModal(); }); if (isModEnabled) { fragment - .querySelector('.zenThemeMarketplaceItemConfigureButton') - .removeAttribute('hidden'); + .querySelector(".zenThemeMarketplaceItemConfigureButton") + .removeAttribute("hidden"); } } const preferences = await gZenMods.getModPreferences(mod); - if (preferences.length > 0) { - const preferencesWrapper = document.createXULElement('vbox'); + if (preferences.length) { + const preferencesWrapper = document.createXULElement("vbox"); - preferencesWrapper.setAttribute('flex', '1'); + preferencesWrapper.setAttribute("flex", "1"); for (const entry of preferences) { const { property, label, type, placeholder, defaultValue } = entry; switch (type) { - case 'dropdown': { + case "dropdown": { const { options } = entry; - const container = document.createXULElement('hbox'); - container.classList.add('zenThemeMarketplaceItemPreference'); - container.setAttribute('align', 'center'); - container.setAttribute('role', 'group'); + const container = document.createXULElement("hbox"); + container.classList.add("zenThemeMarketplaceItemPreference"); + container.setAttribute("align", "center"); + container.setAttribute("role", "group"); - const menulist = document.createXULElement('menulist'); - const menupopup = document.createXULElement('menupopup'); + const menulist = document.createXULElement("menulist"); + const menupopup = document.createXULElement("menupopup"); - menulist.setAttribute('sizetopopup', 'none'); - menulist.setAttribute('id', property + '-popup-menulist'); + menulist.setAttribute("sizetopopup", "none"); + menulist.setAttribute("id", property + "-popup-menulist"); - const savedValue = Services.prefs.getStringPref(property, defaultValue ?? 'none'); + const savedValue = Services.prefs.getStringPref(property, defaultValue ?? "none"); - menulist.setAttribute('value', savedValue); - menulist.setAttribute('tooltiptext', property); + menulist.setAttribute("value", savedValue); + menulist.setAttribute("tooltiptext", property); - const defaultItem = document.createXULElement('menuitem'); + const defaultItem = document.createXULElement("menuitem"); - defaultItem.setAttribute('value', 'none'); + defaultItem.setAttribute("value", "none"); if (placeholder) { - defaultItem.setAttribute('label', placeholder || '-'); + defaultItem.setAttribute("label", placeholder || "-"); } else { browser.document.l10n.setAttributes( defaultItem, - 'zen-theme-marketplace-dropdown-default-label' + "zen-theme-marketplace-dropdown-default-label" ); } menupopup.appendChild(defaultItem); for (const option of options) { - const { label, value } = option; + let { label: optionLabel, value } = option; + let valueType = typeof value; - const valueType = typeof value; - - if (!['string', 'number'].includes(valueType)) { - console.log( + if (!["string", "number"].includes(valueType)) { + console.warn( `[ZenSettings:ZenMods]: Warning, invalid data type received (${valueType}), skipping.` ); continue; } - const menuitem = document.createXULElement('menuitem'); + let menuitem = document.createXULElement("menuitem"); - menuitem.setAttribute('value', value.toString()); - menuitem.setAttribute('label', label); + menuitem.setAttribute("value", value.toString()); + menuitem.setAttribute("label", optionLabel); menupopup.appendChild(menuitem); } menulist.appendChild(menupopup); - menulist.addEventListener('command', () => { + menulist.addEventListener("command", () => { const value = menulist.selectedItem.value; let element = browser.document.getElementById(sanitizedName); if (!element) { - element = browser.document.createElement('div'); + element = browser.document.createElement("div"); - element.style.display = 'none'; - element.setAttribute('id', sanitizedName); + element.style.display = "none"; + element.setAttribute("id", sanitizedName); browser.document.body.appendChild(element); } - element.setAttribute(property?.replaceAll(/\./g, '-'), value); + element.setAttribute(property?.replaceAll(/\./g, "-"), value); - Services.prefs.setStringPref(property, value === 'none' ? '' : value); + Services.prefs.setStringPref(property, value === "none" ? "" : value); this._triggerBuildUpdateWithoutRebuild(); }); - const nameLabel = document.createXULElement('label'); - nameLabel.setAttribute('flex', '1'); - nameLabel.setAttribute('class', 'zenThemeMarketplaceItemPreferenceLabel'); - nameLabel.setAttribute('value', label); - nameLabel.setAttribute('tooltiptext', property); + const nameLabel = document.createXULElement("label"); + nameLabel.setAttribute("flex", "1"); + nameLabel.setAttribute("class", "zenThemeMarketplaceItemPreferenceLabel"); + nameLabel.setAttribute("value", label); + nameLabel.setAttribute("tooltiptext", property); container.appendChild(nameLabel); container.appendChild(menulist); - container.setAttribute('aria-labelledby', label); + container.setAttribute("aria-labelledby", label); preferencesWrapper.appendChild(container); break; } - case 'checkbox': { + case "checkbox": { const checkbox = window.MozXULElement.parseXULToFragment(` @@ -539,26 +538,26 @@ var gZenMarketplaceManager = { `); const checkboxElement = checkbox.querySelector( - '.zenThemeMarketplaceItemPreferenceCheckbox' + ".zenThemeMarketplaceItemPreferenceCheckbox" ); - checkboxElement.setAttribute('label', label); - checkboxElement.setAttribute('tooltiptext', property); - checkboxElement.setAttribute('zen-pref', property); + checkboxElement.setAttribute("label", label); + checkboxElement.setAttribute("tooltiptext", property); + checkboxElement.setAttribute("zen-pref", property); // Checkbox only works with "true" and "false" values, it's not like HTML checkboxes. if (Services.prefs.getBoolPref(property, defaultValue ?? false)) { - checkboxElement.setAttribute('checked', 'true'); + checkboxElement.setAttribute("checked", "true"); } - checkboxElement.addEventListener('click', (event) => { - const target = event.target.closest('.zenThemeMarketplaceItemPreferenceCheckbox'); - const key = target.getAttribute('zen-pref'); - const checked = target.hasAttribute('checked'); + checkboxElement.addEventListener("click", (event) => { + const target = event.target.closest(".zenThemeMarketplaceItemPreferenceCheckbox"); + const key = target.getAttribute("zen-pref"); + const checked = target.hasAttribute("checked"); if (!checked) { - target.removeAttribute('checked'); + target.removeAttribute("checked"); } else { - target.setAttribute('checked', 'true'); + target.setAttribute("checked", "true"); } Services.prefs.setBoolPref(key, !checked); @@ -568,66 +567,66 @@ var gZenMarketplaceManager = { break; } - case 'string': { - const container = document.createXULElement('hbox'); - container.classList.add('zenThemeMarketplaceItemPreference'); - container.setAttribute('align', 'center'); - container.setAttribute('role', 'group'); + case "string": { + const container = document.createXULElement("hbox"); + container.classList.add("zenThemeMarketplaceItemPreference"); + container.setAttribute("align", "center"); + container.setAttribute("role", "group"); - const savedValue = Services.prefs.getStringPref(property, defaultValue ?? ''); - const sanitizedProperty = property?.replaceAll(/\./g, '-'); + const savedValue = Services.prefs.getStringPref(property, defaultValue ?? ""); + const sanitizedProperty = property?.replaceAll(/\./g, "-"); - const input = document.createElement('input'); - input.setAttribute('flex', '1'); - input.setAttribute('type', 'text'); + const input = document.createElement("input"); + input.setAttribute("flex", "1"); + input.setAttribute("type", "text"); input.id = `${sanitizedProperty}-input`; input.value = savedValue; if (placeholder) { - input.setAttribute('placeholder', placeholder || '-'); + input.setAttribute("placeholder", placeholder || "-"); } else { browser.document.l10n.setAttributes( input, - 'zen-theme-marketplace-input-default-placeholder' + "zen-theme-marketplace-input-default-placeholder" ); } input.addEventListener( - 'change', + "change", gZenMods.debounce((event) => { const value = event.target.value; Services.prefs.setStringPref(property, value); this._triggerBuildUpdateWithoutRebuild(); - if (value === '') { + if (value === "") { browser.document - .querySelector(':root') + .querySelector(":root") .style.removeProperty(`--${sanitizedProperty}`); } else { browser.document - .querySelector(':root') + .querySelector(":root") .style.setProperty(`--${sanitizedProperty}`, value); } }, 500) ); - const nameLabel = document.createXULElement('label'); - nameLabel.setAttribute('flex', '1'); - nameLabel.setAttribute('class', 'zenThemeMarketplaceItemPreferenceLabel'); - nameLabel.setAttribute('value', label); - nameLabel.setAttribute('tooltiptext', property); + const nameLabel = document.createXULElement("label"); + nameLabel.setAttribute("flex", "1"); + nameLabel.setAttribute("class", "zenThemeMarketplaceItemPreferenceLabel"); + nameLabel.setAttribute("value", label); + nameLabel.setAttribute("tooltiptext", property); container.appendChild(nameLabel); container.appendChild(input); - container.setAttribute('aria-labelledby', label); + container.setAttribute("aria-labelledby", label); preferencesWrapper.appendChild(container); break; } default: - console.log( + console.warn( `[ZenSettings:ZenMods]: Warning, unknown preference type received (${type}), skipping.` ); continue; @@ -643,18 +642,20 @@ var gZenMarketplaceManager = { }, }; -const kZenExtendedSidebar = 'zen.view.sidebar-expanded'; -const kZenSingleToolbar = 'zen.view.use-single-toolbar'; +const kZenExtendedSidebar = "zen.view.sidebar-expanded"; +const kZenSingleToolbar = "zen.view.use-single-toolbar"; var gZenLooksAndFeel = { init() { - if (this.__hasInitialized) return; + if (this.__hasInitialized) { + return; + } this.__hasInitialized = true; gZenMarketplaceManager.init(); for (const pref of [kZenExtendedSidebar, kZenSingleToolbar]) { Services.prefs.addObserver(pref, this); } - window.addEventListener('unload', () => { + window.addEventListener("unload", () => { for (const pref of [kZenExtendedSidebar, kZenSingleToolbar]) { Services.prefs.removeObserver(pref, this); } @@ -669,39 +670,41 @@ var gZenLooksAndFeel = { applySidebarLayout() { const isSingleToolbar = Services.prefs.getBoolPref(kZenSingleToolbar); const isExtendedSidebar = Services.prefs.getBoolPref(kZenExtendedSidebar); - for (const layout of document.getElementById('zenLayoutList').children) { - layout.classList.remove('selected'); - if (layout.getAttribute('layout') == 'single' && isSingleToolbar) { - layout.classList.add('selected'); + for (const layout of document.getElementById("zenLayoutList").children) { + layout.classList.remove("selected"); + if (layout.getAttribute("layout") == "single" && isSingleToolbar) { + layout.classList.add("selected"); } else if ( - layout.getAttribute('layout') == 'multiple' && + layout.getAttribute("layout") == "multiple" && !isSingleToolbar && isExtendedSidebar ) { - layout.classList.add('selected'); - } else if (layout.getAttribute('layout') == 'collapsed' && !isExtendedSidebar) { - layout.classList.add('selected'); + layout.classList.add("selected"); + } else if (layout.getAttribute("layout") == "collapsed" && !isExtendedSidebar) { + layout.classList.add("selected"); } } - if (this.__hasInitializedLayout) return; + if (this.__hasInitializedLayout) { + return; + } this.__hasInitializedLayout = true; - for (const layout of document.getElementById('zenLayoutList').children) { - layout.addEventListener('click', () => { - if (layout.hasAttribute('disabled')) { + for (const layout of document.getElementById("zenLayoutList").children) { + layout.addEventListener("click", () => { + if (layout.hasAttribute("disabled")) { return; } - for (const el of document.getElementById('zenLayoutList').children) { - el.classList.remove('selected'); + for (const el of document.getElementById("zenLayoutList").children) { + el.classList.remove("selected"); } - layout.classList.add('selected'); + layout.classList.add("selected"); Services.prefs.setBoolPref( kZenExtendedSidebar, - layout.getAttribute('layout') != 'collapsed' + layout.getAttribute("layout") != "collapsed" ); - Services.prefs.setBoolPref(kZenSingleToolbar, layout.getAttribute('layout') == 'single'); + Services.prefs.setBoolPref(kZenSingleToolbar, layout.getAttribute("layout") == "single"); }); } }, @@ -720,123 +723,125 @@ var gZenWorkspacesSettings = { let toggleZenCycleByAttrWarning = { observe() { - const warning = document.getElementById('zenTabsCycleByAttributeWarning'); + const warning = document.getElementById("zenTabsCycleByAttributeWarning"); warning.hidden = !( - Services.prefs.getBoolPref('zen.tabs.ctrl-tab.ignore-essential-tabs', false) && - Services.prefs.getBoolPref('browser.ctrlTab.sortByRecentlyUsed', false) + Services.prefs.getBoolPref("zen.tabs.ctrl-tab.ignore-essential-tabs", false) && + Services.prefs.getBoolPref("browser.ctrlTab.sortByRecentlyUsed", false) ); }, }; toggleZenCycleByAttrWarning.observe(); // call it once on initial load - Services.prefs.addObserver('zen.glance.enabled', tabsUnloaderPrefListener); // We can use the same listener for both prefs - Services.prefs.addObserver('zen.workspaces.separate-essentials', tabsUnloaderPrefListener); - Services.prefs.addObserver('zen.glance.activation-method', tabsUnloaderPrefListener); + Services.prefs.addObserver("zen.glance.enabled", tabsUnloaderPrefListener); // We can use the same listener for both prefs + Services.prefs.addObserver("zen.workspaces.separate-essentials", tabsUnloaderPrefListener); + Services.prefs.addObserver("zen.glance.activation-method", tabsUnloaderPrefListener); Services.prefs.addObserver( - 'zen.tabs.ctrl-tab.ignore-essential-tabs', + "zen.tabs.ctrl-tab.ignore-essential-tabs", toggleZenCycleByAttrWarning ); - Services.prefs.addObserver('browser.ctrlTab.sortByRecentlyUsed', toggleZenCycleByAttrWarning); - window.addEventListener('unload', () => { - Services.prefs.removeObserver('zen.glance.enabled', tabsUnloaderPrefListener); - Services.prefs.removeObserver('zen.glance.activation-method', tabsUnloaderPrefListener); - Services.prefs.removeObserver('zen.workspaces.separate-essentials', tabsUnloaderPrefListener); + Services.prefs.addObserver("browser.ctrlTab.sortByRecentlyUsed", toggleZenCycleByAttrWarning); + window.addEventListener("unload", () => { + Services.prefs.removeObserver("zen.glance.enabled", tabsUnloaderPrefListener); + Services.prefs.removeObserver("zen.glance.activation-method", tabsUnloaderPrefListener); + Services.prefs.removeObserver("zen.workspaces.separate-essentials", tabsUnloaderPrefListener); Services.prefs.removeObserver( - 'zen.tabs.ctrl-tab.ignore-essential-tabs', + "zen.tabs.ctrl-tab.ignore-essential-tabs", toggleZenCycleByAttrWarning ); Services.prefs.removeObserver( - 'browser.ctrlTab.sortByRecentlyUsed', + "browser.ctrlTab.sortByRecentlyUsed", toggleZenCycleByAttrWarning ); }); }, }; -const ZEN_CKS_CLASS_BASE = 'zenCKSOption'; +const ZEN_CKS_CLASS_BASE = "zenCKSOption"; const ZEN_CKS_INPUT_FIELD_CLASS = `${ZEN_CKS_CLASS_BASE}-input`; const ZEN_CKS_LABEL_CLASS = `${ZEN_CKS_CLASS_BASE}-label`; const ZEN_CKS_WRAPPER_ID = `${ZEN_CKS_CLASS_BASE}-wrapper`; const ZEN_CKS_GROUP_PREFIX = `${ZEN_CKS_CLASS_BASE}-group`; -const KEYBIND_ATTRIBUTE_KEY = 'key'; +const KEYBIND_ATTRIBUTE_KEY = "key"; const zenMissingKeyboardShortcutL10n = { - key_quickRestart: 'zen-key-quick-restart', - key_delete: 'zen-key-delete', - goBackKb: 'zen-key-go-back', - goForwardKb: 'zen-key-go-forward', - key_enterFullScreen: 'zen-key-enter-full-screen', - key_exitFullScreen: 'zen-key-exit-full-screen', - key_aboutProcesses: 'zen-key-about-processes', - key_sanitize: 'zen-key-sanitize', - key_wrCaptureCmd: 'zen-key-wr-capture-cmd', - key_wrToggleCaptureSequenceCmd: 'zen-key-wr-toggle-capture-sequence-cmd', - key_undoCloseWindow: 'zen-key-undo-close-window', + key_quickRestart: "zen-key-quick-restart", + key_delete: "zen-key-delete", + goBackKb: "zen-key-go-back", + goForwardKb: "zen-key-go-forward", + key_enterFullScreen: "zen-key-enter-full-screen", + key_exitFullScreen: "zen-key-exit-full-screen", + key_aboutProcesses: "zen-key-about-processes", + key_sanitize: "zen-key-sanitize", + key_wrCaptureCmd: "zen-key-wr-capture-cmd", + key_wrToggleCaptureSequenceCmd: "zen-key-wr-toggle-capture-sequence-cmd", + key_undoCloseWindow: "zen-key-undo-close-window", - 'zen-glance-expand': 'zen-glance-expand', + "zen-glance-expand": "zen-glance-expand", - key_selectTab1: 'zen-key-select-tab-1', - key_selectTab2: 'zen-key-select-tab-2', - key_selectTab3: 'zen-key-select-tab-3', - key_selectTab4: 'zen-key-select-tab-4', - key_selectTab5: 'zen-key-select-tab-5', - key_selectTab6: 'zen-key-select-tab-6', - key_selectTab7: 'zen-key-select-tab-7', - key_selectTab8: 'zen-key-select-tab-8', - key_selectLastTab: 'zen-key-select-tab-last', + key_selectTab1: "zen-key-select-tab-1", + key_selectTab2: "zen-key-select-tab-2", + key_selectTab3: "zen-key-select-tab-3", + key_selectTab4: "zen-key-select-tab-4", + key_selectTab5: "zen-key-select-tab-5", + key_selectTab6: "zen-key-select-tab-6", + key_selectTab7: "zen-key-select-tab-7", + key_selectTab8: "zen-key-select-tab-8", + key_selectLastTab: "zen-key-select-tab-last", - key_showAllTabs: 'zen-key-show-all-tabs', - key_gotoHistory: 'zen-key-goto-history', + key_showAllTabs: "zen-key-show-all-tabs", + key_gotoHistory: "zen-key-goto-history", - goHome: 'zen-key-go-home', - key_redo: 'zen-key-redo', + goHome: "zen-key-go-home", + key_redo: "zen-key-redo", - key_inspectorMac: 'zen-key-inspector-mac', + key_inspectorMac: "zen-key-inspector-mac", // Devtools - key_toggleToolbox: 'zen-devtools-toggle-shortcut', - key_browserToolbox: 'zen-devtools-toggle-browser-toolbox-shortcut', - key_browserConsole: 'zen-devtools-toggle-browser-console-shortcut', - key_responsiveDesignMode: 'zen-devtools-toggle-responsive-design-mode-shortcut', - key_inspector: 'zen-devtools-toggle-inspector-shortcut', - key_webconsole: 'zen-devtools-toggle-web-console-shortcut', - key_jsdebugger: 'zen-devtools-toggle-js-debugger-shortcut', - key_netmonitor: 'zen-devtools-toggle-net-monitor-shortcut', - key_styleeditor: 'zen-devtools-toggle-style-editor-shortcut', - key_performance: 'zen-devtools-toggle-performance-shortcut', - key_storage: 'zen-devtools-toggle-storage-shortcut', - key_dom: 'zen-devtools-toggle-dom-shortcut', - key_accessibility: 'zen-devtools-toggle-accessibility-shortcut', + key_toggleToolbox: "zen-devtools-toggle-shortcut", + key_browserToolbox: "zen-devtools-toggle-browser-toolbox-shortcut", + key_browserConsole: "zen-devtools-toggle-browser-console-shortcut", + key_responsiveDesignMode: "zen-devtools-toggle-responsive-design-mode-shortcut", + key_inspector: "zen-devtools-toggle-inspector-shortcut", + key_webconsole: "zen-devtools-toggle-web-console-shortcut", + key_jsdebugger: "zen-devtools-toggle-js-debugger-shortcut", + key_netmonitor: "zen-devtools-toggle-net-monitor-shortcut", + key_styleeditor: "zen-devtools-toggle-style-editor-shortcut", + key_performance: "zen-devtools-toggle-performance-shortcut", + key_storage: "zen-devtools-toggle-storage-shortcut", + key_dom: "zen-devtools-toggle-dom-shortcut", + key_accessibility: "zen-devtools-toggle-accessibility-shortcut", }; var zenIgnoreKeyboardShortcutL10n = [ - 'zen-full-zoom-reduce-shortcut-alt-b', - 'zen-full-zoom-reduce-shortcut-alt-a', + "zen-full-zoom-reduce-shortcut-alt-b", + "zen-full-zoom-reduce-shortcut-alt-a", ]; var gZenCKSSettings = { async init() { await this._initializeCKS(); - if (this.__hasInitialized) return; + if (this.__hasInitialized) { + return; + } this.__hasInitialized = true; this._currentActionID = null; this._initializeEvents(); - window.addEventListener('unload', () => { + window.addEventListener("unload", () => { this.__hasInitialized = false; - document.getElementById(ZEN_CKS_WRAPPER_ID).innerHTML = ''; + document.getElementById(ZEN_CKS_WRAPPER_ID).innerHTML = ""; }); }, _initializeEvents() { const resetAllListener = this.resetAllShortcuts.bind(this); const handleKeyDown = this._handleKeyDown.bind(this); - window.addEventListener('keydown', handleKeyDown); - const button = document.getElementById('zenCKSResetButton'); - button.addEventListener('click', resetAllListener); - window.addEventListener('unload', () => { - window.removeEventListener('keydown', handleKeyDown); - button.removeEventListener('click', resetAllListener); + window.addEventListener("keydown", handleKeyDown); + const button = document.getElementById("zenCKSResetButton"); + button.addEventListener("click", resetAllListener); + window.addEventListener("unload", () => { + window.removeEventListener("keydown", handleKeyDown); + button.removeEventListener("click", resetAllListener); }); }, @@ -850,20 +855,20 @@ var gZenCKSSettings = { async _initializeCKS() { let wrapper = document.getElementById(ZEN_CKS_WRAPPER_ID); - wrapper.innerHTML = ''; + wrapper.innerHTML = ""; let shortcuts = await gZenKeyboardShortcutsManager.getModifiableShortcuts(); if (!shortcuts) { - throw Error('No shortcuts defined!'); + throw Error("No shortcuts defined!"); } // Generate section per each group for (let group of VALID_SHORTCUT_GROUPS) { let groupClass = `${ZEN_CKS_GROUP_PREFIX}-${group}`; if (!wrapper.querySelector(`[data-group="${groupClass}"]`)) { - let groupElem = document.createElement('h2'); - groupElem.setAttribute('data-group', groupClass); + let groupElem = document.createElement("h2"); + groupElem.setAttribute("data-group", groupClass); document.l10n.setAttributes(groupElem, groupClass); wrapper.appendChild(groupElem); } @@ -906,21 +911,21 @@ var gZenCKSSettings = { } input.setAttribute(KEYBIND_ATTRIBUTE_KEY, keyID); - input.setAttribute('data-group', group); - input.setAttribute('data-id', keyID); + input.setAttribute("data-group", group); + input.setAttribute("data-id", keyID); - input.addEventListener('focus', (event) => { - this._currentActionID = event.target.getAttribute('data-id'); + input.addEventListener("focus", (event) => { + this._currentActionID = event.target.getAttribute("data-id"); event.target.classList.add(`${ZEN_CKS_INPUT_FIELD_CLASS}-editing`); this._hasSafed = true; }); - input.addEventListener('editDone', (event) => { + input.addEventListener("editDone", (event) => { const target = event.target; target.classList.add(`${ZEN_CKS_INPUT_FIELD_CLASS}-editing`); }); - input.addEventListener('blur', (event) => { + input.addEventListener("blur", (event) => { const target = event.target; target.classList.remove(`${ZEN_CKS_INPUT_FIELD_CLASS}-editing`); if (!this._hasSafed) { @@ -931,7 +936,7 @@ var gZenCKSSettings = { `) ); - target.value = 'Not set'; + target.value = "Not set"; } } else { target.classList.remove(`${ZEN_CKS_INPUT_FIELD_CLASS}-unsafed`); @@ -941,7 +946,7 @@ var gZenCKSSettings = { } } if (target.classList.contains(`${ZEN_CKS_INPUT_FIELD_CLASS}-not-set`)) { - target.label = 'Not set'; + target.label = "Not set"; } }); @@ -951,7 +956,7 @@ var gZenCKSSettings = { }, async _resetShortcut(input) { - input.value = 'Not set'; + input.value = "Not set"; input.classList.remove(`${ZEN_CKS_INPUT_FIELD_CLASS}-invalid`); input.classList.remove(`${ZEN_CKS_INPUT_FIELD_CLASS}-editing`); input.classList.add(`${ZEN_CKS_INPUT_FIELD_CLASS}-not-set`); @@ -997,17 +1002,20 @@ var gZenCKSSettings = { // If event.code is like "KeyS", "KeyA", ..., strip off "Key" → "S". // Otherwise, fall back to event.key (e.g. "F5", "Enter", etc.). let shortcut; - if (event.code && event.code.startsWith('Key')) shortcut = event.code.slice(3); - else shortcut = event.key; + if (event.code && event.code.startsWith("Key")) { + shortcut = event.code.slice(3); + } else { + shortcut = event.key; + } - shortcut = shortcut.replace(/Ctrl|Control|Shift|Alt|Option|Cmd|Meta/, ''); // Remove all modifiers + shortcut = shortcut.replace(/Ctrl|Control|Shift|Alt|Option|Cmd|Meta/, ""); // Remove all modifiers - if (shortcut == 'Tab' && !modifiersActive) { + if (shortcut == "Tab" && !modifiersActive) { input.classList.remove(`${ZEN_CKS_INPUT_FIELD_CLASS}-not-set`); input.classList.remove(`${ZEN_CKS_INPUT_FIELD_CLASS}-editing`); this._latestValidKey = null; return; - } else if (shortcut == 'Escape' && !modifiersActive) { + } else if (shortcut == "Escape" && !modifiersActive) { const { hasConflicts, conflictShortcut } = gZenKeyboardShortcutsManager.checkForConflicts( this._latestValidKey ? this._latestValidKey : shortcut, this._latestModifier ? this._latestModifier : modifiers, @@ -1027,7 +1035,7 @@ var gZenCKSSettings = { zenMissingKeyboardShortcutL10n[conflictShortcut.getID()] ?? conflictShortcut.getL10NID(); - const [group, shortcut] = await document.l10n.formatValues([ + const [group] = await document.l10n.formatValues([ { id: `${ZEN_CKS_GROUP_PREFIX}-${conflictShortcut.getGroup()}` }, { id: shortcutL10nKey }, ]); @@ -1040,16 +1048,16 @@ var gZenCKSSettings = { ); } - document.l10n.setAttributes(input.nextElementSibling, 'zen-key-conflict', { - group: group ?? '', - shortcut: shortcut ?? '', + document.l10n.setAttributes(input.nextElementSibling, "zen-key-conflict", { + group: group ?? "", + shortcut: shortcut ?? "", }); } } else { input.classList.remove(`${ZEN_CKS_INPUT_FIELD_CLASS}-editing`); this._editDone(this._latestValidKey, this._latestModifier); - if (this.name == 'Not set') { + if (this.name == "Not set") { input.classList.add(`${ZEN_CKS_INPUT_FIELD_CLASS}-not-set`); } this._latestValidKey = null; @@ -1068,7 +1076,7 @@ var gZenCKSSettings = { input.blur(); this._currentActionID = null; return; - } else if (shortcut == 'Backspace' && !modifiersActive) { + } else if (shortcut == "Backspace" && !modifiersActive) { this._resetShortcut(input); this._latestValidKey = null; this._latestModifier = null; @@ -1091,103 +1099,103 @@ var gZenCKSSettings = { Preferences.addAll([ { - id: 'zen.view.compact.toolbar-flash-popup', - type: 'bool', + id: "zen.view.compact.toolbar-flash-popup", + type: "bool", default: true, }, { - id: 'zen.workspaces.hide-default-container-indicator', - type: 'bool', + id: "zen.workspaces.hide-default-container-indicator", + type: "bool", default: true, }, { - id: 'zen.tab-unloader.timeout-minutes', - type: 'int', + id: "zen.tab-unloader.timeout-minutes", + type: "int", default: 10, }, { - id: 'zen.pinned-tab-manager.restore-pinned-tabs-to-pinned-url', - type: 'bool', + id: "zen.pinned-tab-manager.restore-pinned-tabs-to-pinned-url", + type: "bool", default: true, }, { - id: 'zen.pinned-tab-manager.close-shortcut-behavior', - type: 'string', - default: 'switch', + id: "zen.pinned-tab-manager.close-shortcut-behavior", + type: "string", + default: "switch", }, { - id: 'zen.workspaces.force-container-workspace', - type: 'bool', + id: "zen.workspaces.force-container-workspace", + type: "bool", default: true, }, { - id: 'zen.workspaces.open-new-tab-if-last-unpinned-tab-is-closed', - type: 'bool', + id: "zen.workspaces.open-new-tab-if-last-unpinned-tab-is-closed", + type: "bool", default: true, }, { - id: 'zen.glance.activation-method', - type: 'string', - default: 'ctrl', + id: "zen.glance.activation-method", + type: "string", + default: "ctrl", }, { - id: 'zen.glance.enabled', - type: 'bool', + id: "zen.glance.enabled", + type: "bool", default: true, }, { - id: 'zen.urlbar.behavior', - type: 'string', - default: 'float', + id: "zen.urlbar.behavior", + type: "string", + default: "float", }, { - id: 'zen.workspaces.separate-essentials', - type: 'bool', + id: "zen.workspaces.separate-essentials", + type: "bool", default: false, }, { - id: 'zen.tabs.show-newtab-vertical', - type: 'bool', + id: "zen.tabs.show-newtab-vertical", + type: "bool", default: true, }, { - id: 'zen.view.show-newtab-button-top', - type: 'bool', + id: "zen.view.show-newtab-button-top", + type: "bool", default: true, }, { - id: 'media.videocontrols.picture-in-picture.enabled', - type: 'bool', + id: "media.videocontrols.picture-in-picture.enabled", + type: "bool", default: true, }, { - id: 'zen.workspaces.continue-where-left-off', - type: 'bool', + id: "zen.workspaces.continue-where-left-off", + type: "bool", default: false, }, { - id: 'zen.mods.auto-update', - type: 'bool', + id: "zen.mods.auto-update", + type: "bool", default: true, }, { - id: 'zen.tabs.ctrl-tab.ignore-essential-tabs', - type: 'bool', + id: "zen.tabs.ctrl-tab.ignore-essential-tabs", + type: "bool", default: false, }, { - id: 'zen.tabs.ctrl-tab.ignore-pending-tabs', - type: 'bool', + id: "zen.tabs.ctrl-tab.ignore-pending-tabs", + type: "bool", default: false, }, { - id: 'zen.tabs.close-on-back-with-no-history', - type: 'bool', + id: "zen.tabs.close-on-back-with-no-history", + type: "bool", default: false, }, ]); Preferences.addSetting({ - id: 'zenWorkspaceContinueWhereLeftOff', - pref: 'zen.workspaces.continue-where-left-off', + id: "zenWorkspaceContinueWhereLeftOff", + pref: "zen.workspaces.continue-where-left-off", }); diff --git a/src/browser/themes/shared/preferences/zen-preferences.css b/src/browser/themes/shared/preferences/zen-preferences.css index ec512f71d..97c45e0af 100644 --- a/src/browser/themes/shared/preferences/zen-preferences.css +++ b/src/browser/themes/shared/preferences/zen-preferences.css @@ -4,7 +4,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -@namespace html 'http://www.w3.org/1999/xhtml'; +@namespace html "http://www.w3.org/1999/xhtml"; :root { --in-content-box-background: var(--zen-colors-tertiary) !important; @@ -78,7 +78,7 @@ groupbox h2 { } #categories > .category[selected]::before { - content: ''; + content: ""; display: block; height: 70%; width: 5px; @@ -89,7 +89,7 @@ groupbox h2 { } #languagesGroup::before { - content: ''; + content: ""; display: block; height: 1px; background-color: light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.1)); @@ -123,7 +123,7 @@ groupbox h2 { } #category-zen-looks > .category-icon { - list-style-image: url('chrome://browser/skin/customize.svg'); + list-style-image: url("chrome://browser/skin/customize.svg"); } #zenLooksAndFeelGroup > html|div:last-of-type { @@ -176,7 +176,7 @@ groupbox h2 { /* Workspace */ #category-zen-tabs-management > .category-icon { - list-style-image: url('chrome://browser/skin/window.svg'); + list-style-image: url("chrome://browser/skin/window.svg"); } #zenTabsUnloadDelayContainer { @@ -191,7 +191,7 @@ groupbox h2 { /* CKS */ #category-zen-CKS > .category-icon { - list-style-image: url('chrome://browser/skin/quickactions.svg'); + list-style-image: url("chrome://browser/skin/quickactions.svg"); } .zenCKSOption-input { @@ -325,7 +325,7 @@ groupbox h2 { /* THemes marketplace */ #category-zen-marketplace > .category-icon { - list-style-image: url('chrome://mozapps/skin/extensions/category-themes.svg'); + list-style-image: url("chrome://mozapps/skin/extensions/category-themes.svg"); } .zenThemeMarketplaceItem { @@ -347,14 +347,14 @@ groupbox h2 { cursor: pointer; &::before { - content: ''; + content: ""; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 18px; height: 18px; - background-image: url('chrome://browser/skin/home.svg'); + background-image: url("chrome://browser/skin/home.svg"); background-repeat: no-repeat; background-size: cover; fill: currentColor; @@ -369,14 +369,14 @@ groupbox h2 { cursor: pointer; &::before { - content: ''; + content: ""; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 15px; height: 15px; - background-image: url('chrome://global/skin/icons/settings.svg'); + background-image: url("chrome://global/skin/icons/settings.svg"); background-repeat: no-repeat; background-size: cover; } @@ -493,7 +493,7 @@ groupbox h2 { font-weight: 600; cursor: pointer; - &[disabled='true'] { + &[disabled="true"] { opacity: 0.7; cursor: not-allowed; } @@ -532,16 +532,16 @@ groupbox h2 { .sync-engine-workspaces .checkbox-icon, .sync-engine-workspaces.sync-engine-image { - list-style-image: url('chrome://devtools/skin/images/tool-storage.svg'); + list-style-image: url("chrome://devtools/skin/images/tool-storage.svg"); } -@media -moz-pref('zen.theme.disable-lightweight') { - html|div[data-l10n-id='preferences-web-appearance-footer'] { +@media -moz-pref("zen.theme.disable-lightweight") { + html|div[data-l10n-id="preferences-web-appearance-footer"] { display: none; } } -@media -moz-pref('zen.urlbar.replace-newtab') { +@media -moz-pref("zen.urlbar.replace-newtab") { #category-home { display: none !important; } diff --git a/src/browser/themes/shared/zen-icons/icons.css b/src/browser/themes/shared/zen-icons/icons.css index 6b4352705..830523a0b 100644 --- a/src/browser/themes/shared/zen-icons/icons.css +++ b/src/browser/themes/shared/zen-icons/icons.css @@ -14,20 +14,20 @@ } .private-browsing-indicator-icon { - list-style-image: url('account-private.svg') !important; + list-style-image: url("account-private.svg") !important; border-radius: 100% !important; } #back-button { - list-style-image: url('back.svg') !important; + list-style-image: url("back.svg") !important; } #forward-button { - list-style-image: url('forward.svg') !important; + list-style-image: url("forward.svg") !important; } #reload-button { - list-style-image: url('reload.svg') !important; + list-style-image: url("reload.svg") !important; } #stop-button, @@ -35,36 +35,36 @@ .zen-glance-sidebar-close, .zen-theme-picker-custom-list-item-remove, #appMenu-quit-button2 { - list-style-image: url('close.svg') !important; + list-style-image: url("close.svg") !important; } #PanelUI-zen-emojis-picker-none { - list-style-image: url('trash.svg'); + list-style-image: url("trash.svg"); } #PanelUI-zen-gradient-generator-color-remove { - list-style-image: url('unpin.svg') !important; + list-style-image: url("unpin.svg") !important; } .tab-reset-button { - list-style-image: url('unpin.svg'); + list-style-image: url("unpin.svg"); - @media (-moz-pref('zen.pinned-tab-manager.close-shortcut-behavior', 'close')) { - list-style-image: url('close.svg'); + @media (-moz-pref("zen.pinned-tab-manager.close-shortcut-behavior", "close")) { + list-style-image: url("close.svg"); } } #sidebar-button { - list-style-image: url('sidebars-right.svg') !important; + list-style-image: url("sidebars-right.svg") !important; } #sidebar-button:-moz-locale-dir(ltr):not([positionend]), #sidebar-button:-moz-locale-dir(rtl)[positionend], #zen-toggle-compact-mode { - list-style-image: url('sidebar.svg') !important; + list-style-image: url("sidebar.svg") !important; - :root[zen-right-side='true'] & { - list-style-image: url('sidebar-right.svg') !important; + :root[zen-right-side="true"] & { + list-style-image: url("sidebar-right.svg") !important; } } @@ -72,7 +72,7 @@ #downloads-indicator-anchor, #appMenu-downloads-button, #appMenu-library-downloads-button { - list-style-image: url('downloads.svg') !important; + list-style-image: url("downloads.svg") !important; } #downloads-indicator-icon { @@ -80,64 +80,56 @@ } #appMenu-translate-button { - list-style-image: url('translations.svg') !important; + list-style-image: url("translations.svg") !important; } #appMenu-zoom-controls, #PanelUI-zen-gradient-generator-color-add, #zen-site-data-new-addon-button { - list-style-image: url('plus.svg') !important; + list-style-image: url("plus.svg") !important; } #appMenu-passwords-button, #password-notification-icon, -#PopupAutoComplete - > richlistbox - > richlistitem[originaltype='generatedPassword'] - > .two-line-wrapper - > .ac-site-icon, -#PopupAutoComplete - > richlistbox - > richlistitem[originaltype='loginWithOrigin'] - > .two-line-wrapper - > .ac-site-icon, -#PopupAutoComplete > richlistbox > richlistitem[originaltype='login'] > .ac-site-icon { - list-style-image: url('passwords.svg') !important; +#PopupAutoComplete > richlistbox > richlistitem[originaltype="generatedPassword"] > .two-line-wrapper > .ac-site-icon, +#PopupAutoComplete > richlistbox > richlistitem[originaltype="loginWithOrigin"] > .two-line-wrapper > .ac-site-icon, +#PopupAutoComplete > richlistbox > richlistitem[originaltype="login"] > .ac-site-icon { + list-style-image: url("passwords.svg") !important; } #nav-bar-overflow-button { - list-style-image: url('chevron.svg') !important; + list-style-image: url("chevron.svg") !important; /* On macos, we don't display the app menu, meaning * we can re-use the menu icon for the overflow button. * Which is more intuitive for users and looks better. */ @media (-moz-platform: macos) { - list-style-image: url('menu.svg') !important; + list-style-image: url("menu.svg") !important; } } .zen-current-workspace-indicator-chevron, #PanelUI-zen-gradient-generator-color-page-right { - list-style-image: url('arrow-right.svg'); + list-style-image: url("arrow-right.svg"); } #PanelUI-menu-button, #appMenu-more-button2, .zen-workspaces-actions, #zen-workspace-actions-menu-icon { - list-style-image: url('menu.svg') !important; + list-style-image: url("menu.svg") !important; } #appMenu-help-button2 { - list-style-image: url('help.svg') !important; + list-style-image: url("help.svg") !important; } #sync-button, -.urlbarView-row[source='tabs'] > .urlbarView-row-inner > .urlbarView-no-wrap > .urlbarView-favicon, +.urlbarView-row[source="tabs"] > .urlbarView-row-inner > .urlbarView-no-wrap > .urlbarView-favicon, #urlbar-engine-one-off-item-tabs, #zen-open-background-tab-button { - list-style-image: url('tab.svg') !important; + list-style-image: url("tab.svg") !important; } #context-navigation > menuitem { @@ -145,55 +137,49 @@ } #history-panelmenu, -.urlbarView-row[source='history'] - > .urlbarView-row-inner - > .urlbarView-no-wrap - > .urlbarView-favicon, +.urlbarView-row[source="history"] > .urlbarView-row-inner > .urlbarView-no-wrap > .urlbarView-favicon, #urlbar-engine-one-off-item-history, #appMenu-history-button, #appMenu-library-history-button, #sidebar-switcher-history, #zen-history-button, -#sidebar-box[sidebarcommand='viewHistorySidebar'] - > #sidebar-header - > #sidebar-switcher-target - > #sidebar-icon { - list-style-image: url('history.svg') !important; +#sidebar-box[sidebarcommand="viewHistorySidebar"] > #sidebar-header > #sidebar-switcher-target > #sidebar-icon { + list-style-image: url("history.svg") !important; } #save-page-button, #appMenu-save-file-button2 { - list-style-image: url('save.svg') !important; + list-style-image: url("save.svg") !important; } #print-button, #appMenu-print-button2 { - list-style-image: url('print.svg') !important; + list-style-image: url("print.svg") !important; } .searchbar-search-icon { - list-style-image: url('search-glass.svg') !important; + list-style-image: url("search-glass.svg") !important; } #find-button, #appMenu-find-button2 { - list-style-image: url('search-page.svg') !important; + list-style-image: url("search-page.svg") !important; } #open-file-button { - list-style-image: url('open.svg') !important; + list-style-image: url("open.svg") !important; } #add-ons-button, #appMenu-extensions-themes-button, #appMenu-unified-extensions-button, #unified-extensions-button { - list-style-image: url('extension.svg') !important; + list-style-image: url("extension.svg") !important; } #zoom-out-button, #appMenu-zoomReduce-button2 { - list-style-image: url('zoom-out.svg') !important; + list-style-image: url("zoom-out.svg") !important; } #zoom-in-button, @@ -204,27 +190,27 @@ #PanelUI-zen-profiles-newProfile, #zen-sidebar-add-panel-button, #PanelUI-zen-gradient-generator-color-custom-add image { - list-style-image: url('plus.svg') !important; + list-style-image: url("plus.svg") !important; } #cut-button { - list-style-image: url('edit-cut.svg') !important; + list-style-image: url("edit-cut.svg") !important; } #copy-button { - list-style-image: url('edit-copy.svg') !important; + list-style-image: url("edit-copy.svg") !important; } #paste-button { - list-style-image: url('edit-paste.svg') !important; + list-style-image: url("edit-paste.svg") !important; } #email-link-button { - list-style-image: url('mail.svg') !important; + list-style-image: url("mail.svg") !important; } #screenshot-button { - list-style-image: url('screenshot.svg') !important; + list-style-image: url("screenshot.svg") !important; } #preferences-button, @@ -233,38 +219,38 @@ #appMenu-settings-button, #PanelUI-zen-profiles-managePrfs, .unified-extensions-item-open-menu.subviewbutton { - list-style-image: url('settings.svg') !important; + list-style-image: url("settings.svg") !important; } #spell-check-enabled { - list-style-image: url('spell-check.svg') !important; + list-style-image: url("spell-check.svg") !important; } #panic-button { - list-style-image: url('forget.svg') !important; + list-style-image: url("forget.svg") !important; } #appMenu-new-private-window-button2, #PanelUI-zen-profiles-privateWin { - list-style-image: url('private-window.svg') !important; + list-style-image: url("private-window.svg") !important; } #privatebrowsing-button { - list-style-image: url('privateBrowsing.svg') !important; + list-style-image: url("privateBrowsing.svg") !important; } #profiler-button-button > .toolbarbutton-icon, -.subviewbutton[label='Task Manager'] { - list-style-image: url('tool-profiler.svg') !important; +.subviewbutton[label="Task Manager"] { + list-style-image: url("tool-profiler.svg") !important; } #developer-button { - list-style-image: url('developer.svg') !important; + list-style-image: url("developer.svg") !important; } #new-window-button, #appMenu-new-window-button2 { - list-style-image: url('window.svg') !important; + list-style-image: url("window.svg") !important; } #restore-button, @@ -272,28 +258,25 @@ .zen-glance-sidebar-open, #appMenu-fullscreen-button2, .zen-tab-unsplit-button { - list-style-image: url('fullscreen.svg') !important; + list-style-image: url("fullscreen.svg") !important; } #restore-button[checked], #fullscreen-button[checked], #appMenu-fullscreen-button2[checked] { - list-style-image: url('fullscreen-exit.svg') !important; + list-style-image: url("fullscreen-exit.svg") !important; } #bookmarks-menu-button, #appMenu-bookmarks-button, #sidebar-switcher-bookmarks, #appMenu-library-bookmarks-button, -#sidebar-box[sidebarcommand='viewBookmarksSidebar'] - > #sidebar-header - > #sidebar-switcher-target - > #sidebar-icon { - list-style-image: url('bookmark-star-on-tray.svg') !important; +#sidebar-box[sidebarcommand="viewBookmarksSidebar"] > #sidebar-header > #sidebar-switcher-target > #sidebar-icon { + list-style-image: url("bookmark-star-on-tray.svg") !important; } #home-button { - list-style-image: url('home.svg') !important; + list-style-image: url("home.svg") !important; } #toggle_toolbar-menubar, @@ -302,113 +285,107 @@ } #library-button { - list-style-image: url('library.svg') !important; + list-style-image: url("library.svg") !important; } /* identity icons */ #identity-icon { - list-style-image: url('info.svg'); + list-style-image: url("info.svg"); } -#identity-box[pageproxystate='valid'].chromeUI #identity-icon { +#identity-box[pageproxystate="valid"].chromeUI #identity-icon { filter: grayscale(1); } -#identity-box[pageproxystate='valid'].localResource #identity-icon { - list-style-image: url('page-portrait.svg') !important; +#identity-box[pageproxystate="valid"].localResource #identity-icon { + list-style-image: url("page-portrait.svg") !important; } -#urlbar:not(.searchButton) - > #urlbar-input-container - > #identity-box[pageproxystate='invalid'] - #identity-icon { - list-style-image: url('search-glass.svg') !important; +#urlbar:not(.searchButton) > #urlbar-input-container > #identity-box[pageproxystate="invalid"] #identity-icon { + list-style-image: url("search-glass.svg") !important; } -#urlbar[actiontype='extension'] > #urlbar-input-container > #identity-box #identity-icon, -#identity-box[pageproxystate='valid'].extensionPage #identity-icon { - list-style-image: url('extension.svg') !important; +#urlbar[actiontype="extension"] > #urlbar-input-container > #identity-box #identity-icon, +#identity-box[pageproxystate="valid"].extensionPage #identity-icon { + list-style-image: url("extension.svg") !important; } -#identity-box[pageproxystate='valid'].verifiedDomain #identity-icon, -#identity-box[pageproxystate='valid'].mixedActiveBlocked #identity-icon { - list-style-image: url('security.svg') !important; +#identity-box[pageproxystate="valid"].verifiedDomain #identity-icon, +#identity-box[pageproxystate="valid"].mixedActiveBlocked #identity-icon { + list-style-image: url("security.svg") !important; } -#urlbar-input-container[pageproxystate='valid'] - > #tracking-protection-icon-container - > #tracking-protection-icon-box - > #tracking-protection-icon { - list-style-image: url('tracking-protection.svg') !important; +#urlbar-input-container[pageproxystate="valid"] > #tracking-protection-icon-container > #tracking-protection-icon-box > #tracking-protection-icon { + list-style-image: url("tracking-protection.svg") !important; } /* security */ .identity-popup-security-connection, #appMenu-report-broken-site-button { - list-style-image: url('security-broken.svg') !important; + list-style-image: url("security-broken.svg") !important; } -#identity-box[pageproxystate='valid'].notSecure #identity-icon, -#identity-box[pageproxystate='valid'].mixedActiveContent #identity-icon, -#identity-box[pageproxystate='valid'].httpsOnlyErrorPage #identity-icon { - list-style-image: url('security-broken.svg') !important; +#identity-box[pageproxystate="valid"].notSecure #identity-icon, +#identity-box[pageproxystate="valid"].mixedActiveContent #identity-icon, +#identity-box[pageproxystate="valid"].httpsOnlyErrorPage #identity-icon { + list-style-image: url("security-broken.svg") !important; } -#identity-popup[connection='chrome'] .identity-popup-security-connection { - list-style-image: url('chrome://branding/content/icon48.png') !important; +#identity-popup[connection="chrome"] .identity-popup-security-connection { + list-style-image: url("chrome://branding/content/icon48.png") !important; filter: grayscale(1); } -#identity-popup[connection='file'] .identity-popup-security-connection { - list-style-image: url('page-portrait.svg') !important; +#identity-popup[connection="file"] .identity-popup-security-connection { + list-style-image: url("page-portrait.svg") !important; } -#identity-popup[connection^='secure'] .identity-popup-security-connection { - list-style-image: url('security.svg') !important; +#identity-popup[connection^="secure"] .identity-popup-security-connection { + list-style-image: url("security.svg") !important; } -#identity-popup[ciphers='weak'] .identity-popup-security-connection, -#identity-popup[mixedcontent~='passive-loaded'][isbroken] .identity-popup-security-connection, -#identity-popup[connection='secure-cert-user-overridden'] .identity-popup-security-connection, -#identity-popup[connection='cert-error-page'] .identity-popup-security-connection { - list-style-image: url('security-warning.svg') !important; +#identity-popup[ciphers="weak"] .identity-popup-security-connection, +#identity-popup[mixedcontent~="passive-loaded"][isbroken] .identity-popup-security-connection, +#identity-popup[connection="secure-cert-user-overridden"] .identity-popup-security-connection, +#identity-popup[connection="cert-error-page"] .identity-popup-security-connection { + list-style-image: url("security-warning.svg") !important; } -#identity-popup[connection='net-error-page'] .identity-popup-security-connection { - list-style-image: url('info.svg') !important; +#identity-popup[connection="net-error-page"] .identity-popup-security-connection { + list-style-image: url("info.svg") !important; } -#identity-popup[connection='extension'] .identity-popup-security-connection { - list-style-image: url('extension.svg') !important; +#identity-popup[connection="extension"] .identity-popup-security-connection { + list-style-image: url("extension.svg") !important; } #appMenu-new-tab-button2 { - list-style-image: url('new-tab-image.svg') !important; + list-style-image: url("new-tab-image.svg") !important; } .findbar-find-previous { - list-style-image: url('arrow-up.svg') !important; + list-style-image: url("arrow-up.svg") !important; } .findbar-find-next { - list-style-image: url('arrow-down.svg') !important; + list-style-image: url("arrow-down.svg") !important; } .zen-workspace-close-unpinned-tabs-button { - list-style-image: url('dart-down.svg'); + list-style-image: url("dart-down.svg"); - &:not([can-close='true']) .toolbarbutton-icon { + &:not([can-close="true"]) .toolbarbutton-icon { display: none; } - @media -moz-pref('zen.view.show-clear-tabs-button', false) { + @media -moz-pref("zen.view.show-clear-tabs-button", false) { display: none; } } .zen-workspace-actions-reorder-icon, .zen-tab-rearrange-button { - list-style-image: url('drag-indicator.svg') !important; + list-style-image: url("drag-indicator.svg") !important; } #protections-popup-mainView .subviewbutton-nav:not(.notFound)::after, @@ -416,86 +393,83 @@ .widget-overflow-list .subviewbutton-nav::after, .PanelUI-subView .subviewbutton-nav::after, .menu-right { - content: url('arrow-right.svg') !important; + content: url("arrow-right.svg") !important; } #PlacesChevron, #urlbar-go-button { - list-style-image: url('arrow-right.svg') !important; + list-style-image: url("arrow-right.svg") !important; } #zen-expand-sidebar-button { - list-style-image: url('expand-sidebar.svg') !important; + list-style-image: url("expand-sidebar.svg") !important; } .panel-header > .subviewbutton-back, #PanelUI-zen-gradient-generator-color-page-left { - list-style-image: url('arrow-left.svg') !important; + list-style-image: url("arrow-left.svg") !important; } #appmenu-moreTools-button { - list-style-image: url('customize.svg') !important; + list-style-image: url("customize.svg") !important; } #zen-copy-current-url-button, #zen-site-data-header-share { - list-style-image: url('share.svg'); + list-style-image: url("share.svg"); } .bookmark-item[container] { - list-style-image: url('folder.svg') !important; + list-style-image: url("folder.svg") !important; } #zen-site-data-header-bookmark, #pageAction-panel-bookmark, #star-button, #zen-bookmark-button { - list-style-image: url('bookmark-hollow.svg') !important; + list-style-image: url("bookmark-hollow.svg") !important; } #zen-site-data-header-bookmark.active, #pageAction-panel-bookmark[starred], #star-button[starred] { - list-style-image: url('bookmark.svg') !important; + list-style-image: url("bookmark.svg") !important; } .zen-glance-sidebar-split { - list-style-image: url('split.svg'); + list-style-image: url("split.svg"); - &[disabled='true'] { + &[disabled="true"] { opacity: 0.5; cursor: not-allowed; } } -#sidebar-box[sidebarcommand='viewTabsSidebar'] - > #sidebar-header - > #sidebar-switcher-target - > #sidebar-icon, +#sidebar-box[sidebarcommand="viewTabsSidebar"] > #sidebar-header > #sidebar-switcher-target > #sidebar-icon, #sidebar-switcher-tabs { - list-style-image: url('send-to-device.svg') !important; + list-style-image: url("send-to-device.svg") !important; } /* tab icons */ .tab-icon-image[src="chrome://branding/content/icon32.png"], .tab-icon-image[src="chrome://browser/skin/privatebrowsing/favicon.svg"] { - content: url('new-tab-image.svg') !important; + content: url("new-tab-image.svg") !important; } .tab-icon-image[src="chrome://global/skin/icons/settings.svg"] { - content: url('settings.svg') !important; + content: url("settings.svg") !important; } .tab-icon-image[src="chrome://mozapps/skin/extensions/extension.svg"] { - content: url('extension.svg') !important; + content: url("extension.svg") !important; } .tab-icon-image[src="chrome://browser/skin/customize.svg"] { - content: url('customize.svg') !important; + content: url("customize.svg") !important; } /* permissions */ @@ -505,11 +479,9 @@ } #identity-permission-box, -:root:not([zen-has-empty-tab='true']) - #urlbar:not([breakout-extend='true']) - #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 { +:root:not([zen-has-empty-tab="true"]) #urlbar:not([breakout-extend="true"]) #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; } @@ -518,216 +490,216 @@ border-radius: var(--urlbar-icon-border-radius) !important; & image { - list-style-image: url('permissions.svg'); + list-style-image: url("permissions.svg"); -moz-context-properties: fill, fill-opacity; pointer-events: none; } &:is([open], [starred]) image { - list-style-image: url('permissions-fill.svg'); + list-style-image: url("permissions-fill.svg"); } } .geo-icon { - list-style-image: url('geo.svg') !important; + list-style-image: url("geo.svg") !important; } .geo-icon.blocked-permission-icon { - list-style-image: url('geo-blocked.svg') !important; + list-style-image: url("geo-blocked.svg") !important; } .xr-icon { - list-style-image: url('xr.svg') !important; + list-style-image: url("xr.svg") !important; } .xr-icon.blocked-permission-icon { - list-style-image: url('xr-blocked.svg') !important; + list-style-image: url("xr-blocked.svg") !important; } -.popup-notification-icon[popupid='web-notifications'], +.popup-notification-icon[popupid="web-notifications"], .desktop-notification-icon { - list-style-image: url('desktop-notification.svg') !important; + list-style-image: url("desktop-notification.svg") !important; } .desktop-notification-icon.blocked-permission-icon { - list-style-image: url('desktop-notification-blocked.svg') !important; + list-style-image: url("desktop-notification-blocked.svg") !important; } .camera-icon, #zen-site-data-header-screenshot { - list-style-image: url('camera.svg') !important; + list-style-image: url("camera.svg") !important; } .camera-icon.blocked-permission-icon { - list-style-image: url('camera-blocked.svg') !important; + list-style-image: url("camera-blocked.svg") !important; } .microphone-icon { - list-style-image: url('microphone.svg') !important; + list-style-image: url("microphone.svg") !important; } .microphone-icon.blocked-permission-icon { - list-style-image: url('microphone-blocked.svg') !important; + list-style-image: url("microphone-blocked.svg") !important; } .screen-icon { - list-style-image: url('screen.svg') !important; + list-style-image: url("screen.svg") !important; } .screen-icon.blocked-permission-icon { - list-style-image: url('screen-blocked.svg') !important; + list-style-image: url("screen-blocked.svg") !important; } -.popup-notification-icon[popupid='persistent-storage'], +.popup-notification-icon[popupid="persistent-storage"], .persistent-storage-icon, .indexedDB-icon { - list-style-image: url('persistent-storage.svg') !important; + list-style-image: url("persistent-storage.svg") !important; } .persistent-storage-icon.blocked-permission-icon { - list-style-image: url('persistent-storage-blocked.svg') !important; + list-style-image: url("persistent-storage-blocked.svg") !important; } .popup-icon { - list-style-image: url('popup.svg') !important; + list-style-image: url("popup.svg") !important; } .autoplay-media-icon { - list-style-image: url('autoplay-media.svg') !important; + list-style-image: url("autoplay-media.svg") !important; } .autoplay-media-icon.blocked-permission-icon { - list-style-image: url('autoplay-media-blocked.svg') !important; + list-style-image: url("autoplay-media-blocked.svg") !important; } #canvas-notification-icon, -.popup-notification-icon[popupid='canvas-permissions-prompt'], +.popup-notification-icon[popupid="canvas-permissions-prompt"], .canvas-icon { - list-style-image: url('canvas.svg') !important; + list-style-image: url("canvas.svg") !important; } .canvas-icon.blocked-permission-icon { - list-style-image: url('canvas-blocked.svg') !important; + list-style-image: url("canvas-blocked.svg") !important; } .midi-icon, .midi-sysex-icon, -.popup-notification-icon[popupid='midi'], -.popup-notification-icon[popupid='midi-sysex'] { - list-style-image: url('midi.svg') !important; +.popup-notification-icon[popupid="midi"], +.popup-notification-icon[popupid="midi-sysex"] { + list-style-image: url("midi.svg") !important; } .install-icon { - list-style-image: url('extension.svg') !important; + list-style-image: url("extension.svg") !important; } .install-icon.blocked-permission-icon, -.popup-notification-icon[popupid='xpinstall-disabled'], -.popup-notification-icon[popupid='addon-install-blocked'], -.popup-notification-icon[popupid='addon-install-origin-blocked'] { - list-style-image: url('extension-blocked.svg') !important; +.popup-notification-icon[popupid="xpinstall-disabled"], +.popup-notification-icon[popupid="addon-install-blocked"], +.popup-notification-icon[popupid="addon-install-origin-blocked"] { + list-style-image: url("extension-blocked.svg") !important; } .permission-popup-permission-item { - list-style-image: url('settings-fill.svg') !important; + list-style-image: url("settings-fill.svg") !important; } .permission-popup-permission-item-geo { - list-style-image: url('geo-fill.svg') !important; + list-style-image: url("geo-fill.svg") !important; } .permission-popup-permission-item-xr { - list-style-image: url('xr-fill.svg') !important; + list-style-image: url("xr-fill.svg") !important; } .permission-popup-permission-item-desktop-notification { - list-style-image: url('desktop-notification-fill.svg') !important; + list-style-image: url("desktop-notification-fill.svg") !important; } .permission-popup-permission-item-camera { - list-style-image: url('camera-fill.svg') !important; + list-style-image: url("camera-fill.svg") !important; } .permission-popup-permission-item-microphone { - list-style-image: url('microphone-fill.svg') !important; + list-style-image: url("microphone-fill.svg") !important; } .permission-popup-permission-item-screen { - list-style-image: url('screen.svg') !important; + list-style-image: url("screen.svg") !important; } .permission-popup-permission-item-persistent-storage { - list-style-image: url('persistent-storage-fill.svg') !important; + list-style-image: url("persistent-storage-fill.svg") !important; } .permission-popup-permission-item-popup { - list-style-image: url('popup-fill.svg') !important; + list-style-image: url("popup-fill.svg") !important; } .permission-popup-permission-item-autoplay-media { - list-style-image: url('autoplay-media-fill.svg') !important; + list-style-image: url("autoplay-media-fill.svg") !important; } .zen-permission-shield-icon { - list-style-image: url('tracking-protection-fill.svg'); + list-style-image: url("tracking-protection-fill.svg"); } .zen-permission-extension-icon { - list-style-image: url('extension-fill.svg'); + list-style-image: url("extension-fill.svg"); } .zen-permission-cookie-icon { - list-style-image: url('cookies-fill.svg'); + list-style-image: url("cookies-fill.svg"); } /* tab sound icons */ .tab-icon-overlay[soundplaying] { - list-style-image: url('tab-audio-playing-small.svg') !important; + list-style-image: url("tab-audio-playing-small.svg") !important; } .tab-icon-overlay[muted] { - list-style-image: url('tab-audio-muted-small.svg') !important; + list-style-image: url("tab-audio-muted-small.svg") !important; } .tab-icon-overlay[activemedia-blocked] { - list-style-image: url('tab-audio-blocked-small.svg') !important; + list-style-image: url("tab-audio-blocked-small.svg") !important; } #reader-mode-button > .urlbar-icon, #zen-site-data-header-reader-mode { - list-style-image: url('reader-mode.svg') !important; + list-style-image: url("reader-mode.svg") !important; } #unified-extensions-manage-extensions { - list-style-image: url('manage.svg') !important; + list-style-image: url("manage.svg") !important; } #appMenuRecentlyClosedTabs { - list-style-image: url('container-tab.svg') !important; + list-style-image: url("container-tab.svg") !important; } #PanelUI-zen-gradient-generator-color-toggle-algo { - list-style-image: url('algorithm.svg'); + list-style-image: url("algorithm.svg"); } #appMenuClearRecentHistory { - list-style-image: url('edit-delete.svg') !important; + list-style-image: url("edit-delete.svg") !important; } #appMenuRecentlyClosedWindows { - list-style-image: url('window.svg') !important; + list-style-image: url("window.svg") !important; } #appMenuSearchHistory { - list-style-image: url('search-glass.svg') !important; + list-style-image: url("search-glass.svg") !important; } #PanelUI-historyMore { - list-style-image: url('manage.svg') !important; + list-style-image: url("manage.svg") !important; } #panelMenuBookmarkThisPage { - list-style-image: url('bookmark-hollow.svg') !important; + list-style-image: url("bookmark-hollow.svg") !important; } #panelMenu_searchBookmarks { - list-style-image: url('search-glass.svg') !important; + list-style-image: url("search-glass.svg") !important; } #panelMenu_viewBookmarksToolbar { - list-style-image: url('open.svg') !important; + list-style-image: url("open.svg") !important; } #panelMenu_showAllBookmarks { - list-style-image: url('manage.svg') !important; + list-style-image: url("manage.svg") !important; } /* FIX header icons for the app menu sub menus (eg. fx account, history...) */ @@ -738,7 +710,7 @@ /* header icons for the app menu sub menus (eg. fx account, history...) */ .panel-header > h1 > span::before { - content: ''; + content: ""; background: var(--header-image, none) center / 16px no-repeat; -moz-context-properties: fill, fill-opacity; fill: currentColor; @@ -756,32 +728,32 @@ } #PanelUI-bookmarks .panel-header > h1 > span::before { - --header-image: url('bookmark-star-on-tray.svg'); + --header-image: url("bookmark-star-on-tray.svg"); --fp-enabled: 1; } #PanelUI-history .panel-header > h1 > span::before { - --header-image: url('history.svg'); + --header-image: url("history.svg"); --fp-enabled: 1; } #PanelUI-helpView .panel-header > h1 > span::before { - --header-image: url('help.svg'); + --header-image: url("help.svg"); --fp-enabled: 1; } #appMenu-libraryView .panel-header > h1 > span::before { - --header-image: url('library.svg'); + --header-image: url("library.svg"); --fp-enabled: 1; } #unified-extensions-panel .panel-header > h1 > span::before { - --header-image: url('extension.svg'); + --header-image: url("extension.svg"); --fp-enabled: 1; } #alltabs-button { - list-style-image: url('chrome://browser/skin/tabs.svg') !important; + list-style-image: url("chrome://browser/skin/tabs.svg") !important; } #toolbar-context-toggle-vertical-tabs, @@ -791,61 +763,61 @@ } #zen-media-playpause-button { - list-style-image: url('media-play.svg'); + list-style-image: url("media-play.svg"); } #zen-media-controls-toolbar.playing #zen-media-playpause-button { - list-style-image: url('media-pause.svg'); + list-style-image: url("media-pause.svg"); } #zen-media-nexttrack-button { - list-style-image: url('media-next.svg'); + list-style-image: url("media-next.svg"); } #zen-media-previoustrack-button { - list-style-image: url('media-previous.svg'); + list-style-image: url("media-previous.svg"); } #zen-media-controls-toolbar[muted] #zen-media-mute-button { - list-style-image: url('media-mute.svg'); + list-style-image: url("media-mute.svg"); } #zen-media-mute-button { - list-style-image: url('media-unmute.svg'); + list-style-image: url("media-unmute.svg"); } #zen-media-close-button { - list-style-image: url('close.svg'); + list-style-image: url("close.svg"); } #zen-media-focus-button:hover { - list-style-image: url('screen.svg'); + list-style-image: url("screen.svg"); } #zen-media-close-button { - list-style-image: url('close.svg'); + list-style-image: url("close.svg"); } #zen-media-mute-mic-button { - list-style-image: url('microphone-fill.svg'); + list-style-image: url("microphone-fill.svg"); } #zen-media-controls-toolbar[mic-muted] #zen-media-mute-mic-button { - list-style-image: url('microphone-blocked-fill.svg'); + list-style-image: url("microphone-blocked-fill.svg"); fill: rgb(224, 41, 29); } #zen-media-mute-camera-button { - list-style-image: url('video-fill.svg'); + list-style-image: url("video-fill.svg"); } #zen-media-controls-toolbar[camera-muted] #zen-media-mute-camera-button { - list-style-image: url('video-blocked-fill.svg'); + list-style-image: url("video-blocked-fill.svg"); fill: rgb(224, 41, 29); } #zen-media-pip-button { - list-style-image: url('chrome://global/skin/media/picture-in-picture-open.svg'); + list-style-image: url("chrome://global/skin/media/picture-in-picture-open.svg"); } #zenCreateNewPopup > menuitem img { @@ -866,30 +838,30 @@ } #PanelUI-zen-gradient-generator-scheme-auto { - list-style-image: url('sparkles.svg'); + list-style-image: url("sparkles.svg"); } -@media -moz-pref('zen.view.window.scheme', 2) { +@media -moz-pref("zen.view.window.scheme", 2) { #PanelUI-zen-gradient-generator-scheme-auto { background: light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.1)); } } #PanelUI-zen-gradient-generator-scheme-dark { - list-style-image: url('moon-stars.svg'); + list-style-image: url("moon-stars.svg"); } -@media -moz-pref('zen.view.window.scheme', 0) { +@media -moz-pref("zen.view.window.scheme", 0) { #PanelUI-zen-gradient-generator-scheme-dark { background: light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.1)); } } #PanelUI-zen-gradient-generator-scheme-light { - list-style-image: url('face-sun.svg'); + list-style-image: url("face-sun.svg"); } -@media -moz-pref('zen.view.window.scheme', 1) { +@media -moz-pref("zen.view.window.scheme", 1) { #PanelUI-zen-gradient-generator-scheme-light { background: light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.1)); } @@ -907,19 +879,19 @@ border-radius: 6px; padding: 6px 10px 6px 8px; - &[identity='secure'] { - list-style-image: url('security.svg'); + &[identity="secure"] { + list-style-image: url("security.svg"); } - &[identity='not-secure'] { - list-style-image: url('security-broken.svg'); + &[identity="not-secure"] { + list-style-image: url("security-broken.svg"); } - &[identity='extension'] { - list-style-image: url('extension.svg'); + &[identity="extension"] { + list-style-image: url("extension.svg"); } - &:not([identity='secure']) * { + &:not([identity="secure"]) * { color: light-dark(var(--color-red-70), var(--color-red-30)); } @@ -945,7 +917,7 @@ height: 30px; border-radius: 99px; margin-left: auto !important; - list-style-image: url('menu.svg'); + list-style-image: url("menu.svg"); justify-content: center; align-items: center; padding: 0; @@ -956,6 +928,6 @@ } #zen-copy-url-button image { - list-style-image: url('link.svg'); + list-style-image: url("link.svg"); fill-opacity: 0.65; } diff --git a/src/zen/@types/index.d.ts b/src/zen/@types/index.d.ts index 2f6a529bc..d5fcde6a3 100644 --- a/src/zen/@types/index.d.ts +++ b/src/zen/@types/index.d.ts @@ -22,7 +22,7 @@ /// /// -import type {} from './lib.gecko.augmentations.d.ts'; +import type {} from "./lib.gecko.augmentations.d.ts"; declare global { const Cc: nsXPCComponents_Classes; diff --git a/src/zen/@types/lib.gecko.dom.d.ts b/src/zen/@types/lib.gecko.dom.d.ts index a10730211..b35a25143 100644 --- a/src/zen/@types/lib.gecko.dom.d.ts +++ b/src/zen/@types/lib.gecko.dom.d.ts @@ -9169,113 +9169,113 @@ interface Document qualifiedName: string, options?: string | ElementCreationOptions ): Element; - createEvent(eventInterface: 'AddonEvent'): AddonEvent; - createEvent(eventInterface: 'AnimationEvent'): AnimationEvent; - createEvent(eventInterface: 'AnimationPlaybackEvent'): AnimationPlaybackEvent; - createEvent(eventInterface: 'AudioProcessingEvent'): AudioProcessingEvent; - createEvent(eventInterface: 'BeforeUnloadEvent'): BeforeUnloadEvent; - createEvent(eventInterface: 'BlobEvent'): BlobEvent; - createEvent(eventInterface: 'CSSCustomPropertyRegisteredEvent'): CSSCustomPropertyRegisteredEvent; - createEvent(eventInterface: 'CaretStateChangedEvent'): CaretStateChangedEvent; - createEvent(eventInterface: 'ClipboardEvent'): ClipboardEvent; - createEvent(eventInterface: 'CloseEvent'): CloseEvent; - createEvent(eventInterface: 'CommandEvent'): CommandEvent; - createEvent(eventInterface: 'CompositionEvent'): CompositionEvent; + createEvent(eventInterface: "AddonEvent"): AddonEvent; + createEvent(eventInterface: "AnimationEvent"): AnimationEvent; + createEvent(eventInterface: "AnimationPlaybackEvent"): AnimationPlaybackEvent; + createEvent(eventInterface: "AudioProcessingEvent"): AudioProcessingEvent; + createEvent(eventInterface: "BeforeUnloadEvent"): BeforeUnloadEvent; + createEvent(eventInterface: "BlobEvent"): BlobEvent; + createEvent(eventInterface: "CSSCustomPropertyRegisteredEvent"): CSSCustomPropertyRegisteredEvent; + createEvent(eventInterface: "CaretStateChangedEvent"): CaretStateChangedEvent; + createEvent(eventInterface: "ClipboardEvent"): ClipboardEvent; + createEvent(eventInterface: "CloseEvent"): CloseEvent; + createEvent(eventInterface: "CommandEvent"): CommandEvent; + createEvent(eventInterface: "CompositionEvent"): CompositionEvent; createEvent( - eventInterface: 'ContentVisibilityAutoStateChangeEvent' + eventInterface: "ContentVisibilityAutoStateChangeEvent" ): ContentVisibilityAutoStateChangeEvent; - createEvent(eventInterface: 'CookieChangeEvent'): CookieChangeEvent; - createEvent(eventInterface: 'CustomEvent'): CustomEvent; - createEvent(eventInterface: 'DeviceLightEvent'): DeviceLightEvent; - createEvent(eventInterface: 'DeviceMotionEvent'): DeviceMotionEvent; - createEvent(eventInterface: 'DeviceOrientationEvent'): DeviceOrientationEvent; - createEvent(eventInterface: 'DragEvent'): DragEvent; - createEvent(eventInterface: 'ErrorEvent'): ErrorEvent; - createEvent(eventInterface: 'FocusEvent'): FocusEvent; - createEvent(eventInterface: 'FontFaceSetLoadEvent'): FontFaceSetLoadEvent; - createEvent(eventInterface: 'FormDataEvent'): FormDataEvent; - createEvent(eventInterface: 'FrameCrashedEvent'): FrameCrashedEvent; - createEvent(eventInterface: 'GPUUncapturedErrorEvent'): GPUUncapturedErrorEvent; - createEvent(eventInterface: 'GamepadAxisMoveEvent'): GamepadAxisMoveEvent; - createEvent(eventInterface: 'GamepadButtonEvent'): GamepadButtonEvent; - createEvent(eventInterface: 'GamepadEvent'): GamepadEvent; - createEvent(eventInterface: 'HashChangeEvent'): HashChangeEvent; - createEvent(eventInterface: 'IDBVersionChangeEvent'): IDBVersionChangeEvent; - createEvent(eventInterface: 'ImageCaptureErrorEvent'): ImageCaptureErrorEvent; - createEvent(eventInterface: 'InputEvent'): InputEvent; - createEvent(eventInterface: 'KeyboardEvent'): KeyboardEvent; - createEvent(eventInterface: 'MIDIConnectionEvent'): MIDIConnectionEvent; - createEvent(eventInterface: 'MIDIMessageEvent'): MIDIMessageEvent; - createEvent(eventInterface: 'MediaEncryptedEvent'): MediaEncryptedEvent; - createEvent(eventInterface: 'MediaKeyMessageEvent'): MediaKeyMessageEvent; - createEvent(eventInterface: 'MediaQueryListEvent'): MediaQueryListEvent; - createEvent(eventInterface: 'MediaRecorderErrorEvent'): MediaRecorderErrorEvent; - createEvent(eventInterface: 'MediaStreamEvent'): MediaStreamEvent; - createEvent(eventInterface: 'MediaStreamTrackEvent'): MediaStreamTrackEvent; - createEvent(eventInterface: 'MerchantValidationEvent'): MerchantValidationEvent; - createEvent(eventInterface: 'MessageEvent'): MessageEvent; - createEvent(eventInterface: 'MouseEvent'): MouseEvent; - createEvent(eventInterface: 'MouseEvents'): MouseEvent; - createEvent(eventInterface: 'MouseScrollEvent'): MouseScrollEvent; - createEvent(eventInterface: 'MozSharedMapChangeEvent'): MozSharedMapChangeEvent; - createEvent(eventInterface: 'NavigateEvent'): NavigateEvent; + createEvent(eventInterface: "CookieChangeEvent"): CookieChangeEvent; + createEvent(eventInterface: "CustomEvent"): CustomEvent; + createEvent(eventInterface: "DeviceLightEvent"): DeviceLightEvent; + createEvent(eventInterface: "DeviceMotionEvent"): DeviceMotionEvent; + createEvent(eventInterface: "DeviceOrientationEvent"): DeviceOrientationEvent; + createEvent(eventInterface: "DragEvent"): DragEvent; + createEvent(eventInterface: "ErrorEvent"): ErrorEvent; + createEvent(eventInterface: "FocusEvent"): FocusEvent; + createEvent(eventInterface: "FontFaceSetLoadEvent"): FontFaceSetLoadEvent; + createEvent(eventInterface: "FormDataEvent"): FormDataEvent; + createEvent(eventInterface: "FrameCrashedEvent"): FrameCrashedEvent; + createEvent(eventInterface: "GPUUncapturedErrorEvent"): GPUUncapturedErrorEvent; + createEvent(eventInterface: "GamepadAxisMoveEvent"): GamepadAxisMoveEvent; + createEvent(eventInterface: "GamepadButtonEvent"): GamepadButtonEvent; + createEvent(eventInterface: "GamepadEvent"): GamepadEvent; + createEvent(eventInterface: "HashChangeEvent"): HashChangeEvent; + createEvent(eventInterface: "IDBVersionChangeEvent"): IDBVersionChangeEvent; + createEvent(eventInterface: "ImageCaptureErrorEvent"): ImageCaptureErrorEvent; + createEvent(eventInterface: "InputEvent"): InputEvent; + createEvent(eventInterface: "KeyboardEvent"): KeyboardEvent; + createEvent(eventInterface: "MIDIConnectionEvent"): MIDIConnectionEvent; + createEvent(eventInterface: "MIDIMessageEvent"): MIDIMessageEvent; + createEvent(eventInterface: "MediaEncryptedEvent"): MediaEncryptedEvent; + createEvent(eventInterface: "MediaKeyMessageEvent"): MediaKeyMessageEvent; + createEvent(eventInterface: "MediaQueryListEvent"): MediaQueryListEvent; + createEvent(eventInterface: "MediaRecorderErrorEvent"): MediaRecorderErrorEvent; + createEvent(eventInterface: "MediaStreamEvent"): MediaStreamEvent; + createEvent(eventInterface: "MediaStreamTrackEvent"): MediaStreamTrackEvent; + createEvent(eventInterface: "MerchantValidationEvent"): MerchantValidationEvent; + createEvent(eventInterface: "MessageEvent"): MessageEvent; + createEvent(eventInterface: "MouseEvent"): MouseEvent; + createEvent(eventInterface: "MouseEvents"): MouseEvent; + createEvent(eventInterface: "MouseScrollEvent"): MouseScrollEvent; + createEvent(eventInterface: "MozSharedMapChangeEvent"): MozSharedMapChangeEvent; + createEvent(eventInterface: "NavigateEvent"): NavigateEvent; createEvent( - eventInterface: 'NavigationCurrentEntryChangeEvent' + eventInterface: "NavigationCurrentEntryChangeEvent" ): NavigationCurrentEntryChangeEvent; - createEvent(eventInterface: 'NotifyPaintEvent'): NotifyPaintEvent; - createEvent(eventInterface: 'OfflineAudioCompletionEvent'): OfflineAudioCompletionEvent; - createEvent(eventInterface: 'PageTransitionEvent'): PageTransitionEvent; - createEvent(eventInterface: 'PaymentMethodChangeEvent'): PaymentMethodChangeEvent; - createEvent(eventInterface: 'PaymentRequestUpdateEvent'): PaymentRequestUpdateEvent; - createEvent(eventInterface: 'PerformanceEntryEvent'): PerformanceEntryEvent; - createEvent(eventInterface: 'PluginCrashedEvent'): PluginCrashedEvent; - createEvent(eventInterface: 'PointerEvent'): PointerEvent; - createEvent(eventInterface: 'PopStateEvent'): PopStateEvent; - createEvent(eventInterface: 'PopupBlockedEvent'): PopupBlockedEvent; - createEvent(eventInterface: 'PopupPositionedEvent'): PopupPositionedEvent; - createEvent(eventInterface: 'PositionStateEvent'): PositionStateEvent; - createEvent(eventInterface: 'ProgressEvent'): ProgressEvent; - createEvent(eventInterface: 'PromiseRejectionEvent'): PromiseRejectionEvent; - createEvent(eventInterface: 'RTCDTMFToneChangeEvent'): RTCDTMFToneChangeEvent; - createEvent(eventInterface: 'RTCDataChannelEvent'): RTCDataChannelEvent; - createEvent(eventInterface: 'RTCPeerConnectionIceEvent'): RTCPeerConnectionIceEvent; - createEvent(eventInterface: 'RTCTrackEvent'): RTCTrackEvent; - createEvent(eventInterface: 'RedirectBlockedEvent'): RedirectBlockedEvent; - createEvent(eventInterface: 'ScrollAreaEvent'): ScrollAreaEvent; - createEvent(eventInterface: 'SecurityPolicyViolationEvent'): SecurityPolicyViolationEvent; - createEvent(eventInterface: 'SimpleGestureEvent'): SimpleGestureEvent; - createEvent(eventInterface: 'SpeechRecognitionEvent'): SpeechRecognitionEvent; - createEvent(eventInterface: 'SpeechSynthesisErrorEvent'): SpeechSynthesisErrorEvent; - createEvent(eventInterface: 'SpeechSynthesisEvent'): SpeechSynthesisEvent; - createEvent(eventInterface: 'StorageEvent'): StorageEvent; - createEvent(eventInterface: 'StreamFilterDataEvent'): StreamFilterDataEvent; + createEvent(eventInterface: "NotifyPaintEvent"): NotifyPaintEvent; + createEvent(eventInterface: "OfflineAudioCompletionEvent"): OfflineAudioCompletionEvent; + createEvent(eventInterface: "PageTransitionEvent"): PageTransitionEvent; + createEvent(eventInterface: "PaymentMethodChangeEvent"): PaymentMethodChangeEvent; + createEvent(eventInterface: "PaymentRequestUpdateEvent"): PaymentRequestUpdateEvent; + createEvent(eventInterface: "PerformanceEntryEvent"): PerformanceEntryEvent; + createEvent(eventInterface: "PluginCrashedEvent"): PluginCrashedEvent; + createEvent(eventInterface: "PointerEvent"): PointerEvent; + createEvent(eventInterface: "PopStateEvent"): PopStateEvent; + createEvent(eventInterface: "PopupBlockedEvent"): PopupBlockedEvent; + createEvent(eventInterface: "PopupPositionedEvent"): PopupPositionedEvent; + createEvent(eventInterface: "PositionStateEvent"): PositionStateEvent; + createEvent(eventInterface: "ProgressEvent"): ProgressEvent; + createEvent(eventInterface: "PromiseRejectionEvent"): PromiseRejectionEvent; + createEvent(eventInterface: "RTCDTMFToneChangeEvent"): RTCDTMFToneChangeEvent; + createEvent(eventInterface: "RTCDataChannelEvent"): RTCDataChannelEvent; + createEvent(eventInterface: "RTCPeerConnectionIceEvent"): RTCPeerConnectionIceEvent; + createEvent(eventInterface: "RTCTrackEvent"): RTCTrackEvent; + createEvent(eventInterface: "RedirectBlockedEvent"): RedirectBlockedEvent; + createEvent(eventInterface: "ScrollAreaEvent"): ScrollAreaEvent; + createEvent(eventInterface: "SecurityPolicyViolationEvent"): SecurityPolicyViolationEvent; + createEvent(eventInterface: "SimpleGestureEvent"): SimpleGestureEvent; + createEvent(eventInterface: "SpeechRecognitionEvent"): SpeechRecognitionEvent; + createEvent(eventInterface: "SpeechSynthesisErrorEvent"): SpeechSynthesisErrorEvent; + createEvent(eventInterface: "SpeechSynthesisEvent"): SpeechSynthesisEvent; + createEvent(eventInterface: "StorageEvent"): StorageEvent; + createEvent(eventInterface: "StreamFilterDataEvent"): StreamFilterDataEvent; createEvent( - eventInterface: 'StyleSheetApplicableStateChangeEvent' + eventInterface: "StyleSheetApplicableStateChangeEvent" ): StyleSheetApplicableStateChangeEvent; - createEvent(eventInterface: 'StyleSheetRemovedEvent'): StyleSheetRemovedEvent; - createEvent(eventInterface: 'SubmitEvent'): SubmitEvent; - createEvent(eventInterface: 'TCPServerSocketEvent'): TCPServerSocketEvent; - createEvent(eventInterface: 'TCPSocketErrorEvent'): TCPSocketErrorEvent; - createEvent(eventInterface: 'TCPSocketEvent'): TCPSocketEvent; - createEvent(eventInterface: 'TaskPriorityChangeEvent'): TaskPriorityChangeEvent; - createEvent(eventInterface: 'TextEvent'): TextEvent; - createEvent(eventInterface: 'TimeEvent'): TimeEvent; - createEvent(eventInterface: 'ToggleEvent'): ToggleEvent; - createEvent(eventInterface: 'TouchEvent'): TouchEvent; - createEvent(eventInterface: 'TrackEvent'): TrackEvent; - createEvent(eventInterface: 'TransitionEvent'): TransitionEvent; - createEvent(eventInterface: 'UDPMessageEvent'): UDPMessageEvent; - createEvent(eventInterface: 'UIEvent'): UIEvent; - createEvent(eventInterface: 'UIEvents'): UIEvent; - createEvent(eventInterface: 'UserProximityEvent'): UserProximityEvent; - createEvent(eventInterface: 'VRDisplayEvent'): VRDisplayEvent; - createEvent(eventInterface: 'WebGLContextEvent'): WebGLContextEvent; - createEvent(eventInterface: 'WheelEvent'): WheelEvent; - createEvent(eventInterface: 'XRInputSourceEvent'): XRInputSourceEvent; - createEvent(eventInterface: 'XRInputSourcesChangeEvent'): XRInputSourcesChangeEvent; - createEvent(eventInterface: 'XRReferenceSpaceEvent'): XRReferenceSpaceEvent; - createEvent(eventInterface: 'XRSessionEvent'): XRSessionEvent; - createEvent(eventInterface: 'XULCommandEvent'): XULCommandEvent; + createEvent(eventInterface: "StyleSheetRemovedEvent"): StyleSheetRemovedEvent; + createEvent(eventInterface: "SubmitEvent"): SubmitEvent; + createEvent(eventInterface: "TCPServerSocketEvent"): TCPServerSocketEvent; + createEvent(eventInterface: "TCPSocketErrorEvent"): TCPSocketErrorEvent; + createEvent(eventInterface: "TCPSocketEvent"): TCPSocketEvent; + createEvent(eventInterface: "TaskPriorityChangeEvent"): TaskPriorityChangeEvent; + createEvent(eventInterface: "TextEvent"): TextEvent; + createEvent(eventInterface: "TimeEvent"): TimeEvent; + createEvent(eventInterface: "ToggleEvent"): ToggleEvent; + createEvent(eventInterface: "TouchEvent"): TouchEvent; + createEvent(eventInterface: "TrackEvent"): TrackEvent; + createEvent(eventInterface: "TransitionEvent"): TransitionEvent; + createEvent(eventInterface: "UDPMessageEvent"): UDPMessageEvent; + createEvent(eventInterface: "UIEvent"): UIEvent; + createEvent(eventInterface: "UIEvents"): UIEvent; + createEvent(eventInterface: "UserProximityEvent"): UserProximityEvent; + createEvent(eventInterface: "VRDisplayEvent"): VRDisplayEvent; + createEvent(eventInterface: "WebGLContextEvent"): WebGLContextEvent; + createEvent(eventInterface: "WheelEvent"): WheelEvent; + createEvent(eventInterface: "XRInputSourceEvent"): XRInputSourceEvent; + createEvent(eventInterface: "XRInputSourcesChangeEvent"): XRInputSourcesChangeEvent; + createEvent(eventInterface: "XRReferenceSpaceEvent"): XRReferenceSpaceEvent; + createEvent(eventInterface: "XRSessionEvent"): XRSessionEvent; + createEvent(eventInterface: "XULCommandEvent"): XULCommandEvent; createEvent(eventInterface: string): Event; createNodeIterator(root: Node, whatToShow?: number, filter?: NodeFilter | null): NodeIterator; createProcessingInstruction(target: string, data: string): ProcessingInstruction; @@ -32719,7 +32719,7 @@ interface Console { warn(...data: any[]): void; } -declare var console: Console; +declare let console: Console; interface AnyCallback { (value: any): any; @@ -33146,13 +33146,13 @@ interface MathMLElementTagNameMap {} type ElementTagNameMap = HTMLElementTagNameMap & Pick>; -declare var Audio: { +declare let Audio: { new (src?: string): HTMLAudioElement; }; -declare var Image: { +declare let Image: { new (width?: number, height?: number): HTMLImageElement; }; -declare var Option: { +declare let Option: { new ( text?: string, value?: string, @@ -33160,103 +33160,103 @@ declare var Option: { selected?: boolean ): HTMLOptionElement; }; -declare var webkitSpeechGrammar: { +declare let webkitSpeechGrammar: { new (): SpeechGrammar; }; -declare var webkitSpeechGrammarList: { +declare let webkitSpeechGrammarList: { new (): SpeechGrammarList; }; -declare var webkitSpeechRecognition: { +declare let webkitSpeechRecognition: { new (): SpeechRecognition; }; -declare var Glean: GleanImpl; -declare var GleanPings: GleanPingsImpl; -declare var InstallTrigger: any; -declare var browserDOMWindow: nsIBrowserDOMWindow | null; -declare var browsingContext: BrowsingContext; -declare var clientInformation: Navigator; -declare var clientPrincipal: Principal | null; -declare var closed: boolean; -declare var content: any; -declare var controllers: XULControllers; -declare var cookieStore: CookieStore; -declare var customElements: CustomElementRegistry; -declare var desktopToDeviceScale: number; -declare var devicePixelRatio: number; -declare var docShell: nsIDocShell | null; -declare var document: Document | null; -declare var event: Event | undefined; -declare var external: External; -declare var frameElement: Element | null; -declare var frames: WindowProxy; -declare var fullScreen: boolean; -declare var history: History; -declare var innerHeight: number; -declare var innerWidth: number; -declare var intlUtils: IntlUtils; -declare var isChromeWindow: boolean; -declare var isCloaked: boolean; -declare var isFullyOccluded: boolean; -declare var isInFullScreenTransition: boolean; -declare var length: number; -declare var location: Location; -declare var locationbar: BarProp; -declare var menubar: BarProp; -declare var messageManager: ChromeMessageBroadcaster; -declare var mozInnerScreenX: number; -declare var mozInnerScreenY: number; +declare let Glean: GleanImpl; +declare let GleanPings: GleanPingsImpl; +declare let InstallTrigger: any; +declare let browserDOMWindow: nsIBrowserDOMWindow | null; +declare let browsingContext: BrowsingContext; +declare let clientInformation: Navigator; +declare let clientPrincipal: Principal | null; +declare let closed: boolean; +declare let content: any; +declare let controllers: XULControllers; +declare let cookieStore: CookieStore; +declare let customElements: CustomElementRegistry; +declare let desktopToDeviceScale: number; +declare let devicePixelRatio: number; +declare let docShell: nsIDocShell | null; +declare let document: Document | null; +declare let event: Event | undefined; +declare let external: External; +declare let frameElement: Element | null; +declare let frames: WindowProxy; +declare let fullScreen: boolean; +declare let history: History; +declare let innerHeight: number; +declare let innerWidth: number; +declare let intlUtils: IntlUtils; +declare let isChromeWindow: boolean; +declare let isCloaked: boolean; +declare let isFullyOccluded: boolean; +declare let isInFullScreenTransition: boolean; +declare let length: number; +declare let location: Location; +declare let locationbar: BarProp; +declare let menubar: BarProp; +declare let messageManager: ChromeMessageBroadcaster; +declare let mozInnerScreenX: number; +declare let mozInnerScreenY: number; /** @deprecated */ declare const name: void; -declare var navigation: Navigation; -declare var navigator: Navigator; -declare var ondevicelight: ((this: Window, ev: Event) => any) | null; -declare var ondevicemotion: ((this: Window, ev: Event) => any) | null; -declare var ondeviceorientation: ((this: Window, ev: Event) => any) | null; -declare var ondeviceorientationabsolute: ((this: Window, ev: Event) => any) | null; -declare var onorientationchange: ((this: Window, ev: Event) => any) | null; -declare var onuserproximity: ((this: Window, ev: Event) => any) | null; -declare var onvrdisplayactivate: ((this: Window, ev: Event) => any) | null; -declare var onvrdisplayconnect: ((this: Window, ev: Event) => any) | null; -declare var onvrdisplaydeactivate: ((this: Window, ev: Event) => any) | null; -declare var onvrdisplaydisconnect: ((this: Window, ev: Event) => any) | null; -declare var onvrdisplaypresentchange: ((this: Window, ev: Event) => any) | null; -declare var opener: any; -declare var orientation: number; -declare var originAgentCluster: boolean; -declare var outerHeight: number; -declare var outerWidth: number; -declare var pageXOffset: number; -declare var pageYOffset: number; -declare var paintWorklet: Worklet; -declare var parent: WindowProxy | null; -declare var performance: Performance | null; -declare var personalbar: BarProp; -declare var realFrameElement: Element | null; -declare var screen: Screen; -declare var screenEdgeSlopX: number; -declare var screenEdgeSlopY: number; -declare var screenLeft: number; -declare var screenTop: number; -declare var screenX: number; -declare var screenY: number; -declare var scrollMaxX: number; -declare var scrollMaxY: number; -declare var scrollMinX: number; -declare var scrollMinY: number; -declare var scrollX: number; -declare var scrollY: number; -declare var scrollbars: BarProp; -declare var self: WindowProxy; -declare var status: string; -declare var statusbar: BarProp; -declare var toolbar: BarProp; -declare var top: WindowProxy | null; -declare var visualViewport: VisualViewport; -declare var window: WindowProxy; -declare var windowGlobalChild: WindowGlobalChild | null; -declare var windowRoot: WindowRoot | null; -declare var windowState: number; -declare var windowUtils: nsIDOMWindowUtils; +declare let navigation: Navigation; +declare let navigator: Navigator; +declare let ondevicelight: ((this: Window, ev: Event) => any) | null; +declare let ondevicemotion: ((this: Window, ev: Event) => any) | null; +declare let ondeviceorientation: ((this: Window, ev: Event) => any) | null; +declare let ondeviceorientationabsolute: ((this: Window, ev: Event) => any) | null; +declare let onorientationchange: ((this: Window, ev: Event) => any) | null; +declare let onuserproximity: ((this: Window, ev: Event) => any) | null; +declare let onvrdisplayactivate: ((this: Window, ev: Event) => any) | null; +declare let onvrdisplayconnect: ((this: Window, ev: Event) => any) | null; +declare let onvrdisplaydeactivate: ((this: Window, ev: Event) => any) | null; +declare let onvrdisplaydisconnect: ((this: Window, ev: Event) => any) | null; +declare let onvrdisplaypresentchange: ((this: Window, ev: Event) => any) | null; +declare let opener: any; +declare let orientation: number; +declare let originAgentCluster: boolean; +declare let outerHeight: number; +declare let outerWidth: number; +declare let pageXOffset: number; +declare let pageYOffset: number; +declare let paintWorklet: Worklet; +declare let parent: WindowProxy | null; +declare let performance: Performance | null; +declare let personalbar: BarProp; +declare let realFrameElement: Element | null; +declare let screen: Screen; +declare let screenEdgeSlopX: number; +declare let screenEdgeSlopY: number; +declare let screenLeft: number; +declare let screenTop: number; +declare let screenX: number; +declare let screenY: number; +declare let scrollMaxX: number; +declare let scrollMaxY: number; +declare let scrollMinX: number; +declare let scrollMinY: number; +declare let scrollX: number; +declare let scrollY: number; +declare let scrollbars: BarProp; +declare let self: WindowProxy; +declare let status: string; +declare let statusbar: BarProp; +declare let toolbar: BarProp; +declare let top: WindowProxy | null; +declare let visualViewport: VisualViewport; +declare let window: WindowProxy; +declare let windowGlobalChild: WindowGlobalChild | null; +declare let windowRoot: WindowRoot | null; +declare let windowState: number; +declare let windowUtils: nsIDOMWindowUtils; declare function alert(): void; declare function alert(message: string): void; declare function blur(): void; @@ -33348,146 +33348,146 @@ declare function synthesizeMouseEvent( ): boolean; declare function updateCommands(action: string): void; declare function toString(): string; -declare var ownerGlobal: WindowProxy | null; +declare let ownerGlobal: WindowProxy | null; declare function dispatchEvent(event: Event): boolean; declare function getEventHandler(type: string): EventHandler; declare function setEventHandler(type: string, handler: EventHandler): void; declare function cancelAnimationFrame(handle: number): void; declare function requestAnimationFrame(callback: FrameRequestCallback): number; -declare var crypto: Crypto; -declare var onabort: ((this: Window, ev: Event) => any) | null; -declare var onanimationcancel: ((this: Window, ev: Event) => any) | null; -declare var onanimationend: ((this: Window, ev: Event) => any) | null; -declare var onanimationiteration: ((this: Window, ev: Event) => any) | null; -declare var onanimationstart: ((this: Window, ev: Event) => any) | null; -declare var onauxclick: ((this: Window, ev: Event) => any) | null; -declare var onbeforeinput: ((this: Window, ev: Event) => any) | null; -declare var onbeforematch: ((this: Window, ev: Event) => any) | null; -declare var onbeforetoggle: ((this: Window, ev: Event) => any) | null; -declare var onblur: ((this: Window, ev: Event) => any) | null; -declare var oncancel: ((this: Window, ev: Event) => any) | null; -declare var oncanplay: ((this: Window, ev: Event) => any) | null; -declare var oncanplaythrough: ((this: Window, ev: Event) => any) | null; -declare var onchange: ((this: Window, ev: Event) => any) | null; -declare var onclick: ((this: Window, ev: Event) => any) | null; -declare var onclose: ((this: Window, ev: Event) => any) | null; -declare var oncommand: ((this: Window, ev: Event) => any) | null; -declare var oncontentvisibilityautostatechange: ((this: Window, ev: Event) => any) | null; -declare var oncontextlost: ((this: Window, ev: Event) => any) | null; -declare var oncontextmenu: ((this: Window, ev: Event) => any) | null; -declare var oncontextrestored: ((this: Window, ev: Event) => any) | null; -declare var oncopy: ((this: Window, ev: Event) => any) | null; -declare var oncuechange: ((this: Window, ev: Event) => any) | null; -declare var oncut: ((this: Window, ev: Event) => any) | null; -declare var ondblclick: ((this: Window, ev: Event) => any) | null; -declare var ondrag: ((this: Window, ev: Event) => any) | null; -declare var ondragend: ((this: Window, ev: Event) => any) | null; -declare var ondragenter: ((this: Window, ev: Event) => any) | null; -declare var ondragexit: ((this: Window, ev: Event) => any) | null; -declare var ondragleave: ((this: Window, ev: Event) => any) | null; -declare var ondragover: ((this: Window, ev: Event) => any) | null; -declare var ondragstart: ((this: Window, ev: Event) => any) | null; -declare var ondrop: ((this: Window, ev: Event) => any) | null; -declare var ondurationchange: ((this: Window, ev: Event) => any) | null; -declare var onemptied: ((this: Window, ev: Event) => any) | null; -declare var onended: ((this: Window, ev: Event) => any) | null; -declare var onfocus: ((this: Window, ev: Event) => any) | null; -declare var onformdata: ((this: Window, ev: Event) => any) | null; -declare var ongotpointercapture: ((this: Window, ev: Event) => any) | null; -declare var oninput: ((this: Window, ev: Event) => any) | null; -declare var oninvalid: ((this: Window, ev: Event) => any) | null; -declare var onkeydown: ((this: Window, ev: Event) => any) | null; -declare var onkeypress: ((this: Window, ev: Event) => any) | null; -declare var onkeyup: ((this: Window, ev: Event) => any) | null; -declare var onload: ((this: Window, ev: Event) => any) | null; -declare var onloadeddata: ((this: Window, ev: Event) => any) | null; -declare var onloadedmetadata: ((this: Window, ev: Event) => any) | null; -declare var onloadstart: ((this: Window, ev: Event) => any) | null; -declare var onlostpointercapture: ((this: Window, ev: Event) => any) | null; -declare var onmousedown: ((this: Window, ev: Event) => any) | null; -declare var onmouseenter: ((this: Window, ev: Event) => any) | null; -declare var onmouseleave: ((this: Window, ev: Event) => any) | null; -declare var onmousemove: ((this: Window, ev: Event) => any) | null; -declare var onmouseout: ((this: Window, ev: Event) => any) | null; -declare var onmouseover: ((this: Window, ev: Event) => any) | null; -declare var onmouseup: ((this: Window, ev: Event) => any) | null; -declare var onmozfullscreenchange: ((this: Window, ev: Event) => any) | null; -declare var onmozfullscreenerror: ((this: Window, ev: Event) => any) | null; -declare var onpaste: ((this: Window, ev: Event) => any) | null; -declare var onpause: ((this: Window, ev: Event) => any) | null; -declare var onplay: ((this: Window, ev: Event) => any) | null; -declare var onplaying: ((this: Window, ev: Event) => any) | null; -declare var onpointercancel: ((this: Window, ev: Event) => any) | null; -declare var onpointerdown: ((this: Window, ev: Event) => any) | null; -declare var onpointerenter: ((this: Window, ev: Event) => any) | null; -declare var onpointerleave: ((this: Window, ev: Event) => any) | null; -declare var onpointermove: ((this: Window, ev: Event) => any) | null; -declare var onpointerout: ((this: Window, ev: Event) => any) | null; -declare var onpointerover: ((this: Window, ev: Event) => any) | null; +declare let crypto: Crypto; +declare let onabort: ((this: Window, ev: Event) => any) | null; +declare let onanimationcancel: ((this: Window, ev: Event) => any) | null; +declare let onanimationend: ((this: Window, ev: Event) => any) | null; +declare let onanimationiteration: ((this: Window, ev: Event) => any) | null; +declare let onanimationstart: ((this: Window, ev: Event) => any) | null; +declare let onauxclick: ((this: Window, ev: Event) => any) | null; +declare let onbeforeinput: ((this: Window, ev: Event) => any) | null; +declare let onbeforematch: ((this: Window, ev: Event) => any) | null; +declare let onbeforetoggle: ((this: Window, ev: Event) => any) | null; +declare let onblur: ((this: Window, ev: Event) => any) | null; +declare let oncancel: ((this: Window, ev: Event) => any) | null; +declare let oncanplay: ((this: Window, ev: Event) => any) | null; +declare let oncanplaythrough: ((this: Window, ev: Event) => any) | null; +declare let onchange: ((this: Window, ev: Event) => any) | null; +declare let onclick: ((this: Window, ev: Event) => any) | null; +declare let onclose: ((this: Window, ev: Event) => any) | null; +declare let oncommand: ((this: Window, ev: Event) => any) | null; +declare let oncontentvisibilityautostatechange: ((this: Window, ev: Event) => any) | null; +declare let oncontextlost: ((this: Window, ev: Event) => any) | null; +declare let oncontextmenu: ((this: Window, ev: Event) => any) | null; +declare let oncontextrestored: ((this: Window, ev: Event) => any) | null; +declare let oncopy: ((this: Window, ev: Event) => any) | null; +declare let oncuechange: ((this: Window, ev: Event) => any) | null; +declare let oncut: ((this: Window, ev: Event) => any) | null; +declare let ondblclick: ((this: Window, ev: Event) => any) | null; +declare let ondrag: ((this: Window, ev: Event) => any) | null; +declare let ondragend: ((this: Window, ev: Event) => any) | null; +declare let ondragenter: ((this: Window, ev: Event) => any) | null; +declare let ondragexit: ((this: Window, ev: Event) => any) | null; +declare let ondragleave: ((this: Window, ev: Event) => any) | null; +declare let ondragover: ((this: Window, ev: Event) => any) | null; +declare let ondragstart: ((this: Window, ev: Event) => any) | null; +declare let ondrop: ((this: Window, ev: Event) => any) | null; +declare let ondurationchange: ((this: Window, ev: Event) => any) | null; +declare let onemptied: ((this: Window, ev: Event) => any) | null; +declare let onended: ((this: Window, ev: Event) => any) | null; +declare let onfocus: ((this: Window, ev: Event) => any) | null; +declare let onformdata: ((this: Window, ev: Event) => any) | null; +declare let ongotpointercapture: ((this: Window, ev: Event) => any) | null; +declare let oninput: ((this: Window, ev: Event) => any) | null; +declare let oninvalid: ((this: Window, ev: Event) => any) | null; +declare let onkeydown: ((this: Window, ev: Event) => any) | null; +declare let onkeypress: ((this: Window, ev: Event) => any) | null; +declare let onkeyup: ((this: Window, ev: Event) => any) | null; +declare let onload: ((this: Window, ev: Event) => any) | null; +declare let onloadeddata: ((this: Window, ev: Event) => any) | null; +declare let onloadedmetadata: ((this: Window, ev: Event) => any) | null; +declare let onloadstart: ((this: Window, ev: Event) => any) | null; +declare let onlostpointercapture: ((this: Window, ev: Event) => any) | null; +declare let onmousedown: ((this: Window, ev: Event) => any) | null; +declare let onmouseenter: ((this: Window, ev: Event) => any) | null; +declare let onmouseleave: ((this: Window, ev: Event) => any) | null; +declare let onmousemove: ((this: Window, ev: Event) => any) | null; +declare let onmouseout: ((this: Window, ev: Event) => any) | null; +declare let onmouseover: ((this: Window, ev: Event) => any) | null; +declare let onmouseup: ((this: Window, ev: Event) => any) | null; +declare let onmozfullscreenchange: ((this: Window, ev: Event) => any) | null; +declare let onmozfullscreenerror: ((this: Window, ev: Event) => any) | null; +declare let onpaste: ((this: Window, ev: Event) => any) | null; +declare let onpause: ((this: Window, ev: Event) => any) | null; +declare let onplay: ((this: Window, ev: Event) => any) | null; +declare let onplaying: ((this: Window, ev: Event) => any) | null; +declare let onpointercancel: ((this: Window, ev: Event) => any) | null; +declare let onpointerdown: ((this: Window, ev: Event) => any) | null; +declare let onpointerenter: ((this: Window, ev: Event) => any) | null; +declare let onpointerleave: ((this: Window, ev: Event) => any) | null; +declare let onpointermove: ((this: Window, ev: Event) => any) | null; +declare let onpointerout: ((this: Window, ev: Event) => any) | null; +declare let onpointerover: ((this: Window, ev: Event) => any) | null; /** Available only in secure contexts. */ -declare var onpointerrawupdate: ((this: Window, ev: Event) => any) | null; -declare var onpointerup: ((this: Window, ev: Event) => any) | null; -declare var onprogress: ((this: Window, ev: Event) => any) | null; -declare var onratechange: ((this: Window, ev: Event) => any) | null; -declare var onreset: ((this: Window, ev: Event) => any) | null; -declare var onresize: ((this: Window, ev: Event) => any) | null; -declare var onscroll: ((this: Window, ev: Event) => any) | null; -declare var onscrollend: ((this: Window, ev: Event) => any) | null; -declare var onsecuritypolicyviolation: ((this: Window, ev: Event) => any) | null; -declare var onseeked: ((this: Window, ev: Event) => any) | null; -declare var onseeking: ((this: Window, ev: Event) => any) | null; -declare var onselect: ((this: Window, ev: Event) => any) | null; -declare var onselectionchange: ((this: Window, ev: Event) => any) | null; -declare var onselectstart: ((this: Window, ev: Event) => any) | null; -declare var onslotchange: ((this: Window, ev: Event) => any) | null; -declare var onstalled: ((this: Window, ev: Event) => any) | null; -declare var onsubmit: ((this: Window, ev: Event) => any) | null; -declare var onsuspend: ((this: Window, ev: Event) => any) | null; -declare var ontimeupdate: ((this: Window, ev: Event) => any) | null; -declare var ontoggle: ((this: Window, ev: Event) => any) | null; -declare var ontransitioncancel: ((this: Window, ev: Event) => any) | null; -declare var ontransitionend: ((this: Window, ev: Event) => any) | null; -declare var ontransitionrun: ((this: Window, ev: Event) => any) | null; -declare var ontransitionstart: ((this: Window, ev: Event) => any) | null; -declare var onvolumechange: ((this: Window, ev: Event) => any) | null; -declare var onwaiting: ((this: Window, ev: Event) => any) | null; -declare var onwebkitanimationend: ((this: Window, ev: Event) => any) | null; -declare var onwebkitanimationiteration: ((this: Window, ev: Event) => any) | null; -declare var onwebkitanimationstart: ((this: Window, ev: Event) => any) | null; -declare var onwebkittransitionend: ((this: Window, ev: Event) => any) | null; -declare var onwheel: ((this: Window, ev: Event) => any) | null; -declare var onerror: ((this: Window, ev: Event) => any) | null; -declare var speechSynthesis: SpeechSynthesis; -declare var ontouchcancel: ((this: Window, ev: Event) => any) | null; -declare var ontouchend: ((this: Window, ev: Event) => any) | null; -declare var ontouchmove: ((this: Window, ev: Event) => any) | null; -declare var ontouchstart: ((this: Window, ev: Event) => any) | null; -declare var onafterprint: ((this: Window, ev: Event) => any) | null; -declare var onbeforeprint: ((this: Window, ev: Event) => any) | null; -declare var onbeforeunload: ((this: Window, ev: Event) => any) | null; -declare var ongamepadconnected: ((this: Window, ev: Event) => any) | null; -declare var ongamepaddisconnected: ((this: Window, ev: Event) => any) | null; -declare var onhashchange: ((this: Window, ev: Event) => any) | null; -declare var onlanguagechange: ((this: Window, ev: Event) => any) | null; -declare var onmessage: ((this: Window, ev: Event) => any) | null; -declare var onmessageerror: ((this: Window, ev: Event) => any) | null; -declare var onoffline: ((this: Window, ev: Event) => any) | null; -declare var ononline: ((this: Window, ev: Event) => any) | null; -declare var onpagehide: ((this: Window, ev: Event) => any) | null; -declare var onpageshow: ((this: Window, ev: Event) => any) | null; -declare var onpopstate: ((this: Window, ev: Event) => any) | null; -declare var onrejectionhandled: ((this: Window, ev: Event) => any) | null; -declare var onstorage: ((this: Window, ev: Event) => any) | null; -declare var onunhandledrejection: ((this: Window, ev: Event) => any) | null; -declare var onunload: ((this: Window, ev: Event) => any) | null; -declare var localStorage: Storage | null; -declare var caches: CacheStorage; -declare var crossOriginIsolated: boolean; -declare var indexedDB: IDBFactory | null; -declare var isSecureContext: boolean; -declare var origin: string; -declare var scheduler: Scheduler; -declare var trustedTypes: TrustedTypePolicyFactory; +declare let onpointerrawupdate: ((this: Window, ev: Event) => any) | null; +declare let onpointerup: ((this: Window, ev: Event) => any) | null; +declare let onprogress: ((this: Window, ev: Event) => any) | null; +declare let onratechange: ((this: Window, ev: Event) => any) | null; +declare let onreset: ((this: Window, ev: Event) => any) | null; +declare let onresize: ((this: Window, ev: Event) => any) | null; +declare let onscroll: ((this: Window, ev: Event) => any) | null; +declare let onscrollend: ((this: Window, ev: Event) => any) | null; +declare let onsecuritypolicyviolation: ((this: Window, ev: Event) => any) | null; +declare let onseeked: ((this: Window, ev: Event) => any) | null; +declare let onseeking: ((this: Window, ev: Event) => any) | null; +declare let onselect: ((this: Window, ev: Event) => any) | null; +declare let onselectionchange: ((this: Window, ev: Event) => any) | null; +declare let onselectstart: ((this: Window, ev: Event) => any) | null; +declare let onslotchange: ((this: Window, ev: Event) => any) | null; +declare let onstalled: ((this: Window, ev: Event) => any) | null; +declare let onsubmit: ((this: Window, ev: Event) => any) | null; +declare let onsuspend: ((this: Window, ev: Event) => any) | null; +declare let ontimeupdate: ((this: Window, ev: Event) => any) | null; +declare let ontoggle: ((this: Window, ev: Event) => any) | null; +declare let ontransitioncancel: ((this: Window, ev: Event) => any) | null; +declare let ontransitionend: ((this: Window, ev: Event) => any) | null; +declare let ontransitionrun: ((this: Window, ev: Event) => any) | null; +declare let ontransitionstart: ((this: Window, ev: Event) => any) | null; +declare let onvolumechange: ((this: Window, ev: Event) => any) | null; +declare let onwaiting: ((this: Window, ev: Event) => any) | null; +declare let onwebkitanimationend: ((this: Window, ev: Event) => any) | null; +declare let onwebkitanimationiteration: ((this: Window, ev: Event) => any) | null; +declare let onwebkitanimationstart: ((this: Window, ev: Event) => any) | null; +declare let onwebkittransitionend: ((this: Window, ev: Event) => any) | null; +declare let onwheel: ((this: Window, ev: Event) => any) | null; +declare let onerror: ((this: Window, ev: Event) => any) | null; +declare let speechSynthesis: SpeechSynthesis; +declare let ontouchcancel: ((this: Window, ev: Event) => any) | null; +declare let ontouchend: ((this: Window, ev: Event) => any) | null; +declare let ontouchmove: ((this: Window, ev: Event) => any) | null; +declare let ontouchstart: ((this: Window, ev: Event) => any) | null; +declare let onafterprint: ((this: Window, ev: Event) => any) | null; +declare let onbeforeprint: ((this: Window, ev: Event) => any) | null; +declare let onbeforeunload: ((this: Window, ev: Event) => any) | null; +declare let ongamepadconnected: ((this: Window, ev: Event) => any) | null; +declare let ongamepaddisconnected: ((this: Window, ev: Event) => any) | null; +declare let onhashchange: ((this: Window, ev: Event) => any) | null; +declare let onlanguagechange: ((this: Window, ev: Event) => any) | null; +declare let onmessage: ((this: Window, ev: Event) => any) | null; +declare let onmessageerror: ((this: Window, ev: Event) => any) | null; +declare let onoffline: ((this: Window, ev: Event) => any) | null; +declare let ononline: ((this: Window, ev: Event) => any) | null; +declare let onpagehide: ((this: Window, ev: Event) => any) | null; +declare let onpageshow: ((this: Window, ev: Event) => any) | null; +declare let onpopstate: ((this: Window, ev: Event) => any) | null; +declare let onrejectionhandled: ((this: Window, ev: Event) => any) | null; +declare let onstorage: ((this: Window, ev: Event) => any) | null; +declare let onunhandledrejection: ((this: Window, ev: Event) => any) | null; +declare let onunload: ((this: Window, ev: Event) => any) | null; +declare let localStorage: Storage | null; +declare let caches: CacheStorage; +declare let crossOriginIsolated: boolean; +declare let indexedDB: IDBFactory | null; +declare let isSecureContext: boolean; +declare let origin: string; +declare let scheduler: Scheduler; +declare let trustedTypes: TrustedTypePolicyFactory; declare function atob(atob: string): string; declare function btoa(btoa: string): string; declare function clearInterval(handle?: number): void; @@ -33511,7 +33511,7 @@ declare function reportError(e: any): void; declare function setInterval(handler: TimerHandler, timeout?: number, ...unused: any[]): number; declare function setTimeout(handler: TimerHandler, timeout?: number, ...arguments: any[]): number; declare function structuredClone(value: any, options?: StructuredSerializeOptions): any; -declare var sessionStorage: Storage | null; +declare let sessionStorage: Storage | null; declare function addEventListener( type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, @@ -33698,932 +33698,932 @@ type XSLTParameterValue = number | boolean | string | Node | Node[] | XPathResul type XULCommandDispatcher = nsIDOMXULCommandDispatcher; type XULControllers = nsIControllers; type nsContentPolicyType = number; -type AlignSetting = 'center' | 'end' | 'left' | 'right' | 'start'; -type AlphaOption = 'discard' | 'keep'; -type AnimationPlayState = 'finished' | 'idle' | 'paused' | 'running'; -type AnimationReplaceState = 'active' | 'persisted' | 'removed'; -type AudioContextState = 'closed' | 'running' | 'suspended'; +type AlignSetting = "center" | "end" | "left" | "right" | "start"; +type AlphaOption = "discard" | "keep"; +type AnimationPlayState = "finished" | "idle" | "paused" | "running"; +type AnimationReplaceState = "active" | "persisted" | "removed"; +type AudioContextState = "closed" | "running" | "suspended"; type AudioSampleFormat = - | 'f32' - | 'f32-planar' - | 's16' - | 's16-planar' - | 's32' - | 's32-planar' - | 'u8' - | 'u8-planar'; -type AutoKeyword = 'auto'; -type AutoplayPolicy = 'allowed' | 'allowed-muted' | 'disallowed'; -type AutoplayPolicyMediaType = 'audiocontext' | 'mediaelement'; -type AvcBitstreamFormat = 'annexb' | 'avc'; -type Base64URLDecodePadding = 'ignore' | 'reject' | 'require'; -type BinaryType = 'arraybuffer' | 'blob'; + | "f32" + | "f32-planar" + | "s16" + | "s16-planar" + | "s32" + | "s32-planar" + | "u8" + | "u8-planar"; +type AutoKeyword = "auto"; +type AutoplayPolicy = "allowed" | "allowed-muted" | "disallowed"; +type AutoplayPolicyMediaType = "audiocontext" | "mediaelement"; +type AvcBitstreamFormat = "annexb" | "avc"; +type Base64URLDecodePadding = "ignore" | "reject" | "require"; +type BinaryType = "arraybuffer" | "blob"; type BiquadFilterType = - | 'allpass' - | 'bandpass' - | 'highpass' - | 'highshelf' - | 'lowpass' - | 'lowshelf' - | 'notch' - | 'peaking'; -type BitrateMode = 'constant' | 'variable'; -type CSSBoxType = 'border' | 'content' | 'margin' | 'padding'; -type CSSMathOperator = 'clamp' | 'invert' | 'max' | 'min' | 'negate' | 'product' | 'sum'; + | "allpass" + | "bandpass" + | "highpass" + | "highshelf" + | "lowpass" + | "lowshelf" + | "notch" + | "peaking"; +type BitrateMode = "constant" | "variable"; +type CSSBoxType = "border" | "content" | "margin" | "padding"; +type CSSMathOperator = "clamp" | "invert" | "max" | "min" | "negate" | "product" | "sum"; type CSSNumericBaseType = - | 'angle' - | 'flex' - | 'frequency' - | 'length' - | 'percent' - | 'resolution' - | 'time'; -type CSSStyleSheetParsingMode = 'agent' | 'author' | 'user'; -type CacheStorageNamespace = 'chrome' | 'content'; -type CallbackDebuggerNotificationPhase = 'post' | 'pre'; -type CanvasContextProperties = 'both' | 'fill' | 'none' | 'stroke'; -type CanvasDirection = 'inherit' | 'ltr' | 'rtl'; -type CanvasFontKerning = 'auto' | 'none' | 'normal'; + | "angle" + | "flex" + | "frequency" + | "length" + | "percent" + | "resolution" + | "time"; +type CSSStyleSheetParsingMode = "agent" | "author" | "user"; +type CacheStorageNamespace = "chrome" | "content"; +type CallbackDebuggerNotificationPhase = "post" | "pre"; +type CanvasContextProperties = "both" | "fill" | "none" | "stroke"; +type CanvasDirection = "inherit" | "ltr" | "rtl"; +type CanvasFontKerning = "auto" | "none" | "normal"; type CanvasFontStretch = - | 'condensed' - | 'expanded' - | 'extra-condensed' - | 'extra-expanded' - | 'normal' - | 'semi-condensed' - | 'semi-expanded' - | 'ultra-condensed' - | 'ultra-expanded'; + | "condensed" + | "expanded" + | "extra-condensed" + | "extra-expanded" + | "normal" + | "semi-condensed" + | "semi-expanded" + | "ultra-condensed" + | "ultra-expanded"; type CanvasFontVariantCaps = - | 'all-petite-caps' - | 'all-small-caps' - | 'normal' - | 'petite-caps' - | 'small-caps' - | 'titling-caps' - | 'unicase'; -type CanvasLineCap = 'butt' | 'round' | 'square'; -type CanvasLineJoin = 'bevel' | 'miter' | 'round'; -type CanvasTextAlign = 'center' | 'end' | 'left' | 'right' | 'start'; -type CanvasTextBaseline = 'alphabetic' | 'bottom' | 'hanging' | 'ideographic' | 'middle' | 'top'; -type CanvasTextRendering = 'auto' | 'geometricPrecision' | 'optimizeLegibility' | 'optimizeSpeed'; -type CanvasWindingRule = 'evenodd' | 'nonzero'; + | "all-petite-caps" + | "all-small-caps" + | "normal" + | "petite-caps" + | "small-caps" + | "titling-caps" + | "unicase"; +type CanvasLineCap = "butt" | "round" | "square"; +type CanvasLineJoin = "bevel" | "miter" | "round"; +type CanvasTextAlign = "center" | "end" | "left" | "right" | "start"; +type CanvasTextBaseline = "alphabetic" | "bottom" | "hanging" | "ideographic" | "middle" | "top"; +type CanvasTextRendering = "auto" | "geometricPrecision" | "optimizeLegibility" | "optimizeSpeed"; +type CanvasWindingRule = "evenodd" | "nonzero"; type CaretChangedReason = - | 'dragcaret' - | 'longpressonemptycontent' - | 'presscaret' - | 'releasecaret' - | 'scroll' - | 'taponcaret' - | 'updateposition' - | 'visibilitychange'; -type ChannelCountMode = 'clamped-max' | 'explicit' | 'max'; -type ChannelInterpretation = 'discrete' | 'speakers'; -type CheckerboardReason = 'recent' | 'severe'; -type CodecState = 'closed' | 'configured' | 'unconfigured'; -type ColorGamut = 'p3' | 'rec2020' | 'srgb'; -type ColorSpaceConversion = 'default' | 'none'; -type CompositeOperation = 'accumulate' | 'add' | 'replace'; -type CompressionFormat = 'deflate' | 'deflate-raw' | 'gzip' | 'zstd'; -type ConnectionType = 'bluetooth' | 'cellular' | 'ethernet' | 'none' | 'other' | 'unknown' | 'wifi'; -type ConsoleLevel = 'error' | 'log' | 'warning'; + | "dragcaret" + | "longpressonemptycontent" + | "presscaret" + | "releasecaret" + | "scroll" + | "taponcaret" + | "updateposition" + | "visibilitychange"; +type ChannelCountMode = "clamped-max" | "explicit" | "max"; +type ChannelInterpretation = "discrete" | "speakers"; +type CheckerboardReason = "recent" | "severe"; +type CodecState = "closed" | "configured" | "unconfigured"; +type ColorGamut = "p3" | "rec2020" | "srgb"; +type ColorSpaceConversion = "default" | "none"; +type CompositeOperation = "accumulate" | "add" | "replace"; +type CompressionFormat = "deflate" | "deflate-raw" | "gzip" | "zstd"; +type ConnectionType = "bluetooth" | "cellular" | "ethernet" | "none" | "other" | "unknown" | "wifi"; +type ConsoleLevel = "error" | "log" | "warning"; type ConsoleLogLevel = - | 'All' - | 'Clear' - | 'Debug' - | 'Dir' - | 'Dirxml' - | 'Error' - | 'Group' - | 'GroupEnd' - | 'Info' - | 'Log' - | 'Off' - | 'Profile' - | 'ProfileEnd' - | 'Time' - | 'TimeEnd' - | 'TimeLog' - | 'Trace' - | 'Warn'; -type ContentScriptCssOrigin = 'author' | 'user'; -type ContentScriptExecutionWorld = 'ISOLATED' | 'MAIN' | 'USER_SCRIPT'; -type ContentScriptRunAt = 'document_end' | 'document_idle' | 'document_start'; -type CookieSameSite = 'lax' | 'none' | 'strict'; -type CredentialMediationRequirement = 'conditional' | 'optional' | 'required' | 'silent'; + | "All" + | "Clear" + | "Debug" + | "Dir" + | "Dirxml" + | "Error" + | "Group" + | "GroupEnd" + | "Info" + | "Log" + | "Off" + | "Profile" + | "ProfileEnd" + | "Time" + | "TimeEnd" + | "TimeLog" + | "Trace" + | "Warn"; +type ContentScriptCssOrigin = "author" | "user"; +type ContentScriptExecutionWorld = "ISOLATED" | "MAIN" | "USER_SCRIPT"; +type ContentScriptRunAt = "document_end" | "document_idle" | "document_start"; +type CookieSameSite = "lax" | "none" | "strict"; +type CredentialMediationRequirement = "conditional" | "optional" | "required" | "silent"; type CredentialProtectionPolicy = - | 'userVerificationOptional' - | 'userVerificationOptionalWithCredentialIDList' - | 'userVerificationRequired'; + | "userVerificationOptional" + | "userVerificationOptionalWithCredentialIDList" + | "userVerificationRequired"; type DebuggerNotificationType = - | 'cancelAnimationFrame' - | 'clearInterval' - | 'clearTimeout' - | 'domEvent' - | 'requestAnimationFrame' - | 'requestAnimationFrameCallback' - | 'setInterval' - | 'setIntervalCallback' - | 'setTimeout' - | 'setTimeoutCallback'; + | "cancelAnimationFrame" + | "clearInterval" + | "clearTimeout" + | "domEvent" + | "requestAnimationFrame" + | "requestAnimationFrameCallback" + | "setInterval" + | "setIntervalCallback" + | "setTimeout" + | "setTimeoutCallback"; type DeclarationOrigin = - | 'animations' - | 'position-fallback' - | 'pres-hints' - | 'smil' - | 'style-attribute' - | 'transitions' - | 'user' - | 'user-agent'; + | "animations" + | "position-fallback" + | "pres-hints" + | "smil" + | "style-attribute" + | "transitions" + | "user" + | "user-agent"; type DecoderDoctorReportType = - | 'mediacannotinitializepulseaudio' - | 'mediacannotplaynodecoders' - | 'mediadecodeerror' - | 'mediadecodewarning' - | 'medianodecoders' - | 'mediaplatformdecodernotfound' - | 'mediaunsupportedlibavcodec' - | 'mediawidevinenowmf' - | 'mediawmfneeded'; -type DirectionSetting = '' | 'lr' | 'rl'; -type DisplayMode = 'browser' | 'fullscreen' | 'minimal-ui' | 'standalone'; -type DistanceModelType = 'exponential' | 'inverse' | 'linear'; -type EncodedAudioChunkType = 'delta' | 'key'; -type EncodedVideoChunkType = 'delta' | 'key'; -type EndingType = 'native' | 'transparent'; + | "mediacannotinitializepulseaudio" + | "mediacannotplaynodecoders" + | "mediadecodeerror" + | "mediadecodewarning" + | "medianodecoders" + | "mediaplatformdecodernotfound" + | "mediaunsupportedlibavcodec" + | "mediawidevinenowmf" + | "mediawmfneeded"; +type DirectionSetting = "" | "lr" | "rl"; +type DisplayMode = "browser" | "fullscreen" | "minimal-ui" | "standalone"; +type DistanceModelType = "exponential" | "inverse" | "linear"; +type EncodedAudioChunkType = "delta" | "key"; +type EncodedVideoChunkType = "delta" | "key"; +type EndingType = "native" | "transparent"; type EventCallbackDebuggerNotificationType = - | 'closewatcher' - | 'global' - | 'node' - | 'websocket' - | 'worker' - | 'xhr'; -type FetchState = 'aborted' | 'complete' | 'errored' | 'requesting' | 'responding'; -type FileSystemHandleKind = 'directory' | 'file'; -type FileType = 'directory' | 'other' | 'regular'; -type FillMode = 'auto' | 'backwards' | 'both' | 'forwards' | 'none'; -type FlexItemClampState = 'clamped_to_max' | 'clamped_to_min' | 'unclamped'; -type FlexLineGrowthState = 'growing' | 'shrinking'; -type FlexPhysicalDirection = 'horizontal-lr' | 'horizontal-rl' | 'vertical-bt' | 'vertical-tb'; -type FontFaceLoadStatus = 'error' | 'loaded' | 'loading' | 'unloaded'; -type FontFaceSetLoadStatus = 'loaded' | 'loading'; -type ForceMediaDocument = 'image' | 'none' | 'video'; -type ForcedColorsOverride = 'active' | 'none'; -type GPUAddressMode = 'clamp-to-edge' | 'mirror-repeat' | 'repeat'; -type GPUAutoLayoutMode = 'auto'; + | "closewatcher" + | "global" + | "node" + | "websocket" + | "worker" + | "xhr"; +type FetchState = "aborted" | "complete" | "errored" | "requesting" | "responding"; +type FileSystemHandleKind = "directory" | "file"; +type FileType = "directory" | "other" | "regular"; +type FillMode = "auto" | "backwards" | "both" | "forwards" | "none"; +type FlexItemClampState = "clamped_to_max" | "clamped_to_min" | "unclamped"; +type FlexLineGrowthState = "growing" | "shrinking"; +type FlexPhysicalDirection = "horizontal-lr" | "horizontal-rl" | "vertical-bt" | "vertical-tb"; +type FontFaceLoadStatus = "error" | "loaded" | "loading" | "unloaded"; +type FontFaceSetLoadStatus = "loaded" | "loading"; +type ForceMediaDocument = "image" | "none" | "video"; +type ForcedColorsOverride = "active" | "none"; +type GPUAddressMode = "clamp-to-edge" | "mirror-repeat" | "repeat"; +type GPUAutoLayoutMode = "auto"; type GPUBlendFactor = - | 'constant' - | 'dst' - | 'dst-alpha' - | 'one' - | 'one-minus-constant' - | 'one-minus-dst' - | 'one-minus-dst-alpha' - | 'one-minus-src' - | 'one-minus-src-alpha' - | 'src' - | 'src-alpha' - | 'src-alpha-saturated' - | 'zero'; -type GPUBlendOperation = 'add' | 'max' | 'min' | 'reverse-subtract' | 'subtract'; -type GPUBufferBindingType = 'read-only-storage' | 'storage' | 'uniform'; -type GPUBufferMapState = 'mapped' | 'pending' | 'unmapped'; -type GPUCanvasAlphaMode = 'opaque' | 'premultiplied'; + | "constant" + | "dst" + | "dst-alpha" + | "one" + | "one-minus-constant" + | "one-minus-dst" + | "one-minus-dst-alpha" + | "one-minus-src" + | "one-minus-src-alpha" + | "src" + | "src-alpha" + | "src-alpha-saturated" + | "zero"; +type GPUBlendOperation = "add" | "max" | "min" | "reverse-subtract" | "subtract"; +type GPUBufferBindingType = "read-only-storage" | "storage" | "uniform"; +type GPUBufferMapState = "mapped" | "pending" | "unmapped"; +type GPUCanvasAlphaMode = "opaque" | "premultiplied"; type GPUCompareFunction = - | 'always' - | 'equal' - | 'greater' - | 'greater-equal' - | 'less' - | 'less-equal' - | 'never' - | 'not-equal'; -type GPUCompilationMessageType = 'error' | 'info' | 'warning'; -type GPUCullMode = 'back' | 'front' | 'none'; -type GPUDeviceLostReason = 'destroyed' | 'unknown'; -type GPUErrorFilter = 'internal' | 'out-of-memory' | 'validation'; + | "always" + | "equal" + | "greater" + | "greater-equal" + | "less" + | "less-equal" + | "never" + | "not-equal"; +type GPUCompilationMessageType = "error" | "info" | "warning"; +type GPUCullMode = "back" | "front" | "none"; +type GPUDeviceLostReason = "destroyed" | "unknown"; +type GPUErrorFilter = "internal" | "out-of-memory" | "validation"; type GPUFeatureName = - | 'bgra8unorm-storage' - | 'clip-distances' - | 'core-features-and-limits' - | 'depth-clip-control' - | 'depth32float-stencil8' - | 'dual-source-blending' - | 'float32-blendable' - | 'float32-filterable' - | 'indirect-first-instance' - | 'primitive-index' - | 'rg11b10ufloat-renderable' - | 'shader-f16' - | 'subgroups' - | 'texture-compression-astc' - | 'texture-compression-astc-sliced-3d' - | 'texture-compression-bc' - | 'texture-compression-bc-sliced-3d' - | 'texture-compression-etc2' - | 'timestamp-query'; -type GPUFilterMode = 'linear' | 'nearest'; -type GPUFrontFace = 'ccw' | 'cw'; -type GPUIndexFormat = 'uint16' | 'uint32'; -type GPULoadOp = 'clear' | 'load'; -type GPUMipmapFilterMode = 'linear' | 'nearest'; -type GPUPipelineErrorReason = 'internal' | 'validation'; -type GPUPowerPreference = 'high-performance' | 'low-power'; + | "bgra8unorm-storage" + | "clip-distances" + | "core-features-and-limits" + | "depth-clip-control" + | "depth32float-stencil8" + | "dual-source-blending" + | "float32-blendable" + | "float32-filterable" + | "indirect-first-instance" + | "primitive-index" + | "rg11b10ufloat-renderable" + | "shader-f16" + | "subgroups" + | "texture-compression-astc" + | "texture-compression-astc-sliced-3d" + | "texture-compression-bc" + | "texture-compression-bc-sliced-3d" + | "texture-compression-etc2" + | "timestamp-query"; +type GPUFilterMode = "linear" | "nearest"; +type GPUFrontFace = "ccw" | "cw"; +type GPUIndexFormat = "uint16" | "uint32"; +type GPULoadOp = "clear" | "load"; +type GPUMipmapFilterMode = "linear" | "nearest"; +type GPUPipelineErrorReason = "internal" | "validation"; +type GPUPowerPreference = "high-performance" | "low-power"; type GPUPrimitiveTopology = - | 'line-list' - | 'line-strip' - | 'point-list' - | 'triangle-list' - | 'triangle-strip'; -type GPUQueryType = 'occlusion' | 'timestamp'; -type GPUSamplerBindingType = 'comparison' | 'filtering' | 'non-filtering'; + | "line-list" + | "line-strip" + | "point-list" + | "triangle-list" + | "triangle-strip"; +type GPUQueryType = "occlusion" | "timestamp"; +type GPUSamplerBindingType = "comparison" | "filtering" | "non-filtering"; type GPUStencilOperation = - | 'decrement-clamp' - | 'decrement-wrap' - | 'increment-clamp' - | 'increment-wrap' - | 'invert' - | 'keep' - | 'replace' - | 'zero'; -type GPUStorageTextureAccess = 'read-only' | 'read-write' | 'write-only'; -type GPUStoreOp = 'discard' | 'store'; -type GPUTextureAspect = 'all' | 'depth-only' | 'stencil-only'; -type GPUTextureDimension = '1d' | '2d' | '3d'; + | "decrement-clamp" + | "decrement-wrap" + | "increment-clamp" + | "increment-wrap" + | "invert" + | "keep" + | "replace" + | "zero"; +type GPUStorageTextureAccess = "read-only" | "read-write" | "write-only"; +type GPUStoreOp = "discard" | "store"; +type GPUTextureAspect = "all" | "depth-only" | "stencil-only"; +type GPUTextureDimension = "1d" | "2d" | "3d"; type GPUTextureFormat = - | 'astc-10x10-unorm' - | 'astc-10x10-unorm-srgb' - | 'astc-10x5-unorm' - | 'astc-10x5-unorm-srgb' - | 'astc-10x6-unorm' - | 'astc-10x6-unorm-srgb' - | 'astc-10x8-unorm' - | 'astc-10x8-unorm-srgb' - | 'astc-12x10-unorm' - | 'astc-12x10-unorm-srgb' - | 'astc-12x12-unorm' - | 'astc-12x12-unorm-srgb' - | 'astc-4x4-unorm' - | 'astc-4x4-unorm-srgb' - | 'astc-5x4-unorm' - | 'astc-5x4-unorm-srgb' - | 'astc-5x5-unorm' - | 'astc-5x5-unorm-srgb' - | 'astc-6x5-unorm' - | 'astc-6x5-unorm-srgb' - | 'astc-6x6-unorm' - | 'astc-6x6-unorm-srgb' - | 'astc-8x5-unorm' - | 'astc-8x5-unorm-srgb' - | 'astc-8x6-unorm' - | 'astc-8x6-unorm-srgb' - | 'astc-8x8-unorm' - | 'astc-8x8-unorm-srgb' - | 'bc1-rgba-unorm' - | 'bc1-rgba-unorm-srgb' - | 'bc2-rgba-unorm' - | 'bc2-rgba-unorm-srgb' - | 'bc3-rgba-unorm' - | 'bc3-rgba-unorm-srgb' - | 'bc4-r-snorm' - | 'bc4-r-unorm' - | 'bc5-rg-snorm' - | 'bc5-rg-unorm' - | 'bc6h-rgb-float' - | 'bc6h-rgb-ufloat' - | 'bc7-rgba-unorm' - | 'bc7-rgba-unorm-srgb' - | 'bgra8unorm' - | 'bgra8unorm-srgb' - | 'depth16unorm' - | 'depth24plus' - | 'depth24plus-stencil8' - | 'depth32float' - | 'depth32float-stencil8' - | 'eac-r11snorm' - | 'eac-r11unorm' - | 'eac-rg11snorm' - | 'eac-rg11unorm' - | 'etc2-rgb8a1unorm' - | 'etc2-rgb8a1unorm-srgb' - | 'etc2-rgb8unorm' - | 'etc2-rgb8unorm-srgb' - | 'etc2-rgba8unorm' - | 'etc2-rgba8unorm-srgb' - | 'r16float' - | 'r16sint' - | 'r16uint' - | 'r32float' - | 'r32sint' - | 'r32uint' - | 'r8sint' - | 'r8snorm' - | 'r8uint' - | 'r8unorm' - | 'rg11b10ufloat' - | 'rg16float' - | 'rg16sint' - | 'rg16uint' - | 'rg32float' - | 'rg32sint' - | 'rg32uint' - | 'rg8sint' - | 'rg8snorm' - | 'rg8uint' - | 'rg8unorm' - | 'rgb10a2uint' - | 'rgb10a2unorm' - | 'rgb9e5ufloat' - | 'rgba16float' - | 'rgba16sint' - | 'rgba16uint' - | 'rgba32float' - | 'rgba32sint' - | 'rgba32uint' - | 'rgba8sint' - | 'rgba8snorm' - | 'rgba8uint' - | 'rgba8unorm' - | 'rgba8unorm-srgb' - | 'stencil8'; -type GPUTextureSampleType = 'depth' | 'float' | 'sint' | 'uint' | 'unfilterable-float'; -type GPUTextureViewDimension = '1d' | '2d' | '2d-array' | '3d' | 'cube' | 'cube-array'; + | "astc-10x10-unorm" + | "astc-10x10-unorm-srgb" + | "astc-10x5-unorm" + | "astc-10x5-unorm-srgb" + | "astc-10x6-unorm" + | "astc-10x6-unorm-srgb" + | "astc-10x8-unorm" + | "astc-10x8-unorm-srgb" + | "astc-12x10-unorm" + | "astc-12x10-unorm-srgb" + | "astc-12x12-unorm" + | "astc-12x12-unorm-srgb" + | "astc-4x4-unorm" + | "astc-4x4-unorm-srgb" + | "astc-5x4-unorm" + | "astc-5x4-unorm-srgb" + | "astc-5x5-unorm" + | "astc-5x5-unorm-srgb" + | "astc-6x5-unorm" + | "astc-6x5-unorm-srgb" + | "astc-6x6-unorm" + | "astc-6x6-unorm-srgb" + | "astc-8x5-unorm" + | "astc-8x5-unorm-srgb" + | "astc-8x6-unorm" + | "astc-8x6-unorm-srgb" + | "astc-8x8-unorm" + | "astc-8x8-unorm-srgb" + | "bc1-rgba-unorm" + | "bc1-rgba-unorm-srgb" + | "bc2-rgba-unorm" + | "bc2-rgba-unorm-srgb" + | "bc3-rgba-unorm" + | "bc3-rgba-unorm-srgb" + | "bc4-r-snorm" + | "bc4-r-unorm" + | "bc5-rg-snorm" + | "bc5-rg-unorm" + | "bc6h-rgb-float" + | "bc6h-rgb-ufloat" + | "bc7-rgba-unorm" + | "bc7-rgba-unorm-srgb" + | "bgra8unorm" + | "bgra8unorm-srgb" + | "depth16unorm" + | "depth24plus" + | "depth24plus-stencil8" + | "depth32float" + | "depth32float-stencil8" + | "eac-r11snorm" + | "eac-r11unorm" + | "eac-rg11snorm" + | "eac-rg11unorm" + | "etc2-rgb8a1unorm" + | "etc2-rgb8a1unorm-srgb" + | "etc2-rgb8unorm" + | "etc2-rgb8unorm-srgb" + | "etc2-rgba8unorm" + | "etc2-rgba8unorm-srgb" + | "r16float" + | "r16sint" + | "r16uint" + | "r32float" + | "r32sint" + | "r32uint" + | "r8sint" + | "r8snorm" + | "r8uint" + | "r8unorm" + | "rg11b10ufloat" + | "rg16float" + | "rg16sint" + | "rg16uint" + | "rg32float" + | "rg32sint" + | "rg32uint" + | "rg8sint" + | "rg8snorm" + | "rg8uint" + | "rg8unorm" + | "rgb10a2uint" + | "rgb10a2unorm" + | "rgb9e5ufloat" + | "rgba16float" + | "rgba16sint" + | "rgba16uint" + | "rgba32float" + | "rgba32sint" + | "rgba32uint" + | "rgba8sint" + | "rgba8snorm" + | "rgba8uint" + | "rgba8unorm" + | "rgba8unorm-srgb" + | "stencil8"; +type GPUTextureSampleType = "depth" | "float" | "sint" | "uint" | "unfilterable-float"; +type GPUTextureViewDimension = "1d" | "2d" | "2d-array" | "3d" | "cube" | "cube-array"; type GPUVertexFormat = - | 'float16' - | 'float16x2' - | 'float16x4' - | 'float32' - | 'float32x2' - | 'float32x3' - | 'float32x4' - | 'sint16' - | 'sint16x2' - | 'sint16x4' - | 'sint32' - | 'sint32x2' - | 'sint32x3' - | 'sint32x4' - | 'sint8' - | 'sint8x2' - | 'sint8x4' - | 'snorm16' - | 'snorm16x2' - | 'snorm16x4' - | 'snorm8' - | 'snorm8x2' - | 'snorm8x4' - | 'uint16' - | 'uint16x2' - | 'uint16x4' - | 'uint32' - | 'uint32x2' - | 'uint32x3' - | 'uint32x4' - | 'uint8' - | 'uint8x2' - | 'uint8x4' - | 'unorm10-10-10-2' - | 'unorm16' - | 'unorm16x2' - | 'unorm16x4' - | 'unorm8' - | 'unorm8x2' - | 'unorm8x4' - | 'unorm8x4-bgra'; -type GPUVertexStepMode = 'instance' | 'vertex'; -type GamepadHand = '' | 'left' | 'right'; -type GamepadHapticActuatorType = 'vibration'; -type GamepadLightIndicatorType = 'on-off' | 'rgb'; -type GamepadMappingType = '' | 'standard' | 'xr-standard'; -type GetUserMediaRequestType = 'getusermedia' | 'recording-device-stopped' | 'selectaudiooutput'; -type GridDeclaration = 'explicit' | 'implicit'; -type GridTrackState = 'removed' | 'repeat' | 'static'; -type HDCPVersion = '1.0' | '1.1' | '1.2' | '1.3' | '1.4' | '2.0' | '2.1' | '2.2' | '2.3'; -type HardwareAcceleration = 'no-preference' | 'prefer-hardware' | 'prefer-software'; -type HashAlgorithm = 'sha256' | 'sha384' | 'sha512'; -type HdrMetadataType = 'smpteSt2086' | 'smpteSt2094-10' | 'smpteSt2094-40'; -type HeadersGuardEnum = 'immutable' | 'none' | 'request' | 'request-no-cors' | 'response'; -type HighlightType = 'grammar-error' | 'highlight' | 'spelling-error'; -type IDBCursorDirection = 'next' | 'nextunique' | 'prev' | 'prevunique'; -type IDBRequestReadyState = 'done' | 'pending'; -type IDBTransactionDurability = 'default' | 'relaxed' | 'strict'; -type IDBTransactionMode = 'cleanup' | 'readonly' | 'readwrite' | 'readwriteflush' | 'versionchange'; -type IdentityCredentialRequestOptionsMode = 'active' | 'passive'; -type ImageOrientation = 'flipY' | 'from-image' | 'none'; -type ImportESModuleTargetGlobal = 'contextual' | 'current' | 'devtools' | 'shared'; -type InspectorPropertyType = 'color' | 'gradient' | 'timing-function'; -type IterationCompositeOperation = 'accumulate' | 'replace'; + | "float16" + | "float16x2" + | "float16x4" + | "float32" + | "float32x2" + | "float32x3" + | "float32x4" + | "sint16" + | "sint16x2" + | "sint16x4" + | "sint32" + | "sint32x2" + | "sint32x3" + | "sint32x4" + | "sint8" + | "sint8x2" + | "sint8x4" + | "snorm16" + | "snorm16x2" + | "snorm16x4" + | "snorm8" + | "snorm8x2" + | "snorm8x4" + | "uint16" + | "uint16x2" + | "uint16x4" + | "uint32" + | "uint32x2" + | "uint32x3" + | "uint32x4" + | "uint8" + | "uint8x2" + | "uint8x4" + | "unorm10-10-10-2" + | "unorm16" + | "unorm16x2" + | "unorm16x4" + | "unorm8" + | "unorm8x2" + | "unorm8x4" + | "unorm8x4-bgra"; +type GPUVertexStepMode = "instance" | "vertex"; +type GamepadHand = "" | "left" | "right"; +type GamepadHapticActuatorType = "vibration"; +type GamepadLightIndicatorType = "on-off" | "rgb"; +type GamepadMappingType = "" | "standard" | "xr-standard"; +type GetUserMediaRequestType = "getusermedia" | "recording-device-stopped" | "selectaudiooutput"; +type GridDeclaration = "explicit" | "implicit"; +type GridTrackState = "removed" | "repeat" | "static"; +type HDCPVersion = "1.0" | "1.1" | "1.2" | "1.3" | "1.4" | "2.0" | "2.1" | "2.2" | "2.3"; +type HardwareAcceleration = "no-preference" | "prefer-hardware" | "prefer-software"; +type HashAlgorithm = "sha256" | "sha384" | "sha512"; +type HdrMetadataType = "smpteSt2086" | "smpteSt2094-10" | "smpteSt2094-40"; +type HeadersGuardEnum = "immutable" | "none" | "request" | "request-no-cors" | "response"; +type HighlightType = "grammar-error" | "highlight" | "spelling-error"; +type IDBCursorDirection = "next" | "nextunique" | "prev" | "prevunique"; +type IDBRequestReadyState = "done" | "pending"; +type IDBTransactionDurability = "default" | "relaxed" | "strict"; +type IDBTransactionMode = "cleanup" | "readonly" | "readwrite" | "readwriteflush" | "versionchange"; +type IdentityCredentialRequestOptionsMode = "active" | "passive"; +type ImageOrientation = "flipY" | "from-image" | "none"; +type ImportESModuleTargetGlobal = "contextual" | "current" | "devtools" | "shared"; +type InspectorPropertyType = "color" | "gradient" | "timing-function"; +type IterationCompositeOperation = "accumulate" | "replace"; type JSRFPTarget = - | 'CSSPrefersColorScheme' - | 'HttpUserAgent' - | 'JSLocalePrompt' - | 'RoundWindowSize' - | 'SiteSpecificZoom'; -type L10nFileSourceHasFileStatus = 'missing' | 'present' | 'unknown'; -type LatencyMode = 'quality' | 'realtime'; -type LineAlignSetting = 'center' | 'end' | 'start'; -type LlamaKVCacheDtype = 'f16' | 'f32' | 'q4_0' | 'q4_1' | 'q5_0' | 'q5_1' | 'q8_0'; + | "CSSPrefersColorScheme" + | "HttpUserAgent" + | "JSLocalePrompt" + | "RoundWindowSize" + | "SiteSpecificZoom"; +type L10nFileSourceHasFileStatus = "missing" | "present" | "unknown"; +type LatencyMode = "quality" | "realtime"; +type LineAlignSetting = "center" | "end" | "start"; +type LlamaKVCacheDtype = "f16" | "f32" | "q4_0" | "q4_1" | "q5_0" | "q5_1" | "q8_0"; type LlamaSamplerType = - | 'dist' - | 'dry' - | 'infill' - | 'logit-bias' - | 'min-p' - | 'mirostat' - | 'penalties' - | 'temperature' - | 'temperature-ext' - | 'top-k' - | 'top-n-sigma' - | 'top-p' - | 'typical' - | 'xtc'; -type LockMode = 'exclusive' | 'shared'; -type LoginStatus = 'logged-in' | 'logged-out'; -type MIDIPortConnectionState = 'closed' | 'open' | 'pending'; -type MIDIPortDeviceState = 'connected' | 'disconnected'; -type MIDIPortType = 'input' | 'output'; + | "dist" + | "dry" + | "infill" + | "logit-bias" + | "min-p" + | "mirostat" + | "penalties" + | "temperature" + | "temperature-ext" + | "top-k" + | "top-n-sigma" + | "top-p" + | "typical" + | "xtc"; +type LockMode = "exclusive" | "shared"; +type LoginStatus = "logged-in" | "logged-out"; +type MIDIPortConnectionState = "closed" | "open" | "pending"; +type MIDIPortDeviceState = "connected" | "disconnected"; +type MIDIPortType = "input" | "output"; type MLSObjectType = - | 'application-message-ciphertext' - | 'application-message-plaintext' - | 'client-identifier' - | 'commit-output' - | 'commit-processed' - | 'credential-basic' - | 'exporter-context' - | 'exporter-label' - | 'exporter-output' - | 'group-epoch' - | 'group-identifier' - | 'group-info' - | 'key-package' - | 'proposal' - | 'welcome'; + | "application-message-ciphertext" + | "application-message-plaintext" + | "client-identifier" + | "commit-output" + | "commit-processed" + | "credential-basic" + | "exporter-context" + | "exporter-label" + | "exporter-output" + | "group-epoch" + | "group-identifier" + | "group-info" + | "key-package" + | "proposal" + | "welcome"; type MediaControlKey = - | 'focus' - | 'nexttrack' - | 'pause' - | 'play' - | 'playpause' - | 'previoustrack' - | 'seekbackward' - | 'seekforward' - | 'seekto' - | 'skipad' - | 'stop'; -type MediaDecodingType = 'file' | 'media-source'; -type MediaDeviceKind = 'audioinput' | 'audiooutput' | 'videoinput'; -type MediaEncodingType = 'record' | 'transmission'; + | "focus" + | "nexttrack" + | "pause" + | "play" + | "playpause" + | "previoustrack" + | "seekbackward" + | "seekforward" + | "seekto" + | "skipad" + | "stop"; +type MediaDecodingType = "file" | "media-source"; +type MediaDeviceKind = "audioinput" | "audiooutput" | "videoinput"; +type MediaEncodingType = "record" | "transmission"; type MediaKeyMessageType = - | 'individualization-request' - | 'license-release' - | 'license-renewal' - | 'license-request'; + | "individualization-request" + | "license-release" + | "license-renewal" + | "license-request"; type MediaKeySessionClosedReason = - | 'closed-by-application' - | 'hardware-context-reset' - | 'internal-error' - | 'release-acknowledged' - | 'resource-evicted'; -type MediaKeySessionType = 'persistent-license' | 'temporary'; + | "closed-by-application" + | "hardware-context-reset" + | "internal-error" + | "release-acknowledged" + | "resource-evicted"; +type MediaKeySessionType = "persistent-license" | "temporary"; type MediaKeyStatus = - | 'expired' - | 'internal-error' - | 'output-downscaled' - | 'output-restricted' - | 'released' - | 'status-pending' - | 'usable'; -type MediaKeysRequirement = 'not-allowed' | 'optional' | 'required'; + | "expired" + | "internal-error" + | "output-downscaled" + | "output-restricted" + | "released" + | "status-pending" + | "usable"; +type MediaKeysRequirement = "not-allowed" | "optional" | "required"; type MediaSessionAction = - | 'nexttrack' - | 'pause' - | 'play' - | 'previoustrack' - | 'seekbackward' - | 'seekforward' - | 'seekto' - | 'skipad' - | 'stop'; -type MediaSessionPlaybackState = 'none' | 'paused' | 'playing'; -type MediaSourceEndOfStreamError = 'decode' | 'network'; -type MediaSourceReadyState = 'closed' | 'ended' | 'open'; -type MediaStreamTrackState = 'ended' | 'live'; + | "nexttrack" + | "pause" + | "play" + | "previoustrack" + | "seekbackward" + | "seekforward" + | "seekto" + | "skipad" + | "stop"; +type MediaSessionPlaybackState = "none" | "paused" | "playing"; +type MediaSourceEndOfStreamError = "decode" | "network"; +type MediaSourceReadyState = "closed" | "ended" | "open"; +type MediaStreamTrackState = "ended" | "live"; type MozContentPolicyType = - | 'beacon' - | 'csp_report' - | 'font' - | 'image' - | 'imageset' - | 'json' - | 'main_frame' - | 'media' - | 'object' - | 'other' - | 'ping' - | 'script' - | 'speculative' - | 'stylesheet' - | 'sub_frame' - | 'web_manifest' - | 'websocket' - | 'xml_dtd' - | 'xmlhttprequest' - | 'xslt'; + | "beacon" + | "csp_report" + | "font" + | "image" + | "imageset" + | "json" + | "main_frame" + | "media" + | "object" + | "other" + | "ping" + | "script" + | "speculative" + | "stylesheet" + | "sub_frame" + | "web_manifest" + | "websocket" + | "xml_dtd" + | "xmlhttprequest" + | "xslt"; type MozUrlClassificationFlags = - | 'antifraud' - | 'any_basic_tracking' - | 'any_social_tracking' - | 'any_strict_tracking' - | 'consentmanager' - | 'cryptomining' - | 'cryptomining_content' - | 'emailtracking' - | 'emailtracking_content' - | 'fingerprinting' - | 'fingerprinting_content' - | 'socialtracking' - | 'socialtracking_facebook' - | 'socialtracking_linkedin' - | 'socialtracking_twitter' - | 'tracking' - | 'tracking_ad' - | 'tracking_analytics' - | 'tracking_content' - | 'tracking_social'; -type NavigationFocusReset = 'after-transition' | 'manual'; -type NavigationHistoryBehavior = 'auto' | 'push' | 'replace'; -type NavigationScrollBehavior = 'after-transition' | 'manual'; -type NavigationTimingType = 'back_forward' | 'navigate' | 'prerender' | 'reload'; -type NavigationType = 'push' | 'reload' | 'replace' | 'traverse'; -type NotificationDirection = 'auto' | 'ltr' | 'rtl'; -type NotificationPermission = 'default' | 'denied' | 'granted'; -type OffscreenRenderingContextId = '2d' | 'bitmaprenderer' | 'webgl' | 'webgl2' | 'webgpu'; -type OpusBitstreamFormat = 'ogg' | 'opus'; + | "antifraud" + | "any_basic_tracking" + | "any_social_tracking" + | "any_strict_tracking" + | "consentmanager" + | "cryptomining" + | "cryptomining_content" + | "emailtracking" + | "emailtracking_content" + | "fingerprinting" + | "fingerprinting_content" + | "socialtracking" + | "socialtracking_facebook" + | "socialtracking_linkedin" + | "socialtracking_twitter" + | "tracking" + | "tracking_ad" + | "tracking_analytics" + | "tracking_content" + | "tracking_social"; +type NavigationFocusReset = "after-transition" | "manual"; +type NavigationHistoryBehavior = "auto" | "push" | "replace"; +type NavigationScrollBehavior = "after-transition" | "manual"; +type NavigationTimingType = "back_forward" | "navigate" | "prerender" | "reload"; +type NavigationType = "push" | "reload" | "replace" | "traverse"; +type NotificationDirection = "auto" | "ltr" | "rtl"; +type NotificationPermission = "default" | "denied" | "granted"; +type OffscreenRenderingContextId = "2d" | "bitmaprenderer" | "webgl" | "webgl2" | "webgpu"; +type OpusBitstreamFormat = "ogg" | "opus"; type OrientationLockType = - | 'any' - | 'landscape' - | 'landscape-primary' - | 'landscape-secondary' - | 'natural' - | 'portrait' - | 'portrait-primary' - | 'portrait-secondary'; + | "any" + | "landscape" + | "landscape-primary" + | "landscape-secondary" + | "natural" + | "portrait" + | "portrait-primary" + | "portrait-secondary"; type OrientationType = - | 'landscape-primary' - | 'landscape-secondary' - | 'portrait-primary' - | 'portrait-secondary'; -type OscillatorType = 'custom' | 'sawtooth' | 'sine' | 'square' | 'triangle'; -type OverSampleType = '2x' | '4x' | 'none'; + | "landscape-primary" + | "landscape-secondary" + | "portrait-primary" + | "portrait-secondary"; +type OscillatorType = "custom" | "sawtooth" | "sine" | "square" | "triangle"; +type OverSampleType = "2x" | "4x" | "none"; type OverridableErrorCategory = - | 'domain-mismatch' - | 'expired-or-not-yet-valid' - | 'trust-error' - | 'unset'; + | "domain-mismatch" + | "expired-or-not-yet-valid" + | "trust-error" + | "unset"; type PCError = - | 'InvalidAccessError' - | 'InvalidCharacterError' - | 'InvalidModificationError' - | 'InvalidStateError' - | 'NotReadableError' - | 'NotSupportedError' - | 'OperationError' - | 'RangeError' - | 'SyntaxError' - | 'TypeError' - | 'UnknownError'; + | "InvalidAccessError" + | "InvalidCharacterError" + | "InvalidModificationError" + | "InvalidStateError" + | "NotReadableError" + | "NotSupportedError" + | "OperationError" + | "RangeError" + | "SyntaxError" + | "TypeError" + | "UnknownError"; type PCObserverStateType = - | 'ConnectionState' - | 'IceConnectionState' - | 'IceGatheringState' - | 'None' - | 'SignalingState'; -type PanningModelType = 'HRTF' | 'equalpower'; -type PaymentComplete = 'fail' | 'success' | 'unknown'; -type PaymentShippingType = 'delivery' | 'pickup' | 'shipping'; + | "ConnectionState" + | "IceConnectionState" + | "IceGatheringState" + | "None" + | "SignalingState"; +type PanningModelType = "HRTF" | "equalpower"; +type PaymentComplete = "fail" | "success" | "unknown"; +type PaymentShippingType = "delivery" | "pickup" | "shipping"; type PermissionName = - | 'camera' - | 'geolocation' - | 'microphone' - | 'midi' - | 'notifications' - | 'persistent-storage' - | 'push' - | 'screen-wake-lock' - | 'storage-access'; -type PermissionState = 'denied' | 'granted' | 'prompt'; -type PermitUnloadAction = 'dontUnload' | 'prompt' | 'unload'; + | "camera" + | "geolocation" + | "microphone" + | "midi" + | "notifications" + | "persistent-storage" + | "push" + | "screen-wake-lock" + | "storage-access"; +type PermissionState = "denied" | "granted" | "prompt"; +type PermitUnloadAction = "dontUnload" | "prompt" | "unload"; type PlacesEventType = - | 'bookmark-added' - | 'bookmark-guid-changed' - | 'bookmark-keyword-changed' - | 'bookmark-moved' - | 'bookmark-removed' - | 'bookmark-tags-changed' - | 'bookmark-time-changed' - | 'bookmark-title-changed' - | 'bookmark-url-changed' - | 'favicon-changed' - | 'history-cleared' - | 'none' - | 'page-removed' - | 'page-title-changed' - | 'page-visited' - | 'pages-rank-changed' - | 'purge-caches'; -type PlaybackDirection = 'alternate' | 'alternate-reverse' | 'normal' | 'reverse'; + | "bookmark-added" + | "bookmark-guid-changed" + | "bookmark-keyword-changed" + | "bookmark-moved" + | "bookmark-removed" + | "bookmark-tags-changed" + | "bookmark-time-changed" + | "bookmark-title-changed" + | "bookmark-url-changed" + | "favicon-changed" + | "history-cleared" + | "none" + | "page-removed" + | "page-title-changed" + | "page-visited" + | "pages-rank-changed" + | "purge-caches"; +type PlaybackDirection = "alternate" | "alternate-reverse" | "normal" | "reverse"; type PopupBlockerState = - | 'openAbused' - | 'openAllowed' - | 'openBlocked' - | 'openControlled' - | 'openOverridden'; -type PositionAlignSetting = 'auto' | 'center' | 'line-left' | 'line-right'; -type PredefinedColorSpace = 'display-p3' | 'srgb'; -type PrefersColorSchemeOverride = 'dark' | 'light' | 'none'; -type PremultiplyAlpha = 'default' | 'none' | 'premultiply'; -type PresentationStyle = 'attachment' | 'inline' | 'unspecified'; -type PrivateAttributionImpressionType = 'click' | 'view'; -type PromiseDebuggingState = 'fulfilled' | 'pending' | 'rejected'; -type PushEncryptionKeyName = 'auth' | 'p256dh'; -type RTCBundlePolicy = 'balanced' | 'max-bundle' | 'max-compat'; -type RTCCodecType = 'decode' | 'encode'; -type RTCDataChannelState = 'closed' | 'closing' | 'connecting' | 'open'; -type RTCDataChannelType = 'arraybuffer' | 'blob'; -type RTCDegradationPreference = 'balanced' | 'maintain-framerate' | 'maintain-resolution'; -type RTCDtlsTransportState = 'closed' | 'connected' | 'connecting' | 'failed' | 'new'; -type RTCEncodedVideoFrameType = 'delta' | 'empty' | 'key'; -type RTCIceCandidateType = 'host' | 'prflx' | 'relay' | 'srflx'; -type RTCIceComponent = 'rtcp' | 'rtp'; + | "openAbused" + | "openAllowed" + | "openBlocked" + | "openControlled" + | "openOverridden"; +type PositionAlignSetting = "auto" | "center" | "line-left" | "line-right"; +type PredefinedColorSpace = "display-p3" | "srgb"; +type PrefersColorSchemeOverride = "dark" | "light" | "none"; +type PremultiplyAlpha = "default" | "none" | "premultiply"; +type PresentationStyle = "attachment" | "inline" | "unspecified"; +type PrivateAttributionImpressionType = "click" | "view"; +type PromiseDebuggingState = "fulfilled" | "pending" | "rejected"; +type PushEncryptionKeyName = "auth" | "p256dh"; +type RTCBundlePolicy = "balanced" | "max-bundle" | "max-compat"; +type RTCCodecType = "decode" | "encode"; +type RTCDataChannelState = "closed" | "closing" | "connecting" | "open"; +type RTCDataChannelType = "arraybuffer" | "blob"; +type RTCDegradationPreference = "balanced" | "maintain-framerate" | "maintain-resolution"; +type RTCDtlsTransportState = "closed" | "connected" | "connecting" | "failed" | "new"; +type RTCEncodedVideoFrameType = "delta" | "empty" | "key"; +type RTCIceCandidateType = "host" | "prflx" | "relay" | "srflx"; +type RTCIceComponent = "rtcp" | "rtp"; type RTCIceConnectionState = - | 'checking' - | 'closed' - | 'completed' - | 'connected' - | 'disconnected' - | 'failed' - | 'new'; -type RTCIceCredentialType = 'password'; -type RTCIceGathererState = 'complete' | 'gathering' | 'new'; -type RTCIceGatheringState = 'complete' | 'gathering' | 'new'; -type RTCIceProtocol = 'tcp' | 'udp'; -type RTCIceTcpCandidateType = 'active' | 'passive' | 'so'; -type RTCIceTransportPolicy = 'all' | 'relay'; + | "checking" + | "closed" + | "completed" + | "connected" + | "disconnected" + | "failed" + | "new"; +type RTCIceCredentialType = "password"; +type RTCIceGathererState = "complete" | "gathering" | "new"; +type RTCIceGatheringState = "complete" | "gathering" | "new"; +type RTCIceProtocol = "tcp" | "udp"; +type RTCIceTcpCandidateType = "active" | "passive" | "so"; +type RTCIceTransportPolicy = "all" | "relay"; type RTCIceTransportState = - | 'checking' - | 'closed' - | 'completed' - | 'connected' - | 'disconnected' - | 'failed' - | 'new'; + | "checking" + | "closed" + | "completed" + | "connected" + | "disconnected" + | "failed" + | "new"; type RTCLifecycleEvent = - | 'connectionstatechange' - | 'iceconnectionstatechange' - | 'icegatheringstatechange' - | 'initialized'; + | "connectionstatechange" + | "iceconnectionstatechange" + | "icegatheringstatechange" + | "initialized"; type RTCPeerConnectionState = - | 'closed' - | 'connected' - | 'connecting' - | 'disconnected' - | 'failed' - | 'new'; -type RTCPriorityType = 'high' | 'low' | 'medium' | 'very-low'; -type RTCRtpTransceiverDirection = 'inactive' | 'recvonly' | 'sendonly' | 'sendrecv' | 'stopped'; -type RTCSctpTransportState = 'closed' | 'connected' | 'connecting'; -type RTCSdpType = 'answer' | 'offer' | 'pranswer' | 'rollback'; + | "closed" + | "connected" + | "connecting" + | "disconnected" + | "failed" + | "new"; +type RTCPriorityType = "high" | "low" | "medium" | "very-low"; +type RTCRtpTransceiverDirection = "inactive" | "recvonly" | "sendonly" | "sendrecv" | "stopped"; +type RTCSctpTransportState = "closed" | "connected" | "connecting"; +type RTCSdpType = "answer" | "offer" | "pranswer" | "rollback"; type RTCSignalingState = - | 'closed' - | 'have-local-offer' - | 'have-local-pranswer' - | 'have-remote-offer' - | 'have-remote-pranswer' - | 'stable'; + | "closed" + | "have-local-offer" + | "have-local-pranswer" + | "have-remote-offer" + | "have-remote-pranswer" + | "stable"; type RTCStatsIceCandidatePairState = - | 'cancelled' - | 'failed' - | 'frozen' - | 'in-progress' - | 'succeeded' - | 'waiting'; + | "cancelled" + | "failed" + | "frozen" + | "in-progress" + | "succeeded" + | "waiting"; type RTCStatsType = - | 'candidate-pair' - | 'codec' - | 'csrc' - | 'data-channel' - | 'inbound-rtp' - | 'local-candidate' - | 'media-source' - | 'outbound-rtp' - | 'peer-connection' - | 'remote-candidate' - | 'remote-inbound-rtp' - | 'remote-outbound-rtp' - | 'session' - | 'track' - | 'transport'; -type ReadableStreamReaderMode = 'byob'; -type RecordingState = 'inactive' | 'paused' | 'recording'; + | "candidate-pair" + | "codec" + | "csrc" + | "data-channel" + | "inbound-rtp" + | "local-candidate" + | "media-source" + | "outbound-rtp" + | "peer-connection" + | "remote-candidate" + | "remote-inbound-rtp" + | "remote-outbound-rtp" + | "session" + | "track" + | "transport"; +type ReadableStreamReaderMode = "byob"; +type RecordingState = "inactive" | "paused" | "recording"; type ReferrerPolicy = - | '' - | 'no-referrer' - | 'no-referrer-when-downgrade' - | 'origin' - | 'origin-when-cross-origin' - | 'same-origin' - | 'strict-origin' - | 'strict-origin-when-cross-origin' - | 'unsafe-url'; -type RenderBlockingStatusType = 'blocking' | 'non-blocking'; + | "" + | "no-referrer" + | "no-referrer-when-downgrade" + | "origin" + | "origin-when-cross-origin" + | "same-origin" + | "strict-origin" + | "strict-origin-when-cross-origin" + | "unsafe-url"; +type RenderBlockingStatusType = "blocking" | "non-blocking"; type RequestCache = - | 'default' - | 'force-cache' - | 'no-cache' - | 'no-store' - | 'only-if-cached' - | 'reload'; -type RequestCredentials = 'include' | 'omit' | 'same-origin'; + | "default" + | "force-cache" + | "no-cache" + | "no-store" + | "only-if-cached" + | "reload"; +type RequestCredentials = "include" | "omit" | "same-origin"; type RequestDestination = - | '' - | 'audio' - | 'audioworklet' - | 'document' - | 'embed' - | 'font' - | 'frame' - | 'iframe' - | 'image' - | 'json' - | 'manifest' - | 'object' - | 'paintworklet' - | 'report' - | 'script' - | 'sharedworker' - | 'style' - | 'track' - | 'video' - | 'worker' - | 'xslt'; -type RequestMode = 'cors' | 'navigate' | 'no-cors' | 'same-origin'; -type RequestPriority = 'auto' | 'high' | 'low'; -type RequestRedirect = 'error' | 'follow' | 'manual'; -type ResizeObserverBoxOptions = 'border-box' | 'content-box' | 'device-pixel-content-box'; -type ResourceCacheTarget = 'chrome' | 'content'; -type ResourceCacheType = 'image' | 'script' | 'stylesheet'; -type ResponseType = 'basic' | 'cors' | 'default' | 'error' | 'opaque' | 'opaqueredirect'; -type SanitizerPresets = 'default'; -type ScreenColorGamut = 'p3' | 'rec2020' | 'srgb'; -type ScrollBehavior = 'auto' | 'instant' | 'smooth'; -type ScrollLogicalPosition = 'center' | 'end' | 'nearest' | 'start'; -type ScrollRestoration = 'auto' | 'manual'; -type ScrollSetting = '' | 'up'; -type SecurityPolicyViolationEventDisposition = 'enforce' | 'report'; -type SelectionMode = 'end' | 'preserve' | 'select' | 'start'; -type SelectorWarningKind = 'SiblingCombinatorAfterScope' | 'UnconstrainedHas'; + | "" + | "audio" + | "audioworklet" + | "document" + | "embed" + | "font" + | "frame" + | "iframe" + | "image" + | "json" + | "manifest" + | "object" + | "paintworklet" + | "report" + | "script" + | "sharedworker" + | "style" + | "track" + | "video" + | "worker" + | "xslt"; +type RequestMode = "cors" | "navigate" | "no-cors" | "same-origin"; +type RequestPriority = "auto" | "high" | "low"; +type RequestRedirect = "error" | "follow" | "manual"; +type ResizeObserverBoxOptions = "border-box" | "content-box" | "device-pixel-content-box"; +type ResourceCacheTarget = "chrome" | "content"; +type ResourceCacheType = "image" | "script" | "stylesheet"; +type ResponseType = "basic" | "cors" | "default" | "error" | "opaque" | "opaqueredirect"; +type SanitizerPresets = "default"; +type ScreenColorGamut = "p3" | "rec2020" | "srgb"; +type ScrollBehavior = "auto" | "instant" | "smooth"; +type ScrollLogicalPosition = "center" | "end" | "nearest" | "start"; +type ScrollRestoration = "auto" | "manual"; +type ScrollSetting = "" | "up"; +type SecurityPolicyViolationEventDisposition = "enforce" | "report"; +type SelectionMode = "end" | "preserve" | "select" | "start"; +type SelectorWarningKind = "SiblingCombinatorAfterScope" | "UnconstrainedHas"; type ServiceWorkerState = - | 'activated' - | 'activating' - | 'installed' - | 'installing' - | 'parsed' - | 'redundant'; -type ServiceWorkerUpdateViaCache = 'all' | 'imports' | 'none'; -type ShadowRootMode = 'closed' | 'open'; -type SlotAssignmentMode = 'manual' | 'named'; -type SocketReadyState = 'closed' | 'closing' | 'halfclosed' | 'open' | 'opening'; -type SourceBufferAppendMode = 'segments' | 'sequence'; + | "activated" + | "activating" + | "installed" + | "installing" + | "parsed" + | "redundant"; +type ServiceWorkerUpdateViaCache = "all" | "imports" | "none"; +type ShadowRootMode = "closed" | "open"; +type SlotAssignmentMode = "manual" | "named"; +type SocketReadyState = "closed" | "closing" | "halfclosed" | "open" | "opening"; +type SourceBufferAppendMode = "segments" | "sequence"; type SpeechRecognitionErrorCode = - | 'aborted' - | 'audio-capture' - | 'bad-grammar' - | 'language-not-supported' - | 'network' - | 'no-speech' - | 'not-allowed' - | 'service-not-allowed'; + | "aborted" + | "audio-capture" + | "bad-grammar" + | "language-not-supported" + | "network" + | "no-speech" + | "not-allowed" + | "service-not-allowed"; type SpeechSynthesisErrorCode = - | 'audio-busy' - | 'audio-hardware' - | 'canceled' - | 'interrupted' - | 'invalid-argument' - | 'language-unavailable' - | 'network' - | 'synthesis-failed' - | 'synthesis-unavailable' - | 'text-too-long' - | 'voice-unavailable'; + | "audio-busy" + | "audio-hardware" + | "canceled" + | "interrupted" + | "invalid-argument" + | "language-unavailable" + | "network" + | "synthesis-failed" + | "synthesis-unavailable" + | "text-too-long" + | "voice-unavailable"; type StreamFilterStatus = - | 'closed' - | 'disconnected' - | 'failed' - | 'finishedtransferringdata' - | 'suspended' - | 'transferringdata' - | 'uninitialized'; -type StringType = 'inline' | 'literal' | 'other' | 'stringbuffer'; + | "closed" + | "disconnected" + | "failed" + | "finishedtransferringdata" + | "suspended" + | "transferringdata" + | "uninitialized"; +type StringType = "inline" | "literal" | "other" | "stringbuffer"; type SupportedType = - | 'application/xhtml+xml' - | 'application/xml' - | 'image/svg+xml' - | 'text/html' - | 'text/xml'; -type TCPReadyState = 'closed' | 'closing' | 'connecting' | 'open'; -type TCPSocketBinaryType = 'arraybuffer' | 'string'; -type TaskPriority = 'background' | 'user-blocking' | 'user-visible'; -type TensorDataLocation = 'cpu' | 'cpu-pinned' | 'gpu-buffer' | 'ml-tensor' | 'none' | 'texture'; -type TextTrackKind = 'captions' | 'chapters' | 'descriptions' | 'metadata' | 'subtitles'; -type TextTrackMode = 'disabled' | 'hidden' | 'showing'; -type TouchEventsOverride = 'disabled' | 'enabled' | 'none'; -type TransferFunction = 'hlg' | 'pq' | 'srgb'; -type UniFFIScaffoldingCallCode = 'error' | 'internal-error' | 'success'; -type VRDisplayEventReason = 'mounted' | 'navigation' | 'requested' | 'unmounted'; -type VREye = 'left' | 'right'; -type VideoColorPrimaries = 'bt2020' | 'bt470bg' | 'bt709' | 'smpte170m' | 'smpte432'; -type VideoEncoderBitrateMode = 'constant' | 'quantizer' | 'variable'; -type VideoMatrixCoefficients = 'bt2020-ncl' | 'bt470bg' | 'bt709' | 'rgb' | 'smpte170m'; + | "application/xhtml+xml" + | "application/xml" + | "image/svg+xml" + | "text/html" + | "text/xml"; +type TCPReadyState = "closed" | "closing" | "connecting" | "open"; +type TCPSocketBinaryType = "arraybuffer" | "string"; +type TaskPriority = "background" | "user-blocking" | "user-visible"; +type TensorDataLocation = "cpu" | "cpu-pinned" | "gpu-buffer" | "ml-tensor" | "none" | "texture"; +type TextTrackKind = "captions" | "chapters" | "descriptions" | "metadata" | "subtitles"; +type TextTrackMode = "disabled" | "hidden" | "showing"; +type TouchEventsOverride = "disabled" | "enabled" | "none"; +type TransferFunction = "hlg" | "pq" | "srgb"; +type UniFFIScaffoldingCallCode = "error" | "internal-error" | "success"; +type VRDisplayEventReason = "mounted" | "navigation" | "requested" | "unmounted"; +type VREye = "left" | "right"; +type VideoColorPrimaries = "bt2020" | "bt470bg" | "bt709" | "smpte170m" | "smpte432"; +type VideoEncoderBitrateMode = "constant" | "quantizer" | "variable"; +type VideoMatrixCoefficients = "bt2020-ncl" | "bt470bg" | "bt709" | "rgb" | "smpte170m"; type VideoPixelFormat = - | 'BGRA' - | 'BGRX' - | 'I420' - | 'I420A' - | 'I420AP10' - | 'I420AP12' - | 'I420P10' - | 'I420P12' - | 'I422' - | 'I422A' - | 'I422AP10' - | 'I422AP12' - | 'I422P10' - | 'I422P12' - | 'I444' - | 'I444A' - | 'I444AP10' - | 'I444AP12' - | 'I444P10' - | 'I444P12' - | 'NV12' - | 'RGBA' - | 'RGBX'; + | "BGRA" + | "BGRX" + | "I420" + | "I420A" + | "I420AP10" + | "I420AP12" + | "I420P10" + | "I420P12" + | "I422" + | "I422A" + | "I422AP10" + | "I422AP12" + | "I422P10" + | "I422P12" + | "I444" + | "I444A" + | "I444AP10" + | "I444AP12" + | "I444P10" + | "I444P12" + | "NV12" + | "RGBA" + | "RGBX"; type VideoTransferCharacteristics = - | 'bt709' - | 'hlg' - | 'iec61966-2-1' - | 'linear' - | 'pq' - | 'smpte170m'; -type VisibilityState = 'hidden' | 'visible'; -type WakeLockType = 'screen'; -type WebGLPowerPreference = 'default' | 'high-performance' | 'low-power'; + | "bt709" + | "hlg" + | "iec61966-2-1" + | "linear" + | "pq" + | "smpte170m"; +type VisibilityState = "hidden" | "visible"; +type WakeLockType = "screen"; +type WebGLPowerPreference = "default" | "high-performance" | "low-power"; type WebIDLProcType = - | 'browser' - | 'extension' - | 'file' - | 'forkServer' - | 'gmpPlugin' - | 'gpu' - | 'inference' - | 'ipdlUnitTest' - | 'preallocated' - | 'privilegedabout' - | 'privilegedmozilla' - | 'rdd' - | 'socket' - | 'unknown' - | 'utility' - | 'vr' - | 'web' - | 'webIsolated' - | 'webServiceWorker' - | 'withCoopCoep'; + | "browser" + | "extension" + | "file" + | "forkServer" + | "gmpPlugin" + | "gpu" + | "inference" + | "ipdlUnitTest" + | "preallocated" + | "privilegedabout" + | "privilegedmozilla" + | "rdd" + | "socket" + | "unknown" + | "utility" + | "vr" + | "web" + | "webIsolated" + | "webServiceWorker" + | "withCoopCoep"; type WebIDLUtilityActorName = - | 'audioDecoder_AppleMedia' - | 'audioDecoder_Generic' - | 'audioDecoder_WMF' - | 'jSOracle' - | 'mfMediaEngineCDM' - | 'unknown' - | 'windowsFileDialog' - | 'windowsUtils'; -type WebTransportCongestionControl = 'default' | 'low-latency' | 'throughput'; -type WebTransportErrorSource = 'session' | 'stream'; -type WebTransportReliabilityMode = 'pending' | 'reliable-only' | 'supports-unreliable'; -type WireframeRectType = 'background' | 'image' | 'text' | 'unknown'; -type WorkerType = 'classic' | 'module'; -type WriteCommandType = 'seek' | 'truncate' | 'write'; -type WriteMode = 'append' | 'appendOrCreate' | 'create' | 'overwrite'; -type XMLHttpRequestResponseType = '' | 'arraybuffer' | 'blob' | 'document' | 'json' | 'text'; -type XREye = 'left' | 'none' | 'right'; -type XRHandedness = 'left' | 'none' | 'right'; -type XRReferenceSpaceType = 'bounded-floor' | 'local' | 'local-floor' | 'unbounded' | 'viewer'; -type XRSessionMode = 'immersive-ar' | 'immersive-vr' | 'inline'; -type XRTargetRayMode = 'gaze' | 'screen' | 'tracked-pointer'; -type XRVisibilityState = 'hidden' | 'visible' | 'visible-blurred'; -type mozPacketDumpType = 'rtcp' | 'rtp' | 'srtcp' | 'srtp'; + | "audioDecoder_AppleMedia" + | "audioDecoder_Generic" + | "audioDecoder_WMF" + | "jSOracle" + | "mfMediaEngineCDM" + | "unknown" + | "windowsFileDialog" + | "windowsUtils"; +type WebTransportCongestionControl = "default" | "low-latency" | "throughput"; +type WebTransportErrorSource = "session" | "stream"; +type WebTransportReliabilityMode = "pending" | "reliable-only" | "supports-unreliable"; +type WireframeRectType = "background" | "image" | "text" | "unknown"; +type WorkerType = "classic" | "module"; +type WriteCommandType = "seek" | "truncate" | "write"; +type WriteMode = "append" | "appendOrCreate" | "create" | "overwrite"; +type XMLHttpRequestResponseType = "" | "arraybuffer" | "blob" | "document" | "json" | "text"; +type XREye = "left" | "none" | "right"; +type XRHandedness = "left" | "none" | "right"; +type XRReferenceSpaceType = "bounded-floor" | "local" | "local-floor" | "unbounded" | "viewer"; +type XRSessionMode = "immersive-ar" | "immersive-vr" | "inline"; +type XRTargetRayMode = "gaze" | "screen" | "tracked-pointer"; +type XRVisibilityState = "hidden" | "visible" | "visible-blurred"; +type mozPacketDumpType = "rtcp" | "rtp" | "srtcp" | "srtp"; ///////////////////////////// /// Window Iterable APIs diff --git a/src/zen/@types/lib.gecko.glean.d.ts b/src/zen/@types/lib.gecko.glean.d.ts index efcc19d50..d08c39cc1 100644 --- a/src/zen/@types/lib.gecko.glean.d.ts +++ b/src/zen/@types/lib.gecko.glean.d.ts @@ -16,7 +16,7 @@ interface GleanImpl { hcmForeground: GleanQuantity; instantiators: GleanString; invertColors: GleanBoolean; - theme: Record<'always' | 'default' | 'never', GleanBoolean>; + theme: Record<"always" | "default" | "never", GleanBoolean>; treeUpdateTiming: GleanTimingDistribution; useSystemColors: GleanBoolean; }; @@ -28,7 +28,7 @@ interface GleanImpl { browserEngagement: { bookmarksToolbarBookmarkAdded: GleanCounter; bookmarksToolbarBookmarkOpened: GleanCounter; - totalTopVisits: Record<'false' | 'true', GleanCounter>; + totalTopVisits: Record<"false" | "true", GleanCounter>; sessionrestoreInterstitial: Record; tabExplicitUnload: GleanEventWithExtras<{ all_tabs_unloaded?: string; @@ -69,7 +69,7 @@ interface GleanImpl { pageReloadNormal: GleanTimingDistribution; pageReloadSkipCache: GleanTimingDistribution; startupTimeline: Record< - 'blankWindowShown' | 'delayedStartupFinished' | 'delayedStartupStarted', + "blankWindowShown" | "delayedStartupFinished" | "delayedStartupStarted", GleanQuantity >; tabClick: GleanTimingDistribution; @@ -77,7 +77,7 @@ interface GleanImpl { }; networking: { - captivePortalBannerDisplayTime: Record<'abort' | 'dismiss' | 'success', GleanCounter>; + captivePortalBannerDisplayTime: Record<"abort" | "dismiss" | "success", GleanCounter>; captivePortalBannerDisplayed: GleanCounter; cacheMetadataFirstReadTime: GleanTimingDistribution; cacheMetadataSecondReadTime: GleanTimingDistribution; @@ -91,30 +91,30 @@ interface GleanImpl { cookieCountUnpartitioned: GleanCustomDistribution; cookieCreationFixupDiff: GleanCustomDistribution; cookieDbValidation: Record< - | 'eOK' - | 'eRejectedAttributeDomainOversize' - | 'eRejectedAttributeExpiryOversize' - | 'eRejectedAttributePathOversize' - | 'eRejectedEmptyNameAndValue' - | 'eRejectedForNonSameSiteness' - | 'eRejectedHttpOnlyButFromScript' - | 'eRejectedInvalidCharName' - | 'eRejectedInvalidCharValue' - | 'eRejectedInvalidDomain' - | 'eRejectedInvalidPath' - | 'eRejectedInvalidPrefix' - | 'eRejectedNameValueOversize' - | 'eRejectedNoneRequiresSecure' - | 'eRejectedPartitionedRequiresSecure' - | 'eRejectedSecureButNonHttps', + | "eOK" + | "eRejectedAttributeDomainOversize" + | "eRejectedAttributeExpiryOversize" + | "eRejectedAttributePathOversize" + | "eRejectedEmptyNameAndValue" + | "eRejectedForNonSameSiteness" + | "eRejectedHttpOnlyButFromScript" + | "eRejectedInvalidCharName" + | "eRejectedInvalidCharValue" + | "eRejectedInvalidDomain" + | "eRejectedInvalidPath" + | "eRejectedInvalidPrefix" + | "eRejectedNameValueOversize" + | "eRejectedNoneRequiresSecure" + | "eRejectedPartitionedRequiresSecure" + | "eRejectedSecureButNonHttps", GleanCounter >; cookiePurgeEntryMax: GleanCustomDistribution; cookiePurgeMax: GleanCustomDistribution; - cookieTimestampFixedCount: Record<'creationTime' | 'lastAccessed', GleanCounter>; + cookieTimestampFixedCount: Record<"creationTime" | "lastAccessed", GleanCounter>; dnsFailedLookupTime: GleanTimingDistribution; dnsLookupTime: GleanTimingDistribution; - dnsNativeCount: Record<'https_private' | 'https_regular' | 'private' | 'regular', GleanCounter>; + dnsNativeCount: Record<"https_private" | "https_regular" | "private" | "regular", GleanCounter>; dnsNativeHttpsCallTime: GleanTimingDistribution; dnsRenewalTime: GleanTimingDistribution; dnsRenewalTimeForTtl: GleanTimingDistribution; @@ -136,57 +136,57 @@ interface GleanImpl { http2UploadThroughput1050: GleanCustomDistribution; http2UploadThroughput50100: GleanCustomDistribution; http3ConnectionCloseReason: Record< - | 'AckedUnsentPacket' - | 'Application' - | 'ApplicationError' - | 'ConnectionIdLimitExceeded' - | 'ConnectionIdsExhausted' - | 'ConnectionRefused' - | 'ConnectionState' - | 'CryptoAlert' - | 'CryptoBufferExceeded' - | 'CryptoError' - | 'DecodingFrame' - | 'DecryptError' - | 'DisabledVersion' - | 'EchRetry' - | 'FinalSizeError' - | 'FlowControlError' - | 'FrameEncodingError' - | 'IdleTimeout' - | 'IntegerOverflow' - | 'InternalError' - | 'InvalidInput' - | 'InvalidMigration' - | 'InvalidPacket' - | 'InvalidResumptionToken' - | 'InvalidRetry' - | 'InvalidStreamId' - | 'InvalidToken' - | 'KeyUpdateBlocked' - | 'KeysDiscarded' - | 'KeysExhausted' - | 'KeysPending' - | 'NoAvailablePath' - | 'NoError' - | 'NoMoreData' - | 'NotAvailable' - | 'NotConnected' - | 'PacketNumberOverlap' - | 'PeerApplicationError' - | 'PeerError' - | 'ProtocolViolation' - | 'QlogError' - | 'StatelessReset' - | 'StreamLimitError' - | 'StreamStateError' - | 'TooMuchData' - | 'TransportParameterError' - | 'UnexpectedMessage' - | 'UnknownConnectionId' - | 'UnknownFrameType' - | 'VersionNegotiation' - | 'WrongRole', + | "AckedUnsentPacket" + | "Application" + | "ApplicationError" + | "ConnectionIdLimitExceeded" + | "ConnectionIdsExhausted" + | "ConnectionRefused" + | "ConnectionState" + | "CryptoAlert" + | "CryptoBufferExceeded" + | "CryptoError" + | "DecodingFrame" + | "DecryptError" + | "DisabledVersion" + | "EchRetry" + | "FinalSizeError" + | "FlowControlError" + | "FrameEncodingError" + | "IdleTimeout" + | "IntegerOverflow" + | "InternalError" + | "InvalidInput" + | "InvalidMigration" + | "InvalidPacket" + | "InvalidResumptionToken" + | "InvalidRetry" + | "InvalidStreamId" + | "InvalidToken" + | "KeyUpdateBlocked" + | "KeysDiscarded" + | "KeysExhausted" + | "KeysPending" + | "NoAvailablePath" + | "NoError" + | "NoMoreData" + | "NotAvailable" + | "NotConnected" + | "PacketNumberOverlap" + | "PeerApplicationError" + | "PeerError" + | "ProtocolViolation" + | "QlogError" + | "StatelessReset" + | "StreamLimitError" + | "StreamStateError" + | "TooMuchData" + | "TransportParameterError" + | "UnexpectedMessage" + | "UnknownConnectionId" + | "UnknownFrameType" + | "VersionNegotiation" + | "WrongRole", GleanCounter >; http3DownloadThroughput: GleanCustomDistribution; @@ -196,55 +196,55 @@ interface GleanImpl { http3EcnCeEct0RatioReceived: GleanCustomDistribution; http3EcnCeEct0RatioSent: GleanCustomDistribution; http3EcnPathCapability: Record< - 'black-hole' | 'bleaching' | 'capable' | 'received-unsent-ect-1', + "black-hole" | "bleaching" | "capable" | "received-unsent-ect-1", GleanCounter >; http3LossRatio: GleanCustomDistribution; http3QuicFrameCount: Record< - | 'ack_frequency_rx' - | 'ack_frequency_tx' - | 'ack_rx' - | 'ack_tx' - | 'connection_close_rx' - | 'connection_close_tx' - | 'crypto_rx' - | 'crypto_tx' - | 'data_blocked_rx' - | 'data_blocked_tx' - | 'datagram_rx' - | 'datagram_tx' - | 'handshake_done_rx' - | 'handshake_done_tx' - | 'max_data_rx' - | 'max_data_tx' - | 'max_stream_data_rx' - | 'max_stream_data_tx' - | 'max_streams_rx' - | 'max_streams_tx' - | 'new_connection_id_rx' - | 'new_connection_id_tx' - | 'new_token_rx' - | 'new_token_tx' - | 'padding_rx' - | 'padding_tx' - | 'path_challenge_rx' - | 'path_challenge_tx' - | 'path_response_rx' - | 'path_response_tx' - | 'ping_rx' - | 'ping_tx' - | 'reset_stream_rx' - | 'reset_stream_tx' - | 'retire_connection_id_rx' - | 'retire_connection_id_tx' - | 'stop_sending_rx' - | 'stop_sending_tx' - | 'stream_data_blocked_rx' - | 'stream_data_blocked_tx' - | 'stream_rx' - | 'stream_tx' - | 'streams_blocked_rx' - | 'streams_blocked_tx', + | "ack_frequency_rx" + | "ack_frequency_tx" + | "ack_rx" + | "ack_tx" + | "connection_close_rx" + | "connection_close_tx" + | "crypto_rx" + | "crypto_tx" + | "data_blocked_rx" + | "data_blocked_tx" + | "datagram_rx" + | "datagram_tx" + | "handshake_done_rx" + | "handshake_done_tx" + | "max_data_rx" + | "max_data_tx" + | "max_stream_data_rx" + | "max_stream_data_tx" + | "max_streams_rx" + | "max_streams_tx" + | "new_connection_id_rx" + | "new_connection_id_tx" + | "new_token_rx" + | "new_token_tx" + | "padding_rx" + | "padding_tx" + | "path_challenge_rx" + | "path_challenge_tx" + | "path_response_rx" + | "path_response_tx" + | "ping_rx" + | "ping_tx" + | "reset_stream_rx" + | "reset_stream_tx" + | "retire_connection_id_rx" + | "retire_connection_id_tx" + | "stop_sending_rx" + | "stop_sending_tx" + | "stream_data_blocked_rx" + | "stream_data_blocked_tx" + | "stream_rx" + | "stream_tx" + | "streams_blocked_rx" + | "streams_blocked_tx", GleanCounter >; http3UdpDatagramSegmentSizeReceived: GleanMemoryDistribution; @@ -258,46 +258,46 @@ interface GleanImpl { http3UploadThroughput1050: GleanCustomDistribution; http3UploadThroughput50100: GleanCustomDistribution; httpChannelDisposition: Record< - | 'http_cancelled' - | 'http_disk' - | 'http_net_early_fail' - | 'http_net_late_fail' - | 'http_net_ok' - | 'https_cancelled' - | 'https_disk' - | 'https_net_early_fail' - | 'https_net_late_fail' - | 'https_net_ok', + | "http_cancelled" + | "http_disk" + | "http_net_early_fail" + | "http_net_late_fail" + | "http_net_ok" + | "https_cancelled" + | "https_disk" + | "https_net_early_fail" + | "https_net_late_fail" + | "https_net_ok", GleanCounter >; httpChannelDispositionDisabledNoReason: Record< - 'cancel' | 'disk' | 'net_early_fail' | 'net_late_fail' | 'net_ok', + "cancel" | "disk" | "net_early_fail" | "net_late_fail" | "net_ok", GleanCounter >; httpChannelDispositionDisabledUpgrade: Record< - 'cancel' | 'disk' | 'net_early_fail' | 'net_late_fail' | 'net_ok', + "cancel" | "disk" | "net_early_fail" | "net_late_fail" | "net_ok", GleanCounter >; httpChannelDispositionDisabledWont: Record< - 'cancel' | 'disk' | 'net_early_fail' | 'net_late_fail' | 'net_ok', + "cancel" | "disk" | "net_early_fail" | "net_late_fail" | "net_ok", GleanCounter >; httpChannelDispositionEnabledNoReason: Record< - 'cancel' | 'disk' | 'net_early_fail' | 'net_late_fail' | 'net_ok', + "cancel" | "disk" | "net_early_fail" | "net_late_fail" | "net_ok", GleanCounter >; httpChannelDispositionEnabledUpgrade: Record< - 'cancel' | 'disk' | 'net_early_fail' | 'net_late_fail' | 'net_ok', + "cancel" | "disk" | "net_early_fail" | "net_late_fail" | "net_ok", GleanCounter >; httpChannelDispositionEnabledWont: Record< - 'cancel' | 'disk' | 'net_early_fail' | 'net_late_fail' | 'net_ok', + "cancel" | "disk" | "net_early_fail" | "net_late_fail" | "net_ok", GleanCounter >; httpChannelDispositionUpgrade: GleanDualLabeledCounter; - httpChannelOnstartStatus: Record<'fail' | 'successful', GleanCounter>; + httpChannelOnstartStatus: Record<"fail" | "successful", GleanCounter>; httpChannelOnstartSuccessHttpsRr: Record< - 'failure' | 'failure_ech_used' | 'success' | 'success_ech_used', + "failure" | "failure_ech_used" | "success" | "success_ech_used", GleanCounter >; httpChannelPageOpenToFirstSent: GleanTimingDistribution; @@ -308,63 +308,63 @@ interface GleanImpl { httpRedirectToSchemeSubresource: Record; httpRedirectToSchemeTopLevel: Record; httpResponseStatusCode: Record< - | '200_ok' - | '301_moved_permanently' - | '302_found' - | '304_not_modified' - | '307_temporary_redirect' - | '308_permanent_redirect' - | '400_bad_request' - | '401_unauthorized' - | '403_forbidden' - | '404_not_found' - | '421_misdirected_request' - | '425_too_early' - | '429_too_many_requests' - | 'other' - | 'other_4xx' - | 'other_5xx', + | "200_ok" + | "301_moved_permanently" + | "302_found" + | "304_not_modified" + | "307_temporary_redirect" + | "308_permanent_redirect" + | "400_bad_request" + | "401_unauthorized" + | "403_forbidden" + | "404_not_found" + | "421_misdirected_request" + | "425_too_early" + | "429_too_many_requests" + | "other" + | "other_4xx" + | "other_5xx", GleanCounter >; - httpResponseVersion: Record<'http_1' | 'http_2' | 'http_3' | 'unknown', GleanCounter>; + httpResponseVersion: Record<"http_1" | "http_2" | "http_3" | "unknown", GleanCounter>; httpToHttpsUpgradeReason: Record< - | 'already_https' - | 'csp_uir' - | 'hsts' - | 'https_first_schemeless_upgrade' - | 'https_first_schemeless_upgrade_downgrade' - | 'https_first_upgrade' - | 'https_first_upgrade_downgrade' - | 'https_only_upgrade' - | 'https_only_upgrade_downgrade' - | 'https_rr' - | 'no_upgrade' - | 'no_upgrade_https' - | 'not_initialized' - | 'not_initialized_https' - | 'skip_upgrade' - | 'upgrade_exception' - | 'web_extension_upgrade', + | "already_https" + | "csp_uir" + | "hsts" + | "https_first_schemeless_upgrade" + | "https_first_schemeless_upgrade_downgrade" + | "https_first_upgrade" + | "https_first_upgrade_downgrade" + | "https_only_upgrade" + | "https_only_upgrade_downgrade" + | "https_rr" + | "no_upgrade" + | "no_upgrade_https" + | "not_initialized" + | "not_initialized_https" + | "skip_upgrade" + | "upgrade_exception" + | "web_extension_upgrade", GleanCounter >; httpsHttpOrLocal: Record< - 'load_is_http' | 'load_is_http_for_local_domain' | 'load_is_https', + "load_is_http" | "load_is_http_for_local_domain" | "load_is_https", GleanCounter >; - httpsRrPresented: Record<'none' | 'presented' | 'presented_with_http3', GleanCounter>; + httpsRrPresented: Record<"none" | "presented" | "presented_with_http3", GleanCounter>; localNetworkAccess: Record< - | 'failure' - | 'private_to_local_http' - | 'private_to_local_https' - | 'public_to_local_http' - | 'public_to_local_https' - | 'public_to_private_http' - | 'public_to_private_https' - | 'success', + | "failure" + | "private_to_local_http" + | "private_to_local_https" + | "public_to_local_http" + | "public_to_local_https" + | "public_to_private_http" + | "public_to_private_https" + | "success", GleanCounter >; localNetworkAccessPort: GleanCustomDistribution; - localNetworkAccessPromptsShown: Record<'local_network' | 'localhost', GleanCounter>; + localNetworkAccessPromptsShown: Record<"local_network" | "localhost", GleanCounter>; localNetworkBlockedTracker: GleanCounter; osSocketLimitReached: GleanCounter; prcloseTcpBlockingTimeConnectivityChange: GleanTimingDistribution; @@ -393,13 +393,13 @@ interface GleanImpl { prconnectcontinueBlockingTimeOffline: GleanTimingDistribution; prconnectcontinueBlockingTimeShutdown: GleanTimingDistribution; proxyInfoType: Record< - 'direct' | 'http' | 'https' | 'socks4' | 'socks4a' | 'socks5' | 'socks5h' | 'unknown', + "direct" | "http" | "https" | "socks4" | "socks4a" | "socks5" | "socks5h" | "unknown", GleanCounter >; residualCacheFolderCount: GleanCounter; - residualCacheFolderRemoval: Record<'failure' | 'success', GleanCounter>; + residualCacheFolderRemoval: Record<"failure" | "success", GleanCounter>; speculativeConnectOutcome: Record< - 'aborted_https_not_enabled' | 'aborted_socket_fail' | 'aborted_socket_limit' | 'successful', + "aborted_https_not_enabled" | "aborted_socket_fail" | "aborted_socket_limit" | "successful", GleanCounter >; sqliteCookiesBlockMainThread: GleanTimingDistribution; @@ -407,249 +407,249 @@ interface GleanImpl { transactionWaitTime: GleanTimingDistribution; transactionWaitTimeHttpsRr: GleanTimingDistribution; trrCompleteLoad: Record< - | 'dns.shaw.ca' - | 'dns.shaw.ca_2' - | 'dns.shaw.ca_3' - | 'doh.xfinity.com' - | 'doh.xfinity.com_2' - | 'doh.xfinity.com_3' - | 'dooh.cloudflare-dns.com' - | 'dooh.cloudflare-dns.com_2' - | 'dooh.cloudflare-dns.com_3' - | 'firefox.dns.nextdns.io' - | 'firefox.dns.nextdns.io_2' - | 'firefox.dns.nextdns.io_3' - | 'mozilla.cloudflare-dns.com' - | 'mozilla.cloudflare-dns.com_2' - | 'mozilla.cloudflare-dns.com_3' - | 'private.canadianshield.cira.ca' - | 'private.canadianshield.cira.ca_2' - | 'private.canadianshield.cira.ca_3', + | "dns.shaw.ca" + | "dns.shaw.ca_2" + | "dns.shaw.ca_3" + | "doh.xfinity.com" + | "doh.xfinity.com_2" + | "doh.xfinity.com_3" + | "dooh.cloudflare-dns.com" + | "dooh.cloudflare-dns.com_2" + | "dooh.cloudflare-dns.com_3" + | "firefox.dns.nextdns.io" + | "firefox.dns.nextdns.io_2" + | "firefox.dns.nextdns.io_3" + | "mozilla.cloudflare-dns.com" + | "mozilla.cloudflare-dns.com_2" + | "mozilla.cloudflare-dns.com_3" + | "private.canadianshield.cira.ca" + | "private.canadianshield.cira.ca_2" + | "private.canadianshield.cira.ca_3", GleanTimingDistribution >; trrDnsEnd: Record< - | 'dns.shaw.ca' - | 'dns.shaw.ca_2' - | 'dns.shaw.ca_3' - | 'doh.xfinity.com' - | 'doh.xfinity.com_2' - | 'doh.xfinity.com_3' - | 'dooh.cloudflare-dns.com' - | 'dooh.cloudflare-dns.com_2' - | 'dooh.cloudflare-dns.com_3' - | 'firefox.dns.nextdns.io' - | 'firefox.dns.nextdns.io_2' - | 'firefox.dns.nextdns.io_3' - | 'mozilla.cloudflare-dns.com' - | 'mozilla.cloudflare-dns.com_2' - | 'mozilla.cloudflare-dns.com_3' - | 'private.canadianshield.cira.ca' - | 'private.canadianshield.cira.ca_2' - | 'private.canadianshield.cira.ca_3', + | "dns.shaw.ca" + | "dns.shaw.ca_2" + | "dns.shaw.ca_3" + | "doh.xfinity.com" + | "doh.xfinity.com_2" + | "doh.xfinity.com_3" + | "dooh.cloudflare-dns.com" + | "dooh.cloudflare-dns.com_2" + | "dooh.cloudflare-dns.com_3" + | "firefox.dns.nextdns.io" + | "firefox.dns.nextdns.io_2" + | "firefox.dns.nextdns.io_3" + | "mozilla.cloudflare-dns.com" + | "mozilla.cloudflare-dns.com_2" + | "mozilla.cloudflare-dns.com_3" + | "private.canadianshield.cira.ca" + | "private.canadianshield.cira.ca_2" + | "private.canadianshield.cira.ca_3", GleanTimingDistribution >; trrDnsStart: Record< - | 'dns.shaw.ca' - | 'dns.shaw.ca_2' - | 'dns.shaw.ca_3' - | 'doh.xfinity.com' - | 'doh.xfinity.com_2' - | 'doh.xfinity.com_3' - | 'dooh.cloudflare-dns.com' - | 'dooh.cloudflare-dns.com_2' - | 'dooh.cloudflare-dns.com_3' - | 'firefox.dns.nextdns.io' - | 'firefox.dns.nextdns.io_2' - | 'firefox.dns.nextdns.io_3' - | 'mozilla.cloudflare-dns.com' - | 'mozilla.cloudflare-dns.com_2' - | 'mozilla.cloudflare-dns.com_3' - | 'private.canadianshield.cira.ca' - | 'private.canadianshield.cira.ca_2' - | 'private.canadianshield.cira.ca_3', + | "dns.shaw.ca" + | "dns.shaw.ca_2" + | "dns.shaw.ca_3" + | "doh.xfinity.com" + | "doh.xfinity.com_2" + | "doh.xfinity.com_3" + | "dooh.cloudflare-dns.com" + | "dooh.cloudflare-dns.com_2" + | "dooh.cloudflare-dns.com_3" + | "firefox.dns.nextdns.io" + | "firefox.dns.nextdns.io_2" + | "firefox.dns.nextdns.io_3" + | "mozilla.cloudflare-dns.com" + | "mozilla.cloudflare-dns.com_2" + | "mozilla.cloudflare-dns.com_3" + | "private.canadianshield.cira.ca" + | "private.canadianshield.cira.ca_2" + | "private.canadianshield.cira.ca_3", GleanTimingDistribution >; trrFetchDuration: Record< - 'h1' | 'h1_network_only' | 'h2' | 'h2_network_only' | 'h3' | 'h3_network_only', + "h1" | "h1_network_only" | "h2" | "h2_network_only" | "h3" | "h3_network_only", GleanTimingDistribution >; trrFirstSentToLastReceived: Record< - | 'dns.shaw.ca' - | 'dns.shaw.ca_2' - | 'dns.shaw.ca_3' - | 'doh.xfinity.com' - | 'doh.xfinity.com_2' - | 'doh.xfinity.com_3' - | 'dooh.cloudflare-dns.com' - | 'dooh.cloudflare-dns.com_2' - | 'dooh.cloudflare-dns.com_3' - | 'firefox.dns.nextdns.io' - | 'firefox.dns.nextdns.io_2' - | 'firefox.dns.nextdns.io_3' - | 'mozilla.cloudflare-dns.com' - | 'mozilla.cloudflare-dns.com_2' - | 'mozilla.cloudflare-dns.com_3' - | 'private.canadianshield.cira.ca' - | 'private.canadianshield.cira.ca_2' - | 'private.canadianshield.cira.ca_3', + | "dns.shaw.ca" + | "dns.shaw.ca_2" + | "dns.shaw.ca_3" + | "doh.xfinity.com" + | "doh.xfinity.com_2" + | "doh.xfinity.com_3" + | "dooh.cloudflare-dns.com" + | "dooh.cloudflare-dns.com_2" + | "dooh.cloudflare-dns.com_3" + | "firefox.dns.nextdns.io" + | "firefox.dns.nextdns.io_2" + | "firefox.dns.nextdns.io_3" + | "mozilla.cloudflare-dns.com" + | "mozilla.cloudflare-dns.com_2" + | "mozilla.cloudflare-dns.com_3" + | "private.canadianshield.cira.ca" + | "private.canadianshield.cira.ca_2" + | "private.canadianshield.cira.ca_3", GleanTimingDistribution >; trrOpenToFirstReceived: Record< - | 'dns.shaw.ca' - | 'dns.shaw.ca_2' - | 'dns.shaw.ca_3' - | 'doh.xfinity.com' - | 'doh.xfinity.com_2' - | 'doh.xfinity.com_3' - | 'dooh.cloudflare-dns.com' - | 'dooh.cloudflare-dns.com_2' - | 'dooh.cloudflare-dns.com_3' - | 'firefox.dns.nextdns.io' - | 'firefox.dns.nextdns.io_2' - | 'firefox.dns.nextdns.io_3' - | 'mozilla.cloudflare-dns.com' - | 'mozilla.cloudflare-dns.com_2' - | 'mozilla.cloudflare-dns.com_3' - | 'private.canadianshield.cira.ca' - | 'private.canadianshield.cira.ca_2' - | 'private.canadianshield.cira.ca_3', + | "dns.shaw.ca" + | "dns.shaw.ca_2" + | "dns.shaw.ca_3" + | "doh.xfinity.com" + | "doh.xfinity.com_2" + | "doh.xfinity.com_3" + | "dooh.cloudflare-dns.com" + | "dooh.cloudflare-dns.com_2" + | "dooh.cloudflare-dns.com_3" + | "firefox.dns.nextdns.io" + | "firefox.dns.nextdns.io_2" + | "firefox.dns.nextdns.io_3" + | "mozilla.cloudflare-dns.com" + | "mozilla.cloudflare-dns.com_2" + | "mozilla.cloudflare-dns.com_3" + | "private.canadianshield.cira.ca" + | "private.canadianshield.cira.ca_2" + | "private.canadianshield.cira.ca_3", GleanTimingDistribution >; trrOpenToFirstSent: Record< - | 'dns.shaw.ca' - | 'dns.shaw.ca_2' - | 'dns.shaw.ca_3' - | 'doh.xfinity.com' - | 'doh.xfinity.com_2' - | 'doh.xfinity.com_3' - | 'dooh.cloudflare-dns.com' - | 'dooh.cloudflare-dns.com_2' - | 'dooh.cloudflare-dns.com_3' - | 'firefox.dns.nextdns.io' - | 'firefox.dns.nextdns.io_2' - | 'firefox.dns.nextdns.io_3' - | 'mozilla.cloudflare-dns.com' - | 'mozilla.cloudflare-dns.com_2' - | 'mozilla.cloudflare-dns.com_3' - | 'private.canadianshield.cira.ca' - | 'private.canadianshield.cira.ca_2' - | 'private.canadianshield.cira.ca_3', + | "dns.shaw.ca" + | "dns.shaw.ca_2" + | "dns.shaw.ca_3" + | "doh.xfinity.com" + | "doh.xfinity.com_2" + | "doh.xfinity.com_3" + | "dooh.cloudflare-dns.com" + | "dooh.cloudflare-dns.com_2" + | "dooh.cloudflare-dns.com_3" + | "firefox.dns.nextdns.io" + | "firefox.dns.nextdns.io_2" + | "firefox.dns.nextdns.io_3" + | "mozilla.cloudflare-dns.com" + | "mozilla.cloudflare-dns.com_2" + | "mozilla.cloudflare-dns.com_3" + | "private.canadianshield.cira.ca" + | "private.canadianshield.cira.ca_2" + | "private.canadianshield.cira.ca_3", GleanTimingDistribution >; - trrRequestCount: Record<'private' | 'regular', GleanCounter>; + trrRequestCount: Record<"private" | "regular", GleanCounter>; trrRequestCountPerConn: Record< - | 'dns.shaw.ca_h1' - | 'dns.shaw.ca_h2' - | 'dns.shaw.ca_h3' - | 'doh.xfinity.com_h1' - | 'doh.xfinity.com_h2' - | 'doh.xfinity.com_h3' - | 'dooh.cloudflare-dns.com_h1' - | 'dooh.cloudflare-dns.com_h2' - | 'dooh.cloudflare-dns.com_h3' - | 'firefox.dns.nextdns.io_h1' - | 'firefox.dns.nextdns.io_h2' - | 'firefox.dns.nextdns.io_h3' - | 'mozilla.cloudflare-dns.com_h1' - | 'mozilla.cloudflare-dns.com_h2' - | 'mozilla.cloudflare-dns.com_h3' - | 'private.canadianshield.cira.ca_h1' - | 'private.canadianshield.cira.ca_h2' - | 'private.canadianshield.cira.ca_h3', + | "dns.shaw.ca_h1" + | "dns.shaw.ca_h2" + | "dns.shaw.ca_h3" + | "doh.xfinity.com_h1" + | "doh.xfinity.com_h2" + | "doh.xfinity.com_h3" + | "dooh.cloudflare-dns.com_h1" + | "dooh.cloudflare-dns.com_h2" + | "dooh.cloudflare-dns.com_h3" + | "firefox.dns.nextdns.io_h1" + | "firefox.dns.nextdns.io_h2" + | "firefox.dns.nextdns.io_h3" + | "mozilla.cloudflare-dns.com_h1" + | "mozilla.cloudflare-dns.com_h2" + | "mozilla.cloudflare-dns.com_h3" + | "private.canadianshield.cira.ca_h1" + | "private.canadianshield.cira.ca_h2" + | "private.canadianshield.cira.ca_h3", GleanCounter >; trrRequestSize: Record< - | 'dns.shaw.ca' - | 'dns.shaw.ca_2' - | 'dns.shaw.ca_3' - | 'doh.xfinity.com' - | 'doh.xfinity.com_2' - | 'doh.xfinity.com_3' - | 'dooh.cloudflare-dns.com' - | 'dooh.cloudflare-dns.com_2' - | 'dooh.cloudflare-dns.com_3' - | 'firefox.dns.nextdns.io' - | 'firefox.dns.nextdns.io_2' - | 'firefox.dns.nextdns.io_3' - | 'mozilla.cloudflare-dns.com' - | 'mozilla.cloudflare-dns.com_2' - | 'mozilla.cloudflare-dns.com_3' - | 'private.canadianshield.cira.ca' - | 'private.canadianshield.cira.ca_2' - | 'private.canadianshield.cira.ca_3', + | "dns.shaw.ca" + | "dns.shaw.ca_2" + | "dns.shaw.ca_3" + | "doh.xfinity.com" + | "doh.xfinity.com_2" + | "doh.xfinity.com_3" + | "dooh.cloudflare-dns.com" + | "dooh.cloudflare-dns.com_2" + | "dooh.cloudflare-dns.com_3" + | "firefox.dns.nextdns.io" + | "firefox.dns.nextdns.io_2" + | "firefox.dns.nextdns.io_3" + | "mozilla.cloudflare-dns.com" + | "mozilla.cloudflare-dns.com_2" + | "mozilla.cloudflare-dns.com_3" + | "private.canadianshield.cira.ca" + | "private.canadianshield.cira.ca_2" + | "private.canadianshield.cira.ca_3", GleanMemoryDistribution >; trrResponseSize: Record< - | 'dns.shaw.ca' - | 'dns.shaw.ca_2' - | 'dns.shaw.ca_3' - | 'doh.xfinity.com' - | 'doh.xfinity.com_2' - | 'doh.xfinity.com_3' - | 'dooh.cloudflare-dns.com' - | 'dooh.cloudflare-dns.com_2' - | 'dooh.cloudflare-dns.com_3' - | 'firefox.dns.nextdns.io' - | 'firefox.dns.nextdns.io_2' - | 'firefox.dns.nextdns.io_3' - | 'mozilla.cloudflare-dns.com' - | 'mozilla.cloudflare-dns.com_2' - | 'mozilla.cloudflare-dns.com_3' - | 'private.canadianshield.cira.ca' - | 'private.canadianshield.cira.ca_2' - | 'private.canadianshield.cira.ca_3', + | "dns.shaw.ca" + | "dns.shaw.ca_2" + | "dns.shaw.ca_3" + | "doh.xfinity.com" + | "doh.xfinity.com_2" + | "doh.xfinity.com_3" + | "dooh.cloudflare-dns.com" + | "dooh.cloudflare-dns.com_2" + | "dooh.cloudflare-dns.com_3" + | "firefox.dns.nextdns.io" + | "firefox.dns.nextdns.io_2" + | "firefox.dns.nextdns.io_3" + | "mozilla.cloudflare-dns.com" + | "mozilla.cloudflare-dns.com_2" + | "mozilla.cloudflare-dns.com_3" + | "private.canadianshield.cira.ca" + | "private.canadianshield.cira.ca_2" + | "private.canadianshield.cira.ca_3", GleanMemoryDistribution >; trrTcpConnection: Record< - | 'dns.shaw.ca' - | 'dns.shaw.ca_2' - | 'dns.shaw.ca_3' - | 'doh.xfinity.com' - | 'doh.xfinity.com_2' - | 'doh.xfinity.com_3' - | 'dooh.cloudflare-dns.com' - | 'dooh.cloudflare-dns.com_2' - | 'dooh.cloudflare-dns.com_3' - | 'firefox.dns.nextdns.io' - | 'firefox.dns.nextdns.io_2' - | 'firefox.dns.nextdns.io_3' - | 'mozilla.cloudflare-dns.com' - | 'mozilla.cloudflare-dns.com_2' - | 'mozilla.cloudflare-dns.com_3' - | 'private.canadianshield.cira.ca' - | 'private.canadianshield.cira.ca_2' - | 'private.canadianshield.cira.ca_3', + | "dns.shaw.ca" + | "dns.shaw.ca_2" + | "dns.shaw.ca_3" + | "doh.xfinity.com" + | "doh.xfinity.com_2" + | "doh.xfinity.com_3" + | "dooh.cloudflare-dns.com" + | "dooh.cloudflare-dns.com_2" + | "dooh.cloudflare-dns.com_3" + | "firefox.dns.nextdns.io" + | "firefox.dns.nextdns.io_2" + | "firefox.dns.nextdns.io_3" + | "mozilla.cloudflare-dns.com" + | "mozilla.cloudflare-dns.com_2" + | "mozilla.cloudflare-dns.com_3" + | "private.canadianshield.cira.ca" + | "private.canadianshield.cira.ca_2" + | "private.canadianshield.cira.ca_3", GleanTimingDistribution >; trrTlsHandshake: Record< - | 'dns.shaw.ca' - | 'dns.shaw.ca_2' - | 'dns.shaw.ca_3' - | 'doh.xfinity.com' - | 'doh.xfinity.com_2' - | 'doh.xfinity.com_3' - | 'dooh.cloudflare-dns.com' - | 'dooh.cloudflare-dns.com_2' - | 'dooh.cloudflare-dns.com_3' - | 'firefox.dns.nextdns.io' - | 'firefox.dns.nextdns.io_2' - | 'firefox.dns.nextdns.io_3' - | 'mozilla.cloudflare-dns.com' - | 'mozilla.cloudflare-dns.com_2' - | 'mozilla.cloudflare-dns.com_3' - | 'private.canadianshield.cira.ca' - | 'private.canadianshield.cira.ca_2' - | 'private.canadianshield.cira.ca_3', + | "dns.shaw.ca" + | "dns.shaw.ca_2" + | "dns.shaw.ca_3" + | "doh.xfinity.com" + | "doh.xfinity.com_2" + | "doh.xfinity.com_3" + | "dooh.cloudflare-dns.com" + | "dooh.cloudflare-dns.com_2" + | "dooh.cloudflare-dns.com_3" + | "firefox.dns.nextdns.io" + | "firefox.dns.nextdns.io_2" + | "firefox.dns.nextdns.io_3" + | "mozilla.cloudflare-dns.com" + | "mozilla.cloudflare-dns.com_2" + | "mozilla.cloudflare-dns.com_3" + | "private.canadianshield.cira.ca" + | "private.canadianshield.cira.ca_2" + | "private.canadianshield.cira.ca_3", GleanTimingDistribution >; connectionAddressType: Record< - 'http_1_ipv4' | 'http_1_ipv6' | 'http_2_ipv4' | 'http_2_ipv6' | 'http_3_ipv4' | 'http_3_ipv6', + "http_1_ipv4" | "http_1_ipv6" | "http_2_ipv4" | "http_2_ipv6" | "http_3_ipv4" | "http_3_ipv6", GleanCounter >; dataTransferredV3Kb: Record; http3Enabled: GleanBoolean; httpsRecordState: Record< - 'all_excluded' | 'invalid' | 'no_default_alpn' | 'others' | 'succeeded' | 'unmatched_cname', + "all_excluded" | "invalid" | "no_default_alpn" | "others" | "succeeded" | "unmatched_cname", GleanCounter >; httpsRrPrefsUsage: GleanQuantity; @@ -810,14 +810,14 @@ interface GleanImpl { }>; prefersHiddenButton: GleanBoolean; temporarilyUnhidden: Record< - | 'addon_install_doorhanger' - | 'attention_blocklist' - | 'attention_permission_denied' - | 'customize' - | 'extension_browser_action_popup' - | 'extension_controlled_setting' - | 'extension_permission_prompt' - | 'extensions_panel_showing', + | "addon_install_doorhanger" + | "attention_blocklist" + | "attention_permission_denied" + | "customize" + | "extension_browser_action_popup" + | "extension_controlled_setting" + | "extension_permission_prompt" + | "extensions_panel_showing", GleanCounter >; toggleVisibility: GleanEventWithExtras<{ @@ -830,7 +830,7 @@ interface GleanImpl { firefoxview: { cumulativeSearches: Record< - 'history' | 'opentabs' | 'recentbrowsing' | 'recentlyclosed' | 'syncedtabs', + "history" | "opentabs" | "recentbrowsing" | "recentlyclosed" | "syncedtabs", GleanCustomDistribution >; }; @@ -1001,47 +1001,47 @@ interface GleanImpl { browser: { attributionErrors: Record< - | 'decode_error' - | 'empty_error' - | 'null_error' - | 'quarantine_error' - | 'read_error' - | 'write_error', + | "decode_error" + | "empty_error" + | "null_error" + | "quarantine_error" + | "read_error" + | "write_error", GleanCounter >; defaultAtLaunch: GleanBoolean; - isUserDefault: Record<'false' | 'true', GleanCounter>; - isUserDefaultError: Record<'false' | 'true', GleanCounter>; - setDefaultAlwaysCheck: Record<'false' | 'true', GleanCounter>; + isUserDefault: Record<"false" | "true", GleanCounter>; + isUserDefaultError: Record<"false" | "true", GleanCounter>; + setDefaultAlwaysCheck: Record<"false" | "true", GleanCounter>; setDefaultDialogPromptRawcount: GleanCustomDistribution; - setDefaultError: Record<'false' | 'true', GleanCounter>; + setDefaultError: Record<"false" | "true", GleanCounter>; setDefaultPdfHandlerUserChoiceResult: Record< - | 'ErrBuild' - | 'ErrExeHash' - | 'ErrExeOther' - | 'ErrExeProgID' - | 'ErrExeRejected' - | 'ErrExeTimeout' - | 'ErrHash' - | 'ErrLaunchExe' - | 'ErrOther' - | 'ErrProgID' - | 'Success', + | "ErrBuild" + | "ErrExeHash" + | "ErrExeOther" + | "ErrExeProgID" + | "ErrExeRejected" + | "ErrExeTimeout" + | "ErrHash" + | "ErrLaunchExe" + | "ErrOther" + | "ErrProgID" + | "Success", GleanCounter >; setDefaultResult: GleanCustomDistribution; setDefaultUserChoiceResult: Record< - | 'ErrBuild' - | 'ErrExeHash' - | 'ErrExeOther' - | 'ErrExeProgID' - | 'ErrExeRejected' - | 'ErrExeTimeout' - | 'ErrHash' - | 'ErrLaunchExe' - | 'ErrOther' - | 'ErrProgID' - | 'Success', + | "ErrBuild" + | "ErrExeHash" + | "ErrExeOther" + | "ErrExeProgID" + | "ErrExeRejected" + | "ErrExeTimeout" + | "ErrHash" + | "ErrLaunchExe" + | "ErrOther" + | "ErrProgID" + | "Success", GleanCounter >; }; @@ -1116,26 +1116,26 @@ interface GleanImpl { evalUsageParentProcess: GleanEventWithExtras<{ fileinfo?: string; value?: string }>; evalUsageSystemContext: GleanEventWithExtras<{ fileinfo?: string; value?: string }>; httpsOnlyModeUpgradeTime: Record< - | 'sub_f_aborted' - | 'sub_f_cxnrefused' - | 'sub_f_other' - | 'sub_f_redirectloop' - | 'sub_f_ssl_badcertdm' - | 'sub_f_ssl_other' - | 'sub_f_ssl_selfsignd' - | 'sub_f_ssl_unkwnissr' - | 'sub_f_timeout' - | 'sub_successful' - | 'top_f_aborted' - | 'top_f_cxnrefused' - | 'top_f_other' - | 'top_f_redirectloop' - | 'top_f_ssl_badcertdm' - | 'top_f_ssl_other' - | 'top_f_ssl_selfsignd' - | 'top_f_ssl_unkwnissr' - | 'top_f_timeout' - | 'top_successful', + | "sub_f_aborted" + | "sub_f_cxnrefused" + | "sub_f_other" + | "sub_f_redirectloop" + | "sub_f_ssl_badcertdm" + | "sub_f_ssl_other" + | "sub_f_ssl_selfsignd" + | "sub_f_ssl_unkwnissr" + | "sub_f_timeout" + | "sub_successful" + | "top_f_aborted" + | "top_f_cxnrefused" + | "top_f_other" + | "top_f_redirectloop" + | "top_f_ssl_badcertdm" + | "top_f_ssl_other" + | "top_f_ssl_selfsignd" + | "top_f_ssl_unkwnissr" + | "top_f_timeout" + | "top_successful", GleanTimingDistribution >; httpsOnlyModeUpgradeType: GleanDualLabeledCounter; @@ -1186,16 +1186,16 @@ interface GleanImpl { cardsQuantity: Record; chromePasswordFileWizard: GleanEventNoExtras; entryPointCategorical: Record< - | 'bookmarks_toolbar' - | 'file_menu' - | 'firstrun' - | 'fxrefresh' - | 'help_menu' - | 'newtab' - | 'passwords' - | 'places' - | 'preferences' - | 'unknown', + | "bookmarks_toolbar" + | "file_menu" + | "firstrun" + | "fxrefresh" + | "help_menu" + | "newtab" + | "passwords" + | "places" + | "preferences" + | "unknown", GleanCounter >; errors: Record; @@ -2113,7 +2113,7 @@ interface GleanImpl { historySidebar: { cumulativeFilterCount: GleanCustomDistribution; cumulativeSearches: GleanCustomDistribution; - filterType: Record<'day' | 'dayandsite' | 'lastvisited' | 'site' | 'visited', GleanCounter>; + filterType: Record<"day" | "dayandsite" | "lastvisited" | "site" | "visited", GleanCounter>; lastvisitedTreeQueryTime: GleanTimingDistribution; }; @@ -2233,14 +2233,14 @@ interface GleanImpl { }; protocolhandlerMailto: { - handlerPromptShown: Record<'fx_default' | 'os_default', GleanCounter>; + handlerPromptShown: Record<"fx_default" | "os_default", GleanCounter>; promptClicked: Record< - | 'dismiss_local_default' - | 'dismiss_os_default' - | 'set_local_default' - | 'set_os_default' - | 'set_os_default_error' - | 'set_os_default_impossible', + | "dismiss_local_default" + | "dismiss_os_default" + | "set_local_default" + | "set_os_default" + | "set_os_default_error" + | "set_os_default_impossible", GleanCounter >; visit: GleanEventWithExtras<{ triggered_externally?: string }>; @@ -2403,7 +2403,7 @@ interface GleanImpl { }; searchbar: { - selectedResultMethod: Record<'click' | 'enter' | 'enterSelection', GleanCounter>; + selectedResultMethod: Record<"click" | "enter" | "enterSelection", GleanCounter>; }; serp: { @@ -2415,7 +2415,7 @@ interface GleanImpl { component?: string; impression_id?: string; }>; - adsBlockedCount: Record<'beyond_viewport' | 'hidden_child' | 'hidden_parent', GleanCounter>; + adsBlockedCount: Record<"beyond_viewport" | "hidden_child" | "hidden_parent", GleanCounter>; categorization: GleanEventWithExtras<{ app_version?: string; channel?: string; @@ -2475,7 +2475,7 @@ interface GleanImpl { }; sessionRestore: { - allFilesCorrupt: Record<'false' | 'true', GleanCounter>; + allFilesCorrupt: Record<"false" | "true", GleanCounter>; autoRestoreDurationUntilEagerTabsRestored: GleanTimingDistribution; backupCanBeLoadedSessionFile: GleanEventWithExtras<{ can_load?: string; @@ -2485,7 +2485,7 @@ interface GleanImpl { collectAllWindowsData: GleanTimingDistribution; collectData: GleanTimingDistribution; collectSessionHistory: GleanTimingDistribution; - corruptFile: Record<'false' | 'true', GleanCounter>; + corruptFile: Record<"false" | "true", GleanCounter>; fileSizeBytes: GleanMemoryDistribution; manualRestoreDurationUntilEagerTabsRestored: GleanTimingDistribution; numberOfEagerTabsRestored: GleanCustomDistribution; @@ -2494,18 +2494,18 @@ interface GleanImpl { readFile: GleanTimingDistribution; restoreWindow: GleanTimingDistribution; shutdownFlushAllOutcomes: Record< - 'abnormal_content_shutdown' | 'complete' | 'oop_frameloader_crashed' | 'timed_out', + "abnormal_content_shutdown" | "complete" | "oop_frameloader_crashed" | "timed_out", GleanCounter >; - shutdownOk: Record<'false' | 'true', GleanCounter>; + shutdownOk: Record<"false" | "true", GleanCounter>; shutdownSuccessSessionStartup: GleanEventWithExtras<{ shutdown_ok?: string; shutdown_reason?: string; }>; - shutdownType: Record<'async' | 'sync', GleanCounter>; + shutdownType: Record<"async" | "sync", GleanCounter>; startupInitSession: GleanTimingDistribution; startupOnloadInitialWindow: GleanTimingDistribution; - startupTimeline: Record<'sessionRestoreInitialized' | 'sessionRestoreRestoring', GleanQuantity>; + startupTimeline: Record<"sessionRestoreInitialized" | "sessionRestoreRestoring", GleanQuantity>; writeFile: GleanTimingDistribution; }; @@ -2540,9 +2540,9 @@ interface GleanImpl { }; pinnedTabs: { - activations: Record<'horizontal_bar' | 'sidebar', GleanCounter>; + activations: Record<"horizontal_bar" | "sidebar", GleanCounter>; close: GleanEventWithExtras<{ layout?: string }>; - count: Record<'horizontal_bar' | 'sidebar', GleanQuantity>; + count: Record<"horizontal_bar" | "sidebar", GleanQuantity>; pin: GleanEventWithExtras<{ layout?: string; source?: string }>; }; @@ -2599,13 +2599,13 @@ interface GleanImpl { browserTabswitch: { spinnerVisible: GleanTimingDistribution; spinnerVisibleTrigger: Record< - | 'none' - | 'onEndSwapDocShells' - | 'onLayersReady' - | 'onLoadTimeout' - | 'onSizeModeOrOcc' - | 'postActions' - | 'preActions', + | "none" + | "onEndSwapDocShells" + | "onLayersReady" + | "onLoadTimeout" + | "onSizeModeOrOcc" + | "postActions" + | "preActions", GleanCounter >; total: GleanTimingDistribution; @@ -2616,9 +2616,9 @@ interface GleanImpl { allTabsPanelDragstartTabEventCount: GleanCounter; allTabsPanelEntrypoint: Record; tabMovement: Record< - | 'from_external_app_next_to_active_tab' - | 'from_external_app_tab_strip_end' - | 'not_from_external_app', + | "from_external_app_next_to_active_tab" + | "from_external_app_tab_strip_end" + | "not_from_external_app", GleanCounter >; textrecognitionError: GleanCounter; @@ -2656,7 +2656,7 @@ interface GleanImpl { }; tabgroup: { - activeGroups: Record<'collapsed' | 'expanded', GleanQuantity>; + activeGroups: Record<"collapsed" | "expanded", GleanQuantity>; addTab: GleanEventWithExtras<{ group_type?: string; layout?: string; @@ -2671,19 +2671,19 @@ interface GleanImpl { }>; delete: GleanEventWithExtras<{ id?: string; source?: string }>; groupInteractions: Record< - | 'change_color' - | 'collapse' - | 'delete' - | 'expand' - | 'hover_preview' - | 'move_window' - | 'open_recent' - | 'open_suggest' - | 'open_tabmenu' - | 'rename' - | 'reopen' - | 'save' - | 'ungroup', + | "change_color" + | "collapse" + | "delete" + | "expand" + | "hover_preview" + | "move_window" + | "open_recent" + | "open_suggest" + | "open_tabmenu" + | "rename" + | "reopen" + | "save" + | "ungroup", GleanCounter >; reopen: GleanEventWithExtras<{ id?: string; layout?: string; source?: string; type?: string }>; @@ -2714,24 +2714,24 @@ interface GleanImpl { tabs_in_group?: string; user_label_length?: string; }>; - tabCountInGroups: Record<'inside' | 'outside', GleanQuantity>; + tabCountInGroups: Record<"inside" | "outside", GleanQuantity>; tabInteractions: Record< - | 'activate_collapsed' - | 'activate_expanded' - | 'add' - | 'close_tab_other' - | 'close_tabmenu' - | 'close_tabstrip' - | 'duplicate' - | 'new' - | 'remove_new_window' - | 'remove_other_window' - | 'remove_same_window' - | 'reorder', + | "activate_collapsed" + | "activate_expanded" + | "add" + | "close_tab_other" + | "close_tabmenu" + | "close_tabstrip" + | "duplicate" + | "new" + | "remove_new_window" + | "remove_other_window" + | "remove_same_window" + | "reorder", GleanCounter >; - tabsPerActiveGroup: Record<'average' | 'max' | 'median' | 'min', GleanQuantity>; - tabsPerSavedGroup: Record<'average' | 'max' | 'median' | 'min', GleanQuantity>; + tabsPerActiveGroup: Record<"average" | "max" | "median" | "min", GleanQuantity>; + tabsPerSavedGroup: Record<"average" | "max" | "median" | "min", GleanQuantity>; ungroup: GleanEventWithExtras<{ source?: string }>; }; @@ -2773,36 +2773,36 @@ interface GleanImpl { suggest: { ingestDownloadTime: Record< - | 'amo-suggestions' - | 'amp' - | 'configuration' - | 'icon' - | 'mdn-suggestions' - | 'weather' - | 'wikipedia' - | 'yelp-suggestions', + | "amo-suggestions" + | "amp" + | "configuration" + | "icon" + | "mdn-suggestions" + | "weather" + | "wikipedia" + | "yelp-suggestions", GleanTimingDistribution >; ingestTime: Record< - | 'amo-suggestions' - | 'amp' - | 'configuration' - | 'icon' - | 'mdn-suggestions' - | 'weather' - | 'wikipedia' - | 'yelp-suggestions', + | "amo-suggestions" + | "amp" + | "configuration" + | "icon" + | "mdn-suggestions" + | "weather" + | "wikipedia" + | "yelp-suggestions", GleanTimingDistribution >; queryTime: Record< - 'amo' | 'amp' | 'mdn' | 'weather' | 'wikipedia' | 'yelp', + "amo" | "amp" | "mdn" | "weather" | "wikipedia" | "yelp", GleanTimingDistribution >; }; suggestRelevance: { - outcome: Record<'boosted' | 'decreased', GleanCounter>; - status: Record<'failure' | 'success', GleanCounter>; + outcome: Record<"boosted" | "decreased", GleanCounter>; + status: Record<"failure" | "success", GleanCounter>; }; urlbar: { @@ -3092,13 +3092,13 @@ interface GleanImpl { domOpenedCount: GleanCounter; domTimeActive: GleanTimingDistribution; entryPoint: Record< - | 'CommandLine' - | 'ContextMenu' - | 'HamburgerMenu' - | 'KeyShortcut' - | 'SessionRestore' - | 'SlowScript' - | 'SystemMenu', + | "CommandLine" + | "ContextMenu" + | "HamburgerMenu" + | "KeyShortcut" + | "SessionRestore" + | "SlowScript" + | "SystemMenu", GleanCounter >; eyedropperOpenedCount: GleanCounter; @@ -3155,7 +3155,7 @@ interface GleanImpl { }; devtoolsInspector: { - fonteditorFontTypeDisplayed: Record<'nonvariable' | 'variable', GleanCounter>; + fonteditorFontTypeDisplayed: Record<"nonvariable" | "variable", GleanCounter>; newRootToReloadDelay: GleanTimingDistribution; nodeSelectionCount: GleanCounter; numberOfCssGridsInAPage: GleanCustomDistribution; @@ -3844,21 +3844,21 @@ interface GleanImpl { bfcache: { combo: Record< - | 'BFCache_Success' - | 'Beforeunload' - | 'Other' - | 'Remote_Subframes' - | 'Req' - | 'SPD_Unload_Req_Peer' - | 'Success_Not_Toplevel' - | 'Unload' - | 'Unload_Req' - | 'Unload_Req_MSE' - | 'Unload_Req_Peer' - | 'Unload_Req_Peer_MSE', + | "BFCache_Success" + | "Beforeunload" + | "Other" + | "Remote_Subframes" + | "Req" + | "SPD_Unload_Req_Peer" + | "Success_Not_Toplevel" + | "Unload" + | "Unload_Req" + | "Unload_Req_MSE" + | "Unload_Req_Peer" + | "Unload_Req_Peer_MSE", GleanCounter >; - pageRestored: Record<'false' | 'true', GleanCounter>; + pageRestored: Record<"false" | "true", GleanCounter>; }; page: { @@ -6280,30 +6280,30 @@ interface GleanImpl { }; canvas: { - used2d: Record<'false' | 'true', GleanCounter>; - webgl2Success: Record<'false' | 'true', GleanCounter>; + used2d: Record<"false" | "true", GleanCounter>; + webgl2Success: Record<"false" | "true", GleanCounter>; webglAcclFailureId: Record; webglFailureId: Record; - webglSuccess: Record<'false' | 'true', GleanCounter>; - webglUsed: Record<'false' | 'true', GleanCounter>; + webglSuccess: Record<"false" | "true", GleanCounter>; + webglUsed: Record<"false" | "true", GleanCounter>; }; webcrypto: { alg: GleanCustomDistribution; - extractableEnc: Record<'false' | 'true', GleanCounter>; - extractableGenerate: Record<'false' | 'true', GleanCounter>; - extractableImport: Record<'false' | 'true', GleanCounter>; - extractableSig: Record<'false' | 'true', GleanCounter>; + extractableEnc: Record<"false" | "true", GleanCounter>; + extractableGenerate: Record<"false" | "true", GleanCounter>; + extractableImport: Record<"false" | "true", GleanCounter>; + extractableSig: Record<"false" | "true", GleanCounter>; method: GleanCustomDistribution; - resolved: Record<'false' | 'true', GleanCounter>; + resolved: Record<"false" | "true", GleanCounter>; }; geolocation: { accuracy: GleanCustomDistribution; - fallback: Record<'none' | 'on_error' | 'on_timeout', GleanCounter>; - linuxProvider: Record<'geoclue' | 'none' | 'portal', GleanBoolean>; + fallback: Record<"none" | "on_error" | "on_timeout", GleanCounter>; + linuxProvider: Record<"geoclue" | "none" | "portal", GleanBoolean>; requestResult: Record< - 'permission_denied' | 'position_unavailable' | 'success' | 'timeout', + "permission_denied" | "position_unavailable" | "success" | "timeout", GleanCounter >; }; @@ -6327,7 +6327,7 @@ interface GleanImpl { mediadrm: { decryption: Record< - 'has_hardware_clearlead' | 'has_hardware_decryption' | 'has_software_clearlead' | 'has_wmf', + "has_hardware_clearlead" | "has_hardware_decryption" | "has_software_clearlead" | "has_wmf", GleanBoolean >; emePlayback: GleanEventWithExtras<{ @@ -6346,24 +6346,24 @@ interface GleanImpl { gmp: { updateXmlFetchResult: Record< - | 'cert_pin_abort' - | 'cert_pin_failed' - | 'cert_pin_invalid' - | 'cert_pin_missing_data' - | 'cert_pin_net_request_error' - | 'cert_pin_net_timeout' - | 'cert_pin_success' - | 'cert_pin_unknown_error' - | 'cert_pin_xml_parse_error' - | 'content_sig_abort' - | 'content_sig_failed' - | 'content_sig_invalid' - | 'content_sig_missing_data' - | 'content_sig_net_request_error' - | 'content_sig_net_timeout' - | 'content_sig_success' - | 'content_sig_unknown_error' - | 'content_sig_xml_parse_error', + | "cert_pin_abort" + | "cert_pin_failed" + | "cert_pin_invalid" + | "cert_pin_missing_data" + | "cert_pin_net_request_error" + | "cert_pin_net_timeout" + | "cert_pin_success" + | "cert_pin_unknown_error" + | "cert_pin_xml_parse_error" + | "content_sig_abort" + | "content_sig_failed" + | "content_sig_invalid" + | "content_sig_missing_data" + | "content_sig_net_request_error" + | "content_sig_net_timeout" + | "content_sig_success" + | "content_sig_unknown_error" + | "content_sig_xml_parse_error", GleanCounter >; }; @@ -6375,31 +6375,31 @@ interface GleanImpl { error: GleanEventWithExtras<{ error_name?: string; error_type?: string; key_system?: string }>; mediaPlayTime: Record; mkvCodecType: Record< - | 'AudioAac' - | 'AudioFlac' - | 'AudioMp3' - | 'AudioOpus' - | 'AudioPcm' - | 'AudioVorbis' - | 'NoCodecSpecified' - | 'VideoAv1' - | 'VideoAvc' - | 'VideoHevc' - | 'VideoVp8' - | 'VideoVp9', + | "AudioAac" + | "AudioFlac" + | "AudioMp3" + | "AudioOpus" + | "AudioPcm" + | "AudioVorbis" + | "NoCodecSpecified" + | "VideoAv1" + | "VideoAvc" + | "VideoHevc" + | "VideoVp8" + | "VideoVp9", GleanCounter >; mkvContentCount: GleanCounter; mseSourceBufferType: Record< - | 'AudioAac' - | 'AudioMp2t' - | 'AudioMp4' - | 'AudioMpeg' - | 'AudioWebm' - | 'VideoHevc' - | 'VideoMp2t' - | 'VideoMp4' - | 'VideoWebm', + | "AudioAac" + | "AudioMp2t" + | "AudioMp4" + | "AudioMpeg" + | "AudioWebm" + | "VideoHevc" + | "VideoMp2t" + | "VideoMp4" + | "VideoWebm", GleanCounter >; mutedPlayTimePercent: Record; @@ -6423,23 +6423,23 @@ interface GleanImpl { mediaAudio: { backend: Record< - | 'aaudio' - | 'alsa' - | 'audiounit' - | 'audiounit-rust' - | 'jack' - | 'opensl' - | 'oss' - | 'pulse' - | 'pulse-rust' - | 'sndio' - | 'sunaudio' - | 'unknown' - | 'wasapi' - | 'winmm', + | "aaudio" + | "alsa" + | "audiounit" + | "audiounit-rust" + | "jack" + | "opensl" + | "oss" + | "pulse" + | "pulse-rust" + | "sndio" + | "sunaudio" + | "unknown" + | "wasapi" + | "winmm", GleanCounter >; - initFailure: Record<'first' | 'other', GleanCounter>; + initFailure: Record<"first" | "other", GleanCounter>; }; mediaPlayback: { @@ -6450,7 +6450,7 @@ interface GleanImpl { key_system?: string; mime_type?: string; }>; - deviceHardwareDecoderSupport: Record<'av1' | 'h264' | 'hevc' | 'vp8' | 'vp9', GleanBoolean>; + deviceHardwareDecoderSupport: Record<"av1" | "h264" | "hevc" | "vp8" | "vp9", GleanBoolean>; firstFrameLoaded: GleanEventWithExtras<{ buffering_time?: string; decoder_name?: string; @@ -6470,51 +6470,51 @@ interface GleanImpl { mediaRecorder: { mimeTypeQuery: Record< - | 'empty' - | 'mkv_aac' - | 'mkv_av1' - | 'mkv_flac' - | 'mkv_h264' - | 'mkv_h265' - | 'mkv_opus' - | 'mkv_others' - | 'mkv_pcm' - | 'mkv_unspecified' - | 'mkv_vorbis' - | 'mkv_vp8' - | 'mkv_vp9' - | 'mp4_aac' - | 'mp4_av1' - | 'mp4_flac' - | 'mp4_h264' - | 'mp4_h265' - | 'mp4_opus' - | 'mp4_others' - | 'mp4_unspecified' - | 'mp4_vp9' - | 'ogg_flac' - | 'ogg_opus' - | 'ogg_others' - | 'ogg_unspecified' - | 'ogg_vorbis' - | 'ogg_vp8' - | 'ogg_vp9' - | 'others' - | 'webm_av1' - | 'webm_opus' - | 'webm_others' - | 'webm_unspecified' - | 'webm_vorbis' - | 'webm_vp8' - | 'webm_vp9', + | "empty" + | "mkv_aac" + | "mkv_av1" + | "mkv_flac" + | "mkv_h264" + | "mkv_h265" + | "mkv_opus" + | "mkv_others" + | "mkv_pcm" + | "mkv_unspecified" + | "mkv_vorbis" + | "mkv_vp8" + | "mkv_vp9" + | "mp4_aac" + | "mp4_av1" + | "mp4_flac" + | "mp4_h264" + | "mp4_h265" + | "mp4_opus" + | "mp4_others" + | "mp4_unspecified" + | "mp4_vp9" + | "ogg_flac" + | "ogg_opus" + | "ogg_others" + | "ogg_unspecified" + | "ogg_vorbis" + | "ogg_vp8" + | "ogg_vp9" + | "others" + | "webm_av1" + | "webm_opus" + | "webm_others" + | "webm_unspecified" + | "webm_vorbis" + | "webm_vp8" + | "webm_vp9", GleanCounter >; }; mediaMp4Parse: { numSampleDescriptionEntries: GleanCustomDistribution; - sampleDescriptionEntriesHaveMultipleCodecs: Record<'false' | 'true', GleanCounter>; - sampleDescriptionEntriesHaveMultipleCrypto: Record<'false' | 'true', GleanCounter>; + sampleDescriptionEntriesHaveMultipleCodecs: Record<"false" | "true", GleanCounter>; + sampleDescriptionEntriesHaveMultipleCrypto: Record<"false" | "true", GleanCounter>; }; mfcdm: { @@ -6540,7 +6540,7 @@ interface GleanImpl { codecStats: { audioPreferredCodec: Record; otherFecSignaled: Record; - ulpfecNegotiated: Record<'negotiated' | 'not_negotiated', GleanCounter>; + ulpfecNegotiated: Record<"negotiated" | "not_negotiated", GleanCounter>; videoPreferredCodec: Record; }; @@ -6574,18 +6574,18 @@ interface GleanImpl { callCount3: GleanCounter; callDuration: GleanTimingDistribution; callType: GleanCustomDistribution; - datachannelNegotiated: Record<'false' | 'true', GleanCounter>; + datachannelNegotiated: Record<"false" | "true", GleanCounter>; getUserMediaType: GleanCustomDistribution; - gmpInitSuccess: Record<'false' | 'true', GleanCounter>; - h264Enabled: Record<'false' | 'true', GleanCounter>; - hardwareH264Enabled: Record<'false' | 'true', GleanCounter>; - hasH264Hardware: Record<'false' | 'true', GleanCounter>; + gmpInitSuccess: Record<"false" | "true", GleanCounter>; + h264Enabled: Record<"false" | "true", GleanCounter>; + hardwareH264Enabled: Record<"false" | "true", GleanCounter>; + hasH264Hardware: Record<"false" | "true", GleanCounter>; maxAudioReceiveTrack: GleanCustomDistribution; maxAudioSendTrack: GleanCustomDistribution; maxVideoReceiveTrack: GleanCustomDistribution; maxVideoSendTrack: GleanCustomDistribution; renegotiations: GleanCustomDistribution; - softwareH264Enabled: Record<'false' | 'true', GleanCounter>; + softwareH264Enabled: Record<"false" | "true", GleanCounter>; videoDecoderBitrateAvgPerCallKbps: GleanCustomDistribution; videoDecoderBitrateStdDevPerCallKbps: GleanCustomDistribution; videoDecoderDiscardedPacketsPerCallPpm: GleanCustomDistribution; @@ -6657,27 +6657,27 @@ interface GleanImpl { }; dom: { - blinkFilesystemUsed: Record<'false' | 'true', GleanCounter>; + blinkFilesystemUsed: Record<"false" | "true", GleanCounter>; forgetSkippableDuringIdle: GleanCustomDistribution; forgetSkippableFrequency: GleanCustomDistribution; fullscreenTransitionBlack: GleanTimingDistribution; gcInProgress: GleanTimingDistribution; gcSliceDuringIdle: GleanCustomDistribution; - scriptLoadingSource: Record<'AltData' | 'Inline' | 'Source' | 'SourceFallback', GleanCounter>; + scriptLoadingSource: Record<"AltData" | "Inline" | "Source" | "SourceFallback", GleanCounter>; slowScriptNoticeCount: GleanCounter; slowScriptPageCount: GleanCounter; storageAccessApiUi: Record< - 'Allow' | 'AllowAutomatically' | 'AllowOnAnySite' | 'Deny' | 'Request', + "Allow" | "AllowAutomatically" | "AllowOnAnySite" | "Deny" | "Request", GleanCounter >; - webkitDirectoryUsed: Record<'false' | 'true', GleanCounter>; - xmlhttprequestAsyncOrSync: Record<'false' | 'true', GleanCounter>; + webkitDirectoryUsed: Record<"false" | "true", GleanCounter>; + xmlhttprequestAsyncOrSync: Record<"false" | "true", GleanCounter>; }; domContentprocess: { buildIdMismatch: GleanCounter; buildIdMismatchFalsePositive: GleanCounter; - launchIsSync: Record<'false' | 'true', GleanCounter>; + launchIsSync: Record<"false" | "true", GleanCounter>; launchMainthread: GleanTimingDistribution; launchTotal: GleanTimingDistribution; osPriorityChangeConsidered: GleanCounter; @@ -6770,16 +6770,16 @@ interface GleanImpl { webNotification: { iconUrlEncoding: Record< - 'document_charset' | 'either_way' | 'neither_way' | 'utf8', + "document_charset" | "either_way" | "neither_way" | "utf8", GleanCounter >; insecureContextPermissionRequest: GleanCounter; - permissionOrigin: Record<'first_party' | 'nested_first_party' | 'third_party', GleanCounter>; + permissionOrigin: Record<"first_party" | "nested_first_party" | "third_party", GleanCounter>; requestPermissionOrigin: Record< - 'first_party' | 'nested_first_party' | 'third_party', + "first_party" | "nested_first_party" | "third_party", GleanCounter >; - showOrigin: Record<'first_party' | 'nested_first_party' | 'third_party', GleanCounter>; + showOrigin: Record<"first_party" | "nested_first_party" | "third_party", GleanCounter>; }; screenwakelock: { @@ -6789,14 +6789,14 @@ interface GleanImpl { webPush: { apiNotify: GleanCounter; - contentEncoding: Record<'aes128gcm' | 'aesgcm', GleanCounter>; + contentEncoding: Record<"aes128gcm" | "aesgcm", GleanCounter>; detectedDuplicatedMessageIds: GleanCounter; errorCode: Record< - | 'decryption_error' - | 'internal_error' - | 'not_delivered' - | 'uncaught_exception' - | 'unhandled_rejection', + | "decryption_error" + | "internal_error" + | "not_delivered" + | "uncaught_exception" + | "unhandled_rejection", GleanCounter >; unsubscribedByClearingData: GleanCounter; @@ -6828,7 +6828,7 @@ interface GleanImpl { quotamanagerInitializeRepository: { numberOfIterations: Record< - 'default' | 'persistent' | 'private' | 'temporary', + "default" | "persistent" | "private" | "temporary", GleanCustomDistribution >; }; @@ -6855,18 +6855,18 @@ interface GleanImpl { mixedContent: { audio: Record< - 'AudioNoUpFailure' | 'AudioNoUpSuccess' | 'AudioUpFailure' | 'AudioUpSuccess', + "AudioNoUpFailure" | "AudioNoUpSuccess" | "AudioUpFailure" | "AudioUpSuccess", GleanCounter >; hsts: GleanCustomDistribution; images: Record< - 'ImgNoUpFailure' | 'ImgNoUpSuccess' | 'ImgUpFailure' | 'ImgUpSuccess', + "ImgNoUpFailure" | "ImgNoUpSuccess" | "ImgUpFailure" | "ImgUpSuccess", GleanCounter >; pageLoad: GleanCustomDistribution; unblockCounter: GleanCustomDistribution; video: Record< - 'VideoNoUpFailure' | 'VideoNoUpSuccess' | 'VideoUpFailure' | 'VideoUpSuccess', + "VideoNoUpFailure" | "VideoNoUpSuccess" | "VideoUpFailure" | "VideoUpSuccess", GleanCounter >; }; @@ -6895,23 +6895,23 @@ interface GleanImpl { isolatedLaunchTime: GleanTimingDistribution; launchTime: GleanTimingDistribution; registrationLoading: GleanTimingDistribution; - running: Record<'All' | 'Fetch', GleanCustomDistribution>; + running: Record<"All" | "Fetch", GleanCustomDistribution>; }; localdomstorage: { - preloadPendingOnFirstAccess: Record<'false' | 'true', GleanCounter>; + preloadPendingOnFirstAccess: Record<"false" | "true", GleanCounter>; shutdownDatabase: GleanTimingDistribution; }; webauthnCreate: { - authenticatorAttachment: Record<'cross-platform' | 'platform' | 'unknown', GleanCounter>; + authenticatorAttachment: Record<"cross-platform" | "platform" | "unknown", GleanCounter>; failure: GleanCounter; passkey: GleanCounter; success: GleanCounter; }; webauthnGet: { - authenticatorAttachment: Record<'cross-platform' | 'platform' | 'unknown', GleanCounter>; + authenticatorAttachment: Record<"cross-platform" | "platform" | "unknown", GleanCounter>; failure: GleanCounter; success: GleanCounter; }; @@ -6924,9 +6924,9 @@ interface GleanImpl { }; htmleditors: { - overriddenByBeforeinputListeners: Record<'false' | 'true', GleanCounter>; - withBeforeinputListeners: Record<'false' | 'true', GleanCounter>; - withMutationObserversWithoutBeforeinputListeners: Record<'false' | 'true', GleanCounter>; + overriddenByBeforeinputListeners: Record<"false" | "true", GleanCounter>; + withBeforeinputListeners: Record<"false" | "true", GleanCounter>; + withMutationObserversWithoutBeforeinputListeners: Record<"false" | "true", GleanCounter>; }; permissions: { @@ -6935,18 +6935,18 @@ interface GleanImpl { }; apzZoom: { - activity: Record<'false' | 'true', GleanCounter>; + activity: Record<"false" | "true", GleanCounter>; pinchsource: GleanCustomDistribution; }; fontlist: { - badFallbackFont: Record<'false' | 'true', GleanCounter>; + badFallbackFont: Record<"false" | "true", GleanCounter>; bundledfontsActivate: GleanTimingDistribution; dwritefontDelayedinitCollect: GleanTimingDistribution; dwritefontDelayedinitCount: GleanCustomDistribution; dwritefontDelayedinitTotal: GleanTimingDistribution; dwritefontInitProblem: GleanCustomDistribution; - fontCacheHit: Record<'false' | 'true', GleanCounter>; + fontCacheHit: Record<"false" | "true", GleanCounter>; initfacenamelists: GleanTimingDistribution; initotherfamilynames: GleanTimingDistribution; initotherfamilynamesNoDeferring: GleanTimingDistribution; @@ -6966,16 +6966,16 @@ interface GleanImpl { graphicsDriverStartupTest: GleanCustomDistribution; linuxWindowProtocol: GleanString; macosVideoLowPower: Record< - | 'FailBacking' - | 'FailEnqueue' - | 'FailMacOSVersion' - | 'FailMultipleVideo' - | 'FailOverlaid' - | 'FailPref' - | 'FailSurface' - | 'FailWindowed' - | 'LowPower' - | 'NotVideo', + | "FailBacking" + | "FailEnqueue" + | "FailMacOSVersion" + | "FailMultipleVideo" + | "FailOverlaid" + | "FailPref" + | "FailSurface" + | "FailWindowed" + | "LowPower" + | "NotVideo", GleanCounter >; osCompositor: GleanBoolean; @@ -7013,25 +7013,25 @@ interface GleanImpl { gfxContent: { fullPaintTime: GleanTimingDistribution; - largePaintPhaseWeightFull: Record<'dl' | 'fb' | 'sb' | 'wrdl', GleanCustomDistribution>; - largePaintPhaseWeightPartial: Record<'dl' | 'fb' | 'sb' | 'wrdl', GleanCustomDistribution>; + largePaintPhaseWeightFull: Record<"dl" | "fb" | "sb" | "wrdl", GleanCustomDistribution>; + largePaintPhaseWeightPartial: Record<"dl" | "fb" | "sb" | "wrdl", GleanCustomDistribution>; paintTime: GleanTimingDistribution; - smallPaintPhaseWeightFull: Record<'dl' | 'fb' | 'sb' | 'wrdl', GleanCustomDistribution>; - smallPaintPhaseWeightPartial: Record<'dl' | 'fb' | 'sb' | 'wrdl', GleanCustomDistribution>; + smallPaintPhaseWeightFull: Record<"dl" | "fb" | "sb" | "wrdl", GleanCustomDistribution>; + smallPaintPhaseWeightPartial: Record<"dl" | "fb" | "sb" | "wrdl", GleanCustomDistribution>; }; gfxContentFrameTime: { fromPaint: GleanCustomDistribution; fromVsync: GleanCustomDistribution; reason: Record< - | 'missed_composite' - | 'missed_composite_long' - | 'missed_composite_low' - | 'missed_composite_mid' - | 'no_vsync' - | 'no_vsync_no_id' - | 'on_time' - | 'slow_composite', + | "missed_composite" + | "missed_composite_long" + | "missed_composite_low" + | "missed_composite_mid" + | "no_vsync" + | "no_vsync_no_id" + | "on_time" + | "slow_composite", GleanCounter >; withSvg: GleanCustomDistribution; @@ -7061,7 +7061,7 @@ interface GleanImpl { }; gpuProcess: { - crashFallbacks: Record<'decoding_disabled' | 'disabled' | 'none', GleanCounter>; + crashFallbacks: Record<"decoding_disabled" | "disabled" | "none", GleanCounter>; featureStatus: GleanString; initializationTime: GleanTimingDistribution; launchTime: GleanTimingDistribution; @@ -7100,138 +7100,138 @@ interface GleanImpl { }; avif: { - a1lx: Record<'absent' | 'present', GleanCounter>; - a1op: Record<'absent' | 'present', GleanCounter>; - alpha: Record<'absent' | 'present', GleanCounter>; + a1lx: Record<"absent" | "present", GleanCounter>; + a1op: Record<"absent" | "present", GleanCounter>; + alpha: Record<"absent" | "present", GleanCounter>; aomDecodeError: Record< - | 'abi_mismatch' - | 'corrupt_frame' - | 'error' - | 'incapable' - | 'invalid_param' - | 'mem_error' - | 'unsup_bitstream' - | 'unsup_feature', + | "abi_mismatch" + | "corrupt_frame" + | "error" + | "incapable" + | "invalid_param" + | "mem_error" + | "unsup_bitstream" + | "unsup_feature", GleanCounter >; - bitDepth: Record<'color_10' | 'color_12' | 'color_16' | 'color_8' | 'unknown', GleanCounter>; + bitDepth: Record<"color_10" | "color_12" | "color_16" | "color_8" | "unknown", GleanCounter>; cicpCp: Record< - | 'bt2020' - | 'bt470bg' - | 'bt470m' - | 'bt601' - | 'bt709' - | 'ebu3213' - | 'generic_film' - | 'reserved' - | 'reserved_13' - | 'reserved_14' - | 'reserved_15' - | 'reserved_16' - | 'reserved_17' - | 'reserved_18' - | 'reserved_19' - | 'reserved_20' - | 'reserved_21' - | 'reserved_3' - | 'reserved_rest' - | 'smpte240' - | 'smpte431' - | 'smpte432' - | 'unspecified' - | 'xyz', + | "bt2020" + | "bt470bg" + | "bt470m" + | "bt601" + | "bt709" + | "ebu3213" + | "generic_film" + | "reserved" + | "reserved_13" + | "reserved_14" + | "reserved_15" + | "reserved_16" + | "reserved_17" + | "reserved_18" + | "reserved_19" + | "reserved_20" + | "reserved_21" + | "reserved_3" + | "reserved_rest" + | "smpte240" + | "smpte431" + | "smpte432" + | "unspecified" + | "xyz", GleanCounter >; cicpMc: Record< - | 'bt2020_cl' - | 'bt2020_ncl' - | 'bt470bg' - | 'bt601' - | 'bt709' - | 'chromat_cl' - | 'chromat_ncl' - | 'fcc' - | 'ictcp' - | 'identity' - | 'reserved' - | 'reserved_rest' - | 'smpte2085' - | 'smpte240' - | 'unspecified' - | 'ycgco', + | "bt2020_cl" + | "bt2020_ncl" + | "bt470bg" + | "bt601" + | "bt709" + | "chromat_cl" + | "chromat_ncl" + | "fcc" + | "ictcp" + | "identity" + | "reserved" + | "reserved_rest" + | "smpte2085" + | "smpte240" + | "unspecified" + | "ycgco", GleanCounter >; cicpTc: Record< - | 'bt2020_10bit' - | 'bt2020_12bit' - | 'bt470bg' - | 'bt470m' - | 'bt601' - | 'bt709' - | 'bt_1361' - | 'hlg' - | 'iec61966' - | 'linear' - | 'log_100' - | 'log_100_sqrt10' - | 'reserved' - | 'reserved_3' - | 'reserved_rest' - | 'smpte2084' - | 'smpte240' - | 'smpte428' - | 'srgb' - | 'unspecified', + | "bt2020_10bit" + | "bt2020_12bit" + | "bt470bg" + | "bt470m" + | "bt601" + | "bt709" + | "bt_1361" + | "hlg" + | "iec61966" + | "linear" + | "log_100" + | "log_100_sqrt10" + | "reserved" + | "reserved_3" + | "reserved_rest" + | "smpte2084" + | "smpte240" + | "smpte428" + | "srgb" + | "unspecified", GleanCounter >; - clap: Record<'absent' | 'present', GleanCounter>; - colr: Record<'absent' | 'both' | 'icc' | 'nclx', GleanCounter>; + clap: Record<"absent" | "present", GleanCounter>; + colr: Record<"absent" | "both" | "icc" | "nclx", GleanCounter>; dav1dGetPictureReturnValue: GleanEventWithExtras<{ value?: string }>; decodeResult: Record< - | 'ConvertYCbCr_failure' - | 'a1lx_essential' - | 'a1op_no_essential' - | 'alpha_y_bpc_mismatch' - | 'alpha_y_sz_mismatch' - | 'construction_method' - | 'decode_error' - | 'frame_size_changed' - | 'ftyp_not_first' - | 'image_item_type' - | 'invalid_cicp' - | 'invalid_parse_status' - | 'ispe_mismatch' - | 'item_loc_not_found' - | 'item_type_missing' - | 'lsel_no_essential' - | 'missing_brand' - | 'multiple_moov' - | 'no_image' - | 'no_item_data_box' - | 'no_moov' - | 'no_primary_item' - | 'no_samples' - | 'out_of_memory' - | 'parse_error' - | 'pipe_init_error' - | 'render_size_mismatch' - | 'size_overflow' - | 'success' - | 'txform_no_essential' - | 'uncategorized' - | 'write_buffer_error', + | "ConvertYCbCr_failure" + | "a1lx_essential" + | "a1op_no_essential" + | "alpha_y_bpc_mismatch" + | "alpha_y_sz_mismatch" + | "construction_method" + | "decode_error" + | "frame_size_changed" + | "ftyp_not_first" + | "image_item_type" + | "invalid_cicp" + | "invalid_parse_status" + | "ispe_mismatch" + | "item_loc_not_found" + | "item_type_missing" + | "lsel_no_essential" + | "missing_brand" + | "multiple_moov" + | "no_image" + | "no_item_data_box" + | "no_moov" + | "no_primary_item" + | "no_samples" + | "out_of_memory" + | "parse_error" + | "pipe_init_error" + | "render_size_mismatch" + | "size_overflow" + | "success" + | "txform_no_essential" + | "uncategorized" + | "write_buffer_error", GleanCounter >; - decoder: Record<'aom' | 'dav1d', GleanCounter>; - grid: Record<'absent' | 'present', GleanCounter>; - ipro: Record<'absent' | 'present', GleanCounter>; - ispe: Record<'absent' | 'bitstream_mismatch' | 'valid', GleanCounter>; - lsel: Record<'absent' | 'present', GleanCounter>; - majorBrand: Record<'avif' | 'avis' | 'other', GleanCounter>; - pasp: Record<'absent' | 'invalid' | 'nonsquare' | 'square', GleanCounter>; - pixi: Record<'absent' | 'bitstream_mismatch' | 'valid', GleanCounter>; - sequence: Record<'absent' | 'present', GleanCounter>; - yuvColorSpace: Record<'bt2020' | 'bt601' | 'bt709' | 'identity' | 'unknown', GleanCounter>; + decoder: Record<"aom" | "dav1d", GleanCounter>; + grid: Record<"absent" | "present", GleanCounter>; + ipro: Record<"absent" | "present", GleanCounter>; + ispe: Record<"absent" | "bitstream_mismatch" | "valid", GleanCounter>; + lsel: Record<"absent" | "present", GleanCounter>; + majorBrand: Record<"avif" | "avis" | "other", GleanCounter>; + pasp: Record<"absent" | "invalid" | "nonsquare" | "square", GleanCounter>; + pixi: Record<"absent" | "bitstream_mismatch" | "valid", GleanCounter>; + sequence: Record<"absent" | "present", GleanCounter>; + yuvColorSpace: Record<"bt2020" | "bt601" | "bt709" | "identity" | "unknown", GleanCounter>; }; imageDecode: { @@ -7256,7 +7256,7 @@ interface GleanImpl { }; ipc: { - transactionCancel: Record<'false' | 'true', GleanCounter>; + transactionCancel: Record<"false" | "true", GleanCounter>; }; process: { @@ -7274,10 +7274,10 @@ interface GleanImpl { animation: GleanTimingDistribution; budget: GleanTimingDistribution; budgetOverrun: GleanTimingDistribution; - budgetWasIncreased: Record<'false' | 'true', GleanCounter>; + budgetWasIncreased: Record<"false" | "true", GleanCounter>; compactTime: GleanTimingDistribution; effectiveness: GleanCustomDistribution; - isZoneGc: Record<'false' | 'true', GleanCounter>; + isZoneGc: Record<"false" | "true", GleanCounter>; markGray: GleanTimingDistribution; markRate: GleanCustomDistribution; markRootsTime: GleanTimingDistribution; @@ -7285,361 +7285,361 @@ interface GleanImpl { markWeak: GleanTimingDistribution; maxPause: GleanTimingDistribution; minorReason: Record< - | 'ABORT_GC' - | 'ALLOC_TRIGGER' - | 'API' - | 'BG_TASK_FINISHED' - | 'CC_FINISHED' - | 'CC_FORCED' - | 'COMPARTMENT_REVIVED' - | 'COMPONENT_UTILS' - | 'DEBUG_GC' - | 'DESTROY_RUNTIME' - | 'DISABLE_GENERATIONAL_GC' - | 'DOCSHELL' - | 'DOM_IPC' - | 'DOM_TESTUTILS' - | 'DOM_UTILS' - | 'DOM_WINDOW_UTILS' - | 'DOM_WORKER' - | 'EAGER_ALLOC_TRIGGER' - | 'EAGER_NURSERY_COLLECTION' - | 'EVICT_NURSERY' - | 'FINISH_GC' - | 'FULL_CELL_PTR_BIGINT_BUFFER' - | 'FULL_CELL_PTR_GETTER_SETTER_BUFFER' - | 'FULL_CELL_PTR_OBJ_BUFFER' - | 'FULL_CELL_PTR_STR_BUFFER' - | 'FULL_GC_TIMER' - | 'FULL_GENERIC_BUFFER' - | 'FULL_SHAPE_BUFFER' - | 'FULL_SLOT_BUFFER' - | 'FULL_VALUE_BUFFER' - | 'FULL_WASM_ANYREF_BUFFER' - | 'FULL_WHOLE_CELL_BUFFER' - | 'HTML_PARSER' - | 'INTER_SLICE_GC' - | 'LAST_DITCH' - | 'LOAD_END' - | 'MEM_PRESSURE' - | 'NSJSCONTEXT_DESTROY' - | 'NURSERY_MALLOC_BUFFERS' - | 'NURSERY_TRAILERS' - | 'OUT_OF_NURSERY' - | 'PAGE_HIDE' - | 'PREPARE_FOR_PAGELOAD' - | 'PREPARE_FOR_TRACING' - | 'RESET' - | 'ROOTS_REMOVED' - | 'SET_DOC_SHELL' - | 'SHARED_MEMORY_LIMIT' - | 'SHUTDOWN_CC' - | 'TOO_MUCH_JIT_CODE' - | 'TOO_MUCH_MALLOC' - | 'TOO_MUCH_WASM_MEMORY' - | 'UNUSED1' - | 'UNUSED2' - | 'UNUSED3' - | 'USER_INACTIVE' - | 'WORKER_SHUTDOWN' - | 'XPCONNECT_SHUTDOWN', + | "ABORT_GC" + | "ALLOC_TRIGGER" + | "API" + | "BG_TASK_FINISHED" + | "CC_FINISHED" + | "CC_FORCED" + | "COMPARTMENT_REVIVED" + | "COMPONENT_UTILS" + | "DEBUG_GC" + | "DESTROY_RUNTIME" + | "DISABLE_GENERATIONAL_GC" + | "DOCSHELL" + | "DOM_IPC" + | "DOM_TESTUTILS" + | "DOM_UTILS" + | "DOM_WINDOW_UTILS" + | "DOM_WORKER" + | "EAGER_ALLOC_TRIGGER" + | "EAGER_NURSERY_COLLECTION" + | "EVICT_NURSERY" + | "FINISH_GC" + | "FULL_CELL_PTR_BIGINT_BUFFER" + | "FULL_CELL_PTR_GETTER_SETTER_BUFFER" + | "FULL_CELL_PTR_OBJ_BUFFER" + | "FULL_CELL_PTR_STR_BUFFER" + | "FULL_GC_TIMER" + | "FULL_GENERIC_BUFFER" + | "FULL_SHAPE_BUFFER" + | "FULL_SLOT_BUFFER" + | "FULL_VALUE_BUFFER" + | "FULL_WASM_ANYREF_BUFFER" + | "FULL_WHOLE_CELL_BUFFER" + | "HTML_PARSER" + | "INTER_SLICE_GC" + | "LAST_DITCH" + | "LOAD_END" + | "MEM_PRESSURE" + | "NSJSCONTEXT_DESTROY" + | "NURSERY_MALLOC_BUFFERS" + | "NURSERY_TRAILERS" + | "OUT_OF_NURSERY" + | "PAGE_HIDE" + | "PREPARE_FOR_PAGELOAD" + | "PREPARE_FOR_TRACING" + | "RESET" + | "ROOTS_REMOVED" + | "SET_DOC_SHELL" + | "SHARED_MEMORY_LIMIT" + | "SHUTDOWN_CC" + | "TOO_MUCH_JIT_CODE" + | "TOO_MUCH_MALLOC" + | "TOO_MUCH_WASM_MEMORY" + | "UNUSED1" + | "UNUSED2" + | "UNUSED3" + | "USER_INACTIVE" + | "WORKER_SHUTDOWN" + | "XPCONNECT_SHUTDOWN", GleanCounter >; minorReasonLong: Record< - | 'ABORT_GC' - | 'ALLOC_TRIGGER' - | 'API' - | 'BG_TASK_FINISHED' - | 'CC_FINISHED' - | 'CC_FORCED' - | 'COMPARTMENT_REVIVED' - | 'COMPONENT_UTILS' - | 'DEBUG_GC' - | 'DESTROY_RUNTIME' - | 'DISABLE_GENERATIONAL_GC' - | 'DOCSHELL' - | 'DOM_IPC' - | 'DOM_TESTUTILS' - | 'DOM_UTILS' - | 'DOM_WINDOW_UTILS' - | 'DOM_WORKER' - | 'EAGER_ALLOC_TRIGGER' - | 'EAGER_NURSERY_COLLECTION' - | 'EVICT_NURSERY' - | 'FINISH_GC' - | 'FULL_CELL_PTR_BIGINT_BUFFER' - | 'FULL_CELL_PTR_GETTER_SETTER_BUFFER' - | 'FULL_CELL_PTR_OBJ_BUFFER' - | 'FULL_CELL_PTR_STR_BUFFER' - | 'FULL_GC_TIMER' - | 'FULL_GENERIC_BUFFER' - | 'FULL_SHAPE_BUFFER' - | 'FULL_SLOT_BUFFER' - | 'FULL_VALUE_BUFFER' - | 'FULL_WASM_ANYREF_BUFFER' - | 'FULL_WHOLE_CELL_BUFFER' - | 'HTML_PARSER' - | 'INTER_SLICE_GC' - | 'LAST_DITCH' - | 'LOAD_END' - | 'MEM_PRESSURE' - | 'NSJSCONTEXT_DESTROY' - | 'NURSERY_MALLOC_BUFFERS' - | 'NURSERY_TRAILERS' - | 'OUT_OF_NURSERY' - | 'PAGE_HIDE' - | 'PREPARE_FOR_PAGELOAD' - | 'PREPARE_FOR_TRACING' - | 'RESET' - | 'ROOTS_REMOVED' - | 'SET_DOC_SHELL' - | 'SHARED_MEMORY_LIMIT' - | 'SHUTDOWN_CC' - | 'TOO_MUCH_JIT_CODE' - | 'TOO_MUCH_MALLOC' - | 'TOO_MUCH_WASM_MEMORY' - | 'UNUSED1' - | 'UNUSED2' - | 'UNUSED3' - | 'USER_INACTIVE' - | 'WORKER_SHUTDOWN' - | 'XPCONNECT_SHUTDOWN', + | "ABORT_GC" + | "ALLOC_TRIGGER" + | "API" + | "BG_TASK_FINISHED" + | "CC_FINISHED" + | "CC_FORCED" + | "COMPARTMENT_REVIVED" + | "COMPONENT_UTILS" + | "DEBUG_GC" + | "DESTROY_RUNTIME" + | "DISABLE_GENERATIONAL_GC" + | "DOCSHELL" + | "DOM_IPC" + | "DOM_TESTUTILS" + | "DOM_UTILS" + | "DOM_WINDOW_UTILS" + | "DOM_WORKER" + | "EAGER_ALLOC_TRIGGER" + | "EAGER_NURSERY_COLLECTION" + | "EVICT_NURSERY" + | "FINISH_GC" + | "FULL_CELL_PTR_BIGINT_BUFFER" + | "FULL_CELL_PTR_GETTER_SETTER_BUFFER" + | "FULL_CELL_PTR_OBJ_BUFFER" + | "FULL_CELL_PTR_STR_BUFFER" + | "FULL_GC_TIMER" + | "FULL_GENERIC_BUFFER" + | "FULL_SHAPE_BUFFER" + | "FULL_SLOT_BUFFER" + | "FULL_VALUE_BUFFER" + | "FULL_WASM_ANYREF_BUFFER" + | "FULL_WHOLE_CELL_BUFFER" + | "HTML_PARSER" + | "INTER_SLICE_GC" + | "LAST_DITCH" + | "LOAD_END" + | "MEM_PRESSURE" + | "NSJSCONTEXT_DESTROY" + | "NURSERY_MALLOC_BUFFERS" + | "NURSERY_TRAILERS" + | "OUT_OF_NURSERY" + | "PAGE_HIDE" + | "PREPARE_FOR_PAGELOAD" + | "PREPARE_FOR_TRACING" + | "RESET" + | "ROOTS_REMOVED" + | "SET_DOC_SHELL" + | "SHARED_MEMORY_LIMIT" + | "SHUTDOWN_CC" + | "TOO_MUCH_JIT_CODE" + | "TOO_MUCH_MALLOC" + | "TOO_MUCH_WASM_MEMORY" + | "UNUSED1" + | "UNUSED2" + | "UNUSED3" + | "USER_INACTIVE" + | "WORKER_SHUTDOWN" + | "XPCONNECT_SHUTDOWN", GleanCounter >; minorTime: GleanTimingDistribution; mmu50: GleanCustomDistribution; - nonIncremental: Record<'false' | 'true', GleanCounter>; + nonIncremental: Record<"false" | "true", GleanCounter>; nonIncrementalReason: Record< - | 'AbortRequested' - | 'CompartmentRevived' - | 'GCBytesTrigger' - | 'GrayRootBufferingFailed' - | 'IncrementalDisabled' - | 'JitCodeBytesTrigger' - | 'MallocBytesTrigger' - | 'ModeChange' - | 'NonIncrementalRequested' - | 'None' - | 'Unused1' - | 'ZoneChange', + | "AbortRequested" + | "CompartmentRevived" + | "GCBytesTrigger" + | "GrayRootBufferingFailed" + | "IncrementalDisabled" + | "JitCodeBytesTrigger" + | "MallocBytesTrigger" + | "ModeChange" + | "NonIncrementalRequested" + | "None" + | "Unused1" + | "ZoneChange", GleanCounter >; nurseryBytes: GleanMemoryDistribution; nurseryPromotionRate: GleanCustomDistribution; parallelMarkInterruptions: GleanCustomDistribution; parallelMarkSpeedup: GleanCustomDistribution; - parallelMarkUsed: Record<'false' | 'true', GleanCounter>; + parallelMarkUsed: Record<"false" | "true", GleanCounter>; parallelMarkUtilization: GleanCustomDistribution; prepareTime: GleanTimingDistribution; pretenureCount: GleanCustomDistribution; reason: Record< - | 'ABORT_GC' - | 'ALLOC_TRIGGER' - | 'API' - | 'BG_TASK_FINISHED' - | 'CC_FINISHED' - | 'CC_FORCED' - | 'COMPARTMENT_REVIVED' - | 'COMPONENT_UTILS' - | 'DEBUG_GC' - | 'DESTROY_RUNTIME' - | 'DISABLE_GENERATIONAL_GC' - | 'DOCSHELL' - | 'DOM_IPC' - | 'DOM_TESTUTILS' - | 'DOM_UTILS' - | 'DOM_WINDOW_UTILS' - | 'DOM_WORKER' - | 'EAGER_ALLOC_TRIGGER' - | 'EAGER_NURSERY_COLLECTION' - | 'EVICT_NURSERY' - | 'FINISH_GC' - | 'FULL_CELL_PTR_BIGINT_BUFFER' - | 'FULL_CELL_PTR_GETTER_SETTER_BUFFER' - | 'FULL_CELL_PTR_OBJ_BUFFER' - | 'FULL_CELL_PTR_STR_BUFFER' - | 'FULL_GC_TIMER' - | 'FULL_GENERIC_BUFFER' - | 'FULL_SHAPE_BUFFER' - | 'FULL_SLOT_BUFFER' - | 'FULL_VALUE_BUFFER' - | 'FULL_WASM_ANYREF_BUFFER' - | 'FULL_WHOLE_CELL_BUFFER' - | 'HTML_PARSER' - | 'INTER_SLICE_GC' - | 'LAST_DITCH' - | 'LOAD_END' - | 'MEM_PRESSURE' - | 'NSJSCONTEXT_DESTROY' - | 'NURSERY_MALLOC_BUFFERS' - | 'NURSERY_TRAILERS' - | 'OUT_OF_NURSERY' - | 'PAGE_HIDE' - | 'PREPARE_FOR_PAGELOAD' - | 'PREPARE_FOR_TRACING' - | 'RESET' - | 'ROOTS_REMOVED' - | 'SET_DOC_SHELL' - | 'SHARED_MEMORY_LIMIT' - | 'SHUTDOWN_CC' - | 'TOO_MUCH_JIT_CODE' - | 'TOO_MUCH_MALLOC' - | 'TOO_MUCH_WASM_MEMORY' - | 'UNUSED1' - | 'UNUSED2' - | 'UNUSED3' - | 'USER_INACTIVE' - | 'WORKER_SHUTDOWN' - | 'XPCONNECT_SHUTDOWN', + | "ABORT_GC" + | "ALLOC_TRIGGER" + | "API" + | "BG_TASK_FINISHED" + | "CC_FINISHED" + | "CC_FORCED" + | "COMPARTMENT_REVIVED" + | "COMPONENT_UTILS" + | "DEBUG_GC" + | "DESTROY_RUNTIME" + | "DISABLE_GENERATIONAL_GC" + | "DOCSHELL" + | "DOM_IPC" + | "DOM_TESTUTILS" + | "DOM_UTILS" + | "DOM_WINDOW_UTILS" + | "DOM_WORKER" + | "EAGER_ALLOC_TRIGGER" + | "EAGER_NURSERY_COLLECTION" + | "EVICT_NURSERY" + | "FINISH_GC" + | "FULL_CELL_PTR_BIGINT_BUFFER" + | "FULL_CELL_PTR_GETTER_SETTER_BUFFER" + | "FULL_CELL_PTR_OBJ_BUFFER" + | "FULL_CELL_PTR_STR_BUFFER" + | "FULL_GC_TIMER" + | "FULL_GENERIC_BUFFER" + | "FULL_SHAPE_BUFFER" + | "FULL_SLOT_BUFFER" + | "FULL_VALUE_BUFFER" + | "FULL_WASM_ANYREF_BUFFER" + | "FULL_WHOLE_CELL_BUFFER" + | "HTML_PARSER" + | "INTER_SLICE_GC" + | "LAST_DITCH" + | "LOAD_END" + | "MEM_PRESSURE" + | "NSJSCONTEXT_DESTROY" + | "NURSERY_MALLOC_BUFFERS" + | "NURSERY_TRAILERS" + | "OUT_OF_NURSERY" + | "PAGE_HIDE" + | "PREPARE_FOR_PAGELOAD" + | "PREPARE_FOR_TRACING" + | "RESET" + | "ROOTS_REMOVED" + | "SET_DOC_SHELL" + | "SHARED_MEMORY_LIMIT" + | "SHUTDOWN_CC" + | "TOO_MUCH_JIT_CODE" + | "TOO_MUCH_MALLOC" + | "TOO_MUCH_WASM_MEMORY" + | "UNUSED1" + | "UNUSED2" + | "UNUSED3" + | "USER_INACTIVE" + | "WORKER_SHUTDOWN" + | "XPCONNECT_SHUTDOWN", GleanCounter >; - reset: Record<'false' | 'true', GleanCounter>; + reset: Record<"false" | "true", GleanCounter>; resetReason: Record< - | 'AbortRequested' - | 'CompartmentRevived' - | 'GCBytesTrigger' - | 'GrayRootBufferingFailed' - | 'IncrementalDisabled' - | 'JitCodeBytesTrigger' - | 'MallocBytesTrigger' - | 'ModeChange' - | 'NonIncrementalRequested' - | 'None' - | 'Unused1' - | 'ZoneChange', + | "AbortRequested" + | "CompartmentRevived" + | "GCBytesTrigger" + | "GrayRootBufferingFailed" + | "IncrementalDisabled" + | "JitCodeBytesTrigger" + | "MallocBytesTrigger" + | "ModeChange" + | "NonIncrementalRequested" + | "None" + | "Unused1" + | "ZoneChange", GleanCounter >; sliceCount: GleanCustomDistribution; sliceTime: GleanTimingDistribution; - sliceWasLong: Record<'false' | 'true', GleanCounter>; + sliceWasLong: Record<"false" | "true", GleanCounter>; slowPhase: Record< - | 'COMPACT' - | 'COMPACT_MOVE' - | 'COMPACT_UPDATE' - | 'COMPACT_UPDATE_CELLS' - | 'DECOMMIT' - | 'DESTROY' - | 'EVICT_NURSERY' - | 'EVICT_NURSERY_FOR_MAJOR_GC' - | 'FINALIZE_END' - | 'FINALIZE_START' - | 'FIND_DEAD_COMPARTMENTS' - | 'GC_BEGIN' - | 'GC_END' - | 'JOIN_PARALLEL_TASKS' - | 'MARK' - | 'MARK_CCWS' - | 'MARK_DELAYED' - | 'MARK_DISCARD_CODE' - | 'MARK_EMBEDDING' - | 'MARK_GRAY' - | 'MARK_GRAY_WEAK' - | 'MARK_INCOMING_GRAY' - | 'MARK_ROOTS' - | 'MARK_RUNTIME_DATA' - | 'MARK_STACK' - | 'MARK_WEAK' - | 'MINOR_GC' - | 'MUTATOR' - | 'PARALLEL_MARK' - | 'PARALLEL_MARK_MARK' - | 'PARALLEL_MARK_OTHER' - | 'PARALLEL_MARK_WAIT' - | 'PREPARE' - | 'PURGE' - | 'PURGE_PROP_MAP_TABLES' - | 'PURGE_SOURCE_URLS' - | 'RELAZIFY_FUNCTIONS' - | 'SWEEP' - | 'SWEEP_ATOMS_TABLE' - | 'SWEEP_BASE_SHAPE' - | 'SWEEP_CC_WRAPPER' - | 'SWEEP_COMPARTMENTS' - | 'SWEEP_COMPRESSION' - | 'SWEEP_FINALIZATION_OBSERVERS' - | 'SWEEP_INITIAL_SHAPE' - | 'SWEEP_INNER_VIEWS' - | 'SWEEP_JIT_DATA' - | 'SWEEP_JIT_SCRIPTS' - | 'SWEEP_MISC' - | 'SWEEP_PROP_MAP' - | 'SWEEP_REGEXP' - | 'SWEEP_UNIQUEIDS' - | 'SWEEP_WEAKMAPS' - | 'SWEEP_WEAK_CACHES' - | 'SWEEP_WEAK_POINTERS' - | 'TRACE_HEAP' - | 'UNMARK' - | 'UNMARK_WEAKMAPS' - | 'UPDATE_ATOMS_BITMAP' - | 'WAIT_BACKGROUND_THREAD' - | 'WEAK_COMPARTMENT_CALLBACK' - | 'WEAK_ZONES_CALLBACK', + | "COMPACT" + | "COMPACT_MOVE" + | "COMPACT_UPDATE" + | "COMPACT_UPDATE_CELLS" + | "DECOMMIT" + | "DESTROY" + | "EVICT_NURSERY" + | "EVICT_NURSERY_FOR_MAJOR_GC" + | "FINALIZE_END" + | "FINALIZE_START" + | "FIND_DEAD_COMPARTMENTS" + | "GC_BEGIN" + | "GC_END" + | "JOIN_PARALLEL_TASKS" + | "MARK" + | "MARK_CCWS" + | "MARK_DELAYED" + | "MARK_DISCARD_CODE" + | "MARK_EMBEDDING" + | "MARK_GRAY" + | "MARK_GRAY_WEAK" + | "MARK_INCOMING_GRAY" + | "MARK_ROOTS" + | "MARK_RUNTIME_DATA" + | "MARK_STACK" + | "MARK_WEAK" + | "MINOR_GC" + | "MUTATOR" + | "PARALLEL_MARK" + | "PARALLEL_MARK_MARK" + | "PARALLEL_MARK_OTHER" + | "PARALLEL_MARK_WAIT" + | "PREPARE" + | "PURGE" + | "PURGE_PROP_MAP_TABLES" + | "PURGE_SOURCE_URLS" + | "RELAZIFY_FUNCTIONS" + | "SWEEP" + | "SWEEP_ATOMS_TABLE" + | "SWEEP_BASE_SHAPE" + | "SWEEP_CC_WRAPPER" + | "SWEEP_COMPARTMENTS" + | "SWEEP_COMPRESSION" + | "SWEEP_FINALIZATION_OBSERVERS" + | "SWEEP_INITIAL_SHAPE" + | "SWEEP_INNER_VIEWS" + | "SWEEP_JIT_DATA" + | "SWEEP_JIT_SCRIPTS" + | "SWEEP_MISC" + | "SWEEP_PROP_MAP" + | "SWEEP_REGEXP" + | "SWEEP_UNIQUEIDS" + | "SWEEP_WEAKMAPS" + | "SWEEP_WEAK_CACHES" + | "SWEEP_WEAK_POINTERS" + | "TRACE_HEAP" + | "UNMARK" + | "UNMARK_WEAKMAPS" + | "UPDATE_ATOMS_BITMAP" + | "WAIT_BACKGROUND_THREAD" + | "WEAK_COMPARTMENT_CALLBACK" + | "WEAK_ZONES_CALLBACK", GleanCounter >; slowTask: Record< - | 'COMPACT' - | 'COMPACT_MOVE' - | 'COMPACT_UPDATE' - | 'COMPACT_UPDATE_CELLS' - | 'DECOMMIT' - | 'DESTROY' - | 'EVICT_NURSERY' - | 'EVICT_NURSERY_FOR_MAJOR_GC' - | 'FINALIZE_END' - | 'FINALIZE_START' - | 'FIND_DEAD_COMPARTMENTS' - | 'GC_BEGIN' - | 'GC_END' - | 'JOIN_PARALLEL_TASKS' - | 'MARK' - | 'MARK_CCWS' - | 'MARK_DELAYED' - | 'MARK_DISCARD_CODE' - | 'MARK_EMBEDDING' - | 'MARK_GRAY' - | 'MARK_GRAY_WEAK' - | 'MARK_INCOMING_GRAY' - | 'MARK_ROOTS' - | 'MARK_RUNTIME_DATA' - | 'MARK_STACK' - | 'MARK_WEAK' - | 'MINOR_GC' - | 'MUTATOR' - | 'PARALLEL_MARK' - | 'PARALLEL_MARK_MARK' - | 'PARALLEL_MARK_OTHER' - | 'PARALLEL_MARK_WAIT' - | 'PREPARE' - | 'PURGE' - | 'PURGE_PROP_MAP_TABLES' - | 'PURGE_SOURCE_URLS' - | 'RELAZIFY_FUNCTIONS' - | 'SWEEP' - | 'SWEEP_ATOMS_TABLE' - | 'SWEEP_BASE_SHAPE' - | 'SWEEP_CC_WRAPPER' - | 'SWEEP_COMPARTMENTS' - | 'SWEEP_COMPRESSION' - | 'SWEEP_FINALIZATION_OBSERVERS' - | 'SWEEP_INITIAL_SHAPE' - | 'SWEEP_INNER_VIEWS' - | 'SWEEP_JIT_DATA' - | 'SWEEP_JIT_SCRIPTS' - | 'SWEEP_MISC' - | 'SWEEP_PROP_MAP' - | 'SWEEP_REGEXP' - | 'SWEEP_UNIQUEIDS' - | 'SWEEP_WEAKMAPS' - | 'SWEEP_WEAK_CACHES' - | 'SWEEP_WEAK_POINTERS' - | 'TRACE_HEAP' - | 'UNMARK' - | 'UNMARK_WEAKMAPS' - | 'UPDATE_ATOMS_BITMAP' - | 'WAIT_BACKGROUND_THREAD' - | 'WEAK_COMPARTMENT_CALLBACK' - | 'WEAK_ZONES_CALLBACK', + | "COMPACT" + | "COMPACT_MOVE" + | "COMPACT_UPDATE" + | "COMPACT_UPDATE_CELLS" + | "DECOMMIT" + | "DESTROY" + | "EVICT_NURSERY" + | "EVICT_NURSERY_FOR_MAJOR_GC" + | "FINALIZE_END" + | "FINALIZE_START" + | "FIND_DEAD_COMPARTMENTS" + | "GC_BEGIN" + | "GC_END" + | "JOIN_PARALLEL_TASKS" + | "MARK" + | "MARK_CCWS" + | "MARK_DELAYED" + | "MARK_DISCARD_CODE" + | "MARK_EMBEDDING" + | "MARK_GRAY" + | "MARK_GRAY_WEAK" + | "MARK_INCOMING_GRAY" + | "MARK_ROOTS" + | "MARK_RUNTIME_DATA" + | "MARK_STACK" + | "MARK_WEAK" + | "MINOR_GC" + | "MUTATOR" + | "PARALLEL_MARK" + | "PARALLEL_MARK_MARK" + | "PARALLEL_MARK_OTHER" + | "PARALLEL_MARK_WAIT" + | "PREPARE" + | "PURGE" + | "PURGE_PROP_MAP_TABLES" + | "PURGE_SOURCE_URLS" + | "RELAZIFY_FUNCTIONS" + | "SWEEP" + | "SWEEP_ATOMS_TABLE" + | "SWEEP_BASE_SHAPE" + | "SWEEP_CC_WRAPPER" + | "SWEEP_COMPARTMENTS" + | "SWEEP_COMPRESSION" + | "SWEEP_FINALIZATION_OBSERVERS" + | "SWEEP_INITIAL_SHAPE" + | "SWEEP_INNER_VIEWS" + | "SWEEP_JIT_DATA" + | "SWEEP_JIT_SCRIPTS" + | "SWEEP_MISC" + | "SWEEP_PROP_MAP" + | "SWEEP_REGEXP" + | "SWEEP_UNIQUEIDS" + | "SWEEP_WEAKMAPS" + | "SWEEP_WEAK_CACHES" + | "SWEEP_WEAK_POINTERS" + | "TRACE_HEAP" + | "UNMARK" + | "UNMARK_WEAKMAPS" + | "UPDATE_ATOMS_BITMAP" + | "WAIT_BACKGROUND_THREAD" + | "WEAK_COMPARTMENT_CALLBACK" + | "WEAK_ZONES_CALLBACK", GleanCounter >; sweepTime: GleanTimingDistribution; @@ -7659,7 +7659,7 @@ interface GleanImpl { scriptPreloader: { mainthreadRecompile: GleanCounter; - requests: Record<'Hit' | 'HitChild' | 'Miss', GleanCounter>; + requests: Record<"Hit" | "HitChild" | "Miss", GleanCounter>; waitTime: GleanTimingDistribution; }; @@ -7682,7 +7682,7 @@ interface GleanImpl { inputEventResponse: GleanTimingDistribution; inputEventResponseCoalesced: GleanTimingDistribution; loadInputEventResponse: GleanTimingDistribution; - longReflowInterruptible: Record<'false' | 'true', GleanCounter>; + longReflowInterruptible: Record<"false" | "true", GleanCounter>; paintRasterizeTime: GleanTimingDistribution; refreshDriverChromeFrameDelay: GleanTimingDistribution; refreshDriverContentFrameDelay: GleanTimingDistribution; @@ -7791,14 +7791,14 @@ interface GleanImpl { }; network: { - cacheEntryCount: Record<'SMARTSIZE' | 'USERDEFINEDSIZE', GleanCustomDistribution>; + cacheEntryCount: Record<"SMARTSIZE" | "USERDEFINEDSIZE", GleanCustomDistribution>; cacheEntryCountShare: Record< - 'IMAGE' | 'JAVASCRIPT' | 'MEDIA' | 'OTHER' | 'STYLESHEET' | 'UNKNOWN' | 'WASM', + "IMAGE" | "JAVASCRIPT" | "MEDIA" | "OTHER" | "STYLESHEET" | "UNKNOWN" | "WASM", GleanCustomDistribution >; - cacheSize: Record<'SMARTSIZE' | 'USERDEFINEDSIZE', GleanMemoryDistribution>; + cacheSize: Record<"SMARTSIZE" | "USERDEFINEDSIZE", GleanMemoryDistribution>; cacheSizeShare: Record< - 'IMAGE' | 'JAVASCRIPT' | 'MEDIA' | 'OTHER' | 'STYLESHEET' | 'UNKNOWN' | 'WASM', + "IMAGE" | "JAVASCRIPT" | "MEDIA" | "OTHER" | "STYLESHEET" | "UNKNOWN" | "WASM", GleanCustomDistribution >; cacheV2InputStreamStatus: GleanCustomDistribution; @@ -7810,19 +7810,19 @@ interface GleanImpl { httpCacheEntryReuseCount: GleanCustomDistribution; backgroundfilesaverThreadCount: GleanCustomDistribution; id: GleanCustomDistribution; - idOnline: Record<'absent' | 'present', GleanCounter>; + idOnline: Record<"absent" | "present", GleanCounter>; ipv4AndIpv6AddressConnectivity: GleanCustomDistribution; relPreloadMissRatio: Record< - | 'TYPE_FETCH_UNUSED' - | 'TYPE_FETCH_USED' - | 'TYPE_FONT_UNUSED' - | 'TYPE_FONT_USED' - | 'TYPE_IMAGE_UNUSED' - | 'TYPE_IMAGE_USED' - | 'TYPE_SCRIPT_UNUSED' - | 'TYPE_SCRIPT_USED' - | 'TYPE_STYLE_UNUSED' - | 'TYPE_STYLE_USED', + | "TYPE_FETCH_UNUSED" + | "TYPE_FETCH_USED" + | "TYPE_FONT_UNUSED" + | "TYPE_FONT_USED" + | "TYPE_IMAGE_UNUSED" + | "TYPE_IMAGE_USED" + | "TYPE_SCRIPT_UNUSED" + | "TYPE_SCRIPT_USED" + | "TYPE_STYLE_UNUSED" + | "TYPE_STYLE_USED", GleanCounter >; alpnMismatchCount: Record; @@ -7830,10 +7830,10 @@ interface GleanImpl { backPressureSuspensionCpType: GleanCustomDistribution; backPressureSuspensionDelayTime: GleanTimingDistribution; backPressureSuspensionRate: Record< - 'NotSuspended' | 'NotSuspendedLocal' | 'Suspended' | 'SuspendedLocal', + "NotSuspended" | "NotSuspendedLocal" | "Suspended" | "SuspendedLocal", GleanCounter >; - byteRangeRequest: Record<'cacheable' | 'not_cacheable', GleanCounter>; + byteRangeRequest: Record<"cacheable" | "not_cacheable", GleanCounter>; cacheHitMissStatPerCacheSize: Record; cacheHitRatePerCacheSize: Record; cacheHitTime: GleanTimingDistribution; @@ -7842,7 +7842,7 @@ interface GleanImpl { completeLoad: GleanTimingDistribution; completeLoadCached: GleanTimingDistribution; completeLoadNet: GleanTimingDistribution; - corsAuthorizationHeader: Record<'allowed' | 'covered_by_wildcard' | 'disallowed', GleanCounter>; + corsAuthorizationHeader: Record<"allowed" | "covered_by_wildcard" | "disallowed", GleanCounter>; dnsEnd: GleanTimingDistribution; dnsEndToConnectStartExp: Record; dnsStart: GleanTimingDistribution; @@ -7850,38 +7850,38 @@ interface GleanImpl { firstSentToLastReceived: GleanTimingDistribution; fontDownloadEnd: GleanTimingDistribution; http3CompleteLoad: Record< - 'supports_http3_page' | 'supports_http3_sub' | 'uses_http3_page' | 'uses_http3_sub', + "supports_http3_page" | "supports_http3_sub" | "uses_http3_page" | "uses_http3_sub", GleanTimingDistribution >; http3FirstSentToLastReceived: Record< - 'supports_http3_page' | 'supports_http3_sub' | 'uses_http3_page' | 'uses_http3_sub', + "supports_http3_page" | "supports_http3_sub" | "uses_http3_page" | "uses_http3_sub", GleanTimingDistribution >; http3OpenToFirstReceived: Record< - 'supports_http3_page' | 'supports_http3_sub' | 'uses_http3_page' | 'uses_http3_sub', + "supports_http3_page" | "supports_http3_sub" | "uses_http3_page" | "uses_http3_sub", GleanTimingDistribution >; http3OpenToFirstSent: Record< - 'supports_http3_page' | 'supports_http3_sub' | 'uses_http3_page' | 'uses_http3_sub', + "supports_http3_page" | "supports_http3_sub" | "uses_http3_page" | "uses_http3_sub", GleanTimingDistribution >; http3TlsHandshake: Record< - 'supports_http3_page' | 'supports_http3_sub' | 'uses_http3_page' | 'uses_http3_sub', + "supports_http3_page" | "supports_http3_sub" | "uses_http3_page" | "uses_http3_sub", GleanTimingDistribution >; httpFetchDuration: Record< - 'h1_cloudflare' | 'h1_others' | 'h2_cloudflare' | 'h2_others' | 'h3_cloudflare' | 'h3_others', + "h1_cloudflare" | "h1_others" | "h2_cloudflare" | "h2_others" | "h3_cloudflare" | "h3_others", GleanTimingDistribution >; httpRevalidation: GleanTimingDistribution; openToFirstReceived: GleanTimingDistribution; openToFirstSent: GleanTimingDistribution; - pageLoadSize: Record<'page' | 'subresources', GleanMemoryDistribution>; + pageLoadSize: Record<"page" | "subresources", GleanMemoryDistribution>; raceCacheBandwidthNotRace: GleanMemoryDistribution; raceCacheBandwidthRaceCacheWin: GleanMemoryDistribution; raceCacheBandwidthRaceNetworkWin: GleanMemoryDistribution; raceCacheValidation: Record< - 'CachedContentNotUsed' | 'CachedContentUsed' | 'NotSent', + "CachedContentNotUsed" | "CachedContentUsed" | "NotSent", GleanCounter >; raceCacheWithNetworkOcecOnStartDiff: GleanTimingDistribution; @@ -7889,99 +7889,99 @@ interface GleanImpl { responseEndParentToContent: Record; responseStartParentToContentExp: Record; retriedSystemChannelAddonStatus: Record< - | 'cancel' - | 'connect_fail' - | 'connectivity' - | 'dns' - | 'http_status' - | 'offline' - | 'ok' - | 'other' - | 'partial' - | 'refused' - | 'reset' - | 'timeout' - | 'tls_fail', + | "cancel" + | "connect_fail" + | "connectivity" + | "dns" + | "http_status" + | "offline" + | "ok" + | "other" + | "partial" + | "refused" + | "reset" + | "timeout" + | "tls_fail", GleanCounter >; retriedSystemChannelAddonversionStatus: Record< - | 'cancel' - | 'connect_fail' - | 'connectivity' - | 'dns' - | 'http_status' - | 'offline' - | 'ok' - | 'other' - | 'partial' - | 'refused' - | 'reset' - | 'timeout' - | 'tls_fail', + | "cancel" + | "connect_fail" + | "connectivity" + | "dns" + | "http_status" + | "offline" + | "ok" + | "other" + | "partial" + | "refused" + | "reset" + | "timeout" + | "tls_fail", GleanCounter >; retriedSystemChannelOtherStatus: Record< - | 'cancel' - | 'connect_fail' - | 'connectivity' - | 'dns' - | 'http_status' - | 'offline' - | 'ok' - | 'other' - | 'partial' - | 'refused' - | 'reset' - | 'timeout' - | 'tls_fail', + | "cancel" + | "connect_fail" + | "connectivity" + | "dns" + | "http_status" + | "offline" + | "ok" + | "other" + | "partial" + | "refused" + | "reset" + | "timeout" + | "tls_fail", GleanCounter >; retriedSystemChannelRemoteSettingsStatus: Record< - | 'cancel' - | 'connect_fail' - | 'connectivity' - | 'dns' - | 'http_status' - | 'offline' - | 'ok' - | 'other' - | 'partial' - | 'refused' - | 'reset' - | 'timeout' - | 'tls_fail', + | "cancel" + | "connect_fail" + | "connectivity" + | "dns" + | "http_status" + | "offline" + | "ok" + | "other" + | "partial" + | "refused" + | "reset" + | "timeout" + | "tls_fail", GleanCounter >; retriedSystemChannelTelemetryStatus: Record< - | 'cancel' - | 'connect_fail' - | 'connectivity' - | 'dns' - | 'http_status' - | 'offline' - | 'ok' - | 'other' - | 'partial' - | 'refused' - | 'reset' - | 'timeout' - | 'tls_fail', + | "cancel" + | "connect_fail" + | "connectivity" + | "dns" + | "http_status" + | "offline" + | "ok" + | "other" + | "partial" + | "refused" + | "reset" + | "timeout" + | "tls_fail", GleanCounter >; retriedSystemChannelUpdateStatus: Record< - | 'cancel' - | 'connect_fail' - | 'connectivity' - | 'dns' - | 'http_status' - | 'offline' - | 'ok' - | 'other' - | 'partial' - | 'refused' - | 'reset' - | 'timeout' - | 'tls_fail', + | "cancel" + | "connect_fail" + | "connectivity" + | "dns" + | "http_status" + | "offline" + | "ok" + | "other" + | "partial" + | "refused" + | "reset" + | "timeout" + | "tls_fail", GleanCounter >; subCacheReadTime: GleanTimingDistribution; @@ -7998,190 +7998,190 @@ interface GleanImpl { subTcpConnection: GleanTimingDistribution; subTlsHandshake: GleanTimingDistribution; supHttp3TcpConnection: Record< - 'supports_http3_page' | 'supports_http3_sub', + "supports_http3_page" | "supports_http3_sub", GleanTimingDistribution >; systemChannelAddonStatus: Record< - | 'cancel' - | 'connect_fail' - | 'connectivity' - | 'dns' - | 'http_status' - | 'offline' - | 'ok' - | 'other' - | 'partial' - | 'refused' - | 'reset' - | 'timeout' - | 'tls_fail', + | "cancel" + | "connect_fail" + | "connectivity" + | "dns" + | "http_status" + | "offline" + | "ok" + | "other" + | "partial" + | "refused" + | "reset" + | "timeout" + | "tls_fail", GleanCounter >; systemChannelAddonversionStatus: Record< - | 'cancel' - | 'connect_fail' - | 'connectivity' - | 'dns' - | 'http_status' - | 'offline' - | 'ok' - | 'other' - | 'partial' - | 'refused' - | 'reset' - | 'timeout' - | 'tls_fail', + | "cancel" + | "connect_fail" + | "connectivity" + | "dns" + | "http_status" + | "offline" + | "ok" + | "other" + | "partial" + | "refused" + | "reset" + | "timeout" + | "tls_fail", GleanCounter >; systemChannelOtherStatus: Record< - | 'cancel' - | 'connect_fail' - | 'connectivity' - | 'dns' - | 'http_status' - | 'offline' - | 'ok' - | 'other' - | 'partial' - | 'refused' - | 'reset' - | 'timeout' - | 'tls_fail', + | "cancel" + | "connect_fail" + | "connectivity" + | "dns" + | "http_status" + | "offline" + | "ok" + | "other" + | "partial" + | "refused" + | "reset" + | "timeout" + | "tls_fail", GleanCounter >; systemChannelRemoteSettingsStatus: Record< - | 'cancel' - | 'connect_fail' - | 'connectivity' - | 'dns' - | 'http_status' - | 'offline' - | 'ok' - | 'other' - | 'partial' - | 'refused' - | 'reset' - | 'timeout' - | 'tls_fail', + | "cancel" + | "connect_fail" + | "connectivity" + | "dns" + | "http_status" + | "offline" + | "ok" + | "other" + | "partial" + | "refused" + | "reset" + | "timeout" + | "tls_fail", GleanCounter >; systemChannelSuccessOrFailure: Record< - | 'cancel' - | 'connect_fail' - | 'connectivity' - | 'dns' - | 'http_status' - | 'offline' - | 'ok' - | 'other' - | 'partial' - | 'refused' - | 'reset' - | 'timeout' - | 'tls_fail', + | "cancel" + | "connect_fail" + | "connectivity" + | "dns" + | "http_status" + | "offline" + | "ok" + | "other" + | "partial" + | "refused" + | "reset" + | "timeout" + | "tls_fail", GleanCounter >; systemChannelTelemetryStatus: Record< - | 'cancel' - | 'connect_fail' - | 'connectivity' - | 'dns' - | 'http_status' - | 'offline' - | 'ok' - | 'other' - | 'partial' - | 'refused' - | 'reset' - | 'timeout' - | 'tls_fail', + | "cancel" + | "connect_fail" + | "connectivity" + | "dns" + | "http_status" + | "offline" + | "ok" + | "other" + | "partial" + | "refused" + | "reset" + | "timeout" + | "tls_fail", GleanCounter >; systemChannelUpdateStatus: Record< - | 'cancel' - | 'connect_fail' - | 'connectivity' - | 'dns' - | 'http_status' - | 'offline' - | 'ok' - | 'other' - | 'partial' - | 'refused' - | 'reset' - | 'timeout' - | 'tls_fail', + | "cancel" + | "connect_fail" + | "connectivity" + | "dns" + | "http_status" + | "offline" + | "ok" + | "other" + | "partial" + | "refused" + | "reset" + | "timeout" + | "tls_fail", GleanCounter >; tcpConnection: GleanTimingDistribution; - tlsEarlyDataAccepted: Record<'accepted' | 'rejected', GleanCounter>; + tlsEarlyDataAccepted: Record<"accepted" | "rejected", GleanCounter>; tlsEarlyDataBytesWritten: GleanCustomDistribution; tlsEarlyDataNegotiated: Record< - 'available_and_used' | 'available_but_not_used' | 'not_available', + "available_and_used" | "available_but_not_used" | "not_available", GleanCounter >; tlsHandshake: GleanTimingDistribution; trrIdleCloseTimeH1: Record< - | 'dns.shaw.ca' - | 'dns.shaw.ca_2' - | 'dns.shaw.ca_3' - | 'doh.xfinity.com' - | 'doh.xfinity.com_2' - | 'doh.xfinity.com_3' - | 'dooh.cloudflare-dns.com' - | 'dooh.cloudflare-dns.com_2' - | 'dooh.cloudflare-dns.com_3' - | 'firefox.dns.nextdns.io' - | 'firefox.dns.nextdns.io_2' - | 'firefox.dns.nextdns.io_3' - | 'mozilla.cloudflare-dns.com' - | 'mozilla.cloudflare-dns.com_2' - | 'mozilla.cloudflare-dns.com_3' - | 'private.canadianshield.cira.ca' - | 'private.canadianshield.cira.ca_2' - | 'private.canadianshield.cira.ca_3', + | "dns.shaw.ca" + | "dns.shaw.ca_2" + | "dns.shaw.ca_3" + | "doh.xfinity.com" + | "doh.xfinity.com_2" + | "doh.xfinity.com_3" + | "dooh.cloudflare-dns.com" + | "dooh.cloudflare-dns.com_2" + | "dooh.cloudflare-dns.com_3" + | "firefox.dns.nextdns.io" + | "firefox.dns.nextdns.io_2" + | "firefox.dns.nextdns.io_3" + | "mozilla.cloudflare-dns.com" + | "mozilla.cloudflare-dns.com_2" + | "mozilla.cloudflare-dns.com_3" + | "private.canadianshield.cira.ca" + | "private.canadianshield.cira.ca_2" + | "private.canadianshield.cira.ca_3", GleanTimingDistribution >; trrIdleCloseTimeH2: Record< - | 'dns.shaw.ca' - | 'dns.shaw.ca_2' - | 'dns.shaw.ca_3' - | 'doh.xfinity.com' - | 'doh.xfinity.com_2' - | 'doh.xfinity.com_3' - | 'dooh.cloudflare-dns.com' - | 'dooh.cloudflare-dns.com_2' - | 'dooh.cloudflare-dns.com_3' - | 'firefox.dns.nextdns.io' - | 'firefox.dns.nextdns.io_2' - | 'firefox.dns.nextdns.io_3' - | 'mozilla.cloudflare-dns.com' - | 'mozilla.cloudflare-dns.com_2' - | 'mozilla.cloudflare-dns.com_3' - | 'private.canadianshield.cira.ca' - | 'private.canadianshield.cira.ca_2' - | 'private.canadianshield.cira.ca_3', + | "dns.shaw.ca" + | "dns.shaw.ca_2" + | "dns.shaw.ca_3" + | "doh.xfinity.com" + | "doh.xfinity.com_2" + | "doh.xfinity.com_3" + | "dooh.cloudflare-dns.com" + | "dooh.cloudflare-dns.com_2" + | "dooh.cloudflare-dns.com_3" + | "firefox.dns.nextdns.io" + | "firefox.dns.nextdns.io_2" + | "firefox.dns.nextdns.io_3" + | "mozilla.cloudflare-dns.com" + | "mozilla.cloudflare-dns.com_2" + | "mozilla.cloudflare-dns.com_3" + | "private.canadianshield.cira.ca" + | "private.canadianshield.cira.ca_2" + | "private.canadianshield.cira.ca_3", GleanTimingDistribution >; trrIdleCloseTimeH3: Record< - | 'dns.shaw.ca' - | 'dns.shaw.ca_2' - | 'dns.shaw.ca_3' - | 'doh.xfinity.com' - | 'doh.xfinity.com_2' - | 'doh.xfinity.com_3' - | 'dooh.cloudflare-dns.com' - | 'dooh.cloudflare-dns.com_2' - | 'dooh.cloudflare-dns.com_3' - | 'firefox.dns.nextdns.io' - | 'firefox.dns.nextdns.io_2' - | 'firefox.dns.nextdns.io_3' - | 'mozilla.cloudflare-dns.com' - | 'mozilla.cloudflare-dns.com_2' - | 'mozilla.cloudflare-dns.com_3' - | 'private.canadianshield.cira.ca' - | 'private.canadianshield.cira.ca_2' - | 'private.canadianshield.cira.ca_3', + | "dns.shaw.ca" + | "dns.shaw.ca_2" + | "dns.shaw.ca_3" + | "doh.xfinity.com" + | "doh.xfinity.com_2" + | "doh.xfinity.com_3" + | "dooh.cloudflare-dns.com" + | "dooh.cloudflare-dns.com_2" + | "dooh.cloudflare-dns.com_3" + | "firefox.dns.nextdns.io" + | "firefox.dns.nextdns.io_2" + | "firefox.dns.nextdns.io_3" + | "mozilla.cloudflare-dns.com" + | "mozilla.cloudflare-dns.com_2" + | "mozilla.cloudflare-dns.com_3" + | "private.canadianshield.cira.ca" + | "private.canadianshield.cira.ca_2" + | "private.canadianshield.cira.ca_3", GleanTimingDistribution >; }; @@ -8194,7 +8194,7 @@ interface GleanImpl { byTypeSucceededLookupTime: GleanTimingDistribution; cleanupAge: GleanTimingDistribution; lookupAlgorithm: Record< - 'nativeOnly' | 'trrFirst' | 'trrOnly' | 'trrRace' | 'trrShadow', + "nativeOnly" | "trrFirst" | "trrOnly" | "trrRace" | "trrShadow", GleanCounter >; lookupDisposition: GleanDualLabeledCounter; @@ -8243,14 +8243,14 @@ interface GleanImpl { networkSso: { entraSuccess: Record< - | 'both_headers_missing' - | 'broker_error' - | 'device_headers_missing' - | 'invalid_controller_setup' - | 'invalid_cookie' - | 'no_credential' - | 'prt_headers_missing' - | 'success', + | "both_headers_missing" + | "broker_error" + | "device_headers_missing" + | "invalid_controller_setup" + | "invalid_cookie" + | "no_credential" + | "prt_headers_missing" + | "success", GleanCounter >; totalEntraUses: GleanCounter; @@ -8270,7 +8270,7 @@ interface GleanImpl { prefetchIgnoreReason: GleanCustomDistribution; prefetchTime: GleanTimingDistribution; prefetchUseStatus: Record< - 'Auth' | 'Etag' | 'Expired' | 'Not200' | 'Redirect' | 'Used' | 'WaitedTooLong' | 'WouldVary', + "Auth" | "Etag" | "Expired" | "Not200" | "Redirect" | "Used" | "WaitedTooLong" | "WouldVary", GleanCounter >; subresourceDegradation: GleanCustomDistribution; @@ -8282,67 +8282,67 @@ interface GleanImpl { }; http: { - altsvcMappingChangedTarget: Record<'false' | 'true', GleanCounter>; + altsvcMappingChangedTarget: Record<"false" | "true", GleanCounter>; cacheDisposition: GleanDualLabeledCounter; - cacheLmInconsistent: Record<'false' | 'true', GleanCounter>; + cacheLmInconsistent: Record<"false" | "true", GleanCounter>; channelDisposition: GleanCustomDistribution; - channelOnstartSuccess: Record<'false' | 'true', GleanCounter>; + channelOnstartSuccess: Record<"false" | "true", GleanCounter>; channelPageOnstartSuccessTrr: Record; channelSubOnstartSuccessTrr: Record; connectionCloseReason: Record; - connectionEntryCacheHit: Record<'false' | 'true', GleanCounter>; + connectionEntryCacheHit: Record<"false" | "true", GleanCounter>; contentEncoding: GleanCustomDistribution; dnsHttpssvcConnectionFailedReason: GleanCustomDistribution; dnsHttpssvcRecordReceivingStage: GleanCustomDistribution; dntUsage: GleanCustomDistribution; echconfigSuccessRate: Record< - 'EchConfigFailed' | 'EchConfigSucceeded' | 'NoEchConfigFailed' | 'NoEchConfigSucceeded', + "EchConfigFailed" | "EchConfigSucceeded" | "NoEchConfigFailed" | "NoEchConfigSucceeded", GleanCounter >; - http2FailBeforeSettings: Record<'false' | 'true', GleanCounter>; + http2FailBeforeSettings: Record<"false" | "true", GleanCounter>; kbreadPerConn2: GleanMemoryDistribution; - pageloadIsSsl: Record<'false' | 'true', GleanCounter>; + pageloadIsSsl: Record<"false" | "true", GleanCounter>; requestPerConn: GleanCustomDistribution; requestPerPage: GleanCustomDistribution; requestPerPageFromCache: GleanCustomDistribution; responseVersion: GleanCustomDistribution; scriptBlockIncorrectMime: Record< - | 'CORS_origin' - | 'app_json' - | 'app_octet_stream' - | 'app_xml' - | 'audio' - | 'cross_origin' - | 'empty' - | 'image' - | 'importScript_load' - | 'javaScript' - | 'same_origin' - | 'script_load' - | 'serviceworker_load' - | 'text_csv' - | 'text_html' - | 'text_json' - | 'text_plain' - | 'text_xml' - | 'unknown' - | 'video' - | 'worker_load' - | 'worklet_load', + | "CORS_origin" + | "app_json" + | "app_octet_stream" + | "app_xml" + | "audio" + | "cross_origin" + | "empty" + | "image" + | "importScript_load" + | "javaScript" + | "same_origin" + | "script_load" + | "serviceworker_load" + | "text_csv" + | "text_html" + | "text_json" + | "text_plain" + | "text_xml" + | "unknown" + | "video" + | "worker_load" + | "worklet_load", GleanCounter >; subitemFirstByteLatencyTime: GleanTimingDistribution; subitemOpenLatencyTime: GleanTimingDistribution; - tlsEarlyDataAccepted: Record<'false' | 'true', GleanCounter>; + tlsEarlyDataAccepted: Record<"false" | "true", GleanCounter>; tlsEarlyDataNegotiated: GleanCustomDistribution; trafficAnalysis: GleanDualLabeledCounter; transactionEchRetryEchFailedCount: GleanCustomDistribution; transactionEchRetryOthersCount: GleanCustomDistribution; transactionEchRetryWithEchCount: GleanCustomDistribution; transactionEchRetryWithoutEchCount: GleanCustomDistribution; - transactionIsSsl: Record<'false' | 'true', GleanCounter>; + transactionIsSsl: Record<"false" | "true", GleanCounter>; transactionRestartReason: GleanCustomDistribution; - transactionUseAltsvc: Record<'false' | 'true', GleanCounter>; + transactionUseAltsvc: Record<"false" | "true", GleanCounter>; transactionWaitTimeHttp: GleanTimingDistribution; transactionWaitTimeHttp2SupHttp3: GleanTimingDistribution; transactionWaitTimeHttp3: GleanTimingDistribution; @@ -8355,11 +8355,11 @@ interface GleanImpl { connectionCloseCode: Record; countsPto: Record; dropDgrams: GleanCustomDistribution; - echOutcome: Record<'GREASE' | 'NONE' | 'REAL', GleanCustomDistribution>; - lateAck: Record<'ack' | 'pto', GleanCustomDistribution>; - lateAckRatio: Record<'ack' | 'pto', GleanCustomDistribution>; + echOutcome: Record<"GREASE" | "NONE" | "REAL", GleanCustomDistribution>; + lateAck: Record<"ack" | "pto", GleanCustomDistribution>; + lateAckRatio: Record<"ack" | "pto", GleanCustomDistribution>; lossRatio: GleanCustomDistribution; - receivedSentDgrams: Record<'received' | 'sent', GleanCustomDistribution>; + receivedSentDgrams: Record<"received" | "sent", GleanCustomDistribution>; requestPerConn: GleanCustomDistribution; savedDgrams: GleanCustomDistribution; sendingBlockedByFlowControlPerTrans: GleanCustomDistribution; @@ -8370,14 +8370,14 @@ interface GleanImpl { netwerk: { http30rttState: Record< - 'conn_closed_by_necko' | 'conn_error' | 'not_used' | 'rejected' | 'succeeded', + "conn_closed_by_necko" | "conn_error" | "not_used" | "rejected" | "succeeded", GleanCounter >; http30rttStateDuration: Record< - 'conn_closed_by_necko' | 'conn_error' | 'not_used' | 'rejected' | 'succeeded', + "conn_closed_by_necko" | "conn_error" | "not_used" | "rejected" | "succeeded", GleanTimingDistribution >; - http3TimeToReuseIdleConnection: Record<'failed' | 'succeeded', GleanTimingDistribution>; + http3TimeToReuseIdleConnection: Record<"failed" | "succeeded", GleanTimingDistribution>; parentConnectTimeout: GleanCounter; }; @@ -8388,52 +8388,52 @@ interface GleanImpl { orb: { blockInitiator: Record< - | 'BEACON' - | 'BLOCKED_FETCH' - | 'CSP_REPORT' - | 'DTD' - | 'EXCLUDED' - | 'FILTERED_FETCH' - | 'FONT' - | 'IMAGE' - | 'IMAGESET' - | 'INVALID' - | 'JSON' - | 'MEDIA' - | 'OTHER' - | 'PING' - | 'PROXIED_WEBRTC_MEDIA' - | 'SCRIPT' - | 'SPECULATIVE' - | 'STYLESHEET' - | 'UA_FONT' - | 'WEB_MANIFEST' - | 'WEB_TRANSPORT' - | 'XMLHTTPREQUEST' - | 'XSLT', + | "BEACON" + | "BLOCKED_FETCH" + | "CSP_REPORT" + | "DTD" + | "EXCLUDED" + | "FILTERED_FETCH" + | "FONT" + | "IMAGE" + | "IMAGESET" + | "INVALID" + | "JSON" + | "MEDIA" + | "OTHER" + | "PING" + | "PROXIED_WEBRTC_MEDIA" + | "SCRIPT" + | "SPECULATIVE" + | "STYLESHEET" + | "UA_FONT" + | "WEB_MANIFEST" + | "WEB_TRANSPORT" + | "XMLHTTPREQUEST" + | "XSLT", GleanCounter >; blockReason: Record< - | 'AFTER_SNIFF_CT_FAIL' - | 'AFTER_SNIFF_MEDIA' - | 'AFTER_SNIFF_NOSNIFF' - | 'AFTER_SNIFF_STA_CODE' - | 'JS_VALIDATION_FAILED' - | 'MEDIA_INCORRECT_RESP' - | 'MEDIA_NOT_INITIAL' - | 'MIME_NEVER_SNIFFED' - | 'NOSNIFF_BLC_OR_TEXTP' - | 'RESP_206_BLCLISTED' - | 'RESP_206_NO_FIRST', + | "AFTER_SNIFF_CT_FAIL" + | "AFTER_SNIFF_MEDIA" + | "AFTER_SNIFF_NOSNIFF" + | "AFTER_SNIFF_STA_CODE" + | "JS_VALIDATION_FAILED" + | "MEDIA_INCORRECT_RESP" + | "MEDIA_NOT_INITIAL" + | "MIME_NEVER_SNIFFED" + | "NOSNIFF_BLC_OR_TEXTP" + | "RESP_206_BLCLISTED" + | "RESP_206_NO_FIRST", GleanCounter >; - didEverBlockResponse: Record<'false' | 'true', GleanCounter>; + didEverBlockResponse: Record<"false" | "true", GleanCounter>; javascriptValidation: Record< - 'failure' | 'javascript' | 'json' | 'other', + "failure" | "javascript" | "json" | "other", GleanTimingDistribution >; receiveDataForValidation: Record< - 'failure' | 'javascript' | 'json' | 'other', + "failure" | "javascript" | "json" | "other", GleanTimingDistribution >; }; @@ -8481,24 +8481,24 @@ interface GleanImpl { certVerifier: { certRevocationMechanisms: Record< - 'CRLite' | 'CachedOCSP' | 'OCSP' | 'OneCRL' | 'ShortValidity' | 'StapledOCSP', + "CRLite" | "CachedOCSP" | "OCSP" | "OneCRL" | "ShortValidity" | "StapledOCSP", GleanCounter >; crliteStatus: Record< - | 'no_filter' - | 'not_covered' - | 'not_enrolled' - | 'not_revoked' - | 'revoked_in_filter' - | 'revoked_in_stash', + | "no_filter" + | "not_covered" + | "not_enrolled" + | "not_revoked" + | "revoked_in_filter" + | "revoked_in_stash", GleanCounter >; crliteVsOcspResult: Record< - | 'CRLiteRevOCSPFail' - | 'CRLiteRevOCSPOk' - | 'CRLiteRevOCSPRev' - | 'CRLiteRevOCSPSoft' - | 'CRLiteRevOCSPUnk', + | "CRLiteRevOCSPFail" + | "CRLiteRevOCSPOk" + | "CRLiteRevOCSPRev" + | "CRLiteRevOCSPSoft" + | "CRLiteRevOCSPUnk", GleanCounter >; }; @@ -8516,15 +8516,15 @@ interface GleanImpl { }; certCompression: { - failures: Record<'brotli' | 'zlib' | 'zstd', GleanCounter>; + failures: Record<"brotli" | "zlib" | "zstd", GleanCounter>; }; certPinning: { failuresByCa2: GleanCustomDistribution; mozResultsByHost: GleanCustomDistribution; mozTestResultsByHost: GleanCustomDistribution; - results: Record<'false' | 'true', GleanCounter>; - testResults: Record<'false' | 'true', GleanCounter>; + results: Record<"false" | "true", GleanCounter>; + testResults: Record<"false" | "true", GleanCounter>; }; certStorage: { @@ -8576,7 +8576,7 @@ interface GleanImpl { ocspStapling: GleanCustomDistribution; permanentCertErrorOverrides: GleanCustomDistribution; reasonsForNotFalseStarting: GleanCustomDistribution; - resumedSession: Record<'false' | 'true', GleanCounter>; + resumedSession: Record<"false" | "true", GleanCounter>; sctsFromTiledLogsPerConnection: GleanCustomDistribution; sctsOrigin: GleanCustomDistribution; sctsPerConnection: GleanCustomDistribution; @@ -8613,23 +8613,23 @@ interface GleanImpl { certificateVerifications: GleanDenominator; cipherSuite: GleanCustomDistribution; xyberIntoleranceReason: Record< - | 'PR_CONNECT_RESET_ERROR' - | 'PR_END_OF_FILE_ERROR' - | 'SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE' - | 'SSL_ERROR_BAD_MAC_ALERT' - | 'SSL_ERROR_BAD_MAC_READ' - | 'SSL_ERROR_DECODE_ERROR_ALERT' - | 'SSL_ERROR_HANDSHAKE_FAILED' - | 'SSL_ERROR_HANDSHAKE_FAILURE_ALERT' - | 'SSL_ERROR_HANDSHAKE_UNEXPECTED_ALERT' - | 'SSL_ERROR_ILLEGAL_PARAMETER_ALERT' - | 'SSL_ERROR_INTERNAL_ERROR_ALERT' - | 'SSL_ERROR_KEY_EXCHANGE_FAILURE' - | 'SSL_ERROR_NO_CYPHER_OVERLAP' - | 'SSL_ERROR_PROTOCOL_VERSION_ALERT' - | 'SSL_ERROR_RX_MALFORMED_HYBRID_KEY_SHARE' - | 'SSL_ERROR_RX_UNEXPECTED_RECORD_TYPE' - | 'SSL_ERROR_UNSUPPORTED_VERSION', + | "PR_CONNECT_RESET_ERROR" + | "PR_END_OF_FILE_ERROR" + | "SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE" + | "SSL_ERROR_BAD_MAC_ALERT" + | "SSL_ERROR_BAD_MAC_READ" + | "SSL_ERROR_DECODE_ERROR_ALERT" + | "SSL_ERROR_HANDSHAKE_FAILED" + | "SSL_ERROR_HANDSHAKE_FAILURE_ALERT" + | "SSL_ERROR_HANDSHAKE_UNEXPECTED_ALERT" + | "SSL_ERROR_ILLEGAL_PARAMETER_ALERT" + | "SSL_ERROR_INTERNAL_ERROR_ALERT" + | "SSL_ERROR_KEY_EXCHANGE_FAILURE" + | "SSL_ERROR_NO_CYPHER_OVERLAP" + | "SSL_ERROR_PROTOCOL_VERSION_ALERT" + | "SSL_ERROR_RX_MALFORMED_HYBRID_KEY_SHARE" + | "SSL_ERROR_RX_UNEXPECTED_RECORD_TYPE" + | "SSL_ERROR_UNSUPPORTED_VERSION", GleanCounter >; }; @@ -8916,7 +8916,7 @@ interface GleanImpl { }; startupCache: { - requests: Record<'HitDisk' | 'HitMemory' | 'Miss', GleanCounter>; + requests: Record<"HitDisk" | "HitMemory" | "Miss", GleanCounter>; }; sqliteStore: { @@ -8934,81 +8934,81 @@ interface GleanImpl { site_host?: string; success?: string; }>; - purgeCount: Record<'dry' | 'failure' | 'success', GleanCounter>; + purgeCount: Record<"dry" | "failure" | "success", GleanCounter>; purgeCountClassifiedTracker: GleanCounter; purgeDuration: GleanTimingDistribution; }; contentblocking: { canvasFingerprintingPerTab: Record< - 'known_text' | 'known_text_matched' | 'unknown' | 'unknown_matched', + "known_text" | "known_text_matched" | "unknown" | "unknown_matched", GleanCustomDistribution >; category: GleanQuantity; cookieBehavior: GleanCustomDistribution; - cryptominersBlockedCount: Record<'allowed' | 'blocked' | 'pageLoad', GleanCounter>; + cryptominersBlockedCount: Record<"allowed" | "blocked" | "pageLoad", GleanCounter>; cryptominingBlockingEnabled: GleanBoolean; emailTrackerCount: Record< - 'base_email_webapp' | 'base_normal' | 'content_email_webapp' | 'content_normal', + "base_email_webapp" | "base_normal" | "content_email_webapp" | "content_normal", GleanCounter >; emailTrackerEmbeddedPerTab: Record< - | 'all_emailapp' - | 'all_normal' - | 'base_emailapp' - | 'base_normal' - | 'content_emailapp' - | 'content_normal', + | "all_emailapp" + | "all_normal" + | "base_emailapp" + | "base_normal" + | "content_emailapp" + | "content_normal", GleanCustomDistribution >; - fingerprintersBlockedCount: Record<'allowed' | 'blocked' | 'pageLoad', GleanCounter>; + fingerprintersBlockedCount: Record<"allowed" | "blocked" | "pageLoad", GleanCounter>; fingerprintingBlockingEnabled: GleanBoolean; - fontFingerprintingPerTab: Record<'false' | 'true', GleanCounter>; + fontFingerprintingPerTab: Record<"false" | "true", GleanCounter>; queryStrippingCount: Record< - 'Navigation' | 'Redirect' | 'StripForNavigation' | 'StripForRedirect', + "Navigation" | "Redirect" | "StripForNavigation" | "StripForRedirect", GleanCounter >; queryStrippingCountByParam: Record< - | 'param___hsfp' - | 'param___hssc' - | 'param___hstc' - | 'param___s' - | 'param__hsenc' - | 'param__openstat' - | 'param_dclid' - | 'param_fbclid' - | 'param_gbraid' - | 'param_gclid' - | 'param_hsctatracking' - | 'param_mc_eid' - | 'param_mkt_tok' - | 'param_msclkid' - | 'param_oly_anon_id' - | 'param_oly_enc_id' - | 'param_twclid' - | 'param_vero_id' - | 'param_wbraid' - | 'param_wickedid' - | 'param_yclid' - | 'param_ysclid', + | "param___hsfp" + | "param___hssc" + | "param___hstc" + | "param___s" + | "param__hsenc" + | "param__openstat" + | "param_dclid" + | "param_fbclid" + | "param_gbraid" + | "param_gclid" + | "param_hsctatracking" + | "param_mc_eid" + | "param_mkt_tok" + | "param_msclkid" + | "param_oly_anon_id" + | "param_oly_enc_id" + | "param_twclid" + | "param_vero_id" + | "param_wbraid" + | "param_wickedid" + | "param_yclid" + | "param_ysclid", GleanCounter >; queryStrippingParamCount: GleanCustomDistribution; storageAccessGrantedCount: Record< - | 'Navigation' - | 'Navigation_CT' - | 'Opener' - | 'OpenerAfterUI' - | 'OpenerAfterUI_CT' - | 'Opener_CT' - | 'Redirect' - | 'RedirectTracker' - | 'RedirectTracker_CT' - | 'Redirect_CT' - | 'StorageAccessAPI' - | 'StorageAccessAPI_CT' - | 'StorageGranted' - | 'StorageGranted_CT', + | "Navigation" + | "Navigation_CT" + | "Opener" + | "OpenerAfterUI" + | "OpenerAfterUI_CT" + | "Opener_CT" + | "Redirect" + | "RedirectTracker" + | "RedirectTracker_CT" + | "Redirect_CT" + | "StorageAccessAPI" + | "StorageAccessAPI_CT" + | "StorageGranted" + | "StorageGranted_CT", GleanCounter >; storageAccessRemainingDays: GleanCustomDistribution; @@ -9017,8 +9017,8 @@ interface GleanImpl { tpAllowlistBaselineEnabled: GleanBoolean; tpAllowlistConvenienceEnabled: GleanBoolean; trackersBlockedCount: GleanCounter; - trackingProtectionEnabled: Record<'false' | 'true', GleanCounter>; - trackingProtectionPbmDisabled: Record<'false' | 'true', GleanCounter>; + trackingProtectionEnabled: Record<"false" | "true", GleanCounter>; + trackingProtectionPbmDisabled: Record<"false" | "true", GleanCounter>; trackingProtectionShield: GleanCustomDistribution; }; @@ -9165,11 +9165,11 @@ interface GleanImpl { }>; googleGdprChoiceCookieEventPbm: GleanEventWithExtras<{ choice?: string }>; normalWindowServiceMode: Record< - 'disabled' | 'invalid' | 'reject' | 'reject_or_accept', + "disabled" | "invalid" | "reject" | "reject_or_accept", GleanBoolean >; privateWindowServiceMode: Record< - 'disabled' | 'invalid' | 'reject' | 'reject_or_accept', + "disabled" | "invalid" | "reject" | "reject_or_accept", GleanBoolean >; serviceDetectOnly: GleanBoolean; @@ -9198,28 +9198,28 @@ interface GleanImpl { stackTraces: GleanObject; startup: GleanBoolean; submitAttempt: Record< - | 'content-crash' - | 'content-hang' - | 'forkserver-crash' - | 'forkserver-hang' - | 'gmplugin-crash' - | 'gmplugin-hang' - | 'gpu-crash' - | 'gpu-hang' - | 'main-crash' - | 'main-hang' - | 'plugin-crash' - | 'plugin-hang' - | 'rdd-crash' - | 'rdd-hang' - | 'sandboxbroker-crash' - | 'sandboxbroker-hang' - | 'socket-crash' - | 'socket-hang' - | 'utility-crash' - | 'utility-hang' - | 'vr-crash' - | 'vr-hang', + | "content-crash" + | "content-hang" + | "forkserver-crash" + | "forkserver-hang" + | "gmplugin-crash" + | "gmplugin-hang" + | "gpu-crash" + | "gpu-hang" + | "main-crash" + | "main-hang" + | "plugin-crash" + | "plugin-hang" + | "rdd-crash" + | "rdd-hang" + | "sandboxbroker-crash" + | "sandboxbroker-hang" + | "socket-crash" + | "socket-hang" + | "utility-crash" + | "utility-hang" + | "vr-crash" + | "vr-hang", GleanCounter >; submitSuccess: GleanDualLabeledCounter; @@ -9340,12 +9340,12 @@ interface GleanImpl { extensions: { processEvent: Record< - | 'crashed_bg' - | 'crashed_fg' - | 'crashed_over_threshold_bg' - | 'crashed_over_threshold_fg' - | 'created_bg' - | 'created_fg', + | "crashed_bg" + | "crashed_fg" + | "crashed_over_threshold_bg" + | "crashed_over_threshold_fg" + | "created_bg" + | "created_fg", GleanCounter >; startupCacheLoadTime: GleanTimespan; @@ -9358,7 +9358,7 @@ interface GleanImpl { extensionsApisDnr: { evaluateRulesCountMax: GleanQuantity; evaluateRulesTime: GleanTimingDistribution; - startupCacheEntries: Record<'hit' | 'miss', GleanCounter>; + startupCacheEntries: Record<"hit" | "miss", GleanCounter>; startupCacheReadSize: GleanMemoryDistribution; startupCacheReadTime: GleanTimingDistribution; startupCacheWriteSize: GleanMemoryDistribution; @@ -9368,20 +9368,20 @@ interface GleanImpl { extensionsCounters: { browserActionPreloadResult: Record< - 'clearAfterHover' | 'clearAfterMousedown' | 'popupShown', + "clearAfterHover" | "clearAfterMousedown" | "popupShown", GleanCounter >; browserActionPreloadResultByAddonid: GleanDualLabeledCounter; eventPageIdleResult: Record< - | 'launchWebAuthFlow' - | 'permissions_request' - | 'reset_event' - | 'reset_listeners' - | 'reset_nativeapp' - | 'reset_other' - | 'reset_parentapicall' - | 'reset_streamfilter' - | 'suspend', + | "launchWebAuthFlow" + | "permissions_request" + | "reset_event" + | "reset_listeners" + | "reset_nativeapp" + | "reset_other" + | "reset_parentapicall" + | "reset_streamfilter" + | "suspend", GleanCounter >; eventPageIdleResultByAddonid: GleanDualLabeledCounter; @@ -9396,7 +9396,7 @@ interface GleanImpl { has_jsonfile?: string; has_olddata?: string; }>; - migrateResultCount: Record<'failure' | 'success', GleanCounter>; + migrateResultCount: Record<"failure" | "success", GleanCounter>; storageLocalCorruptedReset: GleanEventWithExtras<{ addon_id?: string; after_reset?: string; @@ -9587,11 +9587,11 @@ interface GleanImpl { value?: string; }>; detectedCcNumberFieldsCount: Record< - | 'cc_number_fields_1' - | 'cc_number_fields_2' - | 'cc_number_fields_3' - | 'cc_number_fields_4' - | 'cc_number_fields_other', + | "cc_number_fields_1" + | "cc_number_fields_2" + | "cc_number_fields_3" + | "cc_number_fields_4" + | "cc_number_fields_other", GleanCounter >; disableCaptureDoorhanger: GleanEventWithExtras<{ value?: string }>; @@ -9664,7 +9664,7 @@ interface GleanImpl { formautofill: { availability: GleanBoolean; formSubmissionHeuristic: Record< - 'form-removal-after-fetch' | 'form-submit-event' | 'iframe-pagehide' | 'page-navigation', + "form-removal-after-fetch" | "form-submit-event" | "iframe-pagehide" | "page-navigation", GleanCounter >; iframeLayoutDetection: GleanEventWithExtras<{ @@ -9699,9 +9699,9 @@ interface GleanImpl { initializations: GleanTimingDistribution; initsDuringShutdown: GleanCounter; maxPingsPerMinute: GleanQuantity; - subdirEntryErr: Record<'db' | 'events' | 'pending_pings', GleanCounter>; - subdirEntryMetadataErr: Record<'db' | 'events' | 'pending_pings', GleanCounter>; - subdirErr: Record<'db' | 'events' | 'pending_pings', GleanBoolean>; + subdirEntryErr: Record<"db" | "events" | "pending_pings", GleanCounter>; + subdirEntryMetadataErr: Record<"db" | "events" | "pending_pings", GleanCounter>; + subdirErr: Record<"db" | "events" | "pending_pings", GleanBoolean>; }; fogIpc: { @@ -9735,15 +9735,15 @@ interface GleanImpl { keyedMobileOnly: Record; keyedReleaseOptin: Record; keyedReleaseOptout: Record; - mabelsBalloonLabels: Record<'celebratory' | 'celebratory_and_snarky', GleanString>; + mabelsBalloonLabels: Record<"celebratory" | "celebratory_and_snarky", GleanString>; mabelsBalloonStrings: Record; mabelsBathroomCounters: Record; mabelsCustomLabelLengths: Record; mabelsKitchenCounters: Record; mabelsLabelMaker: Record; - mabelsLabeledCounters: Record<'1st_counter' | 'clean' | 'next_to_the_fridge', GleanCounter>; + mabelsLabeledCounters: Record<"1st_counter" | "clean" | "next_to_the_fridge", GleanCounter>; mabelsLikeBalloons: Record; - mabelsLikeLabeledBalloons: Record<'birthday_party' | 'water', GleanBoolean>; + mabelsLikeLabeledBalloons: Record<"birthday_party" | "water", GleanBoolean>; mainOnly: GleanQuantity; meaningOfLife: GleanQuantity; mirrorTime: GleanTimespan; @@ -9771,10 +9771,10 @@ interface GleanImpl { aDualLabeledCounter: GleanDualLabeledCounter; aLabeledCounter: Record; aLabeledCounterForCategorical: Record< - 'CommonLabel' | 'Label4' | 'Label5' | 'Label6', + "CommonLabel" | "Label4" | "Label5" | "Label6", GleanCounter >; - aLabeledCounterForHgram: Record<'false' | 'true', GleanCounter>; + aLabeledCounterForHgram: Record<"false" | "true", GleanCounter>; aLabeledCounterForKeyedCountHgram: Record; aMemoryDist: GleanMemoryDistribution; aQuantity: GleanQuantity; @@ -9808,18 +9808,18 @@ interface GleanImpl { mediaSniffer: { mp4BrandPattern: Record< - | 'ftyp_3gp' - | 'ftyp_3gp4' - | 'ftyp_M4A' - | 'ftyp_M4P' - | 'ftyp_M4V' - | 'ftyp_avc' - | 'ftyp_avif' - | 'ftyp_crx' - | 'ftyp_iso' - | 'ftyp_mmp4' - | 'ftyp_mp4' - | 'ftyp_qt', + | "ftyp_3gp" + | "ftyp_3gp4" + | "ftyp_M4A" + | "ftyp_M4P" + | "ftyp_M4V" + | "ftyp_avc" + | "ftyp_avif" + | "ftyp_crx" + | "ftyp_iso" + | "ftyp_mmp4" + | "ftyp_mp4" + | "ftyp_qt", GleanCounter >; }; @@ -9869,17 +9869,17 @@ interface GleanImpl { taskName?: string; }>; engineCreationSuccess: Record< - | 'about-inference' - | 'autofill-ml' - | 'default-engine' - | 'ml-suggest-intent' - | 'ml-suggest-ner' - | 'pdfjs' - | 'smart-intent' - | 'smart-tab-embedding-engine' - | 'smart-tab-topic-engine' - | 'webextension' - | 'wllamapreview', + | "about-inference" + | "autofill-ml" + | "default-engine" + | "ml-suggest-intent" + | "ml-suggest-ner" + | "pdfjs" + | "smart-intent" + | "smart-tab-embedding-engine" + | "smart-tab-topic-engine" + | "webextension" + | "wllamapreview", GleanTimingDistribution >; engineRun: GleanEventWithExtras<{ @@ -9916,17 +9916,17 @@ interface GleanImpl { modelId?: string; }>; runInferenceSuccess: Record< - | 'about-inference' - | 'autofill-ml' - | 'default-engine' - | 'ml-suggest-intent' - | 'ml-suggest-ner' - | 'pdfjs' - | 'smart-intent' - | 'smart-tab-embedding-engine' - | 'smart-tab-topic-engine' - | 'webextension' - | 'wllamapreview', + | "about-inference" + | "autofill-ml" + | "default-engine" + | "ml-suggest-intent" + | "ml-suggest-ner" + | "pdfjs" + | "smart-intent" + | "smart-tab-embedding-engine" + | "smart-tab-topic-engine" + | "webextension" + | "wllamapreview", GleanTimingDistribution >; }; @@ -10081,69 +10081,69 @@ interface GleanImpl { nimbusTargetingEnvironment: { attrEvalErrors: Record< - | 'activeExperiments' - | 'activeRollouts' - | 'addonsInfo' - | 'addressesSaved' - | 'archBits' - | 'attributionData' - | 'browserSettings' - | 'buildId' - | 'currentDate' - | 'defaultPDFHandler' - | 'distributionId' - | 'doesAppNeedPin' - | 'enrollmentsMap' - | 'firefoxVersion' - | 'hasActiveEnterprisePolicies' - | 'hasPinnedTabs' - | 'homePageSettings' - | 'isDefaultBrowser' - | 'isDefaultHandler' - | 'isFirstStartup' - | 'isFxAEnabled' - | 'isFxASignedIn' - | 'isMSIX' - | 'locale' - | 'memoryMB' - | 'os' - | 'primaryResolution' - | 'profileAgeCreated' - | 'profileGroupProfileCount' - | 'region' - | 'totalBookmarksCount' - | 'userMonthlyActivity' - | 'userPrefersReducedMotion' - | 'usesFirefoxSync' - | 'version', + | "activeExperiments" + | "activeRollouts" + | "addonsInfo" + | "addressesSaved" + | "archBits" + | "attributionData" + | "browserSettings" + | "buildId" + | "currentDate" + | "defaultPDFHandler" + | "distributionId" + | "doesAppNeedPin" + | "enrollmentsMap" + | "firefoxVersion" + | "hasActiveEnterprisePolicies" + | "hasPinnedTabs" + | "homePageSettings" + | "isDefaultBrowser" + | "isDefaultHandler" + | "isFirstStartup" + | "isFxAEnabled" + | "isFxASignedIn" + | "isMSIX" + | "locale" + | "memoryMB" + | "os" + | "primaryResolution" + | "profileAgeCreated" + | "profileGroupProfileCount" + | "region" + | "totalBookmarksCount" + | "userMonthlyActivity" + | "userPrefersReducedMotion" + | "usesFirefoxSync" + | "version", GleanCounter >; prefTypeErrors: Record< - | 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons' - | 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features' - | 'browser.newtabpage.activity-stream.feeds.section.highlights' - | 'browser.newtabpage.activity-stream.feeds.section.topstories' - | 'browser.newtabpage.activity-stream.feeds.topsites' - | 'browser.newtabpage.activity-stream.showSearch' - | 'browser.newtabpage.activity-stream.showSponsoredTopSites' - | 'browser.newtabpage.enabled' - | 'browser.profiles.created' - | 'browser.startup.page' - | 'browser.toolbars.bookmarks.visibility' - | 'browser.urlbar.lastUrlbarSearchSeconds' - | 'browser.urlbar.quicksuggest.dataCollection.enabled' - | 'browser.urlbar.showSearchSuggestionsFirst' - | 'browser.urlbar.suggest.quicksuggest.sponsored' - | 'media.videocontrols.picture-in-picture.enabled' - | 'media.videocontrols.picture-in-picture.video-toggle.enabled' - | 'media.videocontrols.picture-in-picture.video-toggle.has-used' - | 'messaging-system-action.testday' - | 'network.trr.mode' - | 'nimbus.qa.pref-1' - | 'nimbus.qa.pref-2' - | 'security.sandbox.content.level' - | 'termsofuse.acceptedDate' - | 'trailhead.firstrun.didSeeAboutWelcome', + | "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons" + | "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features" + | "browser.newtabpage.activity-stream.feeds.section.highlights" + | "browser.newtabpage.activity-stream.feeds.section.topstories" + | "browser.newtabpage.activity-stream.feeds.topsites" + | "browser.newtabpage.activity-stream.showSearch" + | "browser.newtabpage.activity-stream.showSponsoredTopSites" + | "browser.newtabpage.enabled" + | "browser.profiles.created" + | "browser.startup.page" + | "browser.toolbars.bookmarks.visibility" + | "browser.urlbar.lastUrlbarSearchSeconds" + | "browser.urlbar.quicksuggest.dataCollection.enabled" + | "browser.urlbar.showSearchSuggestionsFirst" + | "browser.urlbar.suggest.quicksuggest.sponsored" + | "media.videocontrols.picture-in-picture.enabled" + | "media.videocontrols.picture-in-picture.video-toggle.enabled" + | "media.videocontrols.picture-in-picture.video-toggle.has-used" + | "messaging-system-action.testday" + | "network.trr.mode" + | "nimbus.qa.pref-1" + | "nimbus.qa.pref-2" + | "security.sandbox.content.level" + | "termsofuse.acceptedDate" + | "trailhead.firstrun.didSeeAboutWelcome", GleanCounter >; prefValues: GleanObject; @@ -10452,29 +10452,29 @@ interface GleanImpl { filledFieldEditedGeneratedpassword: GleanEventNoExtras; filterList: GleanEventNoExtras; formAutofillResult: Record< - | 'autocomplete_off' - | 'existing_password' - | 'existing_username' - | 'filled' - | 'filled_username_only_form' - | 'form_in_crossorigin_subframe' - | 'insecure' - | 'multiple_logins' - | 'no_autofill_forms' - | 'no_logins_fit' - | 'no_password_field' - | 'no_saved_logins' - | 'password_autocomplete_new_password' - | 'password_disabled_readonly' - | 'type_no_longer_password', + | "autocomplete_off" + | "existing_password" + | "existing_username" + | "filled" + | "filled_username_only_form" + | "form_in_crossorigin_subframe" + | "insecure" + | "multiple_logins" + | "no_autofill_forms" + | "no_logins_fit" + | "no_password_field" + | "no_saved_logins" + | "password_autocomplete_new_password" + | "password_disabled_readonly" + | "type_no_longer_password", GleanCounter >; hidePassword: GleanEventWithExtras<{ breached?: string; vulnerable?: string }>; importLoginsFromFileCategorical: Record< - 'added' | 'error' | 'modified' | 'no_change', + "added" | "error" | "modified" | "no_change", GleanCounter >; - isUsernameOnlyForm: Record<'false' | 'true', GleanCounter>; + isUsernameOnlyForm: Record<"false" | "true", GleanCounter>; learnMoreVulnExistingLogin: GleanEventWithExtras<{ breached?: string; vulnerable?: string }>; loginPageSafety: GleanCustomDistribution; mgmtMenuItemUsedExport: GleanEventNoExtras; @@ -10485,7 +10485,7 @@ interface GleanImpl { mgmtMenuItemUsedPreferences: GleanEventNoExtras; migration: GleanEventWithExtras<{ error?: string; value?: string }>; newNewLogin: GleanEventNoExtras; - numImprovedGeneratedPasswords: Record<'false' | 'true', GleanCounter>; + numImprovedGeneratedPasswords: Record<"false" | "true", GleanCounter>; numSavedPasswords: GleanQuantity; openManagementAboutprotections: GleanEventNoExtras; openManagementAutocomplete: GleanEventNoExtras; @@ -10564,45 +10564,45 @@ interface GleanImpl { pdfjs: { buttons: Record< - | 'cursor_hand_tool' - | 'cursor_select_tool' - | 'document_properties' - | 'first_page' - | 'last_page' - | 'page_rotate_ccw' - | 'page_rotate_cw' - | 'presentation_mode' - | 'presentation_mode_keyboard' - | 'scroll_horizontal' - | 'scroll_page' - | 'scroll_vertical' - | 'scroll_wrapped' - | 'spread_even' - | 'spread_none' - | 'spread_odd' - | 'view_bookmark', + | "cursor_hand_tool" + | "cursor_select_tool" + | "document_properties" + | "first_page" + | "last_page" + | "page_rotate_ccw" + | "page_rotate_cw" + | "presentation_mode" + | "presentation_mode_keyboard" + | "scroll_horizontal" + | "scroll_page" + | "scroll_vertical" + | "scroll_wrapped" + | "spread_even" + | "spread_none" + | "spread_odd" + | "view_bookmark", GleanCounter >; - editing: Record<'freetext' | 'ink' | 'print' | 'save' | 'signature' | 'stamp', GleanCounter>; + editing: Record<"freetext" | "ink" | "print" | "save" | "signature" | "stamp", GleanCounter>; geckoview: Record< - | 'download_failed' - | 'download_succeeded' - | 'download_tapped' - | 'open_in_app_always' - | 'open_in_app_just_once' - | 'open_in_app_tapped' - | 'save_as_pdf_tapped', + | "download_failed" + | "download_succeeded" + | "download_tapped" + | "open_in_app_always" + | "open_in_app_just_once" + | "open_in_app_tapped" + | "save_as_pdf_tapped", GleanCounter >; stamp: Record< - | 'alt_text_cancel' - | 'alt_text_decorative' - | 'alt_text_description' - | 'alt_text_edit' - | 'alt_text_keyboard' - | 'alt_text_save' - | 'alt_text_tooltip' - | 'inserted_image', + | "alt_text_cancel" + | "alt_text_decorative" + | "alt_text_description" + | "alt_text_edit" + | "alt_text_keyboard" + | "alt_text_save" + | "alt_text_tooltip" + | "inserted_image", GleanCounter >; timeToView: GleanCustomDistribution; @@ -10610,19 +10610,19 @@ interface GleanImpl { }; pdfjsComment: { - edit: Record<'deleted' | 'edited', GleanCounter>; + edit: Record<"deleted" | "edited", GleanCounter>; save: GleanEventWithExtras<{ deleted?: string; edited?: string }>; sidebar: GleanEventWithExtras<{ comments_count?: string }>; }; pdfjsEditingHighlight: { - color: Record<'blue' | 'green' | 'pink' | 'red' | 'yellow', GleanCounter>; + color: Record<"blue" | "green" | "pink" | "red" | "yellow", GleanCounter>; colorChanged: GleanCounter; deleted: GleanCounter; edited: GleanCounter; - kind: Record<'free_highlight' | 'highlight', GleanCounter>; - method: Record<'context_menu' | 'floating_button' | 'main_toolbar', GleanCounter>; - numberOfColors: Record<'five' | 'four' | 'one' | 'three' | 'two', GleanCounter>; + kind: Record<"free_highlight" | "highlight", GleanCounter>; + method: Record<"context_menu" | "floating_button" | "main_toolbar", GleanCounter>; + numberOfColors: Record<"five" | "four" | "one" | "three" | "two", GleanCounter>; print: GleanCounter; save: GleanCounter; thickness: GleanCustomDistribution; @@ -10632,8 +10632,8 @@ interface GleanImpl { pdfjsImage: { addImageClick: GleanEventNoExtras; - added: Record<'with_alt_text' | 'without_alt_text', GleanCounter>; - altTextEdit: Record<'ai_generation' | 'ask_to_edit', GleanBoolean>; + added: Record<"with_alt_text" | "without_alt_text", GleanCounter>; + altTextEdit: Record<"ai_generation" | "ask_to_edit", GleanBoolean>; iconClick: GleanEventNoExtras; imageAdded: GleanEventWithExtras<{ alt_text_modal?: string; alt_text_type?: string }>; imageSelected: GleanEventWithExtras<{ alt_text_modal?: string }>; @@ -10665,7 +10665,7 @@ interface GleanImpl { pdfjsSignature: { added: GleanEventWithExtras<{ has_alt_text?: string; has_no_alt_text?: string }>; - clear: Record<'draw' | 'text' | 'type', GleanCounter>; + clear: Record<"draw" | "text" | "type", GleanCounter>; created: GleanEventWithExtras<{ description_changed?: string; saved?: string; @@ -10673,7 +10673,7 @@ interface GleanImpl { type?: string; }>; deleteSaved: GleanEventWithExtras<{ saved_count?: string }>; - editDescription: Record<'saved' | 'unsaved', GleanCounter>; + editDescription: Record<"saved" | "unsaved", GleanCounter>; inserted: GleanEventWithExtras<{ has_been_saved?: string; has_description?: string }>; }; @@ -10785,129 +10785,129 @@ interface GleanImpl { dialogOpenedViaPreviewTm: GleanCounter; dialogViaPreviewCancelledTm: GleanCounter; error: Record< - | 'ABORT' - | 'FAILURE' - | 'FALLBACK_PAPER_LIST' - | 'GFX_PRINTER_COULD_NOT_OPEN_FILE' - | 'GFX_PRINTER_DOC_IS_BUSY' - | 'GFX_PRINTER_ENDDOC' - | 'GFX_PRINTER_NAME_NOT_FOUND' - | 'GFX_PRINTER_NO_PRINTER_AVAILABLE' - | 'GFX_PRINTER_STARTDOC' - | 'GFX_PRINTER_STARTPAGE' - | 'LAST_USED_PRINTER' - | 'NOT_AVAILABLE' - | 'NOT_IMPLEMENTED' - | 'OUT_OF_MEMORY' - | 'PAPER_MARGINS' - | 'PRINTER_LIST' - | 'PRINTER_PROPERTIES' - | 'PRINTER_SETTINGS' - | 'PRINT_DESTINATIONS' - | 'PRINT_PREVIEW' - | 'UNEXPECTED' - | 'UNWRITEABLE_MARGIN', + | "ABORT" + | "FAILURE" + | "FALLBACK_PAPER_LIST" + | "GFX_PRINTER_COULD_NOT_OPEN_FILE" + | "GFX_PRINTER_DOC_IS_BUSY" + | "GFX_PRINTER_ENDDOC" + | "GFX_PRINTER_NAME_NOT_FOUND" + | "GFX_PRINTER_NO_PRINTER_AVAILABLE" + | "GFX_PRINTER_STARTDOC" + | "GFX_PRINTER_STARTPAGE" + | "LAST_USED_PRINTER" + | "NOT_AVAILABLE" + | "NOT_IMPLEMENTED" + | "OUT_OF_MEMORY" + | "PAPER_MARGINS" + | "PRINTER_LIST" + | "PRINTER_PROPERTIES" + | "PRINTER_SETTINGS" + | "PRINT_DESTINATIONS" + | "PRINT_PREVIEW" + | "UNEXPECTED" + | "UNWRITEABLE_MARGIN", GleanCounter >; previewCancelledTm: GleanCounter; previewOpenedTm: GleanCounter; settingsChanged: Record; silentPrint: GleanCounter; - targetType: Record<'pdf_file' | 'pdf_unknown' | 'unknown' | 'xps_file', GleanCounter>; + targetType: Record<"pdf_file" | "pdf_unknown" | "unknown" | "xps_file", GleanCounter>; }; power: { cpuTimeBogusValues: GleanCounter; cpuTimePerProcessTypeMs: Record< - | 'extension' - | 'gmplugin' - | 'gpu' - | 'inference' - | 'parent.active' - | 'parent.active.playing-audio' - | 'parent.active.playing-video' - | 'parent.inactive' - | 'parent.inactive.playing-audio' - | 'parent.inactive.playing-video' - | 'prealloc' - | 'privilegedabout' - | 'rdd' - | 'socket' - | 'utility' - | 'web.background' - | 'web.background-perceivable' - | 'web.foreground', + | "extension" + | "gmplugin" + | "gpu" + | "inference" + | "parent.active" + | "parent.active.playing-audio" + | "parent.active.playing-video" + | "parent.inactive" + | "parent.inactive.playing-audio" + | "parent.inactive.playing-video" + | "prealloc" + | "privilegedabout" + | "rdd" + | "socket" + | "utility" + | "web.background" + | "web.background-perceivable" + | "web.foreground", GleanCounter >; cpuTimePerTrackerTypeMs: Record< - 'ad' | 'analytics' | 'cryptomining' | 'fingerprinting' | 'social' | 'unknown', + "ad" | "analytics" | "cryptomining" | "fingerprinting" | "social" | "unknown", GleanCounter >; energyPerProcessType: Record< - | 'extension' - | 'gmplugin' - | 'gpu' - | 'inference' - | 'parent.active' - | 'parent.active.playing-audio' - | 'parent.active.playing-video' - | 'parent.inactive' - | 'parent.inactive.playing-audio' - | 'parent.inactive.playing-video' - | 'prealloc' - | 'privilegedabout' - | 'rdd' - | 'socket' - | 'utility' - | 'web.background' - | 'web.background-perceivable' - | 'web.foreground', + | "extension" + | "gmplugin" + | "gpu" + | "inference" + | "parent.active" + | "parent.active.playing-audio" + | "parent.active.playing-video" + | "parent.inactive" + | "parent.inactive.playing-audio" + | "parent.inactive.playing-video" + | "prealloc" + | "privilegedabout" + | "rdd" + | "socket" + | "utility" + | "web.background" + | "web.background-perceivable" + | "web.foreground", GleanCounter >; gpuTimeBogusValues: GleanCounter; gpuTimePerProcessTypeMs: Record< - | 'extension' - | 'gmplugin' - | 'gpu' - | 'inference' - | 'parent.active' - | 'parent.active.playing-audio' - | 'parent.active.playing-video' - | 'parent.inactive' - | 'parent.inactive.playing-audio' - | 'parent.inactive.playing-video' - | 'prealloc' - | 'privilegedabout' - | 'rdd' - | 'socket' - | 'utility' - | 'web.background' - | 'web.background-perceivable' - | 'web.foreground', + | "extension" + | "gmplugin" + | "gpu" + | "inference" + | "parent.active" + | "parent.active.playing-audio" + | "parent.active.playing-video" + | "parent.inactive" + | "parent.inactive.playing-audio" + | "parent.inactive.playing-video" + | "prealloc" + | "privilegedabout" + | "rdd" + | "socket" + | "utility" + | "web.background" + | "web.background-perceivable" + | "web.foreground", GleanCounter >; totalCpuTimeMs: GleanCounter; totalGpuTimeMs: GleanCounter; totalThreadWakeups: GleanCounter; wakeupsPerProcessType: Record< - | 'extension' - | 'gmplugin' - | 'gpu' - | 'inference' - | 'parent.active' - | 'parent.active.playing-audio' - | 'parent.active.playing-video' - | 'parent.inactive' - | 'parent.inactive.playing-audio' - | 'parent.inactive.playing-video' - | 'prealloc' - | 'privilegedabout' - | 'rdd' - | 'socket' - | 'utility' - | 'web.background' - | 'web.background-perceivable' - | 'web.foreground', + | "extension" + | "gmplugin" + | "gpu" + | "inference" + | "parent.active" + | "parent.active.playing-audio" + | "parent.active.playing-video" + | "parent.inactive" + | "parent.inactive.playing-audio" + | "parent.inactive.playing-video" + | "prealloc" + | "privilegedabout" + | "rdd" + | "socket" + | "utility" + | "web.background" + | "web.background-perceivable" + | "web.foreground", GleanCounter >; }; @@ -10918,1338 +10918,1338 @@ interface GleanImpl { powerCpuMsPerThread: { contentBackground: Record< - | 'androidui' - | 'asynclogger' - | 'audioipc' - | 'audioipc_callback_rpc' - | 'audioipc_client_callback' - | 'audioipc_client_rpc' - | 'audioipc_devicecollection_rpc' - | 'audioipc_server_callback' - | 'audioipc_server_rpc' - | 'backgroundthreadpool' - | 'bgiothreadpool' - | 'bgreadurls' - | 'bhmgr_monitor' - | 'bhmgr_processor' - | 'cameras_ipc' - | 'canvasrenderer' - | 'capturethread' - | 'classifier_update' - | 'com_mta' - | 'compositor' - | 'convolverworker' - | 'cookie' - | 'cubeboperation' - | 'datachannel_io' - | 'dns_resolver' - | 'dom_worker' - | 'dom_worklet' - | 'domcachethread' - | 'extensionprotocolhandler' - | 'font_loader' - | 'fontenumthread' - | 'fs_broker' - | 'geckomain' - | 'gmpthread' - | 'graphrunner' - | 'hrtfdatabaseldr' - | 'html5_parser' - | 'imagebridgechld' - | 'imageio' - | 'indexeddb' - | 'indexeddb_io' - | 'initfontlist' - | 'inotifyeventthread' - | 'ipc_i_o_child' - | 'ipc_i_o_parent' - | 'ipc_launch' - | 'ipdl_background' - | 'js_watchdog' - | 'jump_list' - | 'libwebrtcmodulethread' - | 'link_monitor' - | 'ls_thread' - | 'mdns_service' - | 'mediacache' - | 'mediadecoderstatemachine' - | 'mediapdecoder' - | 'mediasupervisor' - | 'mediatimer' - | 'mediatrackgrph' - | 'memorypoller' - | 'mozstorage' - | 'mtransport' - | 'netlink_monitor' - | 'onnx_worker' - | 'pacerthread' - | 'permission' - | 'playeventsound' - | 'processhangmon' - | 'profilerchild' - | 'proxyresolution' - | 'quotamanager_io' - | 'registerfonts' - | 'remotebackbuffer' - | 'remotelzystream' - | 'remvidchild' - | 'renderer' - | 'sandboxreporter' - | 'savescripts' - | 'socket_thread' - | 'softwarevsyncthread' - | 'sqldb_content-prefs_sqlite' - | 'sqldb_cookies_sqlite' - | 'sqldb_formhistory_sqlite' - | 'ssl_cert' - | 'startupcache' - | 'streamtrans' - | 'stylethread' - | 'swcomposite' - | 'taskcontroller' - | 'timer' - | 'toastbgthread' - | 'trr_background' - | 'untrusted_modules' - | 'url_classifier' - | 'videocapture' - | 'vsynciothread' - | 'webrtccallthread' - | 'webrtcworker' - | 'wifi_tickler' - | 'wincompositor' - | 'windowsvsyncthread' - | 'winwindowocclusioncalc' - | 'worker_launcher' - | 'wrrenderbackend' - | 'wrscenebuilder' - | 'wrscenebuilderlp' - | 'wrworker' - | 'wrworkerlp', + | "androidui" + | "asynclogger" + | "audioipc" + | "audioipc_callback_rpc" + | "audioipc_client_callback" + | "audioipc_client_rpc" + | "audioipc_devicecollection_rpc" + | "audioipc_server_callback" + | "audioipc_server_rpc" + | "backgroundthreadpool" + | "bgiothreadpool" + | "bgreadurls" + | "bhmgr_monitor" + | "bhmgr_processor" + | "cameras_ipc" + | "canvasrenderer" + | "capturethread" + | "classifier_update" + | "com_mta" + | "compositor" + | "convolverworker" + | "cookie" + | "cubeboperation" + | "datachannel_io" + | "dns_resolver" + | "dom_worker" + | "dom_worklet" + | "domcachethread" + | "extensionprotocolhandler" + | "font_loader" + | "fontenumthread" + | "fs_broker" + | "geckomain" + | "gmpthread" + | "graphrunner" + | "hrtfdatabaseldr" + | "html5_parser" + | "imagebridgechld" + | "imageio" + | "indexeddb" + | "indexeddb_io" + | "initfontlist" + | "inotifyeventthread" + | "ipc_i_o_child" + | "ipc_i_o_parent" + | "ipc_launch" + | "ipdl_background" + | "js_watchdog" + | "jump_list" + | "libwebrtcmodulethread" + | "link_monitor" + | "ls_thread" + | "mdns_service" + | "mediacache" + | "mediadecoderstatemachine" + | "mediapdecoder" + | "mediasupervisor" + | "mediatimer" + | "mediatrackgrph" + | "memorypoller" + | "mozstorage" + | "mtransport" + | "netlink_monitor" + | "onnx_worker" + | "pacerthread" + | "permission" + | "playeventsound" + | "processhangmon" + | "profilerchild" + | "proxyresolution" + | "quotamanager_io" + | "registerfonts" + | "remotebackbuffer" + | "remotelzystream" + | "remvidchild" + | "renderer" + | "sandboxreporter" + | "savescripts" + | "socket_thread" + | "softwarevsyncthread" + | "sqldb_content-prefs_sqlite" + | "sqldb_cookies_sqlite" + | "sqldb_formhistory_sqlite" + | "ssl_cert" + | "startupcache" + | "streamtrans" + | "stylethread" + | "swcomposite" + | "taskcontroller" + | "timer" + | "toastbgthread" + | "trr_background" + | "untrusted_modules" + | "url_classifier" + | "videocapture" + | "vsynciothread" + | "webrtccallthread" + | "webrtcworker" + | "wifi_tickler" + | "wincompositor" + | "windowsvsyncthread" + | "winwindowocclusioncalc" + | "worker_launcher" + | "wrrenderbackend" + | "wrscenebuilder" + | "wrscenebuilderlp" + | "wrworker" + | "wrworkerlp", GleanCounter >; contentForeground: Record< - | 'androidui' - | 'asynclogger' - | 'audioipc' - | 'audioipc_callback_rpc' - | 'audioipc_client_callback' - | 'audioipc_client_rpc' - | 'audioipc_devicecollection_rpc' - | 'audioipc_server_callback' - | 'audioipc_server_rpc' - | 'backgroundthreadpool' - | 'bgiothreadpool' - | 'bgreadurls' - | 'bhmgr_monitor' - | 'bhmgr_processor' - | 'cameras_ipc' - | 'canvasrenderer' - | 'capturethread' - | 'classifier_update' - | 'com_mta' - | 'compositor' - | 'convolverworker' - | 'cookie' - | 'cubeboperation' - | 'datachannel_io' - | 'dns_resolver' - | 'dom_worker' - | 'dom_worklet' - | 'domcachethread' - | 'extensionprotocolhandler' - | 'font_loader' - | 'fontenumthread' - | 'fs_broker' - | 'geckomain' - | 'gmpthread' - | 'graphrunner' - | 'hrtfdatabaseldr' - | 'html5_parser' - | 'imagebridgechld' - | 'imageio' - | 'indexeddb' - | 'indexeddb_io' - | 'initfontlist' - | 'inotifyeventthread' - | 'ipc_i_o_child' - | 'ipc_i_o_parent' - | 'ipc_launch' - | 'ipdl_background' - | 'js_watchdog' - | 'jump_list' - | 'libwebrtcmodulethread' - | 'link_monitor' - | 'ls_thread' - | 'mdns_service' - | 'mediacache' - | 'mediadecoderstatemachine' - | 'mediapdecoder' - | 'mediasupervisor' - | 'mediatimer' - | 'mediatrackgrph' - | 'memorypoller' - | 'mozstorage' - | 'mtransport' - | 'netlink_monitor' - | 'onnx_worker' - | 'pacerthread' - | 'permission' - | 'playeventsound' - | 'processhangmon' - | 'profilerchild' - | 'proxyresolution' - | 'quotamanager_io' - | 'registerfonts' - | 'remotebackbuffer' - | 'remotelzystream' - | 'remvidchild' - | 'renderer' - | 'sandboxreporter' - | 'savescripts' - | 'socket_thread' - | 'softwarevsyncthread' - | 'sqldb_content-prefs_sqlite' - | 'sqldb_cookies_sqlite' - | 'sqldb_formhistory_sqlite' - | 'ssl_cert' - | 'startupcache' - | 'streamtrans' - | 'stylethread' - | 'swcomposite' - | 'taskcontroller' - | 'timer' - | 'toastbgthread' - | 'trr_background' - | 'untrusted_modules' - | 'url_classifier' - | 'videocapture' - | 'vsynciothread' - | 'webrtccallthread' - | 'webrtcworker' - | 'wifi_tickler' - | 'wincompositor' - | 'windowsvsyncthread' - | 'winwindowocclusioncalc' - | 'worker_launcher' - | 'wrrenderbackend' - | 'wrscenebuilder' - | 'wrscenebuilderlp' - | 'wrworker' - | 'wrworkerlp', + | "androidui" + | "asynclogger" + | "audioipc" + | "audioipc_callback_rpc" + | "audioipc_client_callback" + | "audioipc_client_rpc" + | "audioipc_devicecollection_rpc" + | "audioipc_server_callback" + | "audioipc_server_rpc" + | "backgroundthreadpool" + | "bgiothreadpool" + | "bgreadurls" + | "bhmgr_monitor" + | "bhmgr_processor" + | "cameras_ipc" + | "canvasrenderer" + | "capturethread" + | "classifier_update" + | "com_mta" + | "compositor" + | "convolverworker" + | "cookie" + | "cubeboperation" + | "datachannel_io" + | "dns_resolver" + | "dom_worker" + | "dom_worklet" + | "domcachethread" + | "extensionprotocolhandler" + | "font_loader" + | "fontenumthread" + | "fs_broker" + | "geckomain" + | "gmpthread" + | "graphrunner" + | "hrtfdatabaseldr" + | "html5_parser" + | "imagebridgechld" + | "imageio" + | "indexeddb" + | "indexeddb_io" + | "initfontlist" + | "inotifyeventthread" + | "ipc_i_o_child" + | "ipc_i_o_parent" + | "ipc_launch" + | "ipdl_background" + | "js_watchdog" + | "jump_list" + | "libwebrtcmodulethread" + | "link_monitor" + | "ls_thread" + | "mdns_service" + | "mediacache" + | "mediadecoderstatemachine" + | "mediapdecoder" + | "mediasupervisor" + | "mediatimer" + | "mediatrackgrph" + | "memorypoller" + | "mozstorage" + | "mtransport" + | "netlink_monitor" + | "onnx_worker" + | "pacerthread" + | "permission" + | "playeventsound" + | "processhangmon" + | "profilerchild" + | "proxyresolution" + | "quotamanager_io" + | "registerfonts" + | "remotebackbuffer" + | "remotelzystream" + | "remvidchild" + | "renderer" + | "sandboxreporter" + | "savescripts" + | "socket_thread" + | "softwarevsyncthread" + | "sqldb_content-prefs_sqlite" + | "sqldb_cookies_sqlite" + | "sqldb_formhistory_sqlite" + | "ssl_cert" + | "startupcache" + | "streamtrans" + | "stylethread" + | "swcomposite" + | "taskcontroller" + | "timer" + | "toastbgthread" + | "trr_background" + | "untrusted_modules" + | "url_classifier" + | "videocapture" + | "vsynciothread" + | "webrtccallthread" + | "webrtcworker" + | "wifi_tickler" + | "wincompositor" + | "windowsvsyncthread" + | "winwindowocclusioncalc" + | "worker_launcher" + | "wrrenderbackend" + | "wrscenebuilder" + | "wrscenebuilderlp" + | "wrworker" + | "wrworkerlp", GleanCounter >; gpuProcess: Record< - | 'androidui' - | 'asynclogger' - | 'audioipc' - | 'audioipc_callback_rpc' - | 'audioipc_client_callback' - | 'audioipc_client_rpc' - | 'audioipc_devicecollection_rpc' - | 'audioipc_server_callback' - | 'audioipc_server_rpc' - | 'backgroundthreadpool' - | 'bgiothreadpool' - | 'bgreadurls' - | 'bhmgr_monitor' - | 'bhmgr_processor' - | 'cameras_ipc' - | 'canvasrenderer' - | 'capturethread' - | 'classifier_update' - | 'com_mta' - | 'compositor' - | 'convolverworker' - | 'cookie' - | 'cubeboperation' - | 'datachannel_io' - | 'dns_resolver' - | 'dom_worker' - | 'dom_worklet' - | 'domcachethread' - | 'extensionprotocolhandler' - | 'font_loader' - | 'fontenumthread' - | 'fs_broker' - | 'geckomain' - | 'gmpthread' - | 'graphrunner' - | 'hrtfdatabaseldr' - | 'html5_parser' - | 'imagebridgechld' - | 'imageio' - | 'indexeddb' - | 'indexeddb_io' - | 'initfontlist' - | 'inotifyeventthread' - | 'ipc_i_o_child' - | 'ipc_i_o_parent' - | 'ipc_launch' - | 'ipdl_background' - | 'js_watchdog' - | 'jump_list' - | 'libwebrtcmodulethread' - | 'link_monitor' - | 'ls_thread' - | 'mdns_service' - | 'mediacache' - | 'mediadecoderstatemachine' - | 'mediapdecoder' - | 'mediasupervisor' - | 'mediatimer' - | 'mediatrackgrph' - | 'memorypoller' - | 'mozstorage' - | 'mtransport' - | 'netlink_monitor' - | 'onnx_worker' - | 'pacerthread' - | 'permission' - | 'playeventsound' - | 'processhangmon' - | 'profilerchild' - | 'proxyresolution' - | 'quotamanager_io' - | 'registerfonts' - | 'remotebackbuffer' - | 'remotelzystream' - | 'remvidchild' - | 'renderer' - | 'sandboxreporter' - | 'savescripts' - | 'socket_thread' - | 'softwarevsyncthread' - | 'sqldb_content-prefs_sqlite' - | 'sqldb_cookies_sqlite' - | 'sqldb_formhistory_sqlite' - | 'ssl_cert' - | 'startupcache' - | 'streamtrans' - | 'stylethread' - | 'swcomposite' - | 'taskcontroller' - | 'timer' - | 'toastbgthread' - | 'trr_background' - | 'untrusted_modules' - | 'url_classifier' - | 'videocapture' - | 'vsynciothread' - | 'webrtccallthread' - | 'webrtcworker' - | 'wifi_tickler' - | 'wincompositor' - | 'windowsvsyncthread' - | 'winwindowocclusioncalc' - | 'worker_launcher' - | 'wrrenderbackend' - | 'wrscenebuilder' - | 'wrscenebuilderlp' - | 'wrworker' - | 'wrworkerlp', + | "androidui" + | "asynclogger" + | "audioipc" + | "audioipc_callback_rpc" + | "audioipc_client_callback" + | "audioipc_client_rpc" + | "audioipc_devicecollection_rpc" + | "audioipc_server_callback" + | "audioipc_server_rpc" + | "backgroundthreadpool" + | "bgiothreadpool" + | "bgreadurls" + | "bhmgr_monitor" + | "bhmgr_processor" + | "cameras_ipc" + | "canvasrenderer" + | "capturethread" + | "classifier_update" + | "com_mta" + | "compositor" + | "convolverworker" + | "cookie" + | "cubeboperation" + | "datachannel_io" + | "dns_resolver" + | "dom_worker" + | "dom_worklet" + | "domcachethread" + | "extensionprotocolhandler" + | "font_loader" + | "fontenumthread" + | "fs_broker" + | "geckomain" + | "gmpthread" + | "graphrunner" + | "hrtfdatabaseldr" + | "html5_parser" + | "imagebridgechld" + | "imageio" + | "indexeddb" + | "indexeddb_io" + | "initfontlist" + | "inotifyeventthread" + | "ipc_i_o_child" + | "ipc_i_o_parent" + | "ipc_launch" + | "ipdl_background" + | "js_watchdog" + | "jump_list" + | "libwebrtcmodulethread" + | "link_monitor" + | "ls_thread" + | "mdns_service" + | "mediacache" + | "mediadecoderstatemachine" + | "mediapdecoder" + | "mediasupervisor" + | "mediatimer" + | "mediatrackgrph" + | "memorypoller" + | "mozstorage" + | "mtransport" + | "netlink_monitor" + | "onnx_worker" + | "pacerthread" + | "permission" + | "playeventsound" + | "processhangmon" + | "profilerchild" + | "proxyresolution" + | "quotamanager_io" + | "registerfonts" + | "remotebackbuffer" + | "remotelzystream" + | "remvidchild" + | "renderer" + | "sandboxreporter" + | "savescripts" + | "socket_thread" + | "softwarevsyncthread" + | "sqldb_content-prefs_sqlite" + | "sqldb_cookies_sqlite" + | "sqldb_formhistory_sqlite" + | "ssl_cert" + | "startupcache" + | "streamtrans" + | "stylethread" + | "swcomposite" + | "taskcontroller" + | "timer" + | "toastbgthread" + | "trr_background" + | "untrusted_modules" + | "url_classifier" + | "videocapture" + | "vsynciothread" + | "webrtccallthread" + | "webrtcworker" + | "wifi_tickler" + | "wincompositor" + | "windowsvsyncthread" + | "winwindowocclusioncalc" + | "worker_launcher" + | "wrrenderbackend" + | "wrscenebuilder" + | "wrscenebuilderlp" + | "wrworker" + | "wrworkerlp", GleanCounter >; inferenceProcess: Record< - | 'androidui' - | 'asynclogger' - | 'audioipc' - | 'audioipc_callback_rpc' - | 'audioipc_client_callback' - | 'audioipc_client_rpc' - | 'audioipc_devicecollection_rpc' - | 'audioipc_server_callback' - | 'audioipc_server_rpc' - | 'backgroundthreadpool' - | 'bgiothreadpool' - | 'bgreadurls' - | 'bhmgr_monitor' - | 'bhmgr_processor' - | 'cameras_ipc' - | 'canvasrenderer' - | 'capturethread' - | 'classifier_update' - | 'com_mta' - | 'compositor' - | 'convolverworker' - | 'cookie' - | 'cubeboperation' - | 'datachannel_io' - | 'dns_resolver' - | 'dom_worker' - | 'dom_worklet' - | 'domcachethread' - | 'extensionprotocolhandler' - | 'font_loader' - | 'fontenumthread' - | 'fs_broker' - | 'geckomain' - | 'gmpthread' - | 'graphrunner' - | 'hrtfdatabaseldr' - | 'html5_parser' - | 'imagebridgechld' - | 'imageio' - | 'indexeddb' - | 'indexeddb_io' - | 'initfontlist' - | 'inotifyeventthread' - | 'ipc_i_o_child' - | 'ipc_i_o_parent' - | 'ipc_launch' - | 'ipdl_background' - | 'js_watchdog' - | 'jump_list' - | 'libwebrtcmodulethread' - | 'link_monitor' - | 'ls_thread' - | 'mdns_service' - | 'mediacache' - | 'mediadecoderstatemachine' - | 'mediapdecoder' - | 'mediasupervisor' - | 'mediatimer' - | 'mediatrackgrph' - | 'memorypoller' - | 'mozstorage' - | 'mtransport' - | 'netlink_monitor' - | 'onnx_worker' - | 'pacerthread' - | 'permission' - | 'playeventsound' - | 'processhangmon' - | 'profilerchild' - | 'proxyresolution' - | 'quotamanager_io' - | 'registerfonts' - | 'remotebackbuffer' - | 'remotelzystream' - | 'remvidchild' - | 'renderer' - | 'sandboxreporter' - | 'savescripts' - | 'socket_thread' - | 'softwarevsyncthread' - | 'sqldb_content-prefs_sqlite' - | 'sqldb_cookies_sqlite' - | 'sqldb_formhistory_sqlite' - | 'ssl_cert' - | 'startupcache' - | 'streamtrans' - | 'stylethread' - | 'swcomposite' - | 'taskcontroller' - | 'timer' - | 'toastbgthread' - | 'trr_background' - | 'untrusted_modules' - | 'url_classifier' - | 'videocapture' - | 'vsynciothread' - | 'webrtccallthread' - | 'webrtcworker' - | 'wifi_tickler' - | 'wincompositor' - | 'windowsvsyncthread' - | 'winwindowocclusioncalc' - | 'worker_launcher' - | 'wrrenderbackend' - | 'wrscenebuilder' - | 'wrscenebuilderlp' - | 'wrworker' - | 'wrworkerlp', + | "androidui" + | "asynclogger" + | "audioipc" + | "audioipc_callback_rpc" + | "audioipc_client_callback" + | "audioipc_client_rpc" + | "audioipc_devicecollection_rpc" + | "audioipc_server_callback" + | "audioipc_server_rpc" + | "backgroundthreadpool" + | "bgiothreadpool" + | "bgreadurls" + | "bhmgr_monitor" + | "bhmgr_processor" + | "cameras_ipc" + | "canvasrenderer" + | "capturethread" + | "classifier_update" + | "com_mta" + | "compositor" + | "convolverworker" + | "cookie" + | "cubeboperation" + | "datachannel_io" + | "dns_resolver" + | "dom_worker" + | "dom_worklet" + | "domcachethread" + | "extensionprotocolhandler" + | "font_loader" + | "fontenumthread" + | "fs_broker" + | "geckomain" + | "gmpthread" + | "graphrunner" + | "hrtfdatabaseldr" + | "html5_parser" + | "imagebridgechld" + | "imageio" + | "indexeddb" + | "indexeddb_io" + | "initfontlist" + | "inotifyeventthread" + | "ipc_i_o_child" + | "ipc_i_o_parent" + | "ipc_launch" + | "ipdl_background" + | "js_watchdog" + | "jump_list" + | "libwebrtcmodulethread" + | "link_monitor" + | "ls_thread" + | "mdns_service" + | "mediacache" + | "mediadecoderstatemachine" + | "mediapdecoder" + | "mediasupervisor" + | "mediatimer" + | "mediatrackgrph" + | "memorypoller" + | "mozstorage" + | "mtransport" + | "netlink_monitor" + | "onnx_worker" + | "pacerthread" + | "permission" + | "playeventsound" + | "processhangmon" + | "profilerchild" + | "proxyresolution" + | "quotamanager_io" + | "registerfonts" + | "remotebackbuffer" + | "remotelzystream" + | "remvidchild" + | "renderer" + | "sandboxreporter" + | "savescripts" + | "socket_thread" + | "softwarevsyncthread" + | "sqldb_content-prefs_sqlite" + | "sqldb_cookies_sqlite" + | "sqldb_formhistory_sqlite" + | "ssl_cert" + | "startupcache" + | "streamtrans" + | "stylethread" + | "swcomposite" + | "taskcontroller" + | "timer" + | "toastbgthread" + | "trr_background" + | "untrusted_modules" + | "url_classifier" + | "videocapture" + | "vsynciothread" + | "webrtccallthread" + | "webrtcworker" + | "wifi_tickler" + | "wincompositor" + | "windowsvsyncthread" + | "winwindowocclusioncalc" + | "worker_launcher" + | "wrrenderbackend" + | "wrscenebuilder" + | "wrscenebuilderlp" + | "wrworker" + | "wrworkerlp", GleanCounter >; parentActive: Record< - | 'androidui' - | 'asynclogger' - | 'audioipc' - | 'audioipc_callback_rpc' - | 'audioipc_client_callback' - | 'audioipc_client_rpc' - | 'audioipc_devicecollection_rpc' - | 'audioipc_server_callback' - | 'audioipc_server_rpc' - | 'backgroundthreadpool' - | 'bgiothreadpool' - | 'bgreadurls' - | 'bhmgr_monitor' - | 'bhmgr_processor' - | 'cameras_ipc' - | 'canvasrenderer' - | 'capturethread' - | 'classifier_update' - | 'com_mta' - | 'compositor' - | 'convolverworker' - | 'cookie' - | 'cubeboperation' - | 'datachannel_io' - | 'dns_resolver' - | 'dom_worker' - | 'dom_worklet' - | 'domcachethread' - | 'extensionprotocolhandler' - | 'font_loader' - | 'fontenumthread' - | 'fs_broker' - | 'geckomain' - | 'gmpthread' - | 'graphrunner' - | 'hrtfdatabaseldr' - | 'html5_parser' - | 'imagebridgechld' - | 'imageio' - | 'indexeddb' - | 'indexeddb_io' - | 'initfontlist' - | 'inotifyeventthread' - | 'ipc_i_o_child' - | 'ipc_i_o_parent' - | 'ipc_launch' - | 'ipdl_background' - | 'js_watchdog' - | 'jump_list' - | 'libwebrtcmodulethread' - | 'link_monitor' - | 'ls_thread' - | 'mdns_service' - | 'mediacache' - | 'mediadecoderstatemachine' - | 'mediapdecoder' - | 'mediasupervisor' - | 'mediatimer' - | 'mediatrackgrph' - | 'memorypoller' - | 'mozstorage' - | 'mtransport' - | 'netlink_monitor' - | 'onnx_worker' - | 'pacerthread' - | 'permission' - | 'playeventsound' - | 'processhangmon' - | 'profilerchild' - | 'proxyresolution' - | 'quotamanager_io' - | 'registerfonts' - | 'remotebackbuffer' - | 'remotelzystream' - | 'remvidchild' - | 'renderer' - | 'sandboxreporter' - | 'savescripts' - | 'socket_thread' - | 'softwarevsyncthread' - | 'sqldb_content-prefs_sqlite' - | 'sqldb_cookies_sqlite' - | 'sqldb_formhistory_sqlite' - | 'ssl_cert' - | 'startupcache' - | 'streamtrans' - | 'stylethread' - | 'swcomposite' - | 'taskcontroller' - | 'timer' - | 'toastbgthread' - | 'trr_background' - | 'untrusted_modules' - | 'url_classifier' - | 'videocapture' - | 'vsynciothread' - | 'webrtccallthread' - | 'webrtcworker' - | 'wifi_tickler' - | 'wincompositor' - | 'windowsvsyncthread' - | 'winwindowocclusioncalc' - | 'worker_launcher' - | 'wrrenderbackend' - | 'wrscenebuilder' - | 'wrscenebuilderlp' - | 'wrworker' - | 'wrworkerlp', + | "androidui" + | "asynclogger" + | "audioipc" + | "audioipc_callback_rpc" + | "audioipc_client_callback" + | "audioipc_client_rpc" + | "audioipc_devicecollection_rpc" + | "audioipc_server_callback" + | "audioipc_server_rpc" + | "backgroundthreadpool" + | "bgiothreadpool" + | "bgreadurls" + | "bhmgr_monitor" + | "bhmgr_processor" + | "cameras_ipc" + | "canvasrenderer" + | "capturethread" + | "classifier_update" + | "com_mta" + | "compositor" + | "convolverworker" + | "cookie" + | "cubeboperation" + | "datachannel_io" + | "dns_resolver" + | "dom_worker" + | "dom_worklet" + | "domcachethread" + | "extensionprotocolhandler" + | "font_loader" + | "fontenumthread" + | "fs_broker" + | "geckomain" + | "gmpthread" + | "graphrunner" + | "hrtfdatabaseldr" + | "html5_parser" + | "imagebridgechld" + | "imageio" + | "indexeddb" + | "indexeddb_io" + | "initfontlist" + | "inotifyeventthread" + | "ipc_i_o_child" + | "ipc_i_o_parent" + | "ipc_launch" + | "ipdl_background" + | "js_watchdog" + | "jump_list" + | "libwebrtcmodulethread" + | "link_monitor" + | "ls_thread" + | "mdns_service" + | "mediacache" + | "mediadecoderstatemachine" + | "mediapdecoder" + | "mediasupervisor" + | "mediatimer" + | "mediatrackgrph" + | "memorypoller" + | "mozstorage" + | "mtransport" + | "netlink_monitor" + | "onnx_worker" + | "pacerthread" + | "permission" + | "playeventsound" + | "processhangmon" + | "profilerchild" + | "proxyresolution" + | "quotamanager_io" + | "registerfonts" + | "remotebackbuffer" + | "remotelzystream" + | "remvidchild" + | "renderer" + | "sandboxreporter" + | "savescripts" + | "socket_thread" + | "softwarevsyncthread" + | "sqldb_content-prefs_sqlite" + | "sqldb_cookies_sqlite" + | "sqldb_formhistory_sqlite" + | "ssl_cert" + | "startupcache" + | "streamtrans" + | "stylethread" + | "swcomposite" + | "taskcontroller" + | "timer" + | "toastbgthread" + | "trr_background" + | "untrusted_modules" + | "url_classifier" + | "videocapture" + | "vsynciothread" + | "webrtccallthread" + | "webrtcworker" + | "wifi_tickler" + | "wincompositor" + | "windowsvsyncthread" + | "winwindowocclusioncalc" + | "worker_launcher" + | "wrrenderbackend" + | "wrscenebuilder" + | "wrscenebuilderlp" + | "wrworker" + | "wrworkerlp", GleanCounter >; parentInactive: Record< - | 'androidui' - | 'asynclogger' - | 'audioipc' - | 'audioipc_callback_rpc' - | 'audioipc_client_callback' - | 'audioipc_client_rpc' - | 'audioipc_devicecollection_rpc' - | 'audioipc_server_callback' - | 'audioipc_server_rpc' - | 'backgroundthreadpool' - | 'bgiothreadpool' - | 'bgreadurls' - | 'bhmgr_monitor' - | 'bhmgr_processor' - | 'cameras_ipc' - | 'canvasrenderer' - | 'capturethread' - | 'classifier_update' - | 'com_mta' - | 'compositor' - | 'convolverworker' - | 'cookie' - | 'cubeboperation' - | 'datachannel_io' - | 'dns_resolver' - | 'dom_worker' - | 'dom_worklet' - | 'domcachethread' - | 'extensionprotocolhandler' - | 'font_loader' - | 'fontenumthread' - | 'fs_broker' - | 'geckomain' - | 'gmpthread' - | 'graphrunner' - | 'hrtfdatabaseldr' - | 'html5_parser' - | 'imagebridgechld' - | 'imageio' - | 'indexeddb' - | 'indexeddb_io' - | 'initfontlist' - | 'inotifyeventthread' - | 'ipc_i_o_child' - | 'ipc_i_o_parent' - | 'ipc_launch' - | 'ipdl_background' - | 'js_watchdog' - | 'jump_list' - | 'libwebrtcmodulethread' - | 'link_monitor' - | 'ls_thread' - | 'mdns_service' - | 'mediacache' - | 'mediadecoderstatemachine' - | 'mediapdecoder' - | 'mediasupervisor' - | 'mediatimer' - | 'mediatrackgrph' - | 'memorypoller' - | 'mozstorage' - | 'mtransport' - | 'netlink_monitor' - | 'onnx_worker' - | 'pacerthread' - | 'permission' - | 'playeventsound' - | 'processhangmon' - | 'profilerchild' - | 'proxyresolution' - | 'quotamanager_io' - | 'registerfonts' - | 'remotebackbuffer' - | 'remotelzystream' - | 'remvidchild' - | 'renderer' - | 'sandboxreporter' - | 'savescripts' - | 'socket_thread' - | 'softwarevsyncthread' - | 'sqldb_content-prefs_sqlite' - | 'sqldb_cookies_sqlite' - | 'sqldb_formhistory_sqlite' - | 'ssl_cert' - | 'startupcache' - | 'streamtrans' - | 'stylethread' - | 'swcomposite' - | 'taskcontroller' - | 'timer' - | 'toastbgthread' - | 'trr_background' - | 'untrusted_modules' - | 'url_classifier' - | 'videocapture' - | 'vsynciothread' - | 'webrtccallthread' - | 'webrtcworker' - | 'wifi_tickler' - | 'wincompositor' - | 'windowsvsyncthread' - | 'winwindowocclusioncalc' - | 'worker_launcher' - | 'wrrenderbackend' - | 'wrscenebuilder' - | 'wrscenebuilderlp' - | 'wrworker' - | 'wrworkerlp', + | "androidui" + | "asynclogger" + | "audioipc" + | "audioipc_callback_rpc" + | "audioipc_client_callback" + | "audioipc_client_rpc" + | "audioipc_devicecollection_rpc" + | "audioipc_server_callback" + | "audioipc_server_rpc" + | "backgroundthreadpool" + | "bgiothreadpool" + | "bgreadurls" + | "bhmgr_monitor" + | "bhmgr_processor" + | "cameras_ipc" + | "canvasrenderer" + | "capturethread" + | "classifier_update" + | "com_mta" + | "compositor" + | "convolverworker" + | "cookie" + | "cubeboperation" + | "datachannel_io" + | "dns_resolver" + | "dom_worker" + | "dom_worklet" + | "domcachethread" + | "extensionprotocolhandler" + | "font_loader" + | "fontenumthread" + | "fs_broker" + | "geckomain" + | "gmpthread" + | "graphrunner" + | "hrtfdatabaseldr" + | "html5_parser" + | "imagebridgechld" + | "imageio" + | "indexeddb" + | "indexeddb_io" + | "initfontlist" + | "inotifyeventthread" + | "ipc_i_o_child" + | "ipc_i_o_parent" + | "ipc_launch" + | "ipdl_background" + | "js_watchdog" + | "jump_list" + | "libwebrtcmodulethread" + | "link_monitor" + | "ls_thread" + | "mdns_service" + | "mediacache" + | "mediadecoderstatemachine" + | "mediapdecoder" + | "mediasupervisor" + | "mediatimer" + | "mediatrackgrph" + | "memorypoller" + | "mozstorage" + | "mtransport" + | "netlink_monitor" + | "onnx_worker" + | "pacerthread" + | "permission" + | "playeventsound" + | "processhangmon" + | "profilerchild" + | "proxyresolution" + | "quotamanager_io" + | "registerfonts" + | "remotebackbuffer" + | "remotelzystream" + | "remvidchild" + | "renderer" + | "sandboxreporter" + | "savescripts" + | "socket_thread" + | "softwarevsyncthread" + | "sqldb_content-prefs_sqlite" + | "sqldb_cookies_sqlite" + | "sqldb_formhistory_sqlite" + | "ssl_cert" + | "startupcache" + | "streamtrans" + | "stylethread" + | "swcomposite" + | "taskcontroller" + | "timer" + | "toastbgthread" + | "trr_background" + | "untrusted_modules" + | "url_classifier" + | "videocapture" + | "vsynciothread" + | "webrtccallthread" + | "webrtcworker" + | "wifi_tickler" + | "wincompositor" + | "windowsvsyncthread" + | "winwindowocclusioncalc" + | "worker_launcher" + | "wrrenderbackend" + | "wrscenebuilder" + | "wrscenebuilderlp" + | "wrworker" + | "wrworkerlp", GleanCounter >; }; powerWakeupsPerThread: { contentBackground: Record< - | 'androidui' - | 'asynclogger' - | 'audioipc' - | 'audioipc_callback_rpc' - | 'audioipc_client_callback' - | 'audioipc_client_rpc' - | 'audioipc_devicecollection_rpc' - | 'audioipc_server_callback' - | 'audioipc_server_rpc' - | 'backgroundthreadpool' - | 'bgiothreadpool' - | 'bgreadurls' - | 'bhmgr_monitor' - | 'bhmgr_processor' - | 'cameras_ipc' - | 'canvasrenderer' - | 'capturethread' - | 'classifier_update' - | 'com_mta' - | 'compositor' - | 'convolverworker' - | 'cookie' - | 'cubeboperation' - | 'datachannel_io' - | 'dns_resolver' - | 'dom_worker' - | 'dom_worklet' - | 'domcachethread' - | 'extensionprotocolhandler' - | 'font_loader' - | 'fontenumthread' - | 'fs_broker' - | 'geckomain' - | 'gmpthread' - | 'graphrunner' - | 'hrtfdatabaseldr' - | 'html5_parser' - | 'imagebridgechld' - | 'imageio' - | 'indexeddb' - | 'indexeddb_io' - | 'initfontlist' - | 'inotifyeventthread' - | 'ipc_i_o_child' - | 'ipc_i_o_parent' - | 'ipc_launch' - | 'ipdl_background' - | 'js_watchdog' - | 'jump_list' - | 'libwebrtcmodulethread' - | 'link_monitor' - | 'ls_thread' - | 'mdns_service' - | 'mediacache' - | 'mediadecoderstatemachine' - | 'mediapdecoder' - | 'mediasupervisor' - | 'mediatimer' - | 'mediatrackgrph' - | 'memorypoller' - | 'mozstorage' - | 'mtransport' - | 'netlink_monitor' - | 'onnx_worker' - | 'pacerthread' - | 'permission' - | 'playeventsound' - | 'processhangmon' - | 'profilerchild' - | 'proxyresolution' - | 'quotamanager_io' - | 'registerfonts' - | 'remotebackbuffer' - | 'remotelzystream' - | 'remvidchild' - | 'renderer' - | 'sandboxreporter' - | 'savescripts' - | 'socket_thread' - | 'softwarevsyncthread' - | 'sqldb_content-prefs_sqlite' - | 'sqldb_cookies_sqlite' - | 'sqldb_formhistory_sqlite' - | 'ssl_cert' - | 'startupcache' - | 'streamtrans' - | 'stylethread' - | 'swcomposite' - | 'taskcontroller' - | 'timer' - | 'toastbgthread' - | 'trr_background' - | 'untrusted_modules' - | 'url_classifier' - | 'videocapture' - | 'vsynciothread' - | 'webrtccallthread' - | 'webrtcworker' - | 'wifi_tickler' - | 'wincompositor' - | 'windowsvsyncthread' - | 'winwindowocclusioncalc' - | 'worker_launcher' - | 'wrrenderbackend' - | 'wrscenebuilder' - | 'wrscenebuilderlp' - | 'wrworker' - | 'wrworkerlp', + | "androidui" + | "asynclogger" + | "audioipc" + | "audioipc_callback_rpc" + | "audioipc_client_callback" + | "audioipc_client_rpc" + | "audioipc_devicecollection_rpc" + | "audioipc_server_callback" + | "audioipc_server_rpc" + | "backgroundthreadpool" + | "bgiothreadpool" + | "bgreadurls" + | "bhmgr_monitor" + | "bhmgr_processor" + | "cameras_ipc" + | "canvasrenderer" + | "capturethread" + | "classifier_update" + | "com_mta" + | "compositor" + | "convolverworker" + | "cookie" + | "cubeboperation" + | "datachannel_io" + | "dns_resolver" + | "dom_worker" + | "dom_worklet" + | "domcachethread" + | "extensionprotocolhandler" + | "font_loader" + | "fontenumthread" + | "fs_broker" + | "geckomain" + | "gmpthread" + | "graphrunner" + | "hrtfdatabaseldr" + | "html5_parser" + | "imagebridgechld" + | "imageio" + | "indexeddb" + | "indexeddb_io" + | "initfontlist" + | "inotifyeventthread" + | "ipc_i_o_child" + | "ipc_i_o_parent" + | "ipc_launch" + | "ipdl_background" + | "js_watchdog" + | "jump_list" + | "libwebrtcmodulethread" + | "link_monitor" + | "ls_thread" + | "mdns_service" + | "mediacache" + | "mediadecoderstatemachine" + | "mediapdecoder" + | "mediasupervisor" + | "mediatimer" + | "mediatrackgrph" + | "memorypoller" + | "mozstorage" + | "mtransport" + | "netlink_monitor" + | "onnx_worker" + | "pacerthread" + | "permission" + | "playeventsound" + | "processhangmon" + | "profilerchild" + | "proxyresolution" + | "quotamanager_io" + | "registerfonts" + | "remotebackbuffer" + | "remotelzystream" + | "remvidchild" + | "renderer" + | "sandboxreporter" + | "savescripts" + | "socket_thread" + | "softwarevsyncthread" + | "sqldb_content-prefs_sqlite" + | "sqldb_cookies_sqlite" + | "sqldb_formhistory_sqlite" + | "ssl_cert" + | "startupcache" + | "streamtrans" + | "stylethread" + | "swcomposite" + | "taskcontroller" + | "timer" + | "toastbgthread" + | "trr_background" + | "untrusted_modules" + | "url_classifier" + | "videocapture" + | "vsynciothread" + | "webrtccallthread" + | "webrtcworker" + | "wifi_tickler" + | "wincompositor" + | "windowsvsyncthread" + | "winwindowocclusioncalc" + | "worker_launcher" + | "wrrenderbackend" + | "wrscenebuilder" + | "wrscenebuilderlp" + | "wrworker" + | "wrworkerlp", GleanCounter >; contentForeground: Record< - | 'androidui' - | 'asynclogger' - | 'audioipc' - | 'audioipc_callback_rpc' - | 'audioipc_client_callback' - | 'audioipc_client_rpc' - | 'audioipc_devicecollection_rpc' - | 'audioipc_server_callback' - | 'audioipc_server_rpc' - | 'backgroundthreadpool' - | 'bgiothreadpool' - | 'bgreadurls' - | 'bhmgr_monitor' - | 'bhmgr_processor' - | 'cameras_ipc' - | 'canvasrenderer' - | 'capturethread' - | 'classifier_update' - | 'com_mta' - | 'compositor' - | 'convolverworker' - | 'cookie' - | 'cubeboperation' - | 'datachannel_io' - | 'dns_resolver' - | 'dom_worker' - | 'dom_worklet' - | 'domcachethread' - | 'extensionprotocolhandler' - | 'font_loader' - | 'fontenumthread' - | 'fs_broker' - | 'geckomain' - | 'gmpthread' - | 'graphrunner' - | 'hrtfdatabaseldr' - | 'html5_parser' - | 'imagebridgechld' - | 'imageio' - | 'indexeddb' - | 'indexeddb_io' - | 'initfontlist' - | 'inotifyeventthread' - | 'ipc_i_o_child' - | 'ipc_i_o_parent' - | 'ipc_launch' - | 'ipdl_background' - | 'js_watchdog' - | 'jump_list' - | 'libwebrtcmodulethread' - | 'link_monitor' - | 'ls_thread' - | 'mdns_service' - | 'mediacache' - | 'mediadecoderstatemachine' - | 'mediapdecoder' - | 'mediasupervisor' - | 'mediatimer' - | 'mediatrackgrph' - | 'memorypoller' - | 'mozstorage' - | 'mtransport' - | 'netlink_monitor' - | 'onnx_worker' - | 'pacerthread' - | 'permission' - | 'playeventsound' - | 'processhangmon' - | 'profilerchild' - | 'proxyresolution' - | 'quotamanager_io' - | 'registerfonts' - | 'remotebackbuffer' - | 'remotelzystream' - | 'remvidchild' - | 'renderer' - | 'sandboxreporter' - | 'savescripts' - | 'socket_thread' - | 'softwarevsyncthread' - | 'sqldb_content-prefs_sqlite' - | 'sqldb_cookies_sqlite' - | 'sqldb_formhistory_sqlite' - | 'ssl_cert' - | 'startupcache' - | 'streamtrans' - | 'stylethread' - | 'swcomposite' - | 'taskcontroller' - | 'timer' - | 'toastbgthread' - | 'trr_background' - | 'untrusted_modules' - | 'url_classifier' - | 'videocapture' - | 'vsynciothread' - | 'webrtccallthread' - | 'webrtcworker' - | 'wifi_tickler' - | 'wincompositor' - | 'windowsvsyncthread' - | 'winwindowocclusioncalc' - | 'worker_launcher' - | 'wrrenderbackend' - | 'wrscenebuilder' - | 'wrscenebuilderlp' - | 'wrworker' - | 'wrworkerlp', + | "androidui" + | "asynclogger" + | "audioipc" + | "audioipc_callback_rpc" + | "audioipc_client_callback" + | "audioipc_client_rpc" + | "audioipc_devicecollection_rpc" + | "audioipc_server_callback" + | "audioipc_server_rpc" + | "backgroundthreadpool" + | "bgiothreadpool" + | "bgreadurls" + | "bhmgr_monitor" + | "bhmgr_processor" + | "cameras_ipc" + | "canvasrenderer" + | "capturethread" + | "classifier_update" + | "com_mta" + | "compositor" + | "convolverworker" + | "cookie" + | "cubeboperation" + | "datachannel_io" + | "dns_resolver" + | "dom_worker" + | "dom_worklet" + | "domcachethread" + | "extensionprotocolhandler" + | "font_loader" + | "fontenumthread" + | "fs_broker" + | "geckomain" + | "gmpthread" + | "graphrunner" + | "hrtfdatabaseldr" + | "html5_parser" + | "imagebridgechld" + | "imageio" + | "indexeddb" + | "indexeddb_io" + | "initfontlist" + | "inotifyeventthread" + | "ipc_i_o_child" + | "ipc_i_o_parent" + | "ipc_launch" + | "ipdl_background" + | "js_watchdog" + | "jump_list" + | "libwebrtcmodulethread" + | "link_monitor" + | "ls_thread" + | "mdns_service" + | "mediacache" + | "mediadecoderstatemachine" + | "mediapdecoder" + | "mediasupervisor" + | "mediatimer" + | "mediatrackgrph" + | "memorypoller" + | "mozstorage" + | "mtransport" + | "netlink_monitor" + | "onnx_worker" + | "pacerthread" + | "permission" + | "playeventsound" + | "processhangmon" + | "profilerchild" + | "proxyresolution" + | "quotamanager_io" + | "registerfonts" + | "remotebackbuffer" + | "remotelzystream" + | "remvidchild" + | "renderer" + | "sandboxreporter" + | "savescripts" + | "socket_thread" + | "softwarevsyncthread" + | "sqldb_content-prefs_sqlite" + | "sqldb_cookies_sqlite" + | "sqldb_formhistory_sqlite" + | "ssl_cert" + | "startupcache" + | "streamtrans" + | "stylethread" + | "swcomposite" + | "taskcontroller" + | "timer" + | "toastbgthread" + | "trr_background" + | "untrusted_modules" + | "url_classifier" + | "videocapture" + | "vsynciothread" + | "webrtccallthread" + | "webrtcworker" + | "wifi_tickler" + | "wincompositor" + | "windowsvsyncthread" + | "winwindowocclusioncalc" + | "worker_launcher" + | "wrrenderbackend" + | "wrscenebuilder" + | "wrscenebuilderlp" + | "wrworker" + | "wrworkerlp", GleanCounter >; gpuProcess: Record< - | 'androidui' - | 'asynclogger' - | 'audioipc' - | 'audioipc_callback_rpc' - | 'audioipc_client_callback' - | 'audioipc_client_rpc' - | 'audioipc_devicecollection_rpc' - | 'audioipc_server_callback' - | 'audioipc_server_rpc' - | 'backgroundthreadpool' - | 'bgiothreadpool' - | 'bgreadurls' - | 'bhmgr_monitor' - | 'bhmgr_processor' - | 'cameras_ipc' - | 'canvasrenderer' - | 'capturethread' - | 'classifier_update' - | 'com_mta' - | 'compositor' - | 'convolverworker' - | 'cookie' - | 'cubeboperation' - | 'datachannel_io' - | 'dns_resolver' - | 'dom_worker' - | 'dom_worklet' - | 'domcachethread' - | 'extensionprotocolhandler' - | 'font_loader' - | 'fontenumthread' - | 'fs_broker' - | 'geckomain' - | 'gmpthread' - | 'graphrunner' - | 'hrtfdatabaseldr' - | 'html5_parser' - | 'imagebridgechld' - | 'imageio' - | 'indexeddb' - | 'indexeddb_io' - | 'initfontlist' - | 'inotifyeventthread' - | 'ipc_i_o_child' - | 'ipc_i_o_parent' - | 'ipc_launch' - | 'ipdl_background' - | 'js_watchdog' - | 'jump_list' - | 'libwebrtcmodulethread' - | 'link_monitor' - | 'ls_thread' - | 'mdns_service' - | 'mediacache' - | 'mediadecoderstatemachine' - | 'mediapdecoder' - | 'mediasupervisor' - | 'mediatimer' - | 'mediatrackgrph' - | 'memorypoller' - | 'mozstorage' - | 'mtransport' - | 'netlink_monitor' - | 'onnx_worker' - | 'pacerthread' - | 'permission' - | 'playeventsound' - | 'processhangmon' - | 'profilerchild' - | 'proxyresolution' - | 'quotamanager_io' - | 'registerfonts' - | 'remotebackbuffer' - | 'remotelzystream' - | 'remvidchild' - | 'renderer' - | 'sandboxreporter' - | 'savescripts' - | 'socket_thread' - | 'softwarevsyncthread' - | 'sqldb_content-prefs_sqlite' - | 'sqldb_cookies_sqlite' - | 'sqldb_formhistory_sqlite' - | 'ssl_cert' - | 'startupcache' - | 'streamtrans' - | 'stylethread' - | 'swcomposite' - | 'taskcontroller' - | 'timer' - | 'toastbgthread' - | 'trr_background' - | 'untrusted_modules' - | 'url_classifier' - | 'videocapture' - | 'vsynciothread' - | 'webrtccallthread' - | 'webrtcworker' - | 'wifi_tickler' - | 'wincompositor' - | 'windowsvsyncthread' - | 'winwindowocclusioncalc' - | 'worker_launcher' - | 'wrrenderbackend' - | 'wrscenebuilder' - | 'wrscenebuilderlp' - | 'wrworker' - | 'wrworkerlp', + | "androidui" + | "asynclogger" + | "audioipc" + | "audioipc_callback_rpc" + | "audioipc_client_callback" + | "audioipc_client_rpc" + | "audioipc_devicecollection_rpc" + | "audioipc_server_callback" + | "audioipc_server_rpc" + | "backgroundthreadpool" + | "bgiothreadpool" + | "bgreadurls" + | "bhmgr_monitor" + | "bhmgr_processor" + | "cameras_ipc" + | "canvasrenderer" + | "capturethread" + | "classifier_update" + | "com_mta" + | "compositor" + | "convolverworker" + | "cookie" + | "cubeboperation" + | "datachannel_io" + | "dns_resolver" + | "dom_worker" + | "dom_worklet" + | "domcachethread" + | "extensionprotocolhandler" + | "font_loader" + | "fontenumthread" + | "fs_broker" + | "geckomain" + | "gmpthread" + | "graphrunner" + | "hrtfdatabaseldr" + | "html5_parser" + | "imagebridgechld" + | "imageio" + | "indexeddb" + | "indexeddb_io" + | "initfontlist" + | "inotifyeventthread" + | "ipc_i_o_child" + | "ipc_i_o_parent" + | "ipc_launch" + | "ipdl_background" + | "js_watchdog" + | "jump_list" + | "libwebrtcmodulethread" + | "link_monitor" + | "ls_thread" + | "mdns_service" + | "mediacache" + | "mediadecoderstatemachine" + | "mediapdecoder" + | "mediasupervisor" + | "mediatimer" + | "mediatrackgrph" + | "memorypoller" + | "mozstorage" + | "mtransport" + | "netlink_monitor" + | "onnx_worker" + | "pacerthread" + | "permission" + | "playeventsound" + | "processhangmon" + | "profilerchild" + | "proxyresolution" + | "quotamanager_io" + | "registerfonts" + | "remotebackbuffer" + | "remotelzystream" + | "remvidchild" + | "renderer" + | "sandboxreporter" + | "savescripts" + | "socket_thread" + | "softwarevsyncthread" + | "sqldb_content-prefs_sqlite" + | "sqldb_cookies_sqlite" + | "sqldb_formhistory_sqlite" + | "ssl_cert" + | "startupcache" + | "streamtrans" + | "stylethread" + | "swcomposite" + | "taskcontroller" + | "timer" + | "toastbgthread" + | "trr_background" + | "untrusted_modules" + | "url_classifier" + | "videocapture" + | "vsynciothread" + | "webrtccallthread" + | "webrtcworker" + | "wifi_tickler" + | "wincompositor" + | "windowsvsyncthread" + | "winwindowocclusioncalc" + | "worker_launcher" + | "wrrenderbackend" + | "wrscenebuilder" + | "wrscenebuilderlp" + | "wrworker" + | "wrworkerlp", GleanCounter >; inferenceProcess: Record< - | 'androidui' - | 'asynclogger' - | 'audioipc' - | 'audioipc_callback_rpc' - | 'audioipc_client_callback' - | 'audioipc_client_rpc' - | 'audioipc_devicecollection_rpc' - | 'audioipc_server_callback' - | 'audioipc_server_rpc' - | 'backgroundthreadpool' - | 'bgiothreadpool' - | 'bgreadurls' - | 'bhmgr_monitor' - | 'bhmgr_processor' - | 'cameras_ipc' - | 'canvasrenderer' - | 'capturethread' - | 'classifier_update' - | 'com_mta' - | 'compositor' - | 'convolverworker' - | 'cookie' - | 'cubeboperation' - | 'datachannel_io' - | 'dns_resolver' - | 'dom_worker' - | 'dom_worklet' - | 'domcachethread' - | 'extensionprotocolhandler' - | 'font_loader' - | 'fontenumthread' - | 'fs_broker' - | 'geckomain' - | 'gmpthread' - | 'graphrunner' - | 'hrtfdatabaseldr' - | 'html5_parser' - | 'imagebridgechld' - | 'imageio' - | 'indexeddb' - | 'indexeddb_io' - | 'initfontlist' - | 'inotifyeventthread' - | 'ipc_i_o_child' - | 'ipc_i_o_parent' - | 'ipc_launch' - | 'ipdl_background' - | 'js_watchdog' - | 'jump_list' - | 'libwebrtcmodulethread' - | 'link_monitor' - | 'ls_thread' - | 'mdns_service' - | 'mediacache' - | 'mediadecoderstatemachine' - | 'mediapdecoder' - | 'mediasupervisor' - | 'mediatimer' - | 'mediatrackgrph' - | 'memorypoller' - | 'mozstorage' - | 'mtransport' - | 'netlink_monitor' - | 'onnx_worker' - | 'pacerthread' - | 'permission' - | 'playeventsound' - | 'processhangmon' - | 'profilerchild' - | 'proxyresolution' - | 'quotamanager_io' - | 'registerfonts' - | 'remotebackbuffer' - | 'remotelzystream' - | 'remvidchild' - | 'renderer' - | 'sandboxreporter' - | 'savescripts' - | 'socket_thread' - | 'softwarevsyncthread' - | 'sqldb_content-prefs_sqlite' - | 'sqldb_cookies_sqlite' - | 'sqldb_formhistory_sqlite' - | 'ssl_cert' - | 'startupcache' - | 'streamtrans' - | 'stylethread' - | 'swcomposite' - | 'taskcontroller' - | 'timer' - | 'toastbgthread' - | 'trr_background' - | 'untrusted_modules' - | 'url_classifier' - | 'videocapture' - | 'vsynciothread' - | 'webrtccallthread' - | 'webrtcworker' - | 'wifi_tickler' - | 'wincompositor' - | 'windowsvsyncthread' - | 'winwindowocclusioncalc' - | 'worker_launcher' - | 'wrrenderbackend' - | 'wrscenebuilder' - | 'wrscenebuilderlp' - | 'wrworker' - | 'wrworkerlp', + | "androidui" + | "asynclogger" + | "audioipc" + | "audioipc_callback_rpc" + | "audioipc_client_callback" + | "audioipc_client_rpc" + | "audioipc_devicecollection_rpc" + | "audioipc_server_callback" + | "audioipc_server_rpc" + | "backgroundthreadpool" + | "bgiothreadpool" + | "bgreadurls" + | "bhmgr_monitor" + | "bhmgr_processor" + | "cameras_ipc" + | "canvasrenderer" + | "capturethread" + | "classifier_update" + | "com_mta" + | "compositor" + | "convolverworker" + | "cookie" + | "cubeboperation" + | "datachannel_io" + | "dns_resolver" + | "dom_worker" + | "dom_worklet" + | "domcachethread" + | "extensionprotocolhandler" + | "font_loader" + | "fontenumthread" + | "fs_broker" + | "geckomain" + | "gmpthread" + | "graphrunner" + | "hrtfdatabaseldr" + | "html5_parser" + | "imagebridgechld" + | "imageio" + | "indexeddb" + | "indexeddb_io" + | "initfontlist" + | "inotifyeventthread" + | "ipc_i_o_child" + | "ipc_i_o_parent" + | "ipc_launch" + | "ipdl_background" + | "js_watchdog" + | "jump_list" + | "libwebrtcmodulethread" + | "link_monitor" + | "ls_thread" + | "mdns_service" + | "mediacache" + | "mediadecoderstatemachine" + | "mediapdecoder" + | "mediasupervisor" + | "mediatimer" + | "mediatrackgrph" + | "memorypoller" + | "mozstorage" + | "mtransport" + | "netlink_monitor" + | "onnx_worker" + | "pacerthread" + | "permission" + | "playeventsound" + | "processhangmon" + | "profilerchild" + | "proxyresolution" + | "quotamanager_io" + | "registerfonts" + | "remotebackbuffer" + | "remotelzystream" + | "remvidchild" + | "renderer" + | "sandboxreporter" + | "savescripts" + | "socket_thread" + | "softwarevsyncthread" + | "sqldb_content-prefs_sqlite" + | "sqldb_cookies_sqlite" + | "sqldb_formhistory_sqlite" + | "ssl_cert" + | "startupcache" + | "streamtrans" + | "stylethread" + | "swcomposite" + | "taskcontroller" + | "timer" + | "toastbgthread" + | "trr_background" + | "untrusted_modules" + | "url_classifier" + | "videocapture" + | "vsynciothread" + | "webrtccallthread" + | "webrtcworker" + | "wifi_tickler" + | "wincompositor" + | "windowsvsyncthread" + | "winwindowocclusioncalc" + | "worker_launcher" + | "wrrenderbackend" + | "wrscenebuilder" + | "wrscenebuilderlp" + | "wrworker" + | "wrworkerlp", GleanCounter >; parentActive: Record< - | 'androidui' - | 'asynclogger' - | 'audioipc' - | 'audioipc_callback_rpc' - | 'audioipc_client_callback' - | 'audioipc_client_rpc' - | 'audioipc_devicecollection_rpc' - | 'audioipc_server_callback' - | 'audioipc_server_rpc' - | 'backgroundthreadpool' - | 'bgiothreadpool' - | 'bgreadurls' - | 'bhmgr_monitor' - | 'bhmgr_processor' - | 'cameras_ipc' - | 'canvasrenderer' - | 'capturethread' - | 'classifier_update' - | 'com_mta' - | 'compositor' - | 'convolverworker' - | 'cookie' - | 'cubeboperation' - | 'datachannel_io' - | 'dns_resolver' - | 'dom_worker' - | 'dom_worklet' - | 'domcachethread' - | 'extensionprotocolhandler' - | 'font_loader' - | 'fontenumthread' - | 'fs_broker' - | 'geckomain' - | 'gmpthread' - | 'graphrunner' - | 'hrtfdatabaseldr' - | 'html5_parser' - | 'imagebridgechld' - | 'imageio' - | 'indexeddb' - | 'indexeddb_io' - | 'initfontlist' - | 'inotifyeventthread' - | 'ipc_i_o_child' - | 'ipc_i_o_parent' - | 'ipc_launch' - | 'ipdl_background' - | 'js_watchdog' - | 'jump_list' - | 'libwebrtcmodulethread' - | 'link_monitor' - | 'ls_thread' - | 'mdns_service' - | 'mediacache' - | 'mediadecoderstatemachine' - | 'mediapdecoder' - | 'mediasupervisor' - | 'mediatimer' - | 'mediatrackgrph' - | 'memorypoller' - | 'mozstorage' - | 'mtransport' - | 'netlink_monitor' - | 'onnx_worker' - | 'pacerthread' - | 'permission' - | 'playeventsound' - | 'processhangmon' - | 'profilerchild' - | 'proxyresolution' - | 'quotamanager_io' - | 'registerfonts' - | 'remotebackbuffer' - | 'remotelzystream' - | 'remvidchild' - | 'renderer' - | 'sandboxreporter' - | 'savescripts' - | 'socket_thread' - | 'softwarevsyncthread' - | 'sqldb_content-prefs_sqlite' - | 'sqldb_cookies_sqlite' - | 'sqldb_formhistory_sqlite' - | 'ssl_cert' - | 'startupcache' - | 'streamtrans' - | 'stylethread' - | 'swcomposite' - | 'taskcontroller' - | 'timer' - | 'toastbgthread' - | 'trr_background' - | 'untrusted_modules' - | 'url_classifier' - | 'videocapture' - | 'vsynciothread' - | 'webrtccallthread' - | 'webrtcworker' - | 'wifi_tickler' - | 'wincompositor' - | 'windowsvsyncthread' - | 'winwindowocclusioncalc' - | 'worker_launcher' - | 'wrrenderbackend' - | 'wrscenebuilder' - | 'wrscenebuilderlp' - | 'wrworker' - | 'wrworkerlp', + | "androidui" + | "asynclogger" + | "audioipc" + | "audioipc_callback_rpc" + | "audioipc_client_callback" + | "audioipc_client_rpc" + | "audioipc_devicecollection_rpc" + | "audioipc_server_callback" + | "audioipc_server_rpc" + | "backgroundthreadpool" + | "bgiothreadpool" + | "bgreadurls" + | "bhmgr_monitor" + | "bhmgr_processor" + | "cameras_ipc" + | "canvasrenderer" + | "capturethread" + | "classifier_update" + | "com_mta" + | "compositor" + | "convolverworker" + | "cookie" + | "cubeboperation" + | "datachannel_io" + | "dns_resolver" + | "dom_worker" + | "dom_worklet" + | "domcachethread" + | "extensionprotocolhandler" + | "font_loader" + | "fontenumthread" + | "fs_broker" + | "geckomain" + | "gmpthread" + | "graphrunner" + | "hrtfdatabaseldr" + | "html5_parser" + | "imagebridgechld" + | "imageio" + | "indexeddb" + | "indexeddb_io" + | "initfontlist" + | "inotifyeventthread" + | "ipc_i_o_child" + | "ipc_i_o_parent" + | "ipc_launch" + | "ipdl_background" + | "js_watchdog" + | "jump_list" + | "libwebrtcmodulethread" + | "link_monitor" + | "ls_thread" + | "mdns_service" + | "mediacache" + | "mediadecoderstatemachine" + | "mediapdecoder" + | "mediasupervisor" + | "mediatimer" + | "mediatrackgrph" + | "memorypoller" + | "mozstorage" + | "mtransport" + | "netlink_monitor" + | "onnx_worker" + | "pacerthread" + | "permission" + | "playeventsound" + | "processhangmon" + | "profilerchild" + | "proxyresolution" + | "quotamanager_io" + | "registerfonts" + | "remotebackbuffer" + | "remotelzystream" + | "remvidchild" + | "renderer" + | "sandboxreporter" + | "savescripts" + | "socket_thread" + | "softwarevsyncthread" + | "sqldb_content-prefs_sqlite" + | "sqldb_cookies_sqlite" + | "sqldb_formhistory_sqlite" + | "ssl_cert" + | "startupcache" + | "streamtrans" + | "stylethread" + | "swcomposite" + | "taskcontroller" + | "timer" + | "toastbgthread" + | "trr_background" + | "untrusted_modules" + | "url_classifier" + | "videocapture" + | "vsynciothread" + | "webrtccallthread" + | "webrtcworker" + | "wifi_tickler" + | "wincompositor" + | "windowsvsyncthread" + | "winwindowocclusioncalc" + | "worker_launcher" + | "wrrenderbackend" + | "wrscenebuilder" + | "wrscenebuilderlp" + | "wrworker" + | "wrworkerlp", GleanCounter >; parentInactive: Record< - | 'androidui' - | 'asynclogger' - | 'audioipc' - | 'audioipc_callback_rpc' - | 'audioipc_client_callback' - | 'audioipc_client_rpc' - | 'audioipc_devicecollection_rpc' - | 'audioipc_server_callback' - | 'audioipc_server_rpc' - | 'backgroundthreadpool' - | 'bgiothreadpool' - | 'bgreadurls' - | 'bhmgr_monitor' - | 'bhmgr_processor' - | 'cameras_ipc' - | 'canvasrenderer' - | 'capturethread' - | 'classifier_update' - | 'com_mta' - | 'compositor' - | 'convolverworker' - | 'cookie' - | 'cubeboperation' - | 'datachannel_io' - | 'dns_resolver' - | 'dom_worker' - | 'dom_worklet' - | 'domcachethread' - | 'extensionprotocolhandler' - | 'font_loader' - | 'fontenumthread' - | 'fs_broker' - | 'geckomain' - | 'gmpthread' - | 'graphrunner' - | 'hrtfdatabaseldr' - | 'html5_parser' - | 'imagebridgechld' - | 'imageio' - | 'indexeddb' - | 'indexeddb_io' - | 'initfontlist' - | 'inotifyeventthread' - | 'ipc_i_o_child' - | 'ipc_i_o_parent' - | 'ipc_launch' - | 'ipdl_background' - | 'js_watchdog' - | 'jump_list' - | 'libwebrtcmodulethread' - | 'link_monitor' - | 'ls_thread' - | 'mdns_service' - | 'mediacache' - | 'mediadecoderstatemachine' - | 'mediapdecoder' - | 'mediasupervisor' - | 'mediatimer' - | 'mediatrackgrph' - | 'memorypoller' - | 'mozstorage' - | 'mtransport' - | 'netlink_monitor' - | 'onnx_worker' - | 'pacerthread' - | 'permission' - | 'playeventsound' - | 'processhangmon' - | 'profilerchild' - | 'proxyresolution' - | 'quotamanager_io' - | 'registerfonts' - | 'remotebackbuffer' - | 'remotelzystream' - | 'remvidchild' - | 'renderer' - | 'sandboxreporter' - | 'savescripts' - | 'socket_thread' - | 'softwarevsyncthread' - | 'sqldb_content-prefs_sqlite' - | 'sqldb_cookies_sqlite' - | 'sqldb_formhistory_sqlite' - | 'ssl_cert' - | 'startupcache' - | 'streamtrans' - | 'stylethread' - | 'swcomposite' - | 'taskcontroller' - | 'timer' - | 'toastbgthread' - | 'trr_background' - | 'untrusted_modules' - | 'url_classifier' - | 'videocapture' - | 'vsynciothread' - | 'webrtccallthread' - | 'webrtcworker' - | 'wifi_tickler' - | 'wincompositor' - | 'windowsvsyncthread' - | 'winwindowocclusioncalc' - | 'worker_launcher' - | 'wrrenderbackend' - | 'wrscenebuilder' - | 'wrscenebuilderlp' - | 'wrworker' - | 'wrworkerlp', + | "androidui" + | "asynclogger" + | "audioipc" + | "audioipc_callback_rpc" + | "audioipc_client_callback" + | "audioipc_client_rpc" + | "audioipc_devicecollection_rpc" + | "audioipc_server_callback" + | "audioipc_server_rpc" + | "backgroundthreadpool" + | "bgiothreadpool" + | "bgreadurls" + | "bhmgr_monitor" + | "bhmgr_processor" + | "cameras_ipc" + | "canvasrenderer" + | "capturethread" + | "classifier_update" + | "com_mta" + | "compositor" + | "convolverworker" + | "cookie" + | "cubeboperation" + | "datachannel_io" + | "dns_resolver" + | "dom_worker" + | "dom_worklet" + | "domcachethread" + | "extensionprotocolhandler" + | "font_loader" + | "fontenumthread" + | "fs_broker" + | "geckomain" + | "gmpthread" + | "graphrunner" + | "hrtfdatabaseldr" + | "html5_parser" + | "imagebridgechld" + | "imageio" + | "indexeddb" + | "indexeddb_io" + | "initfontlist" + | "inotifyeventthread" + | "ipc_i_o_child" + | "ipc_i_o_parent" + | "ipc_launch" + | "ipdl_background" + | "js_watchdog" + | "jump_list" + | "libwebrtcmodulethread" + | "link_monitor" + | "ls_thread" + | "mdns_service" + | "mediacache" + | "mediadecoderstatemachine" + | "mediapdecoder" + | "mediasupervisor" + | "mediatimer" + | "mediatrackgrph" + | "memorypoller" + | "mozstorage" + | "mtransport" + | "netlink_monitor" + | "onnx_worker" + | "pacerthread" + | "permission" + | "playeventsound" + | "processhangmon" + | "profilerchild" + | "proxyresolution" + | "quotamanager_io" + | "registerfonts" + | "remotebackbuffer" + | "remotelzystream" + | "remvidchild" + | "renderer" + | "sandboxreporter" + | "savescripts" + | "socket_thread" + | "softwarevsyncthread" + | "sqldb_content-prefs_sqlite" + | "sqldb_cookies_sqlite" + | "sqldb_formhistory_sqlite" + | "ssl_cert" + | "startupcache" + | "streamtrans" + | "stylethread" + | "swcomposite" + | "taskcontroller" + | "timer" + | "toastbgthread" + | "trr_background" + | "untrusted_modules" + | "url_classifier" + | "videocapture" + | "vsynciothread" + | "webrtccallthread" + | "webrtcworker" + | "wifi_tickler" + | "wincompositor" + | "windowsvsyncthread" + | "winwindowocclusioncalc" + | "worker_launcher" + | "wrrenderbackend" + | "wrscenebuilder" + | "wrscenebuilderlp" + | "wrworker" + | "wrworkerlp", GleanCounter >; }; @@ -12350,76 +12350,76 @@ interface GleanImpl { }; applicationReputation: { - binaryArchive: Record<'DmgFile' | 'OtherBinaryFile' | 'RarFile' | 'ZipFile', GleanCounter>; + binaryArchive: Record<"DmgFile" | "OtherBinaryFile" | "RarFile" | "ZipFile", GleanCounter>; binaryType: Record< - 'BinaryFile' | 'MissingFilename' | 'MozNonBinaryFile' | 'NonBinaryFile' | 'UnknownFile', + "BinaryFile" | "MissingFilename" | "MozNonBinaryFile" | "NonBinaryFile" | "UnknownFile", GleanCounter >; local: GleanCustomDistribution; reason: Record< - | 'DPDisabled' - | 'DangerousHostPrefOff' - | 'DangerousPrefOff' - | 'InternalError' - | 'LocalBlocklist' - | 'LocalWhitelist' - | 'NetworkError' - | 'NonBinaryFile' - | 'NotSet' - | 'RemoteLookupDisabled' - | 'UncommonPrefOff' - | 'UnwantedPrefOff' - | 'VerdictDangerous' - | 'VerdictDangerousHost' - | 'VerdictSafe' - | 'VerdictUncommon' - | 'VerdictUnknown' - | 'VerdictUnrecognized' - | 'VerdictUnwanted', + | "DPDisabled" + | "DangerousHostPrefOff" + | "DangerousPrefOff" + | "InternalError" + | "LocalBlocklist" + | "LocalWhitelist" + | "NetworkError" + | "NonBinaryFile" + | "NotSet" + | "RemoteLookupDisabled" + | "UncommonPrefOff" + | "UnwantedPrefOff" + | "VerdictDangerous" + | "VerdictDangerousHost" + | "VerdictSafe" + | "VerdictUncommon" + | "VerdictUnknown" + | "VerdictUnrecognized" + | "VerdictUnwanted", GleanCounter >; remoteLookupResponseTime: GleanTimingDistribution; - remoteLookupTimeout: Record<'false' | 'true', GleanCounter>; + remoteLookupTimeout: Record<"false" | "true", GleanCounter>; server: GleanCustomDistribution; server2: Record< - | 'ErrAlreadyConnected' - | 'ErrConnectionRefused' - | 'ErrDNSLookupQueue' - | 'ErrNetInadequate' - | 'ErrNetInterrupt' - | 'ErrNetPartial' - | 'ErrNetReset' - | 'ErrNetTimeout' - | 'ErrNotConnected' - | 'ErrOffline' - | 'ErrOthers' - | 'ErrPortAccess' - | 'ErrProxyConnection' - | 'ErrUnknownHost' - | 'ErrUnknownProxyHost' - | 'FailGetChannel' - | 'FailGetResponse' - | 'HTTP1xx' - | 'HTTP204' - | 'HTTP2xx' - | 'HTTP3xx' - | 'HTTP400' - | 'HTTP403' - | 'HTTP404' - | 'HTTP408' - | 'HTTP413' - | 'HTTP4xx' - | 'HTTP502_504_511' - | 'HTTP503' - | 'HTTP505' - | 'HTTP5xx' - | 'HTTPOthers' - | 'ResponseValid', + | "ErrAlreadyConnected" + | "ErrConnectionRefused" + | "ErrDNSLookupQueue" + | "ErrNetInadequate" + | "ErrNetInterrupt" + | "ErrNetPartial" + | "ErrNetReset" + | "ErrNetTimeout" + | "ErrNotConnected" + | "ErrOffline" + | "ErrOthers" + | "ErrPortAccess" + | "ErrProxyConnection" + | "ErrUnknownHost" + | "ErrUnknownProxyHost" + | "FailGetChannel" + | "FailGetResponse" + | "HTTP1xx" + | "HTTP204" + | "HTTP2xx" + | "HTTP3xx" + | "HTTP400" + | "HTTP403" + | "HTTP404" + | "HTTP408" + | "HTTP413" + | "HTTP4xx" + | "HTTP502_504_511" + | "HTTP503" + | "HTTP505" + | "HTTP5xx" + | "HTTPOthers" + | "ResponseValid", GleanCounter >; serverVerdict: GleanCustomDistribution; serverVerdict2: GleanDualLabeledCounter; - shouldBlock: Record<'false' | 'true', GleanCounter>; + shouldBlock: Record<"false" | "true", GleanCounter>; }; characteristics: { @@ -12745,12 +12745,12 @@ interface GleanImpl { searchService: { initializationStatus: Record< - | 'failedFetchEngines' - | 'failedLoadEngines' - | 'failedLoadSettingsAddonManager' - | 'failedSettings' - | 'settingsCorrupt' - | 'success', + | "failedFetchEngines" + | "failedLoadEngines" + | "failedLoadSettingsAddonManager" + | "failedSettings" + | "settingsCorrupt" + | "success", GleanCounter >; startupTime: GleanTimingDistribution; @@ -12783,8 +12783,8 @@ interface GleanImpl { }; startupIo: { - read: Record<'sessionRestore' | 'windowVisible', GleanQuantity>; - write: Record<'sessionRestore' | 'windowVisible', GleanQuantity>; + read: Record<"sessionRestore" | "windowVisible", GleanQuantity>; + write: Record<"sessionRestore" | "windowVisible", GleanQuantity>; }; telemetry: { @@ -12803,13 +12803,13 @@ interface GleanImpl { discardedArchivedPingsSize: GleanMemoryDistribution; discardedPendingPingsSize: GleanMemoryDistribution; discardedSendPingsSize: GleanMemoryDistribution; - eventPingSent: Record<'max' | 'periodic' | 'shutdown', GleanCounter>; + eventPingSent: Record<"max" | "periodic" | "shutdown", GleanCounter>; eventRecordingError: Record< - 'Expired' | 'Extra' | 'ExtraKey' | 'UnknownEvent' | 'Value', + "Expired" | "Extra" | "ExtraKey" | "UnknownEvent" | "Value", GleanCounter >; eventRegistrationError: Record< - 'Category' | 'ExtraKeys' | 'Method' | 'Name' | 'Object' | 'Other', + "Category" | "ExtraKeys" | "Method" | "Name" | "Object" | "Other", GleanCounter >; invalidPayloadSubmitted: GleanCounter; @@ -12828,21 +12828,21 @@ interface GleanImpl { pingSubmissionWaitingClientid: GleanCounter; sendFailure: GleanTimingDistribution; sendFailureType: Record< - | 'abort' - | 'eChannelOpen' - | 'eOK' - | 'eRedirect' - | 'eRequest' - | 'eTerminated' - | 'eTooLate' - | 'eUnreachable' - | 'timeout', + | "abort" + | "eChannelOpen" + | "eOK" + | "eRedirect" + | "eRequest" + | "eTerminated" + | "eTooLate" + | "eUnreachable" + | "timeout", GleanCounter >; sendFailureTypePerPing: GleanDualLabeledCounter; sendSuccess: GleanTimingDistribution; stringify: GleanTimingDistribution; - success: Record<'false' | 'true', GleanCounter>; + success: Record<"false" | "true", GleanCounter>; }; termsofuse: { @@ -12911,7 +12911,7 @@ interface GleanImpl { lang_tags_match?: string; total_time?: string; }>; - requestCount: Record<'full_page' | 'select', GleanCounter>; + requestCount: Record<"full_page" | "select", GleanCounter>; restorePage: GleanEventWithExtras<{ flow_id?: string }>; translationRequest: GleanEventWithExtras<{ auto_translate?: string; @@ -13023,67 +13023,67 @@ interface GleanImpl { completion: GleanEventWithExtras<{ hit?: string; table_name?: string }>; completionError: GleanCustomDistribution; lookupHit: Record< - | 'ads-track-digest256' - | 'analytics-track-digest256' - | 'anti-fraud-track-digest256' - | 'base-cryptomining-track-digest256' - | 'base-email-track-digest256' - | 'base-fingerprinting-track-digest256' - | 'base-track-digest256' - | 'consent-manager-track-digest256' - | 'content-cryptomining-track-digest256' - | 'content-email-track-digest256' - | 'content-fingerprinting-track-digest256' - | 'content-track-digest256' - | 'goog-badbinurl-proto' - | 'goog-downloadwhite-proto' - | 'goog-harmful-proto' - | 'goog-malware-proto' - | 'goog-phish-proto' - | 'goog-unwanted-proto' - | 'google-trackwhite-digest256' - | 'googpub-phish-proto' - | 'mozplugin-block-digest256' - | 'mozstd-trackwhite-digest256' - | 'social-track-digest256' - | 'social-tracking-protection-digest256' - | 'social-tracking-protection-facebook-digest256' - | 'social-tracking-protection-linkedin-digest256' - | 'social-tracking-protection-twitter-digest256' - | 'test-malware-simple' - | 'test-unwanted-simple', + | "ads-track-digest256" + | "analytics-track-digest256" + | "anti-fraud-track-digest256" + | "base-cryptomining-track-digest256" + | "base-email-track-digest256" + | "base-fingerprinting-track-digest256" + | "base-track-digest256" + | "consent-manager-track-digest256" + | "content-cryptomining-track-digest256" + | "content-email-track-digest256" + | "content-fingerprinting-track-digest256" + | "content-track-digest256" + | "goog-badbinurl-proto" + | "goog-downloadwhite-proto" + | "goog-harmful-proto" + | "goog-malware-proto" + | "goog-phish-proto" + | "goog-unwanted-proto" + | "google-trackwhite-digest256" + | "googpub-phish-proto" + | "mozplugin-block-digest256" + | "mozstd-trackwhite-digest256" + | "social-track-digest256" + | "social-tracking-protection-digest256" + | "social-tracking-protection-facebook-digest256" + | "social-tracking-protection-linkedin-digest256" + | "social-tracking-protection-twitter-digest256" + | "test-malware-simple" + | "test-unwanted-simple", GleanCounter >; lookupMiss: Record< - | 'ads-track-digest256' - | 'analytics-track-digest256' - | 'anti-fraud-track-digest256' - | 'base-cryptomining-track-digest256' - | 'base-email-track-digest256' - | 'base-fingerprinting-track-digest256' - | 'base-track-digest256' - | 'consent-manager-track-digest256' - | 'content-cryptomining-track-digest256' - | 'content-email-track-digest256' - | 'content-fingerprinting-track-digest256' - | 'content-track-digest256' - | 'goog-badbinurl-proto' - | 'goog-downloadwhite-proto' - | 'goog-harmful-proto' - | 'goog-malware-proto' - | 'goog-phish-proto' - | 'goog-unwanted-proto' - | 'google-trackwhite-digest256' - | 'googpub-phish-proto' - | 'mozplugin-block-digest256' - | 'mozstd-trackwhite-digest256' - | 'social-track-digest256' - | 'social-tracking-protection-digest256' - | 'social-tracking-protection-facebook-digest256' - | 'social-tracking-protection-linkedin-digest256' - | 'social-tracking-protection-twitter-digest256' - | 'test-malware-simple' - | 'test-unwanted-simple', + | "ads-track-digest256" + | "analytics-track-digest256" + | "anti-fraud-track-digest256" + | "base-cryptomining-track-digest256" + | "base-email-track-digest256" + | "base-fingerprinting-track-digest256" + | "base-track-digest256" + | "consent-manager-track-digest256" + | "content-cryptomining-track-digest256" + | "content-email-track-digest256" + | "content-fingerprinting-track-digest256" + | "content-track-digest256" + | "goog-badbinurl-proto" + | "goog-downloadwhite-proto" + | "goog-harmful-proto" + | "goog-malware-proto" + | "goog-phish-proto" + | "goog-unwanted-proto" + | "google-trackwhite-digest256" + | "googpub-phish-proto" + | "mozplugin-block-digest256" + | "mozstd-trackwhite-digest256" + | "social-track-digest256" + | "social-tracking-protection-digest256" + | "social-tracking-protection-facebook-digest256" + | "social-tracking-protection-linkedin-digest256" + | "social-tracking-protection-twitter-digest256" + | "test-malware-simple" + | "test-unwanted-simple", GleanCounter >; lookupTime2: GleanTimingDistribution; @@ -13099,7 +13099,7 @@ interface GleanImpl { vlpsConstructTime: GleanTimingDistribution; vlpsFallocateTime: GleanTimingDistribution; vlpsFileloadTime: GleanTimingDistribution; - vlpsMetadataCorrupt: Record<'false' | 'true', GleanCounter>; + vlpsMetadataCorrupt: Record<"false" | "true", GleanCounter>; }; findbar: { @@ -13230,7 +13230,7 @@ interface GleanImpl { fetchTime: GleanTimingDistribution; homeRegion: GleanString; storeRegionResult: Record< - 'ignoredUnitedStatesIncorrectTimezone' | 'setForRestOfWorld' | 'setForUnitedStates', + "ignoredUnitedStatesIncorrectTimezone" | "setForRestOfWorld" | "setForUnitedStates", GleanCounter >; }; @@ -13333,13 +13333,13 @@ interface GleanImpl { }>; reportSuspiciousSite: GleanEventWithExtras<{ suspicious_site?: string }>; startupTimeline: Record< - | 'AMI_startup_begin' - | 'AMI_startup_end' - | 'XPI_bootstrap_addons_begin' - | 'XPI_bootstrap_addons_end' - | 'XPI_finalUIStartup' - | 'XPI_startup_begin' - | 'XPI_startup_end', + | "AMI_startup_begin" + | "AMI_startup_end" + | "XPI_bootstrap_addons_begin" + | "XPI_bootstrap_addons_end" + | "XPI_finalUIStartup" + | "XPI_startup_begin" + | "XPI_startup_end", GleanQuantity >; update: GleanEventWithExtras<{ @@ -13875,7 +13875,7 @@ interface GleanImpl { lateStack: GleanText; parses: GleanTimingDistribution; rebuilds: Record< - 'XPIDB_rebuildBadJSON_MS' | 'XPIDB_rebuildReadFailed_MS' | 'XPIDB_rebuildUnreadableDB_MS', + "XPIDB_rebuildBadJSON_MS" | "XPIDB_rebuildReadFailed_MS" | "XPIDB_rebuildUnreadableDB_MS", GleanTimingDistribution >; startupError: GleanString; @@ -13896,30 +13896,30 @@ interface GleanImpl { bitsResultComplete: GleanCustomDistribution; bitsResultPartial: GleanCustomDistribution; canUseBitsExternal: Record< - | 'CanUseBits' - | 'NoBits_FeatureOff' - | 'NoBits_NotWindows' - | 'NoBits_OtherUser' - | 'NoBits_Pref' - | 'NoBits_Proxy', + | "CanUseBits" + | "NoBits_FeatureOff" + | "NoBits_NotWindows" + | "NoBits_OtherUser" + | "NoBits_Pref" + | "NoBits_Proxy", GleanCounter >; canUseBitsNotify: Record< - | 'CanUseBits' - | 'NoBits_FeatureOff' - | 'NoBits_NotWindows' - | 'NoBits_OtherUser' - | 'NoBits_Pref' - | 'NoBits_Proxy', + | "CanUseBits" + | "NoBits_FeatureOff" + | "NoBits_NotWindows" + | "NoBits_OtherUser" + | "NoBits_Pref" + | "NoBits_Proxy", GleanCounter >; canUseBitsSubsequent: Record< - | 'CanUseBits' - | 'NoBits_FeatureOff' - | 'NoBits_NotWindows' - | 'NoBits_OtherUser' - | 'NoBits_Pref' - | 'NoBits_Proxy', + | "CanUseBits" + | "NoBits_FeatureOff" + | "NoBits_NotWindows" + | "NoBits_OtherUser" + | "NoBits_Pref" + | "NoBits_Proxy", GleanCounter >; cannotStageExternal: GleanCounter; @@ -13954,23 +13954,23 @@ interface GleanImpl { notPrefUpdateStagingEnabledNotify: GleanCounter; notPrefUpdateStagingEnabledSubsequent: GleanCounter; notificationBadgeShown: Record< - 'available' | 'manual' | 'otherinstance' | 'restart' | 'unsupported', + "available" | "manual" | "otherinstance" | "restart" | "unsupported", GleanCounter >; notificationDismissed: Record< - 'available' | 'manual' | 'otherinstance' | 'restart' | 'unsupported', + "available" | "manual" | "otherinstance" | "restart" | "unsupported", GleanCounter >; notificationMainActionDoorhanger: Record< - 'available' | 'manual' | 'otherinstance' | 'restart' | 'unsupported', + "available" | "manual" | "otherinstance" | "restart" | "unsupported", GleanCounter >; notificationMainActionMenu: Record< - 'available' | 'manual' | 'otherinstance' | 'restart' | 'unsupported', + "available" | "manual" | "otherinstance" | "restart" | "unsupported", GleanCounter >; notificationShown: Record< - 'available' | 'manual' | 'otherinstance' | 'restart' | 'unsupported', + "available" | "manual" | "otherinstance" | "restart" | "unsupported", GleanCounter >; pingCountExternal: GleanCounter; @@ -13985,9 +13985,9 @@ interface GleanImpl { previousBuildId: GleanString; previousChannel: GleanString; previousVersion: GleanString; - serviceInstalledExternal: Record<'false' | 'true', GleanCounter>; - serviceInstalledNotify: Record<'false' | 'true', GleanCounter>; - serviceInstalledSubsequent: Record<'false' | 'true', GleanCounter>; + serviceInstalledExternal: Record<"false" | "true", GleanCounter>; + serviceInstalledNotify: Record<"false" | "true", GleanCounter>; + serviceInstalledSubsequent: Record<"false" | "true", GleanCounter>; serviceManuallyUninstalledExternal: GleanCounter; serviceManuallyUninstalledNotify: GleanCounter; serviceManuallyUninstalledSubsequent: GleanCounter; @@ -14061,10 +14061,10 @@ interface GleanImpl { imeNameOnLinux: Record; darkMode: GleanBoolean; notifyIdle: GleanTimingDistribution; - pointingDevices: Record<'mouse' | 'pen' | 'touch', GleanBoolean>; + pointingDevices: Record<"mouse" | "pen" | "touch", GleanBoolean>; imeNameOnWindows: Record; imeNameOnWindowsInsertedCrlf: Record; - touchEnabledDevice: Record<'false' | 'true', GleanCounter>; + touchEnabledDevice: Record<"false" | "true", GleanCounter>; }; gfxFeatures: { @@ -14088,19 +14088,19 @@ interface GleanImpl { asyncSnowWhiteFreeing: GleanTimingDistribution; collected: GleanCustomDistribution; deferredFinalizeAsync: GleanTimingDistribution; - finishIgc: Record<'false' | 'true', GleanCounter>; + finishIgc: Record<"false" | "true", GleanCounter>; forgetSkippableMax: GleanTimingDistribution; full: GleanTimingDistribution; maxPause: GleanTimingDistribution; - needGc: Record<'false' | 'true', GleanCounter>; + needGc: Record<"false" | "true", GleanCounter>; sliceDuringIdle: GleanCustomDistribution; - syncSkippable: Record<'false' | 'true', GleanCounter>; + syncSkippable: Record<"false" | "true", GleanCounter>; time: GleanTimingDistribution; timeBetween: GleanTimingDistribution; visitedGced: GleanCustomDistribution; visitedRefCounted: GleanCustomDistribution; workerCollected: GleanCustomDistribution; - workerNeedGc: Record<'false' | 'true', GleanCounter>; + workerNeedGc: Record<"false" | "true", GleanCounter>; workerTime: GleanTimingDistribution; workerVisitedGced: GleanCustomDistribution; workerVisitedRefCounted: GleanCustomDistribution; @@ -14166,33 +14166,33 @@ interface GleanImpl { interface GleanPingsImpl { messagingSystem: GleanPingNoReason; - newtab: GleanPingWithReason<'component_init' | 'newtab_session_end'>; - newtabContent: GleanPingWithReason<'component_init' | 'newtab_session_end'>; - spoc: GleanPingWithReason<'click' | 'impression' | 'save'>; + newtab: GleanPingWithReason<"component_init" | "newtab_session_end">; + newtabContent: GleanPingWithReason<"component_init" | "newtab_session_end">; + spoc: GleanPingWithReason<"click" | "impression" | "save">; topSites: GleanPingNoReason; profiles: GleanPingNoReason; searchWith: GleanPingNoReason; - serpCategorization: GleanPingWithReason<'inactivity' | 'startup' | 'threshold_reached'>; + serpCategorization: GleanPingWithReason<"inactivity" | "startup" | "threshold_reached">; quickSuggest: GleanPingNoReason; quickSuggestDeletionRequest: GleanPingNoReason; urlbarKeywordExposure: GleanPingNoReason; dataLeakBlocker: GleanPingNoReason; contextIdDeletionRequest: GleanPingNoReason; prototypeNoCodeEvents: GleanPingNoReason; - pageload: GleanPingWithReason<'startup' | 'threshold'>; - pageloadBaseDomain: GleanPingWithReason<'pageload'>; - useCounters: GleanPingWithReason<'app_shutdown_confirmed' | 'idle_startup'>; + pageload: GleanPingWithReason<"startup" | "threshold">; + pageloadBaseDomain: GleanPingWithReason<"pageload">; + useCounters: GleanPingWithReason<"app_shutdown_confirmed" | "idle_startup">; unexpectedScriptLoad: GleanPingNoReason; - fxAccounts: GleanPingWithReason<'active' | 'dirty_startup' | 'inactive'>; - sync: GleanPingWithReason<'idchanged' | 'schedule' | 'shutdown'>; + fxAccounts: GleanPingWithReason<"active" | "dirty_startup" | "inactive">; + sync: GleanPingWithReason<"idchanged" | "schedule" | "shutdown">; bounceTrackingProtection: GleanPingNoReason; hangReport: GleanPingNoReason; backgroundTasks: GleanPingNoReason; captchaDetection: GleanPingNoReason; - crash: GleanPingWithReason<'crash' | 'event_found'>; - geckoTrace: GleanPingWithReason<'buffer_full' | 'idle' | 'shutdown'>; - dauReporting: GleanPingWithReason<'active' | 'dirty_startup' | 'inactive'>; - tempFogInitialState: GleanPingWithReason<'startup'>; + crash: GleanPingWithReason<"crash" | "event_found">; + geckoTrace: GleanPingWithReason<"buffer_full" | "idle" | "shutdown">; + dauReporting: GleanPingWithReason<"active" | "dirty_startup" | "inactive">; + tempFogInitialState: GleanPingWithReason<"startup">; collectionDisabledPing: GleanPingNoReason; disabledPing: GleanPingNoReason; onePingOnly: GleanPingNoReason; @@ -14203,18 +14203,18 @@ interface GleanPingsImpl { nimbusTargetingContext: GleanPingNoReason; brokenSiteReport: GleanPingNoReason; userCharacteristics: GleanPingNoReason; - onboardingOptOut: GleanPingWithReason<'set_upload_enabled'>; + onboardingOptOut: GleanPingWithReason<"set_upload_enabled">; thirdPartyModules: GleanPingNoReason; - usageDeletionRequest: GleanPingWithReason<'set_upload_enabled'>; - usageReporting: GleanPingWithReason<'active' | 'dirty_startup' | 'inactive'>; + usageDeletionRequest: GleanPingWithReason<"set_upload_enabled">; + usageReporting: GleanPingWithReason<"active" | "dirty_startup" | "inactive">; firstStartup: GleanPingNoReason; - defaultAgent: GleanPingWithReason<'daily_ping'>; - backgroundUpdate: GleanPingWithReason<'backgroundupdate_task'>; - update: GleanPingWithReason<'ready' | 'success'>; + defaultAgent: GleanPingWithReason<"daily_ping">; + backgroundUpdate: GleanPingWithReason<"backgroundupdate_task">; + update: GleanPingWithReason<"ready" | "success">; } -type GleanEventNoExtras = Omit & { record(_?: never) }; -type GleanEventWithExtras = Omit & { record(extras: T) }; +type GleanEventNoExtras = Omit & { record(_?: never) }; +type GleanEventWithExtras = Omit & { record(extras: T) }; -type GleanPingNoReason = Omit & { submit(_?: never) }; -type GleanPingWithReason = Omit & { submit(reason: T) }; +type GleanPingNoReason = Omit & { submit(_?: never) }; +type GleanPingWithReason = Omit & { submit(reason: T) }; diff --git a/src/zen/@types/lib.gecko.modules.d.ts b/src/zen/@types/lib.gecko.modules.d.ts index 948968db9..181150aec 100644 --- a/src/zen/@types/lib.gecko.modules.d.ts +++ b/src/zen/@types/lib.gecko.modules.d.ts @@ -7,1287 +7,1287 @@ */ export interface Modules { - 'chrome://browser/content/aboutlogins/aboutLoginsUtils.mjs': typeof import('chrome://browser/content/aboutlogins/aboutLoginsUtils.mjs'); - 'chrome://browser/content/asrouter/components/fxa-menu-message.mjs': typeof import('chrome://browser/content/asrouter/components/fxa-menu-message.mjs'); - 'chrome://browser/content/backup/backup-constants.mjs': typeof import('chrome://browser/content/backup/backup-constants.mjs'); - 'chrome://browser/content/genai/content/link-preview-card-onboarding.mjs': typeof import('chrome://browser/content/genai/content/link-preview-card-onboarding.mjs'); - 'chrome://browser/content/genai/content/link-preview-card.mjs': typeof import('chrome://browser/content/genai/content/link-preview-card.mjs'); - 'chrome://browser/content/genai/content/model-optin.mjs': typeof import('chrome://browser/content/genai/content/model-optin.mjs'); - 'chrome://browser/content/ipprotection/ipprotection-constants.mjs': typeof import('chrome://browser/content/ipprotection/ipprotection-constants.mjs'); - 'chrome://browser/content/migration/migration-wizard-constants.mjs': typeof import('chrome://browser/content/migration/migration-wizard-constants.mjs'); - 'chrome://browser/content/nsContextMenu.sys.mjs': typeof import('chrome://browser/content/nsContextMenu.sys.mjs'); - 'chrome://browser/content/screenshots/fileHelpers.mjs': typeof import('chrome://browser/content/screenshots/fileHelpers.mjs'); - 'chrome://browser/content/sidebar/sidebar-main.mjs': typeof import('chrome://browser/content/sidebar/sidebar-main.mjs'); - 'chrome://browser/content/sidebar/sidebar-panel-header.mjs': typeof import('chrome://browser/content/sidebar/sidebar-panel-header.mjs'); - 'chrome://browser/content/tabbrowser/tab-hover-preview.mjs': typeof import('chrome://browser/content/tabbrowser/tab-hover-preview.mjs'); - 'chrome://browser/content/translations/TranslationsPanelShared.sys.mjs': typeof import('chrome://browser/content/translations/TranslationsPanelShared.sys.mjs'); - 'chrome://browser/content/webrtc/webrtc-preview.mjs': typeof import('chrome://browser/content/webrtc/webrtc-preview.mjs'); - 'chrome://devtools-startup/content/DevToolsShim.sys.mjs': typeof import('chrome://devtools-startup/content/DevToolsShim.sys.mjs'); - 'chrome://formautofill/content/manageDialog.mjs': typeof import('chrome://formautofill/content/manageDialog.mjs'); - 'chrome://global/content/aboutLogging/profileStorage.mjs': typeof import('chrome://global/content/aboutLogging/profileStorage.mjs'); - 'chrome://global/content/certviewer/certDecoder.mjs': typeof import('chrome://global/content/certviewer/certDecoder.mjs'); - 'chrome://global/content/elements/browser-custom-element.mjs': typeof import('chrome://global/content/elements/browser-custom-element.mjs'); - 'chrome://global/content/ml/BlockWords.sys.mjs': typeof import('chrome://global/content/ml/BlockWords.sys.mjs'); - 'chrome://global/content/ml/ClusterAlgos.sys.mjs': typeof import('chrome://global/content/ml/ClusterAlgos.sys.mjs'); - 'chrome://global/content/ml/EmbeddingsGenerator.sys.mjs': typeof import('chrome://global/content/ml/EmbeddingsGenerator.sys.mjs'); - 'chrome://global/content/ml/EngineProcess.sys.mjs': typeof import('chrome://global/content/ml/EngineProcess.sys.mjs'); - 'chrome://global/content/ml/ModelHub.sys.mjs': typeof import('chrome://global/content/ml/ModelHub.sys.mjs'); - 'chrome://global/content/ml/NLPUtils.sys.mjs': typeof import('chrome://global/content/ml/NLPUtils.sys.mjs'); - 'chrome://global/content/ml/OPFS.sys.mjs': typeof import('chrome://global/content/ml/OPFS.sys.mjs'); - 'chrome://global/content/ml/StopWords.sys.mjs': typeof import('chrome://global/content/ml/StopWords.sys.mjs'); - 'chrome://global/content/ml/Utils.sys.mjs': typeof import('chrome://global/content/ml/Utils.sys.mjs'); - 'chrome://global/content/ml/backends/LlamaCppPipeline.mjs': typeof import('chrome://global/content/ml/backends/LlamaCppPipeline.mjs'); - 'chrome://global/content/ml/backends/LlamaPipeline.mjs': typeof import('chrome://global/content/ml/backends/LlamaPipeline.mjs'); - 'chrome://global/content/ml/backends/ONNXPipeline.mjs': typeof import('chrome://global/content/ml/backends/ONNXPipeline.mjs'); - 'chrome://global/content/ml/backends/OpenAIPipeline.mjs': typeof import('chrome://global/content/ml/backends/OpenAIPipeline.mjs'); - 'chrome://global/content/ml/backends/Pipeline.mjs': typeof import('chrome://global/content/ml/backends/Pipeline.mjs'); - 'chrome://global/content/ml/backends/StaticEmbeddingsPipeline.mjs': typeof import('chrome://global/content/ml/backends/StaticEmbeddingsPipeline.mjs'); - 'chrome://global/content/preferences/Preferences.mjs': typeof import('chrome://global/content/preferences/Preferences.mjs'); - 'chrome://global/content/translations/TranslationsTelemetry.sys.mjs': typeof import('chrome://global/content/translations/TranslationsTelemetry.sys.mjs'); - 'chrome://global/content/translations/TranslationsUtils.mjs': typeof import('chrome://global/content/translations/TranslationsUtils.mjs'); - 'chrome://global/content/translations/translations-document.sys.mjs': typeof import('chrome://global/content/translations/translations-document.sys.mjs'); - 'chrome://global/content/translations/translations-engine.sys.mjs': typeof import('chrome://global/content/translations/translations-engine.sys.mjs'); - 'chrome://mochikit/content/ShutdownLeaksCollector.sys.mjs': typeof import('chrome://mochikit/content/ShutdownLeaksCollector.sys.mjs'); - 'chrome://mochikit/content/tests/SimpleTest/DragSourceChildContext.sys.mjs': typeof import('chrome://mochikit/content/tests/SimpleTest/DragSourceChildContext.sys.mjs'); - 'chrome://mochikit/content/tests/SimpleTest/DragSourceParentContext.sys.mjs': typeof import('chrome://mochikit/content/tests/SimpleTest/DragSourceParentContext.sys.mjs'); - 'chrome://mochikit/content/tests/SimpleTest/DragTargetChildContext.sys.mjs': typeof import('chrome://mochikit/content/tests/SimpleTest/DragTargetChildContext.sys.mjs'); - 'chrome://mochikit/content/tests/SimpleTest/DragTargetParentContext.sys.mjs': typeof import('chrome://mochikit/content/tests/SimpleTest/DragTargetParentContext.sys.mjs'); - 'chrome://mochitests/content/browser/accessible/tests/browser/Common.sys.mjs': typeof import('chrome://mochitests/content/browser/accessible/tests/browser/Common.sys.mjs'); - 'chrome://mochitests/content/browser/accessible/tests/browser/Layout.sys.mjs': typeof import('chrome://mochitests/content/browser/accessible/tests/browser/Layout.sys.mjs'); - 'chrome://mochitests/content/browser/devtools/client/debugger/test/mochitest/examples/worker-esm-dep.mjs': typeof import('chrome://mochitests/content/browser/devtools/client/debugger/test/mochitest/examples/worker-esm-dep.mjs'); - 'chrome://mochitests/content/browser/devtools/shared/test-helpers/trace-objects.sys.mjs': typeof import('chrome://mochitests/content/browser/devtools/shared/test-helpers/trace-objects.sys.mjs'); - 'chrome://mochitests/content/browser/js/xpconnect/tests/browser/worker_source.mjs': typeof import('chrome://mochitests/content/browser/js/xpconnect/tests/browser/worker_source.mjs'); - 'chrome://mochitests/content/browser/remote/shared/messagehandler/test/browser/resources/modules/ModuleRegistry.sys.mjs': typeof import('chrome://mochitests/content/browser/remote/shared/messagehandler/test/browser/resources/modules/ModuleRegistry.sys.mjs'); - 'chrome://mochitests/content/browser/toolkit/components/translations/tests/browser/translations-test.mjs': typeof import('chrome://mochitests/content/browser/toolkit/components/translations/tests/browser/translations-test.mjs'); - 'chrome://mochitests/content/chrome/dom/network/tests/tcpsocket_test.sys.mjs': typeof import('chrome://mochitests/content/chrome/dom/network/tests/tcpsocket_test.sys.mjs'); - 'chrome://mochitests/content/chrome/dom/url/tests/file_worker_url.sys.mjs': typeof import('chrome://mochitests/content/chrome/dom/url/tests/file_worker_url.sys.mjs'); - 'chrome://mochitests/content/chrome/dom/url/tests/test_bug883784.sys.mjs': typeof import('chrome://mochitests/content/chrome/dom/url/tests/test_bug883784.sys.mjs'); - 'chrome://mochitests/content/chrome/dom/workers/test/WorkerTest.sys.mjs': typeof import('chrome://mochitests/content/chrome/dom/workers/test/WorkerTest.sys.mjs'); - 'chrome://remote/content/components/Marionette.sys.mjs': typeof import('chrome://remote/content/components/Marionette.sys.mjs'); - 'chrome://remote/content/components/RemoteAgent.sys.mjs': typeof import('chrome://remote/content/components/RemoteAgent.sys.mjs'); - 'chrome://remote/content/marionette/actors/MarionetteCommandsParent.sys.mjs': typeof import('chrome://remote/content/marionette/actors/MarionetteCommandsParent.sys.mjs'); - 'chrome://remote/content/marionette/actors/MarionetteEventsParent.sys.mjs': typeof import('chrome://remote/content/marionette/actors/MarionetteEventsParent.sys.mjs'); - 'chrome://remote/content/marionette/atom.sys.mjs': typeof import('chrome://remote/content/marionette/atom.sys.mjs'); - 'chrome://remote/content/marionette/browser.sys.mjs': typeof import('chrome://remote/content/marionette/browser.sys.mjs'); - 'chrome://remote/content/marionette/cookie.sys.mjs': typeof import('chrome://remote/content/marionette/cookie.sys.mjs'); - 'chrome://remote/content/marionette/driver.sys.mjs': typeof import('chrome://remote/content/marionette/driver.sys.mjs'); - 'chrome://remote/content/marionette/evaluate.sys.mjs': typeof import('chrome://remote/content/marionette/evaluate.sys.mjs'); - 'chrome://remote/content/marionette/interaction.sys.mjs': typeof import('chrome://remote/content/marionette/interaction.sys.mjs'); - 'chrome://remote/content/marionette/json.sys.mjs': typeof import('chrome://remote/content/marionette/json.sys.mjs'); - 'chrome://remote/content/marionette/l10n.sys.mjs': typeof import('chrome://remote/content/marionette/l10n.sys.mjs'); - 'chrome://remote/content/marionette/message.sys.mjs': typeof import('chrome://remote/content/marionette/message.sys.mjs'); - 'chrome://remote/content/marionette/navigate.sys.mjs': typeof import('chrome://remote/content/marionette/navigate.sys.mjs'); - 'chrome://remote/content/marionette/packets.sys.mjs': typeof import('chrome://remote/content/marionette/packets.sys.mjs'); - 'chrome://remote/content/marionette/prefs.sys.mjs': typeof import('chrome://remote/content/marionette/prefs.sys.mjs'); - 'chrome://remote/content/marionette/reftest.sys.mjs': typeof import('chrome://remote/content/marionette/reftest.sys.mjs'); - 'chrome://remote/content/marionette/server.sys.mjs': typeof import('chrome://remote/content/marionette/server.sys.mjs'); - 'chrome://remote/content/marionette/stream-utils.sys.mjs': typeof import('chrome://remote/content/marionette/stream-utils.sys.mjs'); - 'chrome://remote/content/marionette/sync.sys.mjs': typeof import('chrome://remote/content/marionette/sync.sys.mjs'); - 'chrome://remote/content/marionette/transport.sys.mjs': typeof import('chrome://remote/content/marionette/transport.sys.mjs'); - 'chrome://remote/content/marionette/web-reference.sys.mjs': typeof import('chrome://remote/content/marionette/web-reference.sys.mjs'); - 'chrome://remote/content/marionette/webauthn.sys.mjs': typeof import('chrome://remote/content/marionette/webauthn.sys.mjs'); - 'chrome://remote/content/server/WebSocketHandshake.sys.mjs': typeof import('chrome://remote/content/server/WebSocketHandshake.sys.mjs'); - 'chrome://remote/content/server/WebSocketTransport.sys.mjs': typeof import('chrome://remote/content/server/WebSocketTransport.sys.mjs'); - 'chrome://remote/content/server/httpd.sys.mjs': typeof import('chrome://remote/content/server/httpd.sys.mjs'); - 'chrome://remote/content/shared/Addon.sys.mjs': typeof import('chrome://remote/content/shared/Addon.sys.mjs'); - 'chrome://remote/content/shared/AppInfo.sys.mjs': typeof import('chrome://remote/content/shared/AppInfo.sys.mjs'); - 'chrome://remote/content/shared/AsyncQueue.sys.mjs': typeof import('chrome://remote/content/shared/AsyncQueue.sys.mjs'); - 'chrome://remote/content/shared/Browser.sys.mjs': typeof import('chrome://remote/content/shared/Browser.sys.mjs'); - 'chrome://remote/content/shared/Capture.sys.mjs': typeof import('chrome://remote/content/shared/Capture.sys.mjs'); - 'chrome://remote/content/shared/ChallengeHeaderParser.sys.mjs': typeof import('chrome://remote/content/shared/ChallengeHeaderParser.sys.mjs'); - 'chrome://remote/content/shared/DOM.sys.mjs': typeof import('chrome://remote/content/shared/DOM.sys.mjs'); - 'chrome://remote/content/shared/Format.sys.mjs': typeof import('chrome://remote/content/shared/Format.sys.mjs'); - 'chrome://remote/content/shared/Log.sys.mjs': typeof import('chrome://remote/content/shared/Log.sys.mjs'); - 'chrome://remote/content/shared/MobileTabBrowser.sys.mjs': typeof import('chrome://remote/content/shared/MobileTabBrowser.sys.mjs'); - 'chrome://remote/content/shared/NavigableManager.sys.mjs': typeof import('chrome://remote/content/shared/NavigableManager.sys.mjs'); - 'chrome://remote/content/shared/Navigate.sys.mjs': typeof import('chrome://remote/content/shared/Navigate.sys.mjs'); - 'chrome://remote/content/shared/NavigationManager.sys.mjs': typeof import('chrome://remote/content/shared/NavigationManager.sys.mjs'); - 'chrome://remote/content/shared/NetworkCacheManager.sys.mjs': typeof import('chrome://remote/content/shared/NetworkCacheManager.sys.mjs'); - 'chrome://remote/content/shared/NetworkDecodedBodySizeMap.sys.mjs': typeof import('chrome://remote/content/shared/NetworkDecodedBodySizeMap.sys.mjs'); - 'chrome://remote/content/shared/NetworkRequest.sys.mjs': typeof import('chrome://remote/content/shared/NetworkRequest.sys.mjs'); - 'chrome://remote/content/shared/NetworkResponse.sys.mjs': typeof import('chrome://remote/content/shared/NetworkResponse.sys.mjs'); - 'chrome://remote/content/shared/PDF.sys.mjs': typeof import('chrome://remote/content/shared/PDF.sys.mjs'); - 'chrome://remote/content/shared/Permissions.sys.mjs': typeof import('chrome://remote/content/shared/Permissions.sys.mjs'); - 'chrome://remote/content/shared/Prompt.sys.mjs': typeof import('chrome://remote/content/shared/Prompt.sys.mjs'); - 'chrome://remote/content/shared/Realm.sys.mjs': typeof import('chrome://remote/content/shared/Realm.sys.mjs'); - 'chrome://remote/content/shared/RecommendedPreferences.sys.mjs': typeof import('chrome://remote/content/shared/RecommendedPreferences.sys.mjs'); - 'chrome://remote/content/shared/RemoteError.sys.mjs': typeof import('chrome://remote/content/shared/RemoteError.sys.mjs'); - 'chrome://remote/content/shared/Stack.sys.mjs': typeof import('chrome://remote/content/shared/Stack.sys.mjs'); - 'chrome://remote/content/shared/Sync.sys.mjs': typeof import('chrome://remote/content/shared/Sync.sys.mjs'); - 'chrome://remote/content/shared/TabManager.sys.mjs': typeof import('chrome://remote/content/shared/TabManager.sys.mjs'); - 'chrome://remote/content/shared/UUID.sys.mjs': typeof import('chrome://remote/content/shared/UUID.sys.mjs'); - 'chrome://remote/content/shared/UserContextManager.sys.mjs': typeof import('chrome://remote/content/shared/UserContextManager.sys.mjs'); - 'chrome://remote/content/shared/WindowManager.sys.mjs': typeof import('chrome://remote/content/shared/WindowManager.sys.mjs'); - 'chrome://remote/content/shared/js-process-actors/WebDriverDocumentInsertedActor.sys.mjs': typeof import('chrome://remote/content/shared/js-process-actors/WebDriverDocumentInsertedActor.sys.mjs'); - 'chrome://remote/content/shared/listeners/BeforeStopRequestListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/BeforeStopRequestListener.sys.mjs'); - 'chrome://remote/content/shared/listeners/BrowsingContextListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/BrowsingContextListener.sys.mjs'); - 'chrome://remote/content/shared/listeners/CachedResourceListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/CachedResourceListener.sys.mjs'); - 'chrome://remote/content/shared/listeners/ConsoleAPIListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/ConsoleAPIListener.sys.mjs'); - 'chrome://remote/content/shared/listeners/ConsoleListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/ConsoleListener.sys.mjs'); - 'chrome://remote/content/shared/listeners/ContextualIdentityListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/ContextualIdentityListener.sys.mjs'); - 'chrome://remote/content/shared/listeners/DataChannelListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/DataChannelListener.sys.mjs'); - 'chrome://remote/content/shared/listeners/DownloadListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/DownloadListener.sys.mjs'); - 'chrome://remote/content/shared/listeners/LoadListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/LoadListener.sys.mjs'); - 'chrome://remote/content/shared/listeners/NavigationListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/NavigationListener.sys.mjs'); - 'chrome://remote/content/shared/listeners/NetworkEventRecord.sys.mjs': typeof import('chrome://remote/content/shared/listeners/NetworkEventRecord.sys.mjs'); - 'chrome://remote/content/shared/listeners/NetworkListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/NetworkListener.sys.mjs'); - 'chrome://remote/content/shared/listeners/ParentWebProgressListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/ParentWebProgressListener.sys.mjs'); - 'chrome://remote/content/shared/listeners/PromptListener.sys.mjs': typeof import('chrome://remote/content/shared/listeners/PromptListener.sys.mjs'); - 'chrome://remote/content/shared/messagehandler/Errors.sys.mjs': typeof import('chrome://remote/content/shared/messagehandler/Errors.sys.mjs'); - 'chrome://remote/content/shared/messagehandler/EventsDispatcher.sys.mjs': typeof import('chrome://remote/content/shared/messagehandler/EventsDispatcher.sys.mjs'); - 'chrome://remote/content/shared/messagehandler/MessageHandler.sys.mjs': typeof import('chrome://remote/content/shared/messagehandler/MessageHandler.sys.mjs'); - 'chrome://remote/content/shared/messagehandler/MessageHandlerRegistry.sys.mjs': typeof import('chrome://remote/content/shared/messagehandler/MessageHandlerRegistry.sys.mjs'); - 'chrome://remote/content/shared/messagehandler/ModuleCache.sys.mjs': typeof import('chrome://remote/content/shared/messagehandler/ModuleCache.sys.mjs'); - 'chrome://remote/content/shared/messagehandler/RootMessageHandler.sys.mjs': typeof import('chrome://remote/content/shared/messagehandler/RootMessageHandler.sys.mjs'); - 'chrome://remote/content/shared/messagehandler/RootMessageHandlerRegistry.sys.mjs': typeof import('chrome://remote/content/shared/messagehandler/RootMessageHandlerRegistry.sys.mjs'); - 'chrome://remote/content/shared/messagehandler/WindowGlobalMessageHandler.sys.mjs': typeof import('chrome://remote/content/shared/messagehandler/WindowGlobalMessageHandler.sys.mjs'); - 'chrome://remote/content/shared/messagehandler/sessiondata/SessionData.sys.mjs': typeof import('chrome://remote/content/shared/messagehandler/sessiondata/SessionData.sys.mjs'); - 'chrome://remote/content/shared/messagehandler/sessiondata/SessionDataReader.sys.mjs': typeof import('chrome://remote/content/shared/messagehandler/sessiondata/SessionDataReader.sys.mjs'); - 'chrome://remote/content/shared/messagehandler/transports/BrowsingContextUtils.sys.mjs': typeof import('chrome://remote/content/shared/messagehandler/transports/BrowsingContextUtils.sys.mjs'); - 'chrome://remote/content/shared/messagehandler/transports/RootTransport.sys.mjs': typeof import('chrome://remote/content/shared/messagehandler/transports/RootTransport.sys.mjs'); - 'chrome://remote/content/shared/messagehandler/transports/js-window-actors/MessageHandlerFrameActor.sys.mjs': typeof import('chrome://remote/content/shared/messagehandler/transports/js-window-actors/MessageHandlerFrameActor.sys.mjs'); - 'chrome://remote/content/shared/messagehandler/transports/js-window-actors/MessageHandlerFrameChild.sys.mjs': typeof import('chrome://remote/content/shared/messagehandler/transports/js-window-actors/MessageHandlerFrameChild.sys.mjs'); - 'chrome://remote/content/shared/webdriver/Accessibility.sys.mjs': typeof import('chrome://remote/content/shared/webdriver/Accessibility.sys.mjs'); - 'chrome://remote/content/shared/webdriver/Actions.sys.mjs': typeof import('chrome://remote/content/shared/webdriver/Actions.sys.mjs'); - 'chrome://remote/content/shared/webdriver/Assert.sys.mjs': typeof import('chrome://remote/content/shared/webdriver/Assert.sys.mjs'); - 'chrome://remote/content/shared/webdriver/Capabilities.sys.mjs': typeof import('chrome://remote/content/shared/webdriver/Capabilities.sys.mjs'); - 'chrome://remote/content/shared/webdriver/Certificates.sys.mjs': typeof import('chrome://remote/content/shared/webdriver/Certificates.sys.mjs'); - 'chrome://remote/content/shared/webdriver/Errors.sys.mjs': typeof import('chrome://remote/content/shared/webdriver/Errors.sys.mjs'); - 'chrome://remote/content/shared/webdriver/Event.sys.mjs': typeof import('chrome://remote/content/shared/webdriver/Event.sys.mjs'); - 'chrome://remote/content/shared/webdriver/KeyData.sys.mjs': typeof import('chrome://remote/content/shared/webdriver/KeyData.sys.mjs'); - 'chrome://remote/content/shared/webdriver/NodeCache.sys.mjs': typeof import('chrome://remote/content/shared/webdriver/NodeCache.sys.mjs'); - 'chrome://remote/content/shared/webdriver/Session.sys.mjs': typeof import('chrome://remote/content/shared/webdriver/Session.sys.mjs'); - 'chrome://remote/content/shared/webdriver/URLPattern.sys.mjs': typeof import('chrome://remote/content/shared/webdriver/URLPattern.sys.mjs'); - 'chrome://remote/content/shared/webdriver/UserPromptHandler.sys.mjs': typeof import('chrome://remote/content/shared/webdriver/UserPromptHandler.sys.mjs'); - 'chrome://remote/content/shared/webdriver/process-actors/WebDriverProcessDataParent.sys.mjs': typeof import('chrome://remote/content/shared/webdriver/process-actors/WebDriverProcessDataParent.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/NewSessionHandler.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/NewSessionHandler.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/ProxyPerUserContextManager.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/ProxyPerUserContextManager.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/RemoteValue.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/RemoteValue.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/WebDriverBiDi.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/WebDriverBiDi.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/WebDriverBiDiConnection.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/WebDriverBiDiConnection.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/Intercept.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/Intercept.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/ModuleRegistry.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/ModuleRegistry.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/root/browser.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/root/browser.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/root/browsingContext.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/root/browsingContext.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/root/emulation.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/root/emulation.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/root/input.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/root/input.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/root/log.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/root/log.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/root/network.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/root/network.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/root/permissions.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/root/permissions.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/root/script.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/root/script.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/root/session.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/root/session.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/root/storage.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/root/storage.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/root/webExtension.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/root/webExtension.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/windowglobal-in-root/browsingContext.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/windowglobal-in-root/browsingContext.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/windowglobal-in-root/log.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/windowglobal-in-root/log.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/windowglobal-in-root/network.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/windowglobal-in-root/network.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/windowglobal-in-root/script.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/windowglobal-in-root/script.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/windowglobal/_configuration.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/windowglobal/_configuration.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/windowglobal/browsingContext.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/windowglobal/browsingContext.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/windowglobal/emulation.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/windowglobal/emulation.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/windowglobal/input.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/windowglobal/input.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/windowglobal/log.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/windowglobal/log.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/windowglobal/network.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/windowglobal/network.sys.mjs'); - 'chrome://remote/content/webdriver-bidi/modules/windowglobal/script.sys.mjs': typeof import('chrome://remote/content/webdriver-bidi/modules/windowglobal/script.sys.mjs'); - 'moz-src:///browser/components/DefaultBrowserCheck.sys.mjs': typeof import('moz-src:///browser/components/DefaultBrowserCheck.sys.mjs'); - 'moz-src:///browser/components/DesktopActorRegistry.sys.mjs': typeof import('moz-src:///browser/components/DesktopActorRegistry.sys.mjs'); - 'moz-src:///browser/components/ProfileDataUpgrader.sys.mjs': typeof import('moz-src:///browser/components/ProfileDataUpgrader.sys.mjs'); - 'moz-src:///browser/components/StartupTelemetry.sys.mjs': typeof import('moz-src:///browser/components/StartupTelemetry.sys.mjs'); - 'moz-src:///browser/components/attribution/AttributionCode.sys.mjs': typeof import('moz-src:///browser/components/attribution/AttributionCode.sys.mjs'); - 'moz-src:///browser/components/attribution/MacAttribution.sys.mjs': typeof import('moz-src:///browser/components/attribution/MacAttribution.sys.mjs'); - 'moz-src:///browser/components/contentanalysis/content/ContentAnalysis.sys.mjs': typeof import('moz-src:///browser/components/contentanalysis/content/ContentAnalysis.sys.mjs'); - 'moz-src:///browser/components/customizableui/CustomizableUI.sys.mjs': typeof import('moz-src:///browser/components/customizableui/CustomizableUI.sys.mjs'); - 'moz-src:///browser/components/customizableui/CustomizableWidgets.sys.mjs': typeof import('moz-src:///browser/components/customizableui/CustomizableWidgets.sys.mjs'); - 'moz-src:///browser/components/customizableui/CustomizeMode.sys.mjs': typeof import('moz-src:///browser/components/customizableui/CustomizeMode.sys.mjs'); - 'moz-src:///browser/components/customizableui/DragPositionManager.sys.mjs': typeof import('moz-src:///browser/components/customizableui/DragPositionManager.sys.mjs'); - 'moz-src:///browser/components/customizableui/PanelMultiView.sys.mjs': typeof import('moz-src:///browser/components/customizableui/PanelMultiView.sys.mjs'); - 'moz-src:///browser/components/customizableui/SearchWidgetTracker.sys.mjs': typeof import('moz-src:///browser/components/customizableui/SearchWidgetTracker.sys.mjs'); - 'moz-src:///browser/components/customizableui/ToolbarContextMenu.sys.mjs': typeof import('moz-src:///browser/components/customizableui/ToolbarContextMenu.sys.mjs'); - 'moz-src:///browser/components/customizableui/ToolbarDropHandler.sys.mjs': typeof import('moz-src:///browser/components/customizableui/ToolbarDropHandler.sys.mjs'); - 'moz-src:///browser/components/downloads/DownloadSpamProtection.sys.mjs': typeof import('moz-src:///browser/components/downloads/DownloadSpamProtection.sys.mjs'); - 'moz-src:///browser/components/downloads/DownloadsCommon.sys.mjs': typeof import('moz-src:///browser/components/downloads/DownloadsCommon.sys.mjs'); - 'moz-src:///browser/components/downloads/DownloadsMacFinderProgress.sys.mjs': typeof import('moz-src:///browser/components/downloads/DownloadsMacFinderProgress.sys.mjs'); - 'moz-src:///browser/components/downloads/DownloadsTaskbar.sys.mjs': typeof import('moz-src:///browser/components/downloads/DownloadsTaskbar.sys.mjs'); - 'moz-src:///browser/components/downloads/DownloadsViewUI.sys.mjs': typeof import('moz-src:///browser/components/downloads/DownloadsViewUI.sys.mjs'); - 'moz-src:///browser/components/downloads/DownloadsViewableInternally.sys.mjs': typeof import('moz-src:///browser/components/downloads/DownloadsViewableInternally.sys.mjs'); - 'moz-src:///browser/components/genai/LinkPreview.sys.mjs': typeof import('moz-src:///browser/components/genai/LinkPreview.sys.mjs'); - 'moz-src:///browser/components/genai/LinkPreviewModel.sys.mjs': typeof import('moz-src:///browser/components/genai/LinkPreviewModel.sys.mjs'); - 'moz-src:///browser/components/genai/PageAssist.sys.mjs': typeof import('moz-src:///browser/components/genai/PageAssist.sys.mjs'); - 'moz-src:///browser/components/genai/SmartAssistEngine.sys.mjs': typeof import('moz-src:///browser/components/genai/SmartAssistEngine.sys.mjs'); - 'moz-src:///browser/components/mozcachedohttp/MozCachedOHTTPProtocolHandler.sys.mjs': typeof import('moz-src:///browser/components/mozcachedohttp/MozCachedOHTTPProtocolHandler.sys.mjs'); - 'moz-src:///browser/components/newtab/SponsorProtection.sys.mjs': typeof import('moz-src:///browser/components/newtab/SponsorProtection.sys.mjs'); - 'moz-src:///browser/components/pagedata/OpenGraphPageData.sys.mjs': typeof import('moz-src:///browser/components/pagedata/OpenGraphPageData.sys.mjs'); - 'moz-src:///browser/components/pagedata/PageDataSchema.sys.mjs': typeof import('moz-src:///browser/components/pagedata/PageDataSchema.sys.mjs'); - 'moz-src:///browser/components/pagedata/PageDataService.sys.mjs': typeof import('moz-src:///browser/components/pagedata/PageDataService.sys.mjs'); - 'moz-src:///browser/components/pagedata/SchemaOrgPageData.sys.mjs': typeof import('moz-src:///browser/components/pagedata/SchemaOrgPageData.sys.mjs'); - 'moz-src:///browser/components/pagedata/TwitterPageData.sys.mjs': typeof import('moz-src:///browser/components/pagedata/TwitterPageData.sys.mjs'); - 'moz-src:///browser/components/places/Interactions.sys.mjs': typeof import('moz-src:///browser/components/places/Interactions.sys.mjs'); - 'moz-src:///browser/components/places/InteractionsBlocklist.sys.mjs': typeof import('moz-src:///browser/components/places/InteractionsBlocklist.sys.mjs'); - 'moz-src:///browser/components/places/PlacesBrowserStartup.sys.mjs': typeof import('moz-src:///browser/components/places/PlacesBrowserStartup.sys.mjs'); - 'moz-src:///browser/components/places/PlacesUIUtils.sys.mjs': typeof import('moz-src:///browser/components/places/PlacesUIUtils.sys.mjs'); - 'moz-src:///browser/components/privatebrowsing/ResetPBMPanel.sys.mjs': typeof import('moz-src:///browser/components/privatebrowsing/ResetPBMPanel.sys.mjs'); - 'moz-src:///browser/components/protections/ContentBlockingPrefs.sys.mjs': typeof import('moz-src:///browser/components/protections/ContentBlockingPrefs.sys.mjs'); - 'moz-src:///browser/components/reportbrokensite/ReportBrokenSite.sys.mjs': typeof import('moz-src:///browser/components/reportbrokensite/ReportBrokenSite.sys.mjs'); - 'moz-src:///browser/components/search/BrowserSearchTelemetry.sys.mjs': typeof import('moz-src:///browser/components/search/BrowserSearchTelemetry.sys.mjs'); - 'moz-src:///browser/components/search/OpenSearchManager.sys.mjs': typeof import('moz-src:///browser/components/search/OpenSearchManager.sys.mjs'); - 'moz-src:///browser/components/search/SERPCategorization.sys.mjs': typeof import('moz-src:///browser/components/search/SERPCategorization.sys.mjs'); - 'moz-src:///browser/components/search/SearchOneOffs.sys.mjs': typeof import('moz-src:///browser/components/search/SearchOneOffs.sys.mjs'); - 'moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs': typeof import('moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs'); - 'moz-src:///browser/components/search/SearchUIUtils.sys.mjs': typeof import('moz-src:///browser/components/search/SearchUIUtils.sys.mjs'); - 'moz-src:///browser/components/shell/HeadlessShell.sys.mjs': typeof import('moz-src:///browser/components/shell/HeadlessShell.sys.mjs'); - 'moz-src:///browser/components/shell/ShellService.sys.mjs': typeof import('moz-src:///browser/components/shell/ShellService.sys.mjs'); - 'moz-src:///browser/components/shell/StartupOSIntegration.sys.mjs': typeof import('moz-src:///browser/components/shell/StartupOSIntegration.sys.mjs'); - 'moz-src:///browser/components/sidebar/SidebarManager.sys.mjs': typeof import('moz-src:///browser/components/sidebar/SidebarManager.sys.mjs'); - 'moz-src:///browser/components/sidebar/SidebarState.sys.mjs': typeof import('moz-src:///browser/components/sidebar/SidebarState.sys.mjs'); - 'moz-src:///browser/components/sidebar/SidebarTreeView.sys.mjs': typeof import('moz-src:///browser/components/sidebar/SidebarTreeView.sys.mjs'); - 'moz-src:///browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs': typeof import('moz-src:///browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs'); - 'moz-src:///browser/components/tabbrowser/GroupsList.sys.mjs': typeof import('moz-src:///browser/components/tabbrowser/GroupsList.sys.mjs'); - 'moz-src:///browser/components/tabbrowser/NewTabPagePreloading.sys.mjs': typeof import('moz-src:///browser/components/tabbrowser/NewTabPagePreloading.sys.mjs'); - 'moz-src:///browser/components/tabbrowser/OpenInTabsUtils.sys.mjs': typeof import('moz-src:///browser/components/tabbrowser/OpenInTabsUtils.sys.mjs'); - 'moz-src:///browser/components/tabbrowser/SmartTabGrouping.sys.mjs': typeof import('moz-src:///browser/components/tabbrowser/SmartTabGrouping.sys.mjs'); - 'moz-src:///browser/components/tabbrowser/TabMetrics.sys.mjs': typeof import('moz-src:///browser/components/tabbrowser/TabMetrics.sys.mjs'); - 'moz-src:///browser/components/tabbrowser/TabUnloader.sys.mjs': typeof import('moz-src:///browser/components/tabbrowser/TabUnloader.sys.mjs'); - 'moz-src:///browser/components/tabbrowser/TabsList.sys.mjs': typeof import('moz-src:///browser/components/tabbrowser/TabsList.sys.mjs'); - 'moz-src:///browser/components/uitour/UITour.sys.mjs': typeof import('moz-src:///browser/components/uitour/UITour.sys.mjs'); - 'moz-src:///browser/components/uitour/UITourUtils.sys.mjs': typeof import('moz-src:///browser/components/uitour/UITourUtils.sys.mjs'); - 'moz-src:///browser/components/urlbar/ActionsProviderContextualSearch.sys.mjs': typeof import('moz-src:///browser/components/urlbar/ActionsProviderContextualSearch.sys.mjs'); - 'moz-src:///browser/components/urlbar/ActionsProviderQuickActions.sys.mjs': typeof import('moz-src:///browser/components/urlbar/ActionsProviderQuickActions.sys.mjs'); - 'moz-src:///browser/components/urlbar/MerinoClient.sys.mjs': typeof import('moz-src:///browser/components/urlbar/MerinoClient.sys.mjs'); - 'moz-src:///browser/components/urlbar/QuickActionsLoaderDefault.sys.mjs': typeof import('moz-src:///browser/components/urlbar/QuickActionsLoaderDefault.sys.mjs'); - 'moz-src:///browser/components/urlbar/QuickSuggest.sys.mjs': typeof import('moz-src:///browser/components/urlbar/QuickSuggest.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarController.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarController.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarEventBufferer.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarEventBufferer.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarInput.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarInput.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarPrefs.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarPrefs.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarProviderAutofill.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderAutofill.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarProviderCalculator.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderCalculator.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarProviderClipboard.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderClipboard.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarProviderGlobalActions.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderGlobalActions.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarProviderInterventions.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderInterventions.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarProviderOpenTabs.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderOpenTabs.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarProviderPlaces.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderPlaces.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarProviderQuickSuggest.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderQuickSuggest.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarProviderSearchSuggestions.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderSearchSuggestions.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarProviderSearchTips.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderSearchTips.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarProviderSemanticHistorySearch.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderSemanticHistorySearch.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarProviderTabToSearch.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderTabToSearch.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarProviderTopSites.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderTopSites.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarProviderUnitConversion.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProviderUnitConversion.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarProvidersManager.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarProvidersManager.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarResult.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarResult.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarSearchOneOffs.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarSearchOneOffs.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarSearchTermsPersistence.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarSearchTermsPersistence.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarSearchUtils.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarSearchUtils.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarTokenizer.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarTokenizer.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarUtils.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarUtils.sys.mjs'); - 'moz-src:///browser/components/urlbar/UrlbarView.sys.mjs': typeof import('moz-src:///browser/components/urlbar/UrlbarView.sys.mjs'); - 'moz-src:///browser/components/urlbar/private/AmpSuggestions.sys.mjs': typeof import('moz-src:///browser/components/urlbar/private/AmpSuggestions.sys.mjs'); - 'moz-src:///browser/components/urlbar/private/GeolocationUtils.sys.mjs': typeof import('moz-src:///browser/components/urlbar/private/GeolocationUtils.sys.mjs'); - 'moz-src:///browser/components/urlbar/private/MLSuggest.sys.mjs': typeof import('moz-src:///browser/components/urlbar/private/MLSuggest.sys.mjs'); - 'moz-src:///browser/components/urlbar/private/SuggestBackendRust.sys.mjs': typeof import('moz-src:///browser/components/urlbar/private/SuggestBackendRust.sys.mjs'); - 'moz-src:///browser/modules/CanvasPermissionPromptHelper.sys.mjs': typeof import('moz-src:///browser/modules/CanvasPermissionPromptHelper.sys.mjs'); - 'moz-src:///browser/modules/ContextId.sys.mjs': typeof import('moz-src:///browser/modules/ContextId.sys.mjs'); - 'moz-src:///browser/modules/PrivateBrowsingUI.sys.mjs': typeof import('moz-src:///browser/modules/PrivateBrowsingUI.sys.mjs'); - 'moz-src:///browser/modules/UnexpectedScriptObserver.sys.mjs': typeof import('moz-src:///browser/modules/UnexpectedScriptObserver.sys.mjs'); - 'moz-src:///browser/modules/WebAuthnPromptHelper.sys.mjs': typeof import('moz-src:///browser/modules/WebAuthnPromptHelper.sys.mjs'); - 'moz-src:///browser/themes/ToolbarIconColor.sys.mjs': typeof import('moz-src:///browser/themes/ToolbarIconColor.sys.mjs'); - 'moz-src:///dom/notification/MemoryNotificationDB.sys.mjs': typeof import('moz-src:///dom/notification/MemoryNotificationDB.sys.mjs'); - 'moz-src:///dom/notification/NotificationDB.sys.mjs': typeof import('moz-src:///dom/notification/NotificationDB.sys.mjs'); - 'moz-src:///services/crypto/modules/WeaveCrypto.sys.mjs': typeof import('moz-src:///services/crypto/modules/WeaveCrypto.sys.mjs'); - 'moz-src:///services/crypto/modules/jwcrypto.sys.mjs': typeof import('moz-src:///services/crypto/modules/jwcrypto.sys.mjs'); - 'moz-src:///services/crypto/modules/utils.sys.mjs': typeof import('moz-src:///services/crypto/modules/utils.sys.mjs'); - 'moz-src:///toolkit/components/doh/DoHConfig.sys.mjs': typeof import('moz-src:///toolkit/components/doh/DoHConfig.sys.mjs'); - 'moz-src:///toolkit/components/doh/DoHController.sys.mjs': typeof import('moz-src:///toolkit/components/doh/DoHController.sys.mjs'); - 'moz-src:///toolkit/components/doh/DoHHeuristics.sys.mjs': typeof import('moz-src:///toolkit/components/doh/DoHHeuristics.sys.mjs'); - 'moz-src:///toolkit/components/doh/TRRPerformance.sys.mjs': typeof import('moz-src:///toolkit/components/doh/TRRPerformance.sys.mjs'); - 'moz-src:///toolkit/components/pageextractor/DOMExtractor.sys.mjs': typeof import('moz-src:///toolkit/components/pageextractor/DOMExtractor.sys.mjs'); - 'moz-src:///toolkit/components/reader/AboutReader.sys.mjs': typeof import('moz-src:///toolkit/components/reader/AboutReader.sys.mjs'); - 'moz-src:///toolkit/components/reader/ReaderMode.sys.mjs': typeof import('moz-src:///toolkit/components/reader/ReaderMode.sys.mjs'); - 'moz-src:///toolkit/components/reader/ReaderWorker.sys.mjs': typeof import('moz-src:///toolkit/components/reader/ReaderWorker.sys.mjs'); - 'moz-src:///toolkit/components/search/AddonSearchEngine.sys.mjs': typeof import('moz-src:///toolkit/components/search/AddonSearchEngine.sys.mjs'); - 'moz-src:///toolkit/components/search/ConfigSearchEngine.sys.mjs': typeof import('moz-src:///toolkit/components/search/ConfigSearchEngine.sys.mjs'); - 'moz-src:///toolkit/components/search/OpenSearchEngine.sys.mjs': typeof import('moz-src:///toolkit/components/search/OpenSearchEngine.sys.mjs'); - 'moz-src:///toolkit/components/search/OpenSearchLoader.sys.mjs': typeof import('moz-src:///toolkit/components/search/OpenSearchLoader.sys.mjs'); - 'moz-src:///toolkit/components/search/PolicySearchEngine.sys.mjs': typeof import('moz-src:///toolkit/components/search/PolicySearchEngine.sys.mjs'); - 'moz-src:///toolkit/components/search/SearchEngine.sys.mjs': typeof import('moz-src:///toolkit/components/search/SearchEngine.sys.mjs'); - 'moz-src:///toolkit/components/search/SearchEngineSelector.sys.mjs': typeof import('moz-src:///toolkit/components/search/SearchEngineSelector.sys.mjs'); - 'moz-src:///toolkit/components/search/SearchSettings.sys.mjs': typeof import('moz-src:///toolkit/components/search/SearchSettings.sys.mjs'); - 'moz-src:///toolkit/components/search/SearchShortcuts.sys.mjs': typeof import('moz-src:///toolkit/components/search/SearchShortcuts.sys.mjs'); - 'moz-src:///toolkit/components/search/SearchStaticData.sys.mjs': typeof import('moz-src:///toolkit/components/search/SearchStaticData.sys.mjs'); - 'moz-src:///toolkit/components/search/SearchSuggestionController.sys.mjs': typeof import('moz-src:///toolkit/components/search/SearchSuggestionController.sys.mjs'); - 'moz-src:///toolkit/components/search/SearchUtils.sys.mjs': typeof import('moz-src:///toolkit/components/search/SearchUtils.sys.mjs'); - 'moz-src:///toolkit/components/search/UserSearchEngine.sys.mjs': typeof import('moz-src:///toolkit/components/search/UserSearchEngine.sys.mjs'); - 'moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustFilterAdult.sys.mjs': typeof import('moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustFilterAdult.sys.mjs'); - 'moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustRelevancy.sys.mjs': typeof import('moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustRelevancy.sys.mjs'); - 'moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustSearch.sys.mjs': typeof import('moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustSearch.sys.mjs'); - 'moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustSuggest.sys.mjs': typeof import('moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustSuggest.sys.mjs'); - 'moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustTabs.sys.mjs': typeof import('moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustTabs.sys.mjs'); - 'moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustWebextstorage.sys.mjs': typeof import('moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustWebextstorage.sys.mjs'); - 'moz-src:///toolkit/components/uniffi-bindgen-gecko-js/tests/generated/RustUniffiBindingsTests.sys.mjs': typeof import('moz-src:///toolkit/components/uniffi-bindgen-gecko-js/tests/generated/RustUniffiBindingsTests.sys.mjs'); - 'moz-src:///toolkit/components/uniffi-bindgen-gecko-js/tests/generated/RustUniffiBindingsTestsExternalTypes.sys.mjs': typeof import('moz-src:///toolkit/components/uniffi-bindgen-gecko-js/tests/generated/RustUniffiBindingsTestsExternalTypes.sys.mjs'); - 'moz-src:///toolkit/modules/PrefUtils.sys.mjs': typeof import('moz-src:///toolkit/modules/PrefUtils.sys.mjs'); - 'moz-src:///toolkit/profile/ProfilesDatastoreService.sys.mjs': typeof import('moz-src:///toolkit/profile/ProfilesDatastoreService.sys.mjs'); - 'resource:///actors/AboutLoginsParent.sys.mjs': typeof import('resource:///actors/AboutLoginsParent.sys.mjs'); - 'resource:///actors/AboutNewTabParent.sys.mjs': typeof import('resource:///actors/AboutNewTabParent.sys.mjs'); - 'resource:///actors/AboutPrivateBrowsingParent.sys.mjs': typeof import('resource:///actors/AboutPrivateBrowsingParent.sys.mjs'); - 'resource:///actors/AboutProtectionsParent.sys.mjs': typeof import('resource:///actors/AboutProtectionsParent.sys.mjs'); - 'resource:///actors/AboutReaderParent.sys.mjs': typeof import('resource:///actors/AboutReaderParent.sys.mjs'); - 'resource:///actors/AboutWelcomeParent.sys.mjs': typeof import('resource:///actors/AboutWelcomeParent.sys.mjs'); - 'resource:///actors/ClickHandlerParent.sys.mjs': typeof import('resource:///actors/ClickHandlerParent.sys.mjs'); - 'resource:///actors/ContentSearchParent.sys.mjs': typeof import('resource:///actors/ContentSearchParent.sys.mjs'); - 'resource:///actors/ContextMenuChild.sys.mjs': typeof import('resource:///actors/ContextMenuChild.sys.mjs'); - 'resource:///actors/LinkHandlerParent.sys.mjs': typeof import('resource:///actors/LinkHandlerParent.sys.mjs'); - 'resource:///actors/LinkPreviewChild.sys.mjs': typeof import('resource:///actors/LinkPreviewChild.sys.mjs'); - 'resource:///actors/PluginParent.sys.mjs': typeof import('resource:///actors/PluginParent.sys.mjs'); - 'resource:///actors/ScreenshotsComponentChild.sys.mjs': typeof import('resource:///actors/ScreenshotsComponentChild.sys.mjs'); - 'resource:///actors/SearchSERPTelemetryChild.sys.mjs': typeof import('resource:///actors/SearchSERPTelemetryChild.sys.mjs'); - 'resource:///actors/WebRTCChild.sys.mjs': typeof import('resource:///actors/WebRTCChild.sys.mjs'); - 'resource:///bar.sys.mjs': typeof import('resource:///bar.sys.mjs'); - 'resource:///modules/360seMigrationUtils.sys.mjs': typeof import('resource:///modules/360seMigrationUtils.sys.mjs'); - 'resource:///modules/AboutHomeStartupCache.sys.mjs': typeof import('resource:///modules/AboutHomeStartupCache.sys.mjs'); - 'resource:///modules/AboutNewTab.sys.mjs': typeof import('resource:///modules/AboutNewTab.sys.mjs'); - 'resource:///modules/AboutNewTabRedirector.sys.mjs': typeof import('resource:///modules/AboutNewTabRedirector.sys.mjs'); - 'resource:///modules/AboutNewTabResourceMapping.sys.mjs': typeof import('resource:///modules/AboutNewTabResourceMapping.sys.mjs'); - 'resource:///modules/AccountsGlue.sys.mjs': typeof import('resource:///modules/AccountsGlue.sys.mjs'); - 'resource:///modules/BrowserGlue.sys.mjs': typeof import('resource:///modules/BrowserGlue.sys.mjs'); - 'resource:///modules/BrowserUIUtils.sys.mjs': typeof import('resource:///modules/BrowserUIUtils.sys.mjs'); - 'resource:///modules/BrowserUsageTelemetry.sys.mjs': typeof import('resource:///modules/BrowserUsageTelemetry.sys.mjs'); - 'resource:///modules/BrowserWindowTracker.sys.mjs': typeof import('resource:///modules/BrowserWindowTracker.sys.mjs'); - 'resource:///modules/BuiltInThemeConfig.sys.mjs': typeof import('resource:///modules/BuiltInThemeConfig.sys.mjs'); - 'resource:///modules/BuiltInThemes.sys.mjs': typeof import('resource:///modules/BuiltInThemes.sys.mjs'); - 'resource:///modules/ChromeMacOSLoginCrypto.sys.mjs': typeof import('resource:///modules/ChromeMacOSLoginCrypto.sys.mjs'); - 'resource:///modules/ChromeMigrationUtils.sys.mjs': typeof import('resource:///modules/ChromeMigrationUtils.sys.mjs'); - 'resource:///modules/ChromeProfileMigrator.sys.mjs': typeof import('resource:///modules/ChromeProfileMigrator.sys.mjs'); - 'resource:///modules/ChromeWindowsLoginCrypto.sys.mjs': typeof import('resource:///modules/ChromeWindowsLoginCrypto.sys.mjs'); - 'resource:///modules/ContentCrashHandlers.sys.mjs': typeof import('resource:///modules/ContentCrashHandlers.sys.mjs'); - 'resource:///modules/Dedupe.sys.mjs': typeof import('resource:///modules/Dedupe.sys.mjs'); - 'resource:///modules/DevToolsStartup.sys.mjs': typeof import('resource:///modules/DevToolsStartup.sys.mjs'); - 'resource:///modules/Discovery.sys.mjs': typeof import('resource:///modules/Discovery.sys.mjs'); - 'resource:///modules/DownloadsCommon.sys.mjs': typeof import('resource:///modules/DownloadsCommon.sys.mjs'); - 'resource:///modules/DownloadsViewUI.sys.mjs': typeof import('resource:///modules/DownloadsViewUI.sys.mjs'); - 'resource:///modules/ESEDBReader.sys.mjs': typeof import('resource:///modules/ESEDBReader.sys.mjs'); - 'resource:///modules/EdgeProfileMigrator.sys.mjs': typeof import('resource:///modules/EdgeProfileMigrator.sys.mjs'); - 'resource:///modules/EveryWindow.sys.mjs': typeof import('resource:///modules/EveryWindow.sys.mjs'); - 'resource:///modules/ExtensionBrowsingData.sys.mjs': typeof import('resource:///modules/ExtensionBrowsingData.sys.mjs'); - 'resource:///modules/ExtensionControlledPopup.sys.mjs': typeof import('resource:///modules/ExtensionControlledPopup.sys.mjs'); - 'resource:///modules/ExtensionPopups.sys.mjs': typeof import('resource:///modules/ExtensionPopups.sys.mjs'); - 'resource:///modules/ExtensionsUI.sys.mjs': typeof import('resource:///modules/ExtensionsUI.sys.mjs'); - 'resource:///modules/FaviconLoader.sys.mjs': typeof import('resource:///modules/FaviconLoader.sys.mjs'); - 'resource:///modules/FileMigrators.sys.mjs': typeof import('resource:///modules/FileMigrators.sys.mjs'); - 'resource:///modules/FilePickerCrashed.sys.mjs': typeof import('resource:///modules/FilePickerCrashed.sys.mjs'); - 'resource:///modules/FilterAdult.sys.mjs': typeof import('resource:///modules/FilterAdult.sys.mjs'); - 'resource:///modules/FirefoxBridgeExtensionUtils.sys.mjs': typeof import('resource:///modules/FirefoxBridgeExtensionUtils.sys.mjs'); - 'resource:///modules/FirefoxProfileMigrator.sys.mjs': typeof import('resource:///modules/FirefoxProfileMigrator.sys.mjs'); - 'resource:///modules/GenAI.sys.mjs': typeof import('resource:///modules/GenAI.sys.mjs'); - 'resource:///modules/HistoryController.sys.mjs': typeof import('resource:///modules/HistoryController.sys.mjs'); - 'resource:///modules/HomePage.sys.mjs': typeof import('resource:///modules/HomePage.sys.mjs'); - 'resource:///modules/InstallerPrefs.sys.mjs': typeof import('resource:///modules/InstallerPrefs.sys.mjs'); - 'resource:///modules/InternalTestingProfileMigrator.sys.mjs': typeof import('resource:///modules/InternalTestingProfileMigrator.sys.mjs'); - 'resource:///modules/LaterRun.sys.mjs': typeof import('resource:///modules/LaterRun.sys.mjs'); - 'resource:///modules/LinksCache.sys.mjs': typeof import('resource:///modules/LinksCache.sys.mjs'); - 'resource:///modules/LoginBreaches.sys.mjs': typeof import('resource:///modules/LoginBreaches.sys.mjs'); - 'resource:///modules/MSMigrationUtils.sys.mjs': typeof import('resource:///modules/MSMigrationUtils.sys.mjs'); - 'resource:///modules/MerinoClient.sys.mjs': typeof import('resource:///modules/MerinoClient.sys.mjs'); - 'resource:///modules/MigrationUtils.sys.mjs': typeof import('resource:///modules/MigrationUtils.sys.mjs'); - 'resource:///modules/MigratorBase.sys.mjs': typeof import('resource:///modules/MigratorBase.sys.mjs'); - 'resource:///modules/OpenTabs.sys.mjs': typeof import('resource:///modules/OpenTabs.sys.mjs'); - 'resource:///modules/PageActions.sys.mjs': typeof import('resource:///modules/PageActions.sys.mjs'); - 'resource:///modules/PartnerLinkAttribution.sys.mjs': typeof import('resource:///modules/PartnerLinkAttribution.sys.mjs'); - 'resource:///modules/PermissionUI.sys.mjs': typeof import('resource:///modules/PermissionUI.sys.mjs'); - 'resource:///modules/PopupAndRedirectBlockerObserver.sys.mjs': typeof import('resource:///modules/PopupAndRedirectBlockerObserver.sys.mjs'); - 'resource:///modules/ProcessHangMonitor.sys.mjs': typeof import('resource:///modules/ProcessHangMonitor.sys.mjs'); - 'resource:///modules/SafariProfileMigrator.sys.mjs': typeof import('resource:///modules/SafariProfileMigrator.sys.mjs'); - 'resource:///modules/Sanitizer.sys.mjs': typeof import('resource:///modules/Sanitizer.sys.mjs'); - 'resource:///modules/ScreenshotsOverlayChild.sys.mjs': typeof import('resource:///modules/ScreenshotsOverlayChild.sys.mjs'); - 'resource:///modules/ScreenshotsUtils.sys.mjs': typeof import('resource:///modules/ScreenshotsUtils.sys.mjs'); - 'resource:///modules/SelectionChangedMenulist.sys.mjs': typeof import('resource:///modules/SelectionChangedMenulist.sys.mjs'); - 'resource:///modules/SharingUtils.sys.mjs': typeof import('resource:///modules/SharingUtils.sys.mjs'); - 'resource:///modules/SiteDataManager.sys.mjs': typeof import('resource:///modules/SiteDataManager.sys.mjs'); - 'resource:///modules/SitePermissions.sys.mjs': typeof import('resource:///modules/SitePermissions.sys.mjs'); - 'resource:///modules/SyncedTabsController.sys.mjs': typeof import('resource:///modules/SyncedTabsController.sys.mjs'); - 'resource:///modules/TRRPerformance.sys.mjs': typeof import('resource:///modules/TRRPerformance.sys.mjs'); - 'resource:///modules/ThemeVariableMap.sys.mjs': typeof import('resource:///modules/ThemeVariableMap.sys.mjs'); - 'resource:///modules/TransientPrefs.sys.mjs': typeof import('resource:///modules/TransientPrefs.sys.mjs'); - 'resource:///modules/URILoadingHelper.sys.mjs': typeof import('resource:///modules/URILoadingHelper.sys.mjs'); - 'resource:///modules/UrlbarUtils.sys.mjs': typeof import('resource:///modules/UrlbarUtils.sys.mjs'); - 'resource:///modules/WebProtocolHandlerRegistrar.sys.mjs': typeof import('resource:///modules/WebProtocolHandlerRegistrar.sys.mjs'); - 'resource:///modules/WindowsJumpLists.sys.mjs': typeof import('resource:///modules/WindowsJumpLists.sys.mjs'); - 'resource:///modules/WindowsPreviewPerTab.sys.mjs': typeof import('resource:///modules/WindowsPreviewPerTab.sys.mjs'); - 'resource:///modules/ZoomUI.sys.mjs': typeof import('resource:///modules/ZoomUI.sys.mjs'); - 'resource:///modules/aboutwelcome/AWScreenUtils.sys.mjs': typeof import('resource:///modules/aboutwelcome/AWScreenUtils.sys.mjs'); - 'resource:///modules/aboutwelcome/AWToolbarUtils.sys.mjs': typeof import('resource:///modules/aboutwelcome/AWToolbarUtils.sys.mjs'); - 'resource:///modules/aboutwelcome/AboutWelcomeDefaults.sys.mjs': typeof import('resource:///modules/aboutwelcome/AboutWelcomeDefaults.sys.mjs'); - 'resource:///modules/aboutwelcome/AboutWelcomeTelemetry.sys.mjs': typeof import('resource:///modules/aboutwelcome/AboutWelcomeTelemetry.sys.mjs'); - 'resource:///modules/asrouter/ASRouter.sys.mjs': typeof import('resource:///modules/asrouter/ASRouter.sys.mjs'); - 'resource:///modules/asrouter/ASRouterDefaultConfig.sys.mjs': typeof import('resource:///modules/asrouter/ASRouterDefaultConfig.sys.mjs'); - 'resource:///modules/asrouter/ASRouterNewTabHook.sys.mjs': typeof import('resource:///modules/asrouter/ASRouterNewTabHook.sys.mjs'); - 'resource:///modules/asrouter/ASRouterPreferences.sys.mjs': typeof import('resource:///modules/asrouter/ASRouterPreferences.sys.mjs'); - 'resource:///modules/asrouter/ASRouterStorage.sys.mjs': typeof import('resource:///modules/asrouter/ASRouterStorage.sys.mjs'); - 'resource:///modules/asrouter/ASRouterTargeting.sys.mjs': typeof import('resource:///modules/asrouter/ASRouterTargeting.sys.mjs'); - 'resource:///modules/asrouter/ASRouterTelemetry.sys.mjs': typeof import('resource:///modules/asrouter/ASRouterTelemetry.sys.mjs'); - 'resource:///modules/asrouter/ASRouterTriggerListeners.sys.mjs': typeof import('resource:///modules/asrouter/ASRouterTriggerListeners.sys.mjs'); - 'resource:///modules/asrouter/ActorConstants.mjs': typeof import('resource:///modules/asrouter/ActorConstants.mjs'); - 'resource:///modules/asrouter/BookmarksBarButton.sys.mjs': typeof import('resource:///modules/asrouter/BookmarksBarButton.sys.mjs'); - 'resource:///modules/asrouter/CFRMessageProvider.sys.mjs': typeof import('resource:///modules/asrouter/CFRMessageProvider.sys.mjs'); - 'resource:///modules/asrouter/CFRPageActions.sys.mjs': typeof import('resource:///modules/asrouter/CFRPageActions.sys.mjs'); - 'resource:///modules/asrouter/FeatureCallout.sys.mjs': typeof import('resource:///modules/asrouter/FeatureCallout.sys.mjs'); - 'resource:///modules/asrouter/FeatureCalloutBroker.sys.mjs': typeof import('resource:///modules/asrouter/FeatureCalloutBroker.sys.mjs'); - 'resource:///modules/asrouter/FeatureCalloutMessages.sys.mjs': typeof import('resource:///modules/asrouter/FeatureCalloutMessages.sys.mjs'); - 'resource:///modules/asrouter/InfoBar.sys.mjs': typeof import('resource:///modules/asrouter/InfoBar.sys.mjs'); - 'resource:///modules/asrouter/MenuMessage.sys.mjs': typeof import('resource:///modules/asrouter/MenuMessage.sys.mjs'); - 'resource:///modules/asrouter/MomentsPageHub.sys.mjs': typeof import('resource:///modules/asrouter/MomentsPageHub.sys.mjs'); - 'resource:///modules/asrouter/OnboardingMessageProvider.sys.mjs': typeof import('resource:///modules/asrouter/OnboardingMessageProvider.sys.mjs'); - 'resource:///modules/asrouter/PageEventManager.sys.mjs': typeof import('resource:///modules/asrouter/PageEventManager.sys.mjs'); - 'resource:///modules/asrouter/PanelTestProvider.sys.mjs': typeof import('resource:///modules/asrouter/PanelTestProvider.sys.mjs'); - 'resource:///modules/asrouter/RemoteL10n.sys.mjs': typeof import('resource:///modules/asrouter/RemoteL10n.sys.mjs'); - 'resource:///modules/asrouter/Spotlight.sys.mjs': typeof import('resource:///modules/asrouter/Spotlight.sys.mjs'); - 'resource:///modules/asrouter/ToastNotification.sys.mjs': typeof import('resource:///modules/asrouter/ToastNotification.sys.mjs'); - 'resource:///modules/asrouter/ToolbarBadgeHub.sys.mjs': typeof import('resource:///modules/asrouter/ToolbarBadgeHub.sys.mjs'); - 'resource:///modules/backup/AddonsBackupResource.sys.mjs': typeof import('resource:///modules/backup/AddonsBackupResource.sys.mjs'); - 'resource:///modules/backup/ArchiveEncryption.sys.mjs': typeof import('resource:///modules/backup/ArchiveEncryption.sys.mjs'); - 'resource:///modules/backup/ArchiveEncryptionState.sys.mjs': typeof import('resource:///modules/backup/ArchiveEncryptionState.sys.mjs'); - 'resource:///modules/backup/ArchiveUtils.sys.mjs': typeof import('resource:///modules/backup/ArchiveUtils.sys.mjs'); - 'resource:///modules/backup/BackupError.mjs': typeof import('resource:///modules/backup/BackupError.mjs'); - 'resource:///modules/backup/BackupResource.sys.mjs': typeof import('resource:///modules/backup/BackupResource.sys.mjs'); - 'resource:///modules/backup/BackupService.sys.mjs': typeof import('resource:///modules/backup/BackupService.sys.mjs'); - 'resource:///modules/backup/CookiesBackupResource.sys.mjs': typeof import('resource:///modules/backup/CookiesBackupResource.sys.mjs'); - 'resource:///modules/backup/CredentialsAndSecurityBackupResource.sys.mjs': typeof import('resource:///modules/backup/CredentialsAndSecurityBackupResource.sys.mjs'); - 'resource:///modules/backup/FormHistoryBackupResource.sys.mjs': typeof import('resource:///modules/backup/FormHistoryBackupResource.sys.mjs'); - 'resource:///modules/backup/MeasurementUtils.sys.mjs': typeof import('resource:///modules/backup/MeasurementUtils.sys.mjs'); - 'resource:///modules/backup/MiscDataBackupResource.sys.mjs': typeof import('resource:///modules/backup/MiscDataBackupResource.sys.mjs'); - 'resource:///modules/backup/PlacesBackupResource.sys.mjs': typeof import('resource:///modules/backup/PlacesBackupResource.sys.mjs'); - 'resource:///modules/backup/PreferencesBackupResource.sys.mjs': typeof import('resource:///modules/backup/PreferencesBackupResource.sys.mjs'); - 'resource:///modules/backup/SessionStoreBackupResource.sys.mjs': typeof import('resource:///modules/backup/SessionStoreBackupResource.sys.mjs'); - 'resource:///modules/distribution.sys.mjs': typeof import('resource:///modules/distribution.sys.mjs'); - 'resource:///modules/firefox-view-synced-tabs-error-handler.sys.mjs': typeof import('resource:///modules/firefox-view-synced-tabs-error-handler.sys.mjs'); - 'resource:///modules/firefox-view-tabs-setup-manager.sys.mjs': typeof import('resource:///modules/firefox-view-tabs-setup-manager.sys.mjs'); - 'resource:///modules/ipprotection/GuardianClient.sys.mjs': typeof import('resource:///modules/ipprotection/GuardianClient.sys.mjs'); - 'resource:///modules/ipprotection/IPPChannelFilter.sys.mjs': typeof import('resource:///modules/ipprotection/IPPChannelFilter.sys.mjs'); - 'resource:///modules/ipprotection/IPPExceptionsManager.sys.mjs': typeof import('resource:///modules/ipprotection/IPPExceptionsManager.sys.mjs'); - 'resource:///modules/ipprotection/IPPNetworkErrorObserver.sys.mjs': typeof import('resource:///modules/ipprotection/IPPNetworkErrorObserver.sys.mjs'); - 'resource:///modules/ipprotection/IPPNimbusHelper.sys.mjs': typeof import('resource:///modules/ipprotection/IPPNimbusHelper.sys.mjs'); - 'resource:///modules/ipprotection/IPPProxyManager.sys.mjs': typeof import('resource:///modules/ipprotection/IPPProxyManager.sys.mjs'); - 'resource:///modules/ipprotection/IPPSignInWatcher.sys.mjs': typeof import('resource:///modules/ipprotection/IPPSignInWatcher.sys.mjs'); - 'resource:///modules/ipprotection/IPPStartupCache.sys.mjs': typeof import('resource:///modules/ipprotection/IPPStartupCache.sys.mjs'); - 'resource:///modules/ipprotection/IPProtection.sys.mjs': typeof import('resource:///modules/ipprotection/IPProtection.sys.mjs'); - 'resource:///modules/ipprotection/IPProtectionHelpers.sys.mjs': typeof import('resource:///modules/ipprotection/IPProtectionHelpers.sys.mjs'); - 'resource:///modules/ipprotection/IPProtectionPanel.sys.mjs': typeof import('resource:///modules/ipprotection/IPProtectionPanel.sys.mjs'); - 'resource:///modules/ipprotection/IPProtectionServerlist.sys.mjs': typeof import('resource:///modules/ipprotection/IPProtectionServerlist.sys.mjs'); - 'resource:///modules/ipprotection/IPProtectionService.sys.mjs': typeof import('resource:///modules/ipprotection/IPProtectionService.sys.mjs'); - 'resource:///modules/ipprotection/IPProtectionUsage.sys.mjs': typeof import('resource:///modules/ipprotection/IPProtectionUsage.sys.mjs'); - 'resource:///modules/policies/BookmarksPolicies.sys.mjs': typeof import('resource:///modules/policies/BookmarksPolicies.sys.mjs'); - 'resource:///modules/policies/Policies.sys.mjs': typeof import('resource:///modules/policies/Policies.sys.mjs'); - 'resource:///modules/policies/ProxyPolicies.sys.mjs': typeof import('resource:///modules/policies/ProxyPolicies.sys.mjs'); - 'resource:///modules/policies/WebsiteFilter.sys.mjs': typeof import('resource:///modules/policies/WebsiteFilter.sys.mjs'); - 'resource:///modules/policies/schema.sys.mjs': typeof import('resource:///modules/policies/schema.sys.mjs'); - 'resource:///modules/profiles/SelectableProfile.sys.mjs': typeof import('resource:///modules/profiles/SelectableProfile.sys.mjs'); - 'resource:///modules/profiles/SelectableProfileService.sys.mjs': typeof import('resource:///modules/profiles/SelectableProfileService.sys.mjs'); - 'resource:///modules/sessionstore/PageWireframes.sys.mjs': typeof import('resource:///modules/sessionstore/PageWireframes.sys.mjs'); - 'resource:///modules/sessionstore/RecentlyClosedTabsAndWindowsMenuUtils.sys.mjs': typeof import('resource:///modules/sessionstore/RecentlyClosedTabsAndWindowsMenuUtils.sys.mjs'); - 'resource:///modules/sessionstore/RunState.sys.mjs': typeof import('resource:///modules/sessionstore/RunState.sys.mjs'); - 'resource:///modules/sessionstore/SessionCookies.sys.mjs': typeof import('resource:///modules/sessionstore/SessionCookies.sys.mjs'); - 'resource:///modules/sessionstore/SessionFile.sys.mjs': typeof import('resource:///modules/sessionstore/SessionFile.sys.mjs'); - 'resource:///modules/sessionstore/SessionLogger.sys.mjs': typeof import('resource:///modules/sessionstore/SessionLogger.sys.mjs'); - 'resource:///modules/sessionstore/SessionMigration.sys.mjs': typeof import('resource:///modules/sessionstore/SessionMigration.sys.mjs'); - 'resource:///modules/sessionstore/SessionSaver.sys.mjs': typeof import('resource:///modules/sessionstore/SessionSaver.sys.mjs'); - 'resource:///modules/sessionstore/SessionStartup.sys.mjs': typeof import('resource:///modules/sessionstore/SessionStartup.sys.mjs'); - 'resource:///modules/sessionstore/SessionStore.sys.mjs': typeof import('resource:///modules/sessionstore/SessionStore.sys.mjs'); - 'resource:///modules/sessionstore/SessionWindowUI.sys.mjs': typeof import('resource:///modules/sessionstore/SessionWindowUI.sys.mjs'); - 'resource:///modules/sessionstore/SessionWriter.sys.mjs': typeof import('resource:///modules/sessionstore/SessionWriter.sys.mjs'); - 'resource:///modules/sessionstore/StartupPerformance.sys.mjs': typeof import('resource:///modules/sessionstore/StartupPerformance.sys.mjs'); - 'resource:///modules/sessionstore/TabAttributes.sys.mjs': typeof import('resource:///modules/sessionstore/TabAttributes.sys.mjs'); - 'resource:///modules/sessionstore/TabGroupState.sys.mjs': typeof import('resource:///modules/sessionstore/TabGroupState.sys.mjs'); - 'resource:///modules/sessionstore/TabState.sys.mjs': typeof import('resource:///modules/sessionstore/TabState.sys.mjs'); - 'resource:///modules/sessionstore/TabStateCache.sys.mjs': typeof import('resource:///modules/sessionstore/TabStateCache.sys.mjs'); - 'resource:///modules/sessionstore/TabStateFlusher.sys.mjs': typeof import('resource:///modules/sessionstore/TabStateFlusher.sys.mjs'); - 'resource:///modules/syncedtabs/EventEmitter.sys.mjs': typeof import('resource:///modules/syncedtabs/EventEmitter.sys.mjs'); - 'resource:///modules/syncedtabs/SyncedTabsDeckComponent.sys.mjs': typeof import('resource:///modules/syncedtabs/SyncedTabsDeckComponent.sys.mjs'); - 'resource:///modules/syncedtabs/SyncedTabsDeckStore.sys.mjs': typeof import('resource:///modules/syncedtabs/SyncedTabsDeckStore.sys.mjs'); - 'resource:///modules/syncedtabs/SyncedTabsListStore.sys.mjs': typeof import('resource:///modules/syncedtabs/SyncedTabsListStore.sys.mjs'); - 'resource:///modules/syncedtabs/TabListComponent.sys.mjs': typeof import('resource:///modules/syncedtabs/TabListComponent.sys.mjs'); - 'resource:///modules/taskbartabs/TaskbarTabs.sys.mjs': typeof import('resource:///modules/taskbartabs/TaskbarTabs.sys.mjs'); - 'resource:///modules/taskbartabs/TaskbarTabsChrome.sys.mjs': typeof import('resource:///modules/taskbartabs/TaskbarTabsChrome.sys.mjs'); - 'resource:///modules/taskbartabs/TaskbarTabsPageAction.sys.mjs': typeof import('resource:///modules/taskbartabs/TaskbarTabsPageAction.sys.mjs'); - 'resource:///modules/taskbartabs/TaskbarTabsPin.sys.mjs': typeof import('resource:///modules/taskbartabs/TaskbarTabsPin.sys.mjs'); - 'resource:///modules/taskbartabs/TaskbarTabsRegistry.sys.mjs': typeof import('resource:///modules/taskbartabs/TaskbarTabsRegistry.sys.mjs'); - 'resource:///modules/taskbartabs/TaskbarTabsUtils.sys.mjs': typeof import('resource:///modules/taskbartabs/TaskbarTabsUtils.sys.mjs'); - 'resource:///modules/taskbartabs/TaskbarTabsWindowManager.sys.mjs': typeof import('resource:///modules/taskbartabs/TaskbarTabsWindowManager.sys.mjs'); - 'resource:///modules/topsites/TippyTopProvider.sys.mjs': typeof import('resource:///modules/topsites/TippyTopProvider.sys.mjs'); - 'resource:///modules/topsites/TopSites.sys.mjs': typeof import('resource:///modules/topsites/TopSites.sys.mjs'); - 'resource:///modules/topsites/constants.mjs': typeof import('resource:///modules/topsites/constants.mjs'); - 'resource:///modules/webrtcUI.sys.mjs': typeof import('resource:///modules/webrtcUI.sys.mjs'); - 'resource://autofill/FormAutofill.sys.mjs': typeof import('resource://autofill/FormAutofill.sys.mjs'); - 'resource://autofill/FormAutofillChild.ios.sys.mjs': typeof import('resource://autofill/FormAutofillChild.ios.sys.mjs'); - 'resource://autofill/FormAutofillChild.sys.mjs': typeof import('resource://autofill/FormAutofillChild.sys.mjs'); - 'resource://autofill/FormAutofillContent.sys.mjs': typeof import('resource://autofill/FormAutofillContent.sys.mjs'); - 'resource://autofill/FormAutofillParent.sys.mjs': typeof import('resource://autofill/FormAutofillParent.sys.mjs'); - 'resource://autofill/FormAutofillPreferences.sys.mjs': typeof import('resource://autofill/FormAutofillPreferences.sys.mjs'); - 'resource://autofill/FormAutofillPrompter.sys.mjs': typeof import('resource://autofill/FormAutofillPrompter.sys.mjs'); - 'resource://autofill/FormAutofillStorage.sys.mjs': typeof import('resource://autofill/FormAutofillStorage.sys.mjs'); - 'resource://autofill/FormAutofillStorageBase.sys.mjs': typeof import('resource://autofill/FormAutofillStorageBase.sys.mjs'); - 'resource://autofill/FormAutofillSync.sys.mjs': typeof import('resource://autofill/FormAutofillSync.sys.mjs'); - 'resource://autofill/ProfileAutoCompleteResult.sys.mjs': typeof import('resource://autofill/ProfileAutoCompleteResult.sys.mjs'); - 'resource://devtools/client/framework/browser-toolbox/Launcher.sys.mjs': typeof import('resource://devtools/client/framework/browser-toolbox/Launcher.sys.mjs'); - 'resource://devtools/client/performance-new/popup/logic.sys.mjs': typeof import('resource://devtools/client/performance-new/popup/logic.sys.mjs'); - 'resource://devtools/client/performance-new/popup/menu-button.sys.mjs': typeof import('resource://devtools/client/performance-new/popup/menu-button.sys.mjs'); - 'resource://devtools/client/performance-new/shared/background.sys.mjs': typeof import('resource://devtools/client/performance-new/shared/background.sys.mjs'); - 'resource://devtools/client/shared/components/reps/index.mjs': typeof import('resource://devtools/client/shared/components/reps/index.mjs'); - 'resource://devtools/client/shared/components/reps/reps/array.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/array.mjs'); - 'resource://devtools/client/shared/components/reps/reps/big-int.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/big-int.mjs'); - 'resource://devtools/client/shared/components/reps/reps/constants.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/constants.mjs'); - 'resource://devtools/client/shared/components/reps/reps/element-node.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/element-node.mjs'); - 'resource://devtools/client/shared/components/reps/reps/error.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/error.mjs'); - 'resource://devtools/client/shared/components/reps/reps/grip-array.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/grip-array.mjs'); - 'resource://devtools/client/shared/components/reps/reps/grip-entry.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/grip-entry.mjs'); - 'resource://devtools/client/shared/components/reps/reps/grip-map.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/grip-map.mjs'); - 'resource://devtools/client/shared/components/reps/reps/rep-utils.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/rep-utils.mjs'); - 'resource://devtools/client/shared/components/reps/reps/rep.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/rep.mjs'); - 'resource://devtools/client/shared/components/reps/reps/string.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/string.mjs'); - 'resource://devtools/client/shared/components/reps/reps/text-node.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/text-node.mjs'); - 'resource://devtools/client/shared/components/reps/reps/value-summary-reader.mjs': typeof import('resource://devtools/client/shared/components/reps/reps/value-summary-reader.mjs'); - 'resource://devtools/client/shared/components/tabs/Tabs.mjs': typeof import('resource://devtools/client/shared/components/tabs/Tabs.mjs'); - 'resource://devtools/client/shared/components/tree/LabelCell.mjs': typeof import('resource://devtools/client/shared/components/tree/LabelCell.mjs'); - 'resource://devtools/client/shared/components/tree/ObjectProvider.mjs': typeof import('resource://devtools/client/shared/components/tree/ObjectProvider.mjs'); - 'resource://devtools/client/shared/components/tree/TreeRow.mjs': typeof import('resource://devtools/client/shared/components/tree/TreeRow.mjs'); - 'resource://devtools/client/shared/components/tree/TreeView.mjs': typeof import('resource://devtools/client/shared/components/tree/TreeView.mjs'); - 'resource://devtools/client/shared/focus.mjs': typeof import('resource://devtools/client/shared/focus.mjs'); - 'resource://devtools/client/shared/scroll.mjs': typeof import('resource://devtools/client/shared/scroll.mjs'); - 'resource://devtools/client/shared/sourceeditor/codemirror6/codemirror6.bundle.mjs': typeof import('resource://devtools/client/shared/sourceeditor/codemirror6/codemirror6.bundle.mjs'); - 'resource://devtools/client/storage/VariablesView.sys.mjs': typeof import('resource://devtools/client/storage/VariablesView.sys.mjs'); - 'resource://devtools/client/styleeditor/StyleEditorUI.sys.mjs': typeof import('resource://devtools/client/styleeditor/StyleEditorUI.sys.mjs'); - 'resource://devtools/client/styleeditor/StyleEditorUtil.sys.mjs': typeof import('resource://devtools/client/styleeditor/StyleEditorUtil.sys.mjs'); - 'resource://devtools/server/actors/targets/target-actor-registry.sys.mjs': typeof import('resource://devtools/server/actors/targets/target-actor-registry.sys.mjs'); - 'resource://devtools/server/actors/utils/HTMLSourcesCache.sys.mjs': typeof import('resource://devtools/server/actors/utils/HTMLSourcesCache.sys.mjs'); - 'resource://devtools/server/actors/watcher/ParentProcessWatcherRegistry.sys.mjs': typeof import('resource://devtools/server/actors/watcher/ParentProcessWatcherRegistry.sys.mjs'); - 'resource://devtools/server/actors/watcher/SessionDataHelpers.sys.mjs': typeof import('resource://devtools/server/actors/watcher/SessionDataHelpers.sys.mjs'); - 'resource://devtools/server/actors/watcher/browsing-context-helpers.sys.mjs': typeof import('resource://devtools/server/actors/watcher/browsing-context-helpers.sys.mjs'); - 'resource://devtools/server/connectors/js-process-actor/target-watchers/content_script.sys.mjs': typeof import('resource://devtools/server/connectors/js-process-actor/target-watchers/content_script.sys.mjs'); - 'resource://devtools/server/connectors/js-process-actor/target-watchers/process.sys.mjs': typeof import('resource://devtools/server/connectors/js-process-actor/target-watchers/process.sys.mjs'); - 'resource://devtools/server/connectors/js-process-actor/target-watchers/service_worker.sys.mjs': typeof import('resource://devtools/server/connectors/js-process-actor/target-watchers/service_worker.sys.mjs'); - 'resource://devtools/server/connectors/js-process-actor/target-watchers/shared_worker.sys.mjs': typeof import('resource://devtools/server/connectors/js-process-actor/target-watchers/shared_worker.sys.mjs'); - 'resource://devtools/server/connectors/js-process-actor/target-watchers/window-global.sys.mjs': typeof import('resource://devtools/server/connectors/js-process-actor/target-watchers/window-global.sys.mjs'); - 'resource://devtools/server/connectors/js-process-actor/target-watchers/worker.sys.mjs': typeof import('resource://devtools/server/connectors/js-process-actor/target-watchers/worker.sys.mjs'); - 'resource://devtools/server/startup/content-process.sys.mjs': typeof import('resource://devtools/server/startup/content-process.sys.mjs'); - 'resource://devtools/server/startup/worker.sys.mjs': typeof import('resource://devtools/server/startup/worker.sys.mjs'); - 'resource://devtools/server/tracer/tracer.sys.mjs': typeof import('resource://devtools/server/tracer/tracer.sys.mjs'); - 'resource://devtools/shared/DevToolsInfaillibleUtils.sys.mjs': typeof import('resource://devtools/shared/DevToolsInfaillibleUtils.sys.mjs'); - 'resource://devtools/shared/highlighters.mjs': typeof import('resource://devtools/shared/highlighters.mjs'); - 'resource://devtools/shared/loader/DistinctSystemPrincipalLoader.sys.mjs': typeof import('resource://devtools/shared/loader/DistinctSystemPrincipalLoader.sys.mjs'); - 'resource://devtools/shared/loader/Loader.sys.mjs': typeof import('resource://devtools/shared/loader/Loader.sys.mjs'); - 'resource://devtools/shared/loader/browser-loader.sys.mjs': typeof import('resource://devtools/shared/loader/browser-loader.sys.mjs'); - 'resource://devtools/shared/loader/worker-loader.sys.mjs': typeof import('resource://devtools/shared/loader/worker-loader.sys.mjs'); - 'resource://devtools/shared/network-observer/ChannelMap.sys.mjs': typeof import('resource://devtools/shared/network-observer/ChannelMap.sys.mjs'); - 'resource://devtools/shared/network-observer/NetworkAuthListener.sys.mjs': typeof import('resource://devtools/shared/network-observer/NetworkAuthListener.sys.mjs'); - 'resource://devtools/shared/network-observer/NetworkHelper.sys.mjs': typeof import('resource://devtools/shared/network-observer/NetworkHelper.sys.mjs'); - 'resource://devtools/shared/network-observer/NetworkObserver.sys.mjs': typeof import('resource://devtools/shared/network-observer/NetworkObserver.sys.mjs'); - 'resource://devtools/shared/network-observer/NetworkOverride.sys.mjs': typeof import('resource://devtools/shared/network-observer/NetworkOverride.sys.mjs'); - 'resource://devtools/shared/network-observer/NetworkResponseListener.sys.mjs': typeof import('resource://devtools/shared/network-observer/NetworkResponseListener.sys.mjs'); - 'resource://devtools/shared/network-observer/NetworkThrottleManager.sys.mjs': typeof import('resource://devtools/shared/network-observer/NetworkThrottleManager.sys.mjs'); - 'resource://devtools/shared/network-observer/NetworkTimings.sys.mjs': typeof import('resource://devtools/shared/network-observer/NetworkTimings.sys.mjs'); - 'resource://devtools/shared/network-observer/NetworkUtils.sys.mjs': typeof import('resource://devtools/shared/network-observer/NetworkUtils.sys.mjs'); - 'resource://devtools/shared/network-observer/WildcardToRegexp.sys.mjs': typeof import('resource://devtools/shared/network-observer/WildcardToRegexp.sys.mjs'); - 'resource://devtools/shared/performance-new/errors.sys.mjs': typeof import('resource://devtools/shared/performance-new/errors.sys.mjs'); - 'resource://devtools/shared/performance-new/prefs-presets.sys.mjs': typeof import('resource://devtools/shared/performance-new/prefs-presets.sys.mjs'); - 'resource://devtools/shared/performance-new/recording-utils.sys.mjs': typeof import('resource://devtools/shared/performance-new/recording-utils.sys.mjs'); - 'resource://devtools/shared/performance-new/symbolication.sys.mjs': typeof import('resource://devtools/shared/performance-new/symbolication.sys.mjs'); - 'resource://devtools/shared/platform/CacheEntry.sys.mjs': typeof import('resource://devtools/shared/platform/CacheEntry.sys.mjs'); - 'resource://devtools/shared/security/DevToolsSocketStatus.sys.mjs': typeof import('resource://devtools/shared/security/DevToolsSocketStatus.sys.mjs'); - 'resource://devtools/shared/test-helpers/dump-scope.sys.mjs': typeof import('resource://devtools/shared/test-helpers/dump-scope.sys.mjs'); - 'resource://devtools/shared/test-helpers/tracked-objects.sys.mjs': typeof import('resource://devtools/shared/test-helpers/tracked-objects.sys.mjs'); - 'resource://devtools/shared/validate-breakpoint.sys.mjs': typeof import('resource://devtools/shared/validate-breakpoint.sys.mjs'); - 'resource://devtools/shared/worker/worker.sys.mjs': typeof import('resource://devtools/shared/worker/worker.sys.mjs'); - 'resource://gre/actors/AutoCompleteParent.sys.mjs': typeof import('resource://gre/actors/AutoCompleteParent.sys.mjs'); - 'resource://gre/actors/FormHandlerChild.sys.mjs': typeof import('resource://gre/actors/FormHandlerChild.sys.mjs'); - 'resource://gre/actors/MLEngineParent.sys.mjs': typeof import('resource://gre/actors/MLEngineParent.sys.mjs'); - 'resource://gre/actors/PictureInPictureChild.sys.mjs': typeof import('resource://gre/actors/PictureInPictureChild.sys.mjs'); - 'resource://gre/actors/PopupAndRedirectBlockingParent.sys.mjs': typeof import('resource://gre/actors/PopupAndRedirectBlockingParent.sys.mjs'); - 'resource://gre/actors/SelectChild.sys.mjs': typeof import('resource://gre/actors/SelectChild.sys.mjs'); - 'resource://gre/actors/SelectParent.sys.mjs': typeof import('resource://gre/actors/SelectParent.sys.mjs'); - 'resource://gre/actors/TranslationsParent.sys.mjs': typeof import('resource://gre/actors/TranslationsParent.sys.mjs'); - 'resource://gre/actors/ViewSourcePageChild.sys.mjs': typeof import('resource://gre/actors/ViewSourcePageChild.sys.mjs'); - 'resource://gre/modules/AboutPagesUtils.sys.mjs': typeof import('resource://gre/modules/AboutPagesUtils.sys.mjs'); - 'resource://gre/modules/AbuseReporter.sys.mjs': typeof import('resource://gre/modules/AbuseReporter.sys.mjs'); - 'resource://gre/modules/ActorManagerParent.sys.mjs': typeof import('resource://gre/modules/ActorManagerParent.sys.mjs'); - 'resource://gre/modules/AddonManager.sys.mjs': typeof import('resource://gre/modules/AddonManager.sys.mjs'); - 'resource://gre/modules/AndroidLog.sys.mjs': typeof import('resource://gre/modules/AndroidLog.sys.mjs'); - 'resource://gre/modules/AppConstants.sys.mjs': typeof import('resource://gre/modules/AppConstants.sys.mjs'); - 'resource://gre/modules/AppMenuNotifications.sys.mjs': typeof import('resource://gre/modules/AppMenuNotifications.sys.mjs'); - 'resource://gre/modules/AppServicesTracing.sys.mjs': typeof import('resource://gre/modules/AppServicesTracing.sys.mjs'); - 'resource://gre/modules/AppUpdater.sys.mjs': typeof import('resource://gre/modules/AppUpdater.sys.mjs'); - 'resource://gre/modules/AsanReporter.sys.mjs': typeof import('resource://gre/modules/AsanReporter.sys.mjs'); - 'resource://gre/modules/AsyncPrefs.sys.mjs': typeof import('resource://gre/modules/AsyncPrefs.sys.mjs'); - 'resource://gre/modules/AsyncShutdown.sys.mjs': typeof import('resource://gre/modules/AsyncShutdown.sys.mjs'); - 'resource://gre/modules/BackgroundPageThumbs.sys.mjs': typeof import('resource://gre/modules/BackgroundPageThumbs.sys.mjs'); - 'resource://gre/modules/BackgroundTasksManager.sys.mjs': typeof import('resource://gre/modules/BackgroundTasksManager.sys.mjs'); - 'resource://gre/modules/BackgroundTasksUtils.sys.mjs': typeof import('resource://gre/modules/BackgroundTasksUtils.sys.mjs'); - 'resource://gre/modules/BackgroundUpdate.sys.mjs': typeof import('resource://gre/modules/BackgroundUpdate.sys.mjs'); - 'resource://gre/modules/BinarySearch.sys.mjs': typeof import('resource://gre/modules/BinarySearch.sys.mjs'); - 'resource://gre/modules/Bits.sys.mjs': typeof import('resource://gre/modules/Bits.sys.mjs'); - 'resource://gre/modules/Blocklist.sys.mjs': typeof import('resource://gre/modules/Blocklist.sys.mjs'); - 'resource://gre/modules/BookmarkHTMLUtils.sys.mjs': typeof import('resource://gre/modules/BookmarkHTMLUtils.sys.mjs'); - 'resource://gre/modules/BookmarkJSONUtils.sys.mjs': typeof import('resource://gre/modules/BookmarkJSONUtils.sys.mjs'); - 'resource://gre/modules/BookmarkList.sys.mjs': typeof import('resource://gre/modules/BookmarkList.sys.mjs'); - 'resource://gre/modules/Bookmarks.sys.mjs': typeof import('resource://gre/modules/Bookmarks.sys.mjs'); - 'resource://gre/modules/BrowserTelemetryUtils.sys.mjs': typeof import('resource://gre/modules/BrowserTelemetryUtils.sys.mjs'); - 'resource://gre/modules/BrowserUtils.sys.mjs': typeof import('resource://gre/modules/BrowserUtils.sys.mjs'); - 'resource://gre/modules/CSV.sys.mjs': typeof import('resource://gre/modules/CSV.sys.mjs'); - 'resource://gre/modules/CanonicalJSON.sys.mjs': typeof import('resource://gre/modules/CanonicalJSON.sys.mjs'); - 'resource://gre/modules/CaptchaDetectionPingUtils.sys.mjs': typeof import('resource://gre/modules/CaptchaDetectionPingUtils.sys.mjs'); - 'resource://gre/modules/CaptchaResponseObserver.sys.mjs': typeof import('resource://gre/modules/CaptchaResponseObserver.sys.mjs'); - 'resource://gre/modules/CertUtils.sys.mjs': typeof import('resource://gre/modules/CertUtils.sys.mjs'); - 'resource://gre/modules/ChildCrashHandler.sys.mjs': typeof import('resource://gre/modules/ChildCrashHandler.sys.mjs'); - 'resource://gre/modules/ChromePushSubscription.sys.mjs': typeof import('resource://gre/modules/ChromePushSubscription.sys.mjs'); - 'resource://gre/modules/ClientID.sys.mjs': typeof import('resource://gre/modules/ClientID.sys.mjs'); - 'resource://gre/modules/ClipboardContextMenu.sys.mjs': typeof import('resource://gre/modules/ClipboardContextMenu.sys.mjs'); - 'resource://gre/modules/Color.sys.mjs': typeof import('resource://gre/modules/Color.sys.mjs'); - 'resource://gre/modules/ColorwayThemeMigration.sys.mjs': typeof import('resource://gre/modules/ColorwayThemeMigration.sys.mjs'); - 'resource://gre/modules/CommonDialog.sys.mjs': typeof import('resource://gre/modules/CommonDialog.sys.mjs'); - 'resource://gre/modules/ComponentUtils.sys.mjs': typeof import('resource://gre/modules/ComponentUtils.sys.mjs'); - 'resource://gre/modules/ConduitsParent.sys.mjs': typeof import('resource://gre/modules/ConduitsParent.sys.mjs'); - 'resource://gre/modules/Console.sys.mjs': typeof import('resource://gre/modules/Console.sys.mjs'); - 'resource://gre/modules/ContentAnalysisUtils.sys.mjs': typeof import('resource://gre/modules/ContentAnalysisUtils.sys.mjs'); - 'resource://gre/modules/ContentBlockingAllowList.sys.mjs': typeof import('resource://gre/modules/ContentBlockingAllowList.sys.mjs'); - 'resource://gre/modules/ContentDOMReference.sys.mjs': typeof import('resource://gre/modules/ContentDOMReference.sys.mjs'); - 'resource://gre/modules/ContentPrefServiceChild.sys.mjs': typeof import('resource://gre/modules/ContentPrefServiceChild.sys.mjs'); - 'resource://gre/modules/ContentPrefUtils.sys.mjs': typeof import('resource://gre/modules/ContentPrefUtils.sys.mjs'); - 'resource://gre/modules/ContentRelevancyManager.sys.mjs': typeof import('resource://gre/modules/ContentRelevancyManager.sys.mjs'); - 'resource://gre/modules/ContextualIdentityService.sys.mjs': typeof import('resource://gre/modules/ContextualIdentityService.sys.mjs'); - 'resource://gre/modules/CoveragePing.sys.mjs': typeof import('resource://gre/modules/CoveragePing.sys.mjs'); - 'resource://gre/modules/CrashManager.sys.mjs': typeof import('resource://gre/modules/CrashManager.sys.mjs'); - 'resource://gre/modules/CrashMonitor.sys.mjs': typeof import('resource://gre/modules/CrashMonitor.sys.mjs'); - 'resource://gre/modules/CrashReports.sys.mjs': typeof import('resource://gre/modules/CrashReports.sys.mjs'); - 'resource://gre/modules/CrashService.sys.mjs': typeof import('resource://gre/modules/CrashService.sys.mjs'); - 'resource://gre/modules/CrashSubmit.sys.mjs': typeof import('resource://gre/modules/CrashSubmit.sys.mjs'); - 'resource://gre/modules/Credentials.sys.mjs': typeof import('resource://gre/modules/Credentials.sys.mjs'); - 'resource://gre/modules/CreditCard.sys.mjs': typeof import('resource://gre/modules/CreditCard.sys.mjs'); - 'resource://gre/modules/CustomElementsListener.sys.mjs': typeof import('resource://gre/modules/CustomElementsListener.sys.mjs'); - 'resource://gre/modules/DAPIncrementality.sys.mjs': typeof import('resource://gre/modules/DAPIncrementality.sys.mjs'); - 'resource://gre/modules/DAPReportController.sys.mjs': typeof import('resource://gre/modules/DAPReportController.sys.mjs'); - 'resource://gre/modules/DAPTelemetrySender.sys.mjs': typeof import('resource://gre/modules/DAPTelemetrySender.sys.mjs'); - 'resource://gre/modules/DAPVisitCounter.sys.mjs': typeof import('resource://gre/modules/DAPVisitCounter.sys.mjs'); - 'resource://gre/modules/DateTimePickerPanel.sys.mjs': typeof import('resource://gre/modules/DateTimePickerPanel.sys.mjs'); - 'resource://gre/modules/DeferredTask.sys.mjs': typeof import('resource://gre/modules/DeferredTask.sys.mjs'); - 'resource://gre/modules/DelayedInit.sys.mjs': typeof import('resource://gre/modules/DelayedInit.sys.mjs'); - 'resource://gre/modules/DownloadCore.sys.mjs': typeof import('resource://gre/modules/DownloadCore.sys.mjs'); - 'resource://gre/modules/DownloadHistory.sys.mjs': typeof import('resource://gre/modules/DownloadHistory.sys.mjs'); - 'resource://gre/modules/DownloadIntegration.sys.mjs': typeof import('resource://gre/modules/DownloadIntegration.sys.mjs'); - 'resource://gre/modules/DownloadLastDir.sys.mjs': typeof import('resource://gre/modules/DownloadLastDir.sys.mjs'); - 'resource://gre/modules/DownloadList.sys.mjs': typeof import('resource://gre/modules/DownloadList.sys.mjs'); - 'resource://gre/modules/DownloadPaths.sys.mjs': typeof import('resource://gre/modules/DownloadPaths.sys.mjs'); - 'resource://gre/modules/DownloadStore.sys.mjs': typeof import('resource://gre/modules/DownloadStore.sys.mjs'); - 'resource://gre/modules/DownloadUIHelper.sys.mjs': typeof import('resource://gre/modules/DownloadUIHelper.sys.mjs'); - 'resource://gre/modules/DownloadUtils.sys.mjs': typeof import('resource://gre/modules/DownloadUtils.sys.mjs'); - 'resource://gre/modules/Downloads.sys.mjs': typeof import('resource://gre/modules/Downloads.sys.mjs'); - 'resource://gre/modules/E10SUtils.sys.mjs': typeof import('resource://gre/modules/E10SUtils.sys.mjs'); - 'resource://gre/modules/EnterprisePoliciesContent.sys.mjs': typeof import('resource://gre/modules/EnterprisePoliciesContent.sys.mjs'); - 'resource://gre/modules/EnterprisePoliciesParent.sys.mjs': typeof import('resource://gre/modules/EnterprisePoliciesParent.sys.mjs'); - 'resource://gre/modules/EssentialDomainsRemoteSettings.sys.mjs': typeof import('resource://gre/modules/EssentialDomainsRemoteSettings.sys.mjs'); - 'resource://gre/modules/EventEmitter.sys.mjs': typeof import('resource://gre/modules/EventEmitter.sys.mjs'); - 'resource://gre/modules/EventPing.sys.mjs': typeof import('resource://gre/modules/EventPing.sys.mjs'); - 'resource://gre/modules/Extension.sys.mjs': typeof import('resource://gre/modules/Extension.sys.mjs'); - 'resource://gre/modules/ExtensionActions.sys.mjs': typeof import('resource://gre/modules/ExtensionActions.sys.mjs'); - 'resource://gre/modules/ExtensionActivityLog.sys.mjs': typeof import('resource://gre/modules/ExtensionActivityLog.sys.mjs'); - 'resource://gre/modules/ExtensionChild.sys.mjs': typeof import('resource://gre/modules/ExtensionChild.sys.mjs'); - 'resource://gre/modules/ExtensionChildDevToolsUtils.sys.mjs': typeof import('resource://gre/modules/ExtensionChildDevToolsUtils.sys.mjs'); - 'resource://gre/modules/ExtensionCommon.sys.mjs': typeof import('resource://gre/modules/ExtensionCommon.sys.mjs'); - 'resource://gre/modules/ExtensionContent.sys.mjs': typeof import('resource://gre/modules/ExtensionContent.sys.mjs'); - 'resource://gre/modules/ExtensionDNR.sys.mjs': typeof import('resource://gre/modules/ExtensionDNR.sys.mjs'); - 'resource://gre/modules/ExtensionDNRLimits.sys.mjs': typeof import('resource://gre/modules/ExtensionDNRLimits.sys.mjs'); - 'resource://gre/modules/ExtensionDNRStore.sys.mjs': typeof import('resource://gre/modules/ExtensionDNRStore.sys.mjs'); - 'resource://gre/modules/ExtensionMenus.sys.mjs': typeof import('resource://gre/modules/ExtensionMenus.sys.mjs'); - 'resource://gre/modules/ExtensionPageChild.sys.mjs': typeof import('resource://gre/modules/ExtensionPageChild.sys.mjs'); - 'resource://gre/modules/ExtensionParent.sys.mjs': typeof import('resource://gre/modules/ExtensionParent.sys.mjs'); - 'resource://gre/modules/ExtensionPermissionMessages.sys.mjs': typeof import('resource://gre/modules/ExtensionPermissionMessages.sys.mjs'); - 'resource://gre/modules/ExtensionPermissions.sys.mjs': typeof import('resource://gre/modules/ExtensionPermissions.sys.mjs'); - 'resource://gre/modules/ExtensionPreferencesManager.sys.mjs': typeof import('resource://gre/modules/ExtensionPreferencesManager.sys.mjs'); - 'resource://gre/modules/ExtensionProcessScript.sys.mjs': typeof import('resource://gre/modules/ExtensionProcessScript.sys.mjs'); - 'resource://gre/modules/ExtensionScriptingStore.sys.mjs': typeof import('resource://gre/modules/ExtensionScriptingStore.sys.mjs'); - 'resource://gre/modules/ExtensionSearchHandler.sys.mjs': typeof import('resource://gre/modules/ExtensionSearchHandler.sys.mjs'); - 'resource://gre/modules/ExtensionSettingsStore.sys.mjs': typeof import('resource://gre/modules/ExtensionSettingsStore.sys.mjs'); - 'resource://gre/modules/ExtensionShortcuts.sys.mjs': typeof import('resource://gre/modules/ExtensionShortcuts.sys.mjs'); - 'resource://gre/modules/ExtensionStorage.sys.mjs': typeof import('resource://gre/modules/ExtensionStorage.sys.mjs'); - 'resource://gre/modules/ExtensionStorageComponents.sys.mjs': typeof import('resource://gre/modules/ExtensionStorageComponents.sys.mjs'); - 'resource://gre/modules/ExtensionStorageIDB.sys.mjs': typeof import('resource://gre/modules/ExtensionStorageIDB.sys.mjs'); - 'resource://gre/modules/ExtensionStorageSync.sys.mjs': typeof import('resource://gre/modules/ExtensionStorageSync.sys.mjs'); - 'resource://gre/modules/ExtensionStorageSyncKinto.sys.mjs': typeof import('resource://gre/modules/ExtensionStorageSyncKinto.sys.mjs'); - 'resource://gre/modules/ExtensionTaskScheduler.sys.mjs': typeof import('resource://gre/modules/ExtensionTaskScheduler.sys.mjs'); - 'resource://gre/modules/ExtensionTelemetry.sys.mjs': typeof import('resource://gre/modules/ExtensionTelemetry.sys.mjs'); - 'resource://gre/modules/ExtensionUserScripts.sys.mjs': typeof import('resource://gre/modules/ExtensionUserScripts.sys.mjs'); - 'resource://gre/modules/ExtensionUserScriptsContent.sys.mjs': typeof import('resource://gre/modules/ExtensionUserScriptsContent.sys.mjs'); - 'resource://gre/modules/ExtensionUtils.sys.mjs': typeof import('resource://gre/modules/ExtensionUtils.sys.mjs'); - 'resource://gre/modules/ExtensionWorkerChild.sys.mjs': typeof import('resource://gre/modules/ExtensionWorkerChild.sys.mjs'); - 'resource://gre/modules/FileUtils.sys.mjs': typeof import('resource://gre/modules/FileUtils.sys.mjs'); - 'resource://gre/modules/FillHelpers.sys.mjs': typeof import('resource://gre/modules/FillHelpers.sys.mjs'); - 'resource://gre/modules/FindBarContent.sys.mjs': typeof import('resource://gre/modules/FindBarContent.sys.mjs'); - 'resource://gre/modules/FindContent.sys.mjs': typeof import('resource://gre/modules/FindContent.sys.mjs'); - 'resource://gre/modules/Finder.sys.mjs': typeof import('resource://gre/modules/Finder.sys.mjs'); - 'resource://gre/modules/FinderHighlighter.sys.mjs': typeof import('resource://gre/modules/FinderHighlighter.sys.mjs'); - 'resource://gre/modules/FinderIterator.sys.mjs': typeof import('resource://gre/modules/FinderIterator.sys.mjs'); - 'resource://gre/modules/FinderParent.sys.mjs': typeof import('resource://gre/modules/FinderParent.sys.mjs'); - 'resource://gre/modules/FinderSound.sys.mjs': typeof import('resource://gre/modules/FinderSound.sys.mjs'); - 'resource://gre/modules/FirefoxRelay.sys.mjs': typeof import('resource://gre/modules/FirefoxRelay.sys.mjs'); - 'resource://gre/modules/FirstStartup.sys.mjs': typeof import('resource://gre/modules/FirstStartup.sys.mjs'); - 'resource://gre/modules/ForgetAboutSite.sys.mjs': typeof import('resource://gre/modules/ForgetAboutSite.sys.mjs'); - 'resource://gre/modules/FormHistory.sys.mjs': typeof import('resource://gre/modules/FormHistory.sys.mjs'); - 'resource://gre/modules/FormHistoryAutoComplete.sys.mjs': typeof import('resource://gre/modules/FormHistoryAutoComplete.sys.mjs'); - 'resource://gre/modules/FormLikeFactory.sys.mjs': typeof import('resource://gre/modules/FormLikeFactory.sys.mjs'); - 'resource://gre/modules/FormScenarios.sys.mjs': typeof import('resource://gre/modules/FormScenarios.sys.mjs'); - 'resource://gre/modules/FxAccounts.sys.mjs': typeof import('resource://gre/modules/FxAccounts.sys.mjs'); - 'resource://gre/modules/FxAccountsClient.sys.mjs': typeof import('resource://gre/modules/FxAccountsClient.sys.mjs'); - 'resource://gre/modules/FxAccountsCommands.sys.mjs': typeof import('resource://gre/modules/FxAccountsCommands.sys.mjs'); - 'resource://gre/modules/FxAccountsCommon.sys.mjs': typeof import('resource://gre/modules/FxAccountsCommon.sys.mjs'); - 'resource://gre/modules/FxAccountsConfig.sys.mjs': typeof import('resource://gre/modules/FxAccountsConfig.sys.mjs'); - 'resource://gre/modules/FxAccountsDevice.sys.mjs': typeof import('resource://gre/modules/FxAccountsDevice.sys.mjs'); - 'resource://gre/modules/FxAccountsKeys.sys.mjs': typeof import('resource://gre/modules/FxAccountsKeys.sys.mjs'); - 'resource://gre/modules/FxAccountsOAuth.sys.mjs': typeof import('resource://gre/modules/FxAccountsOAuth.sys.mjs'); - 'resource://gre/modules/FxAccountsPairing.sys.mjs': typeof import('resource://gre/modules/FxAccountsPairing.sys.mjs'); - 'resource://gre/modules/FxAccountsPairingChannel.sys.mjs': typeof import('resource://gre/modules/FxAccountsPairingChannel.sys.mjs'); - 'resource://gre/modules/FxAccountsProfile.sys.mjs': typeof import('resource://gre/modules/FxAccountsProfile.sys.mjs'); - 'resource://gre/modules/FxAccountsProfileClient.sys.mjs': typeof import('resource://gre/modules/FxAccountsProfileClient.sys.mjs'); - 'resource://gre/modules/FxAccountsPush.sys.mjs': typeof import('resource://gre/modules/FxAccountsPush.sys.mjs'); - 'resource://gre/modules/FxAccountsStorage.sys.mjs': typeof import('resource://gre/modules/FxAccountsStorage.sys.mjs'); - 'resource://gre/modules/FxAccountsTelemetry.sys.mjs': typeof import('resource://gre/modules/FxAccountsTelemetry.sys.mjs'); - 'resource://gre/modules/FxAccountsWebChannel.sys.mjs': typeof import('resource://gre/modules/FxAccountsWebChannel.sys.mjs'); - 'resource://gre/modules/GMPInstallManager.sys.mjs': typeof import('resource://gre/modules/GMPInstallManager.sys.mjs'); - 'resource://gre/modules/GMPUtils.sys.mjs': typeof import('resource://gre/modules/GMPUtils.sys.mjs'); - 'resource://gre/modules/GeckoViewActorManager.sys.mjs': typeof import('resource://gre/modules/GeckoViewActorManager.sys.mjs'); - 'resource://gre/modules/GeckoViewAutocomplete.sys.mjs': typeof import('resource://gre/modules/GeckoViewAutocomplete.sys.mjs'); - 'resource://gre/modules/GeckoViewAutofill.sys.mjs': typeof import('resource://gre/modules/GeckoViewAutofill.sys.mjs'); - 'resource://gre/modules/GeckoViewChildModule.sys.mjs': typeof import('resource://gre/modules/GeckoViewChildModule.sys.mjs'); - 'resource://gre/modules/GeckoViewClipboardPermission.sys.mjs': typeof import('resource://gre/modules/GeckoViewClipboardPermission.sys.mjs'); - 'resource://gre/modules/GeckoViewIdentityCredential.sys.mjs': typeof import('resource://gre/modules/GeckoViewIdentityCredential.sys.mjs'); - 'resource://gre/modules/GeckoViewPrompter.sys.mjs': typeof import('resource://gre/modules/GeckoViewPrompter.sys.mjs'); - 'resource://gre/modules/GeckoViewSettings.sys.mjs': typeof import('resource://gre/modules/GeckoViewSettings.sys.mjs'); - 'resource://gre/modules/GeckoViewTab.sys.mjs': typeof import('resource://gre/modules/GeckoViewTab.sys.mjs'); - 'resource://gre/modules/GeckoViewTelemetry.sys.mjs': typeof import('resource://gre/modules/GeckoViewTelemetry.sys.mjs'); - 'resource://gre/modules/GeckoViewTestUtils.sys.mjs': typeof import('resource://gre/modules/GeckoViewTestUtils.sys.mjs'); - 'resource://gre/modules/GeckoViewUtils.sys.mjs': typeof import('resource://gre/modules/GeckoViewUtils.sys.mjs'); - 'resource://gre/modules/GeckoViewWebExtension.sys.mjs': typeof import('resource://gre/modules/GeckoViewWebExtension.sys.mjs'); - 'resource://gre/modules/Geometry.sys.mjs': typeof import('resource://gre/modules/Geometry.sys.mjs'); - 'resource://gre/modules/HPKEConfigManager.sys.mjs': typeof import('resource://gre/modules/HPKEConfigManager.sys.mjs'); - 'resource://gre/modules/HealthPing.sys.mjs': typeof import('resource://gre/modules/HealthPing.sys.mjs'); - 'resource://gre/modules/HiddenFrame.sys.mjs': typeof import('resource://gre/modules/HiddenFrame.sys.mjs'); - 'resource://gre/modules/History.sys.mjs': typeof import('resource://gre/modules/History.sys.mjs'); - 'resource://gre/modules/IgnoreLists.sys.mjs': typeof import('resource://gre/modules/IgnoreLists.sys.mjs'); - 'resource://gre/modules/IndexedDB.sys.mjs': typeof import('resource://gre/modules/IndexedDB.sys.mjs'); - 'resource://gre/modules/InlineSpellChecker.sys.mjs': typeof import('resource://gre/modules/InlineSpellChecker.sys.mjs'); - 'resource://gre/modules/InlineSpellCheckerContent.sys.mjs': typeof import('resource://gre/modules/InlineSpellCheckerContent.sys.mjs'); - 'resource://gre/modules/InsecurePasswordUtils.sys.mjs': typeof import('resource://gre/modules/InsecurePasswordUtils.sys.mjs'); - 'resource://gre/modules/Integration.sys.mjs': typeof import('resource://gre/modules/Integration.sys.mjs'); - 'resource://gre/modules/JSONFile.sys.mjs': typeof import('resource://gre/modules/JSONFile.sys.mjs'); - 'resource://gre/modules/JsonSchema.sys.mjs': typeof import('resource://gre/modules/JsonSchema.sys.mjs'); - 'resource://gre/modules/KeywordUtils.sys.mjs': typeof import('resource://gre/modules/KeywordUtils.sys.mjs'); - 'resource://gre/modules/LangPackMatcher.sys.mjs': typeof import('resource://gre/modules/LangPackMatcher.sys.mjs'); - 'resource://gre/modules/LayoutUtils.sys.mjs': typeof import('resource://gre/modules/LayoutUtils.sys.mjs'); - 'resource://gre/modules/LightweightThemeConsumer.sys.mjs': typeof import('resource://gre/modules/LightweightThemeConsumer.sys.mjs'); - 'resource://gre/modules/LightweightThemeManager.sys.mjs': typeof import('resource://gre/modules/LightweightThemeManager.sys.mjs'); - 'resource://gre/modules/LoadURIDelegate.sys.mjs': typeof import('resource://gre/modules/LoadURIDelegate.sys.mjs'); - 'resource://gre/modules/LocationHelper.sys.mjs': typeof import('resource://gre/modules/LocationHelper.sys.mjs'); - 'resource://gre/modules/Log.sys.mjs': typeof import('resource://gre/modules/Log.sys.mjs'); - 'resource://gre/modules/LogManager.sys.mjs': typeof import('resource://gre/modules/LogManager.sys.mjs'); - 'resource://gre/modules/LoginAutoComplete.sys.mjs': typeof import('resource://gre/modules/LoginAutoComplete.sys.mjs'); - 'resource://gre/modules/LoginCSVImport.sys.mjs': typeof import('resource://gre/modules/LoginCSVImport.sys.mjs'); - 'resource://gre/modules/LoginExport.sys.mjs': typeof import('resource://gre/modules/LoginExport.sys.mjs'); - 'resource://gre/modules/LoginHelper.sys.mjs': typeof import('resource://gre/modules/LoginHelper.sys.mjs'); - 'resource://gre/modules/LoginManager.shared.sys.mjs': typeof import('resource://gre/modules/LoginManager.shared.sys.mjs'); - 'resource://gre/modules/LoginManager.sys.mjs': typeof import('resource://gre/modules/LoginManager.sys.mjs'); - 'resource://gre/modules/LoginManagerChild.sys.mjs': typeof import('resource://gre/modules/LoginManagerChild.sys.mjs'); - 'resource://gre/modules/LoginManagerContextMenu.sys.mjs': typeof import('resource://gre/modules/LoginManagerContextMenu.sys.mjs'); - 'resource://gre/modules/LoginManagerParent.sys.mjs': typeof import('resource://gre/modules/LoginManagerParent.sys.mjs'); - 'resource://gre/modules/LoginManagerPrompter.sys.mjs': typeof import('resource://gre/modules/LoginManagerPrompter.sys.mjs'); - 'resource://gre/modules/LoginRecipes.sys.mjs': typeof import('resource://gre/modules/LoginRecipes.sys.mjs'); - 'resource://gre/modules/LoginRelatedRealms.sys.mjs': typeof import('resource://gre/modules/LoginRelatedRealms.sys.mjs'); - 'resource://gre/modules/LoginStore.sys.mjs': typeof import('resource://gre/modules/LoginStore.sys.mjs'); - 'resource://gre/modules/Manifest.sys.mjs': typeof import('resource://gre/modules/Manifest.sys.mjs'); - 'resource://gre/modules/ManifestFinder.sys.mjs': typeof import('resource://gre/modules/ManifestFinder.sys.mjs'); - 'resource://gre/modules/ManifestIcons.sys.mjs': typeof import('resource://gre/modules/ManifestIcons.sys.mjs'); - 'resource://gre/modules/ManifestObtainer.sys.mjs': typeof import('resource://gre/modules/ManifestObtainer.sys.mjs'); - 'resource://gre/modules/ManifestProcessor.sys.mjs': typeof import('resource://gre/modules/ManifestProcessor.sys.mjs'); - 'resource://gre/modules/MatchURLFilters.sys.mjs': typeof import('resource://gre/modules/MatchURLFilters.sys.mjs'); - 'resource://gre/modules/MediaUtils.sys.mjs': typeof import('resource://gre/modules/MediaUtils.sys.mjs'); - 'resource://gre/modules/MessageManagerProxy.sys.mjs': typeof import('resource://gre/modules/MessageManagerProxy.sys.mjs'); - 'resource://gre/modules/Messaging.sys.mjs': typeof import('resource://gre/modules/Messaging.sys.mjs'); - 'resource://gre/modules/NLP.sys.mjs': typeof import('resource://gre/modules/NLP.sys.mjs'); - 'resource://gre/modules/NativeManifests.sys.mjs': typeof import('resource://gre/modules/NativeManifests.sys.mjs'); - 'resource://gre/modules/NativeMessaging.sys.mjs': typeof import('resource://gre/modules/NativeMessaging.sys.mjs'); - 'resource://gre/modules/NetUtil.sys.mjs': typeof import('resource://gre/modules/NetUtil.sys.mjs'); - 'resource://gre/modules/NewTabUtils.sys.mjs': typeof import('resource://gre/modules/NewTabUtils.sys.mjs'); - 'resource://gre/modules/OSCrypto_win.sys.mjs': typeof import('resource://gre/modules/OSCrypto_win.sys.mjs'); - 'resource://gre/modules/OSKeyStore.sys.mjs': typeof import('resource://gre/modules/OSKeyStore.sys.mjs'); - 'resource://gre/modules/ObjectUtils.sys.mjs': typeof import('resource://gre/modules/ObjectUtils.sys.mjs'); - 'resource://gre/modules/ObliviousHTTP.sys.mjs': typeof import('resource://gre/modules/ObliviousHTTP.sys.mjs'); - 'resource://gre/modules/OsEnvironment.sys.mjs': typeof import('resource://gre/modules/OsEnvironment.sys.mjs'); - 'resource://gre/modules/PageThumbUtils.sys.mjs': typeof import('resource://gre/modules/PageThumbUtils.sys.mjs'); - 'resource://gre/modules/PageThumbs.sys.mjs': typeof import('resource://gre/modules/PageThumbs.sys.mjs'); - 'resource://gre/modules/PasswordRulesManager.sys.mjs': typeof import('resource://gre/modules/PasswordRulesManager.sys.mjs'); - 'resource://gre/modules/PermissionsUtils.sys.mjs': typeof import('resource://gre/modules/PermissionsUtils.sys.mjs'); - 'resource://gre/modules/PictureInPicture.sys.mjs': typeof import('resource://gre/modules/PictureInPicture.sys.mjs'); - 'resource://gre/modules/PictureInPictureControls.sys.mjs': typeof import('resource://gre/modules/PictureInPictureControls.sys.mjs'); - 'resource://gre/modules/PlacesBackups.sys.mjs': typeof import('resource://gre/modules/PlacesBackups.sys.mjs'); - 'resource://gre/modules/PlacesDBUtils.sys.mjs': typeof import('resource://gre/modules/PlacesDBUtils.sys.mjs'); - 'resource://gre/modules/PlacesPreviews.sys.mjs': typeof import('resource://gre/modules/PlacesPreviews.sys.mjs'); - 'resource://gre/modules/PlacesQuery.sys.mjs': typeof import('resource://gre/modules/PlacesQuery.sys.mjs'); - 'resource://gre/modules/PlacesSemanticHistoryDatabase.sys.mjs': typeof import('resource://gre/modules/PlacesSemanticHistoryDatabase.sys.mjs'); - 'resource://gre/modules/PlacesSemanticHistoryManager.sys.mjs': typeof import('resource://gre/modules/PlacesSemanticHistoryManager.sys.mjs'); - 'resource://gre/modules/PlacesSyncUtils.sys.mjs': typeof import('resource://gre/modules/PlacesSyncUtils.sys.mjs'); - 'resource://gre/modules/PlacesTransactions.sys.mjs': typeof import('resource://gre/modules/PlacesTransactions.sys.mjs'); - 'resource://gre/modules/PlacesUtils.sys.mjs': typeof import('resource://gre/modules/PlacesUtils.sys.mjs'); - 'resource://gre/modules/PopupNotifications.sys.mjs': typeof import('resource://gre/modules/PopupNotifications.sys.mjs'); - 'resource://gre/modules/Preferences.sys.mjs': typeof import('resource://gre/modules/Preferences.sys.mjs'); - 'resource://gre/modules/PrincipalsCollector.sys.mjs': typeof import('resource://gre/modules/PrincipalsCollector.sys.mjs'); - 'resource://gre/modules/PrivateAttributionService.sys.mjs': typeof import('resource://gre/modules/PrivateAttributionService.sys.mjs'); - 'resource://gre/modules/PrivateBrowsingUtils.sys.mjs': typeof import('resource://gre/modules/PrivateBrowsingUtils.sys.mjs'); - 'resource://gre/modules/ProcessType.sys.mjs': typeof import('resource://gre/modules/ProcessType.sys.mjs'); - 'resource://gre/modules/ProfileAge.sys.mjs': typeof import('resource://gre/modules/ProfileAge.sys.mjs'); - 'resource://gre/modules/PromiseWorker.sys.mjs': typeof import('resource://gre/modules/PromiseWorker.sys.mjs'); - 'resource://gre/modules/PromptUtils.sys.mjs': typeof import('resource://gre/modules/PromptUtils.sys.mjs'); - 'resource://gre/modules/PropertyListUtils.sys.mjs': typeof import('resource://gre/modules/PropertyListUtils.sys.mjs'); - 'resource://gre/modules/ProxyChannelFilter.sys.mjs': typeof import('resource://gre/modules/ProxyChannelFilter.sys.mjs'); - 'resource://gre/modules/PushBroadcastService.sys.mjs': typeof import('resource://gre/modules/PushBroadcastService.sys.mjs'); - 'resource://gre/modules/PushCrypto.sys.mjs': typeof import('resource://gre/modules/PushCrypto.sys.mjs'); - 'resource://gre/modules/PushRecord.sys.mjs': typeof import('resource://gre/modules/PushRecord.sys.mjs'); - 'resource://gre/modules/PushService.sys.mjs': typeof import('resource://gre/modules/PushService.sys.mjs'); - 'resource://gre/modules/PushServiceWebSocket.sys.mjs': typeof import('resource://gre/modules/PushServiceWebSocket.sys.mjs'); - 'resource://gre/modules/RFPHelper.sys.mjs': typeof import('resource://gre/modules/RFPHelper.sys.mjs'); - 'resource://gre/modules/Readerable.sys.mjs': typeof import('resource://gre/modules/Readerable.sys.mjs'); - 'resource://gre/modules/Region.sys.mjs': typeof import('resource://gre/modules/Region.sys.mjs'); - 'resource://gre/modules/RemotePageAccessManager.sys.mjs': typeof import('resource://gre/modules/RemotePageAccessManager.sys.mjs'); - 'resource://gre/modules/RemoteSettingsCrashPull.sys.mjs': typeof import('resource://gre/modules/RemoteSettingsCrashPull.sys.mjs'); - 'resource://gre/modules/RemoteWebNavigation.sys.mjs': typeof import('resource://gre/modules/RemoteWebNavigation.sys.mjs'); - 'resource://gre/modules/ResetProfile.sys.mjs': typeof import('resource://gre/modules/ResetProfile.sys.mjs'); - 'resource://gre/modules/RustSharedRemoteSettingsService.sys.mjs': typeof import('resource://gre/modules/RustSharedRemoteSettingsService.sys.mjs'); - 'resource://gre/modules/SafeBrowsing.sys.mjs': typeof import('resource://gre/modules/SafeBrowsing.sys.mjs'); - 'resource://gre/modules/SandboxUtils.sys.mjs': typeof import('resource://gre/modules/SandboxUtils.sys.mjs'); - 'resource://gre/modules/Schemas.sys.mjs': typeof import('resource://gre/modules/Schemas.sys.mjs'); - 'resource://gre/modules/SearchService.sys.mjs': typeof import('resource://gre/modules/SearchService.sys.mjs'); - 'resource://gre/modules/SecurityInfo.sys.mjs': typeof import('resource://gre/modules/SecurityInfo.sys.mjs'); - 'resource://gre/modules/SelectionUtils.sys.mjs': typeof import('resource://gre/modules/SelectionUtils.sys.mjs'); - 'resource://gre/modules/ServiceRequest.sys.mjs': typeof import('resource://gre/modules/ServiceRequest.sys.mjs'); - 'resource://gre/modules/ServiceWorkerCleanUp.sys.mjs': typeof import('resource://gre/modules/ServiceWorkerCleanUp.sys.mjs'); - 'resource://gre/modules/ShortcutUtils.sys.mjs': typeof import('resource://gre/modules/ShortcutUtils.sys.mjs'); - 'resource://gre/modules/Sqlite.sys.mjs': typeof import('resource://gre/modules/Sqlite.sys.mjs'); - 'resource://gre/modules/SubDialog.sys.mjs': typeof import('resource://gre/modules/SubDialog.sys.mjs'); - 'resource://gre/modules/Subprocess.sys.mjs': typeof import('resource://gre/modules/Subprocess.sys.mjs'); - 'resource://gre/modules/SyncedBookmarksMirror.sys.mjs': typeof import('resource://gre/modules/SyncedBookmarksMirror.sys.mjs'); - 'resource://gre/modules/TaskScheduler.sys.mjs': typeof import('resource://gre/modules/TaskScheduler.sys.mjs'); - 'resource://gre/modules/TaskSchedulerMacOSImpl.sys.mjs': typeof import('resource://gre/modules/TaskSchedulerMacOSImpl.sys.mjs'); - 'resource://gre/modules/TaskSchedulerWinImpl.sys.mjs': typeof import('resource://gre/modules/TaskSchedulerWinImpl.sys.mjs'); - 'resource://gre/modules/TelemetryArchive.sys.mjs': typeof import('resource://gre/modules/TelemetryArchive.sys.mjs'); - 'resource://gre/modules/TelemetryController.sys.mjs': typeof import('resource://gre/modules/TelemetryController.sys.mjs'); - 'resource://gre/modules/TelemetryControllerContent.sys.mjs': typeof import('resource://gre/modules/TelemetryControllerContent.sys.mjs'); - 'resource://gre/modules/TelemetryControllerParent.sys.mjs': typeof import('resource://gre/modules/TelemetryControllerParent.sys.mjs'); - 'resource://gre/modules/TelemetryEnvironment.sys.mjs': typeof import('resource://gre/modules/TelemetryEnvironment.sys.mjs'); - 'resource://gre/modules/TelemetryReportingPolicy.sys.mjs': typeof import('resource://gre/modules/TelemetryReportingPolicy.sys.mjs'); - 'resource://gre/modules/TelemetryScheduler.sys.mjs': typeof import('resource://gre/modules/TelemetryScheduler.sys.mjs'); - 'resource://gre/modules/TelemetrySend.sys.mjs': typeof import('resource://gre/modules/TelemetrySend.sys.mjs'); - 'resource://gre/modules/TelemetrySession.sys.mjs': typeof import('resource://gre/modules/TelemetrySession.sys.mjs'); - 'resource://gre/modules/TelemetryStorage.sys.mjs': typeof import('resource://gre/modules/TelemetryStorage.sys.mjs'); - 'resource://gre/modules/TelemetryTimestamps.sys.mjs': typeof import('resource://gre/modules/TelemetryTimestamps.sys.mjs'); - 'resource://gre/modules/TelemetryUtils.sys.mjs': typeof import('resource://gre/modules/TelemetryUtils.sys.mjs'); - 'resource://gre/modules/Timer.sys.mjs': typeof import('resource://gre/modules/Timer.sys.mjs'); - 'resource://gre/modules/Troubleshoot.sys.mjs': typeof import('resource://gre/modules/Troubleshoot.sys.mjs'); - 'resource://gre/modules/UninstallPing.sys.mjs': typeof import('resource://gre/modules/UninstallPing.sys.mjs'); - 'resource://gre/modules/UntrustedModulesPing.sys.mjs': typeof import('resource://gre/modules/UntrustedModulesPing.sys.mjs'); - 'resource://gre/modules/UpdateListener.sys.mjs': typeof import('resource://gre/modules/UpdateListener.sys.mjs'); - 'resource://gre/modules/UpdateLog.sys.mjs': typeof import('resource://gre/modules/UpdateLog.sys.mjs'); - 'resource://gre/modules/UpdatePing.sys.mjs': typeof import('resource://gre/modules/UpdatePing.sys.mjs'); - 'resource://gre/modules/UpdateService.sys.mjs': typeof import('resource://gre/modules/UpdateService.sys.mjs'); - 'resource://gre/modules/UpdateTimerManager.sys.mjs': typeof import('resource://gre/modules/UpdateTimerManager.sys.mjs'); - 'resource://gre/modules/UpdateUtils.sys.mjs': typeof import('resource://gre/modules/UpdateUtils.sys.mjs'); - 'resource://gre/modules/UrlClassifierRemoteSettingsService.sys.mjs': typeof import('resource://gre/modules/UrlClassifierRemoteSettingsService.sys.mjs'); - 'resource://gre/modules/UrlUtils.sys.mjs': typeof import('resource://gre/modules/UrlUtils.sys.mjs'); - 'resource://gre/modules/UsageReporting.sys.mjs': typeof import('resource://gre/modules/UsageReporting.sys.mjs'); - 'resource://gre/modules/WPTEventsParent.sys.mjs': typeof import('resource://gre/modules/WPTEventsParent.sys.mjs'); - 'resource://gre/modules/WebAuthnFeature.sys.mjs': typeof import('resource://gre/modules/WebAuthnFeature.sys.mjs'); - 'resource://gre/modules/WebChannel.sys.mjs': typeof import('resource://gre/modules/WebChannel.sys.mjs'); - 'resource://gre/modules/WebNavigation.sys.mjs': typeof import('resource://gre/modules/WebNavigation.sys.mjs'); - 'resource://gre/modules/WebNavigationFrames.sys.mjs': typeof import('resource://gre/modules/WebNavigationFrames.sys.mjs'); - 'resource://gre/modules/WebRequest.sys.mjs': typeof import('resource://gre/modules/WebRequest.sys.mjs'); - 'resource://gre/modules/WebRequestUpload.sys.mjs': typeof import('resource://gre/modules/WebRequestUpload.sys.mjs'); - 'resource://gre/modules/WindowsLaunchOnLogin.sys.mjs': typeof import('resource://gre/modules/WindowsLaunchOnLogin.sys.mjs'); - 'resource://gre/modules/WindowsRegistry.sys.mjs': typeof import('resource://gre/modules/WindowsRegistry.sys.mjs'); - 'resource://gre/modules/XPCOMUtils.sys.mjs': typeof import('resource://gre/modules/XPCOMUtils.sys.mjs'); - 'resource://gre/modules/addons/AddonRepository.sys.mjs': typeof import('resource://gre/modules/addons/AddonRepository.sys.mjs'); - 'resource://gre/modules/addons/AddonSettings.sys.mjs': typeof import('resource://gre/modules/addons/AddonSettings.sys.mjs'); - 'resource://gre/modules/addons/AddonUpdateChecker.sys.mjs': typeof import('resource://gre/modules/addons/AddonUpdateChecker.sys.mjs'); - 'resource://gre/modules/addons/GMPProvider.sys.mjs': typeof import('resource://gre/modules/addons/GMPProvider.sys.mjs'); - 'resource://gre/modules/addons/ModelHubProvider.sys.mjs': typeof import('resource://gre/modules/addons/ModelHubProvider.sys.mjs'); - 'resource://gre/modules/addons/ProductAddonChecker.sys.mjs': typeof import('resource://gre/modules/addons/ProductAddonChecker.sys.mjs'); - 'resource://gre/modules/addons/SitePermsAddonProvider.sys.mjs': typeof import('resource://gre/modules/addons/SitePermsAddonProvider.sys.mjs'); - 'resource://gre/modules/addons/XPIDatabase.sys.mjs': typeof import('resource://gre/modules/addons/XPIDatabase.sys.mjs'); - 'resource://gre/modules/addons/XPIExports.sys.mjs': typeof import('resource://gre/modules/addons/XPIExports.sys.mjs'); - 'resource://gre/modules/addons/XPIInstall.sys.mjs': typeof import('resource://gre/modules/addons/XPIInstall.sys.mjs'); - 'resource://gre/modules/addons/XPIProvider.sys.mjs': typeof import('resource://gre/modules/addons/XPIProvider.sys.mjs'); - 'resource://gre/modules/addons/crypto-utils.sys.mjs': typeof import('resource://gre/modules/addons/crypto-utils.sys.mjs'); - 'resource://gre/modules/addons/siteperms-addon-utils.sys.mjs': typeof import('resource://gre/modules/addons/siteperms-addon-utils.sys.mjs'); - 'resource://gre/modules/backgroundtasks/BackgroundTask_backgroundupdate.sys.mjs': typeof import('resource://gre/modules/backgroundtasks/BackgroundTask_backgroundupdate.sys.mjs'); - 'resource://gre/modules/backgroundtasks/BackgroundTask_defaultagent.sys.mjs': typeof import('resource://gre/modules/backgroundtasks/BackgroundTask_defaultagent.sys.mjs'); - 'resource://gre/modules/components-utils/ClientEnvironment.sys.mjs': typeof import('resource://gre/modules/components-utils/ClientEnvironment.sys.mjs'); - 'resource://gre/modules/components-utils/FilterExpressions.sys.mjs': typeof import('resource://gre/modules/components-utils/FilterExpressions.sys.mjs'); - 'resource://gre/modules/components-utils/JsonSchemaValidator.sys.mjs': typeof import('resource://gre/modules/components-utils/JsonSchemaValidator.sys.mjs'); - 'resource://gre/modules/components-utils/Sampling.sys.mjs': typeof import('resource://gre/modules/components-utils/Sampling.sys.mjs'); - 'resource://gre/modules/components-utils/WindowsInstallsInfo.sys.mjs': typeof import('resource://gre/modules/components-utils/WindowsInstallsInfo.sys.mjs'); - 'resource://gre/modules/components-utils/WindowsVersionInfo.sys.mjs': typeof import('resource://gre/modules/components-utils/WindowsVersionInfo.sys.mjs'); - 'resource://gre/modules/components-utils/mozjexl.sys.mjs': typeof import('resource://gre/modules/components-utils/mozjexl.sys.mjs'); - 'resource://gre/modules/contentrelevancy/private/InputUtils.sys.mjs': typeof import('resource://gre/modules/contentrelevancy/private/InputUtils.sys.mjs'); - 'resource://gre/modules/ctypes.sys.mjs': typeof import('resource://gre/modules/ctypes.sys.mjs'); - 'resource://gre/modules/handlers/HandlerList.sys.mjs': typeof import('resource://gre/modules/handlers/HandlerList.sys.mjs'); - 'resource://gre/modules/jsdebugger.sys.mjs': typeof import('resource://gre/modules/jsdebugger.sys.mjs'); - 'resource://gre/modules/kvstore.sys.mjs': typeof import('resource://gre/modules/kvstore.sys.mjs'); - 'resource://gre/modules/media/IdpSandbox.sys.mjs': typeof import('resource://gre/modules/media/IdpSandbox.sys.mjs'); - 'resource://gre/modules/media/PeerConnectionIdp.sys.mjs': typeof import('resource://gre/modules/media/PeerConnectionIdp.sys.mjs'); - 'resource://gre/modules/megalist/MegalistViewModel.sys.mjs': typeof import('resource://gre/modules/megalist/MegalistViewModel.sys.mjs'); - 'resource://gre/modules/megalist/aggregator/Aggregator.sys.mjs': typeof import('resource://gre/modules/megalist/aggregator/Aggregator.sys.mjs'); - 'resource://gre/modules/megalist/aggregator/datasources/DataSourceBase.sys.mjs': typeof import('resource://gre/modules/megalist/aggregator/datasources/DataSourceBase.sys.mjs'); - 'resource://gre/modules/megalist/aggregator/datasources/LoginDataSource.sys.mjs': typeof import('resource://gre/modules/megalist/aggregator/datasources/LoginDataSource.sys.mjs'); - 'resource://gre/modules/narrate/NarrateControls.sys.mjs': typeof import('resource://gre/modules/narrate/NarrateControls.sys.mjs'); - 'resource://gre/modules/policies/WindowsGPOParser.sys.mjs': typeof import('resource://gre/modules/policies/WindowsGPOParser.sys.mjs'); - 'resource://gre/modules/policies/macOSPoliciesParser.sys.mjs': typeof import('resource://gre/modules/policies/macOSPoliciesParser.sys.mjs'); - 'resource://gre/modules/psm/RemoteSecuritySettings.sys.mjs': typeof import('resource://gre/modules/psm/RemoteSecuritySettings.sys.mjs'); - 'resource://gre/modules/psm/X509.sys.mjs': typeof import('resource://gre/modules/psm/X509.sys.mjs'); - 'resource://gre/modules/psm/pippki.sys.mjs': typeof import('resource://gre/modules/psm/pippki.sys.mjs'); - 'resource://gre/modules/reflect.sys.mjs': typeof import('resource://gre/modules/reflect.sys.mjs'); - 'resource://gre/modules/services-automation/ServicesAutomation.sys.mjs': typeof import('resource://gre/modules/services-automation/ServicesAutomation.sys.mjs'); - 'resource://gre/modules/sessionstore/PrivacyFilter.sys.mjs': typeof import('resource://gre/modules/sessionstore/PrivacyFilter.sys.mjs'); - 'resource://gre/modules/sessionstore/PrivacyLevel.sys.mjs': typeof import('resource://gre/modules/sessionstore/PrivacyLevel.sys.mjs'); - 'resource://gre/modules/sessionstore/SessionHistory.sys.mjs': typeof import('resource://gre/modules/sessionstore/SessionHistory.sys.mjs'); - 'resource://gre/modules/sessionstore/SessionStoreHelper.sys.mjs': typeof import('resource://gre/modules/sessionstore/SessionStoreHelper.sys.mjs'); - 'resource://gre/modules/shared/AddressComponent.sys.mjs': typeof import('resource://gre/modules/shared/AddressComponent.sys.mjs'); - 'resource://gre/modules/shared/AddressMetaData.sys.mjs': typeof import('resource://gre/modules/shared/AddressMetaData.sys.mjs'); - 'resource://gre/modules/shared/AddressMetaDataExtension.sys.mjs': typeof import('resource://gre/modules/shared/AddressMetaDataExtension.sys.mjs'); - 'resource://gre/modules/shared/AddressMetaDataLoader.sys.mjs': typeof import('resource://gre/modules/shared/AddressMetaDataLoader.sys.mjs'); - 'resource://gre/modules/shared/AddressParser.sys.mjs': typeof import('resource://gre/modules/shared/AddressParser.sys.mjs'); - 'resource://gre/modules/shared/AddressRecord.sys.mjs': typeof import('resource://gre/modules/shared/AddressRecord.sys.mjs'); - 'resource://gre/modules/shared/AutofillFormFactory.sys.mjs': typeof import('resource://gre/modules/shared/AutofillFormFactory.sys.mjs'); - 'resource://gre/modules/shared/AutofillTelemetry.sys.mjs': typeof import('resource://gre/modules/shared/AutofillTelemetry.sys.mjs'); - 'resource://gre/modules/shared/CreditCardRecord.sys.mjs': typeof import('resource://gre/modules/shared/CreditCardRecord.sys.mjs'); - 'resource://gre/modules/shared/CreditCardRuleset.sys.mjs': typeof import('resource://gre/modules/shared/CreditCardRuleset.sys.mjs'); - 'resource://gre/modules/shared/FieldScanner.sys.mjs': typeof import('resource://gre/modules/shared/FieldScanner.sys.mjs'); - 'resource://gre/modules/shared/FormAutofillHandler.sys.mjs': typeof import('resource://gre/modules/shared/FormAutofillHandler.sys.mjs'); - 'resource://gre/modules/shared/FormAutofillHeuristics.sys.mjs': typeof import('resource://gre/modules/shared/FormAutofillHeuristics.sys.mjs'); - 'resource://gre/modules/shared/FormAutofillNameUtils.sys.mjs': typeof import('resource://gre/modules/shared/FormAutofillNameUtils.sys.mjs'); - 'resource://gre/modules/shared/FormAutofillSection.sys.mjs': typeof import('resource://gre/modules/shared/FormAutofillSection.sys.mjs'); - 'resource://gre/modules/shared/FormAutofillUtils.sys.mjs': typeof import('resource://gre/modules/shared/FormAutofillUtils.sys.mjs'); - 'resource://gre/modules/shared/FormStateManager.sys.mjs': typeof import('resource://gre/modules/shared/FormStateManager.sys.mjs'); - 'resource://gre/modules/shared/LabelUtils.sys.mjs': typeof import('resource://gre/modules/shared/LabelUtils.sys.mjs'); - 'resource://gre/modules/shared/LoginFormFactory.sys.mjs': typeof import('resource://gre/modules/shared/LoginFormFactory.sys.mjs'); - 'resource://gre/modules/shared/NewPasswordModel.sys.mjs': typeof import('resource://gre/modules/shared/NewPasswordModel.sys.mjs'); - 'resource://gre/modules/shared/PasswordGenerator.sys.mjs': typeof import('resource://gre/modules/shared/PasswordGenerator.sys.mjs'); - 'resource://gre/modules/shared/PasswordRulesParser.sys.mjs': typeof import('resource://gre/modules/shared/PasswordRulesParser.sys.mjs'); - 'resource://gre/modules/shared/PhoneNumber.sys.mjs': typeof import('resource://gre/modules/shared/PhoneNumber.sys.mjs'); - 'resource://gre/modules/shared/PhoneNumberNormalizer.sys.mjs': typeof import('resource://gre/modules/shared/PhoneNumberNormalizer.sys.mjs'); - 'resource://gre/modules/storage-rust.sys.mjs': typeof import('resource://gre/modules/storage-rust.sys.mjs'); - 'resource://gre/modules/subprocess/subprocess_unix.sys.mjs': typeof import('resource://gre/modules/subprocess/subprocess_unix.sys.mjs'); - 'resource://gre/modules/subprocess/subprocess_win.sys.mjs': typeof import('resource://gre/modules/subprocess/subprocess_win.sys.mjs'); - 'resource://gre/modules/third_party/jsesc/jsesc.mjs': typeof import('resource://gre/modules/third_party/jsesc/jsesc.mjs'); - 'resource://gre/modules/translations/LanguageDetector.sys.mjs': typeof import('resource://gre/modules/translations/LanguageDetector.sys.mjs'); - 'resource://gre/modules/vtt.sys.mjs': typeof import('resource://gre/modules/vtt.sys.mjs'); - 'resource://gre/modules/workers/PromiseWorker.mjs': typeof import('resource://gre/modules/workers/PromiseWorker.mjs'); - 'resource://httpd-server/httpd.sys.mjs': typeof import('resource://httpd-server/httpd.sys.mjs'); - 'resource://messaging-system/lib/Logger.sys.mjs': typeof import('resource://messaging-system/lib/Logger.sys.mjs'); - 'resource://messaging-system/lib/SpecialMessageActions.sys.mjs': typeof import('resource://messaging-system/lib/SpecialMessageActions.sys.mjs'); - 'resource://messaging-system/targeting/Targeting.sys.mjs': typeof import('resource://messaging-system/targeting/Targeting.sys.mjs'); - 'resource://mozscreenshots/Screenshot.sys.mjs': typeof import('resource://mozscreenshots/Screenshot.sys.mjs'); - 'resource://mozscreenshots/TestRunner.sys.mjs': typeof import('resource://mozscreenshots/TestRunner.sys.mjs'); - 'resource://newtab/common/Actions.mjs': typeof import('resource://newtab/common/Actions.mjs'); - 'resource://newtab/common/Reducers.sys.mjs': typeof import('resource://newtab/common/Reducers.sys.mjs'); - 'resource://newtab/lib/AboutPreferences.sys.mjs': typeof import('resource://newtab/lib/AboutPreferences.sys.mjs'); - 'resource://newtab/lib/ActivityStream.sys.mjs': typeof import('resource://newtab/lib/ActivityStream.sys.mjs'); - 'resource://newtab/lib/ActivityStreamMessageChannel.sys.mjs': typeof import('resource://newtab/lib/ActivityStreamMessageChannel.sys.mjs'); - 'resource://newtab/lib/ActivityStreamPrefs.sys.mjs': typeof import('resource://newtab/lib/ActivityStreamPrefs.sys.mjs'); - 'resource://newtab/lib/AdsFeed.sys.mjs': typeof import('resource://newtab/lib/AdsFeed.sys.mjs'); - 'resource://newtab/lib/DefaultSites.sys.mjs': typeof import('resource://newtab/lib/DefaultSites.sys.mjs'); - 'resource://newtab/lib/DiscoveryStreamFeed.sys.mjs': typeof import('resource://newtab/lib/DiscoveryStreamFeed.sys.mjs'); - 'resource://newtab/lib/DownloadsManager.sys.mjs': typeof import('resource://newtab/lib/DownloadsManager.sys.mjs'); - 'resource://newtab/lib/FaviconFeed.sys.mjs': typeof import('resource://newtab/lib/FaviconFeed.sys.mjs'); - 'resource://newtab/lib/HighlightsFeed.sys.mjs': typeof import('resource://newtab/lib/HighlightsFeed.sys.mjs'); - 'resource://newtab/lib/InferredModel/FeatureModel.sys.mjs': typeof import('resource://newtab/lib/InferredModel/FeatureModel.sys.mjs'); - 'resource://newtab/lib/InferredModel/GreedyContentRanker.mjs': typeof import('resource://newtab/lib/InferredModel/GreedyContentRanker.mjs'); - 'resource://newtab/lib/InferredPersonalizationFeed.sys.mjs': typeof import('resource://newtab/lib/InferredPersonalizationFeed.sys.mjs'); - 'resource://newtab/lib/NewTabAttributionFeed.sys.mjs': typeof import('resource://newtab/lib/NewTabAttributionFeed.sys.mjs'); - 'resource://newtab/lib/NewTabAttributionService.sys.mjs': typeof import('resource://newtab/lib/NewTabAttributionService.sys.mjs'); - 'resource://newtab/lib/NewTabContentPing.sys.mjs': typeof import('resource://newtab/lib/NewTabContentPing.sys.mjs'); - 'resource://newtab/lib/NewTabGleanUtils.sys.mjs': typeof import('resource://newtab/lib/NewTabGleanUtils.sys.mjs'); - 'resource://newtab/lib/NewTabInit.sys.mjs': typeof import('resource://newtab/lib/NewTabInit.sys.mjs'); - 'resource://newtab/lib/NewTabMessaging.sys.mjs': typeof import('resource://newtab/lib/NewTabMessaging.sys.mjs'); - 'resource://newtab/lib/PersistentCache.sys.mjs': typeof import('resource://newtab/lib/PersistentCache.sys.mjs'); - 'resource://newtab/lib/PersonalityProvider/PersonalityProvider.sys.mjs': typeof import('resource://newtab/lib/PersonalityProvider/PersonalityProvider.sys.mjs'); - 'resource://newtab/lib/PlacesFeed.sys.mjs': typeof import('resource://newtab/lib/PlacesFeed.sys.mjs'); - 'resource://newtab/lib/PrefsFeed.sys.mjs': typeof import('resource://newtab/lib/PrefsFeed.sys.mjs'); - 'resource://newtab/lib/RecommendationProvider.sys.mjs': typeof import('resource://newtab/lib/RecommendationProvider.sys.mjs'); - 'resource://newtab/lib/Screenshots.sys.mjs': typeof import('resource://newtab/lib/Screenshots.sys.mjs'); - 'resource://newtab/lib/SectionsManager.sys.mjs': typeof import('resource://newtab/lib/SectionsManager.sys.mjs'); - 'resource://newtab/lib/SmartShortcutsFeed.sys.mjs': typeof import('resource://newtab/lib/SmartShortcutsFeed.sys.mjs'); - 'resource://newtab/lib/SmartShortcutsRanker/RankShortcuts.mjs': typeof import('resource://newtab/lib/SmartShortcutsRanker/RankShortcuts.mjs'); - 'resource://newtab/lib/SmartShortcutsRanker/RankShortcutsWorkerClass.mjs': typeof import('resource://newtab/lib/SmartShortcutsRanker/RankShortcutsWorkerClass.mjs'); - 'resource://newtab/lib/SmartShortcutsRanker/ThomSample.mjs': typeof import('resource://newtab/lib/SmartShortcutsRanker/ThomSample.mjs'); - 'resource://newtab/lib/StartupCacheInit.sys.mjs': typeof import('resource://newtab/lib/StartupCacheInit.sys.mjs'); - 'resource://newtab/lib/Store.sys.mjs': typeof import('resource://newtab/lib/Store.sys.mjs'); - 'resource://newtab/lib/SystemTickFeed.sys.mjs': typeof import('resource://newtab/lib/SystemTickFeed.sys.mjs'); - 'resource://newtab/lib/TelemetryFeed.sys.mjs': typeof import('resource://newtab/lib/TelemetryFeed.sys.mjs'); - 'resource://newtab/lib/TopSitesFeed.sys.mjs': typeof import('resource://newtab/lib/TopSitesFeed.sys.mjs'); - 'resource://newtab/lib/TopStoriesFeed.sys.mjs': typeof import('resource://newtab/lib/TopStoriesFeed.sys.mjs'); - 'resource://newtab/lib/TrendingSearchFeed.sys.mjs': typeof import('resource://newtab/lib/TrendingSearchFeed.sys.mjs'); - 'resource://newtab/lib/UTEventReporting.sys.mjs': typeof import('resource://newtab/lib/UTEventReporting.sys.mjs'); - 'resource://newtab/lib/Wallpapers/WallpaperFeed.sys.mjs': typeof import('resource://newtab/lib/Wallpapers/WallpaperFeed.sys.mjs'); - 'resource://newtab/lib/WeatherFeed.sys.mjs': typeof import('resource://newtab/lib/WeatherFeed.sys.mjs'); - 'resource://newtab/lib/Widgets/ListsFeed.sys.mjs': typeof import('resource://newtab/lib/Widgets/ListsFeed.sys.mjs'); - 'resource://newtab/lib/Widgets/TimerFeed.sys.mjs': typeof import('resource://newtab/lib/Widgets/TimerFeed.sys.mjs'); - 'resource://nimbus/ExperimentAPI.sys.mjs': typeof import('resource://nimbus/ExperimentAPI.sys.mjs'); - 'resource://nimbus/FeatureManifest.sys.mjs': typeof import('resource://nimbus/FeatureManifest.sys.mjs'); - 'resource://nimbus/FirefoxLabs.sys.mjs': typeof import('resource://nimbus/FirefoxLabs.sys.mjs'); - 'resource://nimbus/lib/Enrollments.sys.mjs': typeof import('resource://nimbus/lib/Enrollments.sys.mjs'); - 'resource://nimbus/lib/ExperimentManager.sys.mjs': typeof import('resource://nimbus/lib/ExperimentManager.sys.mjs'); - 'resource://nimbus/lib/ExperimentStore.sys.mjs': typeof import('resource://nimbus/lib/ExperimentStore.sys.mjs'); - 'resource://nimbus/lib/Migrations.sys.mjs': typeof import('resource://nimbus/lib/Migrations.sys.mjs'); - 'resource://nimbus/lib/RemoteSettingsExperimentLoader.sys.mjs': typeof import('resource://nimbus/lib/RemoteSettingsExperimentLoader.sys.mjs'); - 'resource://nimbus/lib/SharedDataMap.sys.mjs': typeof import('resource://nimbus/lib/SharedDataMap.sys.mjs'); - 'resource://nimbus/lib/TargetingContextRecorder.sys.mjs': typeof import('resource://nimbus/lib/TargetingContextRecorder.sys.mjs'); - 'resource://nimbus/lib/Telemetry.sys.mjs': typeof import('resource://nimbus/lib/Telemetry.sys.mjs'); - 'resource://normandy-content/AboutPages.sys.mjs': typeof import('resource://normandy-content/AboutPages.sys.mjs'); - 'resource://normandy/Normandy.sys.mjs': typeof import('resource://normandy/Normandy.sys.mjs'); - 'resource://normandy/NormandyMigrations.sys.mjs': typeof import('resource://normandy/NormandyMigrations.sys.mjs'); - 'resource://normandy/actions/AddonRollbackAction.sys.mjs': typeof import('resource://normandy/actions/AddonRollbackAction.sys.mjs'); - 'resource://normandy/actions/AddonRolloutAction.sys.mjs': typeof import('resource://normandy/actions/AddonRolloutAction.sys.mjs'); - 'resource://normandy/actions/BaseAction.sys.mjs': typeof import('resource://normandy/actions/BaseAction.sys.mjs'); - 'resource://normandy/actions/BaseStudyAction.sys.mjs': typeof import('resource://normandy/actions/BaseStudyAction.sys.mjs'); - 'resource://normandy/actions/BranchedAddonStudyAction.sys.mjs': typeof import('resource://normandy/actions/BranchedAddonStudyAction.sys.mjs'); - 'resource://normandy/actions/ConsoleLogAction.sys.mjs': typeof import('resource://normandy/actions/ConsoleLogAction.sys.mjs'); - 'resource://normandy/actions/PreferenceExperimentAction.sys.mjs': typeof import('resource://normandy/actions/PreferenceExperimentAction.sys.mjs'); - 'resource://normandy/actions/PreferenceRollbackAction.sys.mjs': typeof import('resource://normandy/actions/PreferenceRollbackAction.sys.mjs'); - 'resource://normandy/actions/PreferenceRolloutAction.sys.mjs': typeof import('resource://normandy/actions/PreferenceRolloutAction.sys.mjs'); - 'resource://normandy/actions/ShowHeartbeatAction.sys.mjs': typeof import('resource://normandy/actions/ShowHeartbeatAction.sys.mjs'); - 'resource://normandy/actions/schemas/index.sys.mjs': typeof import('resource://normandy/actions/schemas/index.sys.mjs'); - 'resource://normandy/lib/ActionsManager.sys.mjs': typeof import('resource://normandy/lib/ActionsManager.sys.mjs'); - 'resource://normandy/lib/AddonRollouts.sys.mjs': typeof import('resource://normandy/lib/AddonRollouts.sys.mjs'); - 'resource://normandy/lib/AddonStudies.sys.mjs': typeof import('resource://normandy/lib/AddonStudies.sys.mjs'); - 'resource://normandy/lib/CleanupManager.sys.mjs': typeof import('resource://normandy/lib/CleanupManager.sys.mjs'); - 'resource://normandy/lib/ClientEnvironment.sys.mjs': typeof import('resource://normandy/lib/ClientEnvironment.sys.mjs'); - 'resource://normandy/lib/EventEmitter.sys.mjs': typeof import('resource://normandy/lib/EventEmitter.sys.mjs'); - 'resource://normandy/lib/Heartbeat.sys.mjs': typeof import('resource://normandy/lib/Heartbeat.sys.mjs'); - 'resource://normandy/lib/LegacyHeartbeat.sys.mjs': typeof import('resource://normandy/lib/LegacyHeartbeat.sys.mjs'); - 'resource://normandy/lib/LogManager.sys.mjs': typeof import('resource://normandy/lib/LogManager.sys.mjs'); - 'resource://normandy/lib/NormandyAddonManager.sys.mjs': typeof import('resource://normandy/lib/NormandyAddonManager.sys.mjs'); - 'resource://normandy/lib/NormandyApi.sys.mjs': typeof import('resource://normandy/lib/NormandyApi.sys.mjs'); - 'resource://normandy/lib/NormandyUtils.sys.mjs': typeof import('resource://normandy/lib/NormandyUtils.sys.mjs'); - 'resource://normandy/lib/PreferenceExperiments.sys.mjs': typeof import('resource://normandy/lib/PreferenceExperiments.sys.mjs'); - 'resource://normandy/lib/PreferenceRollouts.sys.mjs': typeof import('resource://normandy/lib/PreferenceRollouts.sys.mjs'); - 'resource://normandy/lib/RecipeRunner.sys.mjs': typeof import('resource://normandy/lib/RecipeRunner.sys.mjs'); - 'resource://normandy/lib/ShieldPreferences.sys.mjs': typeof import('resource://normandy/lib/ShieldPreferences.sys.mjs'); - 'resource://normandy/lib/Storage.sys.mjs': typeof import('resource://normandy/lib/Storage.sys.mjs'); - 'resource://normandy/lib/TelemetryEvents.sys.mjs': typeof import('resource://normandy/lib/TelemetryEvents.sys.mjs'); - 'resource://normandy/lib/Uptake.sys.mjs': typeof import('resource://normandy/lib/Uptake.sys.mjs'); - 'resource://pdf.js/PdfJs.sys.mjs': typeof import('resource://pdf.js/PdfJs.sys.mjs'); - 'resource://pdf.js/PdfJsNetwork.sys.mjs': typeof import('resource://pdf.js/PdfJsNetwork.sys.mjs'); - 'resource://pdf.js/PdfJsTelemetry.sys.mjs': typeof import('resource://pdf.js/PdfJsTelemetry.sys.mjs'); - 'resource://pdf.js/PdfSandbox.sys.mjs': typeof import('resource://pdf.js/PdfSandbox.sys.mjs'); - 'resource://pdf.js/PdfStreamConverter.sys.mjs': typeof import('resource://pdf.js/PdfStreamConverter.sys.mjs'); - 'resource://reftest/AsyncSpellCheckTestHelper.sys.mjs': typeof import('resource://reftest/AsyncSpellCheckTestHelper.sys.mjs'); - 'resource://reftest/PerTestCoverageUtils.sys.mjs': typeof import('resource://reftest/PerTestCoverageUtils.sys.mjs'); - 'resource://reftest/reftest.sys.mjs': typeof import('resource://reftest/reftest.sys.mjs'); - 'resource://services-common/async.sys.mjs': typeof import('resource://services-common/async.sys.mjs'); - 'resource://services-common/hawkclient.sys.mjs': typeof import('resource://services-common/hawkclient.sys.mjs'); - 'resource://services-common/hawkrequest.sys.mjs': typeof import('resource://services-common/hawkrequest.sys.mjs'); - 'resource://services-common/kinto-http-client.sys.mjs': typeof import('resource://services-common/kinto-http-client.sys.mjs'); - 'resource://services-common/kinto-offline-client.sys.mjs': typeof import('resource://services-common/kinto-offline-client.sys.mjs'); - 'resource://services-common/kinto-storage-adapter.sys.mjs': typeof import('resource://services-common/kinto-storage-adapter.sys.mjs'); - 'resource://services-common/observers.sys.mjs': typeof import('resource://services-common/observers.sys.mjs'); - 'resource://services-common/rest.sys.mjs': typeof import('resource://services-common/rest.sys.mjs'); - 'resource://services-common/tokenserverclient.sys.mjs': typeof import('resource://services-common/tokenserverclient.sys.mjs'); - 'resource://services-common/uptake-telemetry.sys.mjs': typeof import('resource://services-common/uptake-telemetry.sys.mjs'); - 'resource://services-common/utils.sys.mjs': typeof import('resource://services-common/utils.sys.mjs'); - 'resource://services-settings/Attachments.sys.mjs': typeof import('resource://services-settings/Attachments.sys.mjs'); - 'resource://services-settings/Database.sys.mjs': typeof import('resource://services-settings/Database.sys.mjs'); - 'resource://services-settings/IDBHelpers.sys.mjs': typeof import('resource://services-settings/IDBHelpers.sys.mjs'); - 'resource://services-settings/RemoteSettingsClient.sys.mjs': typeof import('resource://services-settings/RemoteSettingsClient.sys.mjs'); - 'resource://services-settings/RemoteSettingsWorker.sys.mjs': typeof import('resource://services-settings/RemoteSettingsWorker.sys.mjs'); - 'resource://services-settings/SharedUtils.sys.mjs': typeof import('resource://services-settings/SharedUtils.sys.mjs'); - 'resource://services-settings/SyncHistory.sys.mjs': typeof import('resource://services-settings/SyncHistory.sys.mjs'); - 'resource://services-settings/Utils.sys.mjs': typeof import('resource://services-settings/Utils.sys.mjs'); - 'resource://services-settings/remote-settings.sys.mjs': typeof import('resource://services-settings/remote-settings.sys.mjs'); - 'resource://services-sync/SyncDisconnect.sys.mjs': typeof import('resource://services-sync/SyncDisconnect.sys.mjs'); - 'resource://services-sync/SyncedTabs.sys.mjs': typeof import('resource://services-sync/SyncedTabs.sys.mjs'); - 'resource://services-sync/TabsStore.sys.mjs': typeof import('resource://services-sync/TabsStore.sys.mjs'); - 'resource://services-sync/UIState.sys.mjs': typeof import('resource://services-sync/UIState.sys.mjs'); - 'resource://services-sync/addonsreconciler.sys.mjs': typeof import('resource://services-sync/addonsreconciler.sys.mjs'); - 'resource://services-sync/addonutils.sys.mjs': typeof import('resource://services-sync/addonutils.sys.mjs'); - 'resource://services-sync/bridged_engine.sys.mjs': typeof import('resource://services-sync/bridged_engine.sys.mjs'); - 'resource://services-sync/constants.sys.mjs': typeof import('resource://services-sync/constants.sys.mjs'); - 'resource://services-sync/doctor.sys.mjs': typeof import('resource://services-sync/doctor.sys.mjs'); - 'resource://services-sync/engines.sys.mjs': typeof import('resource://services-sync/engines.sys.mjs'); - 'resource://services-sync/engines/addons.sys.mjs': typeof import('resource://services-sync/engines/addons.sys.mjs'); - 'resource://services-sync/engines/bookmarks.sys.mjs': typeof import('resource://services-sync/engines/bookmarks.sys.mjs'); - 'resource://services-sync/engines/clients.sys.mjs': typeof import('resource://services-sync/engines/clients.sys.mjs'); - 'resource://services-sync/engines/extension-storage.sys.mjs': typeof import('resource://services-sync/engines/extension-storage.sys.mjs'); - 'resource://services-sync/engines/forms.sys.mjs': typeof import('resource://services-sync/engines/forms.sys.mjs'); - 'resource://services-sync/engines/history.sys.mjs': typeof import('resource://services-sync/engines/history.sys.mjs'); - 'resource://services-sync/engines/passwords.sys.mjs': typeof import('resource://services-sync/engines/passwords.sys.mjs'); - 'resource://services-sync/engines/prefs.sys.mjs': typeof import('resource://services-sync/engines/prefs.sys.mjs'); - 'resource://services-sync/engines/tabs.sys.mjs': typeof import('resource://services-sync/engines/tabs.sys.mjs'); - 'resource://services-sync/keys.sys.mjs': typeof import('resource://services-sync/keys.sys.mjs'); - 'resource://services-sync/main.sys.mjs': typeof import('resource://services-sync/main.sys.mjs'); - 'resource://services-sync/policies.sys.mjs': typeof import('resource://services-sync/policies.sys.mjs'); - 'resource://services-sync/record.sys.mjs': typeof import('resource://services-sync/record.sys.mjs'); - 'resource://services-sync/resource.sys.mjs': typeof import('resource://services-sync/resource.sys.mjs'); - 'resource://services-sync/service.sys.mjs': typeof import('resource://services-sync/service.sys.mjs'); - 'resource://services-sync/stages/declined.sys.mjs': typeof import('resource://services-sync/stages/declined.sys.mjs'); - 'resource://services-sync/stages/enginesync.sys.mjs': typeof import('resource://services-sync/stages/enginesync.sys.mjs'); - 'resource://services-sync/status.sys.mjs': typeof import('resource://services-sync/status.sys.mjs'); - 'resource://services-sync/sync_auth.sys.mjs': typeof import('resource://services-sync/sync_auth.sys.mjs'); - 'resource://services-sync/telemetry.sys.mjs': typeof import('resource://services-sync/telemetry.sys.mjs'); - 'resource://services-sync/util.sys.mjs': typeof import('resource://services-sync/util.sys.mjs'); - 'resource://specialpowers/AppTestDelegate.sys.mjs': typeof import('resource://specialpowers/AppTestDelegate.sys.mjs'); - 'resource://talos-powers/TalosParentProfiler.sys.mjs': typeof import('resource://talos-powers/TalosParentProfiler.sys.mjs'); - 'resource://test/AllowJavascriptParent.sys.mjs': typeof import('resource://test/AllowJavascriptParent.sys.mjs'); - 'resource://test/Census.sys.mjs': typeof import('resource://test/Census.sys.mjs'); - 'resource://test/CrashTestUtils.sys.mjs': typeof import('resource://test/CrashTestUtils.sys.mjs'); - 'resource://test/GlobalObjectsModule.sys.mjs': typeof import('resource://test/GlobalObjectsModule.sys.mjs'); - 'resource://test/Match.sys.mjs': typeof import('resource://test/Match.sys.mjs'); - 'resource://test/TestRunner.sys.mjs': typeof import('resource://test/TestRunner.sys.mjs'); - 'resource://test/broadcast_handler.sys.mjs': typeof import('resource://test/broadcast_handler.sys.mjs'); - 'resource://test/contextual.sys.mjs': typeof import('resource://test/contextual.sys.mjs'); - 'resource://test/es6module.js': typeof import('resource://test/es6module.js'); - 'resource://test/es6module_absolute.js': typeof import('resource://test/es6module_absolute.js'); - 'resource://test/es6module_absolute2.js': typeof import('resource://test/es6module_absolute2.js'); - 'resource://test/es6module_cycle_a.js': typeof import('resource://test/es6module_cycle_a.js'); - 'resource://test/es6module_cycle_b.js': typeof import('resource://test/es6module_cycle_b.js'); - 'resource://test/es6module_cycle_c.js': typeof import('resource://test/es6module_cycle_c.js'); - 'resource://test/es6module_devtoolsLoader.js': typeof import('resource://test/es6module_devtoolsLoader.js'); - 'resource://test/es6module_devtoolsLoader_only.js': typeof import('resource://test/es6module_devtoolsLoader_only.js'); - 'resource://test/es6module_dynamic_import_runtime_error.js': typeof import('resource://test/es6module_dynamic_import_runtime_error.js'); - 'resource://test/es6module_dynamic_import_syntax_error.js': typeof import('resource://test/es6module_dynamic_import_syntax_error.js'); - 'resource://test/es6module_import_error.js': typeof import('resource://test/es6module_import_error.js'); - 'resource://test/es6module_parse_error.js': typeof import('resource://test/es6module_parse_error.js'); - 'resource://test/es6module_parse_error_in_import.js': typeof import('resource://test/es6module_parse_error_in_import.js'); - 'resource://test/es6module_throws.js': typeof import('resource://test/es6module_throws.js'); - 'resource://test/es6module_top_level_await.js': typeof import('resource://test/es6module_top_level_await.js'); - 'resource://test/esm_lazy-1.sys.mjs': typeof import('resource://test/esm_lazy-1.sys.mjs'); - 'resource://test/esm_lazy-2.sys.mjs': typeof import('resource://test/esm_lazy-2.sys.mjs'); - 'resource://test/esmified-1.sys.mjs': typeof import('resource://test/esmified-1.sys.mjs'); - 'resource://test/esmified-3.sys.mjs': typeof import('resource://test/esmified-3.sys.mjs'); - 'resource://test/esmified-4.sys.mjs': typeof import('resource://test/esmified-4.sys.mjs'); - 'resource://test/import_non_shared_1.mjs': typeof import('resource://test/import_non_shared_1.mjs'); - 'resource://test/non_shared_1.mjs': typeof import('resource://test/non_shared_1.mjs'); - 'resource://test/non_shared_nest_import_non_shared_1.mjs': typeof import('resource://test/non_shared_nest_import_non_shared_1.mjs'); - 'resource://test/non_shared_nest_import_non_shared_2.mjs': typeof import('resource://test/non_shared_nest_import_non_shared_2.mjs'); - 'resource://test/non_shared_nest_import_non_shared_3.mjs': typeof import('resource://test/non_shared_nest_import_non_shared_3.mjs'); - 'resource://test/non_shared_nest_import_non_shared_target_1.mjs': typeof import('resource://test/non_shared_nest_import_non_shared_target_1.mjs'); - 'resource://test/non_shared_nest_import_non_shared_target_2.mjs': typeof import('resource://test/non_shared_nest_import_non_shared_target_2.mjs'); - 'resource://test/non_shared_nest_import_non_shared_target_3.mjs': typeof import('resource://test/non_shared_nest_import_non_shared_target_3.mjs'); - 'resource://test/non_shared_nest_import_shared_1.mjs': typeof import('resource://test/non_shared_nest_import_shared_1.mjs'); - 'resource://test/non_shared_nest_import_shared_target_1.sys.mjs': typeof import('resource://test/non_shared_nest_import_shared_target_1.sys.mjs'); - 'resource://test/non_shared_nest_import_shared_target_2.sys.mjs': typeof import('resource://test/non_shared_nest_import_shared_target_2.sys.mjs'); - 'resource://test/not_found.mjs': typeof import('resource://test/not_found.mjs'); - 'resource://testing-common/AddonTestUtils.sys.mjs': typeof import('resource://testing-common/AddonTestUtils.sys.mjs'); - 'resource://testing-common/AllJavascriptTypes.mjs': typeof import('resource://testing-common/AllJavascriptTypes.mjs'); - 'resource://testing-common/AppData.sys.mjs': typeof import('resource://testing-common/AppData.sys.mjs'); - 'resource://testing-common/AppInfo.sys.mjs': typeof import('resource://testing-common/AppInfo.sys.mjs'); - 'resource://testing-common/AppUiTestDelegate.sys.mjs': typeof import('resource://testing-common/AppUiTestDelegate.sys.mjs'); - 'resource://testing-common/Assert.sys.mjs': typeof import('resource://testing-common/Assert.sys.mjs'); - 'resource://testing-common/AsyncSpellCheckTestHelper.sys.mjs': typeof import('resource://testing-common/AsyncSpellCheckTestHelper.sys.mjs'); - 'resource://testing-common/BackgroundTasksTestUtils.sys.mjs': typeof import('resource://testing-common/BackgroundTasksTestUtils.sys.mjs'); - 'resource://testing-common/BrowserTestUtils.sys.mjs': typeof import('resource://testing-common/BrowserTestUtils.sys.mjs'); - 'resource://testing-common/ContentTask.sys.mjs': typeof import('resource://testing-common/ContentTask.sys.mjs'); - 'resource://testing-common/ContentTaskUtils.sys.mjs': typeof import('resource://testing-common/ContentTaskUtils.sys.mjs'); - 'resource://testing-common/CookieXPCShellUtils.sys.mjs': typeof import('resource://testing-common/CookieXPCShellUtils.sys.mjs'); - 'resource://testing-common/CoverageUtils.sys.mjs': typeof import('resource://testing-common/CoverageUtils.sys.mjs'); - 'resource://testing-common/CrashManagerTest.sys.mjs': typeof import('resource://testing-common/CrashManagerTest.sys.mjs'); - 'resource://testing-common/CustomizableUITestUtils.sys.mjs': typeof import('resource://testing-common/CustomizableUITestUtils.sys.mjs'); - 'resource://testing-common/DOMFullscreenTestUtils.sys.mjs': typeof import('resource://testing-common/DOMFullscreenTestUtils.sys.mjs'); - 'resource://testing-common/DoHTestUtils.sys.mjs': typeof import('resource://testing-common/DoHTestUtils.sys.mjs'); - 'resource://testing-common/EnterprisePolicyTesting.sys.mjs': typeof import('resource://testing-common/EnterprisePolicyTesting.sys.mjs'); - 'resource://testing-common/ExtensionTestCommon.sys.mjs': typeof import('resource://testing-common/ExtensionTestCommon.sys.mjs'); - 'resource://testing-common/ExtensionXPCShellUtils.sys.mjs': typeof import('resource://testing-common/ExtensionXPCShellUtils.sys.mjs'); - 'resource://testing-common/FileTestUtils.sys.mjs': typeof import('resource://testing-common/FileTestUtils.sys.mjs'); - 'resource://testing-common/FirefoxViewTestUtils.sys.mjs': typeof import('resource://testing-common/FirefoxViewTestUtils.sys.mjs'); - 'resource://testing-common/FormHistoryTestUtils.sys.mjs': typeof import('resource://testing-common/FormHistoryTestUtils.sys.mjs'); - 'resource://testing-common/HandlerServiceTestUtils.sys.mjs': typeof import('resource://testing-common/HandlerServiceTestUtils.sys.mjs'); - 'resource://testing-common/InflightAssetsMessageProvider.sys.mjs': typeof import('resource://testing-common/InflightAssetsMessageProvider.sys.mjs'); - 'resource://testing-common/JSObjectsTestUtils.sys.mjs': typeof import('resource://testing-common/JSObjectsTestUtils.sys.mjs'); - 'resource://testing-common/LangPackMatcherTestUtils.sys.mjs': typeof import('resource://testing-common/LangPackMatcherTestUtils.sys.mjs'); - 'resource://testing-common/LoginTestUtils.sys.mjs': typeof import('resource://testing-common/LoginTestUtils.sys.mjs'); - 'resource://testing-common/MerinoTestUtils.sys.mjs': typeof import('resource://testing-common/MerinoTestUtils.sys.mjs'); - 'resource://testing-common/MessageChannel.sys.mjs': typeof import('resource://testing-common/MessageChannel.sys.mjs'); - 'resource://testing-common/MockColorPicker.sys.mjs': typeof import('resource://testing-common/MockColorPicker.sys.mjs'); - 'resource://testing-common/MockDocument.sys.mjs': typeof import('resource://testing-common/MockDocument.sys.mjs'); - 'resource://testing-common/MockFilePicker.sys.mjs': typeof import('resource://testing-common/MockFilePicker.sys.mjs'); - 'resource://testing-common/MockPermissionPrompt.sys.mjs': typeof import('resource://testing-common/MockPermissionPrompt.sys.mjs'); - 'resource://testing-common/MockPromptCollection.sys.mjs': typeof import('resource://testing-common/MockPromptCollection.sys.mjs'); - 'resource://testing-common/MockRegistrar.sys.mjs': typeof import('resource://testing-common/MockRegistrar.sys.mjs'); - 'resource://testing-common/MockRegistry.sys.mjs': typeof import('resource://testing-common/MockRegistry.sys.mjs'); - 'resource://testing-common/MockSound.sys.mjs': typeof import('resource://testing-common/MockSound.sys.mjs'); - 'resource://testing-common/NimbusRolloutMessageProvider.sys.mjs': typeof import('resource://testing-common/NimbusRolloutMessageProvider.sys.mjs'); - 'resource://testing-common/NimbusTestUtils.sys.mjs': typeof import('resource://testing-common/NimbusTestUtils.sys.mjs'); - 'resource://testing-common/NodeServer.sys.mjs': typeof import('resource://testing-common/NodeServer.sys.mjs'); - 'resource://testing-common/NormandyTestUtils.sys.mjs': typeof import('resource://testing-common/NormandyTestUtils.sys.mjs'); - 'resource://testing-common/OSKeyStoreTestUtils.sys.mjs': typeof import('resource://testing-common/OSKeyStoreTestUtils.sys.mjs'); - 'resource://testing-common/PerTestCoverageUtils.sys.mjs': typeof import('resource://testing-common/PerTestCoverageUtils.sys.mjs'); - 'resource://testing-common/PerfTestHelpers.sys.mjs': typeof import('resource://testing-common/PerfTestHelpers.sys.mjs'); - 'resource://testing-common/PermissionTestUtils.sys.mjs': typeof import('resource://testing-common/PermissionTestUtils.sys.mjs'); - 'resource://testing-common/PlacesTestUtils.sys.mjs': typeof import('resource://testing-common/PlacesTestUtils.sys.mjs'); - 'resource://testing-common/ProfilerTestUtils.sys.mjs': typeof import('resource://testing-common/ProfilerTestUtils.sys.mjs'); - 'resource://testing-common/PromiseTestUtils.sys.mjs': typeof import('resource://testing-common/PromiseTestUtils.sys.mjs'); - 'resource://testing-common/PromptTestUtils.sys.mjs': typeof import('resource://testing-common/PromptTestUtils.sys.mjs'); - 'resource://testing-common/QuickSuggestTestUtils.sys.mjs': typeof import('resource://testing-common/QuickSuggestTestUtils.sys.mjs'); - 'resource://testing-common/RegionTestUtils.sys.mjs': typeof import('resource://testing-common/RegionTestUtils.sys.mjs'); - 'resource://testing-common/RemoteSettingsServer.sys.mjs': typeof import('resource://testing-common/RemoteSettingsServer.sys.mjs'); - 'resource://testing-common/SearchTestUtils.sys.mjs': typeof import('resource://testing-common/SearchTestUtils.sys.mjs'); - 'resource://testing-common/SearchUITestUtils.sys.mjs': typeof import('resource://testing-common/SearchUITestUtils.sys.mjs'); - 'resource://testing-common/SessionStoreTestUtils.sys.mjs': typeof import('resource://testing-common/SessionStoreTestUtils.sys.mjs'); - 'resource://testing-common/Sinon.sys.mjs': typeof import('resource://testing-common/Sinon.sys.mjs'); - 'resource://testing-common/SiteDataTestUtils.sys.mjs': typeof import('resource://testing-common/SiteDataTestUtils.sys.mjs'); - 'resource://testing-common/SpecialPowersParent.sys.mjs': typeof import('resource://testing-common/SpecialPowersParent.sys.mjs'); - 'resource://testing-common/SpecialPowersProcessActor.sys.mjs': typeof import('resource://testing-common/SpecialPowersProcessActor.sys.mjs'); - 'resource://testing-common/SpecialPowersSandbox.sys.mjs': typeof import('resource://testing-common/SpecialPowersSandbox.sys.mjs'); - 'resource://testing-common/StructuredLog.sys.mjs': typeof import('resource://testing-common/StructuredLog.sys.mjs'); - 'resource://testing-common/TabGroupTestUtils.sys.mjs': typeof import('resource://testing-common/TabGroupTestUtils.sys.mjs'); - 'resource://testing-common/TelemetryArchiveTesting.sys.mjs': typeof import('resource://testing-common/TelemetryArchiveTesting.sys.mjs'); - 'resource://testing-common/TelemetryEnvironmentTesting.sys.mjs': typeof import('resource://testing-common/TelemetryEnvironmentTesting.sys.mjs'); - 'resource://testing-common/TelemetryTestUtils.sys.mjs': typeof import('resource://testing-common/TelemetryTestUtils.sys.mjs'); - 'resource://testing-common/TestIntegration.sys.mjs': typeof import('resource://testing-common/TestIntegration.sys.mjs'); - 'resource://testing-common/TestUtils.sys.mjs': typeof import('resource://testing-common/TestUtils.sys.mjs'); - 'resource://testing-common/UrlClassifierTestUtils.sys.mjs': typeof import('resource://testing-common/UrlClassifierTestUtils.sys.mjs'); - 'resource://testing-common/UrlbarTestUtils.sys.mjs': typeof import('resource://testing-common/UrlbarTestUtils.sys.mjs'); - 'resource://testing-common/VacuumParticipant.sys.mjs': typeof import('resource://testing-common/VacuumParticipant.sys.mjs'); - 'resource://testing-common/WrapPrivileged.sys.mjs': typeof import('resource://testing-common/WrapPrivileged.sys.mjs'); - 'resource://testing-common/XPCShellContentUtils.sys.mjs': typeof import('resource://testing-common/XPCShellContentUtils.sys.mjs'); - 'resource://testing-common/backgroundtasks/BackgroundTask_backgroundtask_specific_pref.sys.mjs': typeof import('resource://testing-common/backgroundtasks/BackgroundTask_backgroundtask_specific_pref.sys.mjs'); - 'resource://testing-common/backgroundtasks/BackgroundTask_shouldprocessupdates.sys.mjs': typeof import('resource://testing-common/backgroundtasks/BackgroundTask_shouldprocessupdates.sys.mjs'); - 'resource://testing-common/backgroundtasks/BackgroundTask_unique_profile.sys.mjs': typeof import('resource://testing-common/backgroundtasks/BackgroundTask_unique_profile.sys.mjs'); - 'resource://testing-common/cookie_filtering_helper.sys.mjs': typeof import('resource://testing-common/cookie_filtering_helper.sys.mjs'); - 'resource://testing-common/dom/indexedDB/test/modules/IndexedDBUtils.sys.mjs': typeof import('resource://testing-common/dom/indexedDB/test/modules/IndexedDBUtils.sys.mjs'); - 'resource://testing-common/dom/localstorage/test/modules/LocalStorageUtils.sys.mjs': typeof import('resource://testing-common/dom/localstorage/test/modules/LocalStorageUtils.sys.mjs'); - 'resource://testing-common/dom/quota/test/modules/FileUtils.sys.mjs': typeof import('resource://testing-common/dom/quota/test/modules/FileUtils.sys.mjs'); - 'resource://testing-common/dom/quota/test/modules/ModuleLoader.sys.mjs': typeof import('resource://testing-common/dom/quota/test/modules/ModuleLoader.sys.mjs'); - 'resource://testing-common/dom/quota/test/modules/PrefUtils.sys.mjs': typeof import('resource://testing-common/dom/quota/test/modules/PrefUtils.sys.mjs'); - 'resource://testing-common/dom/quota/test/modules/PrincipalUtils.sys.mjs': typeof import('resource://testing-common/dom/quota/test/modules/PrincipalUtils.sys.mjs'); - 'resource://testing-common/dom/quota/test/modules/ProcessUtils.sys.mjs': typeof import('resource://testing-common/dom/quota/test/modules/ProcessUtils.sys.mjs'); - 'resource://testing-common/dom/quota/test/modules/QuotaUtils.sys.mjs': typeof import('resource://testing-common/dom/quota/test/modules/QuotaUtils.sys.mjs'); - 'resource://testing-common/dom/quota/test/modules/StorageUtils.sys.mjs': typeof import('resource://testing-common/dom/quota/test/modules/StorageUtils.sys.mjs'); - 'resource://testing-common/dom/quota/test/modules/Utils.sys.mjs': typeof import('resource://testing-common/dom/quota/test/modules/Utils.sys.mjs'); - 'resource://testing-common/dom/quota/test/modules/WorkerDriver.sys.mjs': typeof import('resource://testing-common/dom/quota/test/modules/WorkerDriver.sys.mjs'); - 'resource://testing-common/dom/simpledb/test/modules/SimpleDBUtils.sys.mjs': typeof import('resource://testing-common/dom/simpledb/test/modules/SimpleDBUtils.sys.mjs'); - 'resource://testing-common/early_hint_preload_test_helper.sys.mjs': typeof import('resource://testing-common/early_hint_preload_test_helper.sys.mjs'); - 'resource://testing-common/httpd.sys.mjs': typeof import('resource://testing-common/httpd.sys.mjs'); - 'resource://testing-common/services/common/logging.sys.mjs': typeof import('resource://testing-common/services/common/logging.sys.mjs'); - 'resource://testing-common/services/sync/fakeservices.sys.mjs': typeof import('resource://testing-common/services/sync/fakeservices.sys.mjs'); - 'resource://testing-common/services/sync/fxa_utils.sys.mjs': typeof import('resource://testing-common/services/sync/fxa_utils.sys.mjs'); - 'resource://testing-common/services/sync/rotaryengine.sys.mjs': typeof import('resource://testing-common/services/sync/rotaryengine.sys.mjs'); - 'resource://testing-common/services/sync/utils.sys.mjs': typeof import('resource://testing-common/services/sync/utils.sys.mjs'); - 'resource://testing-common/simple_unknown_uri_helpers.sys.mjs': typeof import('resource://testing-common/simple_unknown_uri_helpers.sys.mjs'); - 'resource://tps/auth/fxaccounts.sys.mjs': typeof import('resource://tps/auth/fxaccounts.sys.mjs'); - 'resource://tps/logger.sys.mjs': typeof import('resource://tps/logger.sys.mjs'); - 'resource://tps/modules/addons.sys.mjs': typeof import('resource://tps/modules/addons.sys.mjs'); - 'resource://tps/modules/bookmarkValidator.sys.mjs': typeof import('resource://tps/modules/bookmarkValidator.sys.mjs'); - 'resource://tps/modules/bookmarks.sys.mjs': typeof import('resource://tps/modules/bookmarks.sys.mjs'); - 'resource://tps/modules/formautofill.sys.mjs': typeof import('resource://tps/modules/formautofill.sys.mjs'); - 'resource://tps/modules/forms.sys.mjs': typeof import('resource://tps/modules/forms.sys.mjs'); - 'resource://tps/modules/history.sys.mjs': typeof import('resource://tps/modules/history.sys.mjs'); - 'resource://tps/modules/passwords.sys.mjs': typeof import('resource://tps/modules/passwords.sys.mjs'); - 'resource://tps/modules/prefs.sys.mjs': typeof import('resource://tps/modules/prefs.sys.mjs'); - 'resource://tps/modules/tabs.sys.mjs': typeof import('resource://tps/modules/tabs.sys.mjs'); - 'resource://tps/modules/windows.sys.mjs': typeof import('resource://tps/modules/windows.sys.mjs'); - 'resource://tps/quit.sys.mjs': typeof import('resource://tps/quit.sys.mjs'); - 'resource://tps/tps.sys.mjs': typeof import('resource://tps/tps.sys.mjs'); - 'resource://webcompat/AboutCompat.sys.mjs': typeof import('resource://webcompat/AboutCompat.sys.mjs'); + "chrome://browser/content/aboutlogins/aboutLoginsUtils.mjs": typeof import("chrome://browser/content/aboutlogins/aboutLoginsUtils.mjs"); + "chrome://browser/content/asrouter/components/fxa-menu-message.mjs": typeof import("chrome://browser/content/asrouter/components/fxa-menu-message.mjs"); + "chrome://browser/content/backup/backup-constants.mjs": typeof import("chrome://browser/content/backup/backup-constants.mjs"); + "chrome://browser/content/genai/content/link-preview-card-onboarding.mjs": typeof import("chrome://browser/content/genai/content/link-preview-card-onboarding.mjs"); + "chrome://browser/content/genai/content/link-preview-card.mjs": typeof import("chrome://browser/content/genai/content/link-preview-card.mjs"); + "chrome://browser/content/genai/content/model-optin.mjs": typeof import("chrome://browser/content/genai/content/model-optin.mjs"); + "chrome://browser/content/ipprotection/ipprotection-constants.mjs": typeof import("chrome://browser/content/ipprotection/ipprotection-constants.mjs"); + "chrome://browser/content/migration/migration-wizard-constants.mjs": typeof import("chrome://browser/content/migration/migration-wizard-constants.mjs"); + "chrome://browser/content/nsContextMenu.sys.mjs": typeof import("chrome://browser/content/nsContextMenu.sys.mjs"); + "chrome://browser/content/screenshots/fileHelpers.mjs": typeof import("chrome://browser/content/screenshots/fileHelpers.mjs"); + "chrome://browser/content/sidebar/sidebar-main.mjs": typeof import("chrome://browser/content/sidebar/sidebar-main.mjs"); + "chrome://browser/content/sidebar/sidebar-panel-header.mjs": typeof import("chrome://browser/content/sidebar/sidebar-panel-header.mjs"); + "chrome://browser/content/tabbrowser/tab-hover-preview.mjs": typeof import("chrome://browser/content/tabbrowser/tab-hover-preview.mjs"); + "chrome://browser/content/translations/TranslationsPanelShared.sys.mjs": typeof import("chrome://browser/content/translations/TranslationsPanelShared.sys.mjs"); + "chrome://browser/content/webrtc/webrtc-preview.mjs": typeof import("chrome://browser/content/webrtc/webrtc-preview.mjs"); + "chrome://devtools-startup/content/DevToolsShim.sys.mjs": typeof import("chrome://devtools-startup/content/DevToolsShim.sys.mjs"); + "chrome://formautofill/content/manageDialog.mjs": typeof import("chrome://formautofill/content/manageDialog.mjs"); + "chrome://global/content/aboutLogging/profileStorage.mjs": typeof import("chrome://global/content/aboutLogging/profileStorage.mjs"); + "chrome://global/content/certviewer/certDecoder.mjs": typeof import("chrome://global/content/certviewer/certDecoder.mjs"); + "chrome://global/content/elements/browser-custom-element.mjs": typeof import("chrome://global/content/elements/browser-custom-element.mjs"); + "chrome://global/content/ml/BlockWords.sys.mjs": typeof import("chrome://global/content/ml/BlockWords.sys.mjs"); + "chrome://global/content/ml/ClusterAlgos.sys.mjs": typeof import("chrome://global/content/ml/ClusterAlgos.sys.mjs"); + "chrome://global/content/ml/EmbeddingsGenerator.sys.mjs": typeof import("chrome://global/content/ml/EmbeddingsGenerator.sys.mjs"); + "chrome://global/content/ml/EngineProcess.sys.mjs": typeof import("chrome://global/content/ml/EngineProcess.sys.mjs"); + "chrome://global/content/ml/ModelHub.sys.mjs": typeof import("chrome://global/content/ml/ModelHub.sys.mjs"); + "chrome://global/content/ml/NLPUtils.sys.mjs": typeof import("chrome://global/content/ml/NLPUtils.sys.mjs"); + "chrome://global/content/ml/OPFS.sys.mjs": typeof import("chrome://global/content/ml/OPFS.sys.mjs"); + "chrome://global/content/ml/StopWords.sys.mjs": typeof import("chrome://global/content/ml/StopWords.sys.mjs"); + "chrome://global/content/ml/Utils.sys.mjs": typeof import("chrome://global/content/ml/Utils.sys.mjs"); + "chrome://global/content/ml/backends/LlamaCppPipeline.mjs": typeof import("chrome://global/content/ml/backends/LlamaCppPipeline.mjs"); + "chrome://global/content/ml/backends/LlamaPipeline.mjs": typeof import("chrome://global/content/ml/backends/LlamaPipeline.mjs"); + "chrome://global/content/ml/backends/ONNXPipeline.mjs": typeof import("chrome://global/content/ml/backends/ONNXPipeline.mjs"); + "chrome://global/content/ml/backends/OpenAIPipeline.mjs": typeof import("chrome://global/content/ml/backends/OpenAIPipeline.mjs"); + "chrome://global/content/ml/backends/Pipeline.mjs": typeof import("chrome://global/content/ml/backends/Pipeline.mjs"); + "chrome://global/content/ml/backends/StaticEmbeddingsPipeline.mjs": typeof import("chrome://global/content/ml/backends/StaticEmbeddingsPipeline.mjs"); + "chrome://global/content/preferences/Preferences.mjs": typeof import("chrome://global/content/preferences/Preferences.mjs"); + "chrome://global/content/translations/TranslationsTelemetry.sys.mjs": typeof import("chrome://global/content/translations/TranslationsTelemetry.sys.mjs"); + "chrome://global/content/translations/TranslationsUtils.mjs": typeof import("chrome://global/content/translations/TranslationsUtils.mjs"); + "chrome://global/content/translations/translations-document.sys.mjs": typeof import("chrome://global/content/translations/translations-document.sys.mjs"); + "chrome://global/content/translations/translations-engine.sys.mjs": typeof import("chrome://global/content/translations/translations-engine.sys.mjs"); + "chrome://mochikit/content/ShutdownLeaksCollector.sys.mjs": typeof import("chrome://mochikit/content/ShutdownLeaksCollector.sys.mjs"); + "chrome://mochikit/content/tests/SimpleTest/DragSourceChildContext.sys.mjs": typeof import("chrome://mochikit/content/tests/SimpleTest/DragSourceChildContext.sys.mjs"); + "chrome://mochikit/content/tests/SimpleTest/DragSourceParentContext.sys.mjs": typeof import("chrome://mochikit/content/tests/SimpleTest/DragSourceParentContext.sys.mjs"); + "chrome://mochikit/content/tests/SimpleTest/DragTargetChildContext.sys.mjs": typeof import("chrome://mochikit/content/tests/SimpleTest/DragTargetChildContext.sys.mjs"); + "chrome://mochikit/content/tests/SimpleTest/DragTargetParentContext.sys.mjs": typeof import("chrome://mochikit/content/tests/SimpleTest/DragTargetParentContext.sys.mjs"); + "chrome://mochitests/content/browser/accessible/tests/browser/Common.sys.mjs": typeof import("chrome://mochitests/content/browser/accessible/tests/browser/Common.sys.mjs"); + "chrome://mochitests/content/browser/accessible/tests/browser/Layout.sys.mjs": typeof import("chrome://mochitests/content/browser/accessible/tests/browser/Layout.sys.mjs"); + "chrome://mochitests/content/browser/devtools/client/debugger/test/mochitest/examples/worker-esm-dep.mjs": typeof import("chrome://mochitests/content/browser/devtools/client/debugger/test/mochitest/examples/worker-esm-dep.mjs"); + "chrome://mochitests/content/browser/devtools/shared/test-helpers/trace-objects.sys.mjs": typeof import("chrome://mochitests/content/browser/devtools/shared/test-helpers/trace-objects.sys.mjs"); + "chrome://mochitests/content/browser/js/xpconnect/tests/browser/worker_source.mjs": typeof import("chrome://mochitests/content/browser/js/xpconnect/tests/browser/worker_source.mjs"); + "chrome://mochitests/content/browser/remote/shared/messagehandler/test/browser/resources/modules/ModuleRegistry.sys.mjs": typeof import("chrome://mochitests/content/browser/remote/shared/messagehandler/test/browser/resources/modules/ModuleRegistry.sys.mjs"); + "chrome://mochitests/content/browser/toolkit/components/translations/tests/browser/translations-test.mjs": typeof import("chrome://mochitests/content/browser/toolkit/components/translations/tests/browser/translations-test.mjs"); + "chrome://mochitests/content/chrome/dom/network/tests/tcpsocket_test.sys.mjs": typeof import("chrome://mochitests/content/chrome/dom/network/tests/tcpsocket_test.sys.mjs"); + "chrome://mochitests/content/chrome/dom/url/tests/file_worker_url.sys.mjs": typeof import("chrome://mochitests/content/chrome/dom/url/tests/file_worker_url.sys.mjs"); + "chrome://mochitests/content/chrome/dom/url/tests/test_bug883784.sys.mjs": typeof import("chrome://mochitests/content/chrome/dom/url/tests/test_bug883784.sys.mjs"); + "chrome://mochitests/content/chrome/dom/workers/test/WorkerTest.sys.mjs": typeof import("chrome://mochitests/content/chrome/dom/workers/test/WorkerTest.sys.mjs"); + "chrome://remote/content/components/Marionette.sys.mjs": typeof import("chrome://remote/content/components/Marionette.sys.mjs"); + "chrome://remote/content/components/RemoteAgent.sys.mjs": typeof import("chrome://remote/content/components/RemoteAgent.sys.mjs"); + "chrome://remote/content/marionette/actors/MarionetteCommandsParent.sys.mjs": typeof import("chrome://remote/content/marionette/actors/MarionetteCommandsParent.sys.mjs"); + "chrome://remote/content/marionette/actors/MarionetteEventsParent.sys.mjs": typeof import("chrome://remote/content/marionette/actors/MarionetteEventsParent.sys.mjs"); + "chrome://remote/content/marionette/atom.sys.mjs": typeof import("chrome://remote/content/marionette/atom.sys.mjs"); + "chrome://remote/content/marionette/browser.sys.mjs": typeof import("chrome://remote/content/marionette/browser.sys.mjs"); + "chrome://remote/content/marionette/cookie.sys.mjs": typeof import("chrome://remote/content/marionette/cookie.sys.mjs"); + "chrome://remote/content/marionette/driver.sys.mjs": typeof import("chrome://remote/content/marionette/driver.sys.mjs"); + "chrome://remote/content/marionette/evaluate.sys.mjs": typeof import("chrome://remote/content/marionette/evaluate.sys.mjs"); + "chrome://remote/content/marionette/interaction.sys.mjs": typeof import("chrome://remote/content/marionette/interaction.sys.mjs"); + "chrome://remote/content/marionette/json.sys.mjs": typeof import("chrome://remote/content/marionette/json.sys.mjs"); + "chrome://remote/content/marionette/l10n.sys.mjs": typeof import("chrome://remote/content/marionette/l10n.sys.mjs"); + "chrome://remote/content/marionette/message.sys.mjs": typeof import("chrome://remote/content/marionette/message.sys.mjs"); + "chrome://remote/content/marionette/navigate.sys.mjs": typeof import("chrome://remote/content/marionette/navigate.sys.mjs"); + "chrome://remote/content/marionette/packets.sys.mjs": typeof import("chrome://remote/content/marionette/packets.sys.mjs"); + "chrome://remote/content/marionette/prefs.sys.mjs": typeof import("chrome://remote/content/marionette/prefs.sys.mjs"); + "chrome://remote/content/marionette/reftest.sys.mjs": typeof import("chrome://remote/content/marionette/reftest.sys.mjs"); + "chrome://remote/content/marionette/server.sys.mjs": typeof import("chrome://remote/content/marionette/server.sys.mjs"); + "chrome://remote/content/marionette/stream-utils.sys.mjs": typeof import("chrome://remote/content/marionette/stream-utils.sys.mjs"); + "chrome://remote/content/marionette/sync.sys.mjs": typeof import("chrome://remote/content/marionette/sync.sys.mjs"); + "chrome://remote/content/marionette/transport.sys.mjs": typeof import("chrome://remote/content/marionette/transport.sys.mjs"); + "chrome://remote/content/marionette/web-reference.sys.mjs": typeof import("chrome://remote/content/marionette/web-reference.sys.mjs"); + "chrome://remote/content/marionette/webauthn.sys.mjs": typeof import("chrome://remote/content/marionette/webauthn.sys.mjs"); + "chrome://remote/content/server/WebSocketHandshake.sys.mjs": typeof import("chrome://remote/content/server/WebSocketHandshake.sys.mjs"); + "chrome://remote/content/server/WebSocketTransport.sys.mjs": typeof import("chrome://remote/content/server/WebSocketTransport.sys.mjs"); + "chrome://remote/content/server/httpd.sys.mjs": typeof import("chrome://remote/content/server/httpd.sys.mjs"); + "chrome://remote/content/shared/Addon.sys.mjs": typeof import("chrome://remote/content/shared/Addon.sys.mjs"); + "chrome://remote/content/shared/AppInfo.sys.mjs": typeof import("chrome://remote/content/shared/AppInfo.sys.mjs"); + "chrome://remote/content/shared/AsyncQueue.sys.mjs": typeof import("chrome://remote/content/shared/AsyncQueue.sys.mjs"); + "chrome://remote/content/shared/Browser.sys.mjs": typeof import("chrome://remote/content/shared/Browser.sys.mjs"); + "chrome://remote/content/shared/Capture.sys.mjs": typeof import("chrome://remote/content/shared/Capture.sys.mjs"); + "chrome://remote/content/shared/ChallengeHeaderParser.sys.mjs": typeof import("chrome://remote/content/shared/ChallengeHeaderParser.sys.mjs"); + "chrome://remote/content/shared/DOM.sys.mjs": typeof import("chrome://remote/content/shared/DOM.sys.mjs"); + "chrome://remote/content/shared/Format.sys.mjs": typeof import("chrome://remote/content/shared/Format.sys.mjs"); + "chrome://remote/content/shared/Log.sys.mjs": typeof import("chrome://remote/content/shared/Log.sys.mjs"); + "chrome://remote/content/shared/MobileTabBrowser.sys.mjs": typeof import("chrome://remote/content/shared/MobileTabBrowser.sys.mjs"); + "chrome://remote/content/shared/NavigableManager.sys.mjs": typeof import("chrome://remote/content/shared/NavigableManager.sys.mjs"); + "chrome://remote/content/shared/Navigate.sys.mjs": typeof import("chrome://remote/content/shared/Navigate.sys.mjs"); + "chrome://remote/content/shared/NavigationManager.sys.mjs": typeof import("chrome://remote/content/shared/NavigationManager.sys.mjs"); + "chrome://remote/content/shared/NetworkCacheManager.sys.mjs": typeof import("chrome://remote/content/shared/NetworkCacheManager.sys.mjs"); + "chrome://remote/content/shared/NetworkDecodedBodySizeMap.sys.mjs": typeof import("chrome://remote/content/shared/NetworkDecodedBodySizeMap.sys.mjs"); + "chrome://remote/content/shared/NetworkRequest.sys.mjs": typeof import("chrome://remote/content/shared/NetworkRequest.sys.mjs"); + "chrome://remote/content/shared/NetworkResponse.sys.mjs": typeof import("chrome://remote/content/shared/NetworkResponse.sys.mjs"); + "chrome://remote/content/shared/PDF.sys.mjs": typeof import("chrome://remote/content/shared/PDF.sys.mjs"); + "chrome://remote/content/shared/Permissions.sys.mjs": typeof import("chrome://remote/content/shared/Permissions.sys.mjs"); + "chrome://remote/content/shared/Prompt.sys.mjs": typeof import("chrome://remote/content/shared/Prompt.sys.mjs"); + "chrome://remote/content/shared/Realm.sys.mjs": typeof import("chrome://remote/content/shared/Realm.sys.mjs"); + "chrome://remote/content/shared/RecommendedPreferences.sys.mjs": typeof import("chrome://remote/content/shared/RecommendedPreferences.sys.mjs"); + "chrome://remote/content/shared/RemoteError.sys.mjs": typeof import("chrome://remote/content/shared/RemoteError.sys.mjs"); + "chrome://remote/content/shared/Stack.sys.mjs": typeof import("chrome://remote/content/shared/Stack.sys.mjs"); + "chrome://remote/content/shared/Sync.sys.mjs": typeof import("chrome://remote/content/shared/Sync.sys.mjs"); + "chrome://remote/content/shared/TabManager.sys.mjs": typeof import("chrome://remote/content/shared/TabManager.sys.mjs"); + "chrome://remote/content/shared/UUID.sys.mjs": typeof import("chrome://remote/content/shared/UUID.sys.mjs"); + "chrome://remote/content/shared/UserContextManager.sys.mjs": typeof import("chrome://remote/content/shared/UserContextManager.sys.mjs"); + "chrome://remote/content/shared/WindowManager.sys.mjs": typeof import("chrome://remote/content/shared/WindowManager.sys.mjs"); + "chrome://remote/content/shared/js-process-actors/WebDriverDocumentInsertedActor.sys.mjs": typeof import("chrome://remote/content/shared/js-process-actors/WebDriverDocumentInsertedActor.sys.mjs"); + "chrome://remote/content/shared/listeners/BeforeStopRequestListener.sys.mjs": typeof import("chrome://remote/content/shared/listeners/BeforeStopRequestListener.sys.mjs"); + "chrome://remote/content/shared/listeners/BrowsingContextListener.sys.mjs": typeof import("chrome://remote/content/shared/listeners/BrowsingContextListener.sys.mjs"); + "chrome://remote/content/shared/listeners/CachedResourceListener.sys.mjs": typeof import("chrome://remote/content/shared/listeners/CachedResourceListener.sys.mjs"); + "chrome://remote/content/shared/listeners/ConsoleAPIListener.sys.mjs": typeof import("chrome://remote/content/shared/listeners/ConsoleAPIListener.sys.mjs"); + "chrome://remote/content/shared/listeners/ConsoleListener.sys.mjs": typeof import("chrome://remote/content/shared/listeners/ConsoleListener.sys.mjs"); + "chrome://remote/content/shared/listeners/ContextualIdentityListener.sys.mjs": typeof import("chrome://remote/content/shared/listeners/ContextualIdentityListener.sys.mjs"); + "chrome://remote/content/shared/listeners/DataChannelListener.sys.mjs": typeof import("chrome://remote/content/shared/listeners/DataChannelListener.sys.mjs"); + "chrome://remote/content/shared/listeners/DownloadListener.sys.mjs": typeof import("chrome://remote/content/shared/listeners/DownloadListener.sys.mjs"); + "chrome://remote/content/shared/listeners/LoadListener.sys.mjs": typeof import("chrome://remote/content/shared/listeners/LoadListener.sys.mjs"); + "chrome://remote/content/shared/listeners/NavigationListener.sys.mjs": typeof import("chrome://remote/content/shared/listeners/NavigationListener.sys.mjs"); + "chrome://remote/content/shared/listeners/NetworkEventRecord.sys.mjs": typeof import("chrome://remote/content/shared/listeners/NetworkEventRecord.sys.mjs"); + "chrome://remote/content/shared/listeners/NetworkListener.sys.mjs": typeof import("chrome://remote/content/shared/listeners/NetworkListener.sys.mjs"); + "chrome://remote/content/shared/listeners/ParentWebProgressListener.sys.mjs": typeof import("chrome://remote/content/shared/listeners/ParentWebProgressListener.sys.mjs"); + "chrome://remote/content/shared/listeners/PromptListener.sys.mjs": typeof import("chrome://remote/content/shared/listeners/PromptListener.sys.mjs"); + "chrome://remote/content/shared/messagehandler/Errors.sys.mjs": typeof import("chrome://remote/content/shared/messagehandler/Errors.sys.mjs"); + "chrome://remote/content/shared/messagehandler/EventsDispatcher.sys.mjs": typeof import("chrome://remote/content/shared/messagehandler/EventsDispatcher.sys.mjs"); + "chrome://remote/content/shared/messagehandler/MessageHandler.sys.mjs": typeof import("chrome://remote/content/shared/messagehandler/MessageHandler.sys.mjs"); + "chrome://remote/content/shared/messagehandler/MessageHandlerRegistry.sys.mjs": typeof import("chrome://remote/content/shared/messagehandler/MessageHandlerRegistry.sys.mjs"); + "chrome://remote/content/shared/messagehandler/ModuleCache.sys.mjs": typeof import("chrome://remote/content/shared/messagehandler/ModuleCache.sys.mjs"); + "chrome://remote/content/shared/messagehandler/RootMessageHandler.sys.mjs": typeof import("chrome://remote/content/shared/messagehandler/RootMessageHandler.sys.mjs"); + "chrome://remote/content/shared/messagehandler/RootMessageHandlerRegistry.sys.mjs": typeof import("chrome://remote/content/shared/messagehandler/RootMessageHandlerRegistry.sys.mjs"); + "chrome://remote/content/shared/messagehandler/WindowGlobalMessageHandler.sys.mjs": typeof import("chrome://remote/content/shared/messagehandler/WindowGlobalMessageHandler.sys.mjs"); + "chrome://remote/content/shared/messagehandler/sessiondata/SessionData.sys.mjs": typeof import("chrome://remote/content/shared/messagehandler/sessiondata/SessionData.sys.mjs"); + "chrome://remote/content/shared/messagehandler/sessiondata/SessionDataReader.sys.mjs": typeof import("chrome://remote/content/shared/messagehandler/sessiondata/SessionDataReader.sys.mjs"); + "chrome://remote/content/shared/messagehandler/transports/BrowsingContextUtils.sys.mjs": typeof import("chrome://remote/content/shared/messagehandler/transports/BrowsingContextUtils.sys.mjs"); + "chrome://remote/content/shared/messagehandler/transports/RootTransport.sys.mjs": typeof import("chrome://remote/content/shared/messagehandler/transports/RootTransport.sys.mjs"); + "chrome://remote/content/shared/messagehandler/transports/js-window-actors/MessageHandlerFrameActor.sys.mjs": typeof import("chrome://remote/content/shared/messagehandler/transports/js-window-actors/MessageHandlerFrameActor.sys.mjs"); + "chrome://remote/content/shared/messagehandler/transports/js-window-actors/MessageHandlerFrameChild.sys.mjs": typeof import("chrome://remote/content/shared/messagehandler/transports/js-window-actors/MessageHandlerFrameChild.sys.mjs"); + "chrome://remote/content/shared/webdriver/Accessibility.sys.mjs": typeof import("chrome://remote/content/shared/webdriver/Accessibility.sys.mjs"); + "chrome://remote/content/shared/webdriver/Actions.sys.mjs": typeof import("chrome://remote/content/shared/webdriver/Actions.sys.mjs"); + "chrome://remote/content/shared/webdriver/Assert.sys.mjs": typeof import("chrome://remote/content/shared/webdriver/Assert.sys.mjs"); + "chrome://remote/content/shared/webdriver/Capabilities.sys.mjs": typeof import("chrome://remote/content/shared/webdriver/Capabilities.sys.mjs"); + "chrome://remote/content/shared/webdriver/Certificates.sys.mjs": typeof import("chrome://remote/content/shared/webdriver/Certificates.sys.mjs"); + "chrome://remote/content/shared/webdriver/Errors.sys.mjs": typeof import("chrome://remote/content/shared/webdriver/Errors.sys.mjs"); + "chrome://remote/content/shared/webdriver/Event.sys.mjs": typeof import("chrome://remote/content/shared/webdriver/Event.sys.mjs"); + "chrome://remote/content/shared/webdriver/KeyData.sys.mjs": typeof import("chrome://remote/content/shared/webdriver/KeyData.sys.mjs"); + "chrome://remote/content/shared/webdriver/NodeCache.sys.mjs": typeof import("chrome://remote/content/shared/webdriver/NodeCache.sys.mjs"); + "chrome://remote/content/shared/webdriver/Session.sys.mjs": typeof import("chrome://remote/content/shared/webdriver/Session.sys.mjs"); + "chrome://remote/content/shared/webdriver/URLPattern.sys.mjs": typeof import("chrome://remote/content/shared/webdriver/URLPattern.sys.mjs"); + "chrome://remote/content/shared/webdriver/UserPromptHandler.sys.mjs": typeof import("chrome://remote/content/shared/webdriver/UserPromptHandler.sys.mjs"); + "chrome://remote/content/shared/webdriver/process-actors/WebDriverProcessDataParent.sys.mjs": typeof import("chrome://remote/content/shared/webdriver/process-actors/WebDriverProcessDataParent.sys.mjs"); + "chrome://remote/content/webdriver-bidi/NewSessionHandler.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/NewSessionHandler.sys.mjs"); + "chrome://remote/content/webdriver-bidi/ProxyPerUserContextManager.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/ProxyPerUserContextManager.sys.mjs"); + "chrome://remote/content/webdriver-bidi/RemoteValue.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/RemoteValue.sys.mjs"); + "chrome://remote/content/webdriver-bidi/WebDriverBiDi.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/WebDriverBiDi.sys.mjs"); + "chrome://remote/content/webdriver-bidi/WebDriverBiDiConnection.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/WebDriverBiDiConnection.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/Intercept.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/Intercept.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/ModuleRegistry.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/ModuleRegistry.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/root/browser.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/root/browser.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/root/browsingContext.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/root/browsingContext.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/root/emulation.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/root/emulation.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/root/input.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/root/input.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/root/log.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/root/log.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/root/network.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/root/network.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/root/permissions.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/root/permissions.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/root/script.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/root/script.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/root/session.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/root/session.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/root/storage.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/root/storage.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/root/webExtension.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/root/webExtension.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/windowglobal-in-root/browsingContext.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/windowglobal-in-root/browsingContext.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/windowglobal-in-root/log.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/windowglobal-in-root/log.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/windowglobal-in-root/network.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/windowglobal-in-root/network.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/windowglobal-in-root/script.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/windowglobal-in-root/script.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/windowglobal/_configuration.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/windowglobal/_configuration.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/windowglobal/browsingContext.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/windowglobal/browsingContext.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/windowglobal/emulation.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/windowglobal/emulation.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/windowglobal/input.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/windowglobal/input.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/windowglobal/log.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/windowglobal/log.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/windowglobal/network.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/windowglobal/network.sys.mjs"); + "chrome://remote/content/webdriver-bidi/modules/windowglobal/script.sys.mjs": typeof import("chrome://remote/content/webdriver-bidi/modules/windowglobal/script.sys.mjs"); + "moz-src:///browser/components/DefaultBrowserCheck.sys.mjs": typeof import("moz-src:///browser/components/DefaultBrowserCheck.sys.mjs"); + "moz-src:///browser/components/DesktopActorRegistry.sys.mjs": typeof import("moz-src:///browser/components/DesktopActorRegistry.sys.mjs"); + "moz-src:///browser/components/ProfileDataUpgrader.sys.mjs": typeof import("moz-src:///browser/components/ProfileDataUpgrader.sys.mjs"); + "moz-src:///browser/components/StartupTelemetry.sys.mjs": typeof import("moz-src:///browser/components/StartupTelemetry.sys.mjs"); + "moz-src:///browser/components/attribution/AttributionCode.sys.mjs": typeof import("moz-src:///browser/components/attribution/AttributionCode.sys.mjs"); + "moz-src:///browser/components/attribution/MacAttribution.sys.mjs": typeof import("moz-src:///browser/components/attribution/MacAttribution.sys.mjs"); + "moz-src:///browser/components/contentanalysis/content/ContentAnalysis.sys.mjs": typeof import("moz-src:///browser/components/contentanalysis/content/ContentAnalysis.sys.mjs"); + "moz-src:///browser/components/customizableui/CustomizableUI.sys.mjs": typeof import("moz-src:///browser/components/customizableui/CustomizableUI.sys.mjs"); + "moz-src:///browser/components/customizableui/CustomizableWidgets.sys.mjs": typeof import("moz-src:///browser/components/customizableui/CustomizableWidgets.sys.mjs"); + "moz-src:///browser/components/customizableui/CustomizeMode.sys.mjs": typeof import("moz-src:///browser/components/customizableui/CustomizeMode.sys.mjs"); + "moz-src:///browser/components/customizableui/DragPositionManager.sys.mjs": typeof import("moz-src:///browser/components/customizableui/DragPositionManager.sys.mjs"); + "moz-src:///browser/components/customizableui/PanelMultiView.sys.mjs": typeof import("moz-src:///browser/components/customizableui/PanelMultiView.sys.mjs"); + "moz-src:///browser/components/customizableui/SearchWidgetTracker.sys.mjs": typeof import("moz-src:///browser/components/customizableui/SearchWidgetTracker.sys.mjs"); + "moz-src:///browser/components/customizableui/ToolbarContextMenu.sys.mjs": typeof import("moz-src:///browser/components/customizableui/ToolbarContextMenu.sys.mjs"); + "moz-src:///browser/components/customizableui/ToolbarDropHandler.sys.mjs": typeof import("moz-src:///browser/components/customizableui/ToolbarDropHandler.sys.mjs"); + "moz-src:///browser/components/downloads/DownloadSpamProtection.sys.mjs": typeof import("moz-src:///browser/components/downloads/DownloadSpamProtection.sys.mjs"); + "moz-src:///browser/components/downloads/DownloadsCommon.sys.mjs": typeof import("moz-src:///browser/components/downloads/DownloadsCommon.sys.mjs"); + "moz-src:///browser/components/downloads/DownloadsMacFinderProgress.sys.mjs": typeof import("moz-src:///browser/components/downloads/DownloadsMacFinderProgress.sys.mjs"); + "moz-src:///browser/components/downloads/DownloadsTaskbar.sys.mjs": typeof import("moz-src:///browser/components/downloads/DownloadsTaskbar.sys.mjs"); + "moz-src:///browser/components/downloads/DownloadsViewUI.sys.mjs": typeof import("moz-src:///browser/components/downloads/DownloadsViewUI.sys.mjs"); + "moz-src:///browser/components/downloads/DownloadsViewableInternally.sys.mjs": typeof import("moz-src:///browser/components/downloads/DownloadsViewableInternally.sys.mjs"); + "moz-src:///browser/components/genai/LinkPreview.sys.mjs": typeof import("moz-src:///browser/components/genai/LinkPreview.sys.mjs"); + "moz-src:///browser/components/genai/LinkPreviewModel.sys.mjs": typeof import("moz-src:///browser/components/genai/LinkPreviewModel.sys.mjs"); + "moz-src:///browser/components/genai/PageAssist.sys.mjs": typeof import("moz-src:///browser/components/genai/PageAssist.sys.mjs"); + "moz-src:///browser/components/genai/SmartAssistEngine.sys.mjs": typeof import("moz-src:///browser/components/genai/SmartAssistEngine.sys.mjs"); + "moz-src:///browser/components/mozcachedohttp/MozCachedOHTTPProtocolHandler.sys.mjs": typeof import("moz-src:///browser/components/mozcachedohttp/MozCachedOHTTPProtocolHandler.sys.mjs"); + "moz-src:///browser/components/newtab/SponsorProtection.sys.mjs": typeof import("moz-src:///browser/components/newtab/SponsorProtection.sys.mjs"); + "moz-src:///browser/components/pagedata/OpenGraphPageData.sys.mjs": typeof import("moz-src:///browser/components/pagedata/OpenGraphPageData.sys.mjs"); + "moz-src:///browser/components/pagedata/PageDataSchema.sys.mjs": typeof import("moz-src:///browser/components/pagedata/PageDataSchema.sys.mjs"); + "moz-src:///browser/components/pagedata/PageDataService.sys.mjs": typeof import("moz-src:///browser/components/pagedata/PageDataService.sys.mjs"); + "moz-src:///browser/components/pagedata/SchemaOrgPageData.sys.mjs": typeof import("moz-src:///browser/components/pagedata/SchemaOrgPageData.sys.mjs"); + "moz-src:///browser/components/pagedata/TwitterPageData.sys.mjs": typeof import("moz-src:///browser/components/pagedata/TwitterPageData.sys.mjs"); + "moz-src:///browser/components/places/Interactions.sys.mjs": typeof import("moz-src:///browser/components/places/Interactions.sys.mjs"); + "moz-src:///browser/components/places/InteractionsBlocklist.sys.mjs": typeof import("moz-src:///browser/components/places/InteractionsBlocklist.sys.mjs"); + "moz-src:///browser/components/places/PlacesBrowserStartup.sys.mjs": typeof import("moz-src:///browser/components/places/PlacesBrowserStartup.sys.mjs"); + "moz-src:///browser/components/places/PlacesUIUtils.sys.mjs": typeof import("moz-src:///browser/components/places/PlacesUIUtils.sys.mjs"); + "moz-src:///browser/components/privatebrowsing/ResetPBMPanel.sys.mjs": typeof import("moz-src:///browser/components/privatebrowsing/ResetPBMPanel.sys.mjs"); + "moz-src:///browser/components/protections/ContentBlockingPrefs.sys.mjs": typeof import("moz-src:///browser/components/protections/ContentBlockingPrefs.sys.mjs"); + "moz-src:///browser/components/reportbrokensite/ReportBrokenSite.sys.mjs": typeof import("moz-src:///browser/components/reportbrokensite/ReportBrokenSite.sys.mjs"); + "moz-src:///browser/components/search/BrowserSearchTelemetry.sys.mjs": typeof import("moz-src:///browser/components/search/BrowserSearchTelemetry.sys.mjs"); + "moz-src:///browser/components/search/OpenSearchManager.sys.mjs": typeof import("moz-src:///browser/components/search/OpenSearchManager.sys.mjs"); + "moz-src:///browser/components/search/SERPCategorization.sys.mjs": typeof import("moz-src:///browser/components/search/SERPCategorization.sys.mjs"); + "moz-src:///browser/components/search/SearchOneOffs.sys.mjs": typeof import("moz-src:///browser/components/search/SearchOneOffs.sys.mjs"); + "moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs": typeof import("moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs"); + "moz-src:///browser/components/search/SearchUIUtils.sys.mjs": typeof import("moz-src:///browser/components/search/SearchUIUtils.sys.mjs"); + "moz-src:///browser/components/shell/HeadlessShell.sys.mjs": typeof import("moz-src:///browser/components/shell/HeadlessShell.sys.mjs"); + "moz-src:///browser/components/shell/ShellService.sys.mjs": typeof import("moz-src:///browser/components/shell/ShellService.sys.mjs"); + "moz-src:///browser/components/shell/StartupOSIntegration.sys.mjs": typeof import("moz-src:///browser/components/shell/StartupOSIntegration.sys.mjs"); + "moz-src:///browser/components/sidebar/SidebarManager.sys.mjs": typeof import("moz-src:///browser/components/sidebar/SidebarManager.sys.mjs"); + "moz-src:///browser/components/sidebar/SidebarState.sys.mjs": typeof import("moz-src:///browser/components/sidebar/SidebarState.sys.mjs"); + "moz-src:///browser/components/sidebar/SidebarTreeView.sys.mjs": typeof import("moz-src:///browser/components/sidebar/SidebarTreeView.sys.mjs"); + "moz-src:///browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs": typeof import("moz-src:///browser/components/tabbrowser/AsyncTabSwitcher.sys.mjs"); + "moz-src:///browser/components/tabbrowser/GroupsList.sys.mjs": typeof import("moz-src:///browser/components/tabbrowser/GroupsList.sys.mjs"); + "moz-src:///browser/components/tabbrowser/NewTabPagePreloading.sys.mjs": typeof import("moz-src:///browser/components/tabbrowser/NewTabPagePreloading.sys.mjs"); + "moz-src:///browser/components/tabbrowser/OpenInTabsUtils.sys.mjs": typeof import("moz-src:///browser/components/tabbrowser/OpenInTabsUtils.sys.mjs"); + "moz-src:///browser/components/tabbrowser/SmartTabGrouping.sys.mjs": typeof import("moz-src:///browser/components/tabbrowser/SmartTabGrouping.sys.mjs"); + "moz-src:///browser/components/tabbrowser/TabMetrics.sys.mjs": typeof import("moz-src:///browser/components/tabbrowser/TabMetrics.sys.mjs"); + "moz-src:///browser/components/tabbrowser/TabUnloader.sys.mjs": typeof import("moz-src:///browser/components/tabbrowser/TabUnloader.sys.mjs"); + "moz-src:///browser/components/tabbrowser/TabsList.sys.mjs": typeof import("moz-src:///browser/components/tabbrowser/TabsList.sys.mjs"); + "moz-src:///browser/components/uitour/UITour.sys.mjs": typeof import("moz-src:///browser/components/uitour/UITour.sys.mjs"); + "moz-src:///browser/components/uitour/UITourUtils.sys.mjs": typeof import("moz-src:///browser/components/uitour/UITourUtils.sys.mjs"); + "moz-src:///browser/components/urlbar/ActionsProviderContextualSearch.sys.mjs": typeof import("moz-src:///browser/components/urlbar/ActionsProviderContextualSearch.sys.mjs"); + "moz-src:///browser/components/urlbar/ActionsProviderQuickActions.sys.mjs": typeof import("moz-src:///browser/components/urlbar/ActionsProviderQuickActions.sys.mjs"); + "moz-src:///browser/components/urlbar/MerinoClient.sys.mjs": typeof import("moz-src:///browser/components/urlbar/MerinoClient.sys.mjs"); + "moz-src:///browser/components/urlbar/QuickActionsLoaderDefault.sys.mjs": typeof import("moz-src:///browser/components/urlbar/QuickActionsLoaderDefault.sys.mjs"); + "moz-src:///browser/components/urlbar/QuickSuggest.sys.mjs": typeof import("moz-src:///browser/components/urlbar/QuickSuggest.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarController.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarController.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarEventBufferer.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarEventBufferer.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarInput.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarInput.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarPrefs.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarPrefs.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarProviderAutofill.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarProviderAutofill.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarProviderCalculator.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarProviderCalculator.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarProviderClipboard.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarProviderClipboard.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarProviderGlobalActions.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarProviderGlobalActions.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarProviderInterventions.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarProviderInterventions.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarProviderOpenTabs.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarProviderOpenTabs.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarProviderPlaces.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarProviderPlaces.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarProviderQuickSuggest.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarProviderQuickSuggest.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarProviderSearchSuggestions.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarProviderSearchSuggestions.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarProviderSearchTips.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarProviderSearchTips.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarProviderSemanticHistorySearch.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarProviderSemanticHistorySearch.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarProviderTabToSearch.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarProviderTabToSearch.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarProviderTopSites.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarProviderTopSites.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarProviderUnitConversion.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarProviderUnitConversion.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarProvidersManager.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarProvidersManager.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarResult.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarResult.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarSearchOneOffs.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarSearchOneOffs.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarSearchTermsPersistence.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarSearchTermsPersistence.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarSearchUtils.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarSearchUtils.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarTokenizer.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarTokenizer.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarUtils.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarUtils.sys.mjs"); + "moz-src:///browser/components/urlbar/UrlbarView.sys.mjs": typeof import("moz-src:///browser/components/urlbar/UrlbarView.sys.mjs"); + "moz-src:///browser/components/urlbar/private/AmpSuggestions.sys.mjs": typeof import("moz-src:///browser/components/urlbar/private/AmpSuggestions.sys.mjs"); + "moz-src:///browser/components/urlbar/private/GeolocationUtils.sys.mjs": typeof import("moz-src:///browser/components/urlbar/private/GeolocationUtils.sys.mjs"); + "moz-src:///browser/components/urlbar/private/MLSuggest.sys.mjs": typeof import("moz-src:///browser/components/urlbar/private/MLSuggest.sys.mjs"); + "moz-src:///browser/components/urlbar/private/SuggestBackendRust.sys.mjs": typeof import("moz-src:///browser/components/urlbar/private/SuggestBackendRust.sys.mjs"); + "moz-src:///browser/modules/CanvasPermissionPromptHelper.sys.mjs": typeof import("moz-src:///browser/modules/CanvasPermissionPromptHelper.sys.mjs"); + "moz-src:///browser/modules/ContextId.sys.mjs": typeof import("moz-src:///browser/modules/ContextId.sys.mjs"); + "moz-src:///browser/modules/PrivateBrowsingUI.sys.mjs": typeof import("moz-src:///browser/modules/PrivateBrowsingUI.sys.mjs"); + "moz-src:///browser/modules/UnexpectedScriptObserver.sys.mjs": typeof import("moz-src:///browser/modules/UnexpectedScriptObserver.sys.mjs"); + "moz-src:///browser/modules/WebAuthnPromptHelper.sys.mjs": typeof import("moz-src:///browser/modules/WebAuthnPromptHelper.sys.mjs"); + "moz-src:///browser/themes/ToolbarIconColor.sys.mjs": typeof import("moz-src:///browser/themes/ToolbarIconColor.sys.mjs"); + "moz-src:///dom/notification/MemoryNotificationDB.sys.mjs": typeof import("moz-src:///dom/notification/MemoryNotificationDB.sys.mjs"); + "moz-src:///dom/notification/NotificationDB.sys.mjs": typeof import("moz-src:///dom/notification/NotificationDB.sys.mjs"); + "moz-src:///services/crypto/modules/WeaveCrypto.sys.mjs": typeof import("moz-src:///services/crypto/modules/WeaveCrypto.sys.mjs"); + "moz-src:///services/crypto/modules/jwcrypto.sys.mjs": typeof import("moz-src:///services/crypto/modules/jwcrypto.sys.mjs"); + "moz-src:///services/crypto/modules/utils.sys.mjs": typeof import("moz-src:///services/crypto/modules/utils.sys.mjs"); + "moz-src:///toolkit/components/doh/DoHConfig.sys.mjs": typeof import("moz-src:///toolkit/components/doh/DoHConfig.sys.mjs"); + "moz-src:///toolkit/components/doh/DoHController.sys.mjs": typeof import("moz-src:///toolkit/components/doh/DoHController.sys.mjs"); + "moz-src:///toolkit/components/doh/DoHHeuristics.sys.mjs": typeof import("moz-src:///toolkit/components/doh/DoHHeuristics.sys.mjs"); + "moz-src:///toolkit/components/doh/TRRPerformance.sys.mjs": typeof import("moz-src:///toolkit/components/doh/TRRPerformance.sys.mjs"); + "moz-src:///toolkit/components/pageextractor/DOMExtractor.sys.mjs": typeof import("moz-src:///toolkit/components/pageextractor/DOMExtractor.sys.mjs"); + "moz-src:///toolkit/components/reader/AboutReader.sys.mjs": typeof import("moz-src:///toolkit/components/reader/AboutReader.sys.mjs"); + "moz-src:///toolkit/components/reader/ReaderMode.sys.mjs": typeof import("moz-src:///toolkit/components/reader/ReaderMode.sys.mjs"); + "moz-src:///toolkit/components/reader/ReaderWorker.sys.mjs": typeof import("moz-src:///toolkit/components/reader/ReaderWorker.sys.mjs"); + "moz-src:///toolkit/components/search/AddonSearchEngine.sys.mjs": typeof import("moz-src:///toolkit/components/search/AddonSearchEngine.sys.mjs"); + "moz-src:///toolkit/components/search/ConfigSearchEngine.sys.mjs": typeof import("moz-src:///toolkit/components/search/ConfigSearchEngine.sys.mjs"); + "moz-src:///toolkit/components/search/OpenSearchEngine.sys.mjs": typeof import("moz-src:///toolkit/components/search/OpenSearchEngine.sys.mjs"); + "moz-src:///toolkit/components/search/OpenSearchLoader.sys.mjs": typeof import("moz-src:///toolkit/components/search/OpenSearchLoader.sys.mjs"); + "moz-src:///toolkit/components/search/PolicySearchEngine.sys.mjs": typeof import("moz-src:///toolkit/components/search/PolicySearchEngine.sys.mjs"); + "moz-src:///toolkit/components/search/SearchEngine.sys.mjs": typeof import("moz-src:///toolkit/components/search/SearchEngine.sys.mjs"); + "moz-src:///toolkit/components/search/SearchEngineSelector.sys.mjs": typeof import("moz-src:///toolkit/components/search/SearchEngineSelector.sys.mjs"); + "moz-src:///toolkit/components/search/SearchSettings.sys.mjs": typeof import("moz-src:///toolkit/components/search/SearchSettings.sys.mjs"); + "moz-src:///toolkit/components/search/SearchShortcuts.sys.mjs": typeof import("moz-src:///toolkit/components/search/SearchShortcuts.sys.mjs"); + "moz-src:///toolkit/components/search/SearchStaticData.sys.mjs": typeof import("moz-src:///toolkit/components/search/SearchStaticData.sys.mjs"); + "moz-src:///toolkit/components/search/SearchSuggestionController.sys.mjs": typeof import("moz-src:///toolkit/components/search/SearchSuggestionController.sys.mjs"); + "moz-src:///toolkit/components/search/SearchUtils.sys.mjs": typeof import("moz-src:///toolkit/components/search/SearchUtils.sys.mjs"); + "moz-src:///toolkit/components/search/UserSearchEngine.sys.mjs": typeof import("moz-src:///toolkit/components/search/UserSearchEngine.sys.mjs"); + "moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustFilterAdult.sys.mjs": typeof import("moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustFilterAdult.sys.mjs"); + "moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustRelevancy.sys.mjs": typeof import("moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustRelevancy.sys.mjs"); + "moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustSearch.sys.mjs": typeof import("moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustSearch.sys.mjs"); + "moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustSuggest.sys.mjs": typeof import("moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustSuggest.sys.mjs"); + "moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustTabs.sys.mjs": typeof import("moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustTabs.sys.mjs"); + "moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustWebextstorage.sys.mjs": typeof import("moz-src:///toolkit/components/uniffi-bindgen-gecko-js/components/generated/RustWebextstorage.sys.mjs"); + "moz-src:///toolkit/components/uniffi-bindgen-gecko-js/tests/generated/RustUniffiBindingsTests.sys.mjs": typeof import("moz-src:///toolkit/components/uniffi-bindgen-gecko-js/tests/generated/RustUniffiBindingsTests.sys.mjs"); + "moz-src:///toolkit/components/uniffi-bindgen-gecko-js/tests/generated/RustUniffiBindingsTestsExternalTypes.sys.mjs": typeof import("moz-src:///toolkit/components/uniffi-bindgen-gecko-js/tests/generated/RustUniffiBindingsTestsExternalTypes.sys.mjs"); + "moz-src:///toolkit/modules/PrefUtils.sys.mjs": typeof import("moz-src:///toolkit/modules/PrefUtils.sys.mjs"); + "moz-src:///toolkit/profile/ProfilesDatastoreService.sys.mjs": typeof import("moz-src:///toolkit/profile/ProfilesDatastoreService.sys.mjs"); + "resource:///actors/AboutLoginsParent.sys.mjs": typeof import("resource:///actors/AboutLoginsParent.sys.mjs"); + "resource:///actors/AboutNewTabParent.sys.mjs": typeof import("resource:///actors/AboutNewTabParent.sys.mjs"); + "resource:///actors/AboutPrivateBrowsingParent.sys.mjs": typeof import("resource:///actors/AboutPrivateBrowsingParent.sys.mjs"); + "resource:///actors/AboutProtectionsParent.sys.mjs": typeof import("resource:///actors/AboutProtectionsParent.sys.mjs"); + "resource:///actors/AboutReaderParent.sys.mjs": typeof import("resource:///actors/AboutReaderParent.sys.mjs"); + "resource:///actors/AboutWelcomeParent.sys.mjs": typeof import("resource:///actors/AboutWelcomeParent.sys.mjs"); + "resource:///actors/ClickHandlerParent.sys.mjs": typeof import("resource:///actors/ClickHandlerParent.sys.mjs"); + "resource:///actors/ContentSearchParent.sys.mjs": typeof import("resource:///actors/ContentSearchParent.sys.mjs"); + "resource:///actors/ContextMenuChild.sys.mjs": typeof import("resource:///actors/ContextMenuChild.sys.mjs"); + "resource:///actors/LinkHandlerParent.sys.mjs": typeof import("resource:///actors/LinkHandlerParent.sys.mjs"); + "resource:///actors/LinkPreviewChild.sys.mjs": typeof import("resource:///actors/LinkPreviewChild.sys.mjs"); + "resource:///actors/PluginParent.sys.mjs": typeof import("resource:///actors/PluginParent.sys.mjs"); + "resource:///actors/ScreenshotsComponentChild.sys.mjs": typeof import("resource:///actors/ScreenshotsComponentChild.sys.mjs"); + "resource:///actors/SearchSERPTelemetryChild.sys.mjs": typeof import("resource:///actors/SearchSERPTelemetryChild.sys.mjs"); + "resource:///actors/WebRTCChild.sys.mjs": typeof import("resource:///actors/WebRTCChild.sys.mjs"); + "resource:///bar.sys.mjs": typeof import("resource:///bar.sys.mjs"); + "resource:///modules/360seMigrationUtils.sys.mjs": typeof import("resource:///modules/360seMigrationUtils.sys.mjs"); + "resource:///modules/AboutHomeStartupCache.sys.mjs": typeof import("resource:///modules/AboutHomeStartupCache.sys.mjs"); + "resource:///modules/AboutNewTab.sys.mjs": typeof import("resource:///modules/AboutNewTab.sys.mjs"); + "resource:///modules/AboutNewTabRedirector.sys.mjs": typeof import("resource:///modules/AboutNewTabRedirector.sys.mjs"); + "resource:///modules/AboutNewTabResourceMapping.sys.mjs": typeof import("resource:///modules/AboutNewTabResourceMapping.sys.mjs"); + "resource:///modules/AccountsGlue.sys.mjs": typeof import("resource:///modules/AccountsGlue.sys.mjs"); + "resource:///modules/BrowserGlue.sys.mjs": typeof import("resource:///modules/BrowserGlue.sys.mjs"); + "resource:///modules/BrowserUIUtils.sys.mjs": typeof import("resource:///modules/BrowserUIUtils.sys.mjs"); + "resource:///modules/BrowserUsageTelemetry.sys.mjs": typeof import("resource:///modules/BrowserUsageTelemetry.sys.mjs"); + "resource:///modules/BrowserWindowTracker.sys.mjs": typeof import("resource:///modules/BrowserWindowTracker.sys.mjs"); + "resource:///modules/BuiltInThemeConfig.sys.mjs": typeof import("resource:///modules/BuiltInThemeConfig.sys.mjs"); + "resource:///modules/BuiltInThemes.sys.mjs": typeof import("resource:///modules/BuiltInThemes.sys.mjs"); + "resource:///modules/ChromeMacOSLoginCrypto.sys.mjs": typeof import("resource:///modules/ChromeMacOSLoginCrypto.sys.mjs"); + "resource:///modules/ChromeMigrationUtils.sys.mjs": typeof import("resource:///modules/ChromeMigrationUtils.sys.mjs"); + "resource:///modules/ChromeProfileMigrator.sys.mjs": typeof import("resource:///modules/ChromeProfileMigrator.sys.mjs"); + "resource:///modules/ChromeWindowsLoginCrypto.sys.mjs": typeof import("resource:///modules/ChromeWindowsLoginCrypto.sys.mjs"); + "resource:///modules/ContentCrashHandlers.sys.mjs": typeof import("resource:///modules/ContentCrashHandlers.sys.mjs"); + "resource:///modules/Dedupe.sys.mjs": typeof import("resource:///modules/Dedupe.sys.mjs"); + "resource:///modules/DevToolsStartup.sys.mjs": typeof import("resource:///modules/DevToolsStartup.sys.mjs"); + "resource:///modules/Discovery.sys.mjs": typeof import("resource:///modules/Discovery.sys.mjs"); + "resource:///modules/DownloadsCommon.sys.mjs": typeof import("resource:///modules/DownloadsCommon.sys.mjs"); + "resource:///modules/DownloadsViewUI.sys.mjs": typeof import("resource:///modules/DownloadsViewUI.sys.mjs"); + "resource:///modules/ESEDBReader.sys.mjs": typeof import("resource:///modules/ESEDBReader.sys.mjs"); + "resource:///modules/EdgeProfileMigrator.sys.mjs": typeof import("resource:///modules/EdgeProfileMigrator.sys.mjs"); + "resource:///modules/EveryWindow.sys.mjs": typeof import("resource:///modules/EveryWindow.sys.mjs"); + "resource:///modules/ExtensionBrowsingData.sys.mjs": typeof import("resource:///modules/ExtensionBrowsingData.sys.mjs"); + "resource:///modules/ExtensionControlledPopup.sys.mjs": typeof import("resource:///modules/ExtensionControlledPopup.sys.mjs"); + "resource:///modules/ExtensionPopups.sys.mjs": typeof import("resource:///modules/ExtensionPopups.sys.mjs"); + "resource:///modules/ExtensionsUI.sys.mjs": typeof import("resource:///modules/ExtensionsUI.sys.mjs"); + "resource:///modules/FaviconLoader.sys.mjs": typeof import("resource:///modules/FaviconLoader.sys.mjs"); + "resource:///modules/FileMigrators.sys.mjs": typeof import("resource:///modules/FileMigrators.sys.mjs"); + "resource:///modules/FilePickerCrashed.sys.mjs": typeof import("resource:///modules/FilePickerCrashed.sys.mjs"); + "resource:///modules/FilterAdult.sys.mjs": typeof import("resource:///modules/FilterAdult.sys.mjs"); + "resource:///modules/FirefoxBridgeExtensionUtils.sys.mjs": typeof import("resource:///modules/FirefoxBridgeExtensionUtils.sys.mjs"); + "resource:///modules/FirefoxProfileMigrator.sys.mjs": typeof import("resource:///modules/FirefoxProfileMigrator.sys.mjs"); + "resource:///modules/GenAI.sys.mjs": typeof import("resource:///modules/GenAI.sys.mjs"); + "resource:///modules/HistoryController.sys.mjs": typeof import("resource:///modules/HistoryController.sys.mjs"); + "resource:///modules/HomePage.sys.mjs": typeof import("resource:///modules/HomePage.sys.mjs"); + "resource:///modules/InstallerPrefs.sys.mjs": typeof import("resource:///modules/InstallerPrefs.sys.mjs"); + "resource:///modules/InternalTestingProfileMigrator.sys.mjs": typeof import("resource:///modules/InternalTestingProfileMigrator.sys.mjs"); + "resource:///modules/LaterRun.sys.mjs": typeof import("resource:///modules/LaterRun.sys.mjs"); + "resource:///modules/LinksCache.sys.mjs": typeof import("resource:///modules/LinksCache.sys.mjs"); + "resource:///modules/LoginBreaches.sys.mjs": typeof import("resource:///modules/LoginBreaches.sys.mjs"); + "resource:///modules/MSMigrationUtils.sys.mjs": typeof import("resource:///modules/MSMigrationUtils.sys.mjs"); + "resource:///modules/MerinoClient.sys.mjs": typeof import("resource:///modules/MerinoClient.sys.mjs"); + "resource:///modules/MigrationUtils.sys.mjs": typeof import("resource:///modules/MigrationUtils.sys.mjs"); + "resource:///modules/MigratorBase.sys.mjs": typeof import("resource:///modules/MigratorBase.sys.mjs"); + "resource:///modules/OpenTabs.sys.mjs": typeof import("resource:///modules/OpenTabs.sys.mjs"); + "resource:///modules/PageActions.sys.mjs": typeof import("resource:///modules/PageActions.sys.mjs"); + "resource:///modules/PartnerLinkAttribution.sys.mjs": typeof import("resource:///modules/PartnerLinkAttribution.sys.mjs"); + "resource:///modules/PermissionUI.sys.mjs": typeof import("resource:///modules/PermissionUI.sys.mjs"); + "resource:///modules/PopupAndRedirectBlockerObserver.sys.mjs": typeof import("resource:///modules/PopupAndRedirectBlockerObserver.sys.mjs"); + "resource:///modules/ProcessHangMonitor.sys.mjs": typeof import("resource:///modules/ProcessHangMonitor.sys.mjs"); + "resource:///modules/SafariProfileMigrator.sys.mjs": typeof import("resource:///modules/SafariProfileMigrator.sys.mjs"); + "resource:///modules/Sanitizer.sys.mjs": typeof import("resource:///modules/Sanitizer.sys.mjs"); + "resource:///modules/ScreenshotsOverlayChild.sys.mjs": typeof import("resource:///modules/ScreenshotsOverlayChild.sys.mjs"); + "resource:///modules/ScreenshotsUtils.sys.mjs": typeof import("resource:///modules/ScreenshotsUtils.sys.mjs"); + "resource:///modules/SelectionChangedMenulist.sys.mjs": typeof import("resource:///modules/SelectionChangedMenulist.sys.mjs"); + "resource:///modules/SharingUtils.sys.mjs": typeof import("resource:///modules/SharingUtils.sys.mjs"); + "resource:///modules/SiteDataManager.sys.mjs": typeof import("resource:///modules/SiteDataManager.sys.mjs"); + "resource:///modules/SitePermissions.sys.mjs": typeof import("resource:///modules/SitePermissions.sys.mjs"); + "resource:///modules/SyncedTabsController.sys.mjs": typeof import("resource:///modules/SyncedTabsController.sys.mjs"); + "resource:///modules/TRRPerformance.sys.mjs": typeof import("resource:///modules/TRRPerformance.sys.mjs"); + "resource:///modules/ThemeVariableMap.sys.mjs": typeof import("resource:///modules/ThemeVariableMap.sys.mjs"); + "resource:///modules/TransientPrefs.sys.mjs": typeof import("resource:///modules/TransientPrefs.sys.mjs"); + "resource:///modules/URILoadingHelper.sys.mjs": typeof import("resource:///modules/URILoadingHelper.sys.mjs"); + "resource:///modules/UrlbarUtils.sys.mjs": typeof import("resource:///modules/UrlbarUtils.sys.mjs"); + "resource:///modules/WebProtocolHandlerRegistrar.sys.mjs": typeof import("resource:///modules/WebProtocolHandlerRegistrar.sys.mjs"); + "resource:///modules/WindowsJumpLists.sys.mjs": typeof import("resource:///modules/WindowsJumpLists.sys.mjs"); + "resource:///modules/WindowsPreviewPerTab.sys.mjs": typeof import("resource:///modules/WindowsPreviewPerTab.sys.mjs"); + "resource:///modules/ZoomUI.sys.mjs": typeof import("resource:///modules/ZoomUI.sys.mjs"); + "resource:///modules/aboutwelcome/AWScreenUtils.sys.mjs": typeof import("resource:///modules/aboutwelcome/AWScreenUtils.sys.mjs"); + "resource:///modules/aboutwelcome/AWToolbarUtils.sys.mjs": typeof import("resource:///modules/aboutwelcome/AWToolbarUtils.sys.mjs"); + "resource:///modules/aboutwelcome/AboutWelcomeDefaults.sys.mjs": typeof import("resource:///modules/aboutwelcome/AboutWelcomeDefaults.sys.mjs"); + "resource:///modules/aboutwelcome/AboutWelcomeTelemetry.sys.mjs": typeof import("resource:///modules/aboutwelcome/AboutWelcomeTelemetry.sys.mjs"); + "resource:///modules/asrouter/ASRouter.sys.mjs": typeof import("resource:///modules/asrouter/ASRouter.sys.mjs"); + "resource:///modules/asrouter/ASRouterDefaultConfig.sys.mjs": typeof import("resource:///modules/asrouter/ASRouterDefaultConfig.sys.mjs"); + "resource:///modules/asrouter/ASRouterNewTabHook.sys.mjs": typeof import("resource:///modules/asrouter/ASRouterNewTabHook.sys.mjs"); + "resource:///modules/asrouter/ASRouterPreferences.sys.mjs": typeof import("resource:///modules/asrouter/ASRouterPreferences.sys.mjs"); + "resource:///modules/asrouter/ASRouterStorage.sys.mjs": typeof import("resource:///modules/asrouter/ASRouterStorage.sys.mjs"); + "resource:///modules/asrouter/ASRouterTargeting.sys.mjs": typeof import("resource:///modules/asrouter/ASRouterTargeting.sys.mjs"); + "resource:///modules/asrouter/ASRouterTelemetry.sys.mjs": typeof import("resource:///modules/asrouter/ASRouterTelemetry.sys.mjs"); + "resource:///modules/asrouter/ASRouterTriggerListeners.sys.mjs": typeof import("resource:///modules/asrouter/ASRouterTriggerListeners.sys.mjs"); + "resource:///modules/asrouter/ActorConstants.mjs": typeof import("resource:///modules/asrouter/ActorConstants.mjs"); + "resource:///modules/asrouter/BookmarksBarButton.sys.mjs": typeof import("resource:///modules/asrouter/BookmarksBarButton.sys.mjs"); + "resource:///modules/asrouter/CFRMessageProvider.sys.mjs": typeof import("resource:///modules/asrouter/CFRMessageProvider.sys.mjs"); + "resource:///modules/asrouter/CFRPageActions.sys.mjs": typeof import("resource:///modules/asrouter/CFRPageActions.sys.mjs"); + "resource:///modules/asrouter/FeatureCallout.sys.mjs": typeof import("resource:///modules/asrouter/FeatureCallout.sys.mjs"); + "resource:///modules/asrouter/FeatureCalloutBroker.sys.mjs": typeof import("resource:///modules/asrouter/FeatureCalloutBroker.sys.mjs"); + "resource:///modules/asrouter/FeatureCalloutMessages.sys.mjs": typeof import("resource:///modules/asrouter/FeatureCalloutMessages.sys.mjs"); + "resource:///modules/asrouter/InfoBar.sys.mjs": typeof import("resource:///modules/asrouter/InfoBar.sys.mjs"); + "resource:///modules/asrouter/MenuMessage.sys.mjs": typeof import("resource:///modules/asrouter/MenuMessage.sys.mjs"); + "resource:///modules/asrouter/MomentsPageHub.sys.mjs": typeof import("resource:///modules/asrouter/MomentsPageHub.sys.mjs"); + "resource:///modules/asrouter/OnboardingMessageProvider.sys.mjs": typeof import("resource:///modules/asrouter/OnboardingMessageProvider.sys.mjs"); + "resource:///modules/asrouter/PageEventManager.sys.mjs": typeof import("resource:///modules/asrouter/PageEventManager.sys.mjs"); + "resource:///modules/asrouter/PanelTestProvider.sys.mjs": typeof import("resource:///modules/asrouter/PanelTestProvider.sys.mjs"); + "resource:///modules/asrouter/RemoteL10n.sys.mjs": typeof import("resource:///modules/asrouter/RemoteL10n.sys.mjs"); + "resource:///modules/asrouter/Spotlight.sys.mjs": typeof import("resource:///modules/asrouter/Spotlight.sys.mjs"); + "resource:///modules/asrouter/ToastNotification.sys.mjs": typeof import("resource:///modules/asrouter/ToastNotification.sys.mjs"); + "resource:///modules/asrouter/ToolbarBadgeHub.sys.mjs": typeof import("resource:///modules/asrouter/ToolbarBadgeHub.sys.mjs"); + "resource:///modules/backup/AddonsBackupResource.sys.mjs": typeof import("resource:///modules/backup/AddonsBackupResource.sys.mjs"); + "resource:///modules/backup/ArchiveEncryption.sys.mjs": typeof import("resource:///modules/backup/ArchiveEncryption.sys.mjs"); + "resource:///modules/backup/ArchiveEncryptionState.sys.mjs": typeof import("resource:///modules/backup/ArchiveEncryptionState.sys.mjs"); + "resource:///modules/backup/ArchiveUtils.sys.mjs": typeof import("resource:///modules/backup/ArchiveUtils.sys.mjs"); + "resource:///modules/backup/BackupError.mjs": typeof import("resource:///modules/backup/BackupError.mjs"); + "resource:///modules/backup/BackupResource.sys.mjs": typeof import("resource:///modules/backup/BackupResource.sys.mjs"); + "resource:///modules/backup/BackupService.sys.mjs": typeof import("resource:///modules/backup/BackupService.sys.mjs"); + "resource:///modules/backup/CookiesBackupResource.sys.mjs": typeof import("resource:///modules/backup/CookiesBackupResource.sys.mjs"); + "resource:///modules/backup/CredentialsAndSecurityBackupResource.sys.mjs": typeof import("resource:///modules/backup/CredentialsAndSecurityBackupResource.sys.mjs"); + "resource:///modules/backup/FormHistoryBackupResource.sys.mjs": typeof import("resource:///modules/backup/FormHistoryBackupResource.sys.mjs"); + "resource:///modules/backup/MeasurementUtils.sys.mjs": typeof import("resource:///modules/backup/MeasurementUtils.sys.mjs"); + "resource:///modules/backup/MiscDataBackupResource.sys.mjs": typeof import("resource:///modules/backup/MiscDataBackupResource.sys.mjs"); + "resource:///modules/backup/PlacesBackupResource.sys.mjs": typeof import("resource:///modules/backup/PlacesBackupResource.sys.mjs"); + "resource:///modules/backup/PreferencesBackupResource.sys.mjs": typeof import("resource:///modules/backup/PreferencesBackupResource.sys.mjs"); + "resource:///modules/backup/SessionStoreBackupResource.sys.mjs": typeof import("resource:///modules/backup/SessionStoreBackupResource.sys.mjs"); + "resource:///modules/distribution.sys.mjs": typeof import("resource:///modules/distribution.sys.mjs"); + "resource:///modules/firefox-view-synced-tabs-error-handler.sys.mjs": typeof import("resource:///modules/firefox-view-synced-tabs-error-handler.sys.mjs"); + "resource:///modules/firefox-view-tabs-setup-manager.sys.mjs": typeof import("resource:///modules/firefox-view-tabs-setup-manager.sys.mjs"); + "resource:///modules/ipprotection/GuardianClient.sys.mjs": typeof import("resource:///modules/ipprotection/GuardianClient.sys.mjs"); + "resource:///modules/ipprotection/IPPChannelFilter.sys.mjs": typeof import("resource:///modules/ipprotection/IPPChannelFilter.sys.mjs"); + "resource:///modules/ipprotection/IPPExceptionsManager.sys.mjs": typeof import("resource:///modules/ipprotection/IPPExceptionsManager.sys.mjs"); + "resource:///modules/ipprotection/IPPNetworkErrorObserver.sys.mjs": typeof import("resource:///modules/ipprotection/IPPNetworkErrorObserver.sys.mjs"); + "resource:///modules/ipprotection/IPPNimbusHelper.sys.mjs": typeof import("resource:///modules/ipprotection/IPPNimbusHelper.sys.mjs"); + "resource:///modules/ipprotection/IPPProxyManager.sys.mjs": typeof import("resource:///modules/ipprotection/IPPProxyManager.sys.mjs"); + "resource:///modules/ipprotection/IPPSignInWatcher.sys.mjs": typeof import("resource:///modules/ipprotection/IPPSignInWatcher.sys.mjs"); + "resource:///modules/ipprotection/IPPStartupCache.sys.mjs": typeof import("resource:///modules/ipprotection/IPPStartupCache.sys.mjs"); + "resource:///modules/ipprotection/IPProtection.sys.mjs": typeof import("resource:///modules/ipprotection/IPProtection.sys.mjs"); + "resource:///modules/ipprotection/IPProtectionHelpers.sys.mjs": typeof import("resource:///modules/ipprotection/IPProtectionHelpers.sys.mjs"); + "resource:///modules/ipprotection/IPProtectionPanel.sys.mjs": typeof import("resource:///modules/ipprotection/IPProtectionPanel.sys.mjs"); + "resource:///modules/ipprotection/IPProtectionServerlist.sys.mjs": typeof import("resource:///modules/ipprotection/IPProtectionServerlist.sys.mjs"); + "resource:///modules/ipprotection/IPProtectionService.sys.mjs": typeof import("resource:///modules/ipprotection/IPProtectionService.sys.mjs"); + "resource:///modules/ipprotection/IPProtectionUsage.sys.mjs": typeof import("resource:///modules/ipprotection/IPProtectionUsage.sys.mjs"); + "resource:///modules/policies/BookmarksPolicies.sys.mjs": typeof import("resource:///modules/policies/BookmarksPolicies.sys.mjs"); + "resource:///modules/policies/Policies.sys.mjs": typeof import("resource:///modules/policies/Policies.sys.mjs"); + "resource:///modules/policies/ProxyPolicies.sys.mjs": typeof import("resource:///modules/policies/ProxyPolicies.sys.mjs"); + "resource:///modules/policies/WebsiteFilter.sys.mjs": typeof import("resource:///modules/policies/WebsiteFilter.sys.mjs"); + "resource:///modules/policies/schema.sys.mjs": typeof import("resource:///modules/policies/schema.sys.mjs"); + "resource:///modules/profiles/SelectableProfile.sys.mjs": typeof import("resource:///modules/profiles/SelectableProfile.sys.mjs"); + "resource:///modules/profiles/SelectableProfileService.sys.mjs": typeof import("resource:///modules/profiles/SelectableProfileService.sys.mjs"); + "resource:///modules/sessionstore/PageWireframes.sys.mjs": typeof import("resource:///modules/sessionstore/PageWireframes.sys.mjs"); + "resource:///modules/sessionstore/RecentlyClosedTabsAndWindowsMenuUtils.sys.mjs": typeof import("resource:///modules/sessionstore/RecentlyClosedTabsAndWindowsMenuUtils.sys.mjs"); + "resource:///modules/sessionstore/RunState.sys.mjs": typeof import("resource:///modules/sessionstore/RunState.sys.mjs"); + "resource:///modules/sessionstore/SessionCookies.sys.mjs": typeof import("resource:///modules/sessionstore/SessionCookies.sys.mjs"); + "resource:///modules/sessionstore/SessionFile.sys.mjs": typeof import("resource:///modules/sessionstore/SessionFile.sys.mjs"); + "resource:///modules/sessionstore/SessionLogger.sys.mjs": typeof import("resource:///modules/sessionstore/SessionLogger.sys.mjs"); + "resource:///modules/sessionstore/SessionMigration.sys.mjs": typeof import("resource:///modules/sessionstore/SessionMigration.sys.mjs"); + "resource:///modules/sessionstore/SessionSaver.sys.mjs": typeof import("resource:///modules/sessionstore/SessionSaver.sys.mjs"); + "resource:///modules/sessionstore/SessionStartup.sys.mjs": typeof import("resource:///modules/sessionstore/SessionStartup.sys.mjs"); + "resource:///modules/sessionstore/SessionStore.sys.mjs": typeof import("resource:///modules/sessionstore/SessionStore.sys.mjs"); + "resource:///modules/sessionstore/SessionWindowUI.sys.mjs": typeof import("resource:///modules/sessionstore/SessionWindowUI.sys.mjs"); + "resource:///modules/sessionstore/SessionWriter.sys.mjs": typeof import("resource:///modules/sessionstore/SessionWriter.sys.mjs"); + "resource:///modules/sessionstore/StartupPerformance.sys.mjs": typeof import("resource:///modules/sessionstore/StartupPerformance.sys.mjs"); + "resource:///modules/sessionstore/TabAttributes.sys.mjs": typeof import("resource:///modules/sessionstore/TabAttributes.sys.mjs"); + "resource:///modules/sessionstore/TabGroupState.sys.mjs": typeof import("resource:///modules/sessionstore/TabGroupState.sys.mjs"); + "resource:///modules/sessionstore/TabState.sys.mjs": typeof import("resource:///modules/sessionstore/TabState.sys.mjs"); + "resource:///modules/sessionstore/TabStateCache.sys.mjs": typeof import("resource:///modules/sessionstore/TabStateCache.sys.mjs"); + "resource:///modules/sessionstore/TabStateFlusher.sys.mjs": typeof import("resource:///modules/sessionstore/TabStateFlusher.sys.mjs"); + "resource:///modules/syncedtabs/EventEmitter.sys.mjs": typeof import("resource:///modules/syncedtabs/EventEmitter.sys.mjs"); + "resource:///modules/syncedtabs/SyncedTabsDeckComponent.sys.mjs": typeof import("resource:///modules/syncedtabs/SyncedTabsDeckComponent.sys.mjs"); + "resource:///modules/syncedtabs/SyncedTabsDeckStore.sys.mjs": typeof import("resource:///modules/syncedtabs/SyncedTabsDeckStore.sys.mjs"); + "resource:///modules/syncedtabs/SyncedTabsListStore.sys.mjs": typeof import("resource:///modules/syncedtabs/SyncedTabsListStore.sys.mjs"); + "resource:///modules/syncedtabs/TabListComponent.sys.mjs": typeof import("resource:///modules/syncedtabs/TabListComponent.sys.mjs"); + "resource:///modules/taskbartabs/TaskbarTabs.sys.mjs": typeof import("resource:///modules/taskbartabs/TaskbarTabs.sys.mjs"); + "resource:///modules/taskbartabs/TaskbarTabsChrome.sys.mjs": typeof import("resource:///modules/taskbartabs/TaskbarTabsChrome.sys.mjs"); + "resource:///modules/taskbartabs/TaskbarTabsPageAction.sys.mjs": typeof import("resource:///modules/taskbartabs/TaskbarTabsPageAction.sys.mjs"); + "resource:///modules/taskbartabs/TaskbarTabsPin.sys.mjs": typeof import("resource:///modules/taskbartabs/TaskbarTabsPin.sys.mjs"); + "resource:///modules/taskbartabs/TaskbarTabsRegistry.sys.mjs": typeof import("resource:///modules/taskbartabs/TaskbarTabsRegistry.sys.mjs"); + "resource:///modules/taskbartabs/TaskbarTabsUtils.sys.mjs": typeof import("resource:///modules/taskbartabs/TaskbarTabsUtils.sys.mjs"); + "resource:///modules/taskbartabs/TaskbarTabsWindowManager.sys.mjs": typeof import("resource:///modules/taskbartabs/TaskbarTabsWindowManager.sys.mjs"); + "resource:///modules/topsites/TippyTopProvider.sys.mjs": typeof import("resource:///modules/topsites/TippyTopProvider.sys.mjs"); + "resource:///modules/topsites/TopSites.sys.mjs": typeof import("resource:///modules/topsites/TopSites.sys.mjs"); + "resource:///modules/topsites/constants.mjs": typeof import("resource:///modules/topsites/constants.mjs"); + "resource:///modules/webrtcUI.sys.mjs": typeof import("resource:///modules/webrtcUI.sys.mjs"); + "resource://autofill/FormAutofill.sys.mjs": typeof import("resource://autofill/FormAutofill.sys.mjs"); + "resource://autofill/FormAutofillChild.ios.sys.mjs": typeof import("resource://autofill/FormAutofillChild.ios.sys.mjs"); + "resource://autofill/FormAutofillChild.sys.mjs": typeof import("resource://autofill/FormAutofillChild.sys.mjs"); + "resource://autofill/FormAutofillContent.sys.mjs": typeof import("resource://autofill/FormAutofillContent.sys.mjs"); + "resource://autofill/FormAutofillParent.sys.mjs": typeof import("resource://autofill/FormAutofillParent.sys.mjs"); + "resource://autofill/FormAutofillPreferences.sys.mjs": typeof import("resource://autofill/FormAutofillPreferences.sys.mjs"); + "resource://autofill/FormAutofillPrompter.sys.mjs": typeof import("resource://autofill/FormAutofillPrompter.sys.mjs"); + "resource://autofill/FormAutofillStorage.sys.mjs": typeof import("resource://autofill/FormAutofillStorage.sys.mjs"); + "resource://autofill/FormAutofillStorageBase.sys.mjs": typeof import("resource://autofill/FormAutofillStorageBase.sys.mjs"); + "resource://autofill/FormAutofillSync.sys.mjs": typeof import("resource://autofill/FormAutofillSync.sys.mjs"); + "resource://autofill/ProfileAutoCompleteResult.sys.mjs": typeof import("resource://autofill/ProfileAutoCompleteResult.sys.mjs"); + "resource://devtools/client/framework/browser-toolbox/Launcher.sys.mjs": typeof import("resource://devtools/client/framework/browser-toolbox/Launcher.sys.mjs"); + "resource://devtools/client/performance-new/popup/logic.sys.mjs": typeof import("resource://devtools/client/performance-new/popup/logic.sys.mjs"); + "resource://devtools/client/performance-new/popup/menu-button.sys.mjs": typeof import("resource://devtools/client/performance-new/popup/menu-button.sys.mjs"); + "resource://devtools/client/performance-new/shared/background.sys.mjs": typeof import("resource://devtools/client/performance-new/shared/background.sys.mjs"); + "resource://devtools/client/shared/components/reps/index.mjs": typeof import("resource://devtools/client/shared/components/reps/index.mjs"); + "resource://devtools/client/shared/components/reps/reps/array.mjs": typeof import("resource://devtools/client/shared/components/reps/reps/array.mjs"); + "resource://devtools/client/shared/components/reps/reps/big-int.mjs": typeof import("resource://devtools/client/shared/components/reps/reps/big-int.mjs"); + "resource://devtools/client/shared/components/reps/reps/constants.mjs": typeof import("resource://devtools/client/shared/components/reps/reps/constants.mjs"); + "resource://devtools/client/shared/components/reps/reps/element-node.mjs": typeof import("resource://devtools/client/shared/components/reps/reps/element-node.mjs"); + "resource://devtools/client/shared/components/reps/reps/error.mjs": typeof import("resource://devtools/client/shared/components/reps/reps/error.mjs"); + "resource://devtools/client/shared/components/reps/reps/grip-array.mjs": typeof import("resource://devtools/client/shared/components/reps/reps/grip-array.mjs"); + "resource://devtools/client/shared/components/reps/reps/grip-entry.mjs": typeof import("resource://devtools/client/shared/components/reps/reps/grip-entry.mjs"); + "resource://devtools/client/shared/components/reps/reps/grip-map.mjs": typeof import("resource://devtools/client/shared/components/reps/reps/grip-map.mjs"); + "resource://devtools/client/shared/components/reps/reps/rep-utils.mjs": typeof import("resource://devtools/client/shared/components/reps/reps/rep-utils.mjs"); + "resource://devtools/client/shared/components/reps/reps/rep.mjs": typeof import("resource://devtools/client/shared/components/reps/reps/rep.mjs"); + "resource://devtools/client/shared/components/reps/reps/string.mjs": typeof import("resource://devtools/client/shared/components/reps/reps/string.mjs"); + "resource://devtools/client/shared/components/reps/reps/text-node.mjs": typeof import("resource://devtools/client/shared/components/reps/reps/text-node.mjs"); + "resource://devtools/client/shared/components/reps/reps/value-summary-reader.mjs": typeof import("resource://devtools/client/shared/components/reps/reps/value-summary-reader.mjs"); + "resource://devtools/client/shared/components/tabs/Tabs.mjs": typeof import("resource://devtools/client/shared/components/tabs/Tabs.mjs"); + "resource://devtools/client/shared/components/tree/LabelCell.mjs": typeof import("resource://devtools/client/shared/components/tree/LabelCell.mjs"); + "resource://devtools/client/shared/components/tree/ObjectProvider.mjs": typeof import("resource://devtools/client/shared/components/tree/ObjectProvider.mjs"); + "resource://devtools/client/shared/components/tree/TreeRow.mjs": typeof import("resource://devtools/client/shared/components/tree/TreeRow.mjs"); + "resource://devtools/client/shared/components/tree/TreeView.mjs": typeof import("resource://devtools/client/shared/components/tree/TreeView.mjs"); + "resource://devtools/client/shared/focus.mjs": typeof import("resource://devtools/client/shared/focus.mjs"); + "resource://devtools/client/shared/scroll.mjs": typeof import("resource://devtools/client/shared/scroll.mjs"); + "resource://devtools/client/shared/sourceeditor/codemirror6/codemirror6.bundle.mjs": typeof import("resource://devtools/client/shared/sourceeditor/codemirror6/codemirror6.bundle.mjs"); + "resource://devtools/client/storage/VariablesView.sys.mjs": typeof import("resource://devtools/client/storage/VariablesView.sys.mjs"); + "resource://devtools/client/styleeditor/StyleEditorUI.sys.mjs": typeof import("resource://devtools/client/styleeditor/StyleEditorUI.sys.mjs"); + "resource://devtools/client/styleeditor/StyleEditorUtil.sys.mjs": typeof import("resource://devtools/client/styleeditor/StyleEditorUtil.sys.mjs"); + "resource://devtools/server/actors/targets/target-actor-registry.sys.mjs": typeof import("resource://devtools/server/actors/targets/target-actor-registry.sys.mjs"); + "resource://devtools/server/actors/utils/HTMLSourcesCache.sys.mjs": typeof import("resource://devtools/server/actors/utils/HTMLSourcesCache.sys.mjs"); + "resource://devtools/server/actors/watcher/ParentProcessWatcherRegistry.sys.mjs": typeof import("resource://devtools/server/actors/watcher/ParentProcessWatcherRegistry.sys.mjs"); + "resource://devtools/server/actors/watcher/SessionDataHelpers.sys.mjs": typeof import("resource://devtools/server/actors/watcher/SessionDataHelpers.sys.mjs"); + "resource://devtools/server/actors/watcher/browsing-context-helpers.sys.mjs": typeof import("resource://devtools/server/actors/watcher/browsing-context-helpers.sys.mjs"); + "resource://devtools/server/connectors/js-process-actor/target-watchers/content_script.sys.mjs": typeof import("resource://devtools/server/connectors/js-process-actor/target-watchers/content_script.sys.mjs"); + "resource://devtools/server/connectors/js-process-actor/target-watchers/process.sys.mjs": typeof import("resource://devtools/server/connectors/js-process-actor/target-watchers/process.sys.mjs"); + "resource://devtools/server/connectors/js-process-actor/target-watchers/service_worker.sys.mjs": typeof import("resource://devtools/server/connectors/js-process-actor/target-watchers/service_worker.sys.mjs"); + "resource://devtools/server/connectors/js-process-actor/target-watchers/shared_worker.sys.mjs": typeof import("resource://devtools/server/connectors/js-process-actor/target-watchers/shared_worker.sys.mjs"); + "resource://devtools/server/connectors/js-process-actor/target-watchers/window-global.sys.mjs": typeof import("resource://devtools/server/connectors/js-process-actor/target-watchers/window-global.sys.mjs"); + "resource://devtools/server/connectors/js-process-actor/target-watchers/worker.sys.mjs": typeof import("resource://devtools/server/connectors/js-process-actor/target-watchers/worker.sys.mjs"); + "resource://devtools/server/startup/content-process.sys.mjs": typeof import("resource://devtools/server/startup/content-process.sys.mjs"); + "resource://devtools/server/startup/worker.sys.mjs": typeof import("resource://devtools/server/startup/worker.sys.mjs"); + "resource://devtools/server/tracer/tracer.sys.mjs": typeof import("resource://devtools/server/tracer/tracer.sys.mjs"); + "resource://devtools/shared/DevToolsInfaillibleUtils.sys.mjs": typeof import("resource://devtools/shared/DevToolsInfaillibleUtils.sys.mjs"); + "resource://devtools/shared/highlighters.mjs": typeof import("resource://devtools/shared/highlighters.mjs"); + "resource://devtools/shared/loader/DistinctSystemPrincipalLoader.sys.mjs": typeof import("resource://devtools/shared/loader/DistinctSystemPrincipalLoader.sys.mjs"); + "resource://devtools/shared/loader/Loader.sys.mjs": typeof import("resource://devtools/shared/loader/Loader.sys.mjs"); + "resource://devtools/shared/loader/browser-loader.sys.mjs": typeof import("resource://devtools/shared/loader/browser-loader.sys.mjs"); + "resource://devtools/shared/loader/worker-loader.sys.mjs": typeof import("resource://devtools/shared/loader/worker-loader.sys.mjs"); + "resource://devtools/shared/network-observer/ChannelMap.sys.mjs": typeof import("resource://devtools/shared/network-observer/ChannelMap.sys.mjs"); + "resource://devtools/shared/network-observer/NetworkAuthListener.sys.mjs": typeof import("resource://devtools/shared/network-observer/NetworkAuthListener.sys.mjs"); + "resource://devtools/shared/network-observer/NetworkHelper.sys.mjs": typeof import("resource://devtools/shared/network-observer/NetworkHelper.sys.mjs"); + "resource://devtools/shared/network-observer/NetworkObserver.sys.mjs": typeof import("resource://devtools/shared/network-observer/NetworkObserver.sys.mjs"); + "resource://devtools/shared/network-observer/NetworkOverride.sys.mjs": typeof import("resource://devtools/shared/network-observer/NetworkOverride.sys.mjs"); + "resource://devtools/shared/network-observer/NetworkResponseListener.sys.mjs": typeof import("resource://devtools/shared/network-observer/NetworkResponseListener.sys.mjs"); + "resource://devtools/shared/network-observer/NetworkThrottleManager.sys.mjs": typeof import("resource://devtools/shared/network-observer/NetworkThrottleManager.sys.mjs"); + "resource://devtools/shared/network-observer/NetworkTimings.sys.mjs": typeof import("resource://devtools/shared/network-observer/NetworkTimings.sys.mjs"); + "resource://devtools/shared/network-observer/NetworkUtils.sys.mjs": typeof import("resource://devtools/shared/network-observer/NetworkUtils.sys.mjs"); + "resource://devtools/shared/network-observer/WildcardToRegexp.sys.mjs": typeof import("resource://devtools/shared/network-observer/WildcardToRegexp.sys.mjs"); + "resource://devtools/shared/performance-new/errors.sys.mjs": typeof import("resource://devtools/shared/performance-new/errors.sys.mjs"); + "resource://devtools/shared/performance-new/prefs-presets.sys.mjs": typeof import("resource://devtools/shared/performance-new/prefs-presets.sys.mjs"); + "resource://devtools/shared/performance-new/recording-utils.sys.mjs": typeof import("resource://devtools/shared/performance-new/recording-utils.sys.mjs"); + "resource://devtools/shared/performance-new/symbolication.sys.mjs": typeof import("resource://devtools/shared/performance-new/symbolication.sys.mjs"); + "resource://devtools/shared/platform/CacheEntry.sys.mjs": typeof import("resource://devtools/shared/platform/CacheEntry.sys.mjs"); + "resource://devtools/shared/security/DevToolsSocketStatus.sys.mjs": typeof import("resource://devtools/shared/security/DevToolsSocketStatus.sys.mjs"); + "resource://devtools/shared/test-helpers/dump-scope.sys.mjs": typeof import("resource://devtools/shared/test-helpers/dump-scope.sys.mjs"); + "resource://devtools/shared/test-helpers/tracked-objects.sys.mjs": typeof import("resource://devtools/shared/test-helpers/tracked-objects.sys.mjs"); + "resource://devtools/shared/validate-breakpoint.sys.mjs": typeof import("resource://devtools/shared/validate-breakpoint.sys.mjs"); + "resource://devtools/shared/worker/worker.sys.mjs": typeof import("resource://devtools/shared/worker/worker.sys.mjs"); + "resource://gre/actors/AutoCompleteParent.sys.mjs": typeof import("resource://gre/actors/AutoCompleteParent.sys.mjs"); + "resource://gre/actors/FormHandlerChild.sys.mjs": typeof import("resource://gre/actors/FormHandlerChild.sys.mjs"); + "resource://gre/actors/MLEngineParent.sys.mjs": typeof import("resource://gre/actors/MLEngineParent.sys.mjs"); + "resource://gre/actors/PictureInPictureChild.sys.mjs": typeof import("resource://gre/actors/PictureInPictureChild.sys.mjs"); + "resource://gre/actors/PopupAndRedirectBlockingParent.sys.mjs": typeof import("resource://gre/actors/PopupAndRedirectBlockingParent.sys.mjs"); + "resource://gre/actors/SelectChild.sys.mjs": typeof import("resource://gre/actors/SelectChild.sys.mjs"); + "resource://gre/actors/SelectParent.sys.mjs": typeof import("resource://gre/actors/SelectParent.sys.mjs"); + "resource://gre/actors/TranslationsParent.sys.mjs": typeof import("resource://gre/actors/TranslationsParent.sys.mjs"); + "resource://gre/actors/ViewSourcePageChild.sys.mjs": typeof import("resource://gre/actors/ViewSourcePageChild.sys.mjs"); + "resource://gre/modules/AboutPagesUtils.sys.mjs": typeof import("resource://gre/modules/AboutPagesUtils.sys.mjs"); + "resource://gre/modules/AbuseReporter.sys.mjs": typeof import("resource://gre/modules/AbuseReporter.sys.mjs"); + "resource://gre/modules/ActorManagerParent.sys.mjs": typeof import("resource://gre/modules/ActorManagerParent.sys.mjs"); + "resource://gre/modules/AddonManager.sys.mjs": typeof import("resource://gre/modules/AddonManager.sys.mjs"); + "resource://gre/modules/AndroidLog.sys.mjs": typeof import("resource://gre/modules/AndroidLog.sys.mjs"); + "resource://gre/modules/AppConstants.sys.mjs": typeof import("resource://gre/modules/AppConstants.sys.mjs"); + "resource://gre/modules/AppMenuNotifications.sys.mjs": typeof import("resource://gre/modules/AppMenuNotifications.sys.mjs"); + "resource://gre/modules/AppServicesTracing.sys.mjs": typeof import("resource://gre/modules/AppServicesTracing.sys.mjs"); + "resource://gre/modules/AppUpdater.sys.mjs": typeof import("resource://gre/modules/AppUpdater.sys.mjs"); + "resource://gre/modules/AsanReporter.sys.mjs": typeof import("resource://gre/modules/AsanReporter.sys.mjs"); + "resource://gre/modules/AsyncPrefs.sys.mjs": typeof import("resource://gre/modules/AsyncPrefs.sys.mjs"); + "resource://gre/modules/AsyncShutdown.sys.mjs": typeof import("resource://gre/modules/AsyncShutdown.sys.mjs"); + "resource://gre/modules/BackgroundPageThumbs.sys.mjs": typeof import("resource://gre/modules/BackgroundPageThumbs.sys.mjs"); + "resource://gre/modules/BackgroundTasksManager.sys.mjs": typeof import("resource://gre/modules/BackgroundTasksManager.sys.mjs"); + "resource://gre/modules/BackgroundTasksUtils.sys.mjs": typeof import("resource://gre/modules/BackgroundTasksUtils.sys.mjs"); + "resource://gre/modules/BackgroundUpdate.sys.mjs": typeof import("resource://gre/modules/BackgroundUpdate.sys.mjs"); + "resource://gre/modules/BinarySearch.sys.mjs": typeof import("resource://gre/modules/BinarySearch.sys.mjs"); + "resource://gre/modules/Bits.sys.mjs": typeof import("resource://gre/modules/Bits.sys.mjs"); + "resource://gre/modules/Blocklist.sys.mjs": typeof import("resource://gre/modules/Blocklist.sys.mjs"); + "resource://gre/modules/BookmarkHTMLUtils.sys.mjs": typeof import("resource://gre/modules/BookmarkHTMLUtils.sys.mjs"); + "resource://gre/modules/BookmarkJSONUtils.sys.mjs": typeof import("resource://gre/modules/BookmarkJSONUtils.sys.mjs"); + "resource://gre/modules/BookmarkList.sys.mjs": typeof import("resource://gre/modules/BookmarkList.sys.mjs"); + "resource://gre/modules/Bookmarks.sys.mjs": typeof import("resource://gre/modules/Bookmarks.sys.mjs"); + "resource://gre/modules/BrowserTelemetryUtils.sys.mjs": typeof import("resource://gre/modules/BrowserTelemetryUtils.sys.mjs"); + "resource://gre/modules/BrowserUtils.sys.mjs": typeof import("resource://gre/modules/BrowserUtils.sys.mjs"); + "resource://gre/modules/CSV.sys.mjs": typeof import("resource://gre/modules/CSV.sys.mjs"); + "resource://gre/modules/CanonicalJSON.sys.mjs": typeof import("resource://gre/modules/CanonicalJSON.sys.mjs"); + "resource://gre/modules/CaptchaDetectionPingUtils.sys.mjs": typeof import("resource://gre/modules/CaptchaDetectionPingUtils.sys.mjs"); + "resource://gre/modules/CaptchaResponseObserver.sys.mjs": typeof import("resource://gre/modules/CaptchaResponseObserver.sys.mjs"); + "resource://gre/modules/CertUtils.sys.mjs": typeof import("resource://gre/modules/CertUtils.sys.mjs"); + "resource://gre/modules/ChildCrashHandler.sys.mjs": typeof import("resource://gre/modules/ChildCrashHandler.sys.mjs"); + "resource://gre/modules/ChromePushSubscription.sys.mjs": typeof import("resource://gre/modules/ChromePushSubscription.sys.mjs"); + "resource://gre/modules/ClientID.sys.mjs": typeof import("resource://gre/modules/ClientID.sys.mjs"); + "resource://gre/modules/ClipboardContextMenu.sys.mjs": typeof import("resource://gre/modules/ClipboardContextMenu.sys.mjs"); + "resource://gre/modules/Color.sys.mjs": typeof import("resource://gre/modules/Color.sys.mjs"); + "resource://gre/modules/ColorwayThemeMigration.sys.mjs": typeof import("resource://gre/modules/ColorwayThemeMigration.sys.mjs"); + "resource://gre/modules/CommonDialog.sys.mjs": typeof import("resource://gre/modules/CommonDialog.sys.mjs"); + "resource://gre/modules/ComponentUtils.sys.mjs": typeof import("resource://gre/modules/ComponentUtils.sys.mjs"); + "resource://gre/modules/ConduitsParent.sys.mjs": typeof import("resource://gre/modules/ConduitsParent.sys.mjs"); + "resource://gre/modules/Console.sys.mjs": typeof import("resource://gre/modules/Console.sys.mjs"); + "resource://gre/modules/ContentAnalysisUtils.sys.mjs": typeof import("resource://gre/modules/ContentAnalysisUtils.sys.mjs"); + "resource://gre/modules/ContentBlockingAllowList.sys.mjs": typeof import("resource://gre/modules/ContentBlockingAllowList.sys.mjs"); + "resource://gre/modules/ContentDOMReference.sys.mjs": typeof import("resource://gre/modules/ContentDOMReference.sys.mjs"); + "resource://gre/modules/ContentPrefServiceChild.sys.mjs": typeof import("resource://gre/modules/ContentPrefServiceChild.sys.mjs"); + "resource://gre/modules/ContentPrefUtils.sys.mjs": typeof import("resource://gre/modules/ContentPrefUtils.sys.mjs"); + "resource://gre/modules/ContentRelevancyManager.sys.mjs": typeof import("resource://gre/modules/ContentRelevancyManager.sys.mjs"); + "resource://gre/modules/ContextualIdentityService.sys.mjs": typeof import("resource://gre/modules/ContextualIdentityService.sys.mjs"); + "resource://gre/modules/CoveragePing.sys.mjs": typeof import("resource://gre/modules/CoveragePing.sys.mjs"); + "resource://gre/modules/CrashManager.sys.mjs": typeof import("resource://gre/modules/CrashManager.sys.mjs"); + "resource://gre/modules/CrashMonitor.sys.mjs": typeof import("resource://gre/modules/CrashMonitor.sys.mjs"); + "resource://gre/modules/CrashReports.sys.mjs": typeof import("resource://gre/modules/CrashReports.sys.mjs"); + "resource://gre/modules/CrashService.sys.mjs": typeof import("resource://gre/modules/CrashService.sys.mjs"); + "resource://gre/modules/CrashSubmit.sys.mjs": typeof import("resource://gre/modules/CrashSubmit.sys.mjs"); + "resource://gre/modules/Credentials.sys.mjs": typeof import("resource://gre/modules/Credentials.sys.mjs"); + "resource://gre/modules/CreditCard.sys.mjs": typeof import("resource://gre/modules/CreditCard.sys.mjs"); + "resource://gre/modules/CustomElementsListener.sys.mjs": typeof import("resource://gre/modules/CustomElementsListener.sys.mjs"); + "resource://gre/modules/DAPIncrementality.sys.mjs": typeof import("resource://gre/modules/DAPIncrementality.sys.mjs"); + "resource://gre/modules/DAPReportController.sys.mjs": typeof import("resource://gre/modules/DAPReportController.sys.mjs"); + "resource://gre/modules/DAPTelemetrySender.sys.mjs": typeof import("resource://gre/modules/DAPTelemetrySender.sys.mjs"); + "resource://gre/modules/DAPVisitCounter.sys.mjs": typeof import("resource://gre/modules/DAPVisitCounter.sys.mjs"); + "resource://gre/modules/DateTimePickerPanel.sys.mjs": typeof import("resource://gre/modules/DateTimePickerPanel.sys.mjs"); + "resource://gre/modules/DeferredTask.sys.mjs": typeof import("resource://gre/modules/DeferredTask.sys.mjs"); + "resource://gre/modules/DelayedInit.sys.mjs": typeof import("resource://gre/modules/DelayedInit.sys.mjs"); + "resource://gre/modules/DownloadCore.sys.mjs": typeof import("resource://gre/modules/DownloadCore.sys.mjs"); + "resource://gre/modules/DownloadHistory.sys.mjs": typeof import("resource://gre/modules/DownloadHistory.sys.mjs"); + "resource://gre/modules/DownloadIntegration.sys.mjs": typeof import("resource://gre/modules/DownloadIntegration.sys.mjs"); + "resource://gre/modules/DownloadLastDir.sys.mjs": typeof import("resource://gre/modules/DownloadLastDir.sys.mjs"); + "resource://gre/modules/DownloadList.sys.mjs": typeof import("resource://gre/modules/DownloadList.sys.mjs"); + "resource://gre/modules/DownloadPaths.sys.mjs": typeof import("resource://gre/modules/DownloadPaths.sys.mjs"); + "resource://gre/modules/DownloadStore.sys.mjs": typeof import("resource://gre/modules/DownloadStore.sys.mjs"); + "resource://gre/modules/DownloadUIHelper.sys.mjs": typeof import("resource://gre/modules/DownloadUIHelper.sys.mjs"); + "resource://gre/modules/DownloadUtils.sys.mjs": typeof import("resource://gre/modules/DownloadUtils.sys.mjs"); + "resource://gre/modules/Downloads.sys.mjs": typeof import("resource://gre/modules/Downloads.sys.mjs"); + "resource://gre/modules/E10SUtils.sys.mjs": typeof import("resource://gre/modules/E10SUtils.sys.mjs"); + "resource://gre/modules/EnterprisePoliciesContent.sys.mjs": typeof import("resource://gre/modules/EnterprisePoliciesContent.sys.mjs"); + "resource://gre/modules/EnterprisePoliciesParent.sys.mjs": typeof import("resource://gre/modules/EnterprisePoliciesParent.sys.mjs"); + "resource://gre/modules/EssentialDomainsRemoteSettings.sys.mjs": typeof import("resource://gre/modules/EssentialDomainsRemoteSettings.sys.mjs"); + "resource://gre/modules/EventEmitter.sys.mjs": typeof import("resource://gre/modules/EventEmitter.sys.mjs"); + "resource://gre/modules/EventPing.sys.mjs": typeof import("resource://gre/modules/EventPing.sys.mjs"); + "resource://gre/modules/Extension.sys.mjs": typeof import("resource://gre/modules/Extension.sys.mjs"); + "resource://gre/modules/ExtensionActions.sys.mjs": typeof import("resource://gre/modules/ExtensionActions.sys.mjs"); + "resource://gre/modules/ExtensionActivityLog.sys.mjs": typeof import("resource://gre/modules/ExtensionActivityLog.sys.mjs"); + "resource://gre/modules/ExtensionChild.sys.mjs": typeof import("resource://gre/modules/ExtensionChild.sys.mjs"); + "resource://gre/modules/ExtensionChildDevToolsUtils.sys.mjs": typeof import("resource://gre/modules/ExtensionChildDevToolsUtils.sys.mjs"); + "resource://gre/modules/ExtensionCommon.sys.mjs": typeof import("resource://gre/modules/ExtensionCommon.sys.mjs"); + "resource://gre/modules/ExtensionContent.sys.mjs": typeof import("resource://gre/modules/ExtensionContent.sys.mjs"); + "resource://gre/modules/ExtensionDNR.sys.mjs": typeof import("resource://gre/modules/ExtensionDNR.sys.mjs"); + "resource://gre/modules/ExtensionDNRLimits.sys.mjs": typeof import("resource://gre/modules/ExtensionDNRLimits.sys.mjs"); + "resource://gre/modules/ExtensionDNRStore.sys.mjs": typeof import("resource://gre/modules/ExtensionDNRStore.sys.mjs"); + "resource://gre/modules/ExtensionMenus.sys.mjs": typeof import("resource://gre/modules/ExtensionMenus.sys.mjs"); + "resource://gre/modules/ExtensionPageChild.sys.mjs": typeof import("resource://gre/modules/ExtensionPageChild.sys.mjs"); + "resource://gre/modules/ExtensionParent.sys.mjs": typeof import("resource://gre/modules/ExtensionParent.sys.mjs"); + "resource://gre/modules/ExtensionPermissionMessages.sys.mjs": typeof import("resource://gre/modules/ExtensionPermissionMessages.sys.mjs"); + "resource://gre/modules/ExtensionPermissions.sys.mjs": typeof import("resource://gre/modules/ExtensionPermissions.sys.mjs"); + "resource://gre/modules/ExtensionPreferencesManager.sys.mjs": typeof import("resource://gre/modules/ExtensionPreferencesManager.sys.mjs"); + "resource://gre/modules/ExtensionProcessScript.sys.mjs": typeof import("resource://gre/modules/ExtensionProcessScript.sys.mjs"); + "resource://gre/modules/ExtensionScriptingStore.sys.mjs": typeof import("resource://gre/modules/ExtensionScriptingStore.sys.mjs"); + "resource://gre/modules/ExtensionSearchHandler.sys.mjs": typeof import("resource://gre/modules/ExtensionSearchHandler.sys.mjs"); + "resource://gre/modules/ExtensionSettingsStore.sys.mjs": typeof import("resource://gre/modules/ExtensionSettingsStore.sys.mjs"); + "resource://gre/modules/ExtensionShortcuts.sys.mjs": typeof import("resource://gre/modules/ExtensionShortcuts.sys.mjs"); + "resource://gre/modules/ExtensionStorage.sys.mjs": typeof import("resource://gre/modules/ExtensionStorage.sys.mjs"); + "resource://gre/modules/ExtensionStorageComponents.sys.mjs": typeof import("resource://gre/modules/ExtensionStorageComponents.sys.mjs"); + "resource://gre/modules/ExtensionStorageIDB.sys.mjs": typeof import("resource://gre/modules/ExtensionStorageIDB.sys.mjs"); + "resource://gre/modules/ExtensionStorageSync.sys.mjs": typeof import("resource://gre/modules/ExtensionStorageSync.sys.mjs"); + "resource://gre/modules/ExtensionStorageSyncKinto.sys.mjs": typeof import("resource://gre/modules/ExtensionStorageSyncKinto.sys.mjs"); + "resource://gre/modules/ExtensionTaskScheduler.sys.mjs": typeof import("resource://gre/modules/ExtensionTaskScheduler.sys.mjs"); + "resource://gre/modules/ExtensionTelemetry.sys.mjs": typeof import("resource://gre/modules/ExtensionTelemetry.sys.mjs"); + "resource://gre/modules/ExtensionUserScripts.sys.mjs": typeof import("resource://gre/modules/ExtensionUserScripts.sys.mjs"); + "resource://gre/modules/ExtensionUserScriptsContent.sys.mjs": typeof import("resource://gre/modules/ExtensionUserScriptsContent.sys.mjs"); + "resource://gre/modules/ExtensionUtils.sys.mjs": typeof import("resource://gre/modules/ExtensionUtils.sys.mjs"); + "resource://gre/modules/ExtensionWorkerChild.sys.mjs": typeof import("resource://gre/modules/ExtensionWorkerChild.sys.mjs"); + "resource://gre/modules/FileUtils.sys.mjs": typeof import("resource://gre/modules/FileUtils.sys.mjs"); + "resource://gre/modules/FillHelpers.sys.mjs": typeof import("resource://gre/modules/FillHelpers.sys.mjs"); + "resource://gre/modules/FindBarContent.sys.mjs": typeof import("resource://gre/modules/FindBarContent.sys.mjs"); + "resource://gre/modules/FindContent.sys.mjs": typeof import("resource://gre/modules/FindContent.sys.mjs"); + "resource://gre/modules/Finder.sys.mjs": typeof import("resource://gre/modules/Finder.sys.mjs"); + "resource://gre/modules/FinderHighlighter.sys.mjs": typeof import("resource://gre/modules/FinderHighlighter.sys.mjs"); + "resource://gre/modules/FinderIterator.sys.mjs": typeof import("resource://gre/modules/FinderIterator.sys.mjs"); + "resource://gre/modules/FinderParent.sys.mjs": typeof import("resource://gre/modules/FinderParent.sys.mjs"); + "resource://gre/modules/FinderSound.sys.mjs": typeof import("resource://gre/modules/FinderSound.sys.mjs"); + "resource://gre/modules/FirefoxRelay.sys.mjs": typeof import("resource://gre/modules/FirefoxRelay.sys.mjs"); + "resource://gre/modules/FirstStartup.sys.mjs": typeof import("resource://gre/modules/FirstStartup.sys.mjs"); + "resource://gre/modules/ForgetAboutSite.sys.mjs": typeof import("resource://gre/modules/ForgetAboutSite.sys.mjs"); + "resource://gre/modules/FormHistory.sys.mjs": typeof import("resource://gre/modules/FormHistory.sys.mjs"); + "resource://gre/modules/FormHistoryAutoComplete.sys.mjs": typeof import("resource://gre/modules/FormHistoryAutoComplete.sys.mjs"); + "resource://gre/modules/FormLikeFactory.sys.mjs": typeof import("resource://gre/modules/FormLikeFactory.sys.mjs"); + "resource://gre/modules/FormScenarios.sys.mjs": typeof import("resource://gre/modules/FormScenarios.sys.mjs"); + "resource://gre/modules/FxAccounts.sys.mjs": typeof import("resource://gre/modules/FxAccounts.sys.mjs"); + "resource://gre/modules/FxAccountsClient.sys.mjs": typeof import("resource://gre/modules/FxAccountsClient.sys.mjs"); + "resource://gre/modules/FxAccountsCommands.sys.mjs": typeof import("resource://gre/modules/FxAccountsCommands.sys.mjs"); + "resource://gre/modules/FxAccountsCommon.sys.mjs": typeof import("resource://gre/modules/FxAccountsCommon.sys.mjs"); + "resource://gre/modules/FxAccountsConfig.sys.mjs": typeof import("resource://gre/modules/FxAccountsConfig.sys.mjs"); + "resource://gre/modules/FxAccountsDevice.sys.mjs": typeof import("resource://gre/modules/FxAccountsDevice.sys.mjs"); + "resource://gre/modules/FxAccountsKeys.sys.mjs": typeof import("resource://gre/modules/FxAccountsKeys.sys.mjs"); + "resource://gre/modules/FxAccountsOAuth.sys.mjs": typeof import("resource://gre/modules/FxAccountsOAuth.sys.mjs"); + "resource://gre/modules/FxAccountsPairing.sys.mjs": typeof import("resource://gre/modules/FxAccountsPairing.sys.mjs"); + "resource://gre/modules/FxAccountsPairingChannel.sys.mjs": typeof import("resource://gre/modules/FxAccountsPairingChannel.sys.mjs"); + "resource://gre/modules/FxAccountsProfile.sys.mjs": typeof import("resource://gre/modules/FxAccountsProfile.sys.mjs"); + "resource://gre/modules/FxAccountsProfileClient.sys.mjs": typeof import("resource://gre/modules/FxAccountsProfileClient.sys.mjs"); + "resource://gre/modules/FxAccountsPush.sys.mjs": typeof import("resource://gre/modules/FxAccountsPush.sys.mjs"); + "resource://gre/modules/FxAccountsStorage.sys.mjs": typeof import("resource://gre/modules/FxAccountsStorage.sys.mjs"); + "resource://gre/modules/FxAccountsTelemetry.sys.mjs": typeof import("resource://gre/modules/FxAccountsTelemetry.sys.mjs"); + "resource://gre/modules/FxAccountsWebChannel.sys.mjs": typeof import("resource://gre/modules/FxAccountsWebChannel.sys.mjs"); + "resource://gre/modules/GMPInstallManager.sys.mjs": typeof import("resource://gre/modules/GMPInstallManager.sys.mjs"); + "resource://gre/modules/GMPUtils.sys.mjs": typeof import("resource://gre/modules/GMPUtils.sys.mjs"); + "resource://gre/modules/GeckoViewActorManager.sys.mjs": typeof import("resource://gre/modules/GeckoViewActorManager.sys.mjs"); + "resource://gre/modules/GeckoViewAutocomplete.sys.mjs": typeof import("resource://gre/modules/GeckoViewAutocomplete.sys.mjs"); + "resource://gre/modules/GeckoViewAutofill.sys.mjs": typeof import("resource://gre/modules/GeckoViewAutofill.sys.mjs"); + "resource://gre/modules/GeckoViewChildModule.sys.mjs": typeof import("resource://gre/modules/GeckoViewChildModule.sys.mjs"); + "resource://gre/modules/GeckoViewClipboardPermission.sys.mjs": typeof import("resource://gre/modules/GeckoViewClipboardPermission.sys.mjs"); + "resource://gre/modules/GeckoViewIdentityCredential.sys.mjs": typeof import("resource://gre/modules/GeckoViewIdentityCredential.sys.mjs"); + "resource://gre/modules/GeckoViewPrompter.sys.mjs": typeof import("resource://gre/modules/GeckoViewPrompter.sys.mjs"); + "resource://gre/modules/GeckoViewSettings.sys.mjs": typeof import("resource://gre/modules/GeckoViewSettings.sys.mjs"); + "resource://gre/modules/GeckoViewTab.sys.mjs": typeof import("resource://gre/modules/GeckoViewTab.sys.mjs"); + "resource://gre/modules/GeckoViewTelemetry.sys.mjs": typeof import("resource://gre/modules/GeckoViewTelemetry.sys.mjs"); + "resource://gre/modules/GeckoViewTestUtils.sys.mjs": typeof import("resource://gre/modules/GeckoViewTestUtils.sys.mjs"); + "resource://gre/modules/GeckoViewUtils.sys.mjs": typeof import("resource://gre/modules/GeckoViewUtils.sys.mjs"); + "resource://gre/modules/GeckoViewWebExtension.sys.mjs": typeof import("resource://gre/modules/GeckoViewWebExtension.sys.mjs"); + "resource://gre/modules/Geometry.sys.mjs": typeof import("resource://gre/modules/Geometry.sys.mjs"); + "resource://gre/modules/HPKEConfigManager.sys.mjs": typeof import("resource://gre/modules/HPKEConfigManager.sys.mjs"); + "resource://gre/modules/HealthPing.sys.mjs": typeof import("resource://gre/modules/HealthPing.sys.mjs"); + "resource://gre/modules/HiddenFrame.sys.mjs": typeof import("resource://gre/modules/HiddenFrame.sys.mjs"); + "resource://gre/modules/History.sys.mjs": typeof import("resource://gre/modules/History.sys.mjs"); + "resource://gre/modules/IgnoreLists.sys.mjs": typeof import("resource://gre/modules/IgnoreLists.sys.mjs"); + "resource://gre/modules/IndexedDB.sys.mjs": typeof import("resource://gre/modules/IndexedDB.sys.mjs"); + "resource://gre/modules/InlineSpellChecker.sys.mjs": typeof import("resource://gre/modules/InlineSpellChecker.sys.mjs"); + "resource://gre/modules/InlineSpellCheckerContent.sys.mjs": typeof import("resource://gre/modules/InlineSpellCheckerContent.sys.mjs"); + "resource://gre/modules/InsecurePasswordUtils.sys.mjs": typeof import("resource://gre/modules/InsecurePasswordUtils.sys.mjs"); + "resource://gre/modules/Integration.sys.mjs": typeof import("resource://gre/modules/Integration.sys.mjs"); + "resource://gre/modules/JSONFile.sys.mjs": typeof import("resource://gre/modules/JSONFile.sys.mjs"); + "resource://gre/modules/JsonSchema.sys.mjs": typeof import("resource://gre/modules/JsonSchema.sys.mjs"); + "resource://gre/modules/KeywordUtils.sys.mjs": typeof import("resource://gre/modules/KeywordUtils.sys.mjs"); + "resource://gre/modules/LangPackMatcher.sys.mjs": typeof import("resource://gre/modules/LangPackMatcher.sys.mjs"); + "resource://gre/modules/LayoutUtils.sys.mjs": typeof import("resource://gre/modules/LayoutUtils.sys.mjs"); + "resource://gre/modules/LightweightThemeConsumer.sys.mjs": typeof import("resource://gre/modules/LightweightThemeConsumer.sys.mjs"); + "resource://gre/modules/LightweightThemeManager.sys.mjs": typeof import("resource://gre/modules/LightweightThemeManager.sys.mjs"); + "resource://gre/modules/LoadURIDelegate.sys.mjs": typeof import("resource://gre/modules/LoadURIDelegate.sys.mjs"); + "resource://gre/modules/LocationHelper.sys.mjs": typeof import("resource://gre/modules/LocationHelper.sys.mjs"); + "resource://gre/modules/Log.sys.mjs": typeof import("resource://gre/modules/Log.sys.mjs"); + "resource://gre/modules/LogManager.sys.mjs": typeof import("resource://gre/modules/LogManager.sys.mjs"); + "resource://gre/modules/LoginAutoComplete.sys.mjs": typeof import("resource://gre/modules/LoginAutoComplete.sys.mjs"); + "resource://gre/modules/LoginCSVImport.sys.mjs": typeof import("resource://gre/modules/LoginCSVImport.sys.mjs"); + "resource://gre/modules/LoginExport.sys.mjs": typeof import("resource://gre/modules/LoginExport.sys.mjs"); + "resource://gre/modules/LoginHelper.sys.mjs": typeof import("resource://gre/modules/LoginHelper.sys.mjs"); + "resource://gre/modules/LoginManager.shared.sys.mjs": typeof import("resource://gre/modules/LoginManager.shared.sys.mjs"); + "resource://gre/modules/LoginManager.sys.mjs": typeof import("resource://gre/modules/LoginManager.sys.mjs"); + "resource://gre/modules/LoginManagerChild.sys.mjs": typeof import("resource://gre/modules/LoginManagerChild.sys.mjs"); + "resource://gre/modules/LoginManagerContextMenu.sys.mjs": typeof import("resource://gre/modules/LoginManagerContextMenu.sys.mjs"); + "resource://gre/modules/LoginManagerParent.sys.mjs": typeof import("resource://gre/modules/LoginManagerParent.sys.mjs"); + "resource://gre/modules/LoginManagerPrompter.sys.mjs": typeof import("resource://gre/modules/LoginManagerPrompter.sys.mjs"); + "resource://gre/modules/LoginRecipes.sys.mjs": typeof import("resource://gre/modules/LoginRecipes.sys.mjs"); + "resource://gre/modules/LoginRelatedRealms.sys.mjs": typeof import("resource://gre/modules/LoginRelatedRealms.sys.mjs"); + "resource://gre/modules/LoginStore.sys.mjs": typeof import("resource://gre/modules/LoginStore.sys.mjs"); + "resource://gre/modules/Manifest.sys.mjs": typeof import("resource://gre/modules/Manifest.sys.mjs"); + "resource://gre/modules/ManifestFinder.sys.mjs": typeof import("resource://gre/modules/ManifestFinder.sys.mjs"); + "resource://gre/modules/ManifestIcons.sys.mjs": typeof import("resource://gre/modules/ManifestIcons.sys.mjs"); + "resource://gre/modules/ManifestObtainer.sys.mjs": typeof import("resource://gre/modules/ManifestObtainer.sys.mjs"); + "resource://gre/modules/ManifestProcessor.sys.mjs": typeof import("resource://gre/modules/ManifestProcessor.sys.mjs"); + "resource://gre/modules/MatchURLFilters.sys.mjs": typeof import("resource://gre/modules/MatchURLFilters.sys.mjs"); + "resource://gre/modules/MediaUtils.sys.mjs": typeof import("resource://gre/modules/MediaUtils.sys.mjs"); + "resource://gre/modules/MessageManagerProxy.sys.mjs": typeof import("resource://gre/modules/MessageManagerProxy.sys.mjs"); + "resource://gre/modules/Messaging.sys.mjs": typeof import("resource://gre/modules/Messaging.sys.mjs"); + "resource://gre/modules/NLP.sys.mjs": typeof import("resource://gre/modules/NLP.sys.mjs"); + "resource://gre/modules/NativeManifests.sys.mjs": typeof import("resource://gre/modules/NativeManifests.sys.mjs"); + "resource://gre/modules/NativeMessaging.sys.mjs": typeof import("resource://gre/modules/NativeMessaging.sys.mjs"); + "resource://gre/modules/NetUtil.sys.mjs": typeof import("resource://gre/modules/NetUtil.sys.mjs"); + "resource://gre/modules/NewTabUtils.sys.mjs": typeof import("resource://gre/modules/NewTabUtils.sys.mjs"); + "resource://gre/modules/OSCrypto_win.sys.mjs": typeof import("resource://gre/modules/OSCrypto_win.sys.mjs"); + "resource://gre/modules/OSKeyStore.sys.mjs": typeof import("resource://gre/modules/OSKeyStore.sys.mjs"); + "resource://gre/modules/ObjectUtils.sys.mjs": typeof import("resource://gre/modules/ObjectUtils.sys.mjs"); + "resource://gre/modules/ObliviousHTTP.sys.mjs": typeof import("resource://gre/modules/ObliviousHTTP.sys.mjs"); + "resource://gre/modules/OsEnvironment.sys.mjs": typeof import("resource://gre/modules/OsEnvironment.sys.mjs"); + "resource://gre/modules/PageThumbUtils.sys.mjs": typeof import("resource://gre/modules/PageThumbUtils.sys.mjs"); + "resource://gre/modules/PageThumbs.sys.mjs": typeof import("resource://gre/modules/PageThumbs.sys.mjs"); + "resource://gre/modules/PasswordRulesManager.sys.mjs": typeof import("resource://gre/modules/PasswordRulesManager.sys.mjs"); + "resource://gre/modules/PermissionsUtils.sys.mjs": typeof import("resource://gre/modules/PermissionsUtils.sys.mjs"); + "resource://gre/modules/PictureInPicture.sys.mjs": typeof import("resource://gre/modules/PictureInPicture.sys.mjs"); + "resource://gre/modules/PictureInPictureControls.sys.mjs": typeof import("resource://gre/modules/PictureInPictureControls.sys.mjs"); + "resource://gre/modules/PlacesBackups.sys.mjs": typeof import("resource://gre/modules/PlacesBackups.sys.mjs"); + "resource://gre/modules/PlacesDBUtils.sys.mjs": typeof import("resource://gre/modules/PlacesDBUtils.sys.mjs"); + "resource://gre/modules/PlacesPreviews.sys.mjs": typeof import("resource://gre/modules/PlacesPreviews.sys.mjs"); + "resource://gre/modules/PlacesQuery.sys.mjs": typeof import("resource://gre/modules/PlacesQuery.sys.mjs"); + "resource://gre/modules/PlacesSemanticHistoryDatabase.sys.mjs": typeof import("resource://gre/modules/PlacesSemanticHistoryDatabase.sys.mjs"); + "resource://gre/modules/PlacesSemanticHistoryManager.sys.mjs": typeof import("resource://gre/modules/PlacesSemanticHistoryManager.sys.mjs"); + "resource://gre/modules/PlacesSyncUtils.sys.mjs": typeof import("resource://gre/modules/PlacesSyncUtils.sys.mjs"); + "resource://gre/modules/PlacesTransactions.sys.mjs": typeof import("resource://gre/modules/PlacesTransactions.sys.mjs"); + "resource://gre/modules/PlacesUtils.sys.mjs": typeof import("resource://gre/modules/PlacesUtils.sys.mjs"); + "resource://gre/modules/PopupNotifications.sys.mjs": typeof import("resource://gre/modules/PopupNotifications.sys.mjs"); + "resource://gre/modules/Preferences.sys.mjs": typeof import("resource://gre/modules/Preferences.sys.mjs"); + "resource://gre/modules/PrincipalsCollector.sys.mjs": typeof import("resource://gre/modules/PrincipalsCollector.sys.mjs"); + "resource://gre/modules/PrivateAttributionService.sys.mjs": typeof import("resource://gre/modules/PrivateAttributionService.sys.mjs"); + "resource://gre/modules/PrivateBrowsingUtils.sys.mjs": typeof import("resource://gre/modules/PrivateBrowsingUtils.sys.mjs"); + "resource://gre/modules/ProcessType.sys.mjs": typeof import("resource://gre/modules/ProcessType.sys.mjs"); + "resource://gre/modules/ProfileAge.sys.mjs": typeof import("resource://gre/modules/ProfileAge.sys.mjs"); + "resource://gre/modules/PromiseWorker.sys.mjs": typeof import("resource://gre/modules/PromiseWorker.sys.mjs"); + "resource://gre/modules/PromptUtils.sys.mjs": typeof import("resource://gre/modules/PromptUtils.sys.mjs"); + "resource://gre/modules/PropertyListUtils.sys.mjs": typeof import("resource://gre/modules/PropertyListUtils.sys.mjs"); + "resource://gre/modules/ProxyChannelFilter.sys.mjs": typeof import("resource://gre/modules/ProxyChannelFilter.sys.mjs"); + "resource://gre/modules/PushBroadcastService.sys.mjs": typeof import("resource://gre/modules/PushBroadcastService.sys.mjs"); + "resource://gre/modules/PushCrypto.sys.mjs": typeof import("resource://gre/modules/PushCrypto.sys.mjs"); + "resource://gre/modules/PushRecord.sys.mjs": typeof import("resource://gre/modules/PushRecord.sys.mjs"); + "resource://gre/modules/PushService.sys.mjs": typeof import("resource://gre/modules/PushService.sys.mjs"); + "resource://gre/modules/PushServiceWebSocket.sys.mjs": typeof import("resource://gre/modules/PushServiceWebSocket.sys.mjs"); + "resource://gre/modules/RFPHelper.sys.mjs": typeof import("resource://gre/modules/RFPHelper.sys.mjs"); + "resource://gre/modules/Readerable.sys.mjs": typeof import("resource://gre/modules/Readerable.sys.mjs"); + "resource://gre/modules/Region.sys.mjs": typeof import("resource://gre/modules/Region.sys.mjs"); + "resource://gre/modules/RemotePageAccessManager.sys.mjs": typeof import("resource://gre/modules/RemotePageAccessManager.sys.mjs"); + "resource://gre/modules/RemoteSettingsCrashPull.sys.mjs": typeof import("resource://gre/modules/RemoteSettingsCrashPull.sys.mjs"); + "resource://gre/modules/RemoteWebNavigation.sys.mjs": typeof import("resource://gre/modules/RemoteWebNavigation.sys.mjs"); + "resource://gre/modules/ResetProfile.sys.mjs": typeof import("resource://gre/modules/ResetProfile.sys.mjs"); + "resource://gre/modules/RustSharedRemoteSettingsService.sys.mjs": typeof import("resource://gre/modules/RustSharedRemoteSettingsService.sys.mjs"); + "resource://gre/modules/SafeBrowsing.sys.mjs": typeof import("resource://gre/modules/SafeBrowsing.sys.mjs"); + "resource://gre/modules/SandboxUtils.sys.mjs": typeof import("resource://gre/modules/SandboxUtils.sys.mjs"); + "resource://gre/modules/Schemas.sys.mjs": typeof import("resource://gre/modules/Schemas.sys.mjs"); + "resource://gre/modules/SearchService.sys.mjs": typeof import("resource://gre/modules/SearchService.sys.mjs"); + "resource://gre/modules/SecurityInfo.sys.mjs": typeof import("resource://gre/modules/SecurityInfo.sys.mjs"); + "resource://gre/modules/SelectionUtils.sys.mjs": typeof import("resource://gre/modules/SelectionUtils.sys.mjs"); + "resource://gre/modules/ServiceRequest.sys.mjs": typeof import("resource://gre/modules/ServiceRequest.sys.mjs"); + "resource://gre/modules/ServiceWorkerCleanUp.sys.mjs": typeof import("resource://gre/modules/ServiceWorkerCleanUp.sys.mjs"); + "resource://gre/modules/ShortcutUtils.sys.mjs": typeof import("resource://gre/modules/ShortcutUtils.sys.mjs"); + "resource://gre/modules/Sqlite.sys.mjs": typeof import("resource://gre/modules/Sqlite.sys.mjs"); + "resource://gre/modules/SubDialog.sys.mjs": typeof import("resource://gre/modules/SubDialog.sys.mjs"); + "resource://gre/modules/Subprocess.sys.mjs": typeof import("resource://gre/modules/Subprocess.sys.mjs"); + "resource://gre/modules/SyncedBookmarksMirror.sys.mjs": typeof import("resource://gre/modules/SyncedBookmarksMirror.sys.mjs"); + "resource://gre/modules/TaskScheduler.sys.mjs": typeof import("resource://gre/modules/TaskScheduler.sys.mjs"); + "resource://gre/modules/TaskSchedulerMacOSImpl.sys.mjs": typeof import("resource://gre/modules/TaskSchedulerMacOSImpl.sys.mjs"); + "resource://gre/modules/TaskSchedulerWinImpl.sys.mjs": typeof import("resource://gre/modules/TaskSchedulerWinImpl.sys.mjs"); + "resource://gre/modules/TelemetryArchive.sys.mjs": typeof import("resource://gre/modules/TelemetryArchive.sys.mjs"); + "resource://gre/modules/TelemetryController.sys.mjs": typeof import("resource://gre/modules/TelemetryController.sys.mjs"); + "resource://gre/modules/TelemetryControllerContent.sys.mjs": typeof import("resource://gre/modules/TelemetryControllerContent.sys.mjs"); + "resource://gre/modules/TelemetryControllerParent.sys.mjs": typeof import("resource://gre/modules/TelemetryControllerParent.sys.mjs"); + "resource://gre/modules/TelemetryEnvironment.sys.mjs": typeof import("resource://gre/modules/TelemetryEnvironment.sys.mjs"); + "resource://gre/modules/TelemetryReportingPolicy.sys.mjs": typeof import("resource://gre/modules/TelemetryReportingPolicy.sys.mjs"); + "resource://gre/modules/TelemetryScheduler.sys.mjs": typeof import("resource://gre/modules/TelemetryScheduler.sys.mjs"); + "resource://gre/modules/TelemetrySend.sys.mjs": typeof import("resource://gre/modules/TelemetrySend.sys.mjs"); + "resource://gre/modules/TelemetrySession.sys.mjs": typeof import("resource://gre/modules/TelemetrySession.sys.mjs"); + "resource://gre/modules/TelemetryStorage.sys.mjs": typeof import("resource://gre/modules/TelemetryStorage.sys.mjs"); + "resource://gre/modules/TelemetryTimestamps.sys.mjs": typeof import("resource://gre/modules/TelemetryTimestamps.sys.mjs"); + "resource://gre/modules/TelemetryUtils.sys.mjs": typeof import("resource://gre/modules/TelemetryUtils.sys.mjs"); + "resource://gre/modules/Timer.sys.mjs": typeof import("resource://gre/modules/Timer.sys.mjs"); + "resource://gre/modules/Troubleshoot.sys.mjs": typeof import("resource://gre/modules/Troubleshoot.sys.mjs"); + "resource://gre/modules/UninstallPing.sys.mjs": typeof import("resource://gre/modules/UninstallPing.sys.mjs"); + "resource://gre/modules/UntrustedModulesPing.sys.mjs": typeof import("resource://gre/modules/UntrustedModulesPing.sys.mjs"); + "resource://gre/modules/UpdateListener.sys.mjs": typeof import("resource://gre/modules/UpdateListener.sys.mjs"); + "resource://gre/modules/UpdateLog.sys.mjs": typeof import("resource://gre/modules/UpdateLog.sys.mjs"); + "resource://gre/modules/UpdatePing.sys.mjs": typeof import("resource://gre/modules/UpdatePing.sys.mjs"); + "resource://gre/modules/UpdateService.sys.mjs": typeof import("resource://gre/modules/UpdateService.sys.mjs"); + "resource://gre/modules/UpdateTimerManager.sys.mjs": typeof import("resource://gre/modules/UpdateTimerManager.sys.mjs"); + "resource://gre/modules/UpdateUtils.sys.mjs": typeof import("resource://gre/modules/UpdateUtils.sys.mjs"); + "resource://gre/modules/UrlClassifierRemoteSettingsService.sys.mjs": typeof import("resource://gre/modules/UrlClassifierRemoteSettingsService.sys.mjs"); + "resource://gre/modules/UrlUtils.sys.mjs": typeof import("resource://gre/modules/UrlUtils.sys.mjs"); + "resource://gre/modules/UsageReporting.sys.mjs": typeof import("resource://gre/modules/UsageReporting.sys.mjs"); + "resource://gre/modules/WPTEventsParent.sys.mjs": typeof import("resource://gre/modules/WPTEventsParent.sys.mjs"); + "resource://gre/modules/WebAuthnFeature.sys.mjs": typeof import("resource://gre/modules/WebAuthnFeature.sys.mjs"); + "resource://gre/modules/WebChannel.sys.mjs": typeof import("resource://gre/modules/WebChannel.sys.mjs"); + "resource://gre/modules/WebNavigation.sys.mjs": typeof import("resource://gre/modules/WebNavigation.sys.mjs"); + "resource://gre/modules/WebNavigationFrames.sys.mjs": typeof import("resource://gre/modules/WebNavigationFrames.sys.mjs"); + "resource://gre/modules/WebRequest.sys.mjs": typeof import("resource://gre/modules/WebRequest.sys.mjs"); + "resource://gre/modules/WebRequestUpload.sys.mjs": typeof import("resource://gre/modules/WebRequestUpload.sys.mjs"); + "resource://gre/modules/WindowsLaunchOnLogin.sys.mjs": typeof import("resource://gre/modules/WindowsLaunchOnLogin.sys.mjs"); + "resource://gre/modules/WindowsRegistry.sys.mjs": typeof import("resource://gre/modules/WindowsRegistry.sys.mjs"); + "resource://gre/modules/XPCOMUtils.sys.mjs": typeof import("resource://gre/modules/XPCOMUtils.sys.mjs"); + "resource://gre/modules/addons/AddonRepository.sys.mjs": typeof import("resource://gre/modules/addons/AddonRepository.sys.mjs"); + "resource://gre/modules/addons/AddonSettings.sys.mjs": typeof import("resource://gre/modules/addons/AddonSettings.sys.mjs"); + "resource://gre/modules/addons/AddonUpdateChecker.sys.mjs": typeof import("resource://gre/modules/addons/AddonUpdateChecker.sys.mjs"); + "resource://gre/modules/addons/GMPProvider.sys.mjs": typeof import("resource://gre/modules/addons/GMPProvider.sys.mjs"); + "resource://gre/modules/addons/ModelHubProvider.sys.mjs": typeof import("resource://gre/modules/addons/ModelHubProvider.sys.mjs"); + "resource://gre/modules/addons/ProductAddonChecker.sys.mjs": typeof import("resource://gre/modules/addons/ProductAddonChecker.sys.mjs"); + "resource://gre/modules/addons/SitePermsAddonProvider.sys.mjs": typeof import("resource://gre/modules/addons/SitePermsAddonProvider.sys.mjs"); + "resource://gre/modules/addons/XPIDatabase.sys.mjs": typeof import("resource://gre/modules/addons/XPIDatabase.sys.mjs"); + "resource://gre/modules/addons/XPIExports.sys.mjs": typeof import("resource://gre/modules/addons/XPIExports.sys.mjs"); + "resource://gre/modules/addons/XPIInstall.sys.mjs": typeof import("resource://gre/modules/addons/XPIInstall.sys.mjs"); + "resource://gre/modules/addons/XPIProvider.sys.mjs": typeof import("resource://gre/modules/addons/XPIProvider.sys.mjs"); + "resource://gre/modules/addons/crypto-utils.sys.mjs": typeof import("resource://gre/modules/addons/crypto-utils.sys.mjs"); + "resource://gre/modules/addons/siteperms-addon-utils.sys.mjs": typeof import("resource://gre/modules/addons/siteperms-addon-utils.sys.mjs"); + "resource://gre/modules/backgroundtasks/BackgroundTask_backgroundupdate.sys.mjs": typeof import("resource://gre/modules/backgroundtasks/BackgroundTask_backgroundupdate.sys.mjs"); + "resource://gre/modules/backgroundtasks/BackgroundTask_defaultagent.sys.mjs": typeof import("resource://gre/modules/backgroundtasks/BackgroundTask_defaultagent.sys.mjs"); + "resource://gre/modules/components-utils/ClientEnvironment.sys.mjs": typeof import("resource://gre/modules/components-utils/ClientEnvironment.sys.mjs"); + "resource://gre/modules/components-utils/FilterExpressions.sys.mjs": typeof import("resource://gre/modules/components-utils/FilterExpressions.sys.mjs"); + "resource://gre/modules/components-utils/JsonSchemaValidator.sys.mjs": typeof import("resource://gre/modules/components-utils/JsonSchemaValidator.sys.mjs"); + "resource://gre/modules/components-utils/Sampling.sys.mjs": typeof import("resource://gre/modules/components-utils/Sampling.sys.mjs"); + "resource://gre/modules/components-utils/WindowsInstallsInfo.sys.mjs": typeof import("resource://gre/modules/components-utils/WindowsInstallsInfo.sys.mjs"); + "resource://gre/modules/components-utils/WindowsVersionInfo.sys.mjs": typeof import("resource://gre/modules/components-utils/WindowsVersionInfo.sys.mjs"); + "resource://gre/modules/components-utils/mozjexl.sys.mjs": typeof import("resource://gre/modules/components-utils/mozjexl.sys.mjs"); + "resource://gre/modules/contentrelevancy/private/InputUtils.sys.mjs": typeof import("resource://gre/modules/contentrelevancy/private/InputUtils.sys.mjs"); + "resource://gre/modules/ctypes.sys.mjs": typeof import("resource://gre/modules/ctypes.sys.mjs"); + "resource://gre/modules/handlers/HandlerList.sys.mjs": typeof import("resource://gre/modules/handlers/HandlerList.sys.mjs"); + "resource://gre/modules/jsdebugger.sys.mjs": typeof import("resource://gre/modules/jsdebugger.sys.mjs"); + "resource://gre/modules/kvstore.sys.mjs": typeof import("resource://gre/modules/kvstore.sys.mjs"); + "resource://gre/modules/media/IdpSandbox.sys.mjs": typeof import("resource://gre/modules/media/IdpSandbox.sys.mjs"); + "resource://gre/modules/media/PeerConnectionIdp.sys.mjs": typeof import("resource://gre/modules/media/PeerConnectionIdp.sys.mjs"); + "resource://gre/modules/megalist/MegalistViewModel.sys.mjs": typeof import("resource://gre/modules/megalist/MegalistViewModel.sys.mjs"); + "resource://gre/modules/megalist/aggregator/Aggregator.sys.mjs": typeof import("resource://gre/modules/megalist/aggregator/Aggregator.sys.mjs"); + "resource://gre/modules/megalist/aggregator/datasources/DataSourceBase.sys.mjs": typeof import("resource://gre/modules/megalist/aggregator/datasources/DataSourceBase.sys.mjs"); + "resource://gre/modules/megalist/aggregator/datasources/LoginDataSource.sys.mjs": typeof import("resource://gre/modules/megalist/aggregator/datasources/LoginDataSource.sys.mjs"); + "resource://gre/modules/narrate/NarrateControls.sys.mjs": typeof import("resource://gre/modules/narrate/NarrateControls.sys.mjs"); + "resource://gre/modules/policies/WindowsGPOParser.sys.mjs": typeof import("resource://gre/modules/policies/WindowsGPOParser.sys.mjs"); + "resource://gre/modules/policies/macOSPoliciesParser.sys.mjs": typeof import("resource://gre/modules/policies/macOSPoliciesParser.sys.mjs"); + "resource://gre/modules/psm/RemoteSecuritySettings.sys.mjs": typeof import("resource://gre/modules/psm/RemoteSecuritySettings.sys.mjs"); + "resource://gre/modules/psm/X509.sys.mjs": typeof import("resource://gre/modules/psm/X509.sys.mjs"); + "resource://gre/modules/psm/pippki.sys.mjs": typeof import("resource://gre/modules/psm/pippki.sys.mjs"); + "resource://gre/modules/reflect.sys.mjs": typeof import("resource://gre/modules/reflect.sys.mjs"); + "resource://gre/modules/services-automation/ServicesAutomation.sys.mjs": typeof import("resource://gre/modules/services-automation/ServicesAutomation.sys.mjs"); + "resource://gre/modules/sessionstore/PrivacyFilter.sys.mjs": typeof import("resource://gre/modules/sessionstore/PrivacyFilter.sys.mjs"); + "resource://gre/modules/sessionstore/PrivacyLevel.sys.mjs": typeof import("resource://gre/modules/sessionstore/PrivacyLevel.sys.mjs"); + "resource://gre/modules/sessionstore/SessionHistory.sys.mjs": typeof import("resource://gre/modules/sessionstore/SessionHistory.sys.mjs"); + "resource://gre/modules/sessionstore/SessionStoreHelper.sys.mjs": typeof import("resource://gre/modules/sessionstore/SessionStoreHelper.sys.mjs"); + "resource://gre/modules/shared/AddressComponent.sys.mjs": typeof import("resource://gre/modules/shared/AddressComponent.sys.mjs"); + "resource://gre/modules/shared/AddressMetaData.sys.mjs": typeof import("resource://gre/modules/shared/AddressMetaData.sys.mjs"); + "resource://gre/modules/shared/AddressMetaDataExtension.sys.mjs": typeof import("resource://gre/modules/shared/AddressMetaDataExtension.sys.mjs"); + "resource://gre/modules/shared/AddressMetaDataLoader.sys.mjs": typeof import("resource://gre/modules/shared/AddressMetaDataLoader.sys.mjs"); + "resource://gre/modules/shared/AddressParser.sys.mjs": typeof import("resource://gre/modules/shared/AddressParser.sys.mjs"); + "resource://gre/modules/shared/AddressRecord.sys.mjs": typeof import("resource://gre/modules/shared/AddressRecord.sys.mjs"); + "resource://gre/modules/shared/AutofillFormFactory.sys.mjs": typeof import("resource://gre/modules/shared/AutofillFormFactory.sys.mjs"); + "resource://gre/modules/shared/AutofillTelemetry.sys.mjs": typeof import("resource://gre/modules/shared/AutofillTelemetry.sys.mjs"); + "resource://gre/modules/shared/CreditCardRecord.sys.mjs": typeof import("resource://gre/modules/shared/CreditCardRecord.sys.mjs"); + "resource://gre/modules/shared/CreditCardRuleset.sys.mjs": typeof import("resource://gre/modules/shared/CreditCardRuleset.sys.mjs"); + "resource://gre/modules/shared/FieldScanner.sys.mjs": typeof import("resource://gre/modules/shared/FieldScanner.sys.mjs"); + "resource://gre/modules/shared/FormAutofillHandler.sys.mjs": typeof import("resource://gre/modules/shared/FormAutofillHandler.sys.mjs"); + "resource://gre/modules/shared/FormAutofillHeuristics.sys.mjs": typeof import("resource://gre/modules/shared/FormAutofillHeuristics.sys.mjs"); + "resource://gre/modules/shared/FormAutofillNameUtils.sys.mjs": typeof import("resource://gre/modules/shared/FormAutofillNameUtils.sys.mjs"); + "resource://gre/modules/shared/FormAutofillSection.sys.mjs": typeof import("resource://gre/modules/shared/FormAutofillSection.sys.mjs"); + "resource://gre/modules/shared/FormAutofillUtils.sys.mjs": typeof import("resource://gre/modules/shared/FormAutofillUtils.sys.mjs"); + "resource://gre/modules/shared/FormStateManager.sys.mjs": typeof import("resource://gre/modules/shared/FormStateManager.sys.mjs"); + "resource://gre/modules/shared/LabelUtils.sys.mjs": typeof import("resource://gre/modules/shared/LabelUtils.sys.mjs"); + "resource://gre/modules/shared/LoginFormFactory.sys.mjs": typeof import("resource://gre/modules/shared/LoginFormFactory.sys.mjs"); + "resource://gre/modules/shared/NewPasswordModel.sys.mjs": typeof import("resource://gre/modules/shared/NewPasswordModel.sys.mjs"); + "resource://gre/modules/shared/PasswordGenerator.sys.mjs": typeof import("resource://gre/modules/shared/PasswordGenerator.sys.mjs"); + "resource://gre/modules/shared/PasswordRulesParser.sys.mjs": typeof import("resource://gre/modules/shared/PasswordRulesParser.sys.mjs"); + "resource://gre/modules/shared/PhoneNumber.sys.mjs": typeof import("resource://gre/modules/shared/PhoneNumber.sys.mjs"); + "resource://gre/modules/shared/PhoneNumberNormalizer.sys.mjs": typeof import("resource://gre/modules/shared/PhoneNumberNormalizer.sys.mjs"); + "resource://gre/modules/storage-rust.sys.mjs": typeof import("resource://gre/modules/storage-rust.sys.mjs"); + "resource://gre/modules/subprocess/subprocess_unix.sys.mjs": typeof import("resource://gre/modules/subprocess/subprocess_unix.sys.mjs"); + "resource://gre/modules/subprocess/subprocess_win.sys.mjs": typeof import("resource://gre/modules/subprocess/subprocess_win.sys.mjs"); + "resource://gre/modules/third_party/jsesc/jsesc.mjs": typeof import("resource://gre/modules/third_party/jsesc/jsesc.mjs"); + "resource://gre/modules/translations/LanguageDetector.sys.mjs": typeof import("resource://gre/modules/translations/LanguageDetector.sys.mjs"); + "resource://gre/modules/vtt.sys.mjs": typeof import("resource://gre/modules/vtt.sys.mjs"); + "resource://gre/modules/workers/PromiseWorker.mjs": typeof import("resource://gre/modules/workers/PromiseWorker.mjs"); + "resource://httpd-server/httpd.sys.mjs": typeof import("resource://httpd-server/httpd.sys.mjs"); + "resource://messaging-system/lib/Logger.sys.mjs": typeof import("resource://messaging-system/lib/Logger.sys.mjs"); + "resource://messaging-system/lib/SpecialMessageActions.sys.mjs": typeof import("resource://messaging-system/lib/SpecialMessageActions.sys.mjs"); + "resource://messaging-system/targeting/Targeting.sys.mjs": typeof import("resource://messaging-system/targeting/Targeting.sys.mjs"); + "resource://mozscreenshots/Screenshot.sys.mjs": typeof import("resource://mozscreenshots/Screenshot.sys.mjs"); + "resource://mozscreenshots/TestRunner.sys.mjs": typeof import("resource://mozscreenshots/TestRunner.sys.mjs"); + "resource://newtab/common/Actions.mjs": typeof import("resource://newtab/common/Actions.mjs"); + "resource://newtab/common/Reducers.sys.mjs": typeof import("resource://newtab/common/Reducers.sys.mjs"); + "resource://newtab/lib/AboutPreferences.sys.mjs": typeof import("resource://newtab/lib/AboutPreferences.sys.mjs"); + "resource://newtab/lib/ActivityStream.sys.mjs": typeof import("resource://newtab/lib/ActivityStream.sys.mjs"); + "resource://newtab/lib/ActivityStreamMessageChannel.sys.mjs": typeof import("resource://newtab/lib/ActivityStreamMessageChannel.sys.mjs"); + "resource://newtab/lib/ActivityStreamPrefs.sys.mjs": typeof import("resource://newtab/lib/ActivityStreamPrefs.sys.mjs"); + "resource://newtab/lib/AdsFeed.sys.mjs": typeof import("resource://newtab/lib/AdsFeed.sys.mjs"); + "resource://newtab/lib/DefaultSites.sys.mjs": typeof import("resource://newtab/lib/DefaultSites.sys.mjs"); + "resource://newtab/lib/DiscoveryStreamFeed.sys.mjs": typeof import("resource://newtab/lib/DiscoveryStreamFeed.sys.mjs"); + "resource://newtab/lib/DownloadsManager.sys.mjs": typeof import("resource://newtab/lib/DownloadsManager.sys.mjs"); + "resource://newtab/lib/FaviconFeed.sys.mjs": typeof import("resource://newtab/lib/FaviconFeed.sys.mjs"); + "resource://newtab/lib/HighlightsFeed.sys.mjs": typeof import("resource://newtab/lib/HighlightsFeed.sys.mjs"); + "resource://newtab/lib/InferredModel/FeatureModel.sys.mjs": typeof import("resource://newtab/lib/InferredModel/FeatureModel.sys.mjs"); + "resource://newtab/lib/InferredModel/GreedyContentRanker.mjs": typeof import("resource://newtab/lib/InferredModel/GreedyContentRanker.mjs"); + "resource://newtab/lib/InferredPersonalizationFeed.sys.mjs": typeof import("resource://newtab/lib/InferredPersonalizationFeed.sys.mjs"); + "resource://newtab/lib/NewTabAttributionFeed.sys.mjs": typeof import("resource://newtab/lib/NewTabAttributionFeed.sys.mjs"); + "resource://newtab/lib/NewTabAttributionService.sys.mjs": typeof import("resource://newtab/lib/NewTabAttributionService.sys.mjs"); + "resource://newtab/lib/NewTabContentPing.sys.mjs": typeof import("resource://newtab/lib/NewTabContentPing.sys.mjs"); + "resource://newtab/lib/NewTabGleanUtils.sys.mjs": typeof import("resource://newtab/lib/NewTabGleanUtils.sys.mjs"); + "resource://newtab/lib/NewTabInit.sys.mjs": typeof import("resource://newtab/lib/NewTabInit.sys.mjs"); + "resource://newtab/lib/NewTabMessaging.sys.mjs": typeof import("resource://newtab/lib/NewTabMessaging.sys.mjs"); + "resource://newtab/lib/PersistentCache.sys.mjs": typeof import("resource://newtab/lib/PersistentCache.sys.mjs"); + "resource://newtab/lib/PersonalityProvider/PersonalityProvider.sys.mjs": typeof import("resource://newtab/lib/PersonalityProvider/PersonalityProvider.sys.mjs"); + "resource://newtab/lib/PlacesFeed.sys.mjs": typeof import("resource://newtab/lib/PlacesFeed.sys.mjs"); + "resource://newtab/lib/PrefsFeed.sys.mjs": typeof import("resource://newtab/lib/PrefsFeed.sys.mjs"); + "resource://newtab/lib/RecommendationProvider.sys.mjs": typeof import("resource://newtab/lib/RecommendationProvider.sys.mjs"); + "resource://newtab/lib/Screenshots.sys.mjs": typeof import("resource://newtab/lib/Screenshots.sys.mjs"); + "resource://newtab/lib/SectionsManager.sys.mjs": typeof import("resource://newtab/lib/SectionsManager.sys.mjs"); + "resource://newtab/lib/SmartShortcutsFeed.sys.mjs": typeof import("resource://newtab/lib/SmartShortcutsFeed.sys.mjs"); + "resource://newtab/lib/SmartShortcutsRanker/RankShortcuts.mjs": typeof import("resource://newtab/lib/SmartShortcutsRanker/RankShortcuts.mjs"); + "resource://newtab/lib/SmartShortcutsRanker/RankShortcutsWorkerClass.mjs": typeof import("resource://newtab/lib/SmartShortcutsRanker/RankShortcutsWorkerClass.mjs"); + "resource://newtab/lib/SmartShortcutsRanker/ThomSample.mjs": typeof import("resource://newtab/lib/SmartShortcutsRanker/ThomSample.mjs"); + "resource://newtab/lib/StartupCacheInit.sys.mjs": typeof import("resource://newtab/lib/StartupCacheInit.sys.mjs"); + "resource://newtab/lib/Store.sys.mjs": typeof import("resource://newtab/lib/Store.sys.mjs"); + "resource://newtab/lib/SystemTickFeed.sys.mjs": typeof import("resource://newtab/lib/SystemTickFeed.sys.mjs"); + "resource://newtab/lib/TelemetryFeed.sys.mjs": typeof import("resource://newtab/lib/TelemetryFeed.sys.mjs"); + "resource://newtab/lib/TopSitesFeed.sys.mjs": typeof import("resource://newtab/lib/TopSitesFeed.sys.mjs"); + "resource://newtab/lib/TopStoriesFeed.sys.mjs": typeof import("resource://newtab/lib/TopStoriesFeed.sys.mjs"); + "resource://newtab/lib/TrendingSearchFeed.sys.mjs": typeof import("resource://newtab/lib/TrendingSearchFeed.sys.mjs"); + "resource://newtab/lib/UTEventReporting.sys.mjs": typeof import("resource://newtab/lib/UTEventReporting.sys.mjs"); + "resource://newtab/lib/Wallpapers/WallpaperFeed.sys.mjs": typeof import("resource://newtab/lib/Wallpapers/WallpaperFeed.sys.mjs"); + "resource://newtab/lib/WeatherFeed.sys.mjs": typeof import("resource://newtab/lib/WeatherFeed.sys.mjs"); + "resource://newtab/lib/Widgets/ListsFeed.sys.mjs": typeof import("resource://newtab/lib/Widgets/ListsFeed.sys.mjs"); + "resource://newtab/lib/Widgets/TimerFeed.sys.mjs": typeof import("resource://newtab/lib/Widgets/TimerFeed.sys.mjs"); + "resource://nimbus/ExperimentAPI.sys.mjs": typeof import("resource://nimbus/ExperimentAPI.sys.mjs"); + "resource://nimbus/FeatureManifest.sys.mjs": typeof import("resource://nimbus/FeatureManifest.sys.mjs"); + "resource://nimbus/FirefoxLabs.sys.mjs": typeof import("resource://nimbus/FirefoxLabs.sys.mjs"); + "resource://nimbus/lib/Enrollments.sys.mjs": typeof import("resource://nimbus/lib/Enrollments.sys.mjs"); + "resource://nimbus/lib/ExperimentManager.sys.mjs": typeof import("resource://nimbus/lib/ExperimentManager.sys.mjs"); + "resource://nimbus/lib/ExperimentStore.sys.mjs": typeof import("resource://nimbus/lib/ExperimentStore.sys.mjs"); + "resource://nimbus/lib/Migrations.sys.mjs": typeof import("resource://nimbus/lib/Migrations.sys.mjs"); + "resource://nimbus/lib/RemoteSettingsExperimentLoader.sys.mjs": typeof import("resource://nimbus/lib/RemoteSettingsExperimentLoader.sys.mjs"); + "resource://nimbus/lib/SharedDataMap.sys.mjs": typeof import("resource://nimbus/lib/SharedDataMap.sys.mjs"); + "resource://nimbus/lib/TargetingContextRecorder.sys.mjs": typeof import("resource://nimbus/lib/TargetingContextRecorder.sys.mjs"); + "resource://nimbus/lib/Telemetry.sys.mjs": typeof import("resource://nimbus/lib/Telemetry.sys.mjs"); + "resource://normandy-content/AboutPages.sys.mjs": typeof import("resource://normandy-content/AboutPages.sys.mjs"); + "resource://normandy/Normandy.sys.mjs": typeof import("resource://normandy/Normandy.sys.mjs"); + "resource://normandy/NormandyMigrations.sys.mjs": typeof import("resource://normandy/NormandyMigrations.sys.mjs"); + "resource://normandy/actions/AddonRollbackAction.sys.mjs": typeof import("resource://normandy/actions/AddonRollbackAction.sys.mjs"); + "resource://normandy/actions/AddonRolloutAction.sys.mjs": typeof import("resource://normandy/actions/AddonRolloutAction.sys.mjs"); + "resource://normandy/actions/BaseAction.sys.mjs": typeof import("resource://normandy/actions/BaseAction.sys.mjs"); + "resource://normandy/actions/BaseStudyAction.sys.mjs": typeof import("resource://normandy/actions/BaseStudyAction.sys.mjs"); + "resource://normandy/actions/BranchedAddonStudyAction.sys.mjs": typeof import("resource://normandy/actions/BranchedAddonStudyAction.sys.mjs"); + "resource://normandy/actions/ConsoleLogAction.sys.mjs": typeof import("resource://normandy/actions/ConsoleLogAction.sys.mjs"); + "resource://normandy/actions/PreferenceExperimentAction.sys.mjs": typeof import("resource://normandy/actions/PreferenceExperimentAction.sys.mjs"); + "resource://normandy/actions/PreferenceRollbackAction.sys.mjs": typeof import("resource://normandy/actions/PreferenceRollbackAction.sys.mjs"); + "resource://normandy/actions/PreferenceRolloutAction.sys.mjs": typeof import("resource://normandy/actions/PreferenceRolloutAction.sys.mjs"); + "resource://normandy/actions/ShowHeartbeatAction.sys.mjs": typeof import("resource://normandy/actions/ShowHeartbeatAction.sys.mjs"); + "resource://normandy/actions/schemas/index.sys.mjs": typeof import("resource://normandy/actions/schemas/index.sys.mjs"); + "resource://normandy/lib/ActionsManager.sys.mjs": typeof import("resource://normandy/lib/ActionsManager.sys.mjs"); + "resource://normandy/lib/AddonRollouts.sys.mjs": typeof import("resource://normandy/lib/AddonRollouts.sys.mjs"); + "resource://normandy/lib/AddonStudies.sys.mjs": typeof import("resource://normandy/lib/AddonStudies.sys.mjs"); + "resource://normandy/lib/CleanupManager.sys.mjs": typeof import("resource://normandy/lib/CleanupManager.sys.mjs"); + "resource://normandy/lib/ClientEnvironment.sys.mjs": typeof import("resource://normandy/lib/ClientEnvironment.sys.mjs"); + "resource://normandy/lib/EventEmitter.sys.mjs": typeof import("resource://normandy/lib/EventEmitter.sys.mjs"); + "resource://normandy/lib/Heartbeat.sys.mjs": typeof import("resource://normandy/lib/Heartbeat.sys.mjs"); + "resource://normandy/lib/LegacyHeartbeat.sys.mjs": typeof import("resource://normandy/lib/LegacyHeartbeat.sys.mjs"); + "resource://normandy/lib/LogManager.sys.mjs": typeof import("resource://normandy/lib/LogManager.sys.mjs"); + "resource://normandy/lib/NormandyAddonManager.sys.mjs": typeof import("resource://normandy/lib/NormandyAddonManager.sys.mjs"); + "resource://normandy/lib/NormandyApi.sys.mjs": typeof import("resource://normandy/lib/NormandyApi.sys.mjs"); + "resource://normandy/lib/NormandyUtils.sys.mjs": typeof import("resource://normandy/lib/NormandyUtils.sys.mjs"); + "resource://normandy/lib/PreferenceExperiments.sys.mjs": typeof import("resource://normandy/lib/PreferenceExperiments.sys.mjs"); + "resource://normandy/lib/PreferenceRollouts.sys.mjs": typeof import("resource://normandy/lib/PreferenceRollouts.sys.mjs"); + "resource://normandy/lib/RecipeRunner.sys.mjs": typeof import("resource://normandy/lib/RecipeRunner.sys.mjs"); + "resource://normandy/lib/ShieldPreferences.sys.mjs": typeof import("resource://normandy/lib/ShieldPreferences.sys.mjs"); + "resource://normandy/lib/Storage.sys.mjs": typeof import("resource://normandy/lib/Storage.sys.mjs"); + "resource://normandy/lib/TelemetryEvents.sys.mjs": typeof import("resource://normandy/lib/TelemetryEvents.sys.mjs"); + "resource://normandy/lib/Uptake.sys.mjs": typeof import("resource://normandy/lib/Uptake.sys.mjs"); + "resource://pdf.js/PdfJs.sys.mjs": typeof import("resource://pdf.js/PdfJs.sys.mjs"); + "resource://pdf.js/PdfJsNetwork.sys.mjs": typeof import("resource://pdf.js/PdfJsNetwork.sys.mjs"); + "resource://pdf.js/PdfJsTelemetry.sys.mjs": typeof import("resource://pdf.js/PdfJsTelemetry.sys.mjs"); + "resource://pdf.js/PdfSandbox.sys.mjs": typeof import("resource://pdf.js/PdfSandbox.sys.mjs"); + "resource://pdf.js/PdfStreamConverter.sys.mjs": typeof import("resource://pdf.js/PdfStreamConverter.sys.mjs"); + "resource://reftest/AsyncSpellCheckTestHelper.sys.mjs": typeof import("resource://reftest/AsyncSpellCheckTestHelper.sys.mjs"); + "resource://reftest/PerTestCoverageUtils.sys.mjs": typeof import("resource://reftest/PerTestCoverageUtils.sys.mjs"); + "resource://reftest/reftest.sys.mjs": typeof import("resource://reftest/reftest.sys.mjs"); + "resource://services-common/async.sys.mjs": typeof import("resource://services-common/async.sys.mjs"); + "resource://services-common/hawkclient.sys.mjs": typeof import("resource://services-common/hawkclient.sys.mjs"); + "resource://services-common/hawkrequest.sys.mjs": typeof import("resource://services-common/hawkrequest.sys.mjs"); + "resource://services-common/kinto-http-client.sys.mjs": typeof import("resource://services-common/kinto-http-client.sys.mjs"); + "resource://services-common/kinto-offline-client.sys.mjs": typeof import("resource://services-common/kinto-offline-client.sys.mjs"); + "resource://services-common/kinto-storage-adapter.sys.mjs": typeof import("resource://services-common/kinto-storage-adapter.sys.mjs"); + "resource://services-common/observers.sys.mjs": typeof import("resource://services-common/observers.sys.mjs"); + "resource://services-common/rest.sys.mjs": typeof import("resource://services-common/rest.sys.mjs"); + "resource://services-common/tokenserverclient.sys.mjs": typeof import("resource://services-common/tokenserverclient.sys.mjs"); + "resource://services-common/uptake-telemetry.sys.mjs": typeof import("resource://services-common/uptake-telemetry.sys.mjs"); + "resource://services-common/utils.sys.mjs": typeof import("resource://services-common/utils.sys.mjs"); + "resource://services-settings/Attachments.sys.mjs": typeof import("resource://services-settings/Attachments.sys.mjs"); + "resource://services-settings/Database.sys.mjs": typeof import("resource://services-settings/Database.sys.mjs"); + "resource://services-settings/IDBHelpers.sys.mjs": typeof import("resource://services-settings/IDBHelpers.sys.mjs"); + "resource://services-settings/RemoteSettingsClient.sys.mjs": typeof import("resource://services-settings/RemoteSettingsClient.sys.mjs"); + "resource://services-settings/RemoteSettingsWorker.sys.mjs": typeof import("resource://services-settings/RemoteSettingsWorker.sys.mjs"); + "resource://services-settings/SharedUtils.sys.mjs": typeof import("resource://services-settings/SharedUtils.sys.mjs"); + "resource://services-settings/SyncHistory.sys.mjs": typeof import("resource://services-settings/SyncHistory.sys.mjs"); + "resource://services-settings/Utils.sys.mjs": typeof import("resource://services-settings/Utils.sys.mjs"); + "resource://services-settings/remote-settings.sys.mjs": typeof import("resource://services-settings/remote-settings.sys.mjs"); + "resource://services-sync/SyncDisconnect.sys.mjs": typeof import("resource://services-sync/SyncDisconnect.sys.mjs"); + "resource://services-sync/SyncedTabs.sys.mjs": typeof import("resource://services-sync/SyncedTabs.sys.mjs"); + "resource://services-sync/TabsStore.sys.mjs": typeof import("resource://services-sync/TabsStore.sys.mjs"); + "resource://services-sync/UIState.sys.mjs": typeof import("resource://services-sync/UIState.sys.mjs"); + "resource://services-sync/addonsreconciler.sys.mjs": typeof import("resource://services-sync/addonsreconciler.sys.mjs"); + "resource://services-sync/addonutils.sys.mjs": typeof import("resource://services-sync/addonutils.sys.mjs"); + "resource://services-sync/bridged_engine.sys.mjs": typeof import("resource://services-sync/bridged_engine.sys.mjs"); + "resource://services-sync/constants.sys.mjs": typeof import("resource://services-sync/constants.sys.mjs"); + "resource://services-sync/doctor.sys.mjs": typeof import("resource://services-sync/doctor.sys.mjs"); + "resource://services-sync/engines.sys.mjs": typeof import("resource://services-sync/engines.sys.mjs"); + "resource://services-sync/engines/addons.sys.mjs": typeof import("resource://services-sync/engines/addons.sys.mjs"); + "resource://services-sync/engines/bookmarks.sys.mjs": typeof import("resource://services-sync/engines/bookmarks.sys.mjs"); + "resource://services-sync/engines/clients.sys.mjs": typeof import("resource://services-sync/engines/clients.sys.mjs"); + "resource://services-sync/engines/extension-storage.sys.mjs": typeof import("resource://services-sync/engines/extension-storage.sys.mjs"); + "resource://services-sync/engines/forms.sys.mjs": typeof import("resource://services-sync/engines/forms.sys.mjs"); + "resource://services-sync/engines/history.sys.mjs": typeof import("resource://services-sync/engines/history.sys.mjs"); + "resource://services-sync/engines/passwords.sys.mjs": typeof import("resource://services-sync/engines/passwords.sys.mjs"); + "resource://services-sync/engines/prefs.sys.mjs": typeof import("resource://services-sync/engines/prefs.sys.mjs"); + "resource://services-sync/engines/tabs.sys.mjs": typeof import("resource://services-sync/engines/tabs.sys.mjs"); + "resource://services-sync/keys.sys.mjs": typeof import("resource://services-sync/keys.sys.mjs"); + "resource://services-sync/main.sys.mjs": typeof import("resource://services-sync/main.sys.mjs"); + "resource://services-sync/policies.sys.mjs": typeof import("resource://services-sync/policies.sys.mjs"); + "resource://services-sync/record.sys.mjs": typeof import("resource://services-sync/record.sys.mjs"); + "resource://services-sync/resource.sys.mjs": typeof import("resource://services-sync/resource.sys.mjs"); + "resource://services-sync/service.sys.mjs": typeof import("resource://services-sync/service.sys.mjs"); + "resource://services-sync/stages/declined.sys.mjs": typeof import("resource://services-sync/stages/declined.sys.mjs"); + "resource://services-sync/stages/enginesync.sys.mjs": typeof import("resource://services-sync/stages/enginesync.sys.mjs"); + "resource://services-sync/status.sys.mjs": typeof import("resource://services-sync/status.sys.mjs"); + "resource://services-sync/sync_auth.sys.mjs": typeof import("resource://services-sync/sync_auth.sys.mjs"); + "resource://services-sync/telemetry.sys.mjs": typeof import("resource://services-sync/telemetry.sys.mjs"); + "resource://services-sync/util.sys.mjs": typeof import("resource://services-sync/util.sys.mjs"); + "resource://specialpowers/AppTestDelegate.sys.mjs": typeof import("resource://specialpowers/AppTestDelegate.sys.mjs"); + "resource://talos-powers/TalosParentProfiler.sys.mjs": typeof import("resource://talos-powers/TalosParentProfiler.sys.mjs"); + "resource://test/AllowJavascriptParent.sys.mjs": typeof import("resource://test/AllowJavascriptParent.sys.mjs"); + "resource://test/Census.sys.mjs": typeof import("resource://test/Census.sys.mjs"); + "resource://test/CrashTestUtils.sys.mjs": typeof import("resource://test/CrashTestUtils.sys.mjs"); + "resource://test/GlobalObjectsModule.sys.mjs": typeof import("resource://test/GlobalObjectsModule.sys.mjs"); + "resource://test/Match.sys.mjs": typeof import("resource://test/Match.sys.mjs"); + "resource://test/TestRunner.sys.mjs": typeof import("resource://test/TestRunner.sys.mjs"); + "resource://test/broadcast_handler.sys.mjs": typeof import("resource://test/broadcast_handler.sys.mjs"); + "resource://test/contextual.sys.mjs": typeof import("resource://test/contextual.sys.mjs"); + "resource://test/es6module.js": typeof import("resource://test/es6module.js"); + "resource://test/es6module_absolute.js": typeof import("resource://test/es6module_absolute.js"); + "resource://test/es6module_absolute2.js": typeof import("resource://test/es6module_absolute2.js"); + "resource://test/es6module_cycle_a.js": typeof import("resource://test/es6module_cycle_a.js"); + "resource://test/es6module_cycle_b.js": typeof import("resource://test/es6module_cycle_b.js"); + "resource://test/es6module_cycle_c.js": typeof import("resource://test/es6module_cycle_c.js"); + "resource://test/es6module_devtoolsLoader.js": typeof import("resource://test/es6module_devtoolsLoader.js"); + "resource://test/es6module_devtoolsLoader_only.js": typeof import("resource://test/es6module_devtoolsLoader_only.js"); + "resource://test/es6module_dynamic_import_runtime_error.js": typeof import("resource://test/es6module_dynamic_import_runtime_error.js"); + "resource://test/es6module_dynamic_import_syntax_error.js": typeof import("resource://test/es6module_dynamic_import_syntax_error.js"); + "resource://test/es6module_import_error.js": typeof import("resource://test/es6module_import_error.js"); + "resource://test/es6module_parse_error.js": typeof import("resource://test/es6module_parse_error.js"); + "resource://test/es6module_parse_error_in_import.js": typeof import("resource://test/es6module_parse_error_in_import.js"); + "resource://test/es6module_throws.js": typeof import("resource://test/es6module_throws.js"); + "resource://test/es6module_top_level_await.js": typeof import("resource://test/es6module_top_level_await.js"); + "resource://test/esm_lazy-1.sys.mjs": typeof import("resource://test/esm_lazy-1.sys.mjs"); + "resource://test/esm_lazy-2.sys.mjs": typeof import("resource://test/esm_lazy-2.sys.mjs"); + "resource://test/esmified-1.sys.mjs": typeof import("resource://test/esmified-1.sys.mjs"); + "resource://test/esmified-3.sys.mjs": typeof import("resource://test/esmified-3.sys.mjs"); + "resource://test/esmified-4.sys.mjs": typeof import("resource://test/esmified-4.sys.mjs"); + "resource://test/import_non_shared_1.mjs": typeof import("resource://test/import_non_shared_1.mjs"); + "resource://test/non_shared_1.mjs": typeof import("resource://test/non_shared_1.mjs"); + "resource://test/non_shared_nest_import_non_shared_1.mjs": typeof import("resource://test/non_shared_nest_import_non_shared_1.mjs"); + "resource://test/non_shared_nest_import_non_shared_2.mjs": typeof import("resource://test/non_shared_nest_import_non_shared_2.mjs"); + "resource://test/non_shared_nest_import_non_shared_3.mjs": typeof import("resource://test/non_shared_nest_import_non_shared_3.mjs"); + "resource://test/non_shared_nest_import_non_shared_target_1.mjs": typeof import("resource://test/non_shared_nest_import_non_shared_target_1.mjs"); + "resource://test/non_shared_nest_import_non_shared_target_2.mjs": typeof import("resource://test/non_shared_nest_import_non_shared_target_2.mjs"); + "resource://test/non_shared_nest_import_non_shared_target_3.mjs": typeof import("resource://test/non_shared_nest_import_non_shared_target_3.mjs"); + "resource://test/non_shared_nest_import_shared_1.mjs": typeof import("resource://test/non_shared_nest_import_shared_1.mjs"); + "resource://test/non_shared_nest_import_shared_target_1.sys.mjs": typeof import("resource://test/non_shared_nest_import_shared_target_1.sys.mjs"); + "resource://test/non_shared_nest_import_shared_target_2.sys.mjs": typeof import("resource://test/non_shared_nest_import_shared_target_2.sys.mjs"); + "resource://test/not_found.mjs": typeof import("resource://test/not_found.mjs"); + "resource://testing-common/AddonTestUtils.sys.mjs": typeof import("resource://testing-common/AddonTestUtils.sys.mjs"); + "resource://testing-common/AllJavascriptTypes.mjs": typeof import("resource://testing-common/AllJavascriptTypes.mjs"); + "resource://testing-common/AppData.sys.mjs": typeof import("resource://testing-common/AppData.sys.mjs"); + "resource://testing-common/AppInfo.sys.mjs": typeof import("resource://testing-common/AppInfo.sys.mjs"); + "resource://testing-common/AppUiTestDelegate.sys.mjs": typeof import("resource://testing-common/AppUiTestDelegate.sys.mjs"); + "resource://testing-common/Assert.sys.mjs": typeof import("resource://testing-common/Assert.sys.mjs"); + "resource://testing-common/AsyncSpellCheckTestHelper.sys.mjs": typeof import("resource://testing-common/AsyncSpellCheckTestHelper.sys.mjs"); + "resource://testing-common/BackgroundTasksTestUtils.sys.mjs": typeof import("resource://testing-common/BackgroundTasksTestUtils.sys.mjs"); + "resource://testing-common/BrowserTestUtils.sys.mjs": typeof import("resource://testing-common/BrowserTestUtils.sys.mjs"); + "resource://testing-common/ContentTask.sys.mjs": typeof import("resource://testing-common/ContentTask.sys.mjs"); + "resource://testing-common/ContentTaskUtils.sys.mjs": typeof import("resource://testing-common/ContentTaskUtils.sys.mjs"); + "resource://testing-common/CookieXPCShellUtils.sys.mjs": typeof import("resource://testing-common/CookieXPCShellUtils.sys.mjs"); + "resource://testing-common/CoverageUtils.sys.mjs": typeof import("resource://testing-common/CoverageUtils.sys.mjs"); + "resource://testing-common/CrashManagerTest.sys.mjs": typeof import("resource://testing-common/CrashManagerTest.sys.mjs"); + "resource://testing-common/CustomizableUITestUtils.sys.mjs": typeof import("resource://testing-common/CustomizableUITestUtils.sys.mjs"); + "resource://testing-common/DOMFullscreenTestUtils.sys.mjs": typeof import("resource://testing-common/DOMFullscreenTestUtils.sys.mjs"); + "resource://testing-common/DoHTestUtils.sys.mjs": typeof import("resource://testing-common/DoHTestUtils.sys.mjs"); + "resource://testing-common/EnterprisePolicyTesting.sys.mjs": typeof import("resource://testing-common/EnterprisePolicyTesting.sys.mjs"); + "resource://testing-common/ExtensionTestCommon.sys.mjs": typeof import("resource://testing-common/ExtensionTestCommon.sys.mjs"); + "resource://testing-common/ExtensionXPCShellUtils.sys.mjs": typeof import("resource://testing-common/ExtensionXPCShellUtils.sys.mjs"); + "resource://testing-common/FileTestUtils.sys.mjs": typeof import("resource://testing-common/FileTestUtils.sys.mjs"); + "resource://testing-common/FirefoxViewTestUtils.sys.mjs": typeof import("resource://testing-common/FirefoxViewTestUtils.sys.mjs"); + "resource://testing-common/FormHistoryTestUtils.sys.mjs": typeof import("resource://testing-common/FormHistoryTestUtils.sys.mjs"); + "resource://testing-common/HandlerServiceTestUtils.sys.mjs": typeof import("resource://testing-common/HandlerServiceTestUtils.sys.mjs"); + "resource://testing-common/InflightAssetsMessageProvider.sys.mjs": typeof import("resource://testing-common/InflightAssetsMessageProvider.sys.mjs"); + "resource://testing-common/JSObjectsTestUtils.sys.mjs": typeof import("resource://testing-common/JSObjectsTestUtils.sys.mjs"); + "resource://testing-common/LangPackMatcherTestUtils.sys.mjs": typeof import("resource://testing-common/LangPackMatcherTestUtils.sys.mjs"); + "resource://testing-common/LoginTestUtils.sys.mjs": typeof import("resource://testing-common/LoginTestUtils.sys.mjs"); + "resource://testing-common/MerinoTestUtils.sys.mjs": typeof import("resource://testing-common/MerinoTestUtils.sys.mjs"); + "resource://testing-common/MessageChannel.sys.mjs": typeof import("resource://testing-common/MessageChannel.sys.mjs"); + "resource://testing-common/MockColorPicker.sys.mjs": typeof import("resource://testing-common/MockColorPicker.sys.mjs"); + "resource://testing-common/MockDocument.sys.mjs": typeof import("resource://testing-common/MockDocument.sys.mjs"); + "resource://testing-common/MockFilePicker.sys.mjs": typeof import("resource://testing-common/MockFilePicker.sys.mjs"); + "resource://testing-common/MockPermissionPrompt.sys.mjs": typeof import("resource://testing-common/MockPermissionPrompt.sys.mjs"); + "resource://testing-common/MockPromptCollection.sys.mjs": typeof import("resource://testing-common/MockPromptCollection.sys.mjs"); + "resource://testing-common/MockRegistrar.sys.mjs": typeof import("resource://testing-common/MockRegistrar.sys.mjs"); + "resource://testing-common/MockRegistry.sys.mjs": typeof import("resource://testing-common/MockRegistry.sys.mjs"); + "resource://testing-common/MockSound.sys.mjs": typeof import("resource://testing-common/MockSound.sys.mjs"); + "resource://testing-common/NimbusRolloutMessageProvider.sys.mjs": typeof import("resource://testing-common/NimbusRolloutMessageProvider.sys.mjs"); + "resource://testing-common/NimbusTestUtils.sys.mjs": typeof import("resource://testing-common/NimbusTestUtils.sys.mjs"); + "resource://testing-common/NodeServer.sys.mjs": typeof import("resource://testing-common/NodeServer.sys.mjs"); + "resource://testing-common/NormandyTestUtils.sys.mjs": typeof import("resource://testing-common/NormandyTestUtils.sys.mjs"); + "resource://testing-common/OSKeyStoreTestUtils.sys.mjs": typeof import("resource://testing-common/OSKeyStoreTestUtils.sys.mjs"); + "resource://testing-common/PerTestCoverageUtils.sys.mjs": typeof import("resource://testing-common/PerTestCoverageUtils.sys.mjs"); + "resource://testing-common/PerfTestHelpers.sys.mjs": typeof import("resource://testing-common/PerfTestHelpers.sys.mjs"); + "resource://testing-common/PermissionTestUtils.sys.mjs": typeof import("resource://testing-common/PermissionTestUtils.sys.mjs"); + "resource://testing-common/PlacesTestUtils.sys.mjs": typeof import("resource://testing-common/PlacesTestUtils.sys.mjs"); + "resource://testing-common/ProfilerTestUtils.sys.mjs": typeof import("resource://testing-common/ProfilerTestUtils.sys.mjs"); + "resource://testing-common/PromiseTestUtils.sys.mjs": typeof import("resource://testing-common/PromiseTestUtils.sys.mjs"); + "resource://testing-common/PromptTestUtils.sys.mjs": typeof import("resource://testing-common/PromptTestUtils.sys.mjs"); + "resource://testing-common/QuickSuggestTestUtils.sys.mjs": typeof import("resource://testing-common/QuickSuggestTestUtils.sys.mjs"); + "resource://testing-common/RegionTestUtils.sys.mjs": typeof import("resource://testing-common/RegionTestUtils.sys.mjs"); + "resource://testing-common/RemoteSettingsServer.sys.mjs": typeof import("resource://testing-common/RemoteSettingsServer.sys.mjs"); + "resource://testing-common/SearchTestUtils.sys.mjs": typeof import("resource://testing-common/SearchTestUtils.sys.mjs"); + "resource://testing-common/SearchUITestUtils.sys.mjs": typeof import("resource://testing-common/SearchUITestUtils.sys.mjs"); + "resource://testing-common/SessionStoreTestUtils.sys.mjs": typeof import("resource://testing-common/SessionStoreTestUtils.sys.mjs"); + "resource://testing-common/Sinon.sys.mjs": typeof import("resource://testing-common/Sinon.sys.mjs"); + "resource://testing-common/SiteDataTestUtils.sys.mjs": typeof import("resource://testing-common/SiteDataTestUtils.sys.mjs"); + "resource://testing-common/SpecialPowersParent.sys.mjs": typeof import("resource://testing-common/SpecialPowersParent.sys.mjs"); + "resource://testing-common/SpecialPowersProcessActor.sys.mjs": typeof import("resource://testing-common/SpecialPowersProcessActor.sys.mjs"); + "resource://testing-common/SpecialPowersSandbox.sys.mjs": typeof import("resource://testing-common/SpecialPowersSandbox.sys.mjs"); + "resource://testing-common/StructuredLog.sys.mjs": typeof import("resource://testing-common/StructuredLog.sys.mjs"); + "resource://testing-common/TabGroupTestUtils.sys.mjs": typeof import("resource://testing-common/TabGroupTestUtils.sys.mjs"); + "resource://testing-common/TelemetryArchiveTesting.sys.mjs": typeof import("resource://testing-common/TelemetryArchiveTesting.sys.mjs"); + "resource://testing-common/TelemetryEnvironmentTesting.sys.mjs": typeof import("resource://testing-common/TelemetryEnvironmentTesting.sys.mjs"); + "resource://testing-common/TelemetryTestUtils.sys.mjs": typeof import("resource://testing-common/TelemetryTestUtils.sys.mjs"); + "resource://testing-common/TestIntegration.sys.mjs": typeof import("resource://testing-common/TestIntegration.sys.mjs"); + "resource://testing-common/TestUtils.sys.mjs": typeof import("resource://testing-common/TestUtils.sys.mjs"); + "resource://testing-common/UrlClassifierTestUtils.sys.mjs": typeof import("resource://testing-common/UrlClassifierTestUtils.sys.mjs"); + "resource://testing-common/UrlbarTestUtils.sys.mjs": typeof import("resource://testing-common/UrlbarTestUtils.sys.mjs"); + "resource://testing-common/VacuumParticipant.sys.mjs": typeof import("resource://testing-common/VacuumParticipant.sys.mjs"); + "resource://testing-common/WrapPrivileged.sys.mjs": typeof import("resource://testing-common/WrapPrivileged.sys.mjs"); + "resource://testing-common/XPCShellContentUtils.sys.mjs": typeof import("resource://testing-common/XPCShellContentUtils.sys.mjs"); + "resource://testing-common/backgroundtasks/BackgroundTask_backgroundtask_specific_pref.sys.mjs": typeof import("resource://testing-common/backgroundtasks/BackgroundTask_backgroundtask_specific_pref.sys.mjs"); + "resource://testing-common/backgroundtasks/BackgroundTask_shouldprocessupdates.sys.mjs": typeof import("resource://testing-common/backgroundtasks/BackgroundTask_shouldprocessupdates.sys.mjs"); + "resource://testing-common/backgroundtasks/BackgroundTask_unique_profile.sys.mjs": typeof import("resource://testing-common/backgroundtasks/BackgroundTask_unique_profile.sys.mjs"); + "resource://testing-common/cookie_filtering_helper.sys.mjs": typeof import("resource://testing-common/cookie_filtering_helper.sys.mjs"); + "resource://testing-common/dom/indexedDB/test/modules/IndexedDBUtils.sys.mjs": typeof import("resource://testing-common/dom/indexedDB/test/modules/IndexedDBUtils.sys.mjs"); + "resource://testing-common/dom/localstorage/test/modules/LocalStorageUtils.sys.mjs": typeof import("resource://testing-common/dom/localstorage/test/modules/LocalStorageUtils.sys.mjs"); + "resource://testing-common/dom/quota/test/modules/FileUtils.sys.mjs": typeof import("resource://testing-common/dom/quota/test/modules/FileUtils.sys.mjs"); + "resource://testing-common/dom/quota/test/modules/ModuleLoader.sys.mjs": typeof import("resource://testing-common/dom/quota/test/modules/ModuleLoader.sys.mjs"); + "resource://testing-common/dom/quota/test/modules/PrefUtils.sys.mjs": typeof import("resource://testing-common/dom/quota/test/modules/PrefUtils.sys.mjs"); + "resource://testing-common/dom/quota/test/modules/PrincipalUtils.sys.mjs": typeof import("resource://testing-common/dom/quota/test/modules/PrincipalUtils.sys.mjs"); + "resource://testing-common/dom/quota/test/modules/ProcessUtils.sys.mjs": typeof import("resource://testing-common/dom/quota/test/modules/ProcessUtils.sys.mjs"); + "resource://testing-common/dom/quota/test/modules/QuotaUtils.sys.mjs": typeof import("resource://testing-common/dom/quota/test/modules/QuotaUtils.sys.mjs"); + "resource://testing-common/dom/quota/test/modules/StorageUtils.sys.mjs": typeof import("resource://testing-common/dom/quota/test/modules/StorageUtils.sys.mjs"); + "resource://testing-common/dom/quota/test/modules/Utils.sys.mjs": typeof import("resource://testing-common/dom/quota/test/modules/Utils.sys.mjs"); + "resource://testing-common/dom/quota/test/modules/WorkerDriver.sys.mjs": typeof import("resource://testing-common/dom/quota/test/modules/WorkerDriver.sys.mjs"); + "resource://testing-common/dom/simpledb/test/modules/SimpleDBUtils.sys.mjs": typeof import("resource://testing-common/dom/simpledb/test/modules/SimpleDBUtils.sys.mjs"); + "resource://testing-common/early_hint_preload_test_helper.sys.mjs": typeof import("resource://testing-common/early_hint_preload_test_helper.sys.mjs"); + "resource://testing-common/httpd.sys.mjs": typeof import("resource://testing-common/httpd.sys.mjs"); + "resource://testing-common/services/common/logging.sys.mjs": typeof import("resource://testing-common/services/common/logging.sys.mjs"); + "resource://testing-common/services/sync/fakeservices.sys.mjs": typeof import("resource://testing-common/services/sync/fakeservices.sys.mjs"); + "resource://testing-common/services/sync/fxa_utils.sys.mjs": typeof import("resource://testing-common/services/sync/fxa_utils.sys.mjs"); + "resource://testing-common/services/sync/rotaryengine.sys.mjs": typeof import("resource://testing-common/services/sync/rotaryengine.sys.mjs"); + "resource://testing-common/services/sync/utils.sys.mjs": typeof import("resource://testing-common/services/sync/utils.sys.mjs"); + "resource://testing-common/simple_unknown_uri_helpers.sys.mjs": typeof import("resource://testing-common/simple_unknown_uri_helpers.sys.mjs"); + "resource://tps/auth/fxaccounts.sys.mjs": typeof import("resource://tps/auth/fxaccounts.sys.mjs"); + "resource://tps/logger.sys.mjs": typeof import("resource://tps/logger.sys.mjs"); + "resource://tps/modules/addons.sys.mjs": typeof import("resource://tps/modules/addons.sys.mjs"); + "resource://tps/modules/bookmarkValidator.sys.mjs": typeof import("resource://tps/modules/bookmarkValidator.sys.mjs"); + "resource://tps/modules/bookmarks.sys.mjs": typeof import("resource://tps/modules/bookmarks.sys.mjs"); + "resource://tps/modules/formautofill.sys.mjs": typeof import("resource://tps/modules/formautofill.sys.mjs"); + "resource://tps/modules/forms.sys.mjs": typeof import("resource://tps/modules/forms.sys.mjs"); + "resource://tps/modules/history.sys.mjs": typeof import("resource://tps/modules/history.sys.mjs"); + "resource://tps/modules/passwords.sys.mjs": typeof import("resource://tps/modules/passwords.sys.mjs"); + "resource://tps/modules/prefs.sys.mjs": typeof import("resource://tps/modules/prefs.sys.mjs"); + "resource://tps/modules/tabs.sys.mjs": typeof import("resource://tps/modules/tabs.sys.mjs"); + "resource://tps/modules/windows.sys.mjs": typeof import("resource://tps/modules/windows.sys.mjs"); + "resource://tps/quit.sys.mjs": typeof import("resource://tps/quit.sys.mjs"); + "resource://tps/tps.sys.mjs": typeof import("resource://tps/tps.sys.mjs"); + "resource://webcompat/AboutCompat.sys.mjs": typeof import("resource://webcompat/AboutCompat.sys.mjs"); } diff --git a/src/zen/@types/lib.gecko.tweaks.d.ts b/src/zen/@types/lib.gecko.tweaks.d.ts index 1169d5521..9e3b512ba 100644 --- a/src/zen/@types/lib.gecko.tweaks.d.ts +++ b/src/zen/@types/lib.gecko.tweaks.d.ts @@ -16,7 +16,7 @@ interface CanonicalBrowsingContext extends LoadContextMixin { } declare namespace ChromeUtils { - type Modules = import('./generated/lib.gecko.modules').Modules; + type Modules = import("./generated/lib.gecko.modules").Modules; function importESModule( aResourceURI: T, @@ -29,15 +29,15 @@ interface ChromeWindow extends Window { } interface Document { - createXULElement(name: 'browser'): MozBrowser; + createXULElement(name: "browser"): MozBrowser; } type nsIGleanPingNoReason = { - [K in keyof nsIGleanPing]: K extends 'submit' ? (_?: never) => void : nsIGleanPing[K]; + [K in keyof nsIGleanPing]: K extends "submit" ? (_?: never) => void : nsIGleanPing[K]; }; type nsIGleanPingWithReason = { - [K in keyof nsIGleanPing]: K extends 'submit' ? (reason: T) => void : nsIGleanPing[K]; + [K in keyof nsIGleanPing]: K extends "submit" ? (reason: T) => void : nsIGleanPing[K]; }; interface MessageListenerManagerMixin { diff --git a/src/zen/@types/zen.d.ts b/src/zen/@types/zen.d.ts index bbfcb5df5..e677a5e55 100644 --- a/src/zen/@types/zen.d.ts +++ b/src/zen/@types/zen.d.ts @@ -18,8 +18,8 @@ /// /// -declare var window: Window; -declare var Components: nsIXPCComponents; +declare let window: Window; +declare let Components: nsIXPCComponents; declare var Cu: nsIXPCComponents_Utils; declare var Ci: nsIXPCComponents_Interfaces; declare var Services: JSServices; @@ -72,10 +72,10 @@ declare namespace MockedExports { * This interface teaches ChromeUtils.importESModule how to find modules. */ interface KnownModules { - Services: typeof import('Services'); - 'resource://gre/modules/AppConstants.sys.mjs': typeof import('resource://gre/modules/AppConstants.sys.mjs'); - 'resource:///modules/CustomizableUI.sys.mjs': typeof import('resource:///modules/CustomizableUI.sys.mjs'); - 'resource:///modules/CustomizableWidgets.sys.mjs': typeof import('resource:///modules/CustomizableWidgets.sys.mjs'); + Services: typeof import("Services"); + "resource://gre/modules/AppConstants.sys.mjs": typeof import("resource://gre/modules/AppConstants.sys.mjs"); + "resource:///modules/CustomizableUI.sys.mjs": typeof import("resource:///modules/CustomizableUI.sys.mjs"); + "resource:///modules/CustomizableWidgets.sys.mjs": typeof import("resource:///modules/CustomizableWidgets.sys.mjs"); } interface ChromeUtils { @@ -166,7 +166,7 @@ declare namespace MockedExports { type PrefObserverFunction = ( aSubject: nsIPrefBranch, - aTopic: 'nsPref:changed', + aTopic: "nsPref:changed", aData: string ) => unknown; type PrefObserver = PrefObserverFunction | { observe: PrefObserverFunction }; @@ -310,7 +310,7 @@ declare namespace MockedExports { } interface Cc { - '@mozilla.org/filepicker;1': { + "@mozilla.org/filepicker;1": { createInstance(instance: nsIFilePicker): FilePicker; }; } @@ -339,17 +339,17 @@ interface PathUtilsInterface { isAbsolute: (path: string) => boolean; } -declare module 'Services' { +declare module "Services" { export = MockedExports.Services; } -declare module 'ChromeUtils' { +declare module "ChromeUtils" { export = ChromeUtils; } -declare var ChromeUtils: MockedExports.ChromeUtils; +declare let ChromeUtils: MockedExports.ChromeUtils; -declare var PathUtils: PathUtilsInterface; +declare let PathUtils: PathUtilsInterface; // These global objects can be used directly in JSM files only. declare var Cu: MockedExports.Cu; @@ -365,7 +365,7 @@ declare interface ChromeDocument extends Document { * Create a XUL element of a specific type. Right now this function * only refines iframes, but more tags could be added. */ - createXULElement: ((type: 'iframe') => XULIframeElement) & ((type: string) => XULElement); + createXULElement: ((type: "iframe") => XULIframeElement) & ((type: string) => XULElement); /** * This is a fluent instance connected to this document. @@ -400,7 +400,7 @@ declare interface Window { browsingContext: MockedExports.BrowsingContext; openWebLinkIn: ( url: string, - where: 'current' | 'tab' | 'tabshifted' | 'window' | 'save', + where: "current" | "tab" | "tabshifted" | "window" | "save", options?: Partial<{ // Not all possible options are present, please add more if/when needed. userContextId: number; @@ -411,7 +411,7 @@ declare interface Window { ) => void; openTrustedLinkIn: ( url: string, - where: 'current' | 'tab' | 'tabshifted' | 'window' | 'save', + where: "current" | "tab" | "tabshifted" | "window" | "save", options?: Partial<{ // Not all possible options are present, please add more if/when needed. userContextId: number; @@ -435,12 +435,12 @@ declare interface XULCommandEvent extends Event { declare interface XULElementWithCommandHandler { addEventListener: ( - type: 'command', + type: "command", handler: (event: XULCommandEvent) => void, isCapture?: boolean ) => void; removeEventListener: ( - type: 'command', + type: "command", handler: (event: XULCommandEvent) => void, isCapture?: boolean ) => void; diff --git a/src/zen/common/ZenPreloadedScripts.js b/src/zen/common/ZenPreloadedScripts.js index fde326ff0..92ef4f65f 100644 --- a/src/zen/common/ZenPreloadedScripts.js +++ b/src/zen/common/ZenPreloadedScripts.js @@ -3,7 +3,7 @@ // file, You can obtain one at http://mozilla.org/MPL/2.0/. // prettier-ignore - +// eslint-disable-next-line no-lone-blocks { Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenWorkspaceBookmarksStorage.js", this); diff --git a/src/zen/common/emojis/ZenEmojiPicker.mjs b/src/zen/common/emojis/ZenEmojiPicker.mjs index 35e888209..bdbf02f8c 100644 --- a/src/zen/common/emojis/ZenEmojiPicker.mjs +++ b/src/zen/common/emojis/ZenEmojiPicker.mjs @@ -2,7 +2,7 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -import { nsZenDOMOperatedFeature } from 'chrome://browser/content/zen-components/ZenCommonUtils.mjs'; +import { nsZenDOMOperatedFeature } from "chrome://browser/content/zen-components/ZenCommonUtils.mjs"; // prettier-ignore const SVG_ICONS = [ @@ -41,31 +41,31 @@ class nsZenEmojiPicker extends nsZenDOMOperatedFeature { #currentPromiseReject = null; init() { - this.#panel = document.getElementById('PanelUI-zen-emojis-picker'); - this.#panel.addEventListener('popupshowing', this); - this.#panel.addEventListener('popuphidden', this); - this.#panel.addEventListener('command', this); - this.searchInput.addEventListener('input', this); + this.#panel = document.getElementById("PanelUI-zen-emojis-picker"); + this.#panel.addEventListener("popupshowing", this); + this.#panel.addEventListener("popuphidden", this); + this.#panel.addEventListener("command", this); + this.searchInput.addEventListener("input", this); } handleEvent(event) { switch (event.type) { - case 'popupshowing': + case "popupshowing": this.#onPopupShowing(event); break; - case 'popuphidden': + case "popuphidden": this.#onPopupHidden(event); break; - case 'command': - if (event.target.id === 'PanelUI-zen-emojis-picker-none') { + case "command": + if (event.target.id === "PanelUI-zen-emojis-picker-none") { this.#selectEmoji(null); - } else if (event.target.id === 'PanelUI-zen-emojis-picker-change-emojis') { + } else if (event.target.id === "PanelUI-zen-emojis-picker-change-emojis") { this.#changePage(false); - } else if (event.target.id === 'PanelUI-zen-emojis-picker-change-svg') { + } else if (event.target.id === "PanelUI-zen-emojis-picker-change-svg") { this.#changePage(true); } break; - case 'input': + case "input": this.#onSearchInput(event); break; } @@ -77,42 +77,43 @@ class nsZenEmojiPicker extends nsZenDOMOperatedFeature { } const lazy = {}; Services.scriptloader.loadSubScript( - 'chrome://browser/content/zen-components/ZenEmojisData.min.mjs', + "chrome://browser/content/zen-components/ZenEmojisData.min.mjs", lazy ); + /* eslint-disable mozilla/valid-lazy */ this._emojis = lazy.ZenEmojisData; return this._emojis; } get emojiList() { - return document.getElementById('PanelUI-zen-emojis-picker-list'); + return document.getElementById("PanelUI-zen-emojis-picker-list"); } get svgList() { - return document.getElementById('PanelUI-zen-emojis-picker-svgs'); + return document.getElementById("PanelUI-zen-emojis-picker-svgs"); } get searchInput() { - return document.getElementById('PanelUI-zen-emojis-picker-search'); + return document.getElementById("PanelUI-zen-emojis-picker-search"); } #changePage(toSvg = false) { const itemToScroll = toSvg ? this.svgList - : document.getElementById('PanelUI-zen-emojis-picker-pages').querySelector('[emojis="true"]'); + : document.getElementById("PanelUI-zen-emojis-picker-pages").querySelector('[emojis="true"]'); itemToScroll.scrollIntoView({ - behavior: 'smooth', - block: 'nearest', - inline: 'start', + behavior: "smooth", + block: "nearest", + inline: "start", }); const button = document.getElementById( - `PanelUI-zen-emojis-picker-change-${toSvg ? 'svg' : 'emojis'}` + `PanelUI-zen-emojis-picker-change-${toSvg ? "svg" : "emojis"}` ); const otherButton = document.getElementById( - `PanelUI-zen-emojis-picker-change-${toSvg ? 'emojis' : 'svg'}` + `PanelUI-zen-emojis-picker-change-${toSvg ? "emojis" : "svg"}` ); - button.classList.add('selected'); - otherButton.classList.remove('selected'); + button.classList.add("selected"); + otherButton.classList.remove("selected"); } #clearEmojis() { @@ -129,7 +130,7 @@ class nsZenEmojiPicker extends nsZenDOMOperatedFeature { }) .sort((a, b) => a.order - b.order); for (const button of this.emojiList.children) { - const buttonEmoji = button.getAttribute('label'); + const buttonEmoji = button.getAttribute("label"); const emojiObject = filteredEmojis.find((emoji) => emoji.emoji === buttonEmoji); if (emojiObject) { button.hidden = !emojiObject.tags.some((tag) => tag.toLowerCase().includes(value)); @@ -142,17 +143,19 @@ class nsZenEmojiPicker extends nsZenDOMOperatedFeature { // note: It's async on purpose so we can render the popup before processing the emojis async #onPopupShowing(event) { - if (event.target !== this.#panel) return; - this.searchInput.value = ''; - const allowEmojis = !this.#panel.hasAttribute('only-svg-icons'); + if (event.target !== this.#panel) { + return; + } + this.searchInput.value = ""; + const allowEmojis = !this.#panel.hasAttribute("only-svg-icons"); if (allowEmojis) { const emojiList = this.emojiList; for (const emoji of this.#emojis) { - const item = document.createXULElement('toolbarbutton'); - item.className = 'toolbarbutton-1 zen-emojis-picker-emoji'; - item.setAttribute('label', emoji.emoji); - item.setAttribute('tooltiptext', ''); - item.addEventListener('command', () => { + const item = document.createXULElement("toolbarbutton"); + item.className = "toolbarbutton-1 zen-emojis-picker-emoji"; + item.setAttribute("label", emoji.emoji); + item.setAttribute("tooltiptext", ""); + item.addEventListener("command", () => { this.#selectEmoji(emoji.emoji); }); emojiList.appendChild(item); @@ -163,13 +166,13 @@ class nsZenEmojiPicker extends nsZenDOMOperatedFeature { } const svgList = this.svgList; for (const icon of SVG_ICONS) { - const item = document.createXULElement('toolbarbutton'); - item.className = 'toolbarbutton-1 zen-emojis-picker-svg'; - item.setAttribute('label', icon); - item.setAttribute('tooltiptext', ''); + const item = document.createXULElement("toolbarbutton"); + item.className = "toolbarbutton-1 zen-emojis-picker-svg"; + item.setAttribute("label", icon); + item.setAttribute("tooltiptext", ""); item.style.listStyleImage = `url(${this.getSVGURL(icon)})`; - item.setAttribute('icon', icon); - item.addEventListener('command', () => { + item.setAttribute("icon", icon); + item.addEventListener("command", () => { this.#selectEmoji(this.getSVGURL(icon)); }); svgList.appendChild(item); @@ -177,31 +180,33 @@ class nsZenEmojiPicker extends nsZenDOMOperatedFeature { } #onPopupHidden(event) { - if (event.target !== this.#panel) return; + if (event.target !== this.#panel) { + return; + } this.#clearEmojis(); this.#changePage(false); const emojiList = this.emojiList; - emojiList.innerHTML = ''; + emojiList.innerHTML = ""; - this.svgList.innerHTML = ''; + this.svgList.innerHTML = ""; if (this.#currentPromiseReject) { - this.#currentPromiseReject(new Error('Emoji picker closed without selection')); + this.#currentPromiseReject(new Error("Emoji picker closed without selection")); } this.#currentPromise = null; this.#currentPromiseResolve = null; this.#currentPromiseReject = null; - this.#anchor.removeAttribute('zen-emoji-open'); - this.#anchor.parentElement.removeAttribute('zen-emoji-open'); + this.#anchor.removeAttribute("zen-emoji-open"); + this.#anchor.parentElement.removeAttribute("zen-emoji-open"); this.#anchor = null; } #selectEmoji(emoji) { - if (this.#emojiAsSVG && emoji && !emoji.startsWith('chrome://')) { + if (this.#emojiAsSVG && emoji && !emoji.startsWith("chrome://")) { emoji = `data:image/svg+xml;base64,${btoa( `${unescape( encodeURIComponent(emoji) @@ -222,14 +227,14 @@ class nsZenEmojiPicker extends nsZenDOMOperatedFeature { this.#currentPromiseReject = reject; }); this.#anchor = anchor; - this.#anchor.setAttribute('zen-emoji-open', 'true'); - this.#anchor.parentElement.setAttribute('zen-emoji-open', 'true'); + this.#anchor.setAttribute("zen-emoji-open", "true"); + this.#anchor.parentElement.setAttribute("zen-emoji-open", "true"); if (onlySvgIcons) { - this.#panel.setAttribute('only-svg-icons', 'true'); + this.#panel.setAttribute("only-svg-icons", "true"); } else { - this.#panel.removeAttribute('only-svg-icons'); + this.#panel.removeAttribute("only-svg-icons"); } - this.#panel.openPopup(anchor, 'after_start', 0, 0, false, false); + this.#panel.openPopup(anchor, "after_start", 0, 0, false, false); return this.#currentPromise; } diff --git a/src/zen/common/emojis/ZenEmojisData.min.mjs b/src/zen/common/emojis/ZenEmojisData.min.mjs index 580b2c0c6..21fff5121 100644 --- a/src/zen/common/emojis/ZenEmojisData.min.mjs +++ b/src/zen/common/emojis/ZenEmojisData.min.mjs @@ -1,2 +1,2 @@ -/* eslint-disable no-unused-vars */ +/* eslint-disable no-unused-vars */ var ZenEmojisData = [{"tags": ["cheerful", "cheery", "face", "grin", "grinning", "happy", "laugh", "nice", "smile", "smiling", "teeth"], "order": 1, "emoji": "😀"}, {"tags": ["awesome", "big", "eyes", "face", "grin", "grinning", "happy", "mouth", "open", "smile", "smiling", "teeth", "yay"], "order": 2, "emoji": "😃"}, {"tags": ["eye", "eyes", "face", "grin", "grinning", "happy", "laugh", "lol", "mouth", "open", "smile", "smiling"], "order": 3, "emoji": "😄"}, {"tags": ["beaming", "eye", "eyes", "face", "grin", "grinning", "happy", "nice", "smile", "smiling", "teeth"], "order": 4, "emoji": "😁"}, {"tags": ["closed", "eyes", "face", "grinning", "haha", "hahaha", "happy", "laugh", "lol", "mouth", "open", "rofl", "smile", "smiling", "squinting"], "order": 5, "emoji": "😆"}, {"tags": ["cold", "dejected", "excited", "face", "grinning", "mouth", "nervous", "open", "smile", "smiling", "stress", "stressed", "sweat"], "order": 6, "emoji": "😅"}, {"tags": ["crying", "face", "floor", "funny", "haha", "happy", "hehe", "hilarious", "joy", "laugh", "lmao", "lol", "rofl", "roflmao", "rolling", "tear"], "order": 7, "emoji": "🤣"}, {"tags": ["crying", "face", "feels", "funny", "haha", "happy", "hehe", "hilarious", "joy", "laugh", "lmao", "lol", "rofl", "roflmao", "tear"], "order": 8, "emoji": "😂"}, {"tags": ["face", "happy", "slightly", "smile", "smiling"], "order": 9, "emoji": "🙂"}, {"tags": ["face", "hehe", "smile", "upside-down"], "order": 10, "emoji": "🙃"}, {"tags": ["disappear", "dissolve", "embarrassed", "face", "haha", "heat", "hot", "liquid", "lol", "melt", "melting", "sarcasm", "sarcastic"], "order": 11, "emoji": "🫠"}, {"tags": ["face", "flirt", "heartbreaker", "sexy", "slide", "tease", "wink", "winking", "winks"], "order": 12, "emoji": "😉"}, {"tags": ["blush", "eye", "eyes", "face", "glad", "satisfied", "smile", "smiling"], "order": 13, "emoji": "😊"}, {"tags": ["angel", "angelic", "angels", "blessed", "face", "fairy", "fairytale", "fantasy", "halo", "happy", "innocent", "peaceful", "smile", "smiling", "spirit", "tale"], "order": 14, "emoji": "😇"}, {"tags": ["3", "adore", "crush", "face", "heart", "hearts", "ily", "love", "romance", "smile", "smiling", "you"], "order": 15, "emoji": "🥰"}, {"tags": ["143", "bae", "eye", "face", "feels", "heart-eyes", "hearts", "ily", "kisses", "love", "romance", "romantic", "smile", "xoxo"], "order": 16, "emoji": "😍"}, {"tags": ["excited", "eyes", "face", "grinning", "smile", "star", "starry-eyed", "wow"], "order": 17, "emoji": "🤩"}, {"tags": ["adorbs", "bae", "blowing", "face", "flirt", "heart", "ily", "kiss", "love", "lover", "miss", "muah", "romantic", "smooch", "xoxo", "you"], "order": 18, "emoji": "😘"}, {"tags": ["143", "date", "dating", "face", "flirt", "ily", "kiss", "love", "smooch", "smooches", "xoxo", "you"], "order": 19, "emoji": "😗"}, {"tags": ["face", "happy", "outlined", "relaxed", "smile", "smiling"], "order": 21, "emoji": "☺️"}, {"tags": ["143", "bae", "blush", "closed", "date", "dating", "eye", "eyes", "face", "flirt", "ily", "kisses", "kissing", "smooches", "xoxo"], "order": 22, "emoji": "😚"}, {"tags": ["143", "closed", "date", "dating", "eye", "eyes", "face", "flirt", "ily", "kiss", "kisses", "kissing", "love", "night", "smile", "smiling"], "order": 23, "emoji": "😙"}, {"tags": ["face", "glad", "grateful", "happy", "joy", "pain", "proud", "relieved", "smile", "smiley", "smiling", "tear", "touched"], "order": 24, "emoji": "🥲"}, {"tags": ["delicious", "eat", "face", "food", "full", "hungry", "savor", "smile", "smiling", "tasty", "um", "yum", "yummy"], "order": 25, "emoji": "😋"}, {"tags": ["awesome", "cool", "face", "nice", "party", "stuck-out", "sweet", "tongue"], "order": 26, "emoji": "😛"}, {"tags": ["crazy", "epic", "eye", "face", "funny", "joke", "loopy", "nutty", "party", "stuck-out", "tongue", "wacky", "weirdo", "wink", "winking", "yolo"], "order": 27, "emoji": "😜"}, {"tags": ["crazy", "eye", "eyes", "face", "goofy", "large", "small", "zany"], "order": 28, "emoji": "🤪"}, {"tags": ["closed", "eye", "eyes", "face", "gross", "horrible", "omg", "squinting", "stuck-out", "taste", "tongue", "whatever", "yolo"], "order": 29, "emoji": "😝"}, {"tags": ["face", "money", "money-mouth", "mouth", "paid"], "order": 30, "emoji": "🤑"}, {"tags": ["face", "hands", "hug", "hugging", "open", "smiling"], "order": 31, "emoji": "🤗"}, {"tags": ["face", "giggle", "giggling", "hand", "mouth", "oops", "realization", "secret", "shock", "sudden", "surprise", "whoops"], "order": 32, "emoji": "🤭"}, {"tags": ["amazement", "awe", "disbelief", "embarrass", "eyes", "face", "gasp", "hand", "mouth", "omg", "open", "over", "quiet", "scared", "shock", "surprise"], "order": 33, "emoji": "🫢"}, {"tags": ["captivated", "embarrass", "eye", "face", "hide", "hiding", "peek", "peeking", "peep", "scared", "shy", "stare"], "order": 34, "emoji": "🫣"}, {"tags": ["face", "quiet", "shh", "shush", "shushing"], "order": 35, "emoji": "🤫"}, {"tags": ["chin", "consider", "face", "hmm", "ponder", "pondering", "thinking", "wondering"], "order": 36, "emoji": "🤔"}, {"tags": ["face", "good", "luck", "ma’am", "ok", "respect", "salute", "saluting", "sir", "troops", "yes"], "order": 37, "emoji": "🫡"}, {"tags": ["face", "keep", "mouth", "quiet", "secret", "shut", "zip", "zipper", "zipper-mouth"], "order": 38, "emoji": "🤐"}, {"tags": ["disapproval", "disbelief", "distrust", "emoji", "eyebrow", "face", "hmm", "mild", "raised", "skeptic", "skeptical", "skepticism", "surprise", "what"], "order": 39, "emoji": "🤨"}, {"tags": ["awkward", "blank", "deadpan", "expressionless", "face", "fine", "jealous", "meh", "neutral", "oh", "shade", "straight", "unamused", "unhappy", "unimpressed", "whatever"], "order": 40, "emoji": "😐️"}, {"tags": ["awkward", "dead", "expressionless", "face", "fine", "inexpressive", "jealous", "meh", "not", "oh", "omg", "straight", "uh", "unhappy", "unimpressed", "whatever"], "order": 41, "emoji": "😑"}, {"tags": ["awkward", "blank", "expressionless", "face", "mouth", "mouthless", "mute", "quiet", "secret", "silence", "silent", "speechless"], "order": 42, "emoji": "😶"}, {"tags": ["depressed", "disappear", "dotted", "face", "hidden", "hide", "introvert", "invisible", "line", "meh", "whatever", "wtv"], "order": 43, "emoji": "🫥"}, {"tags": ["absentminded", "clouds", "face", "fog", "head"], "order": 44, "emoji": "😶‍🌫️"}, {"tags": ["boss", "dapper", "face", "flirt", "homie", "kidding", "leer", "shade", "slick", "sly", "smirk", "smug", "snicker", "suave", "suspicious", "swag"], "order": 46, "emoji": "😏"}, {"tags": ["...", "bored", "face", "fine", "jealous", "jel", "jelly", "pissed", "smh", "ugh", "uhh", "unamused", "unhappy", "weird", "whatever"], "order": 47, "emoji": "😒"}, {"tags": ["eyeroll", "eyes", "face", "rolling", "shade", "ugh", "whatever"], "order": 48, "emoji": "🙄"}, {"tags": ["awk", "awkward", "dentist", "face", "grimace", "grimacing", "grinning", "smile", "smiling"], "order": 49, "emoji": "😬"}, {"tags": ["blow", "blowing", "exhale", "exhaling", "exhausted", "face", "gasp", "groan", "relief", "sigh", "smiley", "smoke", "whisper", "whistle"], "order": 50, "emoji": "😮‍💨"}, {"tags": ["face", "liar", "lie", "lying", "pinocchio"], "order": 51, "emoji": "🤥"}, {"tags": ["crazy", "daze", "earthquake", "face", "omg", "panic", "shaking", "shock", "surprise", "vibrate", "whoa", "wow"], "order": 52, "emoji": "🫨"}, {"tags": ["head", "horizontally", "no", "shake", "shaking"], "order": 53, "emoji": "🙂‍↔️"}, {"tags": ["head", "nod", "shaking", "vertically", "yes"], "order": 55, "emoji": "🙂‍↕️"}, {"tags": ["calm", "face", "peace", "relief", "relieved", "zen"], "order": 57, "emoji": "😌"}, {"tags": ["awful", "bored", "dejected", "died", "disappointed", "face", "losing", "lost", "pensive", "sad", "sucks"], "order": 58, "emoji": "😔"}, {"tags": ["crying", "face", "good", "night", "sad", "sleep", "sleeping", "sleepy", "tired"], "order": 59, "emoji": "😪"}, {"tags": ["drooling", "face"], "order": 60, "emoji": "🤤"}, {"tags": ["bed", "bedtime", "face", "good", "goodnight", "nap", "night", "sleep", "sleeping", "tired", "whatever", "yawn", "zzz"], "order": 61, "emoji": "😴"}, {"tags": ["bags", "bored", "exhausted", "eyes", "face", "fatigued", "late", "sleepy", "tired", "weary"], "order": 62, "emoji": "🫩"}, {"tags": ["cold", "dentist", "dermatologist", "doctor", "dr", "face", "germs", "mask", "medical", "medicine", "sick"], "order": 63, "emoji": "😷"}, {"tags": ["face", "ill", "sick", "thermometer"], "order": 64, "emoji": "🤒"}, {"tags": ["bandage", "face", "head-bandage", "hurt", "injury", "ouch"], "order": 65, "emoji": "🤕"}, {"tags": ["face", "gross", "nasty", "nauseated", "sick", "vomit"], "order": 66, "emoji": "🤢"}, {"tags": ["barf", "ew", "face", "gross", "puke", "sick", "spew", "throw", "up", "vomit", "vomiting"], "order": 67, "emoji": "🤮"}, {"tags": ["face", "fever", "flu", "gesundheit", "sick", "sneeze", "sneezing"], "order": 68, "emoji": "🤧"}, {"tags": ["dying", "face", "feverish", "heat", "hot", "panting", "red-faced", "stroke", "sweating", "tongue"], "order": 69, "emoji": "🥵"}, {"tags": ["blue", "blue-faced", "cold", "face", "freezing", "frostbite", "icicles", "subzero", "teeth"], "order": 70, "emoji": "🥶"}, {"tags": ["dizzy", "drunk", "eyes", "face", "intoxicated", "mouth", "tipsy", "uneven", "wavy", "woozy"], "order": 71, "emoji": "🥴"}, {"tags": ["crossed-out", "dead", "dizzy", "eyes", "face", "feels", "knocked", "out", "sick", "tired"], "order": 72, "emoji": "😵"}, {"tags": ["confused", "dizzy", "eyes", "face", "hypnotized", "omg", "smiley", "spiral", "trouble", "whoa", "woah", "woozy"], "order": 73, "emoji": "😵‍💫"}, {"tags": ["blown", "explode", "exploding", "head", "mind", "mindblown", "no", "shocked", "way"], "order": 74, "emoji": "🤯"}, {"tags": ["cowboy", "cowgirl", "face", "hat"], "order": 75, "emoji": "🤠"}, {"tags": ["bday", "birthday", "celebrate", "celebration", "excited", "face", "happy", "hat", "hooray", "horn", "party", "partying"], "order": 76, "emoji": "🥳"}, {"tags": ["disguise", "eyebrow", "face", "glasses", "incognito", "moustache", "mustache", "nose", "person", "spy", "tache", "tash"], "order": 77, "emoji": "🥸"}, {"tags": ["awesome", "beach", "bright", "bro", "chilling", "cool", "face", "rad", "relaxed", "shades", "slay", "smile", "style", "sunglasses", "swag", "win"], "order": 78, "emoji": "😎"}, {"tags": ["brainy", "clever", "expert", "face", "geek", "gifted", "glasses", "intelligent", "nerd", "smart"], "order": 79, "emoji": "🤓"}, {"tags": ["classy", "face", "fancy", "monocle", "rich", "stuffy", "wealthy"], "order": 80, "emoji": "🧐"}, {"tags": ["befuddled", "confused", "confusing", "dunno", "face", "frown", "hm", "meh", "not", "sad", "sorry", "sure"], "order": 81, "emoji": "😕"}, {"tags": ["confused", "confusion", "diagonal", "disappointed", "doubt", "doubtful", "face", "frustrated", "frustration", "meh", "mouth", "skeptical", "unsure", "whatever", "wtv"], "order": 82, "emoji": "🫤"}, {"tags": ["anxious", "butterflies", "face", "nerves", "nervous", "sad", "stress", "stressed", "surprised", "worried", "worry"], "order": 83, "emoji": "😟"}, {"tags": ["face", "frown", "frowning", "sad", "slightly"], "order": 84, "emoji": "🙁"}, {"tags": ["face", "frown", "frowning", "sad"], "order": 86, "emoji": "☹️"}, {"tags": ["believe", "face", "forgot", "mouth", "omg", "open", "shocked", "surprised", "sympathy", "unbelievable", "unreal", "whoa", "wow", "you"], "order": 87, "emoji": "😮"}, {"tags": ["epic", "face", "hushed", "omg", "stunned", "surprised", "whoa", "woah"], "order": 88, "emoji": "😯"}, {"tags": ["astonished", "cost", "face", "no", "omg", "shocked", "totally", "way"], "order": 89, "emoji": "😲"}, {"tags": ["amazed", "awkward", "crazy", "dazed", "dead", "disbelief", "embarrassed", "face", "flushed", "geez", "heat", "hot", "impressed", "jeez", "what", "wow"], "order": 90, "emoji": "😳"}, {"tags": ["begging", "big", "eyes", "face", "mercy", "not", "pleading", "please", "pretty", "puppy", "sad", "why"], "order": 91, "emoji": "🥺"}, {"tags": ["admiration", "aww", "back", "cry", "embarrassed", "face", "feelings", "grateful", "gratitude", "holding", "joy", "please", "proud", "resist", "sad", "tears"], "order": 92, "emoji": "🥹"}, {"tags": ["caught", "face", "frown", "frowning", "guard", "mouth", "open", "scared", "scary", "surprise", "what", "wow"], "order": 93, "emoji": "😦"}, {"tags": ["anguished", "face", "forgot", "scared", "scary", "stressed", "surprise", "unhappy", "what", "wow"], "order": 94, "emoji": "😧"}, {"tags": ["afraid", "anxious", "blame", "face", "fear", "fearful", "scared", "worried"], "order": 95, "emoji": "😨"}, {"tags": ["anxious", "blue", "cold", "eek", "face", "mouth", "nervous", "open", "rushed", "scared", "sweat", "yikes"], "order": 96, "emoji": "😰"}, {"tags": ["anxious", "call", "close", "complicated", "disappointed", "face", "not", "relieved", "sad", "sweat", "time", "whew"], "order": 97, "emoji": "😥"}, {"tags": ["awful", "cry", "crying", "face", "feels", "miss", "sad", "tear", "triste", "unhappy"], "order": 98, "emoji": "😢"}, {"tags": ["bawling", "cry", "crying", "face", "loudly", "sad", "sob", "tear", "tears", "unhappy"], "order": 99, "emoji": "😭"}, {"tags": ["epic", "face", "fear", "fearful", "munch", "scared", "scream", "screamer", "screaming", "shocked", "surprised", "woah"], "order": 100, "emoji": "😱"}, {"tags": ["annoyed", "confounded", "confused", "cringe", "distraught", "face", "feels", "frustrated", "mad", "sad"], "order": 101, "emoji": "😖"}, {"tags": ["concentrate", "concentration", "face", "focus", "headache", "persevere", "persevering"], "order": 102, "emoji": "😣"}, {"tags": ["awful", "blame", "dejected", "disappointed", "face", "fail", "losing", "sad", "unhappy"], "order": 103, "emoji": "😞"}, {"tags": ["close", "cold", "downcast", "face", "feels", "headache", "nervous", "sad", "scared", "sweat", "yikes"], "order": 104, "emoji": "😓"}, {"tags": ["crying", "face", "fail", "feels", "hungry", "mad", "nooo", "sad", "sleepy", "tired", "unhappy", "weary"], "order": 105, "emoji": "😩"}, {"tags": ["cost", "face", "feels", "nap", "sad", "sneeze", "tired"], "order": 106, "emoji": "😫"}, {"tags": ["bedtime", "bored", "face", "goodnight", "nap", "night", "sleep", "sleepy", "tired", "whatever", "yawn", "yawning", "zzz"], "order": 107, "emoji": "🥱"}, {"tags": ["anger", "angry", "face", "feels", "fume", "fuming", "furious", "fury", "mad", "nose", "steam", "triumph", "unhappy", "won"], "order": 108, "emoji": "😤"}, {"tags": ["anger", "angry", "enraged", "face", "feels", "mad", "maddening", "pouting", "rage", "red", "shade", "unhappy", "upset"], "order": 109, "emoji": "😡"}, {"tags": ["anger", "angry", "blame", "face", "feels", "frustrated", "mad", "maddening", "rage", "shade", "unhappy", "upset"], "order": 110, "emoji": "😠"}, {"tags": ["censor", "cursing", "cussing", "face", "mad", "mouth", "pissed", "swearing", "symbols"], "order": 111, "emoji": "🤬"}, {"tags": ["demon", "devil", "evil", "face", "fairy", "fairytale", "fantasy", "horns", "purple", "shade", "smile", "smiling", "tale"], "order": 112, "emoji": "😈"}, {"tags": ["angry", "demon", "devil", "evil", "face", "fairy", "fairytale", "fantasy", "horns", "imp", "mischievous", "purple", "shade", "tale"], "order": 113, "emoji": "👿"}, {"tags": ["body", "dead", "death", "face", "fairy", "fairytale", "i’m", "lmao", "monster", "tale", "yolo"], "order": 114, "emoji": "💀"}, {"tags": ["bone", "crossbones", "dead", "death", "face", "monster", "skull"], "order": 116, "emoji": "☠️"}, {"tags": ["bs", "comic", "doo", "dung", "face", "fml", "monster", "pile", "poo", "poop", "smelly", "smh", "stink", "stinks", "stinky", "turd"], "order": 117, "emoji": "💩"}, {"tags": ["clown", "face"], "order": 118, "emoji": "🤡"}, {"tags": ["creature", "devil", "face", "fairy", "fairytale", "fantasy", "mask", "monster", "scary", "tale"], "order": 119, "emoji": "👹"}, {"tags": ["angry", "creature", "face", "fairy", "fairytale", "fantasy", "mask", "mean", "monster", "tale"], "order": 120, "emoji": "👺"}, {"tags": ["boo", "creature", "excited", "face", "fairy", "fairytale", "fantasy", "halloween", "haunting", "monster", "scary", "silly", "tale"], "order": 121, "emoji": "👻"}, {"tags": ["creature", "extraterrestrial", "face", "fairy", "fairytale", "fantasy", "monster", "space", "tale", "ufo"], "order": 122, "emoji": "👽️"}, {"tags": ["alien", "creature", "extraterrestrial", "face", "fairy", "fairytale", "fantasy", "game", "gamer", "games", "monster", "pixelated", "space", "tale", "ufo"], "order": 123, "emoji": "👾"}, {"tags": ["face", "monster"], "order": 124, "emoji": "🤖"}, {"tags": ["animal", "cat", "face", "grinning", "mouth", "open", "smile", "smiling"], "order": 125, "emoji": "😺"}, {"tags": ["animal", "cat", "eye", "eyes", "face", "grin", "grinning", "smile", "smiling"], "order": 126, "emoji": "😸"}, {"tags": ["animal", "cat", "face", "joy", "laugh", "laughing", "lol", "tear", "tears"], "order": 127, "emoji": "😹"}, {"tags": ["animal", "cat", "eye", "face", "heart", "heart-eyes", "love", "smile", "smiling"], "order": 128, "emoji": "😻"}, {"tags": ["animal", "cat", "face", "ironic", "smile", "wry"], "order": 129, "emoji": "😼"}, {"tags": ["animal", "cat", "closed", "eye", "eyes", "face", "kiss", "kissing"], "order": 130, "emoji": "😽"}, {"tags": ["animal", "cat", "face", "oh", "surprised", "weary"], "order": 131, "emoji": "🙀"}, {"tags": ["animal", "cat", "cry", "crying", "face", "sad", "tear"], "order": 132, "emoji": "😿"}, {"tags": ["animal", "cat", "face", "pouting"], "order": 133, "emoji": "😾"}, {"tags": ["embarrassed", "evil", "face", "forbidden", "forgot", "gesture", "hide", "monkey", "no", "omg", "prohibited", "scared", "secret", "smh", "watch"], "order": 134, "emoji": "🙈"}, {"tags": ["animal", "ears", "evil", "face", "forbidden", "gesture", "hear", "listen", "monkey", "no", "not", "prohibited", "secret", "shh", "tmi"], "order": 135, "emoji": "🙉"}, {"tags": ["animal", "evil", "face", "forbidden", "gesture", "monkey", "no", "not", "oops", "prohibited", "quiet", "secret", "speak", "stealth"], "order": 136, "emoji": "🙊"}, {"tags": ["heart", "letter", "love", "mail", "romance", "valentine"], "order": 137, "emoji": "💌"}, {"tags": ["143", "adorbs", "arrow", "cupid", "date", "emotion", "heart", "ily", "love", "romance", "valentine"], "order": 138, "emoji": "💘"}, {"tags": ["143", "anniversary", "emotion", "heart", "ily", "kisses", "ribbon", "valentine", "xoxo"], "order": 139, "emoji": "💝"}, {"tags": ["143", "emotion", "excited", "good", "heart", "ily", "kisses", "morning", "night", "sparkle", "sparkling", "xoxo"], "order": 140, "emoji": "💖"}, {"tags": ["143", "emotion", "excited", "growing", "heart", "heartpulse", "ily", "kisses", "muah", "nervous", "pulse", "xoxo"], "order": 141, "emoji": "💗"}, {"tags": ["143", "beating", "cardio", "emotion", "heart", "heartbeat", "ily", "love", "pulsating", "pulse"], "order": 142, "emoji": "💓"}, {"tags": ["143", "adorbs", "anniversary", "emotion", "heart", "hearts", "revolving"], "order": 143, "emoji": "💞"}, {"tags": ["143", "anniversary", "date", "dating", "emotion", "heart", "hearts", "ily", "kisses", "love", "loving", "two", "xoxo"], "order": 144, "emoji": "💕"}, {"tags": ["143", "decoration", "emotion", "heart", "hearth", "purple", "white"], "order": 145, "emoji": "💟"}, {"tags": ["exclamation", "heart", "heavy", "mark", "punctuation"], "order": 147, "emoji": "❣️"}, {"tags": ["break", "broken", "crushed", "emotion", "heart", "heartbroken", "lonely", "sad"], "order": 148, "emoji": "💔"}, {"tags": ["burn", "fire", "heart", "love", "lust", "sacred"], "order": 149, "emoji": "❤️‍🔥"}, {"tags": ["healthier", "heart", "improving", "mending", "recovering", "recuperating", "well"], "order": 151, "emoji": "❤️‍🩹"}, {"tags": ["emotion", "heart", "love", "red"], "order": 154, "emoji": "❤️"}, {"tags": ["143", "adorable", "cute", "emotion", "heart", "ily", "like", "love", "pink", "special", "sweet"], "order": 155, "emoji": "🩷"}, {"tags": ["143", "heart", "orange"], "order": 156, "emoji": "🧡"}, {"tags": ["143", "cardiac", "emotion", "heart", "ily", "love", "yellow"], "order": 157, "emoji": "💛"}, {"tags": ["143", "emotion", "green", "heart", "ily", "love", "romantic"], "order": 158, "emoji": "💚"}, {"tags": ["143", "blue", "emotion", "heart", "ily", "love", "romance"], "order": 159, "emoji": "💙"}, {"tags": ["143", "blue", "cute", "cyan", "emotion", "heart", "ily", "light", "like", "love", "sky", "special", "teal"], "order": 160, "emoji": "🩵"}, {"tags": ["143", "bestest", "emotion", "heart", "ily", "love", "purple"], "order": 161, "emoji": "💜"}, {"tags": ["143", "brown", "heart"], "order": 162, "emoji": "🤎"}, {"tags": ["black", "evil", "heart", "wicked"], "order": 163, "emoji": "🖤"}, {"tags": ["143", "emotion", "gray", "grey", "heart", "ily", "love", "silver", "slate", "special"], "order": 164, "emoji": "🩶"}, {"tags": ["143", "heart", "white"], "order": 165, "emoji": "🤍"}, {"tags": ["dating", "emotion", "heart", "kiss", "kissing", "lips", "mark", "romance", "sexy"], "order": 166, "emoji": "💋"}, {"tags": ["100", "a+", "agree", "clearly", "definitely", "faithful", "fleek", "full", "hundred", "keep", "perfect", "point", "score", "true", "truth", "yup"], "order": 167, "emoji": "💯"}, {"tags": ["anger", "angry", "comic", "mad", "symbol", "upset"], "order": 168, "emoji": "💢"}, {"tags": ["bomb", "boom", "collide", "comic", "explode"], "order": 169, "emoji": "💥"}, {"tags": ["comic", "shining", "shooting", "star", "stars"], "order": 170, "emoji": "💫"}, {"tags": ["comic", "drip", "droplet", "droplets", "drops", "splashing", "squirt", "sweat", "water", "wet", "work", "workout"], "order": 171, "emoji": "💦"}, {"tags": ["away", "cloud", "comic", "dash", "dashing", "fart", "fast", "go", "gone", "gotta", "running", "smoke"], "order": 172, "emoji": "💨"}, {"tags": ["hole"], "order": 174, "emoji": "🕳️"}, {"tags": ["balloon", "bubble", "comic", "dialog", "message", "sms", "speech", "talk", "text", "typing"], "order": 175, "emoji": "💬"}, {"tags": ["balloon", "bubble", "eye", "speech", "witness"], "order": 176, "emoji": "👁️‍🗨️"}, {"tags": ["balloon", "bubble", "dialog", "left", "speech"], "order": 181, "emoji": "🗨️"}, {"tags": ["anger", "angry", "balloon", "bubble", "mad", "right"], "order": 183, "emoji": "🗯️"}, {"tags": ["balloon", "bubble", "cartoon", "cloud", "comic", "daydream", "decisions", "dream", "idea", "invent", "invention", "realize", "think", "thoughts", "wonder"], "order": 184, "emoji": "💭"}, {"tags": ["comic", "good", "goodnight", "night", "sleep", "sleeping", "sleepy", "tired", "zzz"], "order": 185, "emoji": "💤"}, {"tags": ["bye", "cya", "g2g", "greetings", "gtg", "hand", "hello", "hey", "hi", "later", "outtie", "ttfn", "ttyl", "wave", "yo", "you"], "order": 186, "emoji": "👋"}, {"tags": ["back", "backhand", "hand", "raised"], "order": 192, "emoji": "🤚"}, {"tags": ["finger", "fingers", "hand", "raised", "splayed", "stop"], "order": 199, "emoji": "🖐️"}, {"tags": ["5", "five", "hand", "high", "raised", "stop"], "order": 205, "emoji": "✋️"}, {"tags": ["finger", "hand", "hands", "salute", "vulcan"], "order": 211, "emoji": "🖖"}, {"tags": ["hand", "handshake", "hold", "reach", "right", "rightward", "rightwards", "shake"], "order": 217, "emoji": "🫱"}, {"tags": ["hand", "handshake", "hold", "left", "leftward", "leftwards", "reach", "shake"], "order": 223, "emoji": "🫲"}, {"tags": ["dismiss", "down", "drop", "dropped", "hand", "palm", "pick", "shoo", "up"], "order": 229, "emoji": "🫳"}, {"tags": ["beckon", "catch", "come", "hand", "hold", "know", "lift", "me", "offer", "palm", "tell"], "order": 235, "emoji": "🫴"}, {"tags": ["block", "five", "halt", "hand", "high", "hold", "leftward", "leftwards", "pause", "push", "pushing", "refuse", "slap", "stop", "wait"], "order": 241, "emoji": "🫷"}, {"tags": ["block", "five", "halt", "hand", "high", "hold", "pause", "push", "pushing", "refuse", "rightward", "rightwards", "slap", "stop", "wait"], "order": 247, "emoji": "🫸"}, {"tags": ["awesome", "bet", "dope", "fleek", "fosho", "got", "gotcha", "hand", "legit", "ok", "okay", "pinch", "rad", "sure", "sweet", "three"], "order": 253, "emoji": "👌"}, {"tags": ["fingers", "gesture", "hand", "hold", "huh", "interrogation", "patience", "pinched", "relax", "sarcastic", "ugh", "what", "zip"], "order": 259, "emoji": "🤌"}, {"tags": ["amount", "bit", "fingers", "hand", "little", "pinching", "small", "sort"], "order": 265, "emoji": "🤏"}, {"tags": ["hand", "peace", "v", "victory"], "order": 272, "emoji": "✌️"}, {"tags": ["cross", "crossed", "finger", "fingers", "hand", "luck"], "order": 278, "emoji": "🤞"}, {"tags": ["<3", "crossed", "expensive", "finger", "hand", "heart", "index", "love", "money", "snap", "thumb"], "order": 284, "emoji": "🫰"}, {"tags": ["fingers", "gesture", "hand", "ily", "love", "love-you", "three", "you"], "order": 290, "emoji": "🤟"}, {"tags": ["finger", "hand", "horns", "rock-on", "sign"], "order": 296, "emoji": "🤘"}, {"tags": ["call", "hand", "hang", "loose", "me", "shaka"], "order": 302, "emoji": "🤙"}, {"tags": ["backhand", "finger", "hand", "index", "left", "point", "pointing"], "order": 308, "emoji": "👈️"}, {"tags": ["backhand", "finger", "hand", "index", "point", "pointing", "right"], "order": 314, "emoji": "👉️"}, {"tags": ["backhand", "finger", "hand", "index", "point", "pointing", "up"], "order": 320, "emoji": "👆️"}, {"tags": ["finger", "hand", "middle"], "order": 326, "emoji": "🖕"}, {"tags": ["backhand", "down", "finger", "hand", "index", "point", "pointing"], "order": 332, "emoji": "👇️"}, {"tags": ["finger", "hand", "index", "point", "pointing", "this", "up"], "order": 339, "emoji": "☝️"}, {"tags": ["at", "finger", "hand", "index", "pointing", "poke", "viewer", "you"], "order": 345, "emoji": "🫵"}, {"tags": ["+1", "good", "hand", "like", "thumb", "up", "yes"], "order": 351, "emoji": "👍️"}, {"tags": ["-1", "bad", "dislike", "down", "good", "hand", "no", "nope", "thumb", "thumbs"], "order": 357, "emoji": "👎️"}, {"tags": ["clenched", "fist", "hand", "punch", "raised", "solidarity"], "order": 363, "emoji": "✊️"}, {"tags": ["absolutely", "agree", "boom", "bro", "bruh", "bump", "clenched", "correct", "fist", "hand", "knuckle", "oncoming", "pound", "punch", "rock", "ttyl"], "order": 369, "emoji": "👊"}, {"tags": ["fist", "left-facing", "leftwards"], "order": 375, "emoji": "🤛"}, {"tags": ["fist", "right-facing", "rightwards"], "order": 381, "emoji": "🤜"}, {"tags": ["applause", "approval", "awesome", "clap", "congrats", "congratulations", "excited", "good", "great", "hand", "homie", "job", "nice", "prayed", "well", "yay"], "order": 387, "emoji": "👏"}, {"tags": ["celebration", "gesture", "hand", "hands", "hooray", "praise", "raised", "raising"], "order": 393, "emoji": "🙌"}, {"tags": ["<3", "hands", "heart", "love", "you"], "order": 399, "emoji": "🫶"}, {"tags": ["hand", "hands", "hug", "jazz", "open", "swerve"], "order": 405, "emoji": "👐"}, {"tags": ["cupped", "dua", "hands", "palms", "pray", "prayer", "together", "up", "wish"], "order": 411, "emoji": "🤲"}, {"tags": ["agreement", "deal", "hand", "meeting", "shake"], "order": 417, "emoji": "🤝"}, {"tags": ["appreciate", "ask", "beg", "blessed", "bow", "cmon", "five", "folded", "gesture", "hand", "high", "please", "pray", "thanks", "thx"], "order": 443, "emoji": "🙏"}, {"tags": ["hand", "write", "writing"], "order": 450, "emoji": "✍️"}, {"tags": ["bored", "care", "cosmetics", "done", "makeup", "manicure", "nail", "polish", "whatever"], "order": 456, "emoji": "💅"}, {"tags": ["camera", "phone"], "order": 462, "emoji": "🤳"}, {"tags": ["arm", "beast", "bench", "biceps", "bodybuilder", "bro", "curls", "flex", "gains", "gym", "jacked", "muscle", "press", "ripped", "strong", "weightlift"], "order": 468, "emoji": "💪"}, {"tags": ["accessibility", "arm", "mechanical", "prosthetic"], "order": 474, "emoji": "🦾"}, {"tags": ["accessibility", "leg", "mechanical", "prosthetic"], "order": 475, "emoji": "🦿"}, {"tags": ["bent", "foot", "kick", "knee", "limb"], "order": 476, "emoji": "🦵"}, {"tags": ["ankle", "feet", "kick", "stomp"], "order": 482, "emoji": "🦶"}, {"tags": ["body", "ears", "hear", "hearing", "listen", "listening", "sound"], "order": 488, "emoji": "👂️"}, {"tags": ["accessibility", "aid", "ear", "hard", "hearing"], "order": 494, "emoji": "🦻"}, {"tags": ["body", "noses", "nosey", "odor", "smell", "smells"], "order": 500, "emoji": "👃"}, {"tags": ["intelligent", "smart"], "order": 506, "emoji": "🧠"}, {"tags": ["anatomical", "beat", "cardiology", "heart", "heartbeat", "organ", "pulse", "real", "red"], "order": 507, "emoji": "🫀"}, {"tags": ["breath", "breathe", "exhalation", "inhalation", "lung", "organ", "respiration"], "order": 508, "emoji": "🫁"}, {"tags": ["dentist", "pearly", "teeth", "white"], "order": 509, "emoji": "🦷"}, {"tags": ["bones", "dog", "skeleton", "wishbone"], "order": 510, "emoji": "🦴"}, {"tags": ["body", "eye", "face", "googly", "look", "looking", "omg", "peep", "see", "seeing"], "order": 511, "emoji": "👀"}, {"tags": ["1", "body", "one"], "order": 513, "emoji": "👁️"}, {"tags": ["body", "lick", "slurp"], "order": 514, "emoji": "👅"}, {"tags": ["beauty", "body", "kiss", "kissing", "lips", "lipstick"], "order": 515, "emoji": "👄"}, {"tags": ["anxious", "bite", "biting", "fear", "flirt", "flirting", "kiss", "lip", "lipstick", "nervous", "sexy", "uncomfortable", "worried", "worry"], "order": 516, "emoji": "🫦"}, {"tags": ["babies", "children", "goo", "infant", "newborn", "pregnant", "young"], "order": 517, "emoji": "👶"}, {"tags": ["bright-eyed", "grandchild", "kid", "young", "younger"], "order": 523, "emoji": "🧒"}, {"tags": ["bright-eyed", "child", "grandson", "kid", "son", "young", "younger"], "order": 529, "emoji": "👦"}, {"tags": ["bright-eyed", "child", "daughter", "granddaughter", "kid", "virgo", "young", "younger", "zodiac"], "order": 535, "emoji": "👧"}, {"tags": ["adult"], "order": 541, "emoji": "🧑"}, {"tags": ["blond", "blond-haired", "human", "person"], "order": 547, "emoji": "👱"}, {"tags": ["adult", "bro"], "order": 553, "emoji": "👨"}, {"tags": ["beard", "bearded", "person", "whiskers"], "order": 559, "emoji": "🧔"}, {"tags": ["beard", "bearded", "man", "whiskers"], "order": 565, "emoji": "🧔‍♂️"}, {"tags": ["beard", "bearded", "whiskers", "woman"], "order": 577, "emoji": "🧔‍♀️"}, {"tags": ["adult", "bro", "man", "red hair"], "order": 589, "emoji": "👨‍🦰"}, {"tags": ["adult", "bro", "curly hair", "man"], "order": 595, "emoji": "👨‍🦱"}, {"tags": ["adult", "bro", "man", "white hair"], "order": 601, "emoji": "👨‍🦳"}, {"tags": ["adult", "bald", "bro", "man"], "order": 607, "emoji": "👨‍🦲"}, {"tags": ["adult", "lady"], "order": 613, "emoji": "👩"}, {"tags": ["adult", "lady", "red hair", "woman"], "order": 619, "emoji": "👩‍🦰"}, {"tags": ["adult", "person", "red hair"], "order": 625, "emoji": "🧑‍🦰"}, {"tags": ["adult", "curly hair", "lady", "woman"], "order": 631, "emoji": "👩‍🦱"}, {"tags": ["adult", "curly hair", "person"], "order": 637, "emoji": "🧑‍🦱"}, {"tags": ["adult", "lady", "white hair", "woman"], "order": 643, "emoji": "👩‍🦳"}, {"tags": ["adult", "person", "white hair"], "order": 649, "emoji": "🧑‍🦳"}, {"tags": ["adult", "bald", "lady", "woman"], "order": 655, "emoji": "👩‍🦲"}, {"tags": ["adult", "bald", "person"], "order": 661, "emoji": "🧑‍🦲"}, {"tags": ["blond", "blond-haired", "blonde", "hair", "woman"], "order": 667, "emoji": "👱‍♀️"}, {"tags": ["blond", "blond-haired", "hair", "man"], "order": 679, "emoji": "👱‍♂️"}, {"tags": ["adult", "elderly", "grandparent", "old", "person", "wise"], "order": 691, "emoji": "🧓"}, {"tags": ["adult", "bald", "elderly", "gramps", "grandfather", "grandpa", "man", "old", "wise"], "order": 697, "emoji": "👴"}, {"tags": ["adult", "elderly", "grandma", "grandmother", "granny", "lady", "old", "wise", "woman"], "order": 703, "emoji": "👵"}, {"tags": ["annoyed", "disappointed", "disgruntled", "disturbed", "frown", "frowning", "frustrated", "gesture", "irritated", "person", "upset"], "order": 709, "emoji": "🙍"}, {"tags": ["annoyed", "disappointed", "disgruntled", "disturbed", "frown", "frowning", "frustrated", "gesture", "irritated", "man", "upset"], "order": 715, "emoji": "🙍‍♂️"}, {"tags": ["annoyed", "disappointed", "disgruntled", "disturbed", "frown", "frowning", "frustrated", "gesture", "irritated", "upset", "woman"], "order": 727, "emoji": "🙍‍♀️"}, {"tags": ["disappointed", "downtrodden", "frown", "grimace", "person", "pouting", "scowl", "sulk", "upset", "whine"], "order": 739, "emoji": "🙎"}, {"tags": ["disappointed", "downtrodden", "frown", "grimace", "man", "pouting", "scowl", "sulk", "upset", "whine"], "order": 745, "emoji": "🙎‍♂️"}, {"tags": ["disappointed", "downtrodden", "frown", "grimace", "pouting", "scowl", "sulk", "upset", "whine", "woman"], "order": 757, "emoji": "🙎‍♀️"}, {"tags": ["forbidden", "gesture", "hand", "no", "not", "person", "prohibit"], "order": 769, "emoji": "🙅"}, {"tags": ["forbidden", "gesture", "hand", "man", "no", "not", "prohibit"], "order": 775, "emoji": "🙅‍♂️"}, {"tags": ["forbidden", "gesture", "hand", "no", "not", "prohibit", "woman"], "order": 787, "emoji": "🙅‍♀️"}, {"tags": ["exercise", "gesture", "gesturing", "hand", "ok", "omg", "person"], "order": 799, "emoji": "🙆"}, {"tags": ["exercise", "gesture", "gesturing", "hand", "man", "ok", "omg"], "order": 805, "emoji": "🙆‍♂️"}, {"tags": ["exercise", "gesture", "gesturing", "hand", "ok", "omg", "woman"], "order": 817, "emoji": "🙆‍♀️"}, {"tags": ["fetch", "flick", "flip", "gossip", "hand", "person", "sarcasm", "sarcastic", "sassy", "seriously", "tipping", "whatever"], "order": 829, "emoji": "💁"}, {"tags": ["fetch", "flick", "flip", "gossip", "hand", "man", "sarcasm", "sarcastic", "sassy", "seriously", "tipping", "whatever"], "order": 835, "emoji": "💁‍♂️"}, {"tags": ["fetch", "flick", "flip", "gossip", "hand", "sarcasm", "sarcastic", "sassy", "seriously", "tipping", "whatever", "woman"], "order": 847, "emoji": "💁‍♀️"}, {"tags": ["gesture", "hand", "here", "know", "me", "person", "pick", "question", "raise", "raising"], "order": 859, "emoji": "🙋"}, {"tags": ["gesture", "hand", "here", "know", "man", "me", "pick", "question", "raise", "raising"], "order": 865, "emoji": "🙋‍♂️"}, {"tags": ["gesture", "hand", "here", "know", "me", "pick", "question", "raise", "raising", "woman"], "order": 877, "emoji": "🙋‍♀️"}, {"tags": ["accessibility", "deaf", "ear", "gesture", "hear", "person"], "order": 889, "emoji": "🧏"}, {"tags": ["accessibility", "deaf", "ear", "gesture", "hear", "man"], "order": 895, "emoji": "🧏‍♂️"}, {"tags": ["accessibility", "deaf", "ear", "gesture", "hear", "woman"], "order": 907, "emoji": "🧏‍♀️"}, {"tags": ["apology", "ask", "beg", "bow", "bowing", "favor", "forgive", "gesture", "meditate", "meditation", "person", "pity", "regret", "sorry"], "order": 919, "emoji": "🙇"}, {"tags": ["apology", "ask", "beg", "bow", "bowing", "favor", "forgive", "gesture", "man", "meditate", "meditation", "pity", "regret", "sorry"], "order": 925, "emoji": "🙇‍♂️"}, {"tags": ["apology", "ask", "beg", "bow", "bowing", "favor", "forgive", "gesture", "meditate", "meditation", "pity", "regret", "sorry", "woman"], "order": 937, "emoji": "🙇‍♀️"}, {"tags": ["again", "bewilder", "disbelief", "exasperation", "facepalm", "no", "not", "oh", "omg", "person", "shock", "smh"], "order": 949, "emoji": "🤦"}, {"tags": ["again", "bewilder", "disbelief", "exasperation", "facepalm", "man", "no", "not", "oh", "omg", "shock", "smh"], "order": 955, "emoji": "🤦‍♂️"}, {"tags": ["again", "bewilder", "disbelief", "exasperation", "facepalm", "no", "not", "oh", "omg", "shock", "smh", "woman"], "order": 967, "emoji": "🤦‍♀️"}, {"tags": ["doubt", "dunno", "guess", "idk", "ignorance", "indifference", "knows", "maybe", "person", "shrug", "shrugging", "whatever", "who"], "order": 979, "emoji": "🤷"}, {"tags": ["doubt", "dunno", "guess", "idk", "ignorance", "indifference", "knows", "man", "maybe", "shrug", "shrugging", "whatever", "who"], "order": 985, "emoji": "🤷‍♂️"}, {"tags": ["doubt", "dunno", "guess", "idk", "ignorance", "indifference", "knows", "maybe", "shrug", "shrugging", "whatever", "who", "woman"], "order": 997, "emoji": "🤷‍♀️"}, {"tags": ["doctor", "health", "healthcare", "nurse", "therapist", "worker"], "order": 1009, "emoji": "🧑‍⚕️"}, {"tags": ["doctor", "health", "healthcare", "man", "nurse", "therapist", "worker"], "order": 1021, "emoji": "👨‍⚕️"}, {"tags": ["doctor", "health", "healthcare", "nurse", "therapist", "woman", "worker"], "order": 1033, "emoji": "👩‍⚕️"}, {"tags": ["graduate"], "order": 1045, "emoji": "🧑‍🎓"}, {"tags": ["graduate", "man", "student"], "order": 1051, "emoji": "👨‍🎓"}, {"tags": ["graduate", "student", "woman"], "order": 1057, "emoji": "👩‍🎓"}, {"tags": ["instructor", "lecturer", "professor"], "order": 1063, "emoji": "🧑‍🏫"}, {"tags": ["instructor", "lecturer", "man", "professor", "teacher"], "order": 1069, "emoji": "👨‍🏫"}, {"tags": ["instructor", "lecturer", "professor", "teacher", "woman"], "order": 1075, "emoji": "👩‍🏫"}, {"tags": ["justice", "law", "scales"], "order": 1081, "emoji": "🧑‍⚖️"}, {"tags": ["judge", "justice", "law", "man", "scales"], "order": 1093, "emoji": "👨‍⚖️"}, {"tags": ["judge", "justice", "law", "scales", "woman"], "order": 1105, "emoji": "👩‍⚖️"}, {"tags": ["gardener", "rancher"], "order": 1117, "emoji": "🧑‍🌾"}, {"tags": ["farmer", "gardener", "man", "rancher"], "order": 1123, "emoji": "👨‍🌾"}, {"tags": ["farmer", "gardener", "rancher", "woman"], "order": 1129, "emoji": "👩‍🌾"}, {"tags": ["chef"], "order": 1135, "emoji": "🧑‍🍳"}, {"tags": ["chef", "cook", "man"], "order": 1141, "emoji": "👨‍🍳"}, {"tags": ["chef", "cook", "woman"], "order": 1147, "emoji": "👩‍🍳"}, {"tags": ["electrician", "plumber", "tradesperson"], "order": 1153, "emoji": "🧑‍🔧"}, {"tags": ["electrician", "man", "mechanic", "plumber", "tradesperson"], "order": 1159, "emoji": "👨‍🔧"}, {"tags": ["electrician", "mechanic", "plumber", "tradesperson", "woman"], "order": 1165, "emoji": "👩‍🔧"}, {"tags": ["assembly", "factory", "industrial", "worker"], "order": 1171, "emoji": "🧑‍🏭"}, {"tags": ["assembly", "factory", "industrial", "man", "worker"], "order": 1177, "emoji": "👨‍🏭"}, {"tags": ["assembly", "factory", "industrial", "woman", "worker"], "order": 1183, "emoji": "👩‍🏭"}, {"tags": ["architect", "business", "manager", "office", "white-collar", "worker"], "order": 1189, "emoji": "🧑‍💼"}, {"tags": ["architect", "business", "man", "manager", "office", "white-collar", "worker"], "order": 1195, "emoji": "👨‍💼"}, {"tags": ["architect", "business", "manager", "office", "white-collar", "woman", "worker"], "order": 1201, "emoji": "👩‍💼"}, {"tags": ["biologist", "chemist", "engineer", "mathematician", "physicist"], "order": 1207, "emoji": "🧑‍🔬"}, {"tags": ["biologist", "chemist", "engineer", "man", "mathematician", "physicist", "scientist"], "order": 1213, "emoji": "👨‍🔬"}, {"tags": ["biologist", "chemist", "engineer", "mathematician", "physicist", "scientist", "woman"], "order": 1219, "emoji": "👩‍🔬"}, {"tags": ["coder", "computer", "developer", "inventor", "software"], "order": 1225, "emoji": "🧑‍💻"}, {"tags": ["coder", "computer", "developer", "inventor", "man", "software", "technologist"], "order": 1231, "emoji": "👨‍💻"}, {"tags": ["coder", "computer", "developer", "inventor", "software", "technologist", "woman"], "order": 1237, "emoji": "👩‍💻"}, {"tags": ["actor", "entertainer", "rock", "rockstar", "star"], "order": 1243, "emoji": "🧑‍🎤"}, {"tags": ["actor", "entertainer", "man", "rock", "rockstar", "singer", "star"], "order": 1249, "emoji": "👨‍🎤"}, {"tags": ["actor", "entertainer", "rock", "rockstar", "singer", "star", "woman"], "order": 1255, "emoji": "👩‍🎤"}, {"tags": ["palette"], "order": 1261, "emoji": "🧑‍🎨"}, {"tags": ["artist", "man", "palette"], "order": 1267, "emoji": "👨‍🎨"}, {"tags": ["artist", "palette", "woman"], "order": 1273, "emoji": "👩‍🎨"}, {"tags": ["plane"], "order": 1279, "emoji": "🧑‍✈️"}, {"tags": ["man", "pilot", "plane"], "order": 1291, "emoji": "👨‍✈️"}, {"tags": ["pilot", "plane", "woman"], "order": 1303, "emoji": "👩‍✈️"}, {"tags": ["rocket", "space"], "order": 1315, "emoji": "🧑‍🚀"}, {"tags": ["astronaut", "man", "rocket", "space"], "order": 1321, "emoji": "👨‍🚀"}, {"tags": ["astronaut", "rocket", "space", "woman"], "order": 1327, "emoji": "👩‍🚀"}, {"tags": ["fire", "firetruck"], "order": 1333, "emoji": "🧑‍🚒"}, {"tags": ["fire", "firefighter", "firetruck", "man"], "order": 1339, "emoji": "👨‍🚒"}, {"tags": ["fire", "firefighter", "firetruck", "woman"], "order": 1345, "emoji": "👩‍🚒"}, {"tags": ["apprehend", "arrest", "citation", "cop", "law", "officer", "over", "police", "pulled", "undercover"], "order": 1351, "emoji": "👮"}, {"tags": ["apprehend", "arrest", "citation", "cop", "law", "man", "officer", "over", "police", "pulled", "undercover"], "order": 1357, "emoji": "👮‍♂️"}, {"tags": ["apprehend", "arrest", "citation", "cop", "law", "officer", "over", "police", "pulled", "undercover", "woman"], "order": 1369, "emoji": "👮‍♀️"}, {"tags": ["sleuth", "spy"], "order": 1382, "emoji": "🕵️"}, {"tags": ["detective", "man", "sleuth", "spy"], "order": 1388, "emoji": "🕵️‍♂️"}, {"tags": ["detective", "sleuth", "spy", "woman"], "order": 1402, "emoji": "🕵️‍♀️"}, {"tags": ["buckingham", "helmet", "london", "palace"], "order": 1416, "emoji": "💂"}, {"tags": ["buckingham", "guard", "helmet", "london", "man", "palace"], "order": 1422, "emoji": "💂‍♂️"}, {"tags": ["buckingham", "guard", "helmet", "london", "palace", "woman"], "order": 1434, "emoji": "💂‍♀️"}, {"tags": ["assassin", "fight", "fighter", "hidden", "person", "secret", "skills", "sly", "soldier", "stealth", "war"], "order": 1446, "emoji": "🥷"}, {"tags": ["build", "construction", "fix", "hardhat", "hat", "man", "person", "rebuild", "remodel", "repair", "work", "worker"], "order": 1452, "emoji": "👷"}, {"tags": ["build", "construction", "fix", "hardhat", "hat", "man", "rebuild", "remodel", "repair", "work", "worker"], "order": 1458, "emoji": "👷‍♂️"}, {"tags": ["build", "construction", "fix", "hardhat", "hat", "man", "rebuild", "remodel", "repair", "woman", "work", "worker"], "order": 1470, "emoji": "👷‍♀️"}, {"tags": ["crown", "monarch", "noble", "person", "regal", "royal", "royalty"], "order": 1482, "emoji": "🫅"}, {"tags": ["crown", "fairy", "fairytale", "fantasy", "king", "royal", "royalty", "tale"], "order": 1488, "emoji": "🤴"}, {"tags": ["crown", "fairy", "fairytale", "fantasy", "queen", "royal", "royalty", "tale"], "order": 1494, "emoji": "👸"}, {"tags": ["person", "turban", "wearing"], "order": 1500, "emoji": "👳"}, {"tags": ["man", "turban", "wearing"], "order": 1506, "emoji": "👳‍♂️"}, {"tags": ["turban", "wearing", "woman"], "order": 1518, "emoji": "👳‍♀️"}, {"tags": ["cap", "chinese", "gua", "guapi", "hat", "mao", "person", "pi", "skullcap"], "order": 1530, "emoji": "👲"}, {"tags": ["bandana", "head", "headscarf", "hijab", "kerchief", "mantilla", "tichel", "woman"], "order": 1536, "emoji": "🧕"}, {"tags": ["formal", "person", "tuxedo", "wedding"], "order": 1542, "emoji": "🤵"}, {"tags": ["formal", "groom", "man", "tuxedo", "wedding"], "order": 1548, "emoji": "🤵‍♂️"}, {"tags": ["formal", "tuxedo", "wedding", "woman"], "order": 1560, "emoji": "🤵‍♀️"}, {"tags": ["person", "veil", "wedding"], "order": 1572, "emoji": "👰"}, {"tags": ["man", "veil", "wedding"], "order": 1578, "emoji": "👰‍♂️"}, {"tags": ["bride", "veil", "wedding", "woman"], "order": 1590, "emoji": "👰‍♀️"}, {"tags": ["pregnant", "woman"], "order": 1602, "emoji": "🤰"}, {"tags": ["belly", "bloated", "full", "man", "overeat", "pregnant"], "order": 1608, "emoji": "🫃"}, {"tags": ["belly", "bloated", "full", "overeat", "person", "pregnant", "stuffed"], "order": 1614, "emoji": "🫄"}, {"tags": ["baby", "breast", "feeding", "mom", "mother", "nursing", "woman"], "order": 1620, "emoji": "🤱"}, {"tags": ["baby", "feed", "feeding", "mom", "mother", "nanny", "newborn", "nursing", "woman"], "order": 1626, "emoji": "👩‍🍼"}, {"tags": ["baby", "dad", "father", "feed", "feeding", "man", "nanny", "newborn", "nursing"], "order": 1632, "emoji": "👨‍🍼"}, {"tags": ["baby", "feed", "feeding", "nanny", "newborn", "nursing", "parent"], "order": 1638, "emoji": "🧑‍🍼"}, {"tags": ["angel", "baby", "church", "face", "fairy", "fairytale", "fantasy", "tale"], "order": 1644, "emoji": "👼"}, {"tags": ["celebration", "christmas", "claus", "fairy", "fantasy", "father", "holiday", "merry", "santa", "tale", "xmas"], "order": 1650, "emoji": "🎅"}, {"tags": ["celebration", "christmas", "claus", "fairy", "fantasy", "holiday", "merry", "mother", "mrs", "santa", "tale", "xmas"], "order": 1656, "emoji": "🤶"}, {"tags": ["celebration", "christmas", "claus", "fairy", "fantasy", "holiday", "merry", "mx", "santa", "tale", "xmas"], "order": 1662, "emoji": "🧑‍🎄"}, {"tags": ["good", "hero", "superpower"], "order": 1668, "emoji": "🦸"}, {"tags": ["good", "hero", "man", "superhero", "superpower"], "order": 1674, "emoji": "🦸‍♂️"}, {"tags": ["good", "hero", "heroine", "superhero", "superpower", "woman"], "order": 1686, "emoji": "🦸‍♀️"}, {"tags": ["bad", "criminal", "evil", "superpower", "villain"], "order": 1698, "emoji": "🦹"}, {"tags": ["bad", "criminal", "evil", "man", "superpower", "supervillain", "villain"], "order": 1704, "emoji": "🦹‍♂️"}, {"tags": ["bad", "criminal", "evil", "superpower", "supervillain", "villain", "woman"], "order": 1716, "emoji": "🦹‍♀️"}, {"tags": ["fantasy", "magic", "play", "sorcerer", "sorceress", "sorcery", "spell", "summon", "witch", "wizard"], "order": 1728, "emoji": "🧙"}, {"tags": ["fantasy", "mage", "magic", "man", "play", "sorcerer", "sorceress", "sorcery", "spell", "summon", "witch", "wizard"], "order": 1734, "emoji": "🧙‍♂️"}, {"tags": ["fantasy", "mage", "magic", "play", "sorcerer", "sorceress", "sorcery", "spell", "summon", "witch", "wizard", "woman"], "order": 1746, "emoji": "🧙‍♀️"}, {"tags": ["fairytale", "fantasy", "myth", "person", "pixie", "tale", "wings"], "order": 1758, "emoji": "🧚"}, {"tags": ["fairy", "fairytale", "fantasy", "man", "myth", "oberon", "person", "pixie", "puck", "tale", "wings"], "order": 1764, "emoji": "🧚‍♂️"}, {"tags": ["fairy", "fairytale", "fantasy", "myth", "person", "pixie", "tale", "titania", "wings", "woman"], "order": 1776, "emoji": "🧚‍♀️"}, {"tags": ["blood", "dracula", "fangs", "halloween", "scary", "supernatural", "teeth", "undead"], "order": 1788, "emoji": "🧛"}, {"tags": ["blood", "fangs", "halloween", "man", "scary", "supernatural", "teeth", "undead", "vampire"], "order": 1794, "emoji": "🧛‍♂️"}, {"tags": ["blood", "fangs", "halloween", "scary", "supernatural", "teeth", "undead", "vampire", "woman"], "order": 1806, "emoji": "🧛‍♀️"}, {"tags": ["creature", "fairytale", "folklore", "ocean", "sea", "siren", "trident"], "order": 1818, "emoji": "🧜"}, {"tags": ["creature", "fairytale", "folklore", "neptune", "ocean", "poseidon", "sea", "siren", "trident", "triton"], "order": 1824, "emoji": "🧜‍♂️"}, {"tags": ["creature", "fairytale", "folklore", "merwoman", "ocean", "sea", "siren", "trident"], "order": 1836, "emoji": "🧜‍♀️"}, {"tags": ["elves", "enchantment", "fantasy", "folklore", "magic", "magical", "myth"], "order": 1848, "emoji": "🧝"}, {"tags": ["elf", "elves", "enchantment", "fantasy", "folklore", "magic", "magical", "man", "myth"], "order": 1854, "emoji": "🧝‍♂️"}, {"tags": ["elf", "elves", "enchantment", "fantasy", "folklore", "magic", "magical", "myth", "woman"], "order": 1866, "emoji": "🧝‍♀️"}, {"tags": ["djinn", "fantasy", "jinn", "lamp", "myth", "rub", "wishes"], "order": 1878, "emoji": "🧞"}, {"tags": ["djinn", "fantasy", "genie", "jinn", "lamp", "man", "myth", "rub", "wishes"], "order": 1879, "emoji": "🧞‍♂️"}, {"tags": ["djinn", "fantasy", "genie", "jinn", "lamp", "myth", "rub", "wishes", "woman"], "order": 1881, "emoji": "🧞‍♀️"}, {"tags": ["apocalypse", "dead", "halloween", "horror", "scary", "undead", "walking"], "order": 1883, "emoji": "🧟"}, {"tags": ["apocalypse", "dead", "halloween", "horror", "man", "scary", "undead", "walking", "zombie"], "order": 1884, "emoji": "🧟‍♂️"}, {"tags": ["apocalypse", "dead", "halloween", "horror", "scary", "undead", "walking", "woman", "zombie"], "order": 1886, "emoji": "🧟‍♀️"}, {"tags": ["fairy", "fantasy", "monster", "tale", "trolling"], "order": 1888, "emoji": "🧌"}, {"tags": ["face", "getting", "headache", "massage", "person", "relax", "relaxing", "salon", "soothe", "spa", "tension", "therapy", "treatment"], "order": 1889, "emoji": "💆"}, {"tags": ["face", "getting", "headache", "man", "massage", "relax", "relaxing", "salon", "soothe", "spa", "tension", "therapy", "treatment"], "order": 1895, "emoji": "💆‍♂️"}, {"tags": ["face", "getting", "headache", "massage", "relax", "relaxing", "salon", "soothe", "spa", "tension", "therapy", "treatment", "woman"], "order": 1907, "emoji": "💆‍♀️"}, {"tags": ["barber", "beauty", "chop", "cosmetology", "cut", "groom", "hair", "haircut", "parlor", "person", "shears", "style"], "order": 1919, "emoji": "💇"}, {"tags": ["barber", "beauty", "chop", "cosmetology", "cut", "groom", "hair", "haircut", "man", "parlor", "person", "shears", "style"], "order": 1925, "emoji": "💇‍♂️"}, {"tags": ["barber", "beauty", "chop", "cosmetology", "cut", "groom", "hair", "haircut", "parlor", "person", "shears", "style", "woman"], "order": 1937, "emoji": "💇‍♀️"}, {"tags": ["amble", "gait", "hike", "man", "pace", "pedestrian", "person", "stride", "stroll", "walk", "walking"], "order": 1949, "emoji": "🚶"}, {"tags": ["amble", "gait", "hike", "man", "pace", "pedestrian", "stride", "stroll", "walk", "walking"], "order": 1955, "emoji": "🚶‍♂️"}, {"tags": ["amble", "gait", "hike", "man", "pace", "pedestrian", "stride", "stroll", "walk", "walking", "woman"], "order": 1967, "emoji": "🚶‍♀️"}, {"tags": ["amble", "gait", "hike", "man", "pace", "pedestrian", "person", "stride", "stroll", "walk", "walking"], "order": 1979, "emoji": "🚶‍➡️"}, {"tags": ["amble", "gait", "hike", "man", "pace", "pedestrian", "stride", "stroll", "walk", "walking", "woman"], "order": 1991, "emoji": "🚶‍♀️‍➡️"}, {"tags": ["amble", "gait", "hike", "man", "pace", "pedestrian", "stride", "stroll", "walk", "walking"], "order": 2015, "emoji": "🚶‍♂️‍➡️"}, {"tags": ["person", "stand", "standing"], "order": 2039, "emoji": "🧍"}, {"tags": ["man", "stand", "standing"], "order": 2045, "emoji": "🧍‍♂️"}, {"tags": ["stand", "standing", "woman"], "order": 2057, "emoji": "🧍‍♀️"}, {"tags": ["kneel", "kneeling", "knees", "person"], "order": 2069, "emoji": "🧎"}, {"tags": ["kneel", "kneeling", "knees", "man"], "order": 2075, "emoji": "🧎‍♂️"}, {"tags": ["kneel", "kneeling", "knees", "woman"], "order": 2087, "emoji": "🧎‍♀️"}, {"tags": ["kneel", "kneeling", "knees", "person"], "order": 2099, "emoji": "🧎‍➡️"}, {"tags": ["kneel", "kneeling", "knees", "woman"], "order": 2111, "emoji": "🧎‍♀️‍➡️"}, {"tags": ["kneel", "kneeling", "knees", "man"], "order": 2135, "emoji": "🧎‍♂️‍➡️"}, {"tags": ["accessibility", "blind", "cane", "person", "probing", "white"], "order": 2159, "emoji": "🧑‍🦯"}, {"tags": ["accessibility", "blind", "cane", "person", "probing", "white"], "order": 2165, "emoji": "🧑‍🦯‍➡️"}, {"tags": ["accessibility", "blind", "cane", "man", "probing", "white"], "order": 2177, "emoji": "👨‍🦯"}, {"tags": ["accessibility", "blind", "cane", "man", "probing", "white"], "order": 2183, "emoji": "👨‍🦯‍➡️"}, {"tags": ["accessibility", "blind", "cane", "probing", "white", "woman"], "order": 2195, "emoji": "👩‍🦯"}, {"tags": ["accessibility", "blind", "cane", "probing", "white", "woman"], "order": 2201, "emoji": "👩‍🦯‍➡️"}, {"tags": ["accessibility", "motorized", "person", "wheelchair"], "order": 2213, "emoji": "🧑‍🦼"}, {"tags": ["accessibility", "motorized", "person", "wheelchair"], "order": 2219, "emoji": "🧑‍🦼‍➡️"}, {"tags": ["accessibility", "man", "motorized", "wheelchair"], "order": 2231, "emoji": "👨‍🦼"}, {"tags": ["accessibility", "man", "motorized", "wheelchair"], "order": 2237, "emoji": "👨‍🦼‍➡️"}, {"tags": ["accessibility", "motorized", "wheelchair", "woman"], "order": 2249, "emoji": "👩‍🦼"}, {"tags": ["accessibility", "motorized", "wheelchair", "woman"], "order": 2255, "emoji": "👩‍🦼‍➡️"}, {"tags": ["accessibility", "manual", "person", "wheelchair"], "order": 2267, "emoji": "🧑‍🦽"}, {"tags": ["accessibility", "manual", "person", "wheelchair"], "order": 2273, "emoji": "🧑‍🦽‍➡️"}, {"tags": ["accessibility", "man", "manual", "wheelchair"], "order": 2285, "emoji": "👨‍🦽"}, {"tags": ["accessibility", "man", "manual", "wheelchair"], "order": 2291, "emoji": "👨‍🦽‍➡️"}, {"tags": ["accessibility", "manual", "wheelchair", "woman"], "order": 2303, "emoji": "👩‍🦽"}, {"tags": ["accessibility", "manual", "wheelchair", "woman"], "order": 2309, "emoji": "👩‍🦽‍➡️"}, {"tags": ["fast", "hurry", "marathon", "move", "person", "quick", "race", "racing", "run", "rush", "speed"], "order": 2321, "emoji": "🏃"}, {"tags": ["fast", "hurry", "man", "marathon", "move", "quick", "race", "racing", "run", "rush", "speed"], "order": 2327, "emoji": "🏃‍♂️"}, {"tags": ["fast", "hurry", "marathon", "move", "quick", "race", "racing", "run", "rush", "speed", "woman"], "order": 2339, "emoji": "🏃‍♀️"}, {"tags": ["fast", "hurry", "marathon", "move", "person", "quick", "race", "racing", "run", "rush", "speed"], "order": 2351, "emoji": "🏃‍➡️"}, {"tags": ["fast", "hurry", "marathon", "move", "quick", "race", "racing", "run", "rush", "speed", "woman"], "order": 2363, "emoji": "🏃‍♀️‍➡️"}, {"tags": ["fast", "hurry", "man", "marathon", "move", "quick", "race", "racing", "run", "rush", "speed"], "order": 2387, "emoji": "🏃‍♂️‍➡️"}, {"tags": ["dance", "dancer", "dancing", "elegant", "festive", "flair", "flamenco", "groove", "let’s", "salsa", "tango", "woman"], "order": 2411, "emoji": "💃"}, {"tags": ["dance", "dancer", "dancing", "elegant", "festive", "flair", "flamenco", "groove", "let’s", "man", "salsa", "tango"], "order": 2417, "emoji": "🕺"}, {"tags": ["business", "levitating", "person", "suit"], "order": 2424, "emoji": "🕴️"}, {"tags": ["bestie", "bff", "bunny", "counterpart", "dancer", "double", "ear", "identical", "pair", "party", "partying", "people", "soulmate", "twin", "twinsies"], "order": 2430, "emoji": "👯"}, {"tags": ["bestie", "bff", "bunny", "counterpart", "dancer", "double", "ear", "identical", "men", "pair", "party", "partying", "people", "soulmate", "twin", "twinsies"], "order": 2431, "emoji": "👯‍♂️"}, {"tags": ["bestie", "bff", "bunny", "counterpart", "dancer", "double", "ear", "identical", "pair", "party", "partying", "people", "soulmate", "twin", "twinsies", "women"], "order": 2433, "emoji": "👯‍♀️"}, {"tags": ["day", "luxurious", "pamper", "person", "relax", "room", "sauna", "spa", "steam", "steambath", "unwind"], "order": 2435, "emoji": "🧖"}, {"tags": ["day", "luxurious", "man", "pamper", "relax", "room", "sauna", "spa", "steam", "steambath", "unwind"], "order": 2441, "emoji": "🧖‍♂️"}, {"tags": ["day", "luxurious", "pamper", "relax", "room", "sauna", "spa", "steam", "steambath", "unwind", "woman"], "order": 2453, "emoji": "🧖‍♀️"}, {"tags": ["climb", "climber", "climbing", "mountain", "person", "rock", "scale", "up"], "order": 2465, "emoji": "🧗"}, {"tags": ["climb", "climber", "climbing", "man", "mountain", "rock", "scale", "up"], "order": 2471, "emoji": "🧗‍♂️"}, {"tags": ["climb", "climber", "climbing", "mountain", "rock", "scale", "up", "woman"], "order": 2483, "emoji": "🧗‍♀️"}, {"tags": ["fencer", "fencing", "person", "sword"], "order": 2495, "emoji": "🤺"}, {"tags": ["horse", "jockey", "racehorse", "racing", "riding", "sport"], "order": 2496, "emoji": "🏇"}, {"tags": ["ski", "snow"], "order": 2503, "emoji": "⛷️"}, {"tags": ["ski", "snow", "snowboard", "sport"], "order": 2504, "emoji": "🏂️"}, {"tags": ["ball", "birdie", "caddy", "driving", "golf", "golfing", "green", "person", "pga", "putt", "range", "tee"], "order": 2511, "emoji": "🏌️"}, {"tags": ["ball", "birdie", "caddy", "driving", "golf", "golfing", "green", "man", "pga", "putt", "range", "tee"], "order": 2517, "emoji": "🏌️‍♂️"}, {"tags": ["ball", "birdie", "caddy", "driving", "golf", "golfing", "green", "pga", "putt", "range", "tee", "woman"], "order": 2531, "emoji": "🏌️‍♀️"}, {"tags": ["beach", "ocean", "person", "sport", "surf", "surfer", "surfing", "swell", "waves"], "order": 2545, "emoji": "🏄️"}, {"tags": ["beach", "man", "ocean", "sport", "surf", "surfer", "surfing", "swell", "waves"], "order": 2551, "emoji": "🏄‍♂️"}, {"tags": ["beach", "ocean", "person", "sport", "surf", "surfer", "surfing", "swell", "waves"], "order": 2563, "emoji": "🏄‍♀️"}, {"tags": ["boat", "canoe", "cruise", "fishing", "lake", "oar", "paddle", "person", "raft", "river", "row", "rowboat", "rowing"], "order": 2575, "emoji": "🚣"}, {"tags": ["boat", "canoe", "cruise", "fishing", "lake", "man", "oar", "paddle", "raft", "river", "row", "rowboat", "rowing"], "order": 2581, "emoji": "🚣‍♂️"}, {"tags": ["boat", "canoe", "cruise", "fishing", "lake", "oar", "paddle", "raft", "river", "row", "rowboat", "rowing", "woman"], "order": 2593, "emoji": "🚣‍♀️"}, {"tags": ["freestyle", "person", "sport", "swim", "swimmer", "swimming", "triathlon"], "order": 2605, "emoji": "🏊️"}, {"tags": ["freestyle", "man", "sport", "swim", "swimmer", "swimming", "triathlon"], "order": 2611, "emoji": "🏊‍♂️"}, {"tags": ["freestyle", "man", "sport", "swim", "swimmer", "swimming", "triathlon"], "order": 2623, "emoji": "🏊‍♀️"}, {"tags": ["athletic", "ball", "basketball", "bouncing", "championship", "dribble", "net", "person", "player", "throw"], "order": 2636, "emoji": "⛹️"}, {"tags": ["athletic", "ball", "basketball", "bouncing", "championship", "dribble", "man", "net", "player", "throw"], "order": 2642, "emoji": "⛹️‍♂️"}, {"tags": ["athletic", "ball", "basketball", "bouncing", "championship", "dribble", "net", "player", "throw", "woman"], "order": 2656, "emoji": "⛹️‍♀️"}, {"tags": ["barbell", "bodybuilder", "deadlift", "lifter", "lifting", "person", "powerlifting", "weight", "weightlifter", "weights", "workout"], "order": 2671, "emoji": "🏋️"}, {"tags": ["barbell", "bodybuilder", "deadlift", "lifter", "lifting", "man", "powerlifting", "weight", "weightlifter", "weights", "workout"], "order": 2677, "emoji": "🏋️‍♂️"}, {"tags": ["barbell", "bodybuilder", "deadlift", "lifter", "lifting", "powerlifting", "weight", "weightlifter", "weights", "woman", "workout"], "order": 2691, "emoji": "🏋️‍♀️"}, {"tags": ["bicycle", "bicyclist", "bike", "biking", "cycle", "cyclist", "person", "riding", "sport"], "order": 2705, "emoji": "🚴"}, {"tags": ["bicycle", "bicyclist", "bike", "biking", "cycle", "cyclist", "man", "riding", "sport"], "order": 2711, "emoji": "🚴‍♂️"}, {"tags": ["bicycle", "bicyclist", "bike", "biking", "cycle", "cyclist", "riding", "sport", "woman"], "order": 2723, "emoji": "🚴‍♀️"}, {"tags": ["bicycle", "bicyclist", "bike", "biking", "cycle", "cyclist", "mountain", "person", "riding", "sport"], "order": 2735, "emoji": "🚵"}, {"tags": ["bicycle", "bicyclist", "bike", "biking", "cycle", "cyclist", "man", "mountain", "riding", "sport"], "order": 2741, "emoji": "🚵‍♂️"}, {"tags": ["bicycle", "bicyclist", "bike", "biking", "cycle", "cyclist", "mountain", "riding", "sport", "woman"], "order": 2753, "emoji": "🚵‍♀️"}, {"tags": ["active", "cartwheel", "cartwheeling", "excited", "flip", "gymnastics", "happy", "person", "somersault"], "order": 2765, "emoji": "🤸"}, {"tags": ["active", "cartwheel", "cartwheeling", "excited", "flip", "gymnastics", "happy", "man", "somersault"], "order": 2771, "emoji": "🤸‍♂️"}, {"tags": ["active", "cartwheel", "cartwheeling", "excited", "flip", "gymnastics", "happy", "somersault", "woman"], "order": 2783, "emoji": "🤸‍♀️"}, {"tags": ["combat", "duel", "grapple", "people", "ring", "tournament", "wrestle", "wrestling"], "order": 2795, "emoji": "🤼"}, {"tags": ["combat", "duel", "grapple", "men", "ring", "tournament", "wrestle", "wrestling"], "order": 2796, "emoji": "🤼‍♂️"}, {"tags": ["combat", "duel", "grapple", "ring", "tournament", "women", "wrestle", "wrestling"], "order": 2798, "emoji": "🤼‍♀️"}, {"tags": ["person", "playing", "polo", "sport", "swimming", "water", "waterpolo"], "order": 2800, "emoji": "🤽"}, {"tags": ["man", "playing", "polo", "sport", "swimming", "water", "waterpolo"], "order": 2806, "emoji": "🤽‍♂️"}, {"tags": ["playing", "polo", "sport", "swimming", "water", "waterpolo", "woman"], "order": 2818, "emoji": "🤽‍♀️"}, {"tags": ["athletics", "ball", "catch", "chuck", "handball", "hurl", "lob", "person", "pitch", "playing", "sport", "throw", "toss"], "order": 2830, "emoji": "🤾"}, {"tags": ["athletics", "ball", "catch", "chuck", "handball", "hurl", "lob", "man", "pitch", "playing", "sport", "throw", "toss"], "order": 2836, "emoji": "🤾‍♂️"}, {"tags": ["athletics", "ball", "catch", "chuck", "handball", "hurl", "lob", "pitch", "playing", "sport", "throw", "toss", "woman"], "order": 2848, "emoji": "🤾‍♀️"}, {"tags": ["act", "balance", "balancing", "handle", "juggle", "juggling", "manage", "multitask", "person", "skill"], "order": 2860, "emoji": "🤹"}, {"tags": ["act", "balance", "balancing", "handle", "juggle", "juggling", "man", "manage", "multitask", "skill"], "order": 2866, "emoji": "🤹‍♂️"}, {"tags": ["act", "balance", "balancing", "handle", "juggle", "juggling", "manage", "multitask", "skill", "woman"], "order": 2878, "emoji": "🤹‍♀️"}, {"tags": ["cross", "legged", "legs", "lotus", "meditation", "peace", "person", "position", "relax", "serenity", "yoga", "yogi", "zen"], "order": 2890, "emoji": "🧘"}, {"tags": ["cross", "legged", "legs", "lotus", "man", "meditation", "peace", "position", "relax", "serenity", "yoga", "yogi", "zen"], "order": 2896, "emoji": "🧘‍♂️"}, {"tags": ["cross", "legged", "legs", "lotus", "meditation", "peace", "position", "relax", "serenity", "woman", "yoga", "yogi", "zen"], "order": 2908, "emoji": "🧘‍♀️"}, {"tags": ["bath", "bathtub", "person", "taking", "tub"], "order": 2920, "emoji": "🛀"}, {"tags": ["bed", "bedtime", "good", "goodnight", "hotel", "nap", "night", "person", "sleep", "tired", "zzz"], "order": 2926, "emoji": "🛌"}, {"tags": ["bae", "bestie", "bff", "couple", "dating", "flirt", "friends", "hand", "hold", "people", "twins"], "order": 2932, "emoji": "🧑‍🤝‍🧑"}, {"tags": ["bae", "bestie", "bff", "couple", "dating", "flirt", "friends", "girls", "hand", "hold", "sisters", "twins", "women"], "order": 2958, "emoji": "👭"}, {"tags": ["bae", "bestie", "bff", "couple", "dating", "flirt", "friends", "hand", "hold", "man", "twins", "woman"], "order": 2984, "emoji": "👫"}, {"tags": ["bae", "bestie", "bff", "boys", "brothers", "couple", "dating", "flirt", "friends", "hand", "hold", "men", "twins"], "order": 3010, "emoji": "👬"}, {"tags": ["anniversary", "babe", "bae", "couple", "date", "dating", "heart", "love", "mwah", "person", "romance", "together", "xoxo"], "order": 3036, "emoji": "💏"}, {"tags": ["anniversary", "babe", "bae", "couple", "date", "dating", "heart", "kiss", "love", "man", "mwah", "person", "romance", "together", "woman", "xoxo"], "order": 3082, "emoji": "👩‍❤️‍💋‍👨"}, {"tags": ["anniversary", "babe", "bae", "couple", "date", "dating", "heart", "kiss", "love", "man", "mwah", "person", "romance", "together", "xoxo"], "order": 3134, "emoji": "👨‍❤️‍💋‍👨"}, {"tags": ["anniversary", "babe", "bae", "couple", "date", "dating", "heart", "kiss", "love", "mwah", "person", "romance", "together", "woman", "xoxo"], "order": 3186, "emoji": "👩‍❤️‍💋‍👩"}, {"tags": ["anniversary", "babe", "bae", "couple", "dating", "heart", "kiss", "love", "person", "relationship", "romance", "together", "you"], "order": 3238, "emoji": "💑"}, {"tags": ["anniversary", "babe", "bae", "couple", "dating", "heart", "kiss", "love", "man", "person", "relationship", "romance", "together", "woman", "you"], "order": 3284, "emoji": "👩‍❤️‍👨"}, {"tags": ["anniversary", "babe", "bae", "couple", "dating", "heart", "kiss", "love", "man", "person", "relationship", "romance", "together", "you"], "order": 3336, "emoji": "👨‍❤️‍👨"}, {"tags": ["anniversary", "babe", "bae", "couple", "dating", "heart", "kiss", "love", "person", "relationship", "romance", "together", "woman", "you"], "order": 3388, "emoji": "👩‍❤️‍👩"}, {"tags": ["boy", "child", "family", "man", "woman"], "order": 3440, "emoji": "👨‍👩‍👦"}, {"tags": ["child", "family", "girl", "man", "woman"], "order": 3441, "emoji": "👨‍👩‍👧"}, {"tags": ["boy", "child", "family", "girl", "man", "woman"], "order": 3442, "emoji": "👨‍👩‍👧‍👦"}, {"tags": ["boy", "child", "family", "man", "woman"], "order": 3443, "emoji": "👨‍👩‍👦‍👦"}, {"tags": ["child", "family", "girl", "man", "woman"], "order": 3444, "emoji": "👨‍👩‍👧‍👧"}, {"tags": ["boy", "child", "family", "man"], "order": 3445, "emoji": "👨‍👨‍👦"}, {"tags": ["child", "family", "girl", "man"], "order": 3446, "emoji": "👨‍👨‍👧"}, {"tags": ["boy", "child", "family", "girl", "man"], "order": 3447, "emoji": "👨‍👨‍👧‍👦"}, {"tags": ["boy", "child", "family", "man"], "order": 3448, "emoji": "👨‍👨‍👦‍👦"}, {"tags": ["child", "family", "girl", "man"], "order": 3449, "emoji": "👨‍👨‍👧‍👧"}, {"tags": ["boy", "child", "family", "woman"], "order": 3450, "emoji": "👩‍👩‍👦"}, {"tags": ["child", "family", "girl", "woman"], "order": 3451, "emoji": "👩‍👩‍👧"}, {"tags": ["boy", "child", "family", "girl", "woman"], "order": 3452, "emoji": "👩‍👩‍👧‍👦"}, {"tags": ["boy", "child", "family", "woman"], "order": 3453, "emoji": "👩‍👩‍👦‍👦"}, {"tags": ["child", "family", "girl", "woman"], "order": 3454, "emoji": "👩‍👩‍👧‍👧"}, {"tags": ["boy", "child", "family", "man"], "order": 3455, "emoji": "👨‍👦"}, {"tags": ["boy", "child", "family", "man"], "order": 3456, "emoji": "👨‍👦‍👦"}, {"tags": ["child", "family", "girl", "man"], "order": 3457, "emoji": "👨‍👧"}, {"tags": ["boy", "child", "family", "girl", "man"], "order": 3458, "emoji": "👨‍👧‍👦"}, {"tags": ["child", "family", "girl", "man"], "order": 3459, "emoji": "👨‍👧‍👧"}, {"tags": ["boy", "child", "family", "woman"], "order": 3460, "emoji": "👩‍👦"}, {"tags": ["boy", "child", "family", "woman"], "order": 3461, "emoji": "👩‍👦‍👦"}, {"tags": ["child", "family", "girl", "woman"], "order": 3462, "emoji": "👩‍👧"}, {"tags": ["boy", "child", "family", "girl", "woman"], "order": 3463, "emoji": "👩‍👧‍👦"}, {"tags": ["child", "family", "girl", "woman"], "order": 3464, "emoji": "👩‍👧‍👧"}, {"tags": ["face", "head", "silhouette", "speak", "speaking"], "order": 3466, "emoji": "🗣️"}, {"tags": ["bust", "mysterious", "shadow", "silhouette"], "order": 3467, "emoji": "👤"}, {"tags": ["bff", "bust", "busts", "everyone", "friend", "friends", "people", "silhouette"], "order": 3468, "emoji": "👥"}, {"tags": ["comfort", "embrace", "farewell", "friendship", "goodbye", "hello", "hug", "hugging", "love", "people", "thanks"], "order": 3469, "emoji": "🫂"}, {"tags": ["child"], "order": 3470, "emoji": "👪️"}, {"tags": ["adult", "child", "family"], "order": 3471, "emoji": "🧑‍🧑‍🧒"}, {"tags": ["adult", "child", "family"], "order": 3472, "emoji": "🧑‍🧑‍🧒‍🧒"}, {"tags": ["adult", "child", "family"], "order": 3473, "emoji": "🧑‍🧒"}, {"tags": ["adult", "child", "family"], "order": 3474, "emoji": "🧑‍🧒‍🧒"}, {"tags": ["barefoot", "clothing", "footprint", "omw", "print", "walk"], "order": 3475, "emoji": "👣"}, {"tags": ["clue", "crime", "detective", "forensics", "identity", "mystery", "print", "safety", "trace"], "order": 3476, "emoji": "🫆"}, {"tags": ["1–2", "light", "skin", "tone", "type"], "order": 3477, "emoji": "🏻"}, {"tags": ["3", "medium-light", "skin", "tone", "type"], "order": 3478, "emoji": "🏼"}, {"tags": ["4", "medium", "skin", "tone", "type"], "order": 3479, "emoji": "🏽"}, {"tags": ["5", "medium-dark", "skin", "tone", "type"], "order": 3480, "emoji": "🏾"}, {"tags": ["6", "dark", "skin", "tone", "type"], "order": 3481, "emoji": "🏿"}, {"tags": ["ginger", "hair", "red", "redhead"], "order": 3482, "emoji": "🦰"}, {"tags": ["afro", "curly", "hair", "ringlets"], "order": 3483, "emoji": "🦱"}, {"tags": ["gray", "hair", "old", "white"], "order": 3484, "emoji": "🦳"}, {"tags": ["chemotherapy", "hair", "hairless", "no", "shaven"], "order": 3485, "emoji": "🦲"}, {"tags": ["animal", "banana", "face", "monkey"], "order": 3486, "emoji": "🐵"}, {"tags": ["animal", "banana"], "order": 3487, "emoji": "🐒"}, {"tags": ["animal"], "order": 3488, "emoji": "🦍"}, {"tags": ["animal", "ape", "monkey"], "order": 3489, "emoji": "🦧"}, {"tags": ["adorbs", "animal", "dog", "face", "pet", "puppies", "puppy"], "order": 3490, "emoji": "🐶"}, {"tags": ["animal", "animals", "dogs", "pet"], "order": 3491, "emoji": "🐕️"}, {"tags": ["accessibility", "animal", "blind", "dog", "guide"], "order": 3492, "emoji": "🦮"}, {"tags": ["accessibility", "animal", "assistance", "dog", "service"], "order": 3493, "emoji": "🐕‍🦺"}, {"tags": ["animal", "dog", "fluffy"], "order": 3494, "emoji": "🐩"}, {"tags": ["animal", "face"], "order": 3495, "emoji": "🐺"}, {"tags": ["animal", "face"], "order": 3496, "emoji": "🦊"}, {"tags": ["animal", "curious", "sly"], "order": 3497, "emoji": "🦝"}, {"tags": ["animal", "cat", "face", "kitten", "kitty", "pet"], "order": 3498, "emoji": "🐱"}, {"tags": ["animal", "animals", "cats", "kitten", "pet"], "order": 3499, "emoji": "🐈️"}, {"tags": ["animal", "black", "cat", "feline", "halloween", "meow", "unlucky"], "order": 3500, "emoji": "🐈‍⬛"}, {"tags": ["alpha", "animal", "face", "leo", "mane", "order", "rawr", "roar", "safari", "strong", "zodiac"], "order": 3501, "emoji": "🦁"}, {"tags": ["animal", "big", "cat", "face", "predator", "tiger"], "order": 3502, "emoji": "🐯"}, {"tags": ["animal", "big", "cat", "predator", "zoo"], "order": 3503, "emoji": "🐅"}, {"tags": ["animal", "big", "cat", "predator", "zoo"], "order": 3504, "emoji": "🐆"}, {"tags": ["animal", "dressage", "equine", "face", "farm", "horse", "horses"], "order": 3505, "emoji": "🐴"}, {"tags": ["alces", "animal", "antlers", "elk", "mammal"], "order": 3506, "emoji": "🫎"}, {"tags": ["animal", "ass", "burro", "hinny", "mammal", "mule", "stubborn"], "order": 3507, "emoji": "🫏"}, {"tags": ["animal", "equestrian", "farm", "racehorse", "racing"], "order": 3508, "emoji": "🐎"}, {"tags": ["face"], "order": 3509, "emoji": "🦄"}, {"tags": ["animal", "stripe"], "order": 3510, "emoji": "🦓"}, {"tags": ["animal"], "order": 3511, "emoji": "🦌"}, {"tags": ["animal", "buffalo", "herd", "wisent"], "order": 3512, "emoji": "🦬"}, {"tags": ["animal", "cow", "face", "farm", "milk", "moo"], "order": 3513, "emoji": "🐮"}, {"tags": ["animal", "animals", "bull", "farm", "taurus", "zodiac"], "order": 3514, "emoji": "🐂"}, {"tags": ["animal", "buffalo", "water", "zoo"], "order": 3515, "emoji": "🐃"}, {"tags": ["animal", "animals", "farm", "milk", "moo"], "order": 3516, "emoji": "🐄"}, {"tags": ["animal", "bacon", "face", "farm", "pig", "pork"], "order": 3517, "emoji": "🐷"}, {"tags": ["animal", "bacon", "farm", "pork", "sow"], "order": 3518, "emoji": "🐖"}, {"tags": ["animal", "pig"], "order": 3519, "emoji": "🐗"}, {"tags": ["animal", "face", "farm", "nose", "pig", "smell", "snout"], "order": 3520, "emoji": "🐽"}, {"tags": ["animal", "aries", "horns", "male", "sheep", "zodiac", "zoo"], "order": 3521, "emoji": "🐏"}, {"tags": ["animal", "baa", "farm", "female", "fluffy", "lamb", "sheep", "wool"], "order": 3522, "emoji": "🐑"}, {"tags": ["animal", "capricorn", "farm", "milk", "zodiac"], "order": 3523, "emoji": "🐐"}, {"tags": ["animal", "desert", "dromedary", "hump", "one"], "order": 3524, "emoji": "🐪"}, {"tags": ["animal", "bactrian", "camel", "desert", "hump", "two", "two-hump"], "order": 3525, "emoji": "🐫"}, {"tags": ["alpaca", "animal", "guanaco", "vicuña", "wool"], "order": 3526, "emoji": "🦙"}, {"tags": ["animal", "spots"], "order": 3527, "emoji": "🦒"}, {"tags": ["animal"], "order": 3528, "emoji": "🐘"}, {"tags": ["animal", "extinction", "large", "tusk", "wooly"], "order": 3529, "emoji": "🦣"}, {"tags": ["animal"], "order": 3530, "emoji": "🦏"}, {"tags": ["animal", "hippo"], "order": 3531, "emoji": "🦛"}, {"tags": ["animal", "face", "mouse"], "order": 3532, "emoji": "🐭"}, {"tags": ["animal", "animals"], "order": 3533, "emoji": "🐁"}, {"tags": ["animal"], "order": 3534, "emoji": "🐀"}, {"tags": ["animal", "face", "pet"], "order": 3535, "emoji": "🐹"}, {"tags": ["animal", "bunny", "face", "pet", "rabbit"], "order": 3536, "emoji": "🐰"}, {"tags": ["animal", "bunny", "pet"], "order": 3537, "emoji": "🐇"}, {"tags": ["animal", "squirrel"], "order": 3539, "emoji": "🐿️"}, {"tags": ["animal", "dam", "teeth"], "order": 3540, "emoji": "🦫"}, {"tags": ["animal", "spiny"], "order": 3541, "emoji": "🦔"}, {"tags": ["animal", "vampire"], "order": 3542, "emoji": "🦇"}, {"tags": ["animal", "face", "grizzly", "growl", "honey"], "order": 3543, "emoji": "🐻"}, {"tags": ["animal", "arctic", "bear", "polar", "white"], "order": 3544, "emoji": "🐻‍❄️"}, {"tags": ["animal", "australia", "bear", "down", "face", "marsupial", "under"], "order": 3546, "emoji": "🐨"}, {"tags": ["animal", "bamboo", "face"], "order": 3547, "emoji": "🐼"}, {"tags": ["lazy", "slow"], "order": 3548, "emoji": "🦥"}, {"tags": ["animal", "fishing", "playful"], "order": 3549, "emoji": "🦦"}, {"tags": ["animal", "stink"], "order": 3550, "emoji": "🦨"}, {"tags": ["animal", "joey", "jump", "marsupial"], "order": 3551, "emoji": "🦘"}, {"tags": ["animal", "honey", "pester"], "order": 3552, "emoji": "🦡"}, {"tags": ["feet", "paw", "paws", "print", "prints"], "order": 3553, "emoji": "🐾"}, {"tags": ["bird", "gobble", "thanksgiving"], "order": 3554, "emoji": "🦃"}, {"tags": ["animal", "bird", "ornithology"], "order": 3555, "emoji": "🐔"}, {"tags": ["animal", "bird", "ornithology"], "order": 3556, "emoji": "🐓"}, {"tags": ["animal", "baby", "bird", "chick", "egg", "hatching"], "order": 3557, "emoji": "🐣"}, {"tags": ["animal", "baby", "bird", "chick", "ornithology"], "order": 3558, "emoji": "🐤"}, {"tags": ["animal", "baby", "bird", "chick", "front-facing", "newborn", "ornithology"], "order": 3559, "emoji": "🐥"}, {"tags": ["animal", "ornithology"], "order": 3560, "emoji": "🐦️"}, {"tags": ["animal", "antarctica", "bird", "ornithology"], "order": 3561, "emoji": "🐧"}, {"tags": ["bird", "fly", "ornithology", "peace"], "order": 3563, "emoji": "🕊️"}, {"tags": ["animal", "bird", "ornithology"], "order": 3564, "emoji": "🦅"}, {"tags": ["animal", "bird", "ornithology"], "order": 3565, "emoji": "🦆"}, {"tags": ["animal", "bird", "cygnet", "duckling", "ornithology", "ugly"], "order": 3566, "emoji": "🦢"}, {"tags": ["animal", "bird", "ornithology", "wise"], "order": 3567, "emoji": "🦉"}, {"tags": ["animal", "bird", "extinction", "large", "ornithology"], "order": 3568, "emoji": "🦤"}, {"tags": ["bird", "flight", "light", "plumage"], "order": 3569, "emoji": "🪶"}, {"tags": ["animal", "bird", "flamboyant", "ornithology", "tropical"], "order": 3570, "emoji": "🦩"}, {"tags": ["animal", "bird", "colorful", "ornithology", "ostentatious", "peahen", "pretty", "proud"], "order": 3571, "emoji": "🦚"}, {"tags": ["animal", "bird", "ornithology", "pirate", "talk"], "order": 3572, "emoji": "🦜"}, {"tags": ["angelic", "ascend", "aviation", "bird", "fly", "flying", "heavenly", "mythology", "soar"], "order": 3573, "emoji": "🪽"}, {"tags": ["animal", "beak", "bird", "black", "caw", "corvid", "crow", "ornithology", "raven", "rook"], "order": 3574, "emoji": "🐦‍⬛"}, {"tags": ["animal", "bird", "duck", "flock", "fowl", "gaggle", "gander", "geese", "honk", "ornithology", "silly"], "order": 3575, "emoji": "🪿"}, {"tags": ["ascend", "ascension", "emerge", "fantasy", "firebird", "glory", "immortal", "rebirth", "reincarnation", "reinvent", "renewal", "revival", "revive", "rise", "transform"], "order": 3576, "emoji": "🐦‍🔥"}, {"tags": ["animal", "face"], "order": 3577, "emoji": "🐸"}, {"tags": ["animal", "zoo"], "order": 3578, "emoji": "🐊"}, {"tags": ["animal", "terrapin", "tortoise"], "order": 3579, "emoji": "🐢"}, {"tags": ["animal", "reptile"], "order": 3580, "emoji": "🦎"}, {"tags": ["animal", "bearer", "ophiuchus", "serpent", "zodiac"], "order": 3581, "emoji": "🐍"}, {"tags": ["animal", "dragon", "face", "fairy", "fairytale", "tale"], "order": 3582, "emoji": "🐲"}, {"tags": ["animal", "fairy", "fairytale", "knights", "tale"], "order": 3583, "emoji": "🐉"}, {"tags": ["brachiosaurus", "brontosaurus", "dinosaur", "diplodocus"], "order": 3584, "emoji": "🦕"}, {"tags": ["dinosaur", "rex", "t", "t-rex", "tyrannosaurus"], "order": 3585, "emoji": "🦖"}, {"tags": ["animal", "beach", "face", "ocean", "spouting", "whale"], "order": 3586, "emoji": "🐳"}, {"tags": ["animal", "beach", "ocean"], "order": 3587, "emoji": "🐋"}, {"tags": ["animal", "beach", "flipper", "ocean"], "order": 3588, "emoji": "🐬"}, {"tags": ["animal", "lion", "ocean", "sea"], "order": 3589, "emoji": "🦭"}, {"tags": ["animal", "dinner", "fishes", "fishing", "pisces", "zodiac"], "order": 3590, "emoji": "🐟️"}, {"tags": ["animal", "fish", "fishes", "tropical"], "order": 3591, "emoji": "🐠"}, {"tags": ["animal", "fish"], "order": 3592, "emoji": "🐡"}, {"tags": ["animal", "fish"], "order": 3593, "emoji": "🦈"}, {"tags": ["animal", "creature", "ocean"], "order": 3594, "emoji": "🐙"}, {"tags": ["animal", "beach", "conch", "sea", "shell", "spiral"], "order": 3595, "emoji": "🐚"}, {"tags": ["change", "climate", "ocean", "reef", "sea"], "order": 3596, "emoji": "🪸"}, {"tags": ["animal", "aquarium", "burn", "invertebrate", "jelly", "life", "marine", "ocean", "ouch", "plankton", "sea", "sting", "stinger", "tentacles"], "order": 3597, "emoji": "🪼"}, {"tags": ["cancer", "zodiac"], "order": 3598, "emoji": "🦀"}, {"tags": ["animal", "bisque", "claws", "seafood"], "order": 3599, "emoji": "🦞"}, {"tags": ["food", "shellfish", "small"], "order": 3600, "emoji": "🦐"}, {"tags": ["animal", "food", "mollusk"], "order": 3601, "emoji": "🦑"}, {"tags": ["diving", "pearl"], "order": 3602, "emoji": "🦪"}, {"tags": ["animal", "escargot", "garden", "nature", "slug"], "order": 3603, "emoji": "🐌"}, {"tags": ["insect", "pretty"], "order": 3604, "emoji": "🦋"}, {"tags": ["animal", "garden", "insect"], "order": 3605, "emoji": "🐛"}, {"tags": ["animal", "garden", "insect"], "order": 3606, "emoji": "🐜"}, {"tags": ["animal", "bee", "bumblebee", "honey", "insect", "nature", "spring"], "order": 3607, "emoji": "🐝"}, {"tags": ["animal", "bug", "insect"], "order": 3608, "emoji": "🪲"}, {"tags": ["animal", "beetle", "garden", "insect", "lady", "ladybird", "ladybug", "nature"], "order": 3609, "emoji": "🐞"}, {"tags": ["animal", "bug", "grasshopper", "insect", "orthoptera"], "order": 3610, "emoji": "🦗"}, {"tags": ["animal", "insect", "pest", "roach"], "order": 3611, "emoji": "🪳"}, {"tags": ["animal", "insect"], "order": 3613, "emoji": "🕷️"}, {"tags": ["spider", "web"], "order": 3615, "emoji": "🕸️"}, {"tags": ["scorpio", "scorpius", "zodiac"], "order": 3616, "emoji": "🦂"}, {"tags": ["bite", "disease", "fever", "insect", "malaria", "pest", "virus"], "order": 3617, "emoji": "🦟"}, {"tags": ["animal", "disease", "insect", "maggot", "pest", "rotting"], "order": 3618, "emoji": "🪰"}, {"tags": ["animal", "annelid", "earthworm", "parasite"], "order": 3619, "emoji": "🪱"}, {"tags": ["amoeba", "bacteria", "science", "virus"], "order": 3620, "emoji": "🦠"}, {"tags": ["anniversary", "birthday", "date", "flower", "love", "plant", "romance"], "order": 3621, "emoji": "💐"}, {"tags": ["blossom", "cherry", "flower", "plant", "spring", "springtime"], "order": 3622, "emoji": "🌸"}, {"tags": ["flower", "white"], "order": 3623, "emoji": "💮"}, {"tags": ["beauty", "buddhism", "calm", "flower", "hinduism", "peace", "purity", "serenity"], "order": 3624, "emoji": "🪷"}, {"tags": ["plant"], "order": 3626, "emoji": "🏵️"}, {"tags": ["beauty", "elegant", "flower", "love", "plant", "red", "valentine"], "order": 3627, "emoji": "🌹"}, {"tags": ["dying", "flower", "wilted"], "order": 3628, "emoji": "🥀"}, {"tags": ["flower", "plant"], "order": 3629, "emoji": "🌺"}, {"tags": ["flower", "outdoors", "plant", "sun"], "order": 3630, "emoji": "🌻"}, {"tags": ["buttercup", "dandelion", "flower", "plant"], "order": 3631, "emoji": "🌼"}, {"tags": ["blossom", "flower", "growth", "plant"], "order": 3632, "emoji": "🌷"}, {"tags": ["bloom", "bluebonnet", "flower", "indigo", "lavender", "lilac", "lupine", "plant", "purple", "shrub", "snapdragon", "spring", "violet"], "order": 3633, "emoji": "🪻"}, {"tags": ["plant", "sapling", "sprout", "young"], "order": 3634, "emoji": "🌱"}, {"tags": ["decor", "grow", "house", "nurturing", "plant", "pot", "potted"], "order": 3635, "emoji": "🪴"}, {"tags": ["christmas", "evergreen", "forest", "pine", "tree"], "order": 3636, "emoji": "🌲"}, {"tags": ["deciduous", "forest", "green", "habitat", "shedding", "tree"], "order": 3637, "emoji": "🌳"}, {"tags": ["beach", "palm", "plant", "tree", "tropical"], "order": 3638, "emoji": "🌴"}, {"tags": ["desert", "drought", "nature", "plant"], "order": 3639, "emoji": "🌵"}, {"tags": ["ear", "grain", "grains", "plant", "rice", "sheaf"], "order": 3640, "emoji": "🌾"}, {"tags": ["leaf", "plant"], "order": 3641, "emoji": "🌿"}, {"tags": ["irish", "plant"], "order": 3643, "emoji": "☘️"}, {"tags": ["4", "clover", "four", "four-leaf", "irish", "leaf", "lucky", "plant"], "order": 3644, "emoji": "🍀"}, {"tags": ["falling", "leaf", "maple"], "order": 3645, "emoji": "🍁"}, {"tags": ["autumn", "fall", "fallen", "falling", "leaf"], "order": 3646, "emoji": "🍂"}, {"tags": ["blow", "flutter", "fluttering", "leaf", "wind"], "order": 3647, "emoji": "🍃"}, {"tags": ["branch", "empty", "home", "nest", "nesting"], "order": 3648, "emoji": "🪹"}, {"tags": ["bird", "branch", "egg", "eggs", "nest", "nesting"], "order": 3649, "emoji": "🪺"}, {"tags": ["fungus", "toadstool"], "order": 3650, "emoji": "🍄"}, {"tags": ["bare", "barren", "branches", "dead", "drought", "leafless", "tree", "trunk", "winter", "wood"], "order": 3651, "emoji": "🪾"}, {"tags": ["dionysus", "fruit", "grape"], "order": 3652, "emoji": "🍇"}, {"tags": ["cantaloupe", "fruit"], "order": 3653, "emoji": "🍈"}, {"tags": ["fruit"], "order": 3654, "emoji": "🍉"}, {"tags": ["c", "citrus", "fruit", "nectarine", "orange", "vitamin"], "order": 3655, "emoji": "🍊"}, {"tags": ["citrus", "fruit", "sour"], "order": 3656, "emoji": "🍋"}, {"tags": ["acidity", "citrus", "cocktail", "fruit", "garnish", "key", "margarita", "mojito", "refreshing", "salsa", "sour", "tangy", "tequila", "tropical", "zest"], "order": 3657, "emoji": "🍋‍🟩"}, {"tags": ["fruit", "potassium"], "order": 3658, "emoji": "🍌"}, {"tags": ["colada", "fruit", "pina", "tropical"], "order": 3659, "emoji": "🍍"}, {"tags": ["food", "fruit", "tropical"], "order": 3660, "emoji": "🥭"}, {"tags": ["apple", "diet", "food", "fruit", "health", "red", "ripe"], "order": 3661, "emoji": "🍎"}, {"tags": ["apple", "fruit", "green"], "order": 3662, "emoji": "🍏"}, {"tags": ["fruit"], "order": 3663, "emoji": "🍐"}, {"tags": ["fruit"], "order": 3664, "emoji": "🍑"}, {"tags": ["berries", "cherry", "fruit", "red"], "order": 3665, "emoji": "🍒"}, {"tags": ["berry", "fruit"], "order": 3666, "emoji": "🍓"}, {"tags": ["berries", "berry", "bilberry", "blue", "blueberry", "food", "fruit"], "order": 3667, "emoji": "🫐"}, {"tags": ["food", "fruit", "kiwi"], "order": 3668, "emoji": "🥝"}, {"tags": ["food", "fruit", "vegetable"], "order": 3669, "emoji": "🍅"}, {"tags": ["food"], "order": 3670, "emoji": "🫒"}, {"tags": ["colada", "palm", "piña"], "order": 3671, "emoji": "🥥"}, {"tags": ["food", "fruit"], "order": 3672, "emoji": "🥑"}, {"tags": ["aubergine", "vegetable"], "order": 3673, "emoji": "🍆"}, {"tags": ["food", "vegetable"], "order": 3674, "emoji": "🥔"}, {"tags": ["food", "vegetable"], "order": 3675, "emoji": "🥕"}, {"tags": ["corn", "crops", "ear", "farm", "maize", "maze"], "order": 3676, "emoji": "🌽"}, {"tags": ["hot", "pepper"], "order": 3678, "emoji": "🌶️"}, {"tags": ["bell", "capsicum", "food", "pepper", "vegetable"], "order": 3679, "emoji": "🫑"}, {"tags": ["food", "pickle", "vegetable"], "order": 3680, "emoji": "🥒"}, {"tags": ["bok", "burgers", "cabbage", "choy", "green", "kale", "leafy", "lettuce", "salad"], "order": 3681, "emoji": "🥬"}, {"tags": ["cabbage", "wild"], "order": 3682, "emoji": "🥦"}, {"tags": ["flavoring"], "order": 3683, "emoji": "🧄"}, {"tags": ["flavoring"], "order": 3684, "emoji": "🧅"}, {"tags": ["food", "nut", "peanut", "vegetable"], "order": 3685, "emoji": "🥜"}, {"tags": ["food", "kidney", "legume", "small"], "order": 3686, "emoji": "🫘"}, {"tags": ["almond", "plant"], "order": 3687, "emoji": "🌰"}, {"tags": ["beer", "ginger", "health", "herb", "natural", "root", "spice"], "order": 3688, "emoji": "🫚"}, {"tags": ["beans", "beanstalk", "edamame", "legume", "pea", "pod", "soybean", "vegetable", "veggie"], "order": 3689, "emoji": "🫛"}, {"tags": ["food", "fungi", "fungus", "mushroom", "nature", "pizza", "portobello", "shiitake", "shroom", "spore", "sprout", "toppings", "truffle", "vegetable", "vegetarian", "veggie"], "order": 3690, "emoji": "🍄‍🟫"}, {"tags": ["beet", "food", "garden", "radish", "root", "salad", "turnip", "vegetable", "vegetarian"], "order": 3691, "emoji": "🫜"}, {"tags": ["carbs", "food", "grain", "loaf", "restaurant", "toast", "wheat"], "order": 3692, "emoji": "🍞"}, {"tags": ["bread", "breakfast", "crescent", "food", "french", "roll"], "order": 3693, "emoji": "🥐"}, {"tags": ["baguette", "bread", "food", "french"], "order": 3694, "emoji": "🥖"}, {"tags": ["arepa", "bread", "food", "gordita", "lavash", "naan", "pita"], "order": 3695, "emoji": "🫓"}, {"tags": ["convoluted", "twisted"], "order": 3696, "emoji": "🥨"}, {"tags": ["bakery", "bread", "breakfast", "schmear"], "order": 3697, "emoji": "🥯"}, {"tags": ["breakfast", "crêpe", "food", "hotcake", "pancake"], "order": 3698, "emoji": "🥞"}, {"tags": ["breakfast", "indecisive", "iron"], "order": 3699, "emoji": "🧇"}, {"tags": ["cheese", "wedge"], "order": 3700, "emoji": "🧀"}, {"tags": ["bone", "meat"], "order": 3701, "emoji": "🍖"}, {"tags": ["bone", "chicken", "drumstick", "hungry", "leg", "poultry", "turkey"], "order": 3702, "emoji": "🍗"}, {"tags": ["chop", "cut", "lambchop", "meat", "porkchop", "red", "steak"], "order": 3703, "emoji": "🥩"}, {"tags": ["breakfast", "food", "meat"], "order": 3704, "emoji": "🥓"}, {"tags": ["burger", "eat", "fast", "food", "hungry"], "order": 3705, "emoji": "🍔"}, {"tags": ["fast", "food", "french", "fries"], "order": 3706, "emoji": "🍟"}, {"tags": ["cheese", "food", "hungry", "pepperoni", "slice"], "order": 3707, "emoji": "🍕"}, {"tags": ["dog", "frankfurter", "hot", "hotdog", "sausage"], "order": 3708, "emoji": "🌭"}, {"tags": ["bread"], "order": 3709, "emoji": "🥪"}, {"tags": ["mexican"], "order": 3710, "emoji": "🌮"}, {"tags": ["mexican", "wrap"], "order": 3711, "emoji": "🌯"}, {"tags": ["food", "mexican", "pamonha", "wrapped"], "order": 3712, "emoji": "🫔"}, {"tags": ["falafel", "flatbread", "food", "gyro", "kebab", "stuffed"], "order": 3713, "emoji": "🥙"}, {"tags": ["chickpea", "meatball"], "order": 3714, "emoji": "🧆"}, {"tags": ["breakfast", "food"], "order": 3715, "emoji": "🥚"}, {"tags": ["breakfast", "easy", "egg", "fry", "frying", "over", "pan", "restaurant", "side", "sunny", "up"], "order": 3716, "emoji": "🍳"}, {"tags": ["casserole", "food", "paella", "pan", "shallow"], "order": 3717, "emoji": "🥘"}, {"tags": ["food", "pot", "soup", "stew"], "order": 3718, "emoji": "🍲"}, {"tags": ["cheese", "chocolate", "food", "melted", "pot", "ski"], "order": 3719, "emoji": "🫕"}, {"tags": ["bowl", "breakfast", "cereal", "congee", "oatmeal", "porridge", "spoon"], "order": 3720, "emoji": "🥣"}, {"tags": ["food", "green", "salad"], "order": 3721, "emoji": "🥗"}, {"tags": ["corn", "movie", "pop"], "order": 3722, "emoji": "🍿"}, {"tags": ["dairy"], "order": 3723, "emoji": "🧈"}, {"tags": ["condiment", "flavor", "mad", "salty", "shaker", "taste", "upset"], "order": 3724, "emoji": "🧂"}, {"tags": ["can", "canned", "food"], "order": 3725, "emoji": "🥫"}, {"tags": ["bento", "box", "food"], "order": 3726, "emoji": "🍱"}, {"tags": ["cracker", "food", "rice"], "order": 3727, "emoji": "🍘"}, {"tags": ["ball", "food", "japanese", "rice"], "order": 3728, "emoji": "🍙"}, {"tags": ["cooked", "food", "rice"], "order": 3729, "emoji": "🍚"}, {"tags": ["curry", "food", "rice"], "order": 3730, "emoji": "🍛"}, {"tags": ["bowl", "chopsticks", "food", "noodle", "pho", "ramen", "soup", "steaming"], "order": 3731, "emoji": "🍜"}, {"tags": ["food", "meatballs", "pasta", "restaurant"], "order": 3732, "emoji": "🍝"}, {"tags": ["food", "potato", "roasted", "sweet"], "order": 3733, "emoji": "🍠"}, {"tags": ["food", "kebab", "restaurant", "seafood", "skewer", "stick"], "order": 3734, "emoji": "🍢"}, {"tags": ["food"], "order": 3735, "emoji": "🍣"}, {"tags": ["fried", "prawn", "shrimp", "tempura"], "order": 3736, "emoji": "🍤"}, {"tags": ["cake", "fish", "food", "pastry", "restaurant", "swirl"], "order": 3737, "emoji": "🍥"}, {"tags": ["autumn", "cake", "festival", "moon", "yuèbǐng"], "order": 3738, "emoji": "🥮"}, {"tags": ["dessert", "japanese", "skewer", "stick", "sweet"], "order": 3739, "emoji": "🍡"}, {"tags": ["empanada", "gyōza", "jiaozi", "pierogi", "potsticker"], "order": 3740, "emoji": "🥟"}, {"tags": ["cookie", "fortune", "prophecy"], "order": 3741, "emoji": "🥠"}, {"tags": ["box", "chopsticks", "delivery", "food", "oyster", "pail", "takeout"], "order": 3742, "emoji": "🥡"}, {"tags": ["cream", "dessert", "food", "ice", "icecream", "restaurant", "serve", "soft", "sweet"], "order": 3743, "emoji": "🍦"}, {"tags": ["dessert", "ice", "restaurant", "shaved", "sweet"], "order": 3744, "emoji": "🍧"}, {"tags": ["cream", "dessert", "food", "ice", "restaurant", "sweet"], "order": 3745, "emoji": "🍨"}, {"tags": ["breakfast", "dessert", "donut", "food", "sweet"], "order": 3746, "emoji": "🍩"}, {"tags": ["chip", "chocolate", "dessert", "sweet"], "order": 3747, "emoji": "🍪"}, {"tags": ["bday", "birthday", "cake", "celebration", "dessert", "happy", "pastry", "sweet"], "order": 3748, "emoji": "🎂"}, {"tags": ["cake", "dessert", "pastry", "slice", "sweet"], "order": 3749, "emoji": "🍰"}, {"tags": ["bakery", "dessert", "sprinkles", "sugar", "sweet", "treat"], "order": 3750, "emoji": "🧁"}, {"tags": ["apple", "filling", "fruit", "meat", "pastry", "pumpkin", "slice"], "order": 3751, "emoji": "🥧"}, {"tags": ["bar", "candy", "chocolate", "dessert", "halloween", "sweet", "tooth"], "order": 3752, "emoji": "🍫"}, {"tags": ["cavities", "dessert", "halloween", "restaurant", "sweet", "tooth", "wrapper"], "order": 3753, "emoji": "🍬"}, {"tags": ["candy", "dessert", "food", "restaurant", "sweet"], "order": 3754, "emoji": "🍭"}, {"tags": ["dessert", "pudding", "sweet"], "order": 3755, "emoji": "🍮"}, {"tags": ["barrel", "bear", "food", "honey", "honeypot", "jar", "pot", "sweet"], "order": 3756, "emoji": "🍯"}, {"tags": ["babies", "baby", "birth", "born", "bottle", "drink", "infant", "milk", "newborn"], "order": 3757, "emoji": "🍼"}, {"tags": ["drink", "glass", "milk"], "order": 3758, "emoji": "🥛"}, {"tags": ["beverage", "cafe", "caffeine", "chai", "coffee", "drink", "hot", "morning", "steaming", "tea"], "order": 3759, "emoji": "☕️"}, {"tags": ["brew", "drink", "food", "pot", "tea"], "order": 3760, "emoji": "🫖"}, {"tags": ["beverage", "cup", "drink", "handle", "oolong", "tea", "teacup"], "order": 3761, "emoji": "🍵"}, {"tags": ["bar", "beverage", "bottle", "cup", "drink", "restaurant"], "order": 3762, "emoji": "🍶"}, {"tags": ["bar", "bottle", "cork", "drink", "popping"], "order": 3763, "emoji": "🍾"}, {"tags": ["alcohol", "bar", "beverage", "booze", "club", "drink", "drinking", "drinks", "glass", "restaurant", "wine"], "order": 3764, "emoji": "🍷"}, {"tags": ["alcohol", "bar", "booze", "club", "cocktail", "drink", "drinking", "drinks", "glass", "mad", "martini", "men"], "order": 3765, "emoji": "🍸️"}, {"tags": ["alcohol", "bar", "booze", "club", "cocktail", "drink", "drinking", "drinks", "drunk", "mai", "party", "tai", "tropical", "tropics"], "order": 3766, "emoji": "🍹"}, {"tags": ["alcohol", "ale", "bar", "beer", "booze", "drink", "drinking", "drinks", "mug", "octoberfest", "oktoberfest", "pint", "stein", "summer"], "order": 3767, "emoji": "🍺"}, {"tags": ["alcohol", "bar", "beer", "booze", "bottoms", "cheers", "clink", "clinking", "drinking", "drinks", "mugs"], "order": 3768, "emoji": "🍻"}, {"tags": ["celebrate", "clink", "clinking", "drink", "glass", "glasses"], "order": 3769, "emoji": "🥂"}, {"tags": ["glass", "liquor", "scotch", "shot", "tumbler", "whiskey", "whisky"], "order": 3770, "emoji": "🥃"}, {"tags": ["accident", "drink", "empty", "glass", "liquid", "oops", "pour", "pouring", "spill", "water"], "order": 3771, "emoji": "🫗"}, {"tags": ["cup", "drink", "juice", "malt", "soda", "soft", "straw", "water"], "order": 3772, "emoji": "🥤"}, {"tags": ["boba", "bubble", "food", "milk", "pearl", "tea"], "order": 3773, "emoji": "🧋"}, {"tags": ["beverage", "box", "juice", "straw", "sweet"], "order": 3774, "emoji": "🧃"}, {"tags": ["drink"], "order": 3775, "emoji": "🧉"}, {"tags": ["cold", "cube", "iceberg"], "order": 3776, "emoji": "🧊"}, {"tags": ["hashi", "jeotgarak", "kuaizi"], "order": 3777, "emoji": "🥢"}, {"tags": ["cooking", "dinner", "eat", "fork", "knife", "plate"], "order": 3779, "emoji": "🍽️"}, {"tags": ["breakfast", "breaky", "cooking", "cutlery", "delicious", "dinner", "eat", "feed", "food", "fork", "hungry", "knife", "lunch", "restaurant", "yum", "yummy"], "order": 3780, "emoji": "🍴"}, {"tags": ["eat", "tableware"], "order": 3781, "emoji": "🥄"}, {"tags": ["chef", "cooking", "hocho", "kitchen", "knife", "tool", "weapon"], "order": 3782, "emoji": "🔪"}, {"tags": ["condiment", "container", "empty", "nothing", "sauce", "store"], "order": 3783, "emoji": "🫙"}, {"tags": ["aquarius", "cooking", "drink", "jug", "tool", "weapon", "zodiac"], "order": 3784, "emoji": "🏺"}, {"tags": ["africa", "earth", "europe", "europe-africa", "globe", "showing", "world"], "order": 3785, "emoji": "🌍️"}, {"tags": ["americas", "earth", "globe", "showing", "world"], "order": 3786, "emoji": "🌎️"}, {"tags": ["asia", "asia-australia", "australia", "earth", "globe", "showing", "world"], "order": 3787, "emoji": "🌏️"}, {"tags": ["earth", "globe", "internet", "meridians", "web", "world", "worldwide"], "order": 3788, "emoji": "🌐"}, {"tags": ["map", "world"], "order": 3790, "emoji": "🗺️"}, {"tags": ["japan", "map"], "order": 3791, "emoji": "🗾"}, {"tags": ["direction", "magnetic", "navigation", "orienteering"], "order": 3792, "emoji": "🧭"}, {"tags": ["cold", "mountain", "snow", "snow-capped"], "order": 3794, "emoji": "🏔️"}, {"tags": ["mountain"], "order": 3796, "emoji": "⛰️"}, {"tags": ["eruption", "mountain", "nature"], "order": 3797, "emoji": "🌋"}, {"tags": ["fuji", "mount", "mountain", "nature"], "order": 3798, "emoji": "🗻"}, {"tags": ["camping"], "order": 3800, "emoji": "🏕️"}, {"tags": ["beach", "umbrella"], "order": 3802, "emoji": "🏖️"}, {"tags": ["desert"], "order": 3804, "emoji": "🏜️"}, {"tags": ["desert", "island"], "order": 3806, "emoji": "🏝️"}, {"tags": ["national", "park"], "order": 3808, "emoji": "🏞️"}, {"tags": ["stadium"], "order": 3810, "emoji": "🏟️"}, {"tags": ["building", "classical"], "order": 3812, "emoji": "🏛️"}, {"tags": ["building", "construction", "crane"], "order": 3814, "emoji": "🏗️"}, {"tags": ["bricks", "clay", "mortar", "wall"], "order": 3815, "emoji": "🧱"}, {"tags": ["boulder", "heavy", "solid", "stone", "tough"], "order": 3816, "emoji": "🪨"}, {"tags": ["log", "lumber", "timber"], "order": 3817, "emoji": "🪵"}, {"tags": ["home", "house", "roundhouse", "shelter", "yurt"], "order": 3818, "emoji": "🛖"}, {"tags": ["house"], "order": 3820, "emoji": "🏘️"}, {"tags": ["derelict", "home", "house"], "order": 3822, "emoji": "🏚️"}, {"tags": ["building", "country", "heart", "home", "ranch", "settle", "simple", "suburban", "suburbia", "where"], "order": 3823, "emoji": "🏠️"}, {"tags": ["building", "country", "garden", "heart", "home", "house", "ranch", "settle", "simple", "suburban", "suburbia", "where"], "order": 3824, "emoji": "🏡"}, {"tags": ["building", "city", "cubical", "job", "office"], "order": 3825, "emoji": "🏢"}, {"tags": ["building", "japanese", "office", "post"], "order": 3826, "emoji": "🏣"}, {"tags": ["building", "european", "office", "post"], "order": 3827, "emoji": "🏤"}, {"tags": ["building", "doctor", "medicine"], "order": 3828, "emoji": "🏥"}, {"tags": ["building"], "order": 3829, "emoji": "🏦"}, {"tags": ["building"], "order": 3830, "emoji": "🏨"}, {"tags": ["building", "hotel", "love"], "order": 3831, "emoji": "🏩"}, {"tags": ["24", "building", "convenience", "hours", "store"], "order": 3832, "emoji": "🏪"}, {"tags": ["building"], "order": 3833, "emoji": "🏫"}, {"tags": ["building", "department", "store"], "order": 3834, "emoji": "🏬"}, {"tags": ["building"], "order": 3835, "emoji": "🏭️"}, {"tags": ["building", "castle", "japanese"], "order": 3836, "emoji": "🏯"}, {"tags": ["building", "european"], "order": 3837, "emoji": "🏰"}, {"tags": ["chapel", "hitched", "nuptials", "romance"], "order": 3838, "emoji": "💒"}, {"tags": ["tokyo", "tower"], "order": 3839, "emoji": "🗼"}, {"tags": ["liberty", "new", "ny", "nyc", "statue", "york"], "order": 3840, "emoji": "🗽"}, {"tags": ["bless", "chapel", "christian", "cross", "religion"], "order": 3841, "emoji": "⛪️"}, {"tags": ["islam", "masjid", "muslim", "religion"], "order": 3842, "emoji": "🕌"}, {"tags": ["hindu", "temple"], "order": 3843, "emoji": "🛕"}, {"tags": ["jew", "jewish", "judaism", "religion", "temple"], "order": 3844, "emoji": "🕍"}, {"tags": ["religion", "shinto", "shrine"], "order": 3846, "emoji": "⛩️"}, {"tags": ["hajj", "islam", "muslim", "religion", "umrah"], "order": 3847, "emoji": "🕋"}, {"tags": ["fountain"], "order": 3848, "emoji": "⛲️"}, {"tags": ["camping"], "order": 3849, "emoji": "⛺️"}, {"tags": ["fog"], "order": 3850, "emoji": "🌁"}, {"tags": ["night", "star", "stars"], "order": 3851, "emoji": "🌃"}, {"tags": ["city"], "order": 3853, "emoji": "🏙️"}, {"tags": ["morning", "mountains", "over", "sun", "sunrise"], "order": 3854, "emoji": "🌄"}, {"tags": ["morning", "nature", "sun"], "order": 3855, "emoji": "🌅"}, {"tags": ["at", "building", "city", "cityscape", "dusk", "evening", "landscape", "sun", "sunset"], "order": 3856, "emoji": "🌆"}, {"tags": ["building", "dusk", "sun"], "order": 3857, "emoji": "🌇"}, {"tags": ["at", "bridge", "night"], "order": 3858, "emoji": "🌉"}, {"tags": ["hot", "hotsprings", "springs", "steaming"], "order": 3860, "emoji": "♨️"}, {"tags": ["carousel", "entertainment", "horse"], "order": 3861, "emoji": "🎠"}, {"tags": ["amusement", "park", "play", "playground", "playing", "slide", "sliding", "theme"], "order": 3862, "emoji": "🛝"}, {"tags": ["amusement", "ferris", "park", "theme", "wheel"], "order": 3863, "emoji": "🎡"}, {"tags": ["amusement", "coaster", "park", "roller", "theme"], "order": 3864, "emoji": "🎢"}, {"tags": ["barber", "cut", "fresh", "haircut", "pole", "shave"], "order": 3865, "emoji": "💈"}, {"tags": ["circus", "tent"], "order": 3866, "emoji": "🎪"}, {"tags": ["caboose", "engine", "railway", "steam", "train", "trains", "travel"], "order": 3867, "emoji": "🚂"}, {"tags": ["car", "electric", "railway", "train", "tram", "travel", "trolleybus"], "order": 3868, "emoji": "🚃"}, {"tags": ["high-speed", "railway", "shinkansen", "speed", "train"], "order": 3869, "emoji": "🚄"}, {"tags": ["bullet", "high-speed", "nose", "railway", "shinkansen", "speed", "train", "travel"], "order": 3870, "emoji": "🚅"}, {"tags": ["arrived", "choo", "railway"], "order": 3871, "emoji": "🚆"}, {"tags": ["subway", "travel"], "order": 3872, "emoji": "🚇️"}, {"tags": ["arrived", "light", "monorail", "rail", "railway"], "order": 3873, "emoji": "🚈"}, {"tags": ["railway", "train"], "order": 3874, "emoji": "🚉"}, {"tags": ["trolleybus"], "order": 3875, "emoji": "🚊"}, {"tags": ["vehicle"], "order": 3876, "emoji": "🚝"}, {"tags": ["car", "mountain", "railway", "trip"], "order": 3877, "emoji": "🚞"}, {"tags": ["bus", "car", "tram", "trolley", "trolleybus"], "order": 3878, "emoji": "🚋"}, {"tags": ["school", "vehicle"], "order": 3879, "emoji": "🚌"}, {"tags": ["bus", "cars", "oncoming"], "order": 3880, "emoji": "🚍️"}, {"tags": ["bus", "tram", "trolley"], "order": 3881, "emoji": "🚎"}, {"tags": ["bus", "drive", "van", "vehicle"], "order": 3882, "emoji": "🚐"}, {"tags": ["emergency", "vehicle"], "order": 3883, "emoji": "🚑️"}, {"tags": ["engine", "fire", "truck"], "order": 3884, "emoji": "🚒"}, {"tags": ["5–0", "car", "cops", "patrol", "police"], "order": 3885, "emoji": "🚓"}, {"tags": ["car", "oncoming", "police"], "order": 3886, "emoji": "🚔️"}, {"tags": ["cab", "cabbie", "car", "drive", "vehicle", "yellow"], "order": 3887, "emoji": "🚕"}, {"tags": ["cab", "cabbie", "cars", "drove", "hail", "oncoming", "taxi", "yellow"], "order": 3888, "emoji": "🚖"}, {"tags": ["car", "driving", "vehicle"], "order": 3889, "emoji": "🚗"}, {"tags": ["automobile", "car", "cars", "drove", "oncoming", "vehicle"], "order": 3890, "emoji": "🚘️"}, {"tags": ["car", "drive", "recreational", "sport", "sportutility", "utility", "vehicle"], "order": 3891, "emoji": "🚙"}, {"tags": ["automobile", "car", "flatbed", "pick-up", "pickup", "transportation", "truck"], "order": 3892, "emoji": "🛻"}, {"tags": ["car", "delivery", "drive", "truck", "vehicle"], "order": 3893, "emoji": "🚚"}, {"tags": ["articulated", "car", "drive", "lorry", "move", "semi", "truck", "vehicle"], "order": 3894, "emoji": "🚛"}, {"tags": ["vehicle"], "order": 3895, "emoji": "🚜"}, {"tags": ["car", "racing", "zoom"], "order": 3897, "emoji": "🏎️"}, {"tags": ["racing"], "order": 3899, "emoji": "🏍️"}, {"tags": ["motor", "scooter"], "order": 3900, "emoji": "🛵"}, {"tags": ["accessibility", "manual", "wheelchair"], "order": 3901, "emoji": "🦽"}, {"tags": ["accessibility", "motorized", "wheelchair"], "order": 3902, "emoji": "🦼"}, {"tags": ["auto", "rickshaw", "tuk"], "order": 3903, "emoji": "🛺"}, {"tags": ["bike", "class", "cycle", "cycling", "cyclist", "gang", "ride", "spin", "spinning"], "order": 3904, "emoji": "🚲️"}, {"tags": ["kick", "scooter"], "order": 3905, "emoji": "🛴"}, {"tags": ["board", "skate", "skater", "wheels"], "order": 3906, "emoji": "🛹"}, {"tags": ["blades", "roller", "skate", "skates", "sport"], "order": 3907, "emoji": "🛼"}, {"tags": ["bus", "busstop", "stop"], "order": 3908, "emoji": "🚏"}, {"tags": ["highway", "road"], "order": 3910, "emoji": "🛣️"}, {"tags": ["railway", "track", "train"], "order": 3912, "emoji": "🛤️"}, {"tags": ["drum", "oil"], "order": 3914, "emoji": "🛢️"}, {"tags": ["diesel", "fuel", "fuelpump", "gas", "gasoline", "pump", "station"], "order": 3915, "emoji": "⛽️"}, {"tags": ["car", "circle", "tire", "turn", "vehicle"], "order": 3916, "emoji": "🛞"}, {"tags": ["alarm", "alert", "beacon", "car", "emergency", "light", "police", "revolving", "siren"], "order": 3917, "emoji": "🚨"}, {"tags": ["horizontal", "intersection", "light", "signal", "stop", "stoplight", "traffic"], "order": 3918, "emoji": "🚥"}, {"tags": ["drove", "intersection", "light", "signal", "stop", "stoplight", "traffic", "vertical"], "order": 3919, "emoji": "🚦"}, {"tags": ["octagonal", "sign", "stop"], "order": 3920, "emoji": "🛑"}, {"tags": ["barrier"], "order": 3921, "emoji": "🚧"}, {"tags": ["ship", "tool"], "order": 3922, "emoji": "⚓️"}, {"tags": ["buoy", "float", "life", "lifesaver", "preserver", "rescue", "ring", "safety", "save", "saver", "swim"], "order": 3923, "emoji": "🛟"}, {"tags": ["boat", "resort", "sailing", "sea", "yacht"], "order": 3924, "emoji": "⛵️"}, {"tags": ["boat"], "order": 3925, "emoji": "🛶"}, {"tags": ["billionaire", "boat", "lake", "luxury", "millionaire", "summer", "travel"], "order": 3926, "emoji": "🚤"}, {"tags": ["passenger", "ship"], "order": 3928, "emoji": "🛳️"}, {"tags": ["boat", "passenger"], "order": 3930, "emoji": "⛴️"}, {"tags": ["boat", "motor", "motorboat"], "order": 3932, "emoji": "🛥️"}, {"tags": ["boat", "passenger", "travel"], "order": 3933, "emoji": "🚢"}, {"tags": ["aeroplane", "fly", "flying", "jet", "plane", "travel"], "order": 3935, "emoji": "✈️"}, {"tags": ["aeroplane", "airplane", "plane", "small"], "order": 3937, "emoji": "🛩️"}, {"tags": ["aeroplane", "airplane", "check-in", "departure", "departures", "plane"], "order": 3938, "emoji": "🛫"}, {"tags": ["aeroplane", "airplane", "arrival", "arrivals", "arriving", "landing", "plane"], "order": 3939, "emoji": "🛬"}, {"tags": ["hang-glide", "parasail", "skydive"], "order": 3940, "emoji": "🪂"}, {"tags": ["chair"], "order": 3941, "emoji": "💺"}, {"tags": ["copter", "roflcopter", "travel", "vehicle"], "order": 3942, "emoji": "🚁"}, {"tags": ["railway", "suspension"], "order": 3943, "emoji": "🚟"}, {"tags": ["cable", "cableway", "gondola", "lift", "mountain", "ski"], "order": 3944, "emoji": "🚠"}, {"tags": ["aerial", "cable", "car", "gondola", "ropeway", "tramway"], "order": 3945, "emoji": "🚡"}, {"tags": ["space"], "order": 3947, "emoji": "🛰️"}, {"tags": ["launch", "rockets", "space", "travel"], "order": 3948, "emoji": "🚀"}, {"tags": ["aliens", "extra", "flying", "saucer", "terrestrial", "ufo"], "order": 3949, "emoji": "🛸"}, {"tags": ["bell", "bellhop", "hotel"], "order": 3951, "emoji": "🛎️"}, {"tags": ["bag", "packing", "roller", "suitcase", "travel"], "order": 3952, "emoji": "🧳"}, {"tags": ["done", "hourglass", "sand", "time", "timer"], "order": 3953, "emoji": "⌛️"}, {"tags": ["done", "flowing", "hourglass", "hours", "not", "sand", "timer", "waiting", "yolo"], "order": 3954, "emoji": "⏳️"}, {"tags": ["clock", "time"], "order": 3955, "emoji": "⌚️"}, {"tags": ["alarm", "clock", "hours", "hrs", "late", "time", "waiting"], "order": 3956, "emoji": "⏰️"}, {"tags": ["clock", "time"], "order": 3958, "emoji": "⏱️"}, {"tags": ["clock", "timer"], "order": 3960, "emoji": "⏲️"}, {"tags": ["clock", "mantelpiece", "time"], "order": 3962, "emoji": "🕰️"}, {"tags": ["12", "12:00", "clock", "o’clock", "time", "twelve"], "order": 3963, "emoji": "🕛️"}, {"tags": ["12", "12:30", "30", "clock", "thirty", "time", "twelve"], "order": 3964, "emoji": "🕧️"}, {"tags": ["1", "1:00", "clock", "one", "o’clock", "time"], "order": 3965, "emoji": "🕐️"}, {"tags": ["1", "1:30", "30", "clock", "one", "thirty", "time"], "order": 3966, "emoji": "🕜️"}, {"tags": ["2", "2:00", "clock", "o’clock", "time", "two"], "order": 3967, "emoji": "🕑️"}, {"tags": ["2", "2:30", "30", "clock", "thirty", "time", "two"], "order": 3968, "emoji": "🕝️"}, {"tags": ["3", "3:00", "clock", "o’clock", "three", "time"], "order": 3969, "emoji": "🕒️"}, {"tags": ["3", "30", "3:30", "clock", "thirty", "three", "time"], "order": 3970, "emoji": "🕞️"}, {"tags": ["4", "4:00", "clock", "four", "o’clock", "time"], "order": 3971, "emoji": "🕓️"}, {"tags": ["30", "4", "4:30", "clock", "four", "thirty", "time"], "order": 3972, "emoji": "🕟️"}, {"tags": ["5", "5:00", "clock", "five", "o’clock", "time"], "order": 3973, "emoji": "🕔️"}, {"tags": ["30", "5", "5:30", "clock", "five", "thirty", "time"], "order": 3974, "emoji": "🕠️"}, {"tags": ["6", "6:00", "clock", "o’clock", "six", "time"], "order": 3975, "emoji": "🕕️"}, {"tags": ["30", "6", "6:30", "clock", "six", "thirty"], "order": 3976, "emoji": "🕡️"}, {"tags": ["0", "7", "7:00", "clock", "o’clock", "seven"], "order": 3977, "emoji": "🕖️"}, {"tags": ["30", "7", "7:30", "clock", "seven", "thirty"], "order": 3978, "emoji": "🕢️"}, {"tags": ["8", "8:00", "clock", "eight", "o’clock", "time"], "order": 3979, "emoji": "🕗️"}, {"tags": ["30", "8", "8:30", "clock", "eight", "thirty", "time"], "order": 3980, "emoji": "🕣️"}, {"tags": ["9", "9:00", "clock", "nine", "o’clock", "time"], "order": 3981, "emoji": "🕘️"}, {"tags": ["30", "9", "9:30", "clock", "nine", "thirty", "time"], "order": 3982, "emoji": "🕤️"}, {"tags": ["0", "10", "10:00", "clock", "o’clock", "ten"], "order": 3983, "emoji": "🕙️"}, {"tags": ["10", "10:30", "30", "clock", "ten", "thirty", "time"], "order": 3984, "emoji": "🕥️"}, {"tags": ["11", "11:00", "clock", "eleven", "o’clock", "time"], "order": 3985, "emoji": "🕚️"}, {"tags": ["11", "11:30", "30", "clock", "eleven", "thirty", "time"], "order": 3986, "emoji": "🕦️"}, {"tags": ["dark", "moon", "new", "space"], "order": 3987, "emoji": "🌑"}, {"tags": ["crescent", "dreams", "moon", "space", "waxing"], "order": 3988, "emoji": "🌒"}, {"tags": ["first", "moon", "quarter", "space"], "order": 3989, "emoji": "🌓"}, {"tags": ["gibbous", "moon", "space", "waxing"], "order": 3990, "emoji": "🌔"}, {"tags": ["full", "moon", "space"], "order": 3991, "emoji": "🌕️"}, {"tags": ["gibbous", "moon", "space", "waning"], "order": 3992, "emoji": "🌖"}, {"tags": ["last", "moon", "quarter", "space"], "order": 3993, "emoji": "🌗"}, {"tags": ["crescent", "moon", "space", "waning"], "order": 3994, "emoji": "🌘"}, {"tags": ["crescent", "moon", "ramadan", "space"], "order": 3995, "emoji": "🌙"}, {"tags": ["face", "moon", "new", "space"], "order": 3996, "emoji": "🌚"}, {"tags": ["face", "first", "moon", "quarter", "space"], "order": 3997, "emoji": "🌛"}, {"tags": ["dreams", "face", "last", "moon", "quarter"], "order": 3998, "emoji": "🌜️"}, {"tags": ["weather"], "order": 4000, "emoji": "🌡️"}, {"tags": ["bright", "rays", "space", "sunny", "weather"], "order": 4002, "emoji": "☀️"}, {"tags": ["bright", "face", "full", "moon"], "order": 4003, "emoji": "🌝"}, {"tags": ["beach", "bright", "day", "face", "heat", "shine", "sun", "sunny", "sunshine", "weather"], "order": 4004, "emoji": "🌞"}, {"tags": ["planet", "ringed", "saturn", "saturnine"], "order": 4005, "emoji": "🪐"}, {"tags": ["astronomy", "medium", "stars", "white"], "order": 4006, "emoji": "⭐️"}, {"tags": ["glittery", "glow", "glowing", "night", "shining", "sparkle", "star", "win"], "order": 4007, "emoji": "🌟"}, {"tags": ["falling", "night", "shooting", "space", "star"], "order": 4008, "emoji": "🌠"}, {"tags": ["milky", "space", "way"], "order": 4009, "emoji": "🌌"}, {"tags": ["weather"], "order": 4011, "emoji": "☁️"}, {"tags": ["behind", "cloud", "cloudy", "sun", "weather"], "order": 4012, "emoji": "⛅️"}, {"tags": ["cloud", "lightning", "rain", "thunder", "thunderstorm"], "order": 4014, "emoji": "⛈️"}, {"tags": ["behind", "cloud", "sun", "weather"], "order": 4016, "emoji": "🌤️"}, {"tags": ["behind", "cloud", "sun", "weather"], "order": 4018, "emoji": "🌥️"}, {"tags": ["behind", "cloud", "rain", "sun", "weather"], "order": 4020, "emoji": "🌦️"}, {"tags": ["cloud", "rain", "weather"], "order": 4022, "emoji": "🌧️"}, {"tags": ["cloud", "cold", "snow", "weather"], "order": 4024, "emoji": "🌨️"}, {"tags": ["cloud", "lightning", "weather"], "order": 4026, "emoji": "🌩️"}, {"tags": ["cloud", "weather", "whirlwind"], "order": 4028, "emoji": "🌪️"}, {"tags": ["cloud", "weather"], "order": 4030, "emoji": "🌫️"}, {"tags": ["blow", "cloud", "face", "wind"], "order": 4032, "emoji": "🌬️"}, {"tags": ["dizzy", "hurricane", "twister", "typhoon", "weather"], "order": 4033, "emoji": "🌀"}, {"tags": ["gay", "genderqueer", "glbt", "glbtq", "lesbian", "lgbt", "lgbtq", "lgbtqia", "nature", "pride", "queer", "rain", "trans", "transgender", "weather"], "order": 4034, "emoji": "🌈"}, {"tags": ["closed", "clothing", "rain", "umbrella"], "order": 4035, "emoji": "🌂"}, {"tags": ["clothing", "rain"], "order": 4037, "emoji": "☂️"}, {"tags": ["clothing", "drop", "drops", "rain", "umbrella", "weather"], "order": 4038, "emoji": "☔️"}, {"tags": ["ground", "rain", "sun", "umbrella"], "order": 4040, "emoji": "⛱️"}, {"tags": ["danger", "electric", "electricity", "high", "lightning", "nature", "thunder", "thunderbolt", "voltage", "zap"], "order": 4041, "emoji": "⚡️"}, {"tags": ["cold", "snow", "weather"], "order": 4043, "emoji": "❄️"}, {"tags": ["cold", "man", "snow"], "order": 4045, "emoji": "☃️"}, {"tags": ["cold", "man", "snow", "snowman"], "order": 4046, "emoji": "⛄️"}, {"tags": ["space"], "order": 4048, "emoji": "☄️"}, {"tags": ["af", "burn", "flame", "hot", "lit", "litaf", "tool"], "order": 4049, "emoji": "🔥"}, {"tags": ["cold", "comic", "drop", "nature", "sad", "sweat", "tear", "water", "weather"], "order": 4050, "emoji": "💧"}, {"tags": ["nature", "ocean", "surf", "surfer", "surfing", "water", "wave"], "order": 4051, "emoji": "🌊"}, {"tags": ["celebration", "halloween", "jack", "lantern", "pumpkin"], "order": 4052, "emoji": "🎃"}, {"tags": ["celebration", "christmas", "tree"], "order": 4053, "emoji": "🎄"}, {"tags": ["boom", "celebration", "entertainment", "yolo"], "order": 4054, "emoji": "🎆"}, {"tags": ["boom", "celebration", "fireworks", "sparkle"], "order": 4055, "emoji": "🎇"}, {"tags": ["dynamite", "explosive", "fire", "fireworks", "light", "pop", "popping", "spark"], "order": 4056, "emoji": "🧨"}, {"tags": ["*", "magic", "sparkle", "star"], "order": 4057, "emoji": "✨️"}, {"tags": ["birthday", "celebrate", "celebration"], "order": 4058, "emoji": "🎈"}, {"tags": ["awesome", "birthday", "celebrate", "celebration", "excited", "hooray", "party", "popper", "tada", "woohoo"], "order": 4059, "emoji": "🎉"}, {"tags": ["ball", "celebrate", "celebration", "confetti", "party", "woohoo"], "order": 4060, "emoji": "🎊"}, {"tags": ["banner", "celebration", "japanese", "tanabata", "tree"], "order": 4061, "emoji": "🎋"}, {"tags": ["bamboo", "celebration", "decoration", "japanese", "pine", "plant"], "order": 4062, "emoji": "🎍"}, {"tags": ["celebration", "doll", "dolls", "festival", "japanese"], "order": 4063, "emoji": "🎎"}, {"tags": ["carp", "celebration", "streamer"], "order": 4064, "emoji": "🎏"}, {"tags": ["bell", "celebration", "chime", "wind"], "order": 4065, "emoji": "🎐"}, {"tags": ["celebration", "ceremony", "moon", "viewing"], "order": 4066, "emoji": "🎑"}, {"tags": ["envelope", "gift", "good", "hóngbāo", "lai", "luck", "money", "red", "see"], "order": 4067, "emoji": "🧧"}, {"tags": ["celebration"], "order": 4068, "emoji": "🎀"}, {"tags": ["birthday", "bow", "box", "celebration", "christmas", "gift", "present", "surprise", "wrapped"], "order": 4069, "emoji": "🎁"}, {"tags": ["celebration", "reminder", "ribbon"], "order": 4071, "emoji": "🎗️"}, {"tags": ["admission", "ticket", "tickets"], "order": 4073, "emoji": "🎟️"}, {"tags": ["admission", "stub"], "order": 4074, "emoji": "🎫"}, {"tags": ["award", "celebration", "medal", "military"], "order": 4076, "emoji": "🎖️"}, {"tags": ["champion", "champs", "prize", "slay", "sport", "victory", "win", "winning"], "order": 4077, "emoji": "🏆️"}, {"tags": ["award", "gold", "medal", "sports", "winner"], "order": 4078, "emoji": "🏅"}, {"tags": ["1st", "first", "gold", "medal", "place"], "order": 4079, "emoji": "🥇"}, {"tags": ["2nd", "medal", "place", "second", "silver"], "order": 4080, "emoji": "🥈"}, {"tags": ["3rd", "bronze", "medal", "place", "third"], "order": 4081, "emoji": "🥉"}, {"tags": ["ball", "football", "futbol", "soccer", "sport"], "order": 4082, "emoji": "⚽️"}, {"tags": ["ball", "sport"], "order": 4083, "emoji": "⚾️"}, {"tags": ["ball", "glove", "sports", "underarm"], "order": 4084, "emoji": "🥎"}, {"tags": ["ball", "hoop", "sport"], "order": 4085, "emoji": "🏀"}, {"tags": ["ball", "game"], "order": 4086, "emoji": "🏐"}, {"tags": ["american", "ball", "bowl", "football", "sport", "super"], "order": 4087, "emoji": "🏈"}, {"tags": ["ball", "football", "rugby", "sport"], "order": 4088, "emoji": "🏉"}, {"tags": ["ball", "racquet", "sport"], "order": 4089, "emoji": "🎾"}, {"tags": ["disc", "flying", "ultimate"], "order": 4090, "emoji": "🥏"}, {"tags": ["ball", "game", "sport", "strike"], "order": 4091, "emoji": "🎳"}, {"tags": ["ball", "bat", "cricket", "game"], "order": 4092, "emoji": "🏏"}, {"tags": ["ball", "field", "game", "hockey", "stick"], "order": 4093, "emoji": "🏑"}, {"tags": ["game", "hockey", "ice", "puck", "stick"], "order": 4094, "emoji": "🏒"}, {"tags": ["ball", "goal", "sports", "stick"], "order": 4095, "emoji": "🥍"}, {"tags": ["ball", "bat", "game", "paddle", "ping", "pingpong", "pong", "table", "tennis"], "order": 4096, "emoji": "🏓"}, {"tags": ["birdie", "game", "racquet", "shuttlecock"], "order": 4097, "emoji": "🏸"}, {"tags": ["boxing", "glove"], "order": 4098, "emoji": "🥊"}, {"tags": ["arts", "judo", "karate", "martial", "taekwondo", "uniform"], "order": 4099, "emoji": "🥋"}, {"tags": ["goal", "net"], "order": 4100, "emoji": "🥅"}, {"tags": ["flag", "golf", "hole", "sport"], "order": 4101, "emoji": "⛳️"}, {"tags": ["ice", "skate", "skating"], "order": 4103, "emoji": "⛸️"}, {"tags": ["entertainment", "fish", "fishing", "pole", "sport"], "order": 4104, "emoji": "🎣"}, {"tags": ["diving", "mask", "scuba", "snorkeling"], "order": 4105, "emoji": "🤿"}, {"tags": ["athletics", "running", "sash", "shirt"], "order": 4106, "emoji": "🎽"}, {"tags": ["ski", "snow", "sport"], "order": 4107, "emoji": "🎿"}, {"tags": ["luge", "sledge", "sleigh", "snow", "toboggan"], "order": 4108, "emoji": "🛷"}, {"tags": ["curling", "game", "rock", "stone"], "order": 4109, "emoji": "🥌"}, {"tags": ["bull", "dart", "direct", "entertainment", "game", "hit", "target"], "order": 4110, "emoji": "🎯"}, {"tags": ["fluctuate", "toy"], "order": 4111, "emoji": "🪀"}, {"tags": ["fly", "soar"], "order": 4112, "emoji": "🪁"}, {"tags": ["gun", "handgun", "pistol", "revolver", "tool", "water", "weapon"], "order": 4113, "emoji": "🔫"}, {"tags": ["8", "8ball", "ball", "billiard", "eight", "game", "pool"], "order": 4114, "emoji": "🎱"}, {"tags": ["ball", "crystal", "fairy", "fairytale", "fantasy", "fortune", "future", "magic", "tale", "tool"], "order": 4115, "emoji": "🔮"}, {"tags": ["magic", "magician", "wand", "witch", "wizard"], "order": 4116, "emoji": "🪄"}, {"tags": ["controller", "entertainment", "game", "video"], "order": 4117, "emoji": "🎮️"}, {"tags": ["game", "video", "videogame"], "order": 4119, "emoji": "🕹️"}, {"tags": ["casino", "gamble", "gambling", "game", "machine", "slot", "slots"], "order": 4120, "emoji": "🎰"}, {"tags": ["dice", "die", "entertainment", "game"], "order": 4121, "emoji": "🎲"}, {"tags": ["clue", "interlocking", "jigsaw", "piece", "puzzle"], "order": 4122, "emoji": "🧩"}, {"tags": ["bear", "plaything", "plush", "stuffed", "teddy", "toy"], "order": 4123, "emoji": "🧸"}, {"tags": ["candy", "celebrate", "celebration", "cinco", "de", "festive", "mayo", "party", "pinada", "pinata"], "order": 4124, "emoji": "🪅"}, {"tags": ["ball", "dance", "disco", "glitter", "mirror", "party"], "order": 4125, "emoji": "🪩"}, {"tags": ["babooshka", "baboushka", "babushka", "doll", "dolls", "matryoshka", "nesting", "russia"], "order": 4126, "emoji": "🪆"}, {"tags": ["card", "game", "spade", "suit"], "order": 4128, "emoji": "♠️"}, {"tags": ["card", "emotion", "game", "heart", "hearts", "suit"], "order": 4130, "emoji": "♥️"}, {"tags": ["card", "diamond", "game", "suit"], "order": 4132, "emoji": "♦️"}, {"tags": ["card", "club", "clubs", "game", "suit"], "order": 4134, "emoji": "♣️"}, {"tags": ["chess", "dupe", "expendable", "pawn"], "order": 4136, "emoji": "♟️"}, {"tags": ["card", "game", "wildcard"], "order": 4137, "emoji": "🃏"}, {"tags": ["dragon", "game", "mahjong", "red"], "order": 4138, "emoji": "🀄️"}, {"tags": ["card", "cards", "flower", "game", "japanese", "playing"], "order": 4139, "emoji": "🎴"}, {"tags": ["actor", "actress", "art", "arts", "entertainment", "mask", "performing", "theater", "theatre", "thespian"], "order": 4140, "emoji": "🎭️"}, {"tags": ["art", "frame", "framed", "museum", "painting", "picture"], "order": 4142, "emoji": "🖼️"}, {"tags": ["art", "artist", "artsy", "arty", "colorful", "creative", "entertainment", "museum", "painter", "painting", "palette"], "order": 4143, "emoji": "🎨"}, {"tags": ["needle", "sewing", "spool", "string"], "order": 4144, "emoji": "🧵"}, {"tags": ["embroidery", "needle", "sew", "sewing", "stitches", "sutures", "tailoring", "thread"], "order": 4145, "emoji": "🪡"}, {"tags": ["ball", "crochet", "knit"], "order": 4146, "emoji": "🧶"}, {"tags": ["cord", "rope", "tangled", "tie", "twine", "twist"], "order": 4147, "emoji": "🪢"}, {"tags": ["clothing", "eye", "eyeglasses", "eyewear"], "order": 4148, "emoji": "👓️"}, {"tags": ["dark", "eye", "eyewear", "glasses"], "order": 4150, "emoji": "🕶️"}, {"tags": ["dive", "eye", "protection", "scuba", "swimming", "welding"], "order": 4151, "emoji": "🥽"}, {"tags": ["clothes", "coat", "doctor", "dr", "experiment", "jacket", "lab", "scientist", "white"], "order": 4152, "emoji": "🥼"}, {"tags": ["emergency", "safety", "vest"], "order": 4153, "emoji": "🦺"}, {"tags": ["clothing", "employed", "serious", "shirt", "tie"], "order": 4154, "emoji": "👔"}, {"tags": ["blue", "casual", "clothes", "clothing", "collar", "dressed", "shirt", "shopping", "tshirt", "weekend"], "order": 4155, "emoji": "👕"}, {"tags": ["blue", "casual", "clothes", "clothing", "denim", "dressed", "pants", "shopping", "trousers", "weekend"], "order": 4156, "emoji": "👖"}, {"tags": ["bundle", "cold", "neck", "up"], "order": 4157, "emoji": "🧣"}, {"tags": ["hand"], "order": 4158, "emoji": "🧤"}, {"tags": ["brr", "bundle", "cold", "jacket", "up"], "order": 4159, "emoji": "🧥"}, {"tags": ["stocking"], "order": 4160, "emoji": "🧦"}, {"tags": ["clothes", "clothing", "dressed", "fancy", "shopping"], "order": 4161, "emoji": "👗"}, {"tags": ["clothing", "comfortable"], "order": 4162, "emoji": "👘"}, {"tags": ["clothing", "dress"], "order": 4163, "emoji": "🥻"}, {"tags": ["bathing", "one-piece", "suit", "swimsuit"], "order": 4164, "emoji": "🩱"}, {"tags": ["bathing", "one-piece", "suit", "swimsuit", "underwear"], "order": 4165, "emoji": "🩲"}, {"tags": ["bathing", "pants", "suit", "swimsuit", "underwear"], "order": 4166, "emoji": "🩳"}, {"tags": ["bathing", "beach", "clothing", "pool", "suit", "swim"], "order": 4167, "emoji": "👙"}, {"tags": ["blouse", "clothes", "clothing", "collar", "dress", "dressed", "lady", "shirt", "shopping", "woman", "woman’s"], "order": 4168, "emoji": "👚"}, {"tags": ["clack", "clap", "cool", "cooling", "dance", "fan", "flirt", "flutter", "folding", "hand", "hot", "shy"], "order": 4169, "emoji": "🪭"}, {"tags": ["clothes", "clothing", "coin", "dress", "fancy", "handbag", "shopping"], "order": 4170, "emoji": "👛"}, {"tags": ["bag", "clothes", "clothing", "dress", "lady", "purse", "shopping"], "order": 4171, "emoji": "👜"}, {"tags": ["bag", "clothes", "clothing", "clutch", "dress", "handbag", "pouch", "purse"], "order": 4172, "emoji": "👝"}, {"tags": ["bag", "bags", "hotel", "shopping"], "order": 4174, "emoji": "🛍️"}, {"tags": ["backpacking", "bag", "bookbag", "education", "rucksack", "satchel", "school"], "order": 4175, "emoji": "🎒"}, {"tags": ["beach", "flip", "flop", "sandal", "sandals", "shoe", "thong", "thongs", "zōri"], "order": 4176, "emoji": "🩴"}, {"tags": ["brown", "clothes", "clothing", "feet", "foot", "kick", "man", "man’s", "shoe", "shoes", "shopping"], "order": 4177, "emoji": "👞"}, {"tags": ["athletic", "clothes", "clothing", "fast", "kick", "running", "shoe", "shoes", "shopping", "sneaker", "tennis"], "order": 4178, "emoji": "👟"}, {"tags": ["backpacking", "boot", "brown", "camping", "hiking", "outdoors", "shoe"], "order": 4179, "emoji": "🥾"}, {"tags": ["ballet", "comfy", "flat", "flats", "shoe", "slip-on", "slipper"], "order": 4180, "emoji": "🥿"}, {"tags": ["clothes", "clothing", "dress", "fashion", "heel", "heels", "high-heeled", "shoe", "shoes", "shopping", "stiletto", "woman"], "order": 4181, "emoji": "👠"}, {"tags": ["clothing", "sandal", "shoe", "woman", "woman’s"], "order": 4182, "emoji": "👡"}, {"tags": ["ballet", "dance", "shoes"], "order": 4183, "emoji": "🩰"}, {"tags": ["boot", "clothes", "clothing", "dress", "shoe", "shoes", "shopping", "woman", "woman’s"], "order": 4184, "emoji": "👢"}, {"tags": ["afro", "comb", "groom", "hair", "pick"], "order": 4185, "emoji": "🪮"}, {"tags": ["clothing", "family", "king", "medieval", "queen", "royal", "royalty", "win"], "order": 4186, "emoji": "👑"}, {"tags": ["clothes", "clothing", "garden", "hat", "hats", "party", "woman", "woman’s"], "order": 4187, "emoji": "👒"}, {"tags": ["clothes", "clothing", "fancy", "formal", "hat", "magic", "top", "tophat"], "order": 4188, "emoji": "🎩"}, {"tags": ["cap", "celebration", "clothing", "education", "graduation", "hat", "scholar"], "order": 4189, "emoji": "🎓️"}, {"tags": ["baseball", "bent", "billed", "cap", "dad", "hat"], "order": 4190, "emoji": "🧢"}, {"tags": ["army", "helmet", "military", "soldier", "war", "warrior"], "order": 4191, "emoji": "🪖"}, {"tags": ["aid", "cross", "face", "hat", "helmet", "rescue", "worker’s"], "order": 4193, "emoji": "⛑️"}, {"tags": ["beads", "clothing", "necklace", "prayer", "religion"], "order": 4194, "emoji": "📿"}, {"tags": ["cosmetics", "date", "makeup"], "order": 4195, "emoji": "💄"}, {"tags": ["diamond", "engaged", "engagement", "married", "romance", "shiny", "sparkling", "wedding"], "order": 4196, "emoji": "💍"}, {"tags": ["diamond", "engagement", "gem", "jewel", "money", "romance", "stone", "wedding"], "order": 4197, "emoji": "💎"}, {"tags": ["mute", "muted", "quiet", "silent", "sound", "speaker"], "order": 4198, "emoji": "🔇"}, {"tags": ["low", "soft", "sound", "speaker", "volume"], "order": 4199, "emoji": "🔈️"}, {"tags": ["medium", "sound", "speaker", "volume"], "order": 4200, "emoji": "🔉"}, {"tags": ["high", "loud", "music", "sound", "speaker", "volume"], "order": 4201, "emoji": "🔊"}, {"tags": ["address", "communication", "loud", "public", "sound"], "order": 4202, "emoji": "📢"}, {"tags": ["cheering", "sound"], "order": 4203, "emoji": "📣"}, {"tags": ["horn", "post", "postal"], "order": 4204, "emoji": "📯"}, {"tags": ["break", "church", "sound"], "order": 4205, "emoji": "🔔"}, {"tags": ["bell", "forbidden", "mute", "no", "not", "prohibited", "quiet", "silent", "slash", "sound"], "order": 4206, "emoji": "🔕"}, {"tags": ["music", "musical", "note", "score"], "order": 4207, "emoji": "🎼"}, {"tags": ["music", "musical", "note", "sound"], "order": 4208, "emoji": "🎵"}, {"tags": ["music", "musical", "note", "notes", "sound"], "order": 4209, "emoji": "🎶"}, {"tags": ["mic", "microphone", "music", "studio"], "order": 4211, "emoji": "🎙️"}, {"tags": ["level", "music", "slider"], "order": 4213, "emoji": "🎚️"}, {"tags": ["control", "knobs", "music"], "order": 4215, "emoji": "🎛️"}, {"tags": ["karaoke", "mic", "music", "sing", "sound"], "order": 4216, "emoji": "🎤"}, {"tags": ["earbud", "sound"], "order": 4217, "emoji": "🎧️"}, {"tags": ["entertainment", "tbt", "video"], "order": 4218, "emoji": "📻️"}, {"tags": ["instrument", "music", "sax"], "order": 4219, "emoji": "🎷"}, {"tags": ["box", "concertina", "instrument", "music", "squeeze", "squeezebox"], "order": 4220, "emoji": "🪗"}, {"tags": ["instrument", "music", "strat"], "order": 4221, "emoji": "🎸"}, {"tags": ["instrument", "keyboard", "music", "musical", "piano"], "order": 4222, "emoji": "🎹"}, {"tags": ["instrument", "music"], "order": 4223, "emoji": "🎺"}, {"tags": ["instrument", "music"], "order": 4224, "emoji": "🎻"}, {"tags": ["music", "stringed"], "order": 4225, "emoji": "🪕"}, {"tags": ["drumsticks", "music"], "order": 4226, "emoji": "🥁"}, {"tags": ["beat", "conga", "drum", "instrument", "long", "rhythm"], "order": 4227, "emoji": "🪘"}, {"tags": ["cha", "dance", "instrument", "music", "party", "percussion", "rattle", "shake", "shaker"], "order": 4228, "emoji": "🪇"}, {"tags": ["band", "fife", "flautist", "instrument", "marching", "music", "orchestra", "piccolo", "pipe", "recorder", "woodwind"], "order": 4229, "emoji": "🪈"}, {"tags": ["cupid", "instrument", "love", "music", "orchestra"], "order": 4230, "emoji": "🪉"}, {"tags": ["cell", "communication", "mobile", "phone", "telephone"], "order": 4231, "emoji": "📱"}, {"tags": ["arrow", "build", "call", "cell", "communication", "mobile", "phone", "receive", "telephone"], "order": 4232, "emoji": "📲"}, {"tags": ["phone"], "order": 4234, "emoji": "☎️"}, {"tags": ["communication", "phone", "receiver", "telephone", "voip"], "order": 4235, "emoji": "📞"}, {"tags": ["communication"], "order": 4236, "emoji": "📟️"}, {"tags": ["communication", "fax", "machine"], "order": 4237, "emoji": "📠"}, {"tags": ["battery"], "order": 4238, "emoji": "🔋"}, {"tags": ["battery", "drained", "electronic", "energy", "low", "power"], "order": 4239, "emoji": "🪫"}, {"tags": ["electric", "electricity", "plug"], "order": 4240, "emoji": "🔌"}, {"tags": ["computer", "office", "pc", "personal"], "order": 4241, "emoji": "💻️"}, {"tags": ["computer", "desktop", "monitor"], "order": 4243, "emoji": "🖥️"}, {"tags": ["computer"], "order": 4245, "emoji": "🖨️"}, {"tags": ["computer"], "order": 4247, "emoji": "⌨️"}, {"tags": ["computer", "mouse"], "order": 4249, "emoji": "🖱️"}, {"tags": ["computer"], "order": 4251, "emoji": "🖲️"}, {"tags": ["computer", "disk", "minidisk", "optical"], "order": 4252, "emoji": "💽"}, {"tags": ["computer", "disk", "floppy"], "order": 4253, "emoji": "💾"}, {"tags": ["blu-ray", "cd", "computer", "disk", "dvd", "optical"], "order": 4254, "emoji": "💿️"}, {"tags": ["blu-ray", "cd", "computer", "disk", "optical"], "order": 4255, "emoji": "📀"}, {"tags": ["calculation", "calculator"], "order": 4256, "emoji": "🧮"}, {"tags": ["bollywood", "camera", "cinema", "film", "hollywood", "movie", "record"], "order": 4257, "emoji": "🎥"}, {"tags": ["cinema", "film", "frames", "movie"], "order": 4259, "emoji": "🎞️"}, {"tags": ["cinema", "film", "movie", "projector", "video"], "order": 4261, "emoji": "📽️"}, {"tags": ["action", "board", "clapper", "movie"], "order": 4262, "emoji": "🎬️"}, {"tags": ["tv", "video"], "order": 4263, "emoji": "📺️"}, {"tags": ["photo", "selfie", "snap", "tbt", "trip", "video"], "order": 4264, "emoji": "📷️"}, {"tags": ["camera", "flash", "video"], "order": 4265, "emoji": "📸"}, {"tags": ["camcorder", "camera", "tbt", "video"], "order": 4266, "emoji": "📹️"}, {"tags": ["old", "school", "tape", "vcr", "vhs", "video"], "order": 4267, "emoji": "📼"}, {"tags": ["glass", "lab", "left", "left-pointing", "magnifying", "science", "search", "tilted", "tool"], "order": 4268, "emoji": "🔍️"}, {"tags": ["contact", "glass", "lab", "magnifying", "right", "right-pointing", "science", "search", "tilted", "tool"], "order": 4269, "emoji": "🔎"}, {"tags": ["light"], "order": 4271, "emoji": "🕯️"}, {"tags": ["bulb", "comic", "electric", "idea", "light"], "order": 4272, "emoji": "💡"}, {"tags": ["electric", "light", "tool", "torch"], "order": 4273, "emoji": "🔦"}, {"tags": ["bar", "lantern", "light", "paper", "red", "restaurant"], "order": 4274, "emoji": "🏮"}, {"tags": ["diya", "lamp", "light", "oil"], "order": 4275, "emoji": "🪔"}, {"tags": ["book", "cover", "decorated", "decorative", "education", "notebook", "school", "writing"], "order": 4276, "emoji": "📔"}, {"tags": ["book", "closed", "education"], "order": 4277, "emoji": "📕"}, {"tags": ["book", "education", "fantasy", "knowledge", "library", "novels", "open", "reading"], "order": 4278, "emoji": "📖"}, {"tags": ["book", "education", "fantasy", "green", "library", "reading"], "order": 4279, "emoji": "📗"}, {"tags": ["blue", "book", "education", "fantasy", "library", "reading"], "order": 4280, "emoji": "📘"}, {"tags": ["book", "education", "fantasy", "library", "orange", "reading"], "order": 4281, "emoji": "📙"}, {"tags": ["book", "education", "fantasy", "knowledge", "library", "novels", "reading", "school", "study"], "order": 4282, "emoji": "📚️"}, {"tags": ["notebook"], "order": 4283, "emoji": "📓"}, {"tags": ["notebook"], "order": 4284, "emoji": "📒"}, {"tags": ["curl", "document", "page", "paper"], "order": 4285, "emoji": "📃"}, {"tags": ["paper"], "order": 4286, "emoji": "📜"}, {"tags": ["document", "facing", "page", "paper", "up"], "order": 4287, "emoji": "📄"}, {"tags": ["communication", "news", "paper"], "order": 4288, "emoji": "📰"}, {"tags": ["news", "newspaper", "paper", "rolled", "rolled-up"], "order": 4290, "emoji": "🗞️"}, {"tags": ["bookmark", "mark", "marker", "tabs"], "order": 4291, "emoji": "📑"}, {"tags": ["mark"], "order": 4292, "emoji": "🔖"}, {"tags": ["tag"], "order": 4294, "emoji": "🏷️"}, {"tags": ["bag", "bank", "bet", "billion", "cash", "cost", "dollar", "gold", "million", "money", "moneybag", "paid", "paying", "pot", "rich", "win"], "order": 4295, "emoji": "💰️"}, {"tags": ["dollar", "euro", "gold", "metal", "money", "rich", "silver", "treasure"], "order": 4296, "emoji": "🪙"}, {"tags": ["bank", "banknote", "bill", "currency", "money", "note", "yen"], "order": 4297, "emoji": "💴"}, {"tags": ["bank", "banknote", "bill", "currency", "dollar", "money", "note"], "order": 4298, "emoji": "💵"}, {"tags": ["100", "bank", "banknote", "bill", "currency", "euro", "money", "note", "rich"], "order": 4299, "emoji": "💶"}, {"tags": ["bank", "banknote", "bill", "billion", "cash", "currency", "money", "note", "pound", "pounds"], "order": 4300, "emoji": "💷"}, {"tags": ["bank", "banknote", "bill", "billion", "cash", "dollar", "fly", "million", "money", "note", "pay", "wings"], "order": 4301, "emoji": "💸"}, {"tags": ["bank", "card", "cash", "charge", "credit", "money", "pay"], "order": 4302, "emoji": "💳️"}, {"tags": ["accounting", "bookkeeping", "evidence", "invoice", "proof"], "order": 4303, "emoji": "🧾"}, {"tags": ["bank", "chart", "currency", "graph", "growth", "increasing", "market", "money", "rise", "trend", "upward", "yen"], "order": 4304, "emoji": "💹"}, {"tags": ["e-mail", "email", "letter"], "order": 4306, "emoji": "✉️"}, {"tags": ["email", "letter", "mail"], "order": 4307, "emoji": "📧"}, {"tags": ["delivering", "e-mail", "email", "envelope", "incoming", "letter", "mail", "receive", "sent"], "order": 4308, "emoji": "📨"}, {"tags": ["arrow", "communication", "down", "e-mail", "email", "envelope", "letter", "mail", "outgoing", "send", "sent"], "order": 4309, "emoji": "📩"}, {"tags": ["box", "email", "letter", "mail", "outbox", "sent", "tray"], "order": 4310, "emoji": "📤️"}, {"tags": ["box", "email", "inbox", "letter", "mail", "receive", "tray", "zero"], "order": 4311, "emoji": "📥️"}, {"tags": ["box", "communication", "delivery", "parcel", "shipping"], "order": 4312, "emoji": "📦️"}, {"tags": ["closed", "communication", "flag", "mail", "mailbox", "postbox", "raised"], "order": 4313, "emoji": "📫️"}, {"tags": ["closed", "flag", "lowered", "mail", "mailbox", "postbox"], "order": 4314, "emoji": "📪️"}, {"tags": ["flag", "mail", "mailbox", "open", "postbox", "raised"], "order": 4315, "emoji": "📬️"}, {"tags": ["flag", "lowered", "mail", "mailbox", "open", "postbox"], "order": 4316, "emoji": "📭️"}, {"tags": ["mail", "mailbox"], "order": 4317, "emoji": "📮"}, {"tags": ["ballot", "box"], "order": 4319, "emoji": "🗳️"}, {"tags": ["pencil"], "order": 4321, "emoji": "✏️"}, {"tags": ["black", "nib", "pen"], "order": 4323, "emoji": "✒️"}, {"tags": ["fountain", "pen"], "order": 4325, "emoji": "🖋️"}, {"tags": ["ballpoint"], "order": 4327, "emoji": "🖊️"}, {"tags": ["painting"], "order": 4329, "emoji": "🖌️"}, {"tags": ["crayon"], "order": 4331, "emoji": "🖍️"}, {"tags": ["communication", "media", "notes", "pencil"], "order": 4332, "emoji": "📝"}, {"tags": ["office"], "order": 4333, "emoji": "💼"}, {"tags": ["file", "folder"], "order": 4334, "emoji": "📁"}, {"tags": ["file", "folder", "open"], "order": 4335, "emoji": "📂"}, {"tags": ["card", "dividers", "index"], "order": 4337, "emoji": "🗂️"}, {"tags": ["date"], "order": 4338, "emoji": "📅"}, {"tags": ["calendar", "tear-off"], "order": 4339, "emoji": "📆"}, {"tags": ["note", "notepad", "pad", "spiral"], "order": 4341, "emoji": "🗒️"}, {"tags": ["calendar", "pad", "spiral"], "order": 4343, "emoji": "🗓️"}, {"tags": ["card", "index", "old", "rolodex", "school"], "order": 4344, "emoji": "📇"}, {"tags": ["chart", "data", "graph", "growth", "increasing", "right", "trend", "up", "upward"], "order": 4345, "emoji": "📈"}, {"tags": ["chart", "data", "decreasing", "down", "downward", "graph", "negative", "trend"], "order": 4346, "emoji": "📉"}, {"tags": ["bar", "chart", "data", "graph"], "order": 4347, "emoji": "📊"}, {"tags": ["do", "list", "notes"], "order": 4348, "emoji": "📋️"}, {"tags": ["collage", "pin"], "order": 4349, "emoji": "📌"}, {"tags": ["location", "map", "pin", "pushpin", "round"], "order": 4350, "emoji": "📍"}, {"tags": ["paperclip"], "order": 4351, "emoji": "📎"}, {"tags": ["link", "linked", "paperclip", "paperclips"], "order": 4353, "emoji": "🖇️"}, {"tags": ["angle", "edge", "math", "ruler", "straight", "straightedge"], "order": 4354, "emoji": "📏"}, {"tags": ["angle", "math", "rule", "ruler", "set", "slide", "triangle", "triangular"], "order": 4355, "emoji": "📐"}, {"tags": ["cut", "cutting", "paper", "tool"], "order": 4357, "emoji": "✂️"}, {"tags": ["box", "card", "file"], "order": 4359, "emoji": "🗃️"}, {"tags": ["cabinet", "file", "filing", "paper"], "order": 4361, "emoji": "🗄️"}, {"tags": ["can", "garbage", "trash", "waste"], "order": 4363, "emoji": "🗑️"}, {"tags": ["closed", "lock", "private"], "order": 4364, "emoji": "🔒️"}, {"tags": ["cracked", "lock", "open", "unlock"], "order": 4365, "emoji": "🔓️"}, {"tags": ["ink", "lock", "locked", "nib", "pen", "privacy"], "order": 4366, "emoji": "🔏"}, {"tags": ["bike", "closed", "key", "lock", "locked", "secure"], "order": 4367, "emoji": "🔐"}, {"tags": ["keys", "lock", "major", "password", "unlock"], "order": 4368, "emoji": "🔑"}, {"tags": ["clue", "key", "lock", "old"], "order": 4370, "emoji": "🗝️"}, {"tags": ["home", "improvement", "repairs", "tool"], "order": 4371, "emoji": "🔨"}, {"tags": ["ax", "chop", "hatchet", "split", "wood"], "order": 4372, "emoji": "🪓"}, {"tags": ["hammer", "mining", "tool"], "order": 4374, "emoji": "⛏️"}, {"tags": ["hammer", "pick", "tool"], "order": 4376, "emoji": "⚒️"}, {"tags": ["hammer", "spanner", "tool", "wrench"], "order": 4378, "emoji": "🛠️"}, {"tags": ["knife", "weapon"], "order": 4380, "emoji": "🗡️"}, {"tags": ["crossed", "swords", "weapon"], "order": 4382, "emoji": "⚔️"}, {"tags": ["boom", "comic", "dangerous", "explosion", "hot"], "order": 4383, "emoji": "💣️"}, {"tags": ["rebound", "repercussion", "weapon"], "order": 4384, "emoji": "🪃"}, {"tags": ["archer", "archery", "arrow", "bow", "sagittarius", "tool", "weapon", "zodiac"], "order": 4385, "emoji": "🏹"}, {"tags": ["weapon"], "order": 4387, "emoji": "🛡️"}, {"tags": ["carpenter", "carpentry", "cut", "lumber", "saw", "tool", "trim"], "order": 4388, "emoji": "🪚"}, {"tags": ["home", "improvement", "spanner", "tool"], "order": 4389, "emoji": "🔧"}, {"tags": ["flathead", "handy", "screw", "tool"], "order": 4390, "emoji": "🪛"}, {"tags": ["bolt", "home", "improvement", "nut", "tool"], "order": 4391, "emoji": "🔩"}, {"tags": ["cog", "cogwheel", "tool"], "order": 4393, "emoji": "⚙️"}, {"tags": ["compress", "tool", "vice"], "order": 4395, "emoji": "🗜️"}, {"tags": ["balance", "justice", "libra", "scale", "scales", "tool", "weight", "zodiac"], "order": 4397, "emoji": "⚖️"}, {"tags": ["accessibility", "blind", "cane", "probing", "white"], "order": 4398, "emoji": "🦯"}, {"tags": ["links"], "order": 4399, "emoji": "🔗"}, {"tags": ["break", "breaking", "broken", "chain", "cuffs", "freedom"], "order": 4400, "emoji": "⛓️‍💥"}, {"tags": ["chain"], "order": 4403, "emoji": "⛓️"}, {"tags": ["catch", "crook", "curve", "ensnare", "point", "selling"], "order": 4404, "emoji": "🪝"}, {"tags": ["box", "chest", "mechanic", "red", "tool"], "order": 4405, "emoji": "🧰"}, {"tags": ["attraction", "horseshoe", "magnetic", "negative", "positive", "shape", "u"], "order": 4406, "emoji": "🧲"}, {"tags": ["climb", "rung", "step"], "order": 4407, "emoji": "🪜"}, {"tags": ["bury", "dig", "garden", "hole", "plant", "scoop", "snow", "spade"], "order": 4408, "emoji": "🪏"}, {"tags": ["chemistry", "tool"], "order": 4410, "emoji": "⚗️"}, {"tags": ["chemist", "chemistry", "experiment", "lab", "science", "test", "tube"], "order": 4411, "emoji": "🧪"}, {"tags": ["bacteria", "biologist", "biology", "culture", "dish", "lab", "petri"], "order": 4412, "emoji": "🧫"}, {"tags": ["biologist", "evolution", "gene", "genetics", "life"], "order": 4413, "emoji": "🧬"}, {"tags": ["experiment", "lab", "science", "tool"], "order": 4414, "emoji": "🔬"}, {"tags": ["contact", "extraterrestrial", "science", "tool"], "order": 4415, "emoji": "🔭"}, {"tags": ["aliens", "antenna", "contact", "dish", "satellite", "science"], "order": 4416, "emoji": "📡"}, {"tags": ["doctor", "flu", "medicine", "needle", "shot", "sick", "tool", "vaccination"], "order": 4417, "emoji": "💉"}, {"tags": ["bleed", "blood", "donation", "drop", "injury", "medicine", "menstruation"], "order": 4418, "emoji": "🩸"}, {"tags": ["doctor", "drugs", "medicated", "medicine", "pills", "sick", "vitamin"], "order": 4419, "emoji": "💊"}, {"tags": ["adhesive", "bandage"], "order": 4420, "emoji": "🩹"}, {"tags": ["aid", "cane", "disability", "help", "hurt", "injured", "mobility", "stick"], "order": 4421, "emoji": "🩼"}, {"tags": ["doctor", "heart", "medicine"], "order": 4422, "emoji": "🩺"}, {"tags": ["bones", "doctor", "medical", "skeleton", "skull", "xray"], "order": 4423, "emoji": "🩻"}, {"tags": ["back", "closet", "front"], "order": 4424, "emoji": "🚪"}, {"tags": ["accessibility", "hoist", "lift"], "order": 4425, "emoji": "🛗"}, {"tags": ["makeup", "reflection", "reflector", "speculum"], "order": 4426, "emoji": "🪞"}, {"tags": ["air", "frame", "fresh", "opening", "transparent", "view"], "order": 4427, "emoji": "🪟"}, {"tags": ["hotel", "sleep"], "order": 4429, "emoji": "🛏️"}, {"tags": ["couch", "hotel", "lamp"], "order": 4431, "emoji": "🛋️"}, {"tags": ["seat", "sit"], "order": 4432, "emoji": "🪑"}, {"tags": ["bathroom"], "order": 4433, "emoji": "🚽"}, {"tags": ["cup", "force", "plumber", "poop", "suction", "toilet"], "order": 4434, "emoji": "🪠"}, {"tags": ["water"], "order": 4435, "emoji": "🚿"}, {"tags": ["bath"], "order": 4436, "emoji": "🛁"}, {"tags": ["bait", "cheese", "lure", "mouse", "mousetrap", "snare", "trap"], "order": 4437, "emoji": "🪤"}, {"tags": ["sharp", "shave"], "order": 4438, "emoji": "🪒"}, {"tags": ["bottle", "lotion", "moisturizer", "shampoo", "sunscreen"], "order": 4439, "emoji": "🧴"}, {"tags": ["diaper", "pin", "punk", "rock", "safety"], "order": 4440, "emoji": "🧷"}, {"tags": ["cleaning", "sweeping", "witch"], "order": 4441, "emoji": "🧹"}, {"tags": ["farming", "laundry", "picnic"], "order": 4442, "emoji": "🧺"}, {"tags": ["paper", "roll", "toilet", "towels"], "order": 4443, "emoji": "🧻"}, {"tags": ["cask", "pail", "vat"], "order": 4444, "emoji": "🪣"}, {"tags": ["bar", "bathing", "clean", "cleaning", "lather", "soapdish"], "order": 4445, "emoji": "🧼"}, {"tags": ["bubble", "burp", "clean", "floating", "pearl", "soap", "underwater"], "order": 4446, "emoji": "🫧"}, {"tags": ["bathroom", "brush", "clean", "dental", "hygiene", "teeth", "toiletry"], "order": 4447, "emoji": "🪥"}, {"tags": ["absorbing", "cleaning", "porous", "soak"], "order": 4448, "emoji": "🧽"}, {"tags": ["extinguish", "extinguisher", "fire", "quench"], "order": 4449, "emoji": "🧯"}, {"tags": ["cart", "shopping", "trolley"], "order": 4450, "emoji": "🛒"}, {"tags": ["smoking"], "order": 4451, "emoji": "🚬"}, {"tags": ["dead", "death", "vampire"], "order": 4453, "emoji": "⚰️"}, {"tags": ["cemetery", "dead", "grave", "graveyard", "memorial", "rip", "tomb", "tombstone"], "order": 4454, "emoji": "🪦"}, {"tags": ["ashes", "death", "funeral", "urn"], "order": 4456, "emoji": "⚱️"}, {"tags": ["amulet", "bead", "blue", "charm", "evil-eye", "nazar", "talisman"], "order": 4457, "emoji": "🧿"}, {"tags": ["amulet", "fatima", "fortune", "guide", "hand", "mary", "miriam", "palm", "protect", "protection"], "order": 4458, "emoji": "🪬"}, {"tags": ["face", "moyai", "statue", "stoneface", "travel"], "order": 4459, "emoji": "🗿"}, {"tags": ["card", "demonstration", "notice", "picket", "plaque", "protest", "sign"], "order": 4460, "emoji": "🪧"}, {"tags": ["card", "credentials", "document", "id", "identification", "license", "security"], "order": 4461, "emoji": "🪪"}, {"tags": ["atm", "automated", "bank", "cash", "money", "sign", "teller"], "order": 4462, "emoji": "🏧"}, {"tags": ["bin", "litter", "litterbin", "sign"], "order": 4463, "emoji": "🚮"}, {"tags": ["drinking", "potable", "water"], "order": 4464, "emoji": "🚰"}, {"tags": ["access", "handicap", "symbol", "wheelchair"], "order": 4465, "emoji": "♿️"}, {"tags": ["bathroom", "lavatory", "man", "men’s", "restroom", "room", "toilet", "wc"], "order": 4466, "emoji": "🚹️"}, {"tags": ["bathroom", "lavatory", "restroom", "room", "toilet", "wc", "woman", "women’s"], "order": 4467, "emoji": "🚺️"}, {"tags": ["bathroom", "lavatory", "toilet", "wc"], "order": 4468, "emoji": "🚻"}, {"tags": ["baby", "changing", "symbol"], "order": 4469, "emoji": "🚼️"}, {"tags": ["bathroom", "closet", "lavatory", "restroom", "toilet", "water", "wc"], "order": 4470, "emoji": "🚾"}, {"tags": ["control", "passport"], "order": 4471, "emoji": "🛂"}, {"tags": ["packing"], "order": 4472, "emoji": "🛃"}, {"tags": ["arrived", "baggage", "bags", "case", "checked", "claim", "journey", "packing", "plane", "ready", "travel", "trip"], "order": 4473, "emoji": "🛄"}, {"tags": ["baggage", "case", "left", "locker", "luggage"], "order": 4474, "emoji": "🛅"}, {"tags": ["caution"], "order": 4476, "emoji": "⚠️"}, {"tags": ["child", "children", "crossing", "pedestrian", "traffic"], "order": 4477, "emoji": "🚸"}, {"tags": ["do", "entry", "fail", "forbidden", "no", "not", "pass", "prohibited", "traffic"], "order": 4478, "emoji": "⛔️"}, {"tags": ["entry", "forbidden", "no", "not", "smoke"], "order": 4479, "emoji": "🚫"}, {"tags": ["bicycle", "bicycles", "bike", "forbidden", "no", "not", "prohibited"], "order": 4480, "emoji": "🚳"}, {"tags": ["forbidden", "no", "not", "prohibited", "smoke", "smoking"], "order": 4481, "emoji": "🚭️"}, {"tags": ["forbidden", "litter", "littering", "no", "not", "prohibited"], "order": 4482, "emoji": "🚯"}, {"tags": ["dry", "non-drinking", "non-potable", "prohibited", "water"], "order": 4483, "emoji": "🚱"}, {"tags": ["forbidden", "no", "not", "pedestrian", "pedestrians", "prohibited"], "order": 4484, "emoji": "🚷"}, {"tags": ["cell", "forbidden", "mobile", "no", "not", "phone", "phones", "prohibited", "telephone"], "order": 4485, "emoji": "📵"}, {"tags": ["18", "age", "eighteen", "forbidden", "no", "not", "one", "prohibited", "restriction", "underage"], "order": 4486, "emoji": "🔞"}, {"tags": ["sign"], "order": 4488, "emoji": "☢️"}, {"tags": ["sign"], "order": 4490, "emoji": "☣️"}, {"tags": ["arrow", "cardinal", "direction", "north", "up"], "order": 4492, "emoji": "⬆️"}, {"tags": ["arrow", "direction", "intercardinal", "northeast", "up-right"], "order": 4494, "emoji": "↗️"}, {"tags": ["arrow", "cardinal", "direction", "east", "right"], "order": 4496, "emoji": "➡️"}, {"tags": ["arrow", "direction", "down-right", "intercardinal", "southeast"], "order": 4498, "emoji": "↘️"}, {"tags": ["arrow", "cardinal", "direction", "down", "south"], "order": 4500, "emoji": "⬇️"}, {"tags": ["arrow", "direction", "down-left", "intercardinal", "southwest"], "order": 4502, "emoji": "↙️"}, {"tags": ["arrow", "cardinal", "direction", "left", "west"], "order": 4504, "emoji": "⬅️"}, {"tags": ["arrow", "direction", "intercardinal", "northwest", "up-left"], "order": 4506, "emoji": "↖️"}, {"tags": ["arrow", "up-down"], "order": 4508, "emoji": "↕️"}, {"tags": ["arrow", "left-right"], "order": 4510, "emoji": "↔️"}, {"tags": ["arrow", "curving", "left", "right"], "order": 4512, "emoji": "↩️"}, {"tags": ["arrow", "curving", "left", "right"], "order": 4514, "emoji": "↪️"}, {"tags": ["arrow", "curving", "right", "up"], "order": 4516, "emoji": "⤴️"}, {"tags": ["arrow", "curving", "down", "right"], "order": 4518, "emoji": "⤵️"}, {"tags": ["arrow", "arrows", "clockwise", "refresh", "reload", "vertical"], "order": 4519, "emoji": "🔃"}, {"tags": ["again", "anticlockwise", "arrow", "arrows", "button", "counterclockwise", "deja", "refresh", "rewindershins", "vu"], "order": 4520, "emoji": "🔄"}, {"tags": ["arrow", "back"], "order": 4521, "emoji": "🔙"}, {"tags": ["arrow", "end"], "order": 4522, "emoji": "🔚"}, {"tags": ["arrow", "mark", "on!"], "order": 4523, "emoji": "🔛"}, {"tags": ["arrow", "brb", "omw", "soon"], "order": 4524, "emoji": "🔜"}, {"tags": ["arrow", "homie", "top", "up"], "order": 4525, "emoji": "🔝"}, {"tags": ["place", "pray", "religion", "worship"], "order": 4526, "emoji": "🛐"}, {"tags": ["atheist", "atom", "symbol"], "order": 4528, "emoji": "⚛️"}, {"tags": ["hindu", "religion"], "order": 4530, "emoji": "🕉️"}, {"tags": ["david", "jew", "jewish", "judaism", "religion", "star"], "order": 4532, "emoji": "✡️"}, {"tags": ["buddhist", "dharma", "religion", "wheel"], "order": 4534, "emoji": "☸️"}, {"tags": ["difficult", "lives", "religion", "tao", "taoist", "total", "yang", "yin", "yinyang"], "order": 4536, "emoji": "☯️"}, {"tags": ["christ", "christian", "cross", "latin", "religion"], "order": 4538, "emoji": "✝️"}, {"tags": ["christian", "cross", "orthodox", "religion"], "order": 4540, "emoji": "☦️"}, {"tags": ["crescent", "islam", "muslim", "ramadan", "religion", "star"], "order": 4542, "emoji": "☪️"}, {"tags": ["healing", "peace", "peaceful", "symbol"], "order": 4544, "emoji": "☮️"}, {"tags": ["candelabrum", "candlestick", "hanukkah", "jewish", "judaism", "religion"], "order": 4545, "emoji": "🕎"}, {"tags": ["dotted", "fortune", "jewish", "judaism", "six-pointed", "star"], "order": 4546, "emoji": "🔯"}, {"tags": ["deg", "fateh", "khalsa", "religion", "sikh", "sikhism", "tegh"], "order": 4547, "emoji": "🪯"}, {"tags": ["aries", "horoscope", "ram", "zodiac"], "order": 4548, "emoji": "♈️"}, {"tags": ["bull", "horoscope", "ox", "taurus", "zodiac"], "order": 4549, "emoji": "♉️"}, {"tags": ["gemini", "horoscope", "twins", "zodiac"], "order": 4550, "emoji": "♊️"}, {"tags": ["cancer", "crab", "horoscope", "zodiac"], "order": 4551, "emoji": "♋️"}, {"tags": ["horoscope", "leo", "lion", "zodiac"], "order": 4552, "emoji": "♌️"}, {"tags": ["horoscope", "virgo", "zodiac"], "order": 4553, "emoji": "♍️"}, {"tags": ["balance", "horoscope", "justice", "libra", "scales", "zodiac"], "order": 4554, "emoji": "♎️"}, {"tags": ["horoscope", "scorpio", "scorpion", "scorpius", "zodiac"], "order": 4555, "emoji": "♏️"}, {"tags": ["archer", "horoscope", "sagittarius", "zodiac"], "order": 4556, "emoji": "♐️"}, {"tags": ["capricorn", "goat", "horoscope", "zodiac"], "order": 4557, "emoji": "♑️"}, {"tags": ["aquarius", "bearer", "horoscope", "water", "zodiac"], "order": 4558, "emoji": "♒️"}, {"tags": ["fish", "horoscope", "pisces", "zodiac"], "order": 4559, "emoji": "♓️"}, {"tags": ["bearer", "ophiuchus", "serpent", "snake", "zodiac"], "order": 4560, "emoji": "⛎️"}, {"tags": ["arrow", "button", "crossed", "shuffle", "tracks"], "order": 4561, "emoji": "🔀"}, {"tags": ["arrow", "button", "clockwise", "repeat"], "order": 4562, "emoji": "🔁"}, {"tags": ["arrow", "button", "clockwise", "once", "repeat", "single"], "order": 4563, "emoji": "🔂"}, {"tags": ["arrow", "button", "play", "right", "triangle"], "order": 4565, "emoji": "▶️"}, {"tags": ["arrow", "button", "double", "fast", "fast-forward", "forward"], "order": 4566, "emoji": "⏩️"}, {"tags": ["arrow", "button", "next", "scene", "track", "triangle"], "order": 4568, "emoji": "⏭️"}, {"tags": ["arrow", "button", "pause", "play", "right", "triangle"], "order": 4570, "emoji": "⏯️"}, {"tags": ["arrow", "button", "left", "reverse", "triangle"], "order": 4572, "emoji": "◀️"}, {"tags": ["arrow", "button", "double", "fast", "reverse", "rewind"], "order": 4573, "emoji": "⏪️"}, {"tags": ["arrow", "button", "last", "previous", "scene", "track", "triangle"], "order": 4575, "emoji": "⏮️"}, {"tags": ["arrow", "button", "red", "up", "upwards"], "order": 4576, "emoji": "🔼"}, {"tags": ["arrow", "button", "double", "fast", "up"], "order": 4577, "emoji": "⏫️"}, {"tags": ["arrow", "button", "down", "downwards", "red"], "order": 4578, "emoji": "🔽"}, {"tags": ["arrow", "button", "double", "down", "fast"], "order": 4579, "emoji": "⏬️"}, {"tags": ["bar", "button", "double", "pause", "vertical"], "order": 4581, "emoji": "⏸️"}, {"tags": ["button", "square", "stop"], "order": 4583, "emoji": "⏹️"}, {"tags": ["button", "circle", "record"], "order": 4585, "emoji": "⏺️"}, {"tags": ["button", "eject"], "order": 4587, "emoji": "⏏️"}, {"tags": ["camera", "film", "movie"], "order": 4588, "emoji": "🎦"}, {"tags": ["brightness", "button", "dim", "low"], "order": 4589, "emoji": "🔅"}, {"tags": ["bright", "brightness", "button", "light"], "order": 4590, "emoji": "🔆"}, {"tags": ["antenna", "bar", "bars", "cell", "communication", "mobile", "phone", "signal", "telephone"], "order": 4591, "emoji": "📶"}, {"tags": ["broadband", "computer", "connectivity", "hotspot", "internet", "network", "router", "smartphone", "wi-fi", "wifi", "wlan"], "order": 4592, "emoji": "🛜"}, {"tags": ["cell", "communication", "mobile", "mode", "phone", "telephone", "vibration"], "order": 4593, "emoji": "📳"}, {"tags": ["cell", "mobile", "off", "phone", "telephone"], "order": 4594, "emoji": "📴"}, {"tags": ["female", "sign", "woman"], "order": 4596, "emoji": "♀️"}, {"tags": ["male", "man", "sign"], "order": 4598, "emoji": "♂️"}, {"tags": ["symbol", "transgender"], "order": 4600, "emoji": "⚧️"}, {"tags": ["cancel", "multiplication", "sign", "x", "×"], "order": 4602, "emoji": "✖️"}, {"tags": ["+"], "order": 4603, "emoji": "➕️"}, {"tags": ["-", "heavy", "math", "sign", "−"], "order": 4604, "emoji": "➖️"}, {"tags": ["division", "heavy", "math", "sign", "÷"], "order": 4605, "emoji": "➗️"}, {"tags": ["answer", "equal", "equality", "equals", "heavy", "math", "sign"], "order": 4606, "emoji": "🟰"}, {"tags": ["forever", "unbounded", "universal"], "order": 4608, "emoji": "♾️"}, {"tags": ["!", "!!", "bangbang", "double", "exclamation", "mark", "punctuation"], "order": 4610, "emoji": "‼️"}, {"tags": ["!", "!?", "?", "exclamation", "interrobang", "mark", "punctuation", "question"], "order": 4612, "emoji": "⁉️"}, {"tags": ["?", "mark", "punctuation", "question", "red"], "order": 4613, "emoji": "❓️"}, {"tags": ["?", "mark", "outlined", "punctuation", "question", "white"], "order": 4614, "emoji": "❔️"}, {"tags": ["!", "exclamation", "mark", "outlined", "punctuation", "white"], "order": 4615, "emoji": "❕️"}, {"tags": ["!", "exclamation", "mark", "punctuation", "red"], "order": 4616, "emoji": "❗️"}, {"tags": ["dash", "punctuation", "wavy"], "order": 4618, "emoji": "〰️"}, {"tags": ["bank", "currency", "exchange", "money"], "order": 4619, "emoji": "💱"}, {"tags": ["billion", "cash", "charge", "currency", "dollar", "heavy", "million", "money", "pay", "sign"], "order": 4620, "emoji": "💲"}, {"tags": ["aesculapius", "medical", "medicine", "staff", "symbol"], "order": 4622, "emoji": "⚕️"}, {"tags": ["recycle", "recycling", "symbol"], "order": 4624, "emoji": "♻️"}, {"tags": ["knights"], "order": 4626, "emoji": "⚜️"}, {"tags": ["anchor", "emblem", "poseidon", "ship", "tool", "trident"], "order": 4627, "emoji": "🔱"}, {"tags": ["badge", "name"], "order": 4628, "emoji": "📛"}, {"tags": ["beginner", "chevron", "green", "japanese", "leaf", "symbol", "tool", "yellow"], "order": 4629, "emoji": "🔰"}, {"tags": ["circle", "heavy", "hollow", "large", "o", "red"], "order": 4630, "emoji": "⭕️"}, {"tags": ["button", "check", "checked", "checkmark", "complete", "completed", "done", "fixed", "mark", "tick", "✓"], "order": 4631, "emoji": "✅️"}, {"tags": ["ballot", "box", "check", "checked", "done", "off", "tick", "✓"], "order": 4633, "emoji": "☑️"}, {"tags": ["check", "checked", "checkmark", "done", "heavy", "mark", "tick", "✓"], "order": 4635, "emoji": "✔️"}, {"tags": ["cancel", "cross", "mark", "multiplication", "multiply", "x", "×"], "order": 4636, "emoji": "❌️"}, {"tags": ["button", "cross", "mark", "multiplication", "multiply", "square", "x", "×"], "order": 4637, "emoji": "❎️"}, {"tags": ["curl", "curly", "loop"], "order": 4638, "emoji": "➰️"}, {"tags": ["curl", "curly", "double", "loop"], "order": 4639, "emoji": "➿️"}, {"tags": ["alternation", "mark", "part"], "order": 4641, "emoji": "〽️"}, {"tags": ["*", "asterisk", "eight-spoked"], "order": 4643, "emoji": "✳️"}, {"tags": ["*", "eight-pointed", "star"], "order": 4645, "emoji": "✴️"}, {"tags": ["*"], "order": 4647, "emoji": "❇️"}, {"tags": ["c"], "order": 4649, "emoji": "©️"}, {"tags": ["r"], "order": 4651, "emoji": "®️"}, {"tags": ["mark", "tm", "trade", "trademark"], "order": 4653, "emoji": "™️"}, {"tags": ["drip", "holi", "ink", "liquid", "mess", "paint", "spill", "stain"], "order": 4654, "emoji": "🫟"}, {"tags": ["keycap"], "order": 4655, "emoji": "#️⃣"}, {"tags": ["keycap"], "order": 4657, "emoji": "*️⃣"}, {"tags": ["keycap"], "order": 4659, "emoji": "0️⃣"}, {"tags": ["keycap"], "order": 4661, "emoji": "1️⃣"}, {"tags": ["keycap"], "order": 4663, "emoji": "2️⃣"}, {"tags": ["keycap"], "order": 4665, "emoji": "3️⃣"}, {"tags": ["keycap"], "order": 4667, "emoji": "4️⃣"}, {"tags": ["keycap"], "order": 4669, "emoji": "5️⃣"}, {"tags": ["keycap"], "order": 4671, "emoji": "6️⃣"}, {"tags": ["keycap"], "order": 4673, "emoji": "7️⃣"}, {"tags": ["keycap"], "order": 4675, "emoji": "8️⃣"}, {"tags": ["keycap"], "order": 4677, "emoji": "9️⃣"}, {"tags": ["keycap"], "order": 4679, "emoji": "🔟"}, {"tags": ["abcd", "input", "latin", "letters", "uppercase"], "order": 4680, "emoji": "🔠"}, {"tags": ["abcd", "input", "latin", "letters", "lowercase"], "order": 4681, "emoji": "🔡"}, {"tags": ["1234", "input", "numbers"], "order": 4682, "emoji": "🔢"}, {"tags": ["%", "&", "input", "symbols", "♪", "〒"], "order": 4683, "emoji": "🔣"}, {"tags": ["abc", "alphabet", "input", "latin", "letters"], "order": 4684, "emoji": "🔤"}, {"tags": ["blood", "button", "type"], "order": 4686, "emoji": "🅰️"}, {"tags": ["ab", "blood", "button", "type"], "order": 4687, "emoji": "🆎"}, {"tags": ["b", "blood", "button", "type"], "order": 4689, "emoji": "🅱️"}, {"tags": ["button", "cl"], "order": 4690, "emoji": "🆑"}, {"tags": ["button", "cool"], "order": 4691, "emoji": "🆒"}, {"tags": ["button", "free"], "order": 4692, "emoji": "🆓"}, {"tags": ["i"], "order": 4694, "emoji": "ℹ️"}, {"tags": ["button", "id", "identity"], "order": 4695, "emoji": "🆔"}, {"tags": ["circle", "circled", "m"], "order": 4697, "emoji": "Ⓜ️"}, {"tags": ["button", "new"], "order": 4698, "emoji": "🆕"}, {"tags": ["button", "ng"], "order": 4699, "emoji": "🆖"}, {"tags": ["blood", "button", "o", "type"], "order": 4701, "emoji": "🅾️"}, {"tags": ["button", "ok", "okay"], "order": 4702, "emoji": "🆗"}, {"tags": ["button", "p", "parking"], "order": 4704, "emoji": "🅿️"}, {"tags": ["button", "help", "sos"], "order": 4705, "emoji": "🆘"}, {"tags": ["button", "mark", "up", "up!"], "order": 4706, "emoji": "🆙"}, {"tags": ["button", "versus", "vs"], "order": 4707, "emoji": "🆚"}, {"tags": ["button", "here", "japanese", "katakana"], "order": 4708, "emoji": "🈁"}, {"tags": ["button", "charge", "japanese", "katakana", "service"], "order": 4710, "emoji": "🈂️"}, {"tags": ["amount", "button", "ideograph", "japanese", "monthly"], "order": 4712, "emoji": "🈷️"}, {"tags": ["button", "charge", "free", "ideograph", "japanese", "not"], "order": 4713, "emoji": "🈶"}, {"tags": ["button", "ideograph", "japanese", "reserved"], "order": 4714, "emoji": "🈯️"}, {"tags": ["bargain", "button", "ideograph", "japanese"], "order": 4715, "emoji": "🉐"}, {"tags": ["button", "discount", "ideograph", "japanese"], "order": 4716, "emoji": "🈹"}, {"tags": ["button", "charge", "free", "ideograph", "japanese"], "order": 4717, "emoji": "🈚️"}, {"tags": ["button", "ideograph", "japanese", "prohibited"], "order": 4718, "emoji": "🈲"}, {"tags": ["acceptable", "button", "ideograph", "japanese"], "order": 4719, "emoji": "🉑"}, {"tags": ["application", "button", "ideograph", "japanese"], "order": 4720, "emoji": "🈸"}, {"tags": ["button", "grade", "ideograph", "japanese", "passing"], "order": 4721, "emoji": "🈴"}, {"tags": ["button", "ideograph", "japanese", "vacancy"], "order": 4722, "emoji": "🈳"}, {"tags": ["button", "congratulations", "ideograph", "japanese"], "order": 4724, "emoji": "㊗️"}, {"tags": ["button", "ideograph", "japanese", "secret"], "order": 4726, "emoji": "㊙️"}, {"tags": ["business", "button", "ideograph", "japanese", "open"], "order": 4727, "emoji": "🈺"}, {"tags": ["button", "ideograph", "japanese", "no", "vacancy"], "order": 4728, "emoji": "🈵"}, {"tags": ["circle", "geometric", "red"], "order": 4729, "emoji": "🔴"}, {"tags": ["circle", "orange"], "order": 4730, "emoji": "🟠"}, {"tags": ["circle", "yellow"], "order": 4731, "emoji": "🟡"}, {"tags": ["circle", "green"], "order": 4732, "emoji": "🟢"}, {"tags": ["blue", "circle", "geometric"], "order": 4733, "emoji": "🔵"}, {"tags": ["circle", "purple"], "order": 4734, "emoji": "🟣"}, {"tags": ["brown", "circle"], "order": 4735, "emoji": "🟤"}, {"tags": ["black", "circle", "geometric"], "order": 4736, "emoji": "⚫️"}, {"tags": ["circle", "geometric", "white"], "order": 4737, "emoji": "⚪️"}, {"tags": ["card", "penalty", "red", "square"], "order": 4738, "emoji": "🟥"}, {"tags": ["orange", "square"], "order": 4739, "emoji": "🟧"}, {"tags": ["card", "penalty", "square", "yellow"], "order": 4740, "emoji": "🟨"}, {"tags": ["green", "square"], "order": 4741, "emoji": "🟩"}, {"tags": ["blue", "square"], "order": 4742, "emoji": "🟦"}, {"tags": ["purple", "square"], "order": 4743, "emoji": "🟪"}, {"tags": ["brown", "square"], "order": 4744, "emoji": "🟫"}, {"tags": ["black", "geometric", "large", "square"], "order": 4745, "emoji": "⬛️"}, {"tags": ["geometric", "large", "square", "white"], "order": 4746, "emoji": "⬜️"}, {"tags": ["black", "geometric", "medium", "square"], "order": 4748, "emoji": "◼️"}, {"tags": ["geometric", "medium", "square", "white"], "order": 4750, "emoji": "◻️"}, {"tags": ["black", "geometric", "medium-small", "square"], "order": 4751, "emoji": "◾️"}, {"tags": ["geometric", "medium-small", "square", "white"], "order": 4752, "emoji": "◽️"}, {"tags": ["black", "geometric", "small", "square"], "order": 4754, "emoji": "▪️"}, {"tags": ["geometric", "small", "square", "white"], "order": 4756, "emoji": "▫️"}, {"tags": ["diamond", "geometric", "large", "orange"], "order": 4757, "emoji": "🔶"}, {"tags": ["blue", "diamond", "geometric", "large"], "order": 4758, "emoji": "🔷"}, {"tags": ["diamond", "geometric", "orange", "small"], "order": 4759, "emoji": "🔸"}, {"tags": ["blue", "diamond", "geometric", "small"], "order": 4760, "emoji": "🔹"}, {"tags": ["geometric", "pointed", "red", "triangle", "up"], "order": 4761, "emoji": "🔺"}, {"tags": ["down", "geometric", "pointed", "red", "triangle"], "order": 4762, "emoji": "🔻"}, {"tags": ["comic", "diamond", "dot", "geometric"], "order": 4763, "emoji": "💠"}, {"tags": ["button", "geometric", "radio"], "order": 4764, "emoji": "🔘"}, {"tags": ["button", "geometric", "outlined", "square", "white"], "order": 4765, "emoji": "🔳"}, {"tags": ["black", "button", "geometric", "square"], "order": 4766, "emoji": "🔲"}, {"tags": ["checkered", "chequered", "finish", "flag", "flags", "game", "race", "racing", "sport", "win"], "order": 4767, "emoji": "🏁"}, {"tags": ["construction", "flag", "golf", "post", "triangular"], "order": 4768, "emoji": "🚩"}, {"tags": ["celebration", "cross", "crossed", "flags", "japanese"], "order": 4769, "emoji": "🎌"}, {"tags": ["black", "flag", "waving"], "order": 4770, "emoji": "🏴"}, {"tags": ["flag", "waving", "white"], "order": 4772, "emoji": "🏳️"}, {"tags": ["bisexual", "flag", "gay", "genderqueer", "glbt", "glbtq", "lesbian", "lgbt", "lgbtq", "lgbtqia", "pride", "queer", "rainbow", "trans", "transgender"], "order": 4773, "emoji": "🏳️‍🌈"}, {"tags": ["blue", "flag", "light", "pink", "transgender", "white"], "order": 4775, "emoji": "🏳️‍⚧️"}, {"tags": ["flag", "jolly", "pirate", "plunder", "roger", "treasure"], "order": 4779, "emoji": "🏴‍☠️"}, {"tags": ["AC", "flag"], "order": 4781, "emoji": "🇦🇨"}, {"tags": ["AD", "flag"], "order": 4782, "emoji": "🇦🇩"}, {"tags": ["AE", "flag"], "order": 4783, "emoji": "🇦🇪"}, {"tags": ["AF", "flag"], "order": 4784, "emoji": "🇦🇫"}, {"tags": ["AG", "flag"], "order": 4785, "emoji": "🇦🇬"}, {"tags": ["AI", "flag"], "order": 4786, "emoji": "🇦🇮"}, {"tags": ["AL", "flag"], "order": 4787, "emoji": "🇦🇱"}, {"tags": ["AM", "flag"], "order": 4788, "emoji": "🇦🇲"}, {"tags": ["AO", "flag"], "order": 4789, "emoji": "🇦🇴"}, {"tags": ["AQ", "flag"], "order": 4790, "emoji": "🇦🇶"}, {"tags": ["AR", "flag"], "order": 4791, "emoji": "🇦🇷"}, {"tags": ["AS", "flag"], "order": 4792, "emoji": "🇦🇸"}, {"tags": ["AT", "flag"], "order": 4793, "emoji": "🇦🇹"}, {"tags": ["AU", "flag"], "order": 4794, "emoji": "🇦🇺"}, {"tags": ["AW", "flag"], "order": 4795, "emoji": "🇦🇼"}, {"tags": ["AX", "flag"], "order": 4796, "emoji": "🇦🇽"}, {"tags": ["AZ", "flag"], "order": 4797, "emoji": "🇦🇿"}, {"tags": ["BA", "flag"], "order": 4798, "emoji": "🇧🇦"}, {"tags": ["BB", "flag"], "order": 4799, "emoji": "🇧🇧"}, {"tags": ["BD", "flag"], "order": 4800, "emoji": "🇧🇩"}, {"tags": ["BE", "flag"], "order": 4801, "emoji": "🇧🇪"}, {"tags": ["BF", "flag"], "order": 4802, "emoji": "🇧🇫"}, {"tags": ["BG", "flag"], "order": 4803, "emoji": "🇧🇬"}, {"tags": ["BH", "flag"], "order": 4804, "emoji": "🇧🇭"}, {"tags": ["BI", "flag"], "order": 4805, "emoji": "🇧🇮"}, {"tags": ["BJ", "flag"], "order": 4806, "emoji": "🇧🇯"}, {"tags": ["BL", "flag"], "order": 4807, "emoji": "🇧🇱"}, {"tags": ["BM", "flag"], "order": 4808, "emoji": "🇧🇲"}, {"tags": ["BN", "flag"], "order": 4809, "emoji": "🇧🇳"}, {"tags": ["BO", "flag"], "order": 4810, "emoji": "🇧🇴"}, {"tags": ["BQ", "flag"], "order": 4811, "emoji": "🇧🇶"}, {"tags": ["BR", "flag"], "order": 4812, "emoji": "🇧🇷"}, {"tags": ["BS", "flag"], "order": 4813, "emoji": "🇧🇸"}, {"tags": ["BT", "flag"], "order": 4814, "emoji": "🇧🇹"}, {"tags": ["BV", "flag"], "order": 4815, "emoji": "🇧🇻"}, {"tags": ["BW", "flag"], "order": 4816, "emoji": "🇧🇼"}, {"tags": ["BY", "flag"], "order": 4817, "emoji": "🇧🇾"}, {"tags": ["BZ", "flag"], "order": 4818, "emoji": "🇧🇿"}, {"tags": ["CA", "flag"], "order": 4819, "emoji": "🇨🇦"}, {"tags": ["CC", "flag"], "order": 4820, "emoji": "🇨🇨"}, {"tags": ["CD", "flag"], "order": 4821, "emoji": "🇨🇩"}, {"tags": ["CF", "flag"], "order": 4822, "emoji": "🇨🇫"}, {"tags": ["CG", "flag"], "order": 4823, "emoji": "🇨🇬"}, {"tags": ["CH", "flag"], "order": 4824, "emoji": "🇨🇭"}, {"tags": ["CI", "flag"], "order": 4825, "emoji": "🇨🇮"}, {"tags": ["CK", "flag"], "order": 4826, "emoji": "🇨🇰"}, {"tags": ["CL", "flag"], "order": 4827, "emoji": "🇨🇱"}, {"tags": ["CM", "flag"], "order": 4828, "emoji": "🇨🇲"}, {"tags": ["CN", "flag"], "order": 4829, "emoji": "🇨🇳"}, {"tags": ["CO", "flag"], "order": 4830, "emoji": "🇨🇴"}, {"tags": ["CP", "flag"], "order": 4831, "emoji": "🇨🇵"}, {"tags": ["CQ", "flag"], "order": 4832, "emoji": "🇨🇶"}, {"tags": ["CR", "flag"], "order": 4833, "emoji": "🇨🇷"}, {"tags": ["CU", "flag"], "order": 4834, "emoji": "🇨🇺"}, {"tags": ["CV", "flag"], "order": 4835, "emoji": "🇨🇻"}, {"tags": ["CW", "flag"], "order": 4836, "emoji": "🇨🇼"}, {"tags": ["CX", "flag"], "order": 4837, "emoji": "🇨🇽"}, {"tags": ["CY", "flag"], "order": 4838, "emoji": "🇨🇾"}, {"tags": ["CZ", "flag"], "order": 4839, "emoji": "🇨🇿"}, {"tags": ["DE", "flag"], "order": 4840, "emoji": "🇩🇪"}, {"tags": ["DG", "flag"], "order": 4841, "emoji": "🇩🇬"}, {"tags": ["DJ", "flag"], "order": 4842, "emoji": "🇩🇯"}, {"tags": ["DK", "flag"], "order": 4843, "emoji": "🇩🇰"}, {"tags": ["DM", "flag"], "order": 4844, "emoji": "🇩🇲"}, {"tags": ["DO", "flag"], "order": 4845, "emoji": "🇩🇴"}, {"tags": ["DZ", "flag"], "order": 4846, "emoji": "🇩🇿"}, {"tags": ["EA", "flag"], "order": 4847, "emoji": "🇪🇦"}, {"tags": ["EC", "flag"], "order": 4848, "emoji": "🇪🇨"}, {"tags": ["EE", "flag"], "order": 4849, "emoji": "🇪🇪"}, {"tags": ["EG", "flag"], "order": 4850, "emoji": "🇪🇬"}, {"tags": ["EH", "flag"], "order": 4851, "emoji": "🇪🇭"}, {"tags": ["ER", "flag"], "order": 4852, "emoji": "🇪🇷"}, {"tags": ["ES", "flag"], "order": 4853, "emoji": "🇪🇸"}, {"tags": ["ET", "flag"], "order": 4854, "emoji": "🇪🇹"}, {"tags": ["EU", "flag"], "order": 4855, "emoji": "🇪🇺"}, {"tags": ["FI", "flag"], "order": 4856, "emoji": "🇫🇮"}, {"tags": ["FJ", "flag"], "order": 4857, "emoji": "🇫🇯"}, {"tags": ["FK", "flag"], "order": 4858, "emoji": "🇫🇰"}, {"tags": ["FM", "flag"], "order": 4859, "emoji": "🇫🇲"}, {"tags": ["FO", "flag"], "order": 4860, "emoji": "🇫🇴"}, {"tags": ["FR", "flag"], "order": 4861, "emoji": "🇫🇷"}, {"tags": ["GA", "flag"], "order": 4862, "emoji": "🇬🇦"}, {"tags": ["GB", "flag"], "order": 4863, "emoji": "🇬🇧"}, {"tags": ["GD", "flag"], "order": 4864, "emoji": "🇬🇩"}, {"tags": ["GE", "flag"], "order": 4865, "emoji": "🇬🇪"}, {"tags": ["GF", "flag"], "order": 4866, "emoji": "🇬🇫"}, {"tags": ["GG", "flag"], "order": 4867, "emoji": "🇬🇬"}, {"tags": ["GH", "flag"], "order": 4868, "emoji": "🇬🇭"}, {"tags": ["GI", "flag"], "order": 4869, "emoji": "🇬🇮"}, {"tags": ["GL", "flag"], "order": 4870, "emoji": "🇬🇱"}, {"tags": ["GM", "flag"], "order": 4871, "emoji": "🇬🇲"}, {"tags": ["GN", "flag"], "order": 4872, "emoji": "🇬🇳"}, {"tags": ["GP", "flag"], "order": 4873, "emoji": "🇬🇵"}, {"tags": ["GQ", "flag"], "order": 4874, "emoji": "🇬🇶"}, {"tags": ["GR", "flag"], "order": 4875, "emoji": "🇬🇷"}, {"tags": ["GS", "flag"], "order": 4876, "emoji": "🇬🇸"}, {"tags": ["GT", "flag"], "order": 4877, "emoji": "🇬🇹"}, {"tags": ["GU", "flag"], "order": 4878, "emoji": "🇬🇺"}, {"tags": ["GW", "flag"], "order": 4879, "emoji": "🇬🇼"}, {"tags": ["GY", "flag"], "order": 4880, "emoji": "🇬🇾"}, {"tags": ["HK", "flag"], "order": 4881, "emoji": "🇭🇰"}, {"tags": ["HM", "flag"], "order": 4882, "emoji": "🇭🇲"}, {"tags": ["HN", "flag"], "order": 4883, "emoji": "🇭🇳"}, {"tags": ["HR", "flag"], "order": 4884, "emoji": "🇭🇷"}, {"tags": ["HT", "flag"], "order": 4885, "emoji": "🇭🇹"}, {"tags": ["HU", "flag"], "order": 4886, "emoji": "🇭🇺"}, {"tags": ["IC", "flag"], "order": 4887, "emoji": "🇮🇨"}, {"tags": ["ID", "flag"], "order": 4888, "emoji": "🇮🇩"}, {"tags": ["IE", "flag"], "order": 4889, "emoji": "🇮🇪"}, {"tags": ["IL", "flag"], "order": 4890, "emoji": "🇮🇱"}, {"tags": ["IM", "flag"], "order": 4891, "emoji": "🇮🇲"}, {"tags": ["IN", "flag"], "order": 4892, "emoji": "🇮🇳"}, {"tags": ["IO", "flag"], "order": 4893, "emoji": "🇮🇴"}, {"tags": ["IQ", "flag"], "order": 4894, "emoji": "🇮🇶"}, {"tags": ["IR", "flag"], "order": 4895, "emoji": "🇮🇷"}, {"tags": ["IS", "flag"], "order": 4896, "emoji": "🇮🇸"}, {"tags": ["IT", "flag"], "order": 4897, "emoji": "🇮🇹"}, {"tags": ["JE", "flag"], "order": 4898, "emoji": "🇯🇪"}, {"tags": ["JM", "flag"], "order": 4899, "emoji": "🇯🇲"}, {"tags": ["JO", "flag"], "order": 4900, "emoji": "🇯🇴"}, {"tags": ["JP", "flag"], "order": 4901, "emoji": "🇯🇵"}, {"tags": ["KE", "flag"], "order": 4902, "emoji": "🇰🇪"}, {"tags": ["KG", "flag"], "order": 4903, "emoji": "🇰🇬"}, {"tags": ["KH", "flag"], "order": 4904, "emoji": "🇰🇭"}, {"tags": ["KI", "flag"], "order": 4905, "emoji": "🇰🇮"}, {"tags": ["KM", "flag"], "order": 4906, "emoji": "🇰🇲"}, {"tags": ["KN", "flag"], "order": 4907, "emoji": "🇰🇳"}, {"tags": ["KP", "flag"], "order": 4908, "emoji": "🇰🇵"}, {"tags": ["KR", "flag"], "order": 4909, "emoji": "🇰🇷"}, {"tags": ["KW", "flag"], "order": 4910, "emoji": "🇰🇼"}, {"tags": ["KY", "flag"], "order": 4911, "emoji": "🇰🇾"}, {"tags": ["KZ", "flag"], "order": 4912, "emoji": "🇰🇿"}, {"tags": ["LA", "flag"], "order": 4913, "emoji": "🇱🇦"}, {"tags": ["LB", "flag"], "order": 4914, "emoji": "🇱🇧"}, {"tags": ["LC", "flag"], "order": 4915, "emoji": "🇱🇨"}, {"tags": ["LI", "flag"], "order": 4916, "emoji": "🇱🇮"}, {"tags": ["LK", "flag"], "order": 4917, "emoji": "🇱🇰"}, {"tags": ["LR", "flag"], "order": 4918, "emoji": "🇱🇷"}, {"tags": ["LS", "flag"], "order": 4919, "emoji": "🇱🇸"}, {"tags": ["LT", "flag"], "order": 4920, "emoji": "🇱🇹"}, {"tags": ["LU", "flag"], "order": 4921, "emoji": "🇱🇺"}, {"tags": ["LV", "flag"], "order": 4922, "emoji": "🇱🇻"}, {"tags": ["LY", "flag"], "order": 4923, "emoji": "🇱🇾"}, {"tags": ["MA", "flag"], "order": 4924, "emoji": "🇲🇦"}, {"tags": ["MC", "flag"], "order": 4925, "emoji": "🇲🇨"}, {"tags": ["MD", "flag"], "order": 4926, "emoji": "🇲🇩"}, {"tags": ["ME", "flag"], "order": 4927, "emoji": "🇲🇪"}, {"tags": ["MF", "flag"], "order": 4928, "emoji": "🇲🇫"}, {"tags": ["MG", "flag"], "order": 4929, "emoji": "🇲🇬"}, {"tags": ["MH", "flag"], "order": 4930, "emoji": "🇲🇭"}, {"tags": ["MK", "flag"], "order": 4931, "emoji": "🇲🇰"}, {"tags": ["ML", "flag"], "order": 4932, "emoji": "🇲🇱"}, {"tags": ["MM", "flag"], "order": 4933, "emoji": "🇲🇲"}, {"tags": ["MN", "flag"], "order": 4934, "emoji": "🇲🇳"}, {"tags": ["MO", "flag"], "order": 4935, "emoji": "🇲🇴"}, {"tags": ["MP", "flag"], "order": 4936, "emoji": "🇲🇵"}, {"tags": ["MQ", "flag"], "order": 4937, "emoji": "🇲🇶"}, {"tags": ["MR", "flag"], "order": 4938, "emoji": "🇲🇷"}, {"tags": ["MS", "flag"], "order": 4939, "emoji": "🇲🇸"}, {"tags": ["MT", "flag"], "order": 4940, "emoji": "🇲🇹"}, {"tags": ["MU", "flag"], "order": 4941, "emoji": "🇲🇺"}, {"tags": ["MV", "flag"], "order": 4942, "emoji": "🇲🇻"}, {"tags": ["MW", "flag"], "order": 4943, "emoji": "🇲🇼"}, {"tags": ["MX", "flag"], "order": 4944, "emoji": "🇲🇽"}, {"tags": ["MY", "flag"], "order": 4945, "emoji": "🇲🇾"}, {"tags": ["MZ", "flag"], "order": 4946, "emoji": "🇲🇿"}, {"tags": ["NA", "flag"], "order": 4947, "emoji": "🇳🇦"}, {"tags": ["NC", "flag"], "order": 4948, "emoji": "🇳🇨"}, {"tags": ["NE", "flag"], "order": 4949, "emoji": "🇳🇪"}, {"tags": ["NF", "flag"], "order": 4950, "emoji": "🇳🇫"}, {"tags": ["NG", "flag"], "order": 4951, "emoji": "🇳🇬"}, {"tags": ["NI", "flag"], "order": 4952, "emoji": "🇳🇮"}, {"tags": ["NL", "flag"], "order": 4953, "emoji": "🇳🇱"}, {"tags": ["NO", "flag"], "order": 4954, "emoji": "🇳🇴"}, {"tags": ["NP", "flag"], "order": 4955, "emoji": "🇳🇵"}, {"tags": ["NR", "flag"], "order": 4956, "emoji": "🇳🇷"}, {"tags": ["NU", "flag"], "order": 4957, "emoji": "🇳🇺"}, {"tags": ["NZ", "flag"], "order": 4958, "emoji": "🇳🇿"}, {"tags": ["OM", "flag"], "order": 4959, "emoji": "🇴🇲"}, {"tags": ["PA", "flag"], "order": 4960, "emoji": "🇵🇦"}, {"tags": ["PE", "flag"], "order": 4961, "emoji": "🇵🇪"}, {"tags": ["PF", "flag"], "order": 4962, "emoji": "🇵🇫"}, {"tags": ["PG", "flag"], "order": 4963, "emoji": "🇵🇬"}, {"tags": ["PH", "flag"], "order": 4964, "emoji": "🇵🇭"}, {"tags": ["PK", "flag"], "order": 4965, "emoji": "🇵🇰"}, {"tags": ["PL", "flag"], "order": 4966, "emoji": "🇵🇱"}, {"tags": ["PM", "flag"], "order": 4967, "emoji": "🇵🇲"}, {"tags": ["PN", "flag"], "order": 4968, "emoji": "🇵🇳"}, {"tags": ["PR", "flag"], "order": 4969, "emoji": "🇵🇷"}, {"tags": ["PS", "flag"], "order": 4970, "emoji": "🇵🇸"}, {"tags": ["PT", "flag"], "order": 4971, "emoji": "🇵🇹"}, {"tags": ["PW", "flag"], "order": 4972, "emoji": "🇵🇼"}, {"tags": ["PY", "flag"], "order": 4973, "emoji": "🇵🇾"}, {"tags": ["QA", "flag"], "order": 4974, "emoji": "🇶🇦"}, {"tags": ["RE", "flag"], "order": 4975, "emoji": "🇷🇪"}, {"tags": ["RO", "flag"], "order": 4976, "emoji": "🇷🇴"}, {"tags": ["RS", "flag"], "order": 4977, "emoji": "🇷🇸"}, {"tags": ["RU", "flag"], "order": 4978, "emoji": "🇷🇺"}, {"tags": ["RW", "flag"], "order": 4979, "emoji": "🇷🇼"}, {"tags": ["SA", "flag"], "order": 4980, "emoji": "🇸🇦"}, {"tags": ["SB", "flag"], "order": 4981, "emoji": "🇸🇧"}, {"tags": ["SC", "flag"], "order": 4982, "emoji": "🇸🇨"}, {"tags": ["SD", "flag"], "order": 4983, "emoji": "🇸🇩"}, {"tags": ["SE", "flag"], "order": 4984, "emoji": "🇸🇪"}, {"tags": ["SG", "flag"], "order": 4985, "emoji": "🇸🇬"}, {"tags": ["SH", "flag"], "order": 4986, "emoji": "🇸🇭"}, {"tags": ["SI", "flag"], "order": 4987, "emoji": "🇸🇮"}, {"tags": ["SJ", "flag"], "order": 4988, "emoji": "🇸🇯"}, {"tags": ["SK", "flag"], "order": 4989, "emoji": "🇸🇰"}, {"tags": ["SL", "flag"], "order": 4990, "emoji": "🇸🇱"}, {"tags": ["SM", "flag"], "order": 4991, "emoji": "🇸🇲"}, {"tags": ["SN", "flag"], "order": 4992, "emoji": "🇸🇳"}, {"tags": ["SO", "flag"], "order": 4993, "emoji": "🇸🇴"}, {"tags": ["SR", "flag"], "order": 4994, "emoji": "🇸🇷"}, {"tags": ["SS", "flag"], "order": 4995, "emoji": "🇸🇸"}, {"tags": ["ST", "flag"], "order": 4996, "emoji": "🇸🇹"}, {"tags": ["SV", "flag"], "order": 4997, "emoji": "🇸🇻"}, {"tags": ["SX", "flag"], "order": 4998, "emoji": "🇸🇽"}, {"tags": ["SY", "flag"], "order": 4999, "emoji": "🇸🇾"}, {"tags": ["SZ", "flag"], "order": 5000, "emoji": "🇸🇿"}, {"tags": ["TA", "flag"], "order": 5001, "emoji": "🇹🇦"}, {"tags": ["TC", "flag"], "order": 5002, "emoji": "🇹🇨"}, {"tags": ["TD", "flag"], "order": 5003, "emoji": "🇹🇩"}, {"tags": ["TF", "flag"], "order": 5004, "emoji": "🇹🇫"}, {"tags": ["TG", "flag"], "order": 5005, "emoji": "🇹🇬"}, {"tags": ["TH", "flag"], "order": 5006, "emoji": "🇹🇭"}, {"tags": ["TJ", "flag"], "order": 5007, "emoji": "🇹🇯"}, {"tags": ["TK", "flag"], "order": 5008, "emoji": "🇹🇰"}, {"tags": ["TL", "flag"], "order": 5009, "emoji": "🇹🇱"}, {"tags": ["TM", "flag"], "order": 5010, "emoji": "🇹🇲"}, {"tags": ["TN", "flag"], "order": 5011, "emoji": "🇹🇳"}, {"tags": ["TO", "flag"], "order": 5012, "emoji": "🇹🇴"}, {"tags": ["TR", "flag"], "order": 5013, "emoji": "🇹🇷"}, {"tags": ["TT", "flag"], "order": 5014, "emoji": "🇹🇹"}, {"tags": ["TV", "flag"], "order": 5015, "emoji": "🇹🇻"}, {"tags": ["TW", "flag"], "order": 5016, "emoji": "🇹🇼"}, {"tags": ["TZ", "flag"], "order": 5017, "emoji": "🇹🇿"}, {"tags": ["UA", "flag"], "order": 5018, "emoji": "🇺🇦"}, {"tags": ["UG", "flag"], "order": 5019, "emoji": "🇺🇬"}, {"tags": ["UM", "flag"], "order": 5020, "emoji": "🇺🇲"}, {"tags": ["UN", "flag"], "order": 5021, "emoji": "🇺🇳"}, {"tags": ["US", "flag"], "order": 5022, "emoji": "🇺🇸"}, {"tags": ["UY", "flag"], "order": 5023, "emoji": "🇺🇾"}, {"tags": ["UZ", "flag"], "order": 5024, "emoji": "🇺🇿"}, {"tags": ["VA", "flag"], "order": 5025, "emoji": "🇻🇦"}, {"tags": ["VC", "flag"], "order": 5026, "emoji": "🇻🇨"}, {"tags": ["VE", "flag"], "order": 5027, "emoji": "🇻🇪"}, {"tags": ["VG", "flag"], "order": 5028, "emoji": "🇻🇬"}, {"tags": ["VI", "flag"], "order": 5029, "emoji": "🇻🇮"}, {"tags": ["VN", "flag"], "order": 5030, "emoji": "🇻🇳"}, {"tags": ["VU", "flag"], "order": 5031, "emoji": "🇻🇺"}, {"tags": ["WF", "flag"], "order": 5032, "emoji": "🇼🇫"}, {"tags": ["WS", "flag"], "order": 5033, "emoji": "🇼🇸"}, {"tags": ["XK", "flag"], "order": 5034, "emoji": "🇽🇰"}, {"tags": ["YE", "flag"], "order": 5035, "emoji": "🇾🇪"}, {"tags": ["YT", "flag"], "order": 5036, "emoji": "🇾🇹"}, {"tags": ["ZA", "flag"], "order": 5037, "emoji": "🇿🇦"}, {"tags": ["ZM", "flag"], "order": 5038, "emoji": "🇿🇲"}, {"tags": ["ZW", "flag"], "order": 5039, "emoji": "🇿🇼"}, {"tags": ["flag", "gbeng"], "order": 5040, "emoji": "🏴󠁧󠁢󠁥󠁮󠁧󠁿"}, {"tags": ["flag", "gbsct"], "order": 5041, "emoji": "🏴󠁧󠁢󠁳󠁣󠁴󠁿"}, {"tags": ["flag", "gbwls"], "order": 5042, "emoji": "🏴󠁧󠁢󠁷󠁬󠁳󠁿"}] \ No newline at end of file diff --git a/src/zen/common/modules/ZenCommonUtils.mjs b/src/zen/common/modules/ZenCommonUtils.mjs index 143ece00e..cfa7f90e5 100644 --- a/src/zen/common/modules/ZenCommonUtils.mjs +++ b/src/zen/common/modules/ZenCommonUtils.mjs @@ -4,9 +4,9 @@ window.gZenOperatingSystemCommonUtils = { kZenOSToSmallName: { - WINNT: 'windows', - Darwin: 'macos', - Linux: 'linux', + WINNT: "windows", + Darwin: "macos", + Linux: "linux", }, get currentOperatingSystem() { @@ -19,11 +19,11 @@ export class nsZenMultiWindowFeature { constructor() {} static get browsers() { - return Services.wm.getEnumerator('navigator:browser'); + return Services.wm.getEnumerator("navigator:browser"); } static get currentBrowser() { - return Services.wm.getMostRecentWindow('navigator:browser'); + return Services.wm.getMostRecentWindow("navigator:browser"); } static get isActiveWindow() { @@ -38,13 +38,15 @@ export class nsZenMultiWindowFeature { if (!nsZenMultiWindowFeature.isActiveWindow) { return; } - return this.forEachWindow(callback); + await this.forEachWindow(callback); } async forEachWindow(callback) { for (const browser of nsZenMultiWindowFeature.browsers) { try { - if (browser.closed) continue; + if (browser.closed) { + continue; + } await callback(browser); } catch (e) { console.error(e); @@ -55,7 +57,9 @@ export class nsZenMultiWindowFeature { forEachWindowSync(callback) { for (const browser of nsZenMultiWindowFeature.browsers) { try { - if (browser.closed) continue; + if (browser.closed) { + continue; + } callback(browser); } catch (e) { console.error(e); @@ -67,14 +71,14 @@ export class nsZenMultiWindowFeature { export class nsZenDOMOperatedFeature { constructor() { var initBound = this.init.bind(this); - document.addEventListener('DOMContentLoaded', initBound, { once: true }); + document.addEventListener("DOMContentLoaded", initBound, { once: true }); } } export class nsZenPreloadedFeature { constructor() { var initBound = this.init.bind(this); - document.addEventListener('MozBeforeInitialXULLayout', initBound, { once: true }); + document.addEventListener("MozBeforeInitialXULLayout", initBound, { once: true }); } } @@ -84,15 +88,17 @@ window.gZenCommonActions = { const displaySpec = currentUrl.displaySpec; ClipboardHelper.copyString(displaySpec); let button; - if (Services.zen.canShare() && displaySpec.startsWith('http')) { + /* eslint-disable mozilla/valid-services */ + if (Services.zen.canShare() && displaySpec.startsWith("http")) { button = { - id: 'zen-copy-current-url-button', + id: "zen-copy-current-url-button", command: (event) => { const buttonRect = event.target.getBoundingClientRect(); + /* eslint-disable mozilla/valid-services */ Services.zen.share( currentUrl, - '', - '', + "", + "", buttonRect.left, window.innerHeight - buttonRect.bottom, buttonRect.width, @@ -101,7 +107,7 @@ window.gZenCommonActions = { }, }; } - gZenUIManager.showToast('zen-copy-current-url-confirmation', { button, timeout: 3000 }); + gZenUIManager.showToast("zen-copy-current-url-confirmation", { button, timeout: 3000 }); }, copyCurrentURLAsMarkdownToClipboard() { @@ -109,7 +115,7 @@ window.gZenCommonActions = { const tabTitle = gBrowser.selectedTab.label; const markdownLink = `[${tabTitle}](${currentUrl.displaySpec})`; ClipboardHelper.copyString(markdownLink); - gZenUIManager.showToast('zen-copy-current-url-confirmation', { timeout: 3000 }); + gZenUIManager.showToast("zen-copy-current-url-confirmation", { timeout: 3000 }); }, throttle(f, delay) { @@ -125,13 +131,13 @@ window.gZenCommonActions = { * Only tabs with an owner that are not pinned and not empty are eligible. * Respects the user preference zen.tabs.close-on-back-with-no-history. * - * @return {boolean} True if the tab should be closed on back + * @returns {boolean} True if the tab should be closed on back */ shouldCloseTabOnBack() { - if (!Services.prefs.getBoolPref('zen.tabs.close-on-back-with-no-history', true)) { + if (!Services.prefs.getBoolPref("zen.tabs.close-on-back-with-no-history", true)) { return false; } const tab = gBrowser.selectedTab; - return Boolean(tab.owner && !tab.pinned && !tab.hasAttribute('zen-empty-tab')); + return Boolean(tab.owner && !tab.pinned && !tab.hasAttribute("zen-empty-tab")); }, }; diff --git a/src/zen/common/modules/ZenHasPolyfill.mjs b/src/zen/common/modules/ZenHasPolyfill.mjs index 97035fabc..9b4e2c3dd 100644 --- a/src/zen/common/modules/ZenHasPolyfill.mjs +++ b/src/zen/common/modules/ZenHasPolyfill.mjs @@ -9,13 +9,16 @@ class nsHasPolyfill { } /** - * @param {{selector: string, exists: boolean}} descendantSelectors + * @param {HTMLElement} element + * @param {Array<{selector: string, exists: boolean}>} descendantSelectors + * @param {string} stateAttribute + * @param {Array} attributeFilter */ observeSelectorExistence(element, descendantSelectors, stateAttribute, attributeFilter = []) { const updateState = () => { const exists = descendantSelectors.some(({ selector }) => { let selected = element.querySelector(selector); - if (selected?.tagName?.toLowerCase() === 'menu') { + if (selected?.tagName?.toLowerCase() === "menu") { return null; } return selected; @@ -25,10 +28,8 @@ class nsHasPolyfill { if (!element.hasAttribute(stateAttribute)) { gZenCompactModeManager._setElementExpandAttribute(element, true, stateAttribute); } - } else { - if (element.hasAttribute(stateAttribute)) { - gZenCompactModeManager._setElementExpandAttribute(element, false, stateAttribute); - } + } else if (element.hasAttribute(stateAttribute)) { + gZenCompactModeManager._setElementExpandAttribute(element, false, stateAttribute); } }; @@ -70,6 +71,6 @@ class nsHasPolyfill { } const hasPolyfillInstance = new nsHasPolyfill(); -window.addEventListener('unload', () => hasPolyfillInstance.destroy(), { once: true }); +window.addEventListener("unload", () => hasPolyfillInstance.destroy(), { once: true }); window.ZenHasPolyfill = hasPolyfillInstance; diff --git a/src/zen/common/modules/ZenMenubar.mjs b/src/zen/common/modules/ZenMenubar.mjs index 55167f9be..b052c19a4 100644 --- a/src/zen/common/modules/ZenMenubar.mjs +++ b/src/zen/common/modules/ZenMenubar.mjs @@ -2,7 +2,7 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -const WINDOW_SCHEME_PREF = 'zen.view.window.scheme'; +const WINDOW_SCHEME_PREF = "zen.view.window.scheme"; const WINDOW_SCHEME_MAPPING = { dark: 0, light: 1, @@ -25,31 +25,33 @@ class nsZenMenuBar { `); - const menu = appearanceMenu.querySelector('menu'); - menu.addEventListener('command', (event) => { - const type = event.target.getAttribute('data-type'); + const menu = appearanceMenu.querySelector("menu"); + menu.addEventListener("command", (event) => { + const type = event.target.getAttribute("data-type"); const schemeValue = WINDOW_SCHEME_MAPPING[type]; Services.prefs.setIntPref(WINDOW_SCHEME_PREF, schemeValue); }); - const parent = document.getElementById('view-menu'); - const parentPopup = parent.querySelector('menupopup'); - parentPopup.prepend(document.createXULElement('menuseparator')); + const viewMenu = document.getElementById("view-menu"); + const parentPopup = viewMenu.querySelector("menupopup"); + parentPopup.prepend(document.createXULElement("menuseparator")); parentPopup.prepend(menu); - const sibling = document.getElementById('viewSidebarMenuMenu'); + const sibling = document.getElementById("viewSidebarMenuMenu"); const togglePinnedItem = window.MozXULElement.parseXULToFragment( '' - ).querySelector('menuitem'); - if (!gZenWorkspaces.privateWindowOrDisabled) sibling.after(togglePinnedItem); + ).querySelector("menuitem"); + if (!gZenWorkspaces.privateWindowOrDisabled) { + sibling.after(togglePinnedItem); + } - parentPopup.addEventListener('popupshowing', () => { + parentPopup.addEventListener("popupshowing", () => { const currentScheme = Services.prefs.getIntPref(WINDOW_SCHEME_PREF); for (const [type, value] of Object.entries(WINDOW_SCHEME_MAPPING)) { let menuItem = menu.querySelector(`menuitem[data-type="${type}"]`); if (value === currentScheme) { - menuItem.setAttribute('checked', 'true'); + menuItem.setAttribute("checked", "true"); } else { - menuItem.removeAttribute('checked'); + menuItem.removeAttribute("checked"); } } const pinnedAreCollapsed = @@ -58,13 +60,13 @@ class nsZenMenuBar { document.l10n.setArgs(togglePinnedItem, args); }); - togglePinnedItem.addEventListener('command', () => { + togglePinnedItem.addEventListener("command", () => { gZenWorkspaces.activeWorkspaceElement?.collapsiblePins.toggle(); }); } #initSpacesMenu() { - let menubar = window.MozXULElement.parseXULToFragment(` + let spacesMenubar = window.MozXULElement.parseXULToFragment(` @@ -82,8 +84,8 @@ class nsZenMenuBar { key="zen-workspace-backward"/> `); - document.getElementById('view-menu').after(menubar); - document.getElementById('zen-spaces-menubar').addEventListener('popupshowing', () => { + document.getElementById("view-menu").after(spacesMenubar); + document.getElementById("zen-spaces-menubar").addEventListener("popupshowing", () => { gZenWorkspaces.updateWorkspacesChangeContextMenu(); }); } diff --git a/src/zen/common/modules/ZenSessionStore.mjs b/src/zen/common/modules/ZenSessionStore.mjs index a01a8ef60..677277f15 100644 --- a/src/zen/common/modules/ZenSessionStore.mjs +++ b/src/zen/common/modules/ZenSessionStore.mjs @@ -2,7 +2,7 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -import { nsZenPreloadedFeature } from 'chrome://browser/content/zen-components/ZenCommonUtils.mjs'; +import { nsZenPreloadedFeature } from "chrome://browser/content/zen-components/ZenCommonUtils.mjs"; class ZenSessionStore extends nsZenPreloadedFeature { init() { @@ -15,11 +15,11 @@ class ZenSessionStore extends nsZenPreloadedFeature { restoreInitialTabData(tab, tabData) { if (tabData.zenWorkspace) { - tab.setAttribute('zen-workspace-id', tabData.zenWorkspace); + tab.setAttribute("zen-workspace-id", tabData.zenWorkspace); } // Keep for now, for backward compatibility for window sync to work. if (tabData.zenSyncId || tabData.zenPinnedId) { - tab.setAttribute('id', tabData.zenSyncId || tabData.zenPinnedId); + tab.setAttribute("id", tabData.zenSyncId || tabData.zenPinnedId); } if (tabData.zenStaticLabel) { tab.zenStaticLabel = tabData.zenStaticLabel; @@ -28,10 +28,10 @@ class ZenSessionStore extends nsZenPreloadedFeature { tab.zenStaticIcon = tabData.image; } if (tabData.zenEssential) { - tab.setAttribute('zen-essential', 'true'); + tab.setAttribute("zen-essential", "true"); } if (tabData.zenDefaultUserContextId) { - tab.setAttribute('zenDefaultUserContextId', 'true'); + tab.setAttribute("zenDefaultUserContextId", "true"); } if (tabData._zenPinnedInitialState) { tab._zenPinnedInitialState = tabData._zenPinnedInitialState; diff --git a/src/zen/common/modules/ZenSidebarNotification.mjs b/src/zen/common/modules/ZenSidebarNotification.mjs index 84c52864e..e40d4c340 100644 --- a/src/zen/common/modules/ZenSidebarNotification.mjs +++ b/src/zen/common/modules/ZenSidebarNotification.mjs @@ -2,14 +2,14 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { html } from 'chrome://global/content/vendor/lit.all.mjs'; -import { MozLitElement } from 'chrome://global/content/lit-utils.mjs'; +import { html } from "chrome://global/content/vendor/lit.all.mjs"; +import { MozLitElement } from "chrome://global/content/lit-utils.mjs"; const lazy = {}; -ChromeUtils.defineLazyGetter(lazy, 'siblingElement', () => { +ChromeUtils.defineLazyGetter(lazy, "siblingElement", () => { // All our notifications should be attached after the media controls toolbar - return document.getElementById('zen-media-controls-toolbar'); + return document.getElementById("zen-media-controls-toolbar"); }); /** @@ -17,8 +17,6 @@ ChromeUtils.defineLazyGetter(lazy, 'siblingElement', () => { * * Displays and takes care of animations for notifications that * appear in the sidebar. - * - * @properties {headingL10nId} - The L10n ID for the heading text. */ class ZenSidebarNotification extends MozLitElement { static properties = { @@ -26,7 +24,7 @@ class ZenSidebarNotification extends MozLitElement { links: { type: Array }, }; - constructor({ headingL10nId = '', links = [] } = {}) { + constructor({ headingL10nId = "", links = [] } = {}) { super(); this.headingL10nId = headingL10nId; this.links = links; @@ -54,7 +52,7 @@ class ZenSidebarNotification extends MozLitElement { + data-l10n-id=${this.headingL10nId}>
this.remove()}>
@@ -71,13 +69,13 @@ class ZenSidebarNotification extends MozLitElement { link.action(); return; } - window.openLinkIn(link.url, 'tab', { + window.openLinkIn(link.url, "tab", { triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(), forceForeground: true, }); this.remove(); }}> - + @@ -89,7 +87,7 @@ class ZenSidebarNotification extends MozLitElement { } #animateIn() { - this.style.opacity = '0'; + this.style.opacity = "0"; return gZenUIManager.motion.animate( this, { @@ -121,8 +119,8 @@ export default function createSidebarNotification(args) { const notification = new ZenSidebarNotification(args); - lazy.siblingElement.insertAdjacentElement('afterend', notification); + lazy.siblingElement.insertAdjacentElement("afterend", notification); return notification; } -customElements.define('zen-sidebar-notification', ZenSidebarNotification); +customElements.define("zen-sidebar-notification", ZenSidebarNotification); diff --git a/src/zen/common/modules/ZenStartup.mjs b/src/zen/common/modules/ZenStartup.mjs index 01891bf26..517398862 100644 --- a/src/zen/common/modules/ZenStartup.mjs +++ b/src/zen/common/modules/ZenStartup.mjs @@ -4,10 +4,10 @@ import checkForZenUpdates, { createWindowUpdateAnimation, -} from 'chrome://browser/content/ZenUpdates.mjs'; +} from "chrome://browser/content/ZenUpdates.mjs"; class ZenStartup { - #watermarkIgnoreElements = ['zen-toast-container']; + #watermarkIgnoreElements = ["zen-toast-container"]; #hasInitializedLayout = false; isReady = false; @@ -20,38 +20,42 @@ class ZenStartup { } #initBrowserBackground() { - const background = document.createXULElement('box'); - background.id = 'zen-browser-background'; - background.classList.add('zen-browser-generic-background'); - const grain = document.createXULElement('box'); - grain.classList.add('zen-browser-grain'); + const background = document.createXULElement("box"); + background.id = "zen-browser-background"; + background.classList.add("zen-browser-generic-background"); + const grain = document.createXULElement("box"); + grain.classList.add("zen-browser-grain"); background.appendChild(grain); - document.getElementById('browser').prepend(background); + document.getElementById("browser").prepend(background); const toolbarBackground = background.cloneNode(true); - toolbarBackground.removeAttribute('id'); - toolbarBackground.classList.add('zen-toolbar-background'); - document.getElementById('titlebar').prepend(toolbarBackground); + toolbarBackground.removeAttribute("id"); + toolbarBackground.classList.add("zen-toolbar-background"); + document.getElementById("titlebar").prepend(toolbarBackground); } #zenInitBrowserLayout() { - if (this.#hasInitializedLayout) return; + if (this.#hasInitializedLayout) { + return; + } this.#hasInitializedLayout = true; gZenKeyboardShortcutsManager.beforeInit(); try { - const kNavbarItems = ['nav-bar', 'PersonalToolbar']; - const kNewContainerId = 'zen-appcontent-navbar-container'; + const kNavbarItems = ["nav-bar", "PersonalToolbar"]; + const kNewContainerId = "zen-appcontent-navbar-container"; let newContainer = document.getElementById(kNewContainerId); for (let id of kNavbarItems) { const node = document.getElementById(id); - console.assert(node, 'Could not find node with id: ' + id); - if (!node) continue; + if (!node) { + console.error("Could not find node with id: " + id); + continue; + } newContainer.appendChild(node); } // Fix notification deck - const deckTemplate = document.getElementById('tab-notification-deck-template'); + const deckTemplate = document.getElementById("tab-notification-deck-template"); if (deckTemplate) { - document.getElementById('zen-appcontent-wrapper').prepend(deckTemplate); + document.getElementById("zen-appcontent-wrapper").prepend(deckTemplate); } gZenWorkspaces.init(); @@ -60,20 +64,20 @@ class ZenStartup { this.#checkForWelcomePage(); }, 0); } catch (e) { - console.error('ZenThemeModifier: Error initializing browser layout', e); + console.error("ZenThemeModifier: Error initializing browser layout", e); } if (gBrowserInit.delayedStartupFinished) { this.delayedStartupFinished(); } else { - Services.obs.addObserver(this, 'browser-delayed-startup-finished'); + Services.obs.addObserver(this, "browser-delayed-startup-finished"); } } observe(aSubject, aTopic) { // This nsIObserver method allows us to defer initialization until after // this window has finished painting and starting up. - if (aTopic == 'browser-delayed-startup-finished' && aSubject == window) { - Services.obs.removeObserver(this, 'browser-delayed-startup-finished'); + if (aTopic == "browser-delayed-startup-finished" && aSubject == window) { + Services.obs.removeObserver(this, "browser-delayed-startup-finished"); this.delayedStartupFinished(); } } @@ -86,35 +90,35 @@ class ZenStartup { this.#initSearchBar(); gZenCompactModeManager.init(); // Fix for https://github.com/zen-browser/desktop/issues/7605, specially in compact mode - if (gURLBar.hasAttribute('breakout-extend')) { + if (gURLBar.hasAttribute("breakout-extend")) { gURLBar.focus(); } // A bit of a hack to make sure the tabs toolbar is updated. // Just in case we didn't get the right size. gZenUIManager.updateTabsToolbar(); this.closeWatermark(); - document.getElementById('tabbrowser-arrowscrollbox').setAttribute('orient', 'vertical'); + document.getElementById("tabbrowser-arrowscrollbox").setAttribute("orient", "vertical"); this.isReady = true; }); } openWatermark() { - if (!Services.prefs.getBoolPref('zen.watermark.enabled', false)) { - document.documentElement.removeAttribute('zen-before-loaded'); + if (!Services.prefs.getBoolPref("zen.watermark.enabled", false)) { + document.documentElement.removeAttribute("zen-before-loaded"); return; } - for (let elem of document.querySelectorAll('#browser > *, #urlbar')) { + for (let elem of document.querySelectorAll("#browser > *, #urlbar")) { elem.style.opacity = 0; } } closeWatermark() { - document.documentElement.removeAttribute('zen-before-loaded'); - if (Services.prefs.getBoolPref('zen.watermark.enabled', false)) { - let elementsToIgnore = this.#watermarkIgnoreElements.map((id) => '#' + id).join(', '); + document.documentElement.removeAttribute("zen-before-loaded"); + if (Services.prefs.getBoolPref("zen.watermark.enabled", false)) { + let elementsToIgnore = this.#watermarkIgnoreElements.map((id) => "#" + id).join(", "); gZenUIManager.motion .animate( - '#browser > *:not(' + elementsToIgnore + '), #urlbar, #tabbrowser-tabbox > *', + "#browser > *:not(" + elementsToIgnore + "), #urlbar, #tabbrowser-tabbox > *", { opacity: [0, 1], }, @@ -124,24 +128,24 @@ class ZenStartup { ) .then(() => { for (let elem of document.querySelectorAll( - '#browser > *, #urlbar, #tabbrowser-tabbox > *' + "#browser > *, #urlbar, #tabbrowser-tabbox > *" )) { - elem.style.removeProperty('opacity'); + elem.style.removeProperty("opacity"); } }); } window.requestAnimationFrame(() => { - window.dispatchEvent(new window.Event('resize')); // To recalculate the layout + window.dispatchEvent(new window.Event("resize")); // To recalculate the layout }); } #changeSidebarLocation() { - const kElementsToAppend = ['sidebar-splitter', 'sidebar-box']; + const kElementsToAppend = ["sidebar-splitter", "sidebar-box"]; - const browser = document.getElementById('browser'); + const browser = document.getElementById("browser"); browser.prepend(gNavToolbox); - const sidebarPanelWrapper = document.getElementById('tabbrowser-tabbox'); + const sidebarPanelWrapper = document.getElementById("tabbrowser-tabbox"); for (let id of kElementsToAppend) { const elem = document.getElementById(id); if (elem) { @@ -156,12 +160,12 @@ class ZenStartup { } #checkForWelcomePage() { - if (!Services.prefs.getBoolPref('zen.welcome-screen.seen', false)) { - Services.prefs.setBoolPref('zen.welcome-screen.seen', true); - Services.prefs.setStringPref('zen.updates.last-build-id', Services.appinfo.appBuildID); - Services.prefs.setStringPref('zen.updates.last-version', Services.appinfo.version); + if (!Services.prefs.getBoolPref("zen.welcome-screen.seen", false)) { + Services.prefs.setBoolPref("zen.welcome-screen.seen", true); + Services.prefs.setStringPref("zen.updates.last-build-id", Services.appinfo.appBuildID); + Services.prefs.setStringPref("zen.updates.last-version", Services.appinfo.version); Services.scriptloader.loadSubScript( - 'chrome://browser/content/zen-components/ZenWelcome.mjs', + "chrome://browser/content/zen-components/ZenWelcome.mjs", window ); } else { @@ -178,7 +182,7 @@ class ZenStartup { window.gZenStartup = new ZenStartup(); window.addEventListener( - 'MozBeforeInitialXULLayout', + "MozBeforeInitialXULLayout", () => { gZenStartup.init(); }, diff --git a/src/zen/common/modules/ZenUIManager.mjs b/src/zen/common/modules/ZenUIManager.mjs index d6d3f5892..6afcfbb4f 100644 --- a/src/zen/common/modules/ZenUIManager.mjs +++ b/src/zen/common/modules/ZenUIManager.mjs @@ -2,29 +2,29 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -import { nsZenMultiWindowFeature } from 'chrome://browser/content/zen-components/ZenCommonUtils.mjs'; -import { ZenMenubar } from 'chrome://browser/content/zen-components/ZenMenubar.mjs'; +import { nsZenMultiWindowFeature } from "chrome://browser/content/zen-components/ZenCommonUtils.mjs"; +import { ZenMenubar } from "chrome://browser/content/zen-components/ZenMenubar.mjs"; window.gZenUIManager = { _popupTrackingElements: [], _hoverPausedForExpand: false, _hasLoadedDOM: false, - testingEnabled: Services.prefs.getBoolPref('zen.testing.enabled', false), - profilingEnabled: Services.prefs.getBoolPref('zen.testing.profiling.enabled', false), + testingEnabled: Services.prefs.getBoolPref("zen.testing.enabled", false), + profilingEnabled: Services.prefs.getBoolPref("zen.testing.profiling.enabled", false), _lastClickPosition: null, _toastTimeouts: [], init() { - document.addEventListener('popupshowing', this.onPopupShowing.bind(this)); - document.addEventListener('popuphidden', this.onPopupHidden.bind(this)); + document.addEventListener("popupshowing", this.onPopupShowing.bind(this)); + document.addEventListener("popuphidden", this.onPopupHidden.bind(this)); - document.addEventListener('mousedown', this.handleMouseDown.bind(this), true); + document.addEventListener("mousedown", this.handleMouseDown.bind(this), true); - ChromeUtils.defineLazyGetter(this, 'motion', () => { + ChromeUtils.defineLazyGetter(this, "motion", () => { Services.scriptloader.loadSubScript( - 'chrome://browser/content/zen-vendor/motion.min.mjs', + "chrome://browser/content/zen-vendor/motion.min.mjs", window ); const motion = window.Motion; @@ -32,14 +32,14 @@ window.gZenUIManager = { return motion; }); - ChromeUtils.defineLazyGetter(this, '_toastContainer', () => { - return document.getElementById('zen-toast-container'); + ChromeUtils.defineLazyGetter(this, "_toastContainer", () => { + return document.getElementById("zen-toast-container"); }); new ResizeObserver( gZenCommonActions.throttle( gZenCompactModeManager.getAndApplySidebarWidth.bind(gZenCompactModeManager), - Services.prefs.getIntPref('zen.view.sidebar-height-throttle', 500) + Services.prefs.getIntPref("zen.view.sidebar-height-throttle", 500) ) ).observe(gNavToolbox); @@ -48,9 +48,9 @@ window.gZenUIManager = { this.updateTabsToolbar(); }); - window.addEventListener('TabClose', this.onTabClose.bind(this)); + window.addEventListener("TabClose", this.onTabClose.bind(this)); window.addEventListener( - 'Zen:UrlbarSearchModeChanged', + "Zen:UrlbarSearchModeChanged", this.onUrlbarSearchModeChanged.bind(this) ); @@ -70,6 +70,10 @@ window.gZenUIManager = { * Animate an element using Element.animate API. * This is not using gZenUIManager.motion, because motion library has some issues * with certain properties and we want to have a simple wrapper for that. + * + * @param {Element} element + * @param {object} rawKeyframes + * @param {...any} args */ async elementAnimate(element, rawKeyframes, ...args) { rawKeyframes = { ...rawKeyframes }; @@ -83,15 +87,14 @@ window.gZenUIManager = { delete rawKeyframes.x; delete rawKeyframes.scale; rawKeyframes.transform = []; - console.assert( - yValues.length === 0 || xValues.length === 0 || yValues.length === xValues.length, - 'y and x keyframes must have the same length' - ); - const length = Math.max(yValues.length, xValues.length, scaleValues.length); - for (let i = 0; i < length; i++) { - const y = yValues[i] !== undefined ? `translateY(${yValues[i]}px)` : ''; - const x = xValues[i] !== undefined ? `translateX(${xValues[i]}px)` : ''; - const scale = scaleValues[i] !== undefined ? `scale(${scaleValues[i]})` : ''; + if (yValues.length !== 0 && xValues.length !== 0 && yValues.length !== xValues.length) { + console.error("y and x keyframes must have the same length"); + } + const keyframeLength = Math.max(yValues.length, xValues.length, scaleValues.length); + for (let i = 0; i < keyframeLength; i++) { + const y = yValues[i] !== undefined ? `translateY(${yValues[i]}px)` : ""; + const x = xValues[i] !== undefined ? `translateX(${xValues[i]}px)` : ""; + const scale = scaleValues[i] !== undefined ? `scale(${scaleValues[i]})` : ""; rawKeyframes.transform.push(`${x} ${y} ${scale}`.trim()); } } @@ -110,52 +113,52 @@ window.gZenUIManager = { }, _addNewCustomizableButtonsIfNeeded() { - const kPref = 'zen.ui.migration.compact-mode-button-added'; - let navbarPlacements = CustomizableUI.getWidgetIdsInArea('zen-sidebar-top-buttons'); + const kPref = "zen.ui.migration.compact-mode-button-added"; + let navbarPlacements = CustomizableUI.getWidgetIdsInArea("zen-sidebar-top-buttons"); try { if (!navbarPlacements.length && !Services.prefs.getBoolPref(kPref, false)) { - CustomizableUI.addWidgetToArea('zen-toggle-compact-mode', 'zen-sidebar-top-buttons', 0); + CustomizableUI.addWidgetToArea("zen-toggle-compact-mode", "zen-sidebar-top-buttons", 0); gZenVerticalTabsManager._topButtonsSeparatorElement.before( - document.getElementById('zen-toggle-compact-mode') + document.getElementById("zen-toggle-compact-mode") ); } } catch (e) { - console.error('Error adding compact mode button to sidebar:', e); + console.error("Error adding compact mode button to sidebar:", e); } Services.prefs.setBoolPref(kPref, true); }, _initBookmarkCollapseListener() { - const toolbar = document.getElementById('PersonalToolbar'); - if (!toolbar.hasAttribute('collapsed')) { + const bookmarkToolbar = document.getElementById("PersonalToolbar"); + if (!bookmarkToolbar.hasAttribute("collapsed")) { // Set it initially if bookmarks toolbar is visible, customizable UI // is ran before this function. - document.documentElement.setAttribute('zen-has-bookmarks', 'true'); + document.documentElement.setAttribute("zen-has-bookmarks", "true"); } - toolbar.addEventListener('toolbarvisibilitychange', (event) => { + bookmarkToolbar.addEventListener("toolbarvisibilitychange", (event) => { const visible = event.detail.visible; if (visible) { - document.documentElement.setAttribute('zen-has-bookmarks', 'true'); + document.documentElement.setAttribute("zen-has-bookmarks", "true"); } else { - document.documentElement.removeAttribute('zen-has-bookmarks'); + document.documentElement.removeAttribute("zen-has-bookmarks"); } }); }, _initOmnibox() { const { registerZenUrlbarProviders } = ChromeUtils.importESModule( - 'resource:///modules/ZenUBProvider.sys.mjs' + "resource:///modules/ZenUBProvider.sys.mjs" ); - const { nsZenSiteDataPanel } = ChromeUtils.importESModule( - 'resource:///modules/ZenSiteDataPanel.sys.mjs' + const { nsZenSiteDataPanel: ZenSiteDataPanel } = ChromeUtils.importESModule( + "resource:///modules/ZenSiteDataPanel.sys.mjs" ); registerZenUrlbarProviders(); - window.gZenSiteDataPanel = new nsZenSiteDataPanel(window); + window.gZenSiteDataPanel = new ZenSiteDataPanel(window); gURLBar._zenTrimURL = this.urlbarTrim.bind(this); }, _debloatContextMenus() { - if (!Services.prefs.getBoolPref('zen.view.context-menu.refresh', false)) { + if (!Services.prefs.getBoolPref("zen.view.context-menu.refresh", false)) { return; } const contextMenusToClean = [ @@ -163,39 +166,39 @@ window.gZenUIManager = { // reason: It doesn't properly work with zen and it's philosophy of not having // new tabs. It's also semi-not working as it doesn't create a new tab below // the current one. - 'context_openANewTab', + "context_openANewTab", ]; for (const id of contextMenusToClean) { const menu = document.getElementById(id); if (!menu) { continue; } - menu.setAttribute('hidden', 'true'); + menu.setAttribute("hidden", "true"); } }, _initCreateNewPopup() { - const popup = document.getElementById('zenCreateNewPopup'); + const popup = document.getElementById("zenCreateNewPopup"); - popup.addEventListener('popupshowing', () => { - const button = document.getElementById('zen-create-new-button'); + popup.addEventListener("popupshowing", () => { + const button = document.getElementById("zen-create-new-button"); if (!button) { return; } - const image = button.querySelector('image'); - button.setAttribute('open', 'true'); + const image = button.querySelector("image"); + button.setAttribute("open", "true"); gZenUIManager.motion.animate( image, - { transform: ['rotate(0deg)', 'rotate(45deg)'] }, + { transform: ["rotate(0deg)", "rotate(45deg)"] }, { duration: 0.2 } ); popup.addEventListener( - 'popuphidden', + "popuphidden", () => { - button.removeAttribute('open'); + button.removeAttribute("open"); gZenUIManager.motion.animate( image, - { transform: ['rotate(45deg)', 'rotate(0deg)'] }, + { transform: ["rotate(45deg)", "rotate(0deg)"] }, { duration: 0.2 } ); }, @@ -214,11 +217,11 @@ window.gZenUIManager = { updateTabsToolbar() { const kUrlbarHeight = 335; gURLBar.style.setProperty( - '--zen-urlbar-top', + "--zen-urlbar-top", `${window.innerHeight / 2 - Math.max(kUrlbarHeight, gURLBar.getBoundingClientRect().height) / 2}px` ); - gURLBar.style.setProperty('--zen-urlbar-width', `${Math.min(window.innerWidth / 2, 700)}px`); - gZenVerticalTabsManager.actualWindowButtons.removeAttribute('zen-has-hover'); + gURLBar.style.setProperty("--zen-urlbar-width", `${Math.min(window.innerWidth / 2, 700)}px`); + gZenVerticalTabsManager.actualWindowButtons.removeAttribute("zen-has-hover"); gZenVerticalTabsManager.recalculateURLBarHeight(); if (!this._preventToolbarRebuild) { setTimeout(() => { @@ -232,7 +235,7 @@ window.gZenUIManager = { if (this._tabsWrapper) { return this._tabsWrapper; } - this._tabsWrapper = document.getElementById('zen-tabs-wrapper'); + this._tabsWrapper = document.getElementById("zen-tabs-wrapper"); return this._tabsWrapper; }, @@ -264,12 +267,13 @@ window.gZenUIManager = { }, createValidXULText(text) { - return text.replace(/&/g, '&').replace(//g, '>'); + return text.replace(/&/g, "&").replace(//g, ">"); }, /** * Adds the 'has-popup-menu' attribute to the element when popup is opened on it. - * @param element element to track + * + * @param {Element} element element to track */ addPopupTrackingAttribute(element) { this._popupTrackingElements.push(element); @@ -285,17 +289,17 @@ window.gZenUIManager = { // we also ignore menus inside panels if ( !el.contains(showEvent.explicitOriginalTarget) || - (showEvent.explicitOriginalTarget instanceof Element && - showEvent.explicitOriginalTarget?.closest('panel')) || + (Element.isInstance(showEvent.explicitOriginalTarget) && + showEvent.explicitOriginalTarget?.closest("panel")) || // See bug #7590: Ignore menupopup elements opening. // Also see #10612 for the exclusion of the zen-appcontent-navbar-wrapper - (showEvent.explicitOriginalTarget.tagName === 'menupopup' && - el.id !== 'zen-appcontent-navbar-wrapper') + (showEvent.explicitOriginalTarget.tagName === "menupopup" && + el.id !== "zen-appcontent-navbar-wrapper") ) { continue; } - document.removeEventListener('mousemove', this.__removeHasPopupAttribute); - gZenCompactModeManager._setElementExpandAttribute(el, true, 'has-popup-menu'); + document.removeEventListener("mousemove", this.__removeHasPopupAttribute); + gZenCompactModeManager._setElementExpandAttribute(el, true, "has-popup-menu"); this.__currentPopup = showEvent.target; this.__currentPopupTrackElement = el; break; @@ -307,12 +311,12 @@ window.gZenUIManager = { return; } const element = this.__currentPopupTrackElement; - if (document.getElementById('main-window').matches(':hover')) { - gZenCompactModeManager._setElementExpandAttribute(element, false, 'has-popup-menu'); + if (document.getElementById("main-window").matches(":hover")) { + gZenCompactModeManager._setElementExpandAttribute(element, false, "has-popup-menu"); } else { this.__removeHasPopupAttribute = () => - gZenCompactModeManager._setElementExpandAttribute(element, false, 'has-popup-menu'); - document.addEventListener('mousemove', this.__removeHasPopupAttribute, { once: true }); + gZenCompactModeManager._setElementExpandAttribute(element, false, "has-popup-menu"); + document.addEventListener("mousemove", this.__removeHasPopupAttribute, { once: true }); } this.__currentPopup = null; this.__currentPopupTrackElement = null; @@ -322,32 +326,32 @@ window.gZenUIManager = { onUrlbarOpen() { setTimeout(() => { - const hadValid = gURLBar.getAttribute('pageproxystate') === 'valid'; - gURLBar.setPageProxyState('invalid', false); - gURLBar.setAttribute('had-proxystate', hadValid); + const hadValid = gURLBar.getAttribute("pageproxystate") === "valid"; + gURLBar.setPageProxyState("invalid", false); + gURLBar.setAttribute("had-proxystate", hadValid); }, 0); }, onUrlbarClose() { - if (gURLBar.getAttribute('had-proxystate') == 'true') { - gURLBar.setPageProxyState('valid', false); + if (gURLBar.getAttribute("had-proxystate") == "true") { + gURLBar.setPageProxyState("valid", false); } - gURLBar.removeAttribute('had-proxystate'); + gURLBar.removeAttribute("had-proxystate"); }, onUrlbarSearchModeChanged(event) { const { searchMode } = event.detail; const input = gURLBar; - if (gURLBar.hasAttribute('breakout-extend') && !this._animatingSearchMode) { + if (gURLBar.hasAttribute("breakout-extend") && !this._animatingSearchMode) { this._animatingSearchMode = true; this.motion.animate(input, { scale: [1, 0.98, 1] }, { duration: 0.25 }).then(() => { delete this._animatingSearchMode; }); if (searchMode) { - gURLBar.setAttribute('animate-searchmode', 'true'); + gURLBar.setAttribute("animate-searchmode", "true"); this._animatingSearchModeTimeout = setTimeout(() => { requestAnimationFrame(() => { - gURLBar.removeAttribute('animate-searchmode'); + gURLBar.removeAttribute("animate-searchmode"); delete this._animatingSearchModeTimeout; }); }, 1000); @@ -357,7 +361,7 @@ window.gZenUIManager = { enableCommandsMode(event) { event.preventDefault(); - if (!gURLBar.hasAttribute('breakout-extend') || this._animatingSearchMode) { + if (!gURLBar.hasAttribute("breakout-extend") || this._animatingSearchMode) { return; } const currentSearchMode = gURLBar.getSearchMode(gBrowser.selectedBrowser); @@ -368,7 +372,7 @@ window.gZenUIManager = { isPreview: true, }; } - gURLBar.removeAttribute('animate-searchmode'); + gURLBar.removeAttribute("animate-searchmode"); if (this._animatingSearchModeTimeout) { clearTimeout(this._animatingSearchModeTimeout); delete this._animatingSearchModeTimeout; @@ -381,11 +385,11 @@ window.gZenUIManager = { }, get newtabButtons() { - return document.querySelectorAll('#tabs-newtab-button'); + return document.querySelectorAll("#tabs-newtab-button"); }, _prevUrlbarLabel: null, - _lastSearch: '', + _lastSearch: "", _clearTimeout: null, _lastTab: null, @@ -412,7 +416,7 @@ window.gZenUIManager = { handleNewTab(werePassedURL, searchClipboard, where, overridePreferance = false) { // Validate browser state first if (!this._validateBrowserState()) { - console.warn('Browser state invalid for new tab operation'); + console.warn("Browser state invalid for new tab operation"); return false; } @@ -425,7 +429,7 @@ window.gZenUIManager = { (gZenVerticalTabsManager._canReplaceNewTab && !werePassedURL && !searchClipboard && - where === 'tab'); + where === "tab"); if (!shouldOpenURLBar) { return false; @@ -440,7 +444,7 @@ window.gZenUIManager = { // Store the current tab this._lastTab = gBrowser.selectedTab; if (!this._lastTab) { - console.warn('No selected tab found when creating new tab'); + console.warn("No selected tab found when creating new tab"); return false; } @@ -450,23 +454,23 @@ window.gZenUIManager = { } // Store URL bar state - this._prevUrlbarLabel = gURLBar._untrimmedValue || ''; + this._prevUrlbarLabel = gURLBar._untrimmedValue || ""; // Set up URL bar for new tab gURLBar._zenHandleUrlbarClose = this.handleUrlbarClose.bind(this); - gURLBar.setAttribute('zen-newtab', true); + gURLBar.setAttribute("zen-newtab", true); // Update newtab buttons for (const button of this.newtabButtons) { - button.setAttribute('in-urlbar', true); + button.setAttribute("in-urlbar", true); } // Open location command try { - gURLBar.search(this._lastSearch || ''); - document.getElementById('Browser:OpenLocation').doCommand(); + gURLBar.search(this._lastSearch || ""); + document.getElementById("Browser:OpenLocation").doCommand(); } catch (e) { - console.error('Error opening location in new tab:', e); + console.error("Error opening location in new tab:", e); this.handleUrlbarClose(false); return false; } @@ -475,13 +479,13 @@ window.gZenUIManager = { clearUrlbarData() { this._prevUrlbarLabel = null; - this._lastSearch = ''; + this._lastSearch = ""; }, handleUrlbarClose(onSwitch = false, onElementPicked = false) { // Validate browser state first if (!this._validateBrowserState()) { - console.warn('Browser state invalid for URL bar close operation'); + console.warn("Browser state invalid for URL bar close operation"); return; } @@ -493,7 +497,7 @@ window.gZenUIManager = { const isFocusedBefore = gURLBar.focused; setTimeout(() => { // We use this attribute on Tabbrowser::addTab - gURLBar.removeAttribute('zen-newtab'); + gURLBar.removeAttribute("zen-newtab"); // Safely restore tab visual state with proper validation if ( @@ -509,14 +513,14 @@ window.gZenUIManager = { // Reset newtab buttons for (const button of this.newtabButtons) { - button.removeAttribute('in-urlbar'); + button.removeAttribute("in-urlbar"); } // Handle search data if (onSwitch) { this.clearUrlbarData(); } else { - this._lastSearch = gURLBar._untrimmedValue || ''; + this._lastSearch = gURLBar._untrimmedValue || ""; if (this._clearTimeout) { clearTimeout(this._clearTimeout); @@ -541,7 +545,7 @@ window.gZenUIManager = { if (isFocusedBefore) { setTimeout(() => { window.dispatchEvent( - new CustomEvent('ZenURLBarClosed', { detail: { onSwitch, onElementPicked } }) + new CustomEvent("ZenURLBarClosed", { detail: { onSwitch, onElementPicked } }) ); gURLBar.view.close({ elementPicked: onElementPicked }); gURLBar.updateTextOverflow(); @@ -567,10 +571,10 @@ window.gZenUIManager = { if ( gZenVerticalTabsManager._hasSetSingleToolbar && this.urlbarShowDomainOnly && - !gURLBar.hasAttribute('breakout-extend') + !gURLBar.hasAttribute("breakout-extend") ) { let url = BrowserUIUtils.removeSingleTrailingSlashFromURL(aURL); - return url.startsWith('https://') ? url.split('/')[2] : url; + return url.startsWith("https://") ? url.split("/")[2] : url; } return BrowserUIUtils.trimURL(aURL); }, @@ -578,38 +582,38 @@ window.gZenUIManager = { // Section: Notification messages _createToastElement(messageId, options) { const createButton = () => { - const button = document.createXULElement('button'); + const button = document.createXULElement("button"); button.id = options.button.id; - button.classList.add('footer-button'); - button.classList.add('primary'); - button.addEventListener('command', options.button.command); + button.classList.add("footer-button"); + button.classList.add("primary"); + button.addEventListener("command", options.button.command); return button; }; // Check if this message ID already exists for (const child of this._toastContainer.children) { if (child._messageId === messageId) { - child.removeAttribute('button'); + child.removeAttribute("button"); if (options.button) { const button = createButton(); - const existingButton = child.querySelector('button'); + const existingButton = child.querySelector("button"); if (existingButton) { existingButton.remove(); } child.appendChild(button); - child.setAttribute('button', true); + child.setAttribute("button", true); } return [child, true]; } } - const wrapper = document.createXULElement('hbox'); - const element = document.createXULElement('vbox'); - const label = document.createXULElement('label'); + const wrapper = document.createXULElement("hbox"); + const element = document.createXULElement("vbox"); + const label = document.createXULElement("label"); document.l10n.setAttributes(label, messageId, options.l10nArgs); element.appendChild(label); if (options.descriptionId) { - const description = document.createXULElement('label'); - description.classList.add('description'); + const description = document.createXULElement("label"); + description.classList.add("description"); document.l10n.setAttributes(description, options.descriptionId, options); element.appendChild(description); } @@ -617,19 +621,19 @@ window.gZenUIManager = { if (options.button) { const button = createButton(); wrapper.appendChild(button); - wrapper.setAttribute('button', true); + wrapper.setAttribute("button", true); } - wrapper.classList.add('zen-toast'); + wrapper.classList.add("zen-toast"); wrapper._messageId = messageId; return [wrapper, false]; }, async showToast(messageId, options = {}) { const [toast, reused] = this._createToastElement(messageId, options); - this._toastContainer.removeAttribute('hidden'); + this._toastContainer.removeAttribute("hidden"); this._toastContainer.appendChild(toast); const timeoutFunction = () => { - if (Services.prefs.getBoolPref('ui.popup.disable_autohide')) { + if (Services.prefs.getBoolPref("ui.popup.disable_autohide")) { return; } this.motion @@ -637,19 +641,19 @@ window.gZenUIManager = { .then(() => { toast.remove(); if (this._toastContainer.children.length === 0) { - this._toastContainer.setAttribute('hidden', true); + this._toastContainer.setAttribute("hidden", true); } }); }; if (reused) { await this.motion.animate(toast, { scale: 0.2 }, { duration: 0.1, bounce: 0 }); } else { - toast.addEventListener('mouseover', () => { + toast.addEventListener("mouseover", () => { if (this._toastTimeouts[messageId]) { clearTimeout(this._toastTimeouts[messageId]); } }); - toast.addEventListener('mouseout', () => { + toast.addEventListener("mouseout", () => { if (this._toastTimeouts[messageId]) { clearTimeout(this._toastTimeouts[messageId]); } @@ -657,9 +661,9 @@ window.gZenUIManager = { }); } if (!toast.style.transform) { - toast.style.transform = 'scale(0)'; + toast.style.transform = "scale(0)"; } - await this.motion.animate(toast, { scale: 1 }, { type: 'spring', bounce: 0.2, duration: 0.5 }); + await this.motion.animate(toast, { scale: 1 }, { type: "spring", bounce: 0.2, duration: 0.5 }); if (this._toastTimeouts[messageId]) { clearTimeout(this._toastTimeouts[messageId]); } @@ -710,25 +714,25 @@ window.gZenUIManager = { // behavior where dragging the text-area resizer downward with the mouse actually grows the panel's top edge upward, since // the bottom of the panel is anchored in place. We want to disable the resizer if the panel was positioned to be anchored // from one of its bottom corners. - let block = 'bottomleft'; - let inline = 'topleft'; - if (anchor?.closest('#zen-sidebar-top-buttons')) { - block = 'topleft'; + let block = "bottomleft"; + let inline = "topleft"; + if (anchor?.closest("#zen-sidebar-top-buttons")) { + block = "topleft"; } if ( (gZenVerticalTabsManager._hasSetSingleToolbar && gZenVerticalTabsManager._prefsRightSide) || - (panel?.id === 'zen-unified-site-data-panel' && + (panel?.id === "zen-unified-site-data-panel" && !gZenVerticalTabsManager._hasSetSingleToolbar) || - (panel?.id === 'unified-extensions-panel' && gZenVerticalTabsManager._hasSetSingleToolbar) + (panel?.id === "unified-extensions-panel" && gZenVerticalTabsManager._hasSetSingleToolbar) ) { - block = 'bottomright'; - inline = 'topright'; + block = "bottomright"; + inline = "topright"; } return `${block} ${inline}`; }, urlStringsDomainMatch(url1, url2) { - if (!url1.startsWith('http') || !url2?.startsWith('http')) { + if (!url1.startsWith("http") || !url2?.startsWith("http")) { return false; } return Services.io.newURI(url1).host === Services.io.newURI(url2).host; @@ -738,15 +742,15 @@ window.gZenUIManager = { try { let tab = gBrowser.getTabForBrowser(browser); if ( - openUILinkWhere === 'current' && + openUILinkWhere === "current" && !this.urlStringsDomainMatch(url, browser.currentURI.spec) && tab.pinned && - Services.prefs.getBoolPref('zen.tabs.open-pinned-in-new-tab') + Services.prefs.getBoolPref("zen.tabs.open-pinned-in-new-tab") ) { - return 'tab'; + return "tab"; } } catch (e) { - console.error('Error in getOpenUILinkWhere:', e); + console.error("Error in getOpenUILinkWhere:", e); } return openUILinkWhere; }, @@ -754,21 +758,21 @@ window.gZenUIManager = { XPCOMUtils.defineLazyPreferenceGetter( gZenUIManager, - 'contentElementSeparation', - 'zen.theme.content-element-separation', + "contentElementSeparation", + "zen.theme.content-element-separation", 0 ); XPCOMUtils.defineLazyPreferenceGetter( gZenUIManager, - 'urlbarWaitToClear', - 'zen.urlbar.wait-to-clear', + "urlbarWaitToClear", + "zen.urlbar.wait-to-clear", 0 ); XPCOMUtils.defineLazyPreferenceGetter( gZenUIManager, - 'urlbarShowDomainOnly', - 'zen.urlbar.show-domain-only-in-sidebar', + "urlbarShowDomainOnly", + "zen.urlbar.show-domain-only-in-sidebar", true ); @@ -777,53 +781,53 @@ window.gZenVerticalTabsManager = { this._multiWindowFeature = new nsZenMultiWindowFeature(); this._initWaitPromise(); - ChromeUtils.defineLazyGetter(this, 'isWindowsStyledButtons', () => { + ChromeUtils.defineLazyGetter(this, "isWindowsStyledButtons", () => { return !( - window.AppConstants.platform === 'macosx' || - window.matchMedia('(-moz-gtk-csd-reversed-placement)').matches || - Services.prefs.getBoolPref('zen.view.experimental-force-window-controls-left') + window.AppConstants.platform === "macosx" || + window.matchMedia("(-moz-gtk-csd-reversed-placement)").matches || + Services.prefs.getBoolPref("zen.view.experimental-force-window-controls-left") ); }); - ChromeUtils.defineLazyGetter(this, 'hidesTabsToolbar', () => { + ChromeUtils.defineLazyGetter(this, "hidesTabsToolbar", () => { return ( - document.documentElement.getAttribute('chromehidden')?.includes('toolbar') || - document.documentElement.getAttribute('chromehidden')?.includes('menubar') + document.documentElement.getAttribute("chromehidden")?.includes("toolbar") || + document.documentElement.getAttribute("chromehidden")?.includes("menubar") ); }); XPCOMUtils.defineLazyPreferenceGetter( this, - '_canReplaceNewTab', - 'zen.urlbar.replace-newtab', + "_canReplaceNewTab", + "zen.urlbar.replace-newtab", true ); var updateEvent = this._updateEvent.bind(this); var onPrefChange = this._onPrefChange.bind(this); this.initializePreferences(onPrefChange); - this._toolbarOriginalParent = document.getElementById('nav-bar').parentElement; + this._toolbarOriginalParent = document.getElementById("nav-bar").parentElement; gZenCompactModeManager.addEventListener(updateEvent); this.initRightSideOrderContextMenu(); - window.addEventListener('customizationstarting', this._preCustomize.bind(this)); - window.addEventListener('aftercustomization', this._postCustomize.bind(this)); + window.addEventListener("customizationstarting", this._preCustomize.bind(this)); + window.addEventListener("aftercustomization", this._postCustomize.bind(this)); this._updateEvent(); if (!this.isWindowsStyledButtons) { - document.documentElement.setAttribute('zen-window-buttons-reversed', true); + document.documentElement.setAttribute("zen-window-buttons-reversed", true); } this._renameTabHalt = this.renameTabHalt.bind(this); - gBrowser.tabContainer.addEventListener('dblclick', this.renameTabStart.bind(this)); + gBrowser.tabContainer.addEventListener("dblclick", this.renameTabStart.bind(this)); }, toggleExpand() { - const newVal = !Services.prefs.getBoolPref('zen.view.sidebar-expanded'); - Services.prefs.setBoolPref('zen.view.sidebar-expanded', newVal); - Services.prefs.setBoolPref('zen.view.use-single-toolbar', false); + const newVal = !Services.prefs.getBoolPref("zen.view.sidebar-expanded"); + Services.prefs.setBoolPref("zen.view.sidebar-expanded", newVal); + Services.prefs.setBoolPref("zen.view.use-single-toolbar", false); }, get navigatorToolbox() { @@ -831,16 +835,16 @@ window.gZenVerticalTabsManager = { }, initRightSideOrderContextMenu() { - const kConfigKey = 'zen.tabs.vertical.right-side'; + const kConfigKey = "zen.tabs.vertical.right-side"; const fragment = window.MozXULElement.parseXULToFragment(` `); - document.getElementById('viewToolbarsMenuSeparator').before(fragment); + document.getElementById("viewToolbarsMenuSeparator").before(fragment); }, get _topButtonsSeparatorElement() { @@ -848,7 +852,7 @@ window.gZenVerticalTabsManager = { return this.__topButtonsSeparatorElement; } this.__topButtonsSeparatorElement = document.getElementById( - 'zen-sidebar-top-buttons-separator' + "zen-sidebar-top-buttons-separator" ); return this.__topButtonsSeparatorElement; }, @@ -862,7 +866,7 @@ window.gZenVerticalTabsManager = { // so we can capture and improve them. (gZenUIManager.testingEnabled && !gZenUIManager.profilingEnabled) || !gZenStartup.isReady || - aItem.group?.hasAttribute('split-view-group') + aItem.group?.hasAttribute("split-view-group") ) { return; } @@ -875,17 +879,17 @@ window.gZenVerticalTabsManager = { try { const itemSize = aItem.getBoundingClientRect().height; const transform = `-${itemSize}px`; - gZenUIManager - .elementAnimate( + gZenUIManager.motion + .animate( aItem, { opacity: [0, 1], - transform: ['scale(0.95)', 'scale(1)'], - marginBottom: isLastItem() ? ['0px', '0px'] : [transform, '0px'], + transform: ["scale(0.95)", "scale(1)"], + marginBottom: isLastItem() ? ["0px", "0px"] : [transform, "0px"], }, { - duration: 110, - easing: 'ease-out', + duration: 0.11, + ease: "easeOut", } ) .then(() => {}) @@ -893,16 +897,16 @@ window.gZenVerticalTabsManager = { console.error(err); }); const itemLabel = - aItem.querySelector('.tab-group-label-container') || aItem.querySelector('.tab-content'); - gZenUIManager - .elementAnimate( + aItem.querySelector(".tab-group-label-container") || aItem.querySelector(".tab-content"); + gZenUIManager.motion + .animate( itemLabel, { - filter: ['blur(1px)', 'blur(0px)'], + filter: ["blur(1px)", "blur(0px)"], }, { - duration: 110, - easing: 'ease-out', + duration: 0.11, + ease: "easeOut", } ) .then(() => {}) @@ -915,17 +919,17 @@ window.gZenVerticalTabsManager = { }, animateTabClose(aTab) { - if (aTab.hasAttribute('zen-essential') || aTab.group?.hasAttribute('split-view-group')) { + if (aTab.hasAttribute("zen-essential") || aTab.group?.hasAttribute("split-view-group")) { return Promise.resolve(); } const height = aTab.getBoundingClientRect().height; const visibleItems = gBrowser.tabContainer.ariaFocusableItems; const isLastItem = visibleItems[visibleItems.length - 1] === aTab; - return gZenUIManager.elementAnimate( + return gZenUIManager.motion.animate( aTab, { opacity: [1, 0], - transform: ['scale(1)', 'scale(0.95)'], + transform: ["scale(1)", "scale(0.95)"], ...(isLastItem ? {} : { @@ -933,9 +937,9 @@ window.gZenVerticalTabsManager = { }), }, { - duration: 75, - easing: 'ease-out', - fill: 'forwards', + duration: 0.75, + ease: "easeOut", + fill: "forwards", } ); }, @@ -944,9 +948,9 @@ window.gZenVerticalTabsManager = { // we have multiple ".titlebar-buttonbox-container" in the DOM, because of the titlebar if (!this.__actualWindowButtons) { this.__actualWindowButtons = !this.isWindowsStyledButtons - ? document.querySelector('.titlebar-buttonbox-container') // TODO: test if it works 100% of the time - : document.querySelector('#nav-bar .titlebar-buttonbox-container'); - this.__actualWindowButtons.setAttribute('overflows', 'false'); + ? document.querySelector(".titlebar-buttonbox-container") // TODO: test if it works 100% of the time + : document.querySelector("#nav-bar .titlebar-buttonbox-container"); + this.__actualWindowButtons.setAttribute("overflows", "false"); } return this.__actualWindowButtons; }, @@ -959,8 +963,8 @@ window.gZenVerticalTabsManager = { }); }); this.rebuildAreas(); - this.navigatorToolbox.setAttribute('zen-sidebar-expanded', 'true'); - document.documentElement.setAttribute('zen-sidebar-expanded', 'true'); // force expanded sidebar + this.navigatorToolbox.setAttribute("zen-sidebar-expanded", "true"); + document.documentElement.setAttribute("zen-sidebar-expanded", "true"); // force expanded sidebar }, _postCustomize() { @@ -973,36 +977,36 @@ window.gZenVerticalTabsManager = { initializePreferences(updateEvent) { XPCOMUtils.defineLazyPreferenceGetter( this, - '_prefsVerticalTabs', - 'zen.tabs.vertical', + "_prefsVerticalTabs", + "zen.tabs.vertical", true, updateEvent ); XPCOMUtils.defineLazyPreferenceGetter( this, - '_prefsRightSide', - 'zen.tabs.vertical.right-side', + "_prefsRightSide", + "zen.tabs.vertical.right-side", false, updateEvent ); XPCOMUtils.defineLazyPreferenceGetter( this, - '_prefsUseSingleToolbar', - 'zen.view.use-single-toolbar', + "_prefsUseSingleToolbar", + "zen.view.use-single-toolbar", false, updateEvent ); XPCOMUtils.defineLazyPreferenceGetter( this, - '_prefsSidebarExpanded', - 'zen.view.sidebar-expanded', + "_prefsSidebarExpanded", + "zen.view.sidebar-expanded", false, updateEvent ); XPCOMUtils.defineLazyPreferenceGetter( this, - '_prefsSidebarExpandedMaxWidth', - 'zen.view.sidebar-expanded.max-width', + "_prefsSidebarExpandedMaxWidth", + "zen.view.sidebar-expanded.max-width", 300, updateEvent ); @@ -1036,21 +1040,22 @@ window.gZenVerticalTabsManager = { recalculateURLBarHeight() { requestAnimationFrame(() => { requestAnimationFrame(() => { - gURLBar.removeAttribute('--urlbar-height'); + gURLBar.removeAttribute("--urlbar-height"); let height; if (!this._hasSetSingleToolbar) { - height = AppConstants.platform == 'macosx' ? 34 : 32; - } else if (gURLBar.getAttribute('breakout-extend') !== 'true') { + height = AppConstants.platform == "macosx" ? 34 : 32; + } else if (gURLBar.getAttribute("breakout-extend") !== "true") { height = 40; } - if (typeof height !== 'undefined') { - gURLBar.style.setProperty('--urlbar-height', `${height}px`); + if (typeof height !== "undefined") { + gURLBar.style.setProperty("--urlbar-height", `${height}px`); } gURLBar.zenFormatURLValue(); }); }); }, + // eslint-disable-next-line complexity _updateEvent({ forCustomizableMode = false, dontRebuildAreas = false } = {}) { if (this._isUpdating) { return; @@ -1066,7 +1071,7 @@ window.gZenVerticalTabsManager = { .rollupAllPopups(); } - const topButtons = document.getElementById('zen-sidebar-top-buttons'); + const topButtons = document.getElementById("zen-sidebar-top-buttons"); const isCompactMode = gZenCompactModeManager.preference && !forCustomizableMode; const isVerticalTabs = this._prefsVerticalTabs || forCustomizableMode; const isSidebarExpanded = this._prefsSidebarExpanded || !isVerticalTabs; @@ -1075,43 +1080,43 @@ window.gZenVerticalTabsManager = { ((this._prefsUseSingleToolbar && isVerticalTabs && isSidebarExpanded) || !isVerticalTabs) && !forCustomizableMode && !this.hidesTabsToolbar; - const titlebar = document.getElementById('titlebar'); + const titlebar = document.getElementById("titlebar"); - gBrowser.tabContainer.setAttribute('orient', isVerticalTabs ? 'vertical' : 'horizontal'); + gBrowser.tabContainer.setAttribute("orient", isVerticalTabs ? "vertical" : "horizontal"); gBrowser.tabContainer.arrowScrollbox.setAttribute( - 'orient', - isVerticalTabs ? 'vertical' : 'horizontal' + "orient", + isVerticalTabs ? "vertical" : "horizontal" ); // on purpose, we set the orient to horizontal, because the arrowScrollbox is vertical gBrowser.tabContainer.arrowScrollbox.scrollbox.setAttribute( - 'orient', - isVerticalTabs ? 'vertical' : 'horizontal' + "orient", + isVerticalTabs ? "vertical" : "horizontal" ); - const buttonsTarget = document.getElementById('zen-sidebar-top-buttons-customization-target'); + const buttonsTarget = document.getElementById("zen-sidebar-top-buttons-customization-target"); if (isRightSide) { - this.navigatorToolbox.setAttribute('zen-right-side', 'true'); - document.documentElement.setAttribute('zen-right-side', 'true'); + this.navigatorToolbox.setAttribute("zen-right-side", "true"); + document.documentElement.setAttribute("zen-right-side", "true"); } else { - this.navigatorToolbox.removeAttribute('zen-right-side'); - document.documentElement.removeAttribute('zen-right-side'); + this.navigatorToolbox.removeAttribute("zen-right-side"); + document.documentElement.removeAttribute("zen-right-side"); } delete this._hadSidebarCollapse; if (isSidebarExpanded) { - this._hadSidebarCollapse = !document.documentElement.hasAttribute('zen-sidebar-expanded'); - this.navigatorToolbox.setAttribute('zen-sidebar-expanded', 'true'); - document.documentElement.setAttribute('zen-sidebar-expanded', 'true'); - gBrowser.tabContainer.setAttribute('expanded', 'true'); + this._hadSidebarCollapse = !document.documentElement.hasAttribute("zen-sidebar-expanded"); + this.navigatorToolbox.setAttribute("zen-sidebar-expanded", "true"); + document.documentElement.setAttribute("zen-sidebar-expanded", "true"); + gBrowser.tabContainer.setAttribute("expanded", "true"); } else { - this.navigatorToolbox.removeAttribute('zen-sidebar-expanded'); - document.documentElement.removeAttribute('zen-sidebar-expanded'); - gBrowser.tabContainer.removeAttribute('expanded'); + this.navigatorToolbox.removeAttribute("zen-sidebar-expanded"); + document.documentElement.removeAttribute("zen-sidebar-expanded"); + gBrowser.tabContainer.removeAttribute("expanded"); } - const appContentNavbarContaienr = document.getElementById('zen-appcontent-navbar-container'); - const appContentNavbarWrapper = document.getElementById('zen-appcontent-navbar-wrapper'); - appContentNavbarWrapper.style.transition = 'none'; + const appContentNavbarContaienr = document.getElementById("zen-appcontent-navbar-container"); + const appContentNavbarWrapper = document.getElementById("zen-appcontent-navbar-wrapper"); + appContentNavbarWrapper.style.transition = "none"; let shouldHide = false; if ( ((!isRightSide && this.isWindowsStyledButtons) || @@ -1119,20 +1124,20 @@ window.gZenVerticalTabsManager = { (isCompactMode && isSingleToolbar && this.isWindowsStyledButtons)) && isSingleToolbar ) { - appContentNavbarWrapper.setAttribute('should-hide', true); + appContentNavbarWrapper.setAttribute("should-hide", true); shouldHide = true; } else { - appContentNavbarWrapper.removeAttribute('should-hide'); + appContentNavbarWrapper.removeAttribute("should-hide"); } // Check if the sidebar is in hover mode - if (!this.navigatorToolbox.hasAttribute('zen-right-side') && !isCompactMode) { + if (!this.navigatorToolbox.hasAttribute("zen-right-side") && !isCompactMode) { this.navigatorToolbox.prepend(topButtons); } let windowButtons = this.actualWindowButtons; let doNotChangeWindowButtons = !isCompactMode && isRightSide && this.isWindowsStyledButtons; - const navBar = document.getElementById('nav-bar'); + const navBar = document.getElementById("nav-bar"); if (isSingleToolbar) { this._navbarParent = navBar.parentElement; @@ -1147,11 +1152,11 @@ window.gZenVerticalTabsManager = { for (const button of elements) { this._topButtonsSeparatorElement.after(button); } - buttonsTarget.prepend(document.getElementById('unified-extensions-button')); - const panelUIButton = document.getElementById('PanelUI-button'); + buttonsTarget.prepend(document.getElementById("unified-extensions-button")); + const panelUIButton = document.getElementById("PanelUI-button"); buttonsTarget.prepend(panelUIButton); - panelUIButton.setAttribute('overflows', 'false'); - buttonsTarget.parentElement.append(document.getElementById('nav-bar-overflow-button')); + panelUIButton.setAttribute("overflows", "false"); + buttonsTarget.parentElement.append(document.getElementById("nav-bar-overflow-button")); if (this.isWindowsStyledButtons && !doNotChangeWindowButtons) { appContentNavbarContaienr.append(windowButtons); } @@ -1162,7 +1167,7 @@ window.gZenVerticalTabsManager = { titlebar.before(topButtons); titlebar.before(navBar); } - document.documentElement.setAttribute('zen-single-toolbar', true); + document.documentElement.setAttribute("zen-single-toolbar", true); this._hasSetSingleToolbar = true; } else if (this._hasSetSingleToolbar) { this._hasSetSingleToolbar = false; @@ -1172,14 +1177,14 @@ window.gZenVerticalTabsManager = { '#zen-sidebar-top-buttons-customization-target > :is([cui-areatype="toolbar"], .chromeclass-toolbar-additional)' ); for (const button of elements) { - document.getElementById('nav-bar-customization-target').append(button); + document.getElementById("nav-bar-customization-target").append(button); } this._topButtonsSeparatorElement.remove(); - document.documentElement.removeAttribute('zen-single-toolbar'); - const panelUIButton = document.getElementById('PanelUI-button'); + document.documentElement.removeAttribute("zen-single-toolbar"); + const panelUIButton = document.getElementById("PanelUI-button"); navBar.appendChild(panelUIButton); - panelUIButton.removeAttribute('overflows'); - navBar.appendChild(document.getElementById('nav-bar-overflow-button')); + panelUIButton.removeAttribute("overflows"); + navBar.appendChild(document.getElementById("nav-bar-overflow-button")); this._toolbarOriginalParent.prepend(navBar); if (!dontRebuildAreas) { this.rebuildAreas(); @@ -1188,12 +1193,10 @@ window.gZenVerticalTabsManager = { if (isCompactMode) { titlebar.prepend(topButtons); + } else if (isSidebarExpanded) { + titlebar.before(topButtons); } else { - if (isSidebarExpanded) { - titlebar.before(topButtons); - } else { - titlebar.prepend(topButtons); - } + titlebar.prepend(topButtons); } // Case: single toolbar, not compact mode, not right side and macos styled buttons @@ -1207,7 +1210,7 @@ window.gZenVerticalTabsManager = { topButtons.prepend(windowButtons); } - const canHideTabBarPref = Services.prefs.getBoolPref('zen.view.compact.hide-tabbar'); + const canHideTabBarPref = Services.prefs.getBoolPref("zen.view.compact.hide-tabbar"); const captionsShouldStayOnSidebar = !canHideTabBarPref && ((!this.isWindowsStyledButtons && !isRightSide) || @@ -1237,13 +1240,12 @@ window.gZenVerticalTabsManager = { } else { navBar.append(windowButtons); } + } + // not windows styled buttons + if (isRightSide || !isSidebarExpanded) { + navBar.prepend(windowButtons); } else { - // not windows styled buttons - if (isRightSide || !isSidebarExpanded) { - navBar.prepend(windowButtons); - } else { - topButtons.prepend(windowButtons); - } + topButtons.prepend(windowButtons); } } else if (!isSingleToolbar && isCompactMode) { if (captionsShouldStayOnSidebar) { @@ -1264,16 +1266,16 @@ window.gZenVerticalTabsManager = { gZenCompactModeManager.updateCompactModeContext(isSingleToolbar); // Always move the splitter next to the sidebar - const splitter = document.getElementById('zen-sidebar-splitter'); - splitter.addEventListener('dragover', gBrowser.tabContainer); + const splitter = document.getElementById("zen-sidebar-splitter"); + splitter.addEventListener("dragover", gBrowser.tabContainer); this.navigatorToolbox.after(splitter); - window.dispatchEvent(new Event('resize')); + window.dispatchEvent(new Event("resize")); if (!isCompactMode) { gZenCompactModeManager.getAndApplySidebarWidth(); } gZenUIManager.updateTabsToolbar(); this.rebuildURLBarMenus(); - appContentNavbarWrapper.style.transition = ''; + appContentNavbarWrapper.style.transition = ""; } catch (e) { console.error(e); } @@ -1281,7 +1283,7 @@ window.gZenVerticalTabsManager = { }, rebuildURLBarMenus() { - if (document.getElementById('paste-and-go')) { + if (document.getElementById("paste-and-go")) { return; } gURLBar._initCopyCutController(); @@ -1295,12 +1297,12 @@ window.gZenVerticalTabsManager = { }, _updateMaxWidth() { - const maxWidth = Services.prefs.getIntPref('zen.view.sidebar-expanded.max-width'); + const maxWidth = Services.prefs.getIntPref("zen.view.sidebar-expanded.max-width"); const toolbox = gNavToolbox; if (!this._prefsCompactMode) { toolbox.style.maxWidth = `${maxWidth}px`; } else { - toolbox.style.removeProperty('maxWidth'); + toolbox.style.removeProperty("maxWidth"); } }, @@ -1308,38 +1310,39 @@ window.gZenVerticalTabsManager = { if (this._expandButton) { return this._expandButton; } - this._expandButton = document.getElementById('zen-expand-sidebar-button'); + this._expandButton = document.getElementById("zen-expand-sidebar-button"); return this._expandButton; }, toggleTabsOnRight() { - const newVal = !Services.prefs.getBoolPref('zen.tabs.vertical.right-side'); - Services.prefs.setBoolPref('zen.tabs.vertical.right-side', newVal); + const newVal = !Services.prefs.getBoolPref("zen.tabs.vertical.right-side"); + Services.prefs.setBoolPref("zen.tabs.vertical.right-side", newVal); }, appendCustomizableItem(target, child, placements) { if ( - target.id === 'zen-sidebar-top-buttons-customization-target' && + target.id === "zen-sidebar-top-buttons-customization-target" && this._hasSetSingleToolbar && placements.includes(child.id) ) { - return this._topButtonsSeparatorElement.before(child); + this._topButtonsSeparatorElement.before(child); + return; } target.appendChild(child); }, async renameTabKeydown(event) { event.stopPropagation(); - if (event.key === 'Enter') { - const isTab = !!event.target.closest('.tabbrowser-tab'); + if (event.key === "Enter") { + const isTab = !!event.target.closest(".tabbrowser-tab"); let label = isTab - ? this._tabEdited.querySelector('.tab-label-container-editing') + ? this._tabEdited.querySelector(".tab-label-container-editing") : this._tabEdited; - let input = document.getElementById('tab-label-input'); - let newName = input.value.replace(/\s+/g, ' ').trim(); + let input = document.getElementById("tab-label-input"); + let newName = input.value.replace(/\s+/g, " ").trim(); const hasChanged = input.value !== input._originalValue && newName; - document.documentElement.removeAttribute('zen-renaming-tab'); + document.documentElement.removeAttribute("zen-renaming-tab"); input.remove(); if (!isTab) { await this._tabEdited.onRenameFinished(newName); @@ -1350,7 +1353,7 @@ window.gZenVerticalTabsManager = { if (hasChanged) { this._tabEdited.zenStaticLabel = newName; gBrowser._setTabLabel(this._tabEdited, newName); - gZenUIManager.showToast('zen-tabs-renamed'); + gZenUIManager.showToast("zen-tabs-renamed"); } else { delete this._tabEdited.zenStaticLabel; gBrowser.setTabTitle(this._tabEdited); @@ -1368,49 +1371,49 @@ window.gZenVerticalTabsManager = { ); } - const editorContainer = this._tabEdited.querySelector('.tab-editor-container'); + const editorContainer = this._tabEdited.querySelector(".tab-editor-container"); if (editorContainer) { editorContainer.remove(); } - label.classList.remove('tab-label-container-editing'); + label.classList.remove("tab-label-container-editing"); this._tabEdited = null; - } else if (event.key === 'Escape') { + } else if (event.key === "Escape") { event.target.blur(); } }, renameTabStart(event) { let target = event.target; - if (event.target.id === 'context_zen-edit-tab-title') { + if (event.target.id === "context_zen-edit-tab-title") { target = TabContextMenu.contextTab; } - const isTab = !!target.closest('.tabbrowser-tab'); + const isTab = !!target.closest(".tabbrowser-tab"); if ( this._tabEdited || - ((!Services.prefs.getBoolPref('zen.tabs.rename-tabs') || - Services.prefs.getBoolPref('browser.tabs.closeTabByDblclick')) && + ((!Services.prefs.getBoolPref("zen.tabs.rename-tabs") || + Services.prefs.getBoolPref("browser.tabs.closeTabByDblclick")) && isTab) || !gZenVerticalTabsManager._prefsSidebarExpanded ) { return; } - if (isTab && !target.closest('.tab-label-container')) { + if (isTab && !target.closest(".tab-label-container")) { return; } this._tabEdited = - target.closest('.tabbrowser-tab') || - target.closest('.zen-current-workspace-indicator-name') || - (event.explicit && target.closest('.tab-group-label')); - if (!this._tabEdited || (this._tabEdited.hasAttribute('zen-essential') && isTab)) { + target.closest(".tabbrowser-tab") || + target.closest(".zen-current-workspace-indicator-name") || + (event.explicit && target.closest(".tab-group-label")); + if (!this._tabEdited || (this._tabEdited.hasAttribute("zen-essential") && isTab)) { this._tabEdited = null; return; } gZenFolders.cancelPopupTimer(); event.stopPropagation?.(); - document.documentElement.setAttribute('zen-renaming-tab', 'true'); - const label = isTab ? this._tabEdited.querySelector('.tab-label-container') : this._tabEdited; - label.classList.add('tab-label-container-editing'); + document.documentElement.setAttribute("zen-renaming-tab", "true"); + const label = isTab ? this._tabEdited.querySelector(".tab-label-container") : this._tabEdited; + label.classList.add("tab-label-container-editing"); if (isTab) { const container = window.MozXULElement.parseXULToFragment(` @@ -1418,15 +1421,15 @@ window.gZenVerticalTabsManager = { `); label.after(container); } - const input = document.createElement('input'); + const input = document.createElement("input"); const content = isTab ? this._tabEdited.label : this._tabEdited.textContent; - input.id = 'tab-label-input'; + input.id = "tab-label-input"; input._originalValue = content; input.value = content; - input.addEventListener('keydown', this.renameTabKeydown.bind(this)); + input.addEventListener("keydown", this.renameTabKeydown.bind(this)); if (isTab) { - const containerHtml = this._tabEdited.querySelector('.tab-editor-container'); + const containerHtml = this._tabEdited.querySelector(".tab-editor-container"); containerHtml.appendChild(input); } else { this._tabEdited.after(input); @@ -1434,25 +1437,25 @@ window.gZenVerticalTabsManager = { input.focus(); input.select(); - input.addEventListener('blur', this._renameTabHalt); + input.addEventListener("blur", this._renameTabHalt); }, renameTabHalt(event) { if (document.activeElement === event.target || !this._tabEdited) { return; } - document.documentElement.removeAttribute('zen-renaming-tab'); - const editorContainer = this._tabEdited.querySelector('.tab-editor-container'); - let input = document.getElementById('tab-label-input'); + document.documentElement.removeAttribute("zen-renaming-tab"); + const editorContainer = this._tabEdited.querySelector(".tab-editor-container"); + let input = document.getElementById("tab-label-input"); input.remove(); if (editorContainer) { editorContainer.remove(); } - const isTab = !!this._tabEdited.closest('.tabbrowser-tab'); + const isTab = !!this._tabEdited.closest(".tabbrowser-tab"); const label = isTab - ? this._tabEdited.querySelector('.tab-label-container-editing') + ? this._tabEdited.querySelector(".tab-label-container-editing") : this._tabEdited; - label.classList.remove('tab-label-container-editing'); + label.classList.remove("tab-label-container-editing"); this._tabEdited = null; }, diff --git a/src/zen/common/modules/ZenUpdates.mjs b/src/zen/common/modules/ZenUpdates.mjs index 82fbb95ca..298f2a66a 100644 --- a/src/zen/common/modules/ZenUpdates.mjs +++ b/src/zen/common/modules/ZenUpdates.mjs @@ -2,37 +2,37 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -import createSidebarNotification from 'chrome://browser/content/zen-components/ZenSidebarNotification.mjs'; +import createSidebarNotification from "chrome://browser/content/zen-components/ZenSidebarNotification.mjs"; -const ZEN_UPDATE_PREF = 'zen.updates.last-version'; -const ZEN_BUILD_ID_PREF = 'zen.updates.last-build-id'; -const ZEN_UPDATE_SHOW = 'zen.updates.show-update-notification'; +const ZEN_UPDATE_PREF = "zen.updates.last-version"; +const ZEN_BUILD_ID_PREF = "zen.updates.last-build-id"; +const ZEN_UPDATE_SHOW = "zen.updates.show-update-notification"; export default function checkForZenUpdates() { const version = Services.appinfo.version; - const lastVersion = Services.prefs.getStringPref(ZEN_UPDATE_PREF, ''); + const lastVersion = Services.prefs.getStringPref(ZEN_UPDATE_PREF, ""); Services.prefs.setStringPref(ZEN_UPDATE_PREF, version); if ( version !== lastVersion && !gZenUIManager.testingEnabled && Services.prefs.getBoolPref(ZEN_UPDATE_SHOW, true) ) { - const updateUrl = Services.prefs.getStringPref('app.releaseNotesURL.prompt', ''); + const updateUrl = Services.prefs.getStringPref("app.releaseNotesURL.prompt", ""); createSidebarNotification({ - headingL10nId: 'zen-sidebar-notification-updated-heading', + headingL10nId: "zen-sidebar-notification-updated-heading", links: [ { - url: Services.urlFormatter.formatURL(updateUrl.replace('%VERSION%', version)), - l10nId: 'zen-sidebar-notification-updated', + url: Services.urlFormatter.formatURL(updateUrl.replace("%VERSION%", version)), + l10nId: "zen-sidebar-notification-updated", special: true, - icon: 'chrome://browser/skin/zen-icons/heart-circle-fill.svg', + icon: "chrome://browser/skin/zen-icons/heart-circle-fill.svg", }, { action: () => { - Services.obs.notifyObservers(window, 'restart-in-safe-mode'); + Services.obs.notifyObservers(window, "restart-in-safe-mode"); }, - l10nId: 'zen-sidebar-notification-restart-safe-mode', - icon: 'chrome://browser/skin/zen-icons/security-broken.svg', + l10nId: "zen-sidebar-notification-restart-safe-mode", + icon: "chrome://browser/skin/zen-icons/security-broken.svg", }, ], }); @@ -42,18 +42,18 @@ export default function checkForZenUpdates() { export async function createWindowUpdateAnimation() { const appID = Services.appinfo.appBuildID; if ( - Services.prefs.getStringPref(ZEN_BUILD_ID_PREF, '') === appID || + Services.prefs.getStringPref(ZEN_BUILD_ID_PREF, "") === appID || gZenUIManager.testingEnabled ) { return; } Services.prefs.setStringPref(ZEN_BUILD_ID_PREF, appID); await gZenWorkspaces.promiseInitialized; - const appWrapper = document.getElementById('zen-main-app-wrapper'); - const element = document.createElement('div'); - element.id = 'zen-update-animation'; - const elementBorder = document.createElement('div'); - elementBorder.id = 'zen-update-animation-border'; + const appWrapper = document.getElementById("zen-main-app-wrapper"); + const element = document.createElement("div"); + element.id = "zen-update-animation"; + const elementBorder = document.createElement("div"); + elementBorder.id = "zen-update-animation-border"; requestIdleCallback(() => { if (gReduceMotion) { return; @@ -62,9 +62,9 @@ export async function createWindowUpdateAnimation() { appWrapper.appendChild(elementBorder); Promise.all([ gZenUIManager.motion.animate( - '#zen-update-animation', + "#zen-update-animation", { - top: ['100%', '-50%'], + top: ["100%", "-50%"], opacity: [0.5, 1], }, { @@ -72,9 +72,9 @@ export async function createWindowUpdateAnimation() { } ), gZenUIManager.motion.animate( - '#zen-update-animation-border', + "#zen-update-animation-border", { - '--background-top': ['150%', '-50%'], + "--background-top": ["150%", "-50%"], }, { duration: 0.35, diff --git a/src/zen/common/styles/zen-animations.css b/src/zen/common/styles/zen-animations.css index d3c0cc10b..515fcd951 100644 --- a/src/zen/common/styles/zen-animations.css +++ b/src/zen/common/styles/zen-animations.css @@ -75,11 +75,7 @@ @keyframes zen-urlbar-searchmode { 0% { box-shadow: 0 0 20px - color-mix( - in srgb, - color-mix(in srgb, var(--zen-primary-color), var(--toolbox-textcolor) 20%), - light-dark(rgba(0, 0, 0, 0.3), transparent) 50% - ); + color-mix(in srgb, color-mix(in srgb, var(--zen-primary-color), var(--toolbox-textcolor) 20%), light-dark(rgba(0, 0, 0, 0.3), transparent) 50%); } 100% { diff --git a/src/zen/common/styles/zen-branding.css b/src/zen/common/styles/zen-branding.css index d43a621bc..c32929a14 100644 --- a/src/zen/common/styles/zen-branding.css +++ b/src/zen/common/styles/zen-branding.css @@ -5,25 +5,25 @@ */ @font-face { - font-family: 'Zen-Junicode'; - src: url('chrome://browser/content/zen-fonts/JunicodeVF-Roman.woff2') format('woff2'); + font-family: "Zen-Junicode"; + src: url("chrome://browser/content/zen-fonts/JunicodeVF-Roman.woff2") format("woff2"); } @font-face { - font-family: 'Zen-Junicode-Italic'; - src: url('chrome://browser/content/zen-fonts/JunicodeVF-Italic.woff2') format('woff2'); + font-family: "Zen-Junicode-Italic"; + src: url("chrome://browser/content/zen-fonts/JunicodeVF-Italic.woff2") format("woff2"); } .zen-branding-title { font-size: 6rem; line-height: 0.9; margin-bottom: 0.4rem; - font-family: 'Zen-Junicode', serif; + font-family: "Zen-Junicode", serif; font-weight: 400; font-style: normal; - font-feature-settings: 'swsh' 1; + font-feature-settings: "swsh" 1; & .zen-branding-title-italic { - font-family: 'Zen-Junicode-Italic', serif; + font-family: "Zen-Junicode-Italic", serif; } } diff --git a/src/zen/common/styles/zen-browser-container.css b/src/zen/common/styles/zen-browser-container.css index c75e00d2e..932700c0b 100644 --- a/src/zen/common/styles/zen-browser-container.css +++ b/src/zen/common/styles/zen-browser-container.css @@ -3,33 +3,33 @@ * 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/. */ -:root:not([inDOMFullscreen='true']):not([chromehidden~='location']):not([chromehidden~='toolbar']) { +:root:not([inDOMFullscreen="true"]):not([chromehidden~="location"]):not([chromehidden~="toolbar"]) { & #tabbrowser-tabbox #tabbrowser-tabpanels .browserSidebarContainer { overflow: clip; - :root:not([zen-no-padding='true']) &:not(.zen-glance-overlay) { + :root:not([zen-no-padding="true"]) &:not(.zen-glance-overlay) { border-radius: var(--zen-native-inner-radius); box-shadow: var(--zen-big-shadow); } - & browser[type='content'] { - &:not([transparent='true']) { + & browser[type="content"] { + &:not([transparent="true"]) { background: light-dark(rgb(255, 255, 255), rgb(32, 32, 32)); } - &[transparent='true'] { + &[transparent="true"] { background: light-dark(rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0.1)); } } - @media not -moz-pref('layout.css.prefers-color-scheme.content-override', 2) { - & browser[type='content'] { + @media not -moz-pref("layout.css.prefers-color-scheme.content-override", 2) { + & browser[type="content"] { color-scheme: env(-moz-content-preferred-color-scheme); } } - @media -moz-pref('zen.theme.acrylic-elements') { - & browser[type='content'] { + @media -moz-pref("zen.theme.acrylic-elements") { + & browser[type="content"] { /* For the rendering engine to apply layering optimizations. This * is a hacky solution, but it works for now. */ will-change: transform; @@ -37,11 +37,11 @@ } } - @media (not -moz-pref('zen.view.shift-down-site-on-hover')) and (not ((-moz-pref('zen.view.experimental-no-window-controls') or (not -moz-pref('zen.view.hide-window-controls'))) and -moz-pref('zen.view.use-single-toolbar'))) { - .browserSidebarContainer:is(.deck-selected, [zen-split='true']) .browserContainer { + @media (not -moz-pref("zen.view.shift-down-site-on-hover")) and (not ((-moz-pref("zen.view.experimental-no-window-controls") or (not -moz-pref("zen.view.hide-window-controls"))) and -moz-pref("zen.view.use-single-toolbar"))) { + .browserSidebarContainer:is(.deck-selected, [zen-split="true"]) .browserContainer { transition: margin var(--zen-hidden-toolbar-transition); - :root[zen-single-toolbar='true'] & { + :root[zen-single-toolbar="true"] & { transition-delay: 0.2s; --zen-toolbar-height: 34px; } @@ -49,10 +49,8 @@ #tabbrowser-tabpanels[has-toolbar-hovered] & { --margin-top-fix: calc(-1 * var(--zen-toolbar-height) + var(--zen-element-separation)); - :root:not([zen-single-toolbar='true']) & { - --margin-top-fix: calc( - -1 * var(--zen-toolbar-height-with-bookmarks) + var(--zen-element-separation) - ); + :root:not([zen-single-toolbar="true"]) & { + --margin-top-fix: calc(-1 * var(--zen-toolbar-height-with-bookmarks) + var(--zen-element-separation)); } margin-top: var(--margin-top-fix); @@ -69,6 +67,6 @@ z-index: 2; } -browser[zen-pseudo-hidden='true'] { +browser[zen-pseudo-hidden="true"] { -moz-subtree-hidden-only-visually: 1 !important; } diff --git a/src/zen/common/styles/zen-browser-ui.css b/src/zen/common/styles/zen-browser-ui.css index 72b34c96c..28dbfe1ed 100644 --- a/src/zen/common/styles/zen-browser-ui.css +++ b/src/zen/common/styles/zen-browser-ui.css @@ -19,15 +19,15 @@ position: inherit; } -:root:is([inDOMFullscreen='true'], [chromehidden~='location'], [chromehidden~='toolbar']) { +:root:is([inDOMFullscreen="true"], [chromehidden~="location"], [chromehidden~="toolbar"]) { #navigator-toolbox, #zen-sidebar-splitter { visibility: collapse; } } -:root[zen-before-loaded='true'] #browser > *:not(#zen-toast-container), -:root[zen-before-loaded='true'] #urlbar { +:root[zen-before-loaded="true"] #browser > *:not(#zen-toast-container), +:root[zen-before-loaded="true"] #urlbar { opacity: 0 !important; } @@ -47,7 +47,7 @@ &::after, &::before { - content: ''; + content: ""; position: absolute; inset: 0; z-index: 0; @@ -80,7 +80,7 @@ } } - :root:not([animating-background='true']) &::before { + :root:not([animating-background="true"]) &::before { transition: background-color var(--inactive-window-transition); } @@ -88,7 +88,7 @@ display: none; } - :root[zen-show-grainy-background='true'] & .zen-browser-grain { + :root[zen-show-grainy-background="true"] & .zen-browser-grain { display: flex; width: 100%; height: 100%; @@ -97,7 +97,7 @@ z-index: 1; opacity: var(--zen-grainy-background-opacity, 0); mix-blend-mode: overlay; - :root:not([swipe-gesture='true']) & { + :root:not([swipe-gesture="true"]) & { /* note: Keep in sync with kGlobalAnimationDuration */ transition: opacity 0.2s ease-in-out; } @@ -127,14 +127,14 @@ border: none; } -:root:not([zen-single-toolbar='true']) #zen-appcontent-wrapper { +:root:not([zen-single-toolbar="true"]) #zen-appcontent-wrapper { z-index: 3; } #nav-bar { border-top-color: transparent !important; - :root[zen-single-toolbar='true'] & { + :root[zen-single-toolbar="true"] & { border-top: none !important; --zen-toolbar-height: 37px; } @@ -145,7 +145,7 @@ /* See bug #8814, don't an overflow here as it causes issues * with firefox's rendering of the tab bar */ - @media (-moz-pref('zen.view.grey-out-inactive-windows')) { + @media (-moz-pref("zen.view.grey-out-inactive-windows")) { &:-moz-window-inactive { background: InactiveCaption; } @@ -155,7 +155,7 @@ z-index: 1; } - @media (-moz-windows-accent-color-in-titlebar) and ((-moz-windows-mica) or -moz-pref('browser.theme.windows.accent-color-in-tabs.enabled')) { + @media (-moz-windows-accent-color-in-titlebar) and ((-moz-windows-mica) or -moz-pref("browser.theme.windows.accent-color-in-tabs.enabled")) { background: ActiveCaption; color: CaptionText; } @@ -169,17 +169,17 @@ min-width: 1px; } -:root:not([inDOMFullscreen='true']):not([chromehidden~='location']):not([chromehidden~='toolbar']) { +:root:not([inDOMFullscreen="true"]):not([chromehidden~="location"]):not([chromehidden~="toolbar"]) { & #zen-tabbox-wrapper { margin: var(--zen-element-separation); margin-top: 0; } - &:not([zen-right-side='true']) #zen-tabbox-wrapper { + &:not([zen-right-side="true"]) #zen-tabbox-wrapper { margin-left: 0; } - &[zen-right-side='true'] #zen-tabbox-wrapper { + &[zen-right-side="true"] #zen-tabbox-wrapper { margin-right: 0; } } @@ -207,7 +207,7 @@ } } - @media -moz-pref('zen.widget.mac.mono-window-controls') { + @media -moz-pref("zen.widget.mac.mono-window-controls") { .titlebar-buttonbox-container { color: var(--toolbox-textcolor); @@ -219,11 +219,7 @@ /* Draw 3 dots as background to represent the window controls, all with the same cololr as the titlebar */ - background-image: radial-gradient( - circle, - var(--zen-toolbar-element-bg) var(--zen-traffic-light-size), - transparent 0.5px - ); + background-image: radial-gradient(circle, var(--zen-toolbar-element-bg) var(--zen-traffic-light-size), transparent 0.5px); background-size: 20px 22px; background-position: 53% 50%; @@ -232,7 +228,7 @@ background-position: 52% 50%; } - &:not([zen-has-hover='true']) > .titlebar-buttonbox { + &:not([zen-has-hover="true"]) > .titlebar-buttonbox { opacity: 0; } } @@ -240,13 +236,13 @@ } @media (-moz-platform: macos) { - :root[zen-window-buttons-reversed='true'][zen-right-side='true'] .titlebar-buttonbox-container { + :root[zen-window-buttons-reversed="true"][zen-right-side="true"] .titlebar-buttonbox-container { margin-inline-start: max(calc(var(--zen-element-separation) - 3px), 4px); margin-block: auto; } } -.zen-split-view-splitter[orient='vertical'], +.zen-split-view-splitter[orient="vertical"], #zen-sidebar-splitter { position: absolute; top: 0; @@ -258,7 +254,7 @@ cursor: ew-resize; z-index: 3; - &:is(.zen-split-view-splitter[orient='vertical']) { + &:is(.zen-split-view-splitter[orient="vertical"]) { /* Bit of a hacky solution, but it works */ width: var(--zen-split-row-gap); margin-left: calc(var(--zen-element-separation) * -1 - 1px); @@ -271,7 +267,7 @@ width: 2px; background: var(--button-primary-bgcolor); border-radius: 2px; - content: ''; + content: ""; position: absolute; top: 50%; left: 50%; @@ -284,13 +280,13 @@ opacity: 1; } } -.zen-split-view-splitter[orient='horizontal'] { +.zen-split-view-splitter[orient="horizontal"] { &::before { height: 2px; width: 50px; background: var(--button-primary-bgcolor); border-radius: 2px; - content: ''; + content: ""; position: absolute; top: 40%; left: 50%; @@ -337,12 +333,12 @@ z-index: 1; & #zen-sidebar-top-buttons { max-width: fit-content; - :root[zen-right-side='true'] & { + :root[zen-right-side="true"] & { order: 1; } } } -:root[zen-right-side='true'] #zen-appcontent-navbar-wrapper #PanelUI-button { +:root[zen-right-side="true"] #zen-appcontent-navbar-wrapper #PanelUI-button { order: 2; } diff --git a/src/zen/common/styles/zen-buttons.css b/src/zen/common/styles/zen-buttons.css index 615f19f97..39d43de75 100644 --- a/src/zen/common/styles/zen-buttons.css +++ b/src/zen/common/styles/zen-buttons.css @@ -4,8 +4,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -@namespace html 'http://www.w3.org/1999/xhtml'; -@namespace xul 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul'; +@namespace html "http://www.w3.org/1999/xhtml"; +@namespace xul "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; /** This file is used to override UI inside "common-shared.css" */ diff --git a/src/zen/common/styles/zen-omnibox.css b/src/zen/common/styles/zen-omnibox.css index 5993d6510..d216fb646 100644 --- a/src/zen/common/styles/zen-omnibox.css +++ b/src/zen/common/styles/zen-omnibox.css @@ -9,8 +9,8 @@ padding-block: 0 !important; } -:root[zen-single-toolbar='true'] { - & #urlbar:not([breakout-extend='true']) { +:root[zen-single-toolbar="true"] { + & #urlbar:not([breakout-extend="true"]) { padding: 1px; --toolbarbutton-border-radius: 6px; } @@ -27,7 +27,7 @@ --urlbar-margin-inline: 5px; --urlbar-container-padding: 4px; - &[breakout-extend='true'] { + &[breakout-extend="true"] { --urlbar-container-padding: 0px; } @@ -36,12 +36,12 @@ visibility: visible; } - :root[zen-single-toolbar='true'] &[breakout-extend='true'], - &[zen-floating-urlbar='true'] { + :root[zen-single-toolbar="true"] &[breakout-extend="true"], + &[zen-floating-urlbar="true"] { --urlbar-container-padding: 3px; --urlbar-margin-inline: 11px; - &:not([zen-floating-urlbar='true']) { + &:not([zen-floating-urlbar="true"]) { --urlbar-container-height: 52px !important; } } @@ -62,7 +62,7 @@ border-radius: var(--border-radius-medium); outline: none !important; - #urlbar:not([breakout-extend='true']) & { + #urlbar:not([breakout-extend="true"]) & { margin: 1px; } @@ -70,20 +70,20 @@ box-shadow: none !important; } -#urlbar[focused='true']:not([suppress-focus-border]) > .urlbar-background, +#urlbar[focused="true"]:not([suppress-focus-border]) > .urlbar-background, #searchbar:focus-within { outline: none !important; outline-offset: none !important; outline-color: none !important; } -#urlbar:not([breakout-extend='true']) { +#urlbar:not([breakout-extend="true"]) { &:hover .urlbar-background { background-color: light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.2)) !important; } } -#identity-box.chromeUI:not([pageproxystate='invalid']) { +#identity-box.chromeUI:not([pageproxystate="invalid"]) { & #identity-icon-box { background: light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.1)) !important; } @@ -101,7 +101,7 @@ padding-inline-start: 8px !important; } -#urlbar:not([extend='true']) #identity-box #identity-icon-box { +#urlbar:not([extend="true"]) #identity-box #identity-icon-box { position: relative; } @@ -112,7 +112,7 @@ margin-bottom: auto; padding: 6px 8px !important; - :root:not([zen-single-toolbar='true']) & { + :root:not([zen-single-toolbar="true"]) & { padding-block: 2px !important; } } @@ -125,14 +125,14 @@ font-weight: 500; } -:root[zen-single-toolbar='true'] #urlbar:not([breakout-extend='true']) { +:root[zen-single-toolbar="true"] #urlbar:not([breakout-extend="true"]) { & #urlbar-input { cursor: default; } & #identity-box { margin-inline-end: 0 !important; - &.chromeUI:not([pageproxystate='invalid']) #identity-icon-box { + &.chromeUI:not([pageproxystate="invalid"]) #identity-icon-box { border-radius: 10px !important; } } @@ -143,25 +143,23 @@ height: 100%; /* To still be able to open popups */ visibility: collapse; - :root:not([supress-primary-adjustment='true']) & { + :root:not([supress-primary-adjustment="true"]) & { transition: opacity 0.15s, visibility 0.15s; } - #navigator-toolbox[zen-has-implicit-hover='true'] &, + #navigator-toolbox[zen-has-implicit-hover="true"] &, &[open], - #urlbar[has-popup-open='true'] &, - :root[zen-has-empty-tab='true'] & { + #urlbar[has-popup-open="true"] &, + :root[zen-has-empty-tab="true"] & { opacity: 1; visibility: visible; } } } -:root:not([zen-single-toolbar='true']):not([zen-has-empty-tab='true']) - #urlbar:not([breakout-extend='true']) - .urlbar-input-container { +:root:not([zen-single-toolbar="true"]):not([zen-has-empty-tab="true"]) #urlbar:not([breakout-extend="true"]) .urlbar-input-container { padding: 2px 3px; gap: 2px; @@ -184,19 +182,19 @@ background: transparent !important; } -:root:is([zen-single-toolbar='true'], [zen-has-empty-tab='true']) { +:root:is([zen-single-toolbar="true"], [zen-has-empty-tab="true"]) { #zen-copy-url-button[disabled] { display: none !important; } } -@media -moz-pref('zen.urlbar.single-toolbar-show-copy-url', false) { - :root[zen-single-toolbar='true'] #zen-copy-url-button { +@media -moz-pref("zen.urlbar.single-toolbar-show-copy-url", false) { + :root[zen-single-toolbar="true"] #zen-copy-url-button { display: none !important; } } -@media not -moz-pref('zen.urlbar.show-pip-button') { +@media not -moz-pref("zen.urlbar.show-pip-button") { #picture-in-picture-button { display: none !important; } @@ -209,7 +207,7 @@ align-items: center !important; margin: 0; - :root[zen-single-toolbar='true'] & { + :root[zen-single-toolbar="true"] & { padding: 6px !important; width: unset !important; height: unset !important; @@ -239,11 +237,11 @@ position: fixed; } -#urlbar[breakout-extend='true'] { +#urlbar[breakout-extend="true"] { z-index: 2; - :root[zen-single-toolbar='true'] & .urlbar-input-box, - &[zen-floating-urlbar='true'] .urlbar-input-box { + :root[zen-single-toolbar="true"] & .urlbar-input-box, + &[zen-floating-urlbar="true"] .urlbar-input-box { font-weight: 400; @media (-moz-platform: windows) { font-weight: 500; @@ -254,33 +252,21 @@ height: 100%; } - :root:not([zen-single-toolbar='true']) - &:not([zen-floating-urlbar='true']) - #identity-box:not([pageproxystate='invalid']) { + :root:not([zen-single-toolbar="true"]) &:not([zen-floating-urlbar="true"]) #identity-box:not([pageproxystate="invalid"]) { margin-inline-end: 0; } & .urlbar-background { - --zen-urlbar-background-base: light-dark( - #fbfbfb, - color-mix(in srgb, hsl(0, 0%, 6.7%), var(--zen-colors-primary) 30%) - ); - @media -moz-pref('zen.theme.acrylic-elements') { - --zen-urlbar-background-transparent: color-mix( - in srgb, - var(--zen-urlbar-background-base) 70%, - transparent 30% - ); + --zen-urlbar-background-base: light-dark(#fbfbfb, color-mix(in srgb, hsl(0, 0%, 6.7%), var(--zen-colors-primary) 30%)); + @media -moz-pref("zen.theme.acrylic-elements") { + --zen-urlbar-background-transparent: color-mix(in srgb, var(--zen-urlbar-background-base) 70%, transparent 30%); } - background-color: var( - --zen-urlbar-background-transparent, - var(--zen-urlbar-background-base) - ) !important; + background-color: var(--zen-urlbar-background-transparent, var(--zen-urlbar-background-base)) !important; box-shadow: 0px 30px 140px -15px light-dark(rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.6)) !important; backdrop-filter: none !important; outline: 0.5px solid light-dark(rgba(0, 0, 0, 0.2), rgba(255, 255, 255, 0.2)) !important; outline-offset: var(--zen-urlbar-outline-offset) !important; - @media -moz-pref('zen.theme.acrylic-elements') { + @media -moz-pref("zen.theme.acrylic-elements") { backdrop-filter: blur(42px) saturate(110%) brightness(0.25) contrast(100%) !important; } } @@ -290,9 +276,9 @@ border-radius: 12px !important; } - &[breakout-extend][animate-searchmode='true']::before { + &[breakout-extend][animate-searchmode="true"]::before { position: absolute; - content: ''; + content: ""; inset: 0; width: 100%; height: 100%; @@ -310,7 +296,7 @@ display: none; } -:root[zen-single-toolbar='true'] { +:root[zen-single-toolbar="true"] { --urlbar-icon-border-radius: 8px !important; --urlbar-inner-border-radius: var(--toolbarbutton-border-radius) !important; @@ -322,7 +308,7 @@ display: none; } - &:not([zen-has-empty-tab='true']) #urlbar:not([breakout-extend='true']) #identity-box { + &:not([zen-has-empty-tab="true"]) #urlbar:not([breakout-extend="true"]) #identity-box { order: 2; } @@ -354,7 +340,7 @@ } } -:root:not([zen-single-toolbar='true']) { +:root:not([zen-single-toolbar="true"]) { --urlbar-icon-border-radius: 6px !important; #notification-popup-box { @@ -372,7 +358,7 @@ } } -#urlbar[breakout-extend='true'] #notification-popup-box { +#urlbar[breakout-extend="true"] #notification-popup-box { min-width: calc(var(--urlbar-min-height) - 4 * var(--urlbar-container-padding)) !important; height: calc(var(--urlbar-min-height) - 4 * var(--urlbar-container-padding)) !important; } @@ -411,9 +397,7 @@ /* Border radius on hover */ #urlbar .urlbar-page-action, #urlbar #tracking-protection-icon-container, -#urlbar:not([breakout-extend='true']) - #identity-box:is(:not(.chromeUI), [pageproxystate='invalid']) - #identity-icon-box { +#urlbar:not([breakout-extend="true"]) #identity-box:is(:not(.chromeUI), [pageproxystate="invalid"]) #identity-icon-box { border-radius: var(--urlbar-icon-border-radius) !important; min-width: 28px; } @@ -423,7 +407,7 @@ .notificationbox-stack { background: transparent; - &[notificationside='top'] { + &[notificationside="top"] { position: fixed; bottom: calc(var(--zen-element-separation) * 1.5); right: calc(var(--zen-element-separation) * 1.5); @@ -453,12 +437,12 @@ align-items: center; } -:root:not([zen-single-toolbar='true']) { - &[zen-right-side='true']:not([zen-window-buttons-reversed='true']) #nav-bar { +:root:not([zen-single-toolbar="true"]) { + &[zen-right-side="true"]:not([zen-window-buttons-reversed="true"]) #nav-bar { margin-inline-start: var(--zen-element-separation); } - &:not([zen-right-side='true'])[zen-window-buttons-reversed='true'] #nav-bar { + &:not([zen-right-side="true"])[zen-window-buttons-reversed="true"] #nav-bar { margin-inline-end: var(--zen-element-separation); } } @@ -489,17 +473,17 @@ } } -:root[zen-single-toolbar='true'] { +:root[zen-single-toolbar="true"] { #urlbar[open] { min-width: min(90%, 40rem); } - &[zen-right-side='true'] #urlbar[open]:not([zen-floating-urlbar='true']) { + &[zen-right-side="true"] #urlbar[open]:not([zen-floating-urlbar="true"]) { right: 0; } } -#urlbar[open][zen-floating-urlbar='true'] { +#urlbar[open][zen-floating-urlbar="true"] { z-index: 1000; max-width: unset; --urlbar-container-height: 62px !important; @@ -520,7 +504,7 @@ background: var(--toolbarbutton-hover-background); height: var(--urlbar-height) !important; margin-inline: 0.15rem !important; - :root:not([zen-single-toolbar='true']) & { + :root:not([zen-single-toolbar="true"]) & { max-height: 32px !important; min-height: unset !important; margin-block: -1px !important; @@ -528,7 +512,7 @@ } } -@media not -moz-pref('zen.urlbar.show-protections-icon') { +@media not -moz-pref("zen.urlbar.show-protections-icon") { #tracking-protection-icon-container { display: none !important; } @@ -601,13 +585,13 @@ } } -.urlbarView-row[has-action]:is([type='switchtab'], [type='remotetab'], [type='clipboard']) { +.urlbarView-row[has-action]:is([type="switchtab"], [type="remotetab"], [type="clipboard"]) { & .urlbarView-action:last-child { margin-left: auto !important; margin-right: 0 !important; } - &:is([type='switchtab'], [type='remotetab']) .urlbarView-action:last-child { + &:is([type="switchtab"], [type="remotetab"]) .urlbarView-action:last-child { background: transparent !important; align-items: center; display: flex; @@ -619,13 +603,13 @@ transform-origin: right; &::after { - content: ''; + content: ""; display: inline-block; width: 28px; height: 28px; background-color: currentColor; - mask-image: url('chrome://browser/skin/zen-icons/urlbar-arrow.svg'); + mask-image: url("chrome://browser/skin/zen-icons/urlbar-arrow.svg"); mask-size: contain; mask-repeat: no-repeat; mask-position: center; @@ -648,11 +632,7 @@ #urlbar-label-box, #urlbar-search-mode-indicator { - background-color: color-mix( - in srgb, - var(--zen-primary-color) 50%, - light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.2)) 50% - ) !important; + background-color: color-mix(in srgb, var(--zen-primary-color) 50%, light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.2)) 50%) !important; color: white; padding: 4px 8px; border-radius: 50px; @@ -667,20 +647,12 @@ &:hover { &, & .urlbarView-favicon { - background-color: color-mix( - in srgb, - var(--zen-branding-bg-reverse) 5%, - transparent 95% - ) !important; + background-color: color-mix(in srgb, var(--zen-branding-bg-reverse) 5%, transparent 95%) !important; } } &[selected] { - --zen-selected-bg: color-mix( - in srgb, - var(--zen-primary-color) 50%, - light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.2)) 50% - ); + --zen-selected-bg: color-mix(in srgb, var(--zen-primary-color) 50%, light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.2)) 50%); --zen-selected-color: color-mix(in srgb, var(--zen-selected-bg), black 30%); background-color: var(--zen-selected-bg) !important; @@ -698,7 +670,7 @@ color: var(--zen-selected-color) !important; } - &:is([type='switchtab'], [type='dynamic']) .urlbarView-favicon, + &:is([type="switchtab"], [type="dynamic"]) .urlbarView-favicon, & .urlbarView-shortcutContent { fill: var(--zen-selected-color) !important; background-color: rgba(255, 255, 255, 0.9) !important; @@ -723,8 +695,7 @@ } } -:root:not([zen-single-toolbar='true']) - #urlbar[breakout-extend='true']:not([zen-floating-urlbar='true']) { +:root:not([zen-single-toolbar="true"]) #urlbar[breakout-extend="true"]:not([zen-floating-urlbar="true"]) { & .urlbar-background { border-radius: 10px !important; } @@ -759,7 +730,7 @@ display: none !important; } -@media not -moz-pref('zen.urlbar.show-contextual-id') { +@media not -moz-pref("zen.urlbar.show-contextual-id") { #userContext-icons { display: none !important; } diff --git a/src/zen/common/styles/zen-panel-ui.css b/src/zen/common/styles/zen-panel-ui.css index 8c42b9803..9c1a0c4dd 100644 --- a/src/zen/common/styles/zen-panel-ui.css +++ b/src/zen/common/styles/zen-panel-ui.css @@ -3,30 +3,30 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -panel[type='arrow'] { +panel[type="arrow"] { @media (-moz-platform: macos) and (-moz-panel-animations) { - &[side='bottom'] { + &[side="bottom"] { /* Animate from the bottom */ -zen-window-transform-origin: 0 100%; } - :root[zen-right-side='true'] & { + :root[zen-right-side="true"] & { /* Animate from the right */ -zen-window-transform-origin: 100% 0; - &[side='bottom'] { + &[side="bottom"] { /* Animate from the bottom right */ -zen-window-transform-origin: 100% 100%; } } -moz-window-opacity: 0; - &[animate='open'] { + &[animate="open"] { animation: zen-jello-animation-macos 0.2s ease-in-out forwards !important; } } } menupopup, -panel[type='arrow']:not(#feature-callout) { +panel[type="arrow"]:not(#feature-callout) { @media (-moz-windows-mica-popups) { appearance: auto !important; -moz-default-appearance: menupopup; diff --git a/src/zen/common/styles/zen-popup.css b/src/zen/common/styles/zen-popup.css index e1194594d..166804854 100644 --- a/src/zen/common/styles/zen-popup.css +++ b/src/zen/common/styles/zen-popup.css @@ -3,15 +3,14 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -@import url('chrome://browser/content/zen-styles/zen-panels/bookmarks.css'); -@import url('chrome://browser/content/zen-styles/zen-panels/print.css'); -@import url('chrome://browser/content/zen-styles/zen-panels/dialog.css'); +@import url("chrome://browser/content/zen-styles/zen-panels/bookmarks.css"); +@import url("chrome://browser/content/zen-styles/zen-panels/print.css"); +@import url("chrome://browser/content/zen-styles/zen-panels/dialog.css"); :root { --panel-subview-body-padding: 2px 0; --arrowpanel-menuitem-border-radius: 5px; - --arrowpanel-menuitem-margin: var(--uc-arrowpanel-menuitem-margin-block) - var(--uc-arrowpanel-menuitem-margin-inline); + --arrowpanel-menuitem-margin: var(--uc-arrowpanel-menuitem-margin-block) var(--uc-arrowpanel-menuitem-margin-inline); --arrowpanel-menuitem-padding-block: 8px; --arrowpanel-menuitem-padding-inline: 14px; --uc-arrowpanel-menuicon-margin-inline: 14px; @@ -22,9 +21,7 @@ --uc-panel-zoom-button-padding: 8px; --uc-panel-zoom-button-inline-padding: 9px; - --uc-panel-zoom-padding-block: calc( - var(--panel-separator-margin-vertical) + var(--uc-arrowpanel-menuitem-margin-block) - ); + --uc-panel-zoom-padding-block: calc(var(--panel-separator-margin-vertical) + var(--uc-arrowpanel-menuitem-margin-block)); --uc-autocomplete-panel-menuitem-margin: 4px; --uc-autocomplete-panel-menuicon-padding-inline: 14px; @@ -71,9 +68,7 @@ panel { } .widget-overflow-list .toolbarbutton-1:not(.toolbarbutton-combined) > .toolbarbutton-text, -.subviewbutton:not(#appMenu-zoom-controls > .subviewbutton) - > .toolbarbutton-icon - + .toolbarbutton-text, +.subviewbutton:not(#appMenu-zoom-controls > .subviewbutton) > .toolbarbutton-icon + .toolbarbutton-text, #appMenu-fxa-label2 > vbox { padding-inline-start: var(--uc-arrowpanel-menuicon-margin-inline); } @@ -87,7 +82,7 @@ panel { /* Firefox profile avatar in appmenu */ #appMenu-fxa-label2::before { - content: ''; + content: ""; display: -moz-box; height: 16px; width: 16px; @@ -112,10 +107,7 @@ panel { /* zoom controls */ #appMenu-zoom-controls { border-top: 1px solid var(--panel-separator-color); - padding-inline: calc( - var(--arrowpanel-menuitem-padding-inline) + var(--uc-arrowpanel-menuitem-margin-inline) - ) - var(--uc-arrowpanel-menuitem-margin-inline); + padding-inline: calc(var(--arrowpanel-menuitem-padding-inline) + var(--uc-arrowpanel-menuitem-margin-inline)) var(--uc-arrowpanel-menuitem-margin-inline); padding-block: var(--uc-panel-zoom-padding-block); margin: var(--panel-separator-margin-vertical) 0 calc(var(--panel-separator-margin-vertical) * -1); } @@ -131,23 +123,18 @@ panel { /* #appMenu-zoomReduce-button2, */ #appMenu-zoom-controls > #appMenu-fullscreen-button2 { - margin-left: calc( - (var(--panel-separator-margin-vertical) + var(--uc-arrowpanel-menuitem-margin-block)) * 2 + 1px - ); + margin-left: calc((var(--panel-separator-margin-vertical) + var(--uc-arrowpanel-menuitem-margin-block)) * 2 + 1px); } #appMenu-zoom-controls > #appMenu-fullscreen-button2::before { - content: ''; + content: ""; border-inline-start: 1px solid var(--panel-separator-color); display: block; position: relative; height: 32px; margin-block: calc(var(--uc-panel-zoom-button-padding) * -1); transform: translateX( - calc( - var(--uc-panel-zoom-button-inline-padding) * -1 - - (var(--panel-separator-margin-vertical) + var(--uc-arrowpanel-menuitem-margin-block)) - 1px - ) + calc(var(--uc-panel-zoom-button-inline-padding) * -1 - (var(--panel-separator-margin-vertical) + var(--uc-arrowpanel-menuitem-margin-block)) - 1px) ); } @@ -319,7 +306,7 @@ menuseparator { cursor: pointer; } -#editBMPanel_workspaceList input[type='checkbox'] { +#editBMPanel_workspaceList input[type="checkbox"] { margin-right: 8px; } @@ -333,16 +320,16 @@ menuseparator { display: flex; align-items: end; - :root:not([zen-right-side='true']) & { + :root:not([zen-right-side="true"]) & { right: var(--zen-toast-spacing); } - :root[zen-right-side='true'] & { + :root[zen-right-side="true"] & { left: var(--zen-toast-spacing); } & .zen-toast { - :root[zen-right-side='true'] & { + :root[zen-right-side="true"] & { translate: 100%; } @@ -357,11 +344,7 @@ menuseparator { z-index: 1000; padding: var(--zen-toast-padding); border-radius: 10px; - background: linear-gradient( - to bottom, - var(--zen-primary-color) -40%, - color-mix(in srgb, var(--zen-primary-color), #0f0f0f 20%) - ); + background: linear-gradient(to bottom, var(--zen-primary-color) -40%, color-mix(in srgb, var(--zen-primary-color), #0f0f0f 20%)); box-shadow: light-dark(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.4)) 0px 0px 22px 2px; border: none; display: flex; @@ -408,7 +391,7 @@ menuseparator { outline: 0.5px solid light-dark(transparent, rgba(255, 255, 255, 0.02)); outline-offset: -0.5px; - :root[zen-right-side='true'] & { + :root[zen-right-side="true"] & { order: -1; } diff --git a/src/zen/common/styles/zen-sidebar-notification.css b/src/zen/common/styles/zen-sidebar-notification.css index a54e6b05f..4ee269133 100644 --- a/src/zen/common/styles/zen-sidebar-notification.css +++ b/src/zen/common/styles/zen-sidebar-notification.css @@ -92,13 +92,7 @@ opacity: 1; --special-color: color-mix(in srgb, var(--zen-primary-color), currentColor 50%); --specia-color-2: color-mix(in srgb, var(--zen-primary-color), currentColor 90%); - background: linear-gradient( - 135deg, - var(--specia-color-2), - var(--special-color), - var(--specia-color-2), - var(--special-color) - ); + background: linear-gradient(135deg, var(--specia-color-2), var(--special-color), var(--specia-color-2), var(--special-color)); background-size: 400%; filter: saturate(3); background-clip: text; diff --git a/src/zen/common/styles/zen-single-components.css b/src/zen/common/styles/zen-single-components.css index f8ac28b5b..3b022bb8b 100644 --- a/src/zen/common/styles/zen-single-components.css +++ b/src/zen/common/styles/zen-single-components.css @@ -23,7 +23,7 @@ display: none !important; } -@media -moz-pref('zen.theme.disable-lightweight') { +@media -moz-pref("zen.theme.disable-lightweight") { #customization-lwtheme-link { display: none !important; } @@ -76,7 +76,7 @@ body > #confetti { } } - &[only-svg-icons='true'] { + &[only-svg-icons="true"] { & #PanelUI-zen-emojis-picker-change-emojis { display: none; } @@ -85,7 +85,7 @@ body > #confetti { pointer-events: none; } - & #PanelUI-zen-emojis-picker-pages > vbox[emojis='true'] { + & #PanelUI-zen-emojis-picker-pages > vbox[emojis="true"] { display: none; } } @@ -186,11 +186,11 @@ body > #confetti { background-color 0.1s, transform 0.2s; - &[open='true'] { + &[open="true"] { transition: background-color 0.1s; } - &:not([open='true']):active:hover { + &:not([open="true"]):active:hover { transform: scale(0.95); } } @@ -216,13 +216,7 @@ body > #confetti { position: fixed; width: 100%; height: 100%; - background: linear-gradient( - to bottom, - transparent, - rgba(255, 255, 255, 0.5) 40%, - rgba(255, 255, 255, 0.5) 60%, - transparent 100% - ); + background: linear-gradient(to bottom, transparent, rgba(255, 255, 255, 0.5) 40%, rgba(255, 255, 255, 0.5) 60%, transparent 100%); left: 0; z-index: 999; opacity: 0; @@ -238,17 +232,13 @@ body > #confetti { } #zen-update-animation-border::before { - content: ''; + content: ""; position: absolute; inset: 0; border-radius: inherit; padding: 2px; /* thickness of border */ - background: radial-gradient( - ellipse 100% 50% at center var(--background-top), - rgba(255, 255, 255, 0.5) 80%, - transparent - ); + background: radial-gradient(ellipse 100% 50% at center var(--background-top), rgba(255, 255, 255, 0.5) 80%, transparent); /* Punch out the inside once (not animated) */ mask: @@ -264,7 +254,7 @@ body > #confetti { /* Status panel */ -@media (-moz-pref('zen.theme.styled-status-panel')) { +@media (-moz-pref("zen.theme.styled-status-panel")) { #statuspanel { padding: 6px; @@ -310,7 +300,7 @@ body > #confetti { display: none !important; } - &[overflowing='true'] { + &[overflowing="true"] { overflow-x: auto; max-height: 420px; mask-image: linear-gradient(to top, transparent, black 5%); @@ -443,7 +433,7 @@ body > #confetti { } &::before { - content: ''; + content: ""; position: absolute; inset: 1px; border-radius: 99px; @@ -464,7 +454,7 @@ body > #confetti { transform: scale(0.95); } - .permission-popup-permission-item[state='allow'] &::before { + .permission-popup-permission-item[state="allow"] &::before { opacity: 1; } } @@ -491,13 +481,13 @@ body > #confetti { } } -@media -moz-pref('zen.theme.hide-unified-extensions-button') { +@media -moz-pref("zen.theme.hide-unified-extensions-button") { #unified-extensions-button:not([showing]) { display: none !important; } } -@media not -moz-pref('zen.theme.hide-unified-extensions-button') { +@media not -moz-pref("zen.theme.hide-unified-extensions-button") { #zen-site-data-section-addons { display: none; } @@ -509,7 +499,7 @@ body > #confetti { padding: 10px 9px; padding-bottom: 8px; - :root[zen-single-toolbar='true']:not([zen-right-side='true']) & { + :root[zen-single-toolbar="true"]:not([zen-right-side="true"]) & { flex-direction: row-reverse; } @@ -539,16 +529,12 @@ body > #confetti { } &::before { - content: ''; + content: ""; position: absolute; width: 100%; height: 100%; @media (-moz-platform: macos) { - background: linear-gradient( - to bottom, - light-dark(rgb(255, 255, 255), rgb(34, 34, 34)), - light-dark(rgb(246, 246, 246), rgb(21, 21, 21)) - ); + background: linear-gradient(to bottom, light-dark(rgb(255, 255, 255), rgb(34, 34, 34)), light-dark(rgb(246, 246, 246), rgb(21, 21, 21))); box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1), @@ -624,6 +610,6 @@ body > #confetti { } /* Sidebar notification */ -:root:not([zen-sidebar-expanded='true']) zen-sidebar-notification { +:root:not([zen-sidebar-expanded="true"]) zen-sidebar-notification { display: none; } diff --git a/src/zen/common/styles/zen-toolbar.css b/src/zen/common/styles/zen-toolbar.css index 305654ae3..126690245 100644 --- a/src/zen/common/styles/zen-toolbar.css +++ b/src/zen/common/styles/zen-toolbar.css @@ -8,6 +8,6 @@ background: transparent; } -:root[inDOMFullscreen='true'] #zen-appcontent-navbar-wrapper { +:root[inDOMFullscreen="true"] #zen-appcontent-navbar-wrapper { visibility: collapse; } diff --git a/src/zen/common/sys/ZenActorsManager.sys.mjs b/src/zen/common/sys/ZenActorsManager.sys.mjs index da9930c1b..6595d55ee 100644 --- a/src/zen/common/sys/ZenActorsManager.sys.mjs +++ b/src/zen/common/sys/ZenActorsManager.sys.mjs @@ -3,7 +3,7 @@ // file, You can obtain one at http://mozilla.org/MPL/2.0/. // Utility to register JSWindowActors -import { ActorManagerParent } from 'resource://gre/modules/ActorManagerParent.sys.mjs'; +import { ActorManagerParent } from "resource://gre/modules/ActorManagerParent.sys.mjs"; /** * Fission-compatible JSProcess implementations. @@ -21,25 +21,25 @@ let JSPROCESSACTORS = {}; let JSWINDOWACTORS = { ZenModsMarketplace: { parent: { - esModuleURI: 'resource:///actors/ZenModsMarketplaceParent.sys.mjs', + esModuleURI: "resource:///actors/ZenModsMarketplaceParent.sys.mjs", }, child: { - esModuleURI: 'resource:///actors/ZenModsMarketplaceChild.sys.mjs', + esModuleURI: "resource:///actors/ZenModsMarketplaceChild.sys.mjs", events: { DOMContentLoaded: {}, }, }, matches: [ - ...Services.prefs.getStringPref('zen.injections.match-urls').split(','), - 'about:preferences', + ...Services.prefs.getStringPref("zen.injections.match-urls").split(","), + "about:preferences", ], }, ZenGlance: { parent: { - esModuleURI: 'resource:///actors/ZenGlanceParent.sys.mjs', + esModuleURI: "resource:///actors/ZenGlanceParent.sys.mjs", }, child: { - esModuleURI: 'resource:///actors/ZenGlanceChild.sys.mjs', + esModuleURI: "resource:///actors/ZenGlanceChild.sys.mjs", events: { DOMContentLoaded: {}, mousedown: { @@ -54,8 +54,8 @@ let JSWINDOWACTORS = { }, }, allFrames: true, - matches: ['*://*/*'], - enablePreference: 'zen.glance.enabled', + matches: ["*://*/*"], + enablePreference: "zen.glance.enabled", }, }; diff --git a/src/zen/common/sys/ZenCustomizableUI.sys.mjs b/src/zen/common/sys/ZenCustomizableUI.sys.mjs index 42fd818da..eef0b97a7 100644 --- a/src/zen/common/sys/ZenCustomizableUI.sys.mjs +++ b/src/zen/common/sys/ZenCustomizableUI.sys.mjs @@ -2,27 +2,27 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -import { AppConstants } from 'resource://gre/modules/AppConstants.sys.mjs'; +import { AppConstants } from "resource://gre/modules/AppConstants.sys.mjs"; export const ZenCustomizableUI = new (class { constructor() {} - TYPE_TOOLBAR = 'toolbar'; - defaultSidebarIcons = ['downloads-button', 'zen-workspaces-button', 'zen-create-new-button']; + TYPE_TOOLBAR = "toolbar"; + defaultSidebarIcons = ["downloads-button", "zen-workspaces-button", "zen-create-new-button"]; startup(CustomizableUIInternal) { CustomizableUIInternal.registerArea( - 'zen-sidebar-top-buttons', + "zen-sidebar-top-buttons", { type: this.TYPE_TOOLBAR, - defaultPlacements: ['zen-toggle-compact-mode'], + defaultPlacements: ["zen-toggle-compact-mode"], defaultCollapsed: null, overflowable: true, }, true ); CustomizableUIInternal.registerArea( - 'zen-sidebar-foot-buttons', + "zen-sidebar-foot-buttons", { type: this.TYPE_TOOLBAR, defaultPlacements: this.defaultSidebarIcons, @@ -39,16 +39,16 @@ export const ZenCustomizableUI = new (class { } #addSidebarButtons(window) { - const kDefaultSidebarWidth = AppConstants.platform === 'macosx' ? '230px' : '186px'; + const kDefaultSidebarWidth = AppConstants.platform === "macosx" ? "230px" : "186px"; const toolbox = window.gNavToolbox; // Set a splitter to navigator-toolbox - const splitter = window.document.createXULElement('splitter'); - splitter.setAttribute('id', 'zen-sidebar-splitter'); - splitter.setAttribute('orient', 'horizontal'); - splitter.setAttribute('resizebefore', 'sibling'); - splitter.setAttribute('resizeafter', 'none'); - toolbox.insertAdjacentElement('afterend', splitter); + const splitter = window.document.createXULElement("splitter"); + splitter.setAttribute("id", "zen-sidebar-splitter"); + splitter.setAttribute("orient", "horizontal"); + splitter.setAttribute("resizebefore", "sibling"); + splitter.setAttribute("resizeafter", "none"); + toolbox.insertAdjacentElement("afterend", splitter); const sidebarBox = window.MozXULElement.parseXULToFragment(` { - if (e[0].type !== 'attributes' || e[0].attributeName !== 'width') return; + if (e[0].type !== "attributes" || e[0].attributeName !== "width") { + return; + } this._dispatchResizeEvent(window); }).observe(toolbox, { attributes: true, //configure it to listen to attribute changes @@ -90,23 +92,27 @@ export const ZenCustomizableUI = new (class { // remove all styles except for the width, since we are xulstoring the complet style list const width = toolbox.style.width || kDefaultSidebarWidth; - toolbox.removeAttribute('style'); + toolbox.removeAttribute("style"); toolbox.style.width = width; - toolbox.setAttribute('width', width); + toolbox.setAttribute("width", width); - splitter.addEventListener('dblclick', (e) => { - if (e.button !== 0) return; + splitter.addEventListener("dblclick", (e) => { + if (e.button !== 0) { + return; + } toolbox.style.width = kDefaultSidebarWidth; - toolbox.setAttribute('width', kDefaultSidebarWidth); + toolbox.setAttribute("width", kDefaultSidebarWidth); }); - const newTab = window.document.getElementById('vertical-tabs-newtab-button'); - newTab.classList.add('zen-sidebar-action-button'); + const newTab = window.document.getElementById("vertical-tabs-newtab-button"); + newTab.classList.add("zen-sidebar-action-button"); for (let id of this.defaultSidebarIcons) { const elem = window.document.getElementById(id); - if (!elem || elem.id === 'zen-workspaces-button') continue; - elem.setAttribute('removable', 'true'); + if (!elem || elem.id === "zen-workspaces-button") { + continue; + } + elem.setAttribute("removable", "true"); } this.#initCreateNewButton(window); @@ -114,18 +120,19 @@ export const ZenCustomizableUI = new (class { } #initCreateNewButton(window) { - const button = window.document.getElementById('zen-create-new-button'); - button.addEventListener('command', (event) => { + const button = window.document.getElementById("zen-create-new-button"); + button.addEventListener("command", (event) => { if (window.gZenWorkspaces.privateWindowOrDisabled) { - return window.document.getElementById('cmd_newNavigatorTab').doCommand(); - } - if (button.hasAttribute('open')) { + window.document.getElementById("cmd_newNavigatorTab").doCommand(); return; } - const popup = window.document.getElementById('zenCreateNewPopup'); + if (button.hasAttribute("open")) { + return; + } + const popup = window.document.getElementById("zenCreateNewPopup"); popup.openPopup( button, - 'before_start', + "before_start", 0, 0, true /* isContextMenu */, @@ -136,13 +143,13 @@ export const ZenCustomizableUI = new (class { } #moveWindowButtons(window) { - const windowControls = window.document.getElementsByClassName('titlebar-buttonbox-container'); + const windowControls = window.document.getElementsByClassName("titlebar-buttonbox-container"); const toolboxIcons = window.document.getElementById( - 'zen-sidebar-top-buttons-customization-target' + "zen-sidebar-top-buttons-customization-target" ); if ( - window.AppConstants.platform === 'macosx' || - window.matchMedia('(-moz-gtk-csd-reversed-placement)').matches + window.AppConstants.platform === "macosx" || + window.matchMedia("(-moz-gtk-csd-reversed-placement)").matches ) { for (let i = 0; i < windowControls.length; i++) { if (i === 0) { @@ -155,27 +162,27 @@ export const ZenCustomizableUI = new (class { } #modifyToolbarButtons(window) { - const wrapper = window.document.getElementById('zen-sidebar-foot-buttons'); - const elementsToHide = ['new-tab-button']; + const wrapper = window.document.getElementById("zen-sidebar-foot-buttons"); + const elementsToHide = ["new-tab-button"]; for (let id of elementsToHide) { const elem = window.document.getElementById(id); if (elem) { wrapper.prepend(elem); } } - window.document.getElementById('stop-reload-button').removeAttribute('overflows'); + window.document.getElementById("stop-reload-button").removeAttribute("overflows"); } _dispatchResizeEvent(window) { - window.dispatchEvent(new window.Event('resize')); + window.dispatchEvent(new window.Event("resize")); } registerToolbarNodes(window) { window.CustomizableUI.registerToolbarNode( - window.document.getElementById('zen-sidebar-top-buttons') + window.document.getElementById("zen-sidebar-top-buttons") ); window.CustomizableUI.registerToolbarNode( - window.document.getElementById('zen-sidebar-foot-buttons') + window.document.getElementById("zen-sidebar-foot-buttons") ); } })(); diff --git a/src/zen/common/sys/ZenUIMigration.sys.mjs b/src/zen/common/sys/ZenUIMigration.sys.mjs index b4f5f2d15..bc1c85ad7 100644 --- a/src/zen/common/sys/ZenUIMigration.sys.mjs +++ b/src/zen/common/sys/ZenUIMigration.sys.mjs @@ -2,10 +2,10 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { AppConstants } from 'resource://gre/modules/AppConstants.sys.mjs'; +import { AppConstants } from "resource://gre/modules/AppConstants.sys.mjs"; class nsZenUIMigration { - PREF_NAME = 'zen.ui.migration.version'; + PREF_NAME = "zen.ui.migration.version"; MIGRATION_VERSION = 5; init(isNewProfile) { @@ -13,7 +13,7 @@ class nsZenUIMigration { try { this._migrate(); } catch (e) { - console.error('ZenUIMigration: Error during migration', e); + console.error("ZenUIMigration: Error during migration", e); } } this.clearVariables(); @@ -46,48 +46,48 @@ class nsZenUIMigration { // If there's an userChrome.css or userContent.css existing, we set // 'toolkit.legacyUserProfileCustomizations.stylesheets' back to true // We do this to avoid existing user stylesheets to be ignored - const profileDir = Services.dirsvc.get('ProfD', Ci.nsIFile); + const profileDir = Services.dirsvc.get("ProfD", Ci.nsIFile); const userChromeFile = profileDir.clone(); - userChromeFile.append('chrome'); - userChromeFile.append('userChrome.css'); + userChromeFile.append("chrome"); + userChromeFile.append("userChrome.css"); const userContentFile = profileDir.clone(); - userContentFile.append('chrome'); - userContentFile.append('userContent.css'); + userContentFile.append("chrome"); + userContentFile.append("userContent.css"); Services.prefs.setBoolPref( - 'zen.workspaces.separate-essentials', - Services.prefs.getBoolPref('zen.workspaces.container-specific-essentials-enabled', false) + "zen.workspaces.separate-essentials", + Services.prefs.getBoolPref("zen.workspaces.container-specific-essentials-enabled", false) ); - const theme = Services.prefs.getIntPref('layout.css.prefers-color-scheme.content-override', 0); - Services.prefs.setIntPref('zen.view.window.scheme', theme); + const theme = Services.prefs.getIntPref("layout.css.prefers-color-scheme.content-override", 0); + Services.prefs.setIntPref("zen.view.window.scheme", theme); if (userChromeFile.exists() || userContentFile.exists()) { - Services.prefs.setBoolPref('toolkit.legacyUserProfileCustomizations.stylesheets', true); - console.log('ZenUIMigration: User stylesheets detected, enabling legacy stylesheets.'); + Services.prefs.setBoolPref("toolkit.legacyUserProfileCustomizations.stylesheets", true); + console.warn("ZenUIMigration: User stylesheets detected, enabling legacy stylesheets."); this.shouldRestart = true; } } _migrateV2() { - if (AppConstants.platform !== 'linux') { - Services.prefs.setIntPref('zen.theme.gradient-legacy-version', 0); + if (AppConstants.platform !== "linux") { + Services.prefs.setIntPref("zen.theme.gradient-legacy-version", 0); } } _migrateV3() { - if (Services.prefs.getStringPref('zen.theme.accent-color', '').startsWith('system')) { - Services.prefs.setStringPref('zen.theme.accent-color', 'AccentColor'); + if (Services.prefs.getStringPref("zen.theme.accent-color", "").startsWith("system")) { + Services.prefs.setStringPref("zen.theme.accent-color", "AccentColor"); } } _migrateV4() { // Fix spelling mistake in preference name Services.prefs.setBoolPref( - 'zen.theme.use-system-colors', - Services.prefs.getBoolPref('zen.theme.use-sysyem-colors', false) + "zen.theme.use-system-colors", + Services.prefs.getBoolPref("zen.theme.use-sysyem-colors", false) ); } _migrateV5() { - Services.prefs.setBoolPref('zen.site-data-panel.show-callout', true); + Services.prefs.setBoolPref("zen.site-data-panel.show-callout", true); } } diff --git a/src/zen/common/zen-sets.js b/src/zen/common/zen-sets.js index 437ad3a77..cc5d3fc05 100644 --- a/src/zen/common/zen-sets.js +++ b/src/zen/common/zen-sets.js @@ -3,114 +3,115 @@ // file, You can obtain one at http://mozilla.org/MPL/2.0/. document.addEventListener( - 'MozBeforeInitialXULLayout', + "MozBeforeInitialXULLayout", () => { // defined in browser-sets.inc - document.getElementById('zenCommandSet').addEventListener('command', (event) => { + // eslint-disable-next-line complexity + document.getElementById("zenCommandSet").addEventListener("command", (event) => { switch (event.target.id) { - case 'cmd_zenCompactModeToggle': + case "cmd_zenCompactModeToggle": gZenCompactModeManager.toggle(); break; - case 'cmd_zenCompactModeShowSidebar': + case "cmd_zenCompactModeShowSidebar": gZenCompactModeManager.toggleSidebar(); break; - case 'cmd_toggleCompactModeIgnoreHover': + case "cmd_toggleCompactModeIgnoreHover": gZenCompactModeManager.toggle(true); break; - case 'cmd_zenWorkspaceForward': + case "cmd_zenWorkspaceForward": gZenWorkspaces.changeWorkspaceShortcut(); break; - case 'cmd_zenWorkspaceBackward': + case "cmd_zenWorkspaceBackward": gZenWorkspaces.changeWorkspaceShortcut(-1); break; - case 'cmd_zenSplitViewGrid': - gZenViewSplitter.toggleShortcut('grid'); + case "cmd_zenSplitViewGrid": + gZenViewSplitter.toggleShortcut("grid"); break; - case 'cmd_zenSplitViewVertical': - gZenViewSplitter.toggleShortcut('vsep'); + case "cmd_zenSplitViewVertical": + gZenViewSplitter.toggleShortcut("vsep"); break; - case 'cmd_zenSplitViewHorizontal': - gZenViewSplitter.toggleShortcut('hsep'); + case "cmd_zenSplitViewHorizontal": + gZenViewSplitter.toggleShortcut("hsep"); break; - case 'cmd_zenSplitViewUnsplit': - gZenViewSplitter.toggleShortcut('unsplit'); + case "cmd_zenSplitViewUnsplit": + gZenViewSplitter.toggleShortcut("unsplit"); break; - case 'cmd_zenSplitViewContextMenu': + case "cmd_zenSplitViewContextMenu": gZenViewSplitter.contextSplitTabs(); break; - case 'cmd_zenCopyCurrentURLMarkdown': + case "cmd_zenCopyCurrentURLMarkdown": gZenCommonActions.copyCurrentURLAsMarkdownToClipboard(); break; - case 'cmd_zenCopyCurrentURL': + case "cmd_zenCopyCurrentURL": gZenCommonActions.copyCurrentURLToClipboard(); break; - case 'cmd_zenPinnedTabReset': + case "cmd_zenPinnedTabReset": gZenPinnedTabManager.resetPinnedTab(gBrowser.selectedTab); break; - case 'cmd_zenPinnedTabResetNoTab': + case "cmd_zenPinnedTabResetNoTab": gZenPinnedTabManager.resetPinnedTab(); break; - case 'cmd_zenToggleSidebar': + case "cmd_zenToggleSidebar": gZenVerticalTabsManager.toggleExpand(); break; - case 'cmd_zenOpenZenThemePicker': + case "cmd_zenOpenZenThemePicker": gZenThemePicker.openThemePicker(event); break; - case 'cmd_zenChangeWorkspaceTab': + case "cmd_zenChangeWorkspaceTab": gZenWorkspaces.changeTabWorkspace( - event.sourceEvent.target.getAttribute('zen-workspace-id') + event.sourceEvent.target.getAttribute("zen-workspace-id") ); break; - case 'cmd_zenToggleTabsOnRight': + case "cmd_zenToggleTabsOnRight": gZenVerticalTabsManager.toggleTabsOnRight(); break; - case 'cmd_zenSplitViewLinkInNewTab': + case "cmd_zenSplitViewLinkInNewTab": gZenViewSplitter.splitLinkInNewTab(); break; - case 'cmd_zenNewEmptySplit': + case "cmd_zenNewEmptySplit": setTimeout(() => { gZenViewSplitter.createEmptySplit(); }, 0); break; - case 'cmd_zenReplacePinnedUrlWithCurrent': + case "cmd_zenReplacePinnedUrlWithCurrent": gZenPinnedTabManager.replacePinnedUrlWithCurrent(); break; - case 'cmd_contextZenAddToEssentials': + case "cmd_contextZenAddToEssentials": gZenPinnedTabManager.addToEssentials(); break; - case 'cmd_contextZenRemoveFromEssentials': + case "cmd_contextZenRemoveFromEssentials": gZenPinnedTabManager.removeEssentials(); break; - case 'cmd_zenCtxDeleteWorkspace': + case "cmd_zenCtxDeleteWorkspace": gZenWorkspaces.contextDeleteWorkspace(event); break; - case 'cmd_zenChangeWorkspaceName': + case "cmd_zenChangeWorkspaceName": gZenVerticalTabsManager.renameTabStart({ target: gZenWorkspaces.activeWorkspaceIndicator.querySelector( - '.zen-current-workspace-indicator-name' + ".zen-current-workspace-indicator-name" ), }); break; - case 'cmd_zenChangeWorkspaceIcon': + case "cmd_zenChangeWorkspaceIcon": gZenWorkspaces.changeWorkspaceIcon(); break; - case 'cmd_zenReorderWorkspaces': - gZenUIManager.showToast('zen-workspaces-how-to-reorder-title', { + case "cmd_zenReorderWorkspaces": + gZenUIManager.showToast("zen-workspaces-how-to-reorder-title", { timeout: 9000, - descriptionId: 'zen-workspaces-how-to-reorder-desc', + descriptionId: "zen-workspaces-how-to-reorder-desc", }); break; - case 'cmd_zenOpenWorkspaceCreation': + case "cmd_zenOpenWorkspaceCreation": gZenWorkspaces.openWorkspaceCreation(event); break; - case 'cmd_zenOpenFolderCreation': + case "cmd_zenOpenFolderCreation": gZenFolders.createFolder([], { renameFolder: true, }); break; - case 'cmd_zenTogglePinTab': { + case "cmd_zenTogglePinTab": { const currentTab = gBrowser.selectedTab; - if (currentTab && !currentTab.hasAttribute('zen-empty-tab')) { + if (currentTab && !currentTab.hasAttribute("zen-empty-tab")) { if (currentTab.pinned) { gBrowser.unpinTab(currentTab); } else { @@ -119,20 +120,20 @@ document.addEventListener( } break; } - case 'cmd_zenCloseUnpinnedTabs': + case "cmd_zenCloseUnpinnedTabs": gZenWorkspaces.closeAllUnpinnedTabs(); break; - case 'cmd_zenUnloadWorkspace': { + case "cmd_zenUnloadWorkspace": { gZenWorkspaces.unloadWorkspace(); break; } - case 'cmd_zenNewNavigatorUnsynced': + case "cmd_zenNewNavigatorUnsynced": OpenBrowserWindow({ zenSyncedWindow: false }); break; default: gZenGlanceManager.handleMainCommandSet(event); - if (event.target.id.startsWith('cmd_zenWorkspaceSwitch')) { - const index = parseInt(event.target.id.replace('cmd_zenWorkspaceSwitch', ''), 10) - 1; + if (event.target.id.startsWith("cmd_zenWorkspaceSwitch")) { + const index = parseInt(event.target.id.replace("cmd_zenWorkspaceSwitch", ""), 10) - 1; gZenWorkspaces.shortcutSwitchTo(index); } break; diff --git a/src/zen/common/zenThemeModifier.js b/src/zen/common/zenThemeModifier.js index 8842bb662..5b7b1958b 100644 --- a/src/zen/common/zenThemeModifier.js +++ b/src/zen/common/zenThemeModifier.js @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ -'use strict'; +"use strict"; /* INCLUDE THIS FILE AS: * @@ -11,13 +11,13 @@ */ { const { AppConstants } = ChromeUtils.importESModule( - 'resource://gre/modules/AppConstants.sys.mjs' + "resource://gre/modules/AppConstants.sys.mjs" ); const kZenThemePrefsList = [ - 'zen.theme.accent-color', - 'zen.theme.border-radius', - 'zen.theme.content-element-separation', + "zen.theme.accent-color", + "zen.theme.border-radius", + "zen.theme.content-element-separation", ]; const kZenMaxElementSeparation = 12; @@ -38,7 +38,7 @@ * begin listening to changes in preferred color scheme. */ init() { - this._inMainBrowserWindow = window.location.href == 'chrome://browser/content/browser.xhtml'; + this._inMainBrowserWindow = window.location.href == "chrome://browser/content/browser.xhtml"; this.listenForEvents(); this.updateAllThemeBasics(); }, @@ -52,10 +52,10 @@ // Add fullscreen listener to update the theme when going in and out of fullscreen const eventsForSeparation = [ - 'ZenViewSplitter:SplitViewDeactivated', - 'ZenViewSplitter:SplitViewActivated', - 'fullscreen', - 'ZenCompactMode:Toggled', + "ZenViewSplitter:SplitViewDeactivated", + "ZenViewSplitter:SplitViewActivated", + "fullscreen", + "ZenCompactMode:Toggled", ]; const separationHandler = this.updateElementSeparation.bind(this); for (let eventName of eventsForSeparation) { @@ -63,7 +63,7 @@ } window.addEventListener( - 'unload', + "unload", () => { for (let pref of kZenThemePrefsList) { Services.prefs.removeObserver(pref, handleEvent); @@ -91,27 +91,27 @@ }, updateBorderRadius() { - const borderRadius = Services.prefs.getIntPref('zen.theme.border-radius', -1); + const borderRadius = Services.prefs.getIntPref("zen.theme.border-radius", -1); // -1 is the default value, will use platform-native values // otherwise, use the custom value if (borderRadius == -1) { - if (AppConstants.platform == 'macosx') { - const targetRadius = window.matchMedia('(-moz-mac-tahoe-theme)').matches ? 15 : 10; - document.documentElement.style.setProperty('--zen-border-radius', targetRadius + 'px'); - } else if (AppConstants.platform == 'linux') { + if (AppConstants.platform == "macosx") { + const targetRadius = window.matchMedia("(-moz-mac-tahoe-theme)").matches ? 15 : 10; + document.documentElement.style.setProperty("--zen-border-radius", targetRadius + "px"); + } else if (AppConstants.platform == "linux") { // Linux uses GTK CSD titlebar radius, default to 8px document.documentElement.style.setProperty( - '--zen-border-radius', - 'env(-moz-gtk-csd-titlebar-radius, 8px)' + "--zen-border-radius", + "env(-moz-gtk-csd-titlebar-radius, 8px)" ); } else { // Windows defaults to 8px - document.documentElement.style.setProperty('--zen-border-radius', '8px'); + document.documentElement.style.setProperty("--zen-border-radius", "8px"); } } else { // Use the overridden value - document.documentElement.style.setProperty('--zen-border-radius', borderRadius + 'px'); + document.documentElement.style.setProperty("--zen-border-radius", borderRadius + "px"); } }, @@ -119,26 +119,26 @@ const kMinElementSeparation = 0.1; // in px let separation = this.elementSeparation; if ( - document.documentElement.hasAttribute('inFullscreen') && + document.documentElement.hasAttribute("inFullscreen") && window.gZenCompactModeManager?.preference && - !document.getElementById('tabbrowser-tabbox')?.hasAttribute('zen-split-view') && - Services.prefs.getBoolPref('zen.view.borderless-fullscreen', true) + !document.getElementById("tabbrowser-tabbox")?.hasAttribute("zen-split-view") && + Services.prefs.getBoolPref("zen.view.borderless-fullscreen", true) ) { separation = 0; } // In order to still use it on fullscreen, even if it's 0px, add .1px (almost invisible) separation = Math.max(kMinElementSeparation, separation); - document.documentElement.style.setProperty('--zen-element-separation', separation + 'px'); + document.documentElement.style.setProperty("--zen-element-separation", separation + "px"); if (separation == kMinElementSeparation) { - document.documentElement.setAttribute('zen-no-padding', true); + document.documentElement.setAttribute("zen-no-padding", true); } else { - document.documentElement.removeAttribute('zen-no-padding'); + document.documentElement.removeAttribute("zen-no-padding"); } }, get elementSeparation() { return Math.min( - Services.prefs.getIntPref('zen.theme.content-element-separation'), + Services.prefs.getIntPref("zen.theme.content-element-separation"), kZenMaxElementSeparation ); }, @@ -147,10 +147,12 @@ * Update the accent color. */ updateAccentColor() { - const accentColor = Services.prefs.getStringPref('zen.theme.accent-color'); - document.documentElement.style.setProperty('--zen-primary-color', accentColor); + const accentColor = Services.prefs.getStringPref("zen.theme.accent-color"); + document.documentElement.style.setProperty("--zen-primary-color", accentColor); }, }; - if (typeof Services !== 'undefined') ZenThemeModifier.init(); + if (typeof Services !== "undefined") { + ZenThemeModifier.init(); + } } diff --git a/src/zen/compact-mode/ZenCompactMode.mjs b/src/zen/compact-mode/ZenCompactMode.mjs index 2ed6ef755..205863968 100644 --- a/src/zen/compact-mode/ZenCompactMode.mjs +++ b/src/zen/compact-mode/ZenCompactMode.mjs @@ -6,34 +6,34 @@ const lazy = {}; XPCOMUtils.defineLazyPreferenceGetter( lazy, - 'COMPACT_MODE_FLASH_DURATION', - 'zen.view.compact.toolbar-flash-popup.duration', + "COMPACT_MODE_FLASH_DURATION", + "zen.view.compact.toolbar-flash-popup.duration", 800 ); XPCOMUtils.defineLazyPreferenceGetter( lazy, - 'COMPACT_MODE_FLASH_ENABLED', - 'zen.view.compact.toolbar-flash-popup', + "COMPACT_MODE_FLASH_ENABLED", + "zen.view.compact.toolbar-flash-popup", true ); XPCOMUtils.defineLazyPreferenceGetter( lazy, - 'COMPACT_MODE_CAN_ANIMATE_SIDEBAR', - 'zen.view.compact.animate-sidebar', + "COMPACT_MODE_CAN_ANIMATE_SIDEBAR", + "zen.view.compact.animate-sidebar", true ); XPCOMUtils.defineLazyPreferenceGetter( lazy, - 'COMPACT_MODE_SHOW_SIDEBAR_AND_TOOLBAR_ON_HOVER', - 'zen.view.compact.show-sidebar-and-toolbar-on-hover', + "COMPACT_MODE_SHOW_SIDEBAR_AND_TOOLBAR_ON_HOVER", + "zen.view.compact.show-sidebar-and-toolbar-on-hover", true ); -ChromeUtils.defineLazyGetter(lazy, 'mainAppWrapper', () => - document.getElementById('zen-main-app-wrapper') +ChromeUtils.defineLazyGetter(lazy, "mainAppWrapper", () => + document.getElementById("zen-main-app-wrapper") ); window.gZenCompactModeManager = { @@ -42,14 +42,14 @@ window.gZenCompactModeManager = { _removeHoverFrames: {}, // Delay to avoid flickering when hovering over the sidebar - HOVER_HACK_DELAY: Services.prefs.getIntPref('zen.view.compact.hover-hack-delay', 0), + HOVER_HACK_DELAY: Services.prefs.getIntPref("zen.view.compact.hover-hack-delay", 0), preInit() { this._wasInCompactMode = Services.prefs.getBoolPref( - 'zen.view.compact.enable-at-startup', + "zen.view.compact.enable-at-startup", false ); - this._canDebugLog = Services.prefs.getBoolPref('zen.view.compact.debug', false); + this._canDebugLog = Services.prefs.getBoolPref("zen.view.compact.debug", false); this.addContextMenu(); }, @@ -58,35 +58,37 @@ window.gZenCompactModeManager = { this.addMouseActions(); const tabIsRightObserver = this._updateSidebarIsOnRight.bind(this); - Services.prefs.addObserver('zen.tabs.vertical.right-side', tabIsRightObserver); + Services.prefs.addObserver("zen.tabs.vertical.right-side", tabIsRightObserver); window.addEventListener( - 'unload', + "unload", () => { - Services.prefs.removeObserver('zen.tabs.vertical.right-side', tabIsRightObserver); + Services.prefs.removeObserver("zen.tabs.vertical.right-side", tabIsRightObserver); }, { once: true } ); gZenUIManager.addPopupTrackingAttribute(this.sidebar); gZenUIManager.addPopupTrackingAttribute( - document.getElementById('zen-appcontent-navbar-wrapper') + document.getElementById("zen-appcontent-navbar-wrapper") ); this.addHasPolyfillObserver(); // Clear hover states when window state changes (minimize, maximize, etc.) - window.addEventListener('sizemodechange', () => this._clearAllHoverStates()); + window.addEventListener("sizemodechange", () => this._clearAllHoverStates()); this._canShowBackgroundTabToast = Services.prefs.getBoolPref( - 'zen.view.compact.show-background-tab-toast', + "zen.view.compact.show-background-tab-toast", true ); - if (AppConstants.platform == 'macosx') { - window.addEventListener('mouseover', (event) => { + if (AppConstants.platform == "macosx") { + window.addEventListener("mouseover", (event) => { const buttons = gZenVerticalTabsManager.actualWindowButtons; - if (event.target.closest('.titlebar-buttonbox-container') === buttons) return; + if (event.target.closest(".titlebar-buttonbox-container") === buttons) { + return; + } this._setElementExpandAttribute(buttons, false); }); } @@ -98,28 +100,29 @@ window.gZenCompactModeManager = { log(...args) { if (this._canDebugLog) { - console.log('[Zen Compact Mode]', ...args); + // eslint-disable-next-line no-console + console.debug("[Zen Compact Mode]", ...args); } }, get preference() { - return document.documentElement.getAttribute('zen-compact-mode') === 'true'; + return document.documentElement.getAttribute("zen-compact-mode") === "true"; }, get shouldBeCompact() { - return !document.documentElement.getAttribute('chromehidden')?.includes('toolbar'); + return !document.documentElement.getAttribute("chromehidden")?.includes("toolbar"); }, set preference(value) { if (!this.shouldBeCompact) { value = false; } - this.log('Setting compact mode preference to', value); + this.log("Setting compact mode preference to", value); if ( this.preference === value || - document.documentElement.hasAttribute('zen-compact-animating') + document.documentElement.hasAttribute("zen-compact-animating") ) { - if (typeof this._wasInCompactMode !== 'undefined') { + if (typeof this._wasInCompactMode !== "undefined") { // We wont do anything with it anyway, so we remove it delete this._wasInCompactMode; } @@ -127,22 +130,22 @@ window.gZenCompactModeManager = { // We dont want the user to be able to spam the button return; } - this.sidebar.removeAttribute('zen-user-show'); + this.sidebar.removeAttribute("zen-user-show"); // We use this element in order to make it persis across restarts, by using the XULStore. // main-window can't store attributes other than window sizes, so we use this instead - lazy.mainAppWrapper.setAttribute('zen-compact-mode', value); - document.documentElement.setAttribute('zen-compact-mode', value); - if (typeof this._wasInCompactMode === 'undefined') { - Services.prefs.setBoolPref('zen.view.compact.enable-at-startup', value); + lazy.mainAppWrapper.setAttribute("zen-compact-mode", value); + document.documentElement.setAttribute("zen-compact-mode", value); + if (typeof this._wasInCompactMode === "undefined") { + Services.prefs.setBoolPref("zen.view.compact.enable-at-startup", value); } this._updateEvent(); }, get sidebarIsOnRight() { - if (typeof this._sidebarIsOnRight !== 'undefined') { + if (typeof this._sidebarIsOnRight !== "undefined") { return this._sidebarIsOnRight; } - this._sidebarIsOnRight = Services.prefs.getBoolPref('zen.tabs.vertical.right-side'); + this._sidebarIsOnRight = Services.prefs.getBoolPref("zen.tabs.vertical.right-side"); return this._sidebarIsOnRight; }, @@ -151,7 +154,7 @@ window.gZenCompactModeManager = { }, addHasPolyfillObserver() { - const attributes = ['panelopen', 'open', 'breakout-extend', 'zen-floating-urlbar']; + const attributes = ["panelopen", "open", "breakout-extend", "zen-floating-urlbar"]; this.sidebarObserverId = ZenHasPolyfill.observeSelectorExistence( this.sidebar, [ @@ -160,18 +163,18 @@ window.gZenCompactModeManager = { ":is([panelopen='true'], [open='true'], [breakout-extend='true']):not(#urlbar[zen-floating-urlbar='true']):not(tab):not(.zen-compact-mode-ignore)", }, ], - 'zen-compact-mode-active', + "zen-compact-mode-active", attributes ); this.toolbarObserverId = ZenHasPolyfill.observeSelectorExistence( - document.getElementById('zen-appcontent-navbar-wrapper'), + document.getElementById("zen-appcontent-navbar-wrapper"), [ { selector: ":is([panelopen='true'], [open='true'], #urlbar:focus-within, [breakout-extend='true']):not(.zen-compact-mode-ignore)", }, ], - 'zen-compact-mode-active', + "zen-compact-mode-active", attributes ); // Always connect this observer, we need it even if compact mode is disabled @@ -208,64 +211,66 @@ window.gZenCompactModeManager = { `); const idToAction = { - 'zen-context-menu-compact-mode-hide-sidebar': this.hideSidebar.bind(this), - 'zen-context-menu-compact-mode-hide-toolbar': this.hideToolbar.bind(this), - 'zen-context-menu-compact-mode-hide-both': this.hideBoth.bind(this), + "zen-context-menu-compact-mode-hide-sidebar": this.hideSidebar.bind(this), + "zen-context-menu-compact-mode-hide-toolbar": this.hideToolbar.bind(this), + "zen-context-menu-compact-mode-hide-both": this.hideBoth.bind(this), }; - for (let menuitem of fragment.querySelectorAll('menuitem')) { + for (let menuitem of fragment.querySelectorAll("menuitem")) { if (menuitem.id in idToAction) { - menuitem.addEventListener('command', idToAction[menuitem.id]); + menuitem.addEventListener("command", idToAction[menuitem.id]); } } - document.getElementById('viewToolbarsMenuSeparator').before(fragment); + document.getElementById("viewToolbarsMenuSeparator").before(fragment); this.updateContextMenu(); }, updateCompactModeContext(isSingleToolbar) { const isIllegalState = this.checkIfIllegalState(); - const menuitem = document.getElementById('zen-context-menu-compact-mode-toggle'); - const menu = document.getElementById('zen-context-menu-compact-mode'); + const menuitem = document.getElementById("zen-context-menu-compact-mode-toggle"); + const menu = document.getElementById("zen-context-menu-compact-mode"); if (!menu) { return; } if (isSingleToolbar) { - menu.setAttribute('hidden', 'true'); + menu.setAttribute("hidden", "true"); menu.before(menuitem); } else { - menu.removeAttribute('hidden'); - menu.querySelector('menupopup').prepend(menuitem); + menu.removeAttribute("hidden"); + menu.querySelector("menupopup").prepend(menuitem); } const hideToolbarMenuItem = document.getElementById( - 'zen-context-menu-compact-mode-hide-toolbar' + "zen-context-menu-compact-mode-hide-toolbar" ); if (isIllegalState) { - hideToolbarMenuItem.setAttribute('disabled', 'true'); + hideToolbarMenuItem.setAttribute("disabled", "true"); } else { - hideToolbarMenuItem.removeAttribute('disabled'); + hideToolbarMenuItem.removeAttribute("disabled"); } }, hideSidebar() { - Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', true); - Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', false); + Services.prefs.setBoolPref("zen.view.compact.hide-tabbar", true); + Services.prefs.setBoolPref("zen.view.compact.hide-toolbar", false); this.callAllEventListeners(); }, hideToolbar() { - Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', true); - Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', false); + Services.prefs.setBoolPref("zen.view.compact.hide-toolbar", true); + Services.prefs.setBoolPref("zen.view.compact.hide-tabbar", false); this.callAllEventListeners(); }, hideBoth() { - Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', true); - Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', true); + Services.prefs.setBoolPref("zen.view.compact.hide-tabbar", true); + Services.prefs.setBoolPref("zen.view.compact.hide-toolbar", true); this.callAllEventListeners(); }, - /* Check for illegal states and fix them + /** + * Check for illegal states and fix them + * * @returns {boolean} If the context menu should just show the "toggle" item * instead of a submenu with hide options */ @@ -288,8 +293,8 @@ window.gZenCompactModeManager = { (isLeftSideButtons && !isRightSidebar) || (!isLeftSideButtons && isRightSidebar); if (closelyIllegalState && canHideToolbar && !canHideSidebar) { // This state is illegal - Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', true); - Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', false); + Services.prefs.setBoolPref("zen.view.compact.hide-tabbar", true); + Services.prefs.setBoolPref("zen.view.compact.hide-toolbar", false); this.callAllEventListeners(); return true; } @@ -332,7 +337,7 @@ window.gZenCompactModeManager = { } else { ZenHasPolyfill.disconnectObserver(this.sidebarObserverId); } - window.dispatchEvent(new CustomEvent('ZenCompactMode:Toggled', { detail: this.preference })); + window.dispatchEvent(new CustomEvent("ZenCompactMode:Toggled", { detail: this.preference })); }, // NOTE: Dont actually use event, it's just so we make sure @@ -344,15 +349,15 @@ window.gZenCompactModeManager = { } let sidebarWidth = this.sidebar.getBoundingClientRect().width; const shouldRecalculate = - this.preference || document.documentElement.hasAttribute('zen-creating-workspace'); - const sidebarExpanded = document.documentElement.hasAttribute('zen-sidebar-expanded'); + this.preference || document.documentElement.hasAttribute("zen-creating-workspace"); + const sidebarExpanded = document.documentElement.hasAttribute("zen-sidebar-expanded"); if (sidebarWidth > 1) { if (shouldRecalculate && sidebarExpanded) { sidebarWidth = Math.max(sidebarWidth, 150); } // Second variable to get the genuine width of the sidebar - this.sidebar.style.setProperty('--actual-zen-sidebar-width', `${sidebarWidth}px`); - window.dispatchEvent(new window.Event('resize')); // To recalculate the layout + this.sidebar.style.setProperty("--actual-zen-sidebar-width", `${sidebarWidth}px`); + window.dispatchEvent(new window.Event("resize")); // To recalculate the layout if ( event && shouldRecalculate && @@ -362,57 +367,56 @@ window.gZenCompactModeManager = { return; } delete gZenVerticalTabsManager._hadSidebarCollapse; - this.sidebar.style.setProperty('--zen-sidebar-width', `${sidebarWidth}px`); + this.sidebar.style.setProperty("--zen-sidebar-width", `${sidebarWidth}px`); } - return sidebarWidth; }, get canHideSidebar() { return ( - Services.prefs.getBoolPref('zen.view.compact.hide-tabbar') || + Services.prefs.getBoolPref("zen.view.compact.hide-tabbar") || gZenVerticalTabsManager._hasSetSingleToolbar ); }, get canHideToolbar() { return ( - Services.prefs.getBoolPref('zen.view.compact.hide-toolbar') && + Services.prefs.getBoolPref("zen.view.compact.hide-toolbar") && !gZenVerticalTabsManager._hasSetSingleToolbar ); }, animateCompactMode() { // Get the splitter width before hiding it (we need to hide it before animating on right) - document.documentElement.setAttribute('zen-compact-animating', 'true'); + document.documentElement.setAttribute("zen-compact-animating", "true"); return new Promise((resolve) => { // We need to set the splitter width before hiding it let splitterWidth = document - .getElementById('zen-sidebar-splitter') + .getElementById("zen-sidebar-splitter") .getBoundingClientRect().width; const isCompactMode = this.preference; const canHideSidebar = this.canHideSidebar; let canAnimate = lazy.COMPACT_MODE_CAN_ANIMATE_SIDEBAR && !this.isSidebarPotentiallyOpen(); - if (typeof this._wasInCompactMode !== 'undefined') { + if (typeof this._wasInCompactMode !== "undefined") { canAnimate = false; delete this._wasInCompactMode; } // Do this so we can get the correct width ONCE compact mode styled have been applied if (canAnimate) { - this.sidebar.setAttribute('animate', 'true'); + this.sidebar.setAttribute("animate", "true"); } if (this._ignoreNextHover) { this._setElementExpandAttribute(this.sidebar, false); } - this.sidebar.style.removeProperty('margin-right'); - this.sidebar.style.removeProperty('margin-left'); - this.sidebar.style.removeProperty('transform'); + this.sidebar.style.removeProperty("margin-right"); + this.sidebar.style.removeProperty("margin-left"); + this.sidebar.style.removeProperty("transform"); window.requestAnimationFrame(() => { delete this._ignoreNextResize; let sidebarWidth = this.getAndApplySidebarWidth(); const elementSeparation = ZenThemeModifier.elementSeparation; if (!canAnimate) { - this.sidebar.removeAttribute('animate'); - document.documentElement.removeAttribute('zen-compact-animating'); + this.sidebar.removeAttribute("animate"); + document.documentElement.removeAttribute("zen-compact-animating"); this.getAndApplySidebarWidth({}); this._ignoreNextResize = true; @@ -422,7 +426,7 @@ window.gZenCompactModeManager = { resolve(); return; } - if (document.documentElement.hasAttribute('zen-sidebar-expanded')) { + if (document.documentElement.hasAttribute("zen-sidebar-expanded")) { sidebarWidth -= 0.5 * splitterWidth; if (elementSeparation < splitterWidth) { // Subtract from the splitter width to end up with the correct element separation @@ -441,20 +445,20 @@ window.gZenCompactModeManager = { marginLeft: [0, this.sidebarIsOnRight ? 0 : `-${sidebarWidth}px`], }, { - ease: 'easeIn', - type: 'spring', + ease: "easeIn", + type: "spring", bounce: 0, duration: 0.12, } ) .then(() => { - this.sidebar.style.transition = 'none'; - this.sidebar.style.pointEvents = 'none'; - const titlebar = document.getElementById('titlebar'); - titlebar.style.visibility = 'hidden'; - titlebar.style.transition = 'none'; - this.sidebar.removeAttribute('animate'); - document.documentElement.removeAttribute('zen-compact-animating'); + this.sidebar.style.transition = "none"; + this.sidebar.style.pointEvents = "none"; + const titlebar = document.getElementById("titlebar"); + titlebar.style.visibility = "hidden"; + titlebar.style.transition = "none"; + this.sidebar.removeAttribute("animate"); + document.documentElement.removeAttribute("zen-compact-animating"); setTimeout(() => { this.getAndApplySidebarWidth({}); @@ -467,16 +471,16 @@ window.gZenCompactModeManager = { }); } - this.sidebar.style.removeProperty('margin-right'); - this.sidebar.style.removeProperty('margin-left'); - this.sidebar.style.removeProperty('transition'); - this.sidebar.style.removeProperty('transform'); - this.sidebar.style.removeProperty('point-events'); + this.sidebar.style.removeProperty("margin-right"); + this.sidebar.style.removeProperty("margin-left"); + this.sidebar.style.removeProperty("transition"); + this.sidebar.style.removeProperty("transform"); + this.sidebar.style.removeProperty("point-events"); - titlebar.style.removeProperty('visibility'); - titlebar.style.removeProperty('transition'); + titlebar.style.removeProperty("visibility"); + titlebar.style.removeProperty("transition"); - gURLBar.style.removeProperty('visibility'); + gURLBar.style.removeProperty("visibility"); resolve(); }); @@ -485,7 +489,7 @@ window.gZenCompactModeManager = { } else if (canHideSidebar && !isCompactMode) { // Shouldn't be ever true, but just in case delete this._ignoreNextHover; - document.getElementById('browser').style.overflow = 'clip'; + document.getElementById("browser").style.overflow = "clip"; if (this.sidebarIsOnRight) { this.sidebar.style.marginRight = `-${sidebarWidth}px`; } else { @@ -497,32 +501,32 @@ window.gZenCompactModeManager = { this.sidebarIsOnRight ? { marginRight: [`-${sidebarWidth}px`, 0], - transform: ['translateX(100%)', 'translateX(0)'], + transform: ["translateX(100%)", "translateX(0)"], } : { marginLeft: 0 }, { - ease: 'easeOut', - type: 'spring', + ease: "easeOut", + type: "spring", bounce: 0, duration: 0.12, } ) .then(() => { - this.sidebar.removeAttribute('animate'); - document.getElementById('browser').style.removeProperty('overflow'); - this.sidebar.style.transition = 'none'; - this.sidebar.style.removeProperty('margin-right'); - this.sidebar.style.removeProperty('margin-left'); - this.sidebar.style.removeProperty('transform'); - document.documentElement.removeAttribute('zen-compact-animating'); + this.sidebar.removeAttribute("animate"); + document.getElementById("browser").style.removeProperty("overflow"); + this.sidebar.style.transition = "none"; + this.sidebar.style.removeProperty("margin-right"); + this.sidebar.style.removeProperty("margin-left"); + this.sidebar.style.removeProperty("transform"); + document.documentElement.removeAttribute("zen-compact-animating"); setTimeout(() => { - this.sidebar.style.removeProperty('transition'); + this.sidebar.style.removeProperty("transition"); resolve(); }); }); } else { - this.sidebar.removeAttribute('animate'); // remove the attribute if we are not animating - document.documentElement.removeAttribute('zen-compact-animating'); + this.sidebar.removeAttribute("animate"); // remove the attribute if we are not animating + document.documentElement.removeAttribute("zen-compact-animating"); delete this._ignoreNextHover; resolve(); } @@ -531,32 +535,32 @@ window.gZenCompactModeManager = { }, updateContextMenu() { - const toggle = document.getElementById('zen-context-menu-compact-mode-toggle'); + const toggle = document.getElementById("zen-context-menu-compact-mode-toggle"); if (!toggle) { return; } - toggle.setAttribute('checked', this.preference); + toggle.setAttribute("checked", this.preference); const hideTabBar = this.canHideSidebar; const hideToolbar = this.canHideToolbar; const hideBoth = hideTabBar && hideToolbar; - const idName = 'zen-context-menu-compact-mode-hide-'; - const sidebarItem = document.getElementById(idName + 'sidebar'); - const toolbarItem = document.getElementById(idName + 'toolbar'); - const bothItem = document.getElementById(idName + 'both'); - sidebarItem.setAttribute('checked', !hideBoth && hideTabBar); - toolbarItem.setAttribute('checked', !hideBoth && hideToolbar); - bothItem.setAttribute('checked', hideBoth); + const idName = "zen-context-menu-compact-mode-hide-"; + const sidebarItem = document.getElementById(idName + "sidebar"); + const toolbarItem = document.getElementById(idName + "toolbar"); + const bothItem = document.getElementById(idName + "both"); + sidebarItem.setAttribute("checked", !hideBoth && hideTabBar); + toolbarItem.setAttribute("checked", !hideBoth && hideToolbar); + bothItem.setAttribute("checked", hideBoth); }, _removeOpenStateOnUnifiedExtensions() { // Fix for bug https://github.com/zen-browser/desktop/issues/1925 const buttons = document.querySelectorAll( - 'toolbarbutton:is(#unified-extensions-button, .webextension-browser-action)' + "toolbarbutton:is(#unified-extensions-button, .webextension-browser-action)" ); for (let button of buttons) { - button.removeAttribute('open'); + button.removeAttribute("open"); } }, @@ -567,30 +571,30 @@ window.gZenCompactModeManager = { }, _updateSidebarIsOnRight() { - this._sidebarIsOnRight = Services.prefs.getBoolPref('zen.tabs.vertical.right-side'); + this._sidebarIsOnRight = Services.prefs.getBoolPref("zen.tabs.vertical.right-side"); }, toggleSidebar() { - this.sidebar.toggleAttribute('zen-user-show'); + this.sidebar.toggleAttribute("zen-user-show"); }, get hideAfterHoverDuration() { if (this._hideAfterHoverDuration) { return this._hideAfterHoverDuration; } - return Services.prefs.getIntPref('zen.view.compact.toolbar-hide-after-hover.duration'); + return Services.prefs.getIntPref("zen.view.compact.toolbar-hide-after-hover.duration"); }, get hoverableElements() { return [ { element: this.sidebar, - screenEdge: this.sidebarIsOnRight ? 'right' : 'left', + screenEdge: this.sidebarIsOnRight ? "right" : "left", keepHoverDuration: 100, }, { - element: document.getElementById('zen-appcontent-navbar-wrapper'), - screenEdge: 'top', + element: document.getElementById("zen-appcontent-navbar-wrapper"), + screenEdge: "top", }, { element: gZenVerticalTabsManager.actualWindowButtons, @@ -599,13 +603,13 @@ window.gZenCompactModeManager = { }, flashSidebar(duration = lazy.COMPACT_MODE_FLASH_DURATION) { - let tabPanels = document.getElementById('tabbrowser-tabpanels'); + let tabPanels = document.getElementById("tabbrowser-tabpanels"); if (!tabPanels.matches("[zen-split-view='true']")) { this.flashElement(this.sidebar, duration, this.sidebar.id); } }, - flashElement(element, duration, id, attrName = 'flash-popup') { + flashElement(element, duration, id, attrName = "flash-popup") { if (this._flashTimeouts[id]) { clearTimeout(this._flashTimeouts[id]); } else { @@ -624,48 +628,50 @@ window.gZenCompactModeManager = { this._flashTimeouts[id] = null; }, - _setElementExpandAttribute(element, value, attr = 'zen-has-hover') { - const kVerifiedAttributes = ['zen-has-hover', 'has-popup-menu', 'zen-compact-mode-active']; - const isToolbar = element.id === 'zen-appcontent-navbar-wrapper'; + _setElementExpandAttribute(element, value, attr = "zen-has-hover") { + const kVerifiedAttributes = ["zen-has-hover", "has-popup-menu", "zen-compact-mode-active"]; + const isToolbar = element.id === "zen-appcontent-navbar-wrapper"; if (value) { - if (attr === 'zen-has-hover' && element !== gZenVerticalTabsManager.actualWindowButtons) { - element.setAttribute('zen-has-implicit-hover', 'true'); + if (attr === "zen-has-hover" && element !== gZenVerticalTabsManager.actualWindowButtons) { + element.setAttribute("zen-has-implicit-hover", "true"); if (!lazy.COMPACT_MODE_SHOW_SIDEBAR_AND_TOOLBAR_ON_HOVER) { return; } } - element.setAttribute(attr, 'true'); + element.setAttribute(attr, "true"); if ( isToolbar && ((gZenVerticalTabsManager._hasSetSingleToolbar && - (element.hasAttribute('should-hide') || - document.documentElement.hasAttribute('zen-has-bookmarks'))) || + (element.hasAttribute("should-hide") || + document.documentElement.hasAttribute("zen-has-bookmarks"))) || (this.preference && - Services.prefs.getBoolPref('zen.view.compact.hide-toolbar') && + Services.prefs.getBoolPref("zen.view.compact.hide-toolbar") && !gZenVerticalTabsManager._hasSetSingleToolbar)) ) { - gBrowser.tabpanels.setAttribute('has-toolbar-hovered', 'true'); + gBrowser.tabpanels.setAttribute("has-toolbar-hovered", "true"); } } else { - if (attr === 'zen-has-hover') { - element.removeAttribute('zen-has-implicit-hover'); + if (attr === "zen-has-hover") { + element.removeAttribute("zen-has-implicit-hover"); } element.removeAttribute(attr); // Only remove if none of the verified attributes are present - if (isToolbar && !kVerifiedAttributes.some((attr) => element.hasAttribute(attr))) { - gBrowser.tabpanels.removeAttribute('has-toolbar-hovered'); + if ( + isToolbar && + !kVerifiedAttributes.some((verifiedAttr) => element.hasAttribute(verifiedAttr)) + ) { + gBrowser.tabpanels.removeAttribute("has-toolbar-hovered"); } } }, addMouseActions() { - gURLBar.addEventListener('mouseenter', (event) => { - if (event.target.closest('#urlbar[zen-floating-urlbar]')) { + gURLBar.addEventListener("mouseenter", (event) => { + if (event.target.closest("#urlbar[zen-floating-urlbar]")) { window.requestAnimationFrame(() => { this._setElementExpandAttribute(gZenVerticalTabsManager.actualWindowButtons, false); }); this._hasHoveredUrlbar = true; - return; } }); @@ -673,22 +679,26 @@ window.gZenCompactModeManager = { let target = this.hoverableElements[i].element; // Add the attribute on startup if the mouse is already over the element - if (target.matches(':hover')) { + if (target.matches(":hover")) { this._setElementExpandAttribute(target, true); } const onEnter = (event) => { setTimeout(() => { - if (event.type === 'mouseenter' && !event.target.matches(':hover')) return; - if (event.target.closest('panel')) return; + if (event.type === "mouseenter" && !event.target.matches(":hover")) { + return; + } + if (event.target.closest("panel")) { + return; + } // Dont register the hover if the urlbar is floating and we are hovering over it - this.clearFlashTimeout('has-hover' + target.id); + this.clearFlashTimeout("has-hover" + target.id); window.requestAnimationFrame(() => { if ( - document.documentElement.getAttribute('supress-primary-adjustment') === 'true' || + document.documentElement.getAttribute("supress-primary-adjustment") === "true" || this._hasHoveredUrlbar || this._ignoreNextHover || - target.hasAttribute('zen-has-hover') + target.hasAttribute("zen-has-hover") ) { return; } @@ -698,7 +708,7 @@ window.gZenCompactModeManager = { }; const onLeave = (event) => { - if (AppConstants.platform == 'macosx') { + if (AppConstants.platform == "macosx") { const buttonRect = gZenVerticalTabsManager.actualWindowButtons.getBoundingClientRect(); const MAC_WINDOW_BUTTONS_X_BORDER = buttonRect.width + buttonRect.x; const MAC_WINDOW_BUTTONS_Y_BORDER = buttonRect.height + buttonRect.y; @@ -717,17 +727,17 @@ window.gZenCompactModeManager = { // This is because the mouse is left to be handled natively so firefox thinks the mouse left the window for a split second. setTimeout(() => { // Let's double check if the mouse is still hovering over the element, see the bug above. - if (event.target.matches(':hover')) { + if (event.target.matches(":hover")) { return; } if ( - event.explicitOriginalTarget?.closest?.('#urlbar[zen-floating-urlbar]') || - (document.documentElement.getAttribute('supress-primary-adjustment') === 'true' && + event.explicitOriginalTarget?.closest?.("#urlbar[zen-floating-urlbar]") || + (document.documentElement.getAttribute("supress-primary-adjustment") === "true" && gZenVerticalTabsManager._hasSetSingleToolbar) || this._hasHoveredUrlbar || this._ignoreNextHover || - (event.type === 'dragleave' && + (event.type === "dragleave" && event.explicitOriginalTarget !== target && target.contains?.(event.explicitOriginalTarget)) ) { @@ -738,8 +748,8 @@ window.gZenCompactModeManager = { this.flashElement( target, this.hoverableElements[i].keepHoverDuration, - 'has-hover' + target.id, - 'zen-has-hover' + "has-hover" + target.id, + "zen-has-hover" ); } else { this._removeHoverFrames[target.id] = window.requestAnimationFrame(() => @@ -749,21 +759,25 @@ window.gZenCompactModeManager = { }, this.HOVER_HACK_DELAY); }; - target.addEventListener('mouseover', onEnter); - target.addEventListener('dragover', onEnter); + target.addEventListener("mouseover", onEnter); + target.addEventListener("dragover", onEnter); - target.addEventListener('mouseleave', onLeave); - target.addEventListener('dragleave', onLeave); + target.addEventListener("mouseleave", onLeave); + target.addEventListener("dragleave", onLeave); } - document.documentElement.addEventListener('mouseleave', (event) => { + document.documentElement.addEventListener("mouseleave", (event) => { setTimeout(() => { const screenEdgeCrossed = this._getCrossedEdge(event.pageX, event.pageY); - if (!screenEdgeCrossed) return; + if (!screenEdgeCrossed) { + return; + } for (let entry of this.hoverableElements) { - if (screenEdgeCrossed !== entry.screenEdge) continue; + if (screenEdgeCrossed !== entry.screenEdge) { + continue; + } const target = entry.element; - const boundAxis = entry.screenEdge === 'right' || entry.screenEdge === 'left' ? 'y' : 'x'; + const boundAxis = entry.screenEdge === "right" || entry.screenEdge === "left" ? "y" : "x"; if (!this._positionInBounds(boundAxis, target, event.pageX, event.pageY, 7)) { continue; } @@ -772,15 +786,17 @@ window.gZenCompactModeManager = { this.flashElement( target, this.hideAfterHoverDuration, - 'has-hover' + target.id, - 'zen-has-hover' + "has-hover" + target.id, + "zen-has-hover" ); document.addEventListener( - 'mousemove', + "mousemove", () => { - if (target.matches(':hover')) return; + if (target.matches(":hover")) { + return; + } this._setElementExpandAttribute(target, false); - this.clearFlashTimeout('has-hover' + target.id); + this.clearFlashTimeout("has-hover" + target.id); }, { once: true } ); @@ -788,7 +804,7 @@ window.gZenCompactModeManager = { }, this.HOVER_HACK_DELAY); }); - gURLBar.addEventListener('mouseleave', () => { + gURLBar.addEventListener("mouseleave", () => { setTimeout(() => { setTimeout(() => { requestAnimationFrame(() => { @@ -803,25 +819,27 @@ window.gZenCompactModeManager = { const targetBox = element.getBoundingClientRect(); posX = Math.max(targetBox.left, Math.min(posX, targetBox.right)); posY = Math.max(targetBox.top, Math.min(posY, targetBox.bottom)); - return ['top', 'bottom', 'left', 'right'].find((edge, i) => { + return ["top", "bottom", "left", "right"].find((edge, i) => { const distance = Math.abs((i < 2 ? posY : posX) - targetBox[edge]); return distance <= maxDistance; }); }, - _positionInBounds(axis = 'x', element, x, y, error = 0) { + _positionInBounds(axis = "x", element, x, y, error = 0) { const bBox = element.getBoundingClientRect(); - if (axis === 'y') return bBox.top - error < y && y < bBox.bottom + error; - else return bBox.left - error < x && x < bBox.right + error; + if (axis === "y") { + return bBox.top - error < y && y < bBox.bottom + error; + } + return bBox.left - error < x && x < bBox.right + error; }, _clearAllHoverStates() { // Clear hover attributes from all hoverable elements for (let entry of this.hoverableElements) { const target = entry.element; - if (target && !target.matches(':hover') && target.hasAttribute('zen-has-hover')) { + if (target && !target.matches(":hover") && target.hasAttribute("zen-has-hover")) { this._setElementExpandAttribute(target, false); - this.clearFlashTimeout('has-hover' + target.id); + this.clearFlashTimeout("has-hover" + target.id); } } }, @@ -831,9 +849,9 @@ window.gZenCompactModeManager = { this._setElementExpandAttribute(this.sidebar, false); } return ( - this.sidebar.hasAttribute('zen-user-show') || - this.sidebar.hasAttribute('zen-has-hover') || - this.sidebar.hasAttribute('zen-has-empty-tab') + this.sidebar.hasAttribute("zen-user-show") || + this.sidebar.hasAttribute("zen-has-hover") || + this.sidebar.hasAttribute("zen-has-empty-tab") ); }, @@ -846,9 +864,9 @@ window.gZenCompactModeManager = { !gZenGlanceManager._animating && !this._nextTimeWillBeActive ) { - gZenUIManager.showToast('zen-background-tab-opened-toast', { + gZenUIManager.showToast("zen-background-tab-opened-toast", { button: { - id: 'zen-open-background-tab-button', + id: "zen-open-background-tab-button", command: () => { const targetWindow = window.ownerGlobal.parent || window; targetWindow.gBrowser.selectedTab = tab; @@ -861,7 +879,7 @@ window.gZenCompactModeManager = { }; document.addEventListener( - 'MozBeforeInitialXULLayout', + "MozBeforeInitialXULLayout", () => { gZenCompactModeManager.preInit(); }, diff --git a/src/zen/downloads/ZenDownloadAnimation.mjs b/src/zen/downloads/ZenDownloadAnimation.mjs index 5001f636d..84c36a052 100644 --- a/src/zen/downloads/ZenDownloadAnimation.mjs +++ b/src/zen/downloads/ZenDownloadAnimation.mjs @@ -5,7 +5,7 @@ import { nsZenDOMOperatedFeature, nsZenMultiWindowFeature, -} from 'chrome://browser/content/zen-components/ZenCommonUtils.mjs'; +} from "chrome://browser/content/zen-components/ZenCommonUtils.mjs"; const CONFIG = Object.freeze({ ANIMATION: { @@ -37,7 +37,7 @@ class nsZenDownloadAnimation extends nsZenDOMOperatedFeature { #handleNewDownload() { if ( - !Services.prefs.getBoolPref('zen.downloads.download-animation') || + !Services.prefs.getBoolPref("zen.downloads.download-animation") || !nsZenMultiWindowFeature.isActiveWindow ) { return; @@ -54,10 +54,10 @@ class nsZenDownloadAnimation extends nsZenDOMOperatedFeature { } #animateDownload(startPosition) { - let animationElement = document.querySelector('zen-download-animation'); + let animationElement = document.querySelector("zen-download-animation"); if (!animationElement) { - animationElement = document.createElement('zen-download-animation'); + animationElement = document.createElement("zen-download-animation"); document.body.appendChild(animationElement); } @@ -72,17 +72,17 @@ class nsZenDownloadAnimationElement extends HTMLElement { constructor() { super(); - this.attachShadow({ mode: 'open' }); + this.attachShadow({ mode: "open" }); this.#loadArcStyles(); } #loadArcStyles() { try { - const link = document.createElement('link'); - link.setAttribute('rel', 'stylesheet'); + const link = document.createElement("link"); + link.setAttribute("rel", "stylesheet"); link.setAttribute( - 'href', - 'chrome://browser/content/zen-styles/zen-download-arc-animation.css' + "href", + "chrome://browser/content/zen-styles/zen-download-arc-animation.css" ); this.shadowRoot.appendChild(link); } catch (error) { @@ -131,14 +131,18 @@ class nsZenDownloadAnimationElement extends HTMLElement { } #areTabsOnRightSide() { - const position = Services.prefs.getIntPref('zen.downloads.icon-popup-position', 0); - if (position === 1) return false; - if (position === 2) return true; - return Services.prefs.getBoolPref('zen.tabs.vertical.right-side'); + const position = Services.prefs.getIntPref("zen.downloads.icon-popup-position", 0); + if (position === 1) { + return false; + } + if (position === 2) { + return true; + } + return Services.prefs.getBoolPref("zen.tabs.vertical.right-side"); } #determineEndPosition() { - const downloadsButton = document.getElementById('downloads-button'); + const downloadsButton = document.getElementById("downloads-button"); const isDownloadButtonVisible = downloadsButton && this.#isElementVisible(downloadsButton); let endPosition = { clientX: 0, clientY: 0 }; @@ -153,7 +157,7 @@ class nsZenDownloadAnimationElement extends HTMLElement { } else { // Use alternative position at bottom of wrapper const areTabsPositionedRight = this.#areTabsOnRightSide(); - const wrapper = document.getElementById('zen-main-app-wrapper'); + const wrapper = document.getElementById("zen-main-app-wrapper"); const wrapperRect = wrapper.getBoundingClientRect(); endPosition = { @@ -175,12 +179,12 @@ class nsZenDownloadAnimationElement extends HTMLElement { `; const fragment = window.MozXULElement.parseXULToFragment(arcAnimationHTML); - const animationElement = fragment.querySelector('.zen-download-arc-animation'); + const animationElement = fragment.querySelector(".zen-download-arc-animation"); Object.assign(animationElement.style, { left: `${startPosition.clientX}px`, top: `${startPosition.clientY}px`, - transform: 'translate(-50%, -50%)', + transform: "translate(-50%, -50%)", }); this.shadowRoot.appendChild(animationElement); @@ -229,14 +233,14 @@ class nsZenDownloadAnimationElement extends HTMLElement { } await gZenUIManager.motion.animate(arcAnimationElement, sequence, { - duration: Services.prefs.getIntPref('zen.downloads.download-animation-duration') / 1000, - easing: 'cubic-bezier(0.37, 0, 0.63, 1)', - fill: 'forwards', + duration: Services.prefs.getIntPref("zen.downloads.download-animation-duration") / 1000, + easing: "cubic-bezier(0.37, 0, 0.63, 1)", + fill: "forwards", }); this.#cleanArcAnimation(arcAnimationElement); } catch (error) { - console.error('[nsZenDownloadAnimationElement] Error in animation sequence:', error); + console.error("[nsZenDownloadAnimationElement] Error in animation sequence:", error); this.#cleanArcAnimation(arcAnimationElement); } } @@ -330,7 +334,7 @@ class nsZenDownloadAnimationElement extends HTMLElement { return; } - const wrapper = document.getElementById('zen-main-app-wrapper'); + const wrapper = document.getElementById("zen-main-app-wrapper"); if (!wrapper) { console.warn( `[${nsZenDownloadAnimationElement.name}] Cannot start box animation, Wrapper element not found` @@ -347,15 +351,15 @@ class nsZenDownloadAnimationElement extends HTMLElement { `; - const sideProp = areTabsPositionedRight ? 'right' : 'left'; + const sideProp = areTabsPositionedRight ? "right" : "left"; const fragment = window.MozXULElement.parseXULToFragment(boxAnimationHTML); - this.#boxAnimationElement = fragment.querySelector('.zen-download-box-animation'); + this.#boxAnimationElement = fragment.querySelector(".zen-download-box-animation"); Object.assign(this.#boxAnimationElement.style, { - bottom: '24px', - transform: 'scale(0.8)', - [sideProp]: '-50px', + bottom: "24px", + transform: "scale(0.8)", + [sideProp]: "-50px", }); wrapper.appendChild(this.#boxAnimationElement); @@ -363,25 +367,25 @@ class nsZenDownloadAnimationElement extends HTMLElement { await gZenUIManager.motion.animate( this.#boxAnimationElement, { - [sideProp]: '34px', + [sideProp]: "34px", opacity: 1, - transform: 'scale(1.1)', + transform: "scale(1.1)", }, { duration: 0.35, - easing: 'ease-out', + easing: "ease-out", } ).finished; await gZenUIManager.motion.animate( this.#boxAnimationElement, { - [sideProp]: '24px', - transform: 'scale(1)', + [sideProp]: "24px", + transform: "scale(1)", }, { duration: 0.2, - easing: 'ease-in-out', + easing: "ease-in-out", } ).finished; @@ -401,7 +405,7 @@ class nsZenDownloadAnimationElement extends HTMLElement { } #getBoxAnimationDurationMs() { - return Services.prefs.getIntPref('zen.downloads.download-animation-duration') + 200; + return Services.prefs.getIntPref("zen.downloads.download-animation-duration") + 200; } async #finishBoxAnimation(areTabsPositionedRight) { @@ -409,36 +413,38 @@ class nsZenDownloadAnimationElement extends HTMLElement { this.#boxAnimationTimeoutId = null; if (!this.#boxAnimationElement || this.#isBoxAnimationRunning) { - if (!this.#boxAnimationElement) this.#cleanBoxAnimationState(); + if (!this.#boxAnimationElement) { + this.#cleanBoxAnimationState(); + } return; } this.#isBoxAnimationRunning = true; try { - const sideProp = areTabsPositionedRight ? 'right' : 'left'; + const sideProp = areTabsPositionedRight ? "right" : "left"; await gZenUIManager.motion.animate( this.#boxAnimationElement, { - transform: 'scale(0.9)', + transform: "scale(0.9)", }, { duration: 0.15, - easing: 'ease-in', + easing: "ease-in", } ).finished; await gZenUIManager.motion.animate( this.#boxAnimationElement, { - [sideProp]: '-50px', + [sideProp]: "-50px", opacity: 0, - transform: 'scale(0.8)', + transform: "scale(0.8)", }, { duration: 0.3, - easing: 'cubic-bezier(0.5, 0, 0.75, 0)', + easing: "cubic-bezier(0.5, 0, 0.75, 0)", } ).finished; } catch (error) { @@ -474,7 +480,9 @@ class nsZenDownloadAnimationElement extends HTMLElement { } #isElementVisible(element) { - if (!element) return false; + if (!element) { + return false; + } const rect = element.getBoundingClientRect(); @@ -495,6 +503,6 @@ class nsZenDownloadAnimationElement extends HTMLElement { } } -customElements.define('zen-download-animation', nsZenDownloadAnimationElement); +customElements.define("zen-download-animation", nsZenDownloadAnimationElement); new nsZenDownloadAnimation(); diff --git a/src/zen/downloads/zen-download-arc-animation.css b/src/zen/downloads/zen-download-arc-animation.css index ea3bd2f97..610b142e6 100644 --- a/src/zen/downloads/zen-download-arc-animation.css +++ b/src/zen/downloads/zen-download-arc-animation.css @@ -41,6 +41,6 @@ width: 100%; height: 100%; background-color: var(--zen-primary-color); - mask: url('chrome://browser/content/zen-images/downloads/download.svg') no-repeat center; + mask: url("chrome://browser/content/zen-images/downloads/download.svg") no-repeat center; mask-size: 70%; } diff --git a/src/zen/downloads/zen-download-box-animation.css b/src/zen/downloads/zen-download-box-animation.css index e182f1f0f..90bc5ad63 100644 --- a/src/zen/downloads/zen-download-box-animation.css +++ b/src/zen/downloads/zen-download-box-animation.css @@ -21,7 +21,7 @@ width: 50%; height: 50%; background-color: var(--zen-primary-color); - mask: url('chrome://browser/content/zen-images/downloads/archive.svg') no-repeat center; + mask: url("chrome://browser/content/zen-images/downloads/archive.svg") no-repeat center; mask-size: contain; display: block; } diff --git a/src/zen/drag-and-drop/ZenDragAndDrop.js b/src/zen/drag-and-drop/ZenDragAndDrop.js index 1fe6ff121..359bcc7ab 100644 --- a/src/zen/drag-and-drop/ZenDragAndDrop.js +++ b/src/zen/drag-and-drop/ZenDragAndDrop.js @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -'use strict'; +"use strict"; // Wrap in a block to prevent leaking to window scope. { @@ -33,19 +33,19 @@ */ const elementToMove = (element) => { if ( - element.closest('.zen-current-workspace-indicator') || - element.hasAttribute('split-view-group') + element.closest(".zen-current-workspace-indicator") || + element.hasAttribute("split-view-group") ) { return element; } - if (element.group?.hasAttribute('split-view-group')) { + if (element.group?.hasAttribute("split-view-group")) { return element.group; } if (isTab(element)) { return element; } if (isTabGroupLabel(element)) { - return element.closest('.tab-group-label-container'); + return element.closest(".tab-group-label-container"); } throw new Error(`Element "${element.tagName}" is not expected to move`); }; @@ -64,15 +64,15 @@ XPCOMUtils.defineLazyServiceGetter( this, - 'ZenDragAndDropService', - '@mozilla.org/zen/drag-and-drop;1', + "ZenDragAndDropService", + "@mozilla.org/zen/drag-and-drop;1", Ci.nsIZenDragAndDrop ); XPCOMUtils.defineLazyPreferenceGetter( this, - '_dndSwitchSpaceDelay', - 'zen.tabs.dnd-switch-space-delay', + "_dndSwitchSpaceDelay", + "zen.tabs.dnd-switch-space-delay", 1000 ); } @@ -80,7 +80,7 @@ init() { super.init(); this.handle_windowDragEnter = this.handle_windowDragEnter.bind(this); - window.addEventListener('dragleave', this.handle_windowDragLeave.bind(this), { + window.addEventListener("dragleave", this.handle_windowDragLeave.bind(this), { capture: true, }); } @@ -102,28 +102,28 @@ #createDragImageForTabs(draggedTab, movingTabs) { const periphery = gZenWorkspaces.activeWorkspaceElement.querySelector( - '#tabbrowser-arrowscrollbox-periphery' + "#tabbrowser-arrowscrollbox-periphery" ); const dragData = draggedTab._dragData; const tabRect = window.windowUtils.getBoundsWithoutFlushing(movingTabs[0]); - const wrapper = document.createElement('div'); - wrapper.style.width = tabRect.width + 'px'; - wrapper.style.height = tabRect.height * movingTabs.length + 'px'; - wrapper.style.overflow = 'clip'; - wrapper.style.position = 'fixed'; - wrapper.style.top = '-9999px'; + const wrapper = document.createElement("div"); + wrapper.style.width = tabRect.width + "px"; + wrapper.style.height = tabRect.height * movingTabs.length + "px"; + wrapper.style.overflow = "clip"; + wrapper.style.position = "fixed"; + wrapper.style.top = "-9999px"; periphery.appendChild(wrapper); for (let i = 0; i < movingTabs.length; i++) { const tab = movingTabs[i]; const tabClone = tab.cloneNode(true); - if (tabClone.hasAttribute('zen-essential')) { + if (tabClone.hasAttribute("zen-essential")) { const rect = tab.getBoundingClientRect(); tabClone.style.minWidth = tabClone.style.maxWidth = `${rect.width}px`; tabClone.style.minHeight = tabClone.style.maxHeight = `${rect.height}px`; } if (i > 0) { tabClone.style.transform = `translate(${i * 4}px, -${i * (tabRect.height - 4)}px)`; - tabClone.style.opacity = '0.2'; + tabClone.style.opacity = "0.2"; tabClone.style.zIndex = `${-i}`; } // Apply a transform translate to the tab in order to center it within the drag image @@ -131,9 +131,9 @@ if (!movingTabs.length > 1) { tabClone.style.transform = `translate(${(tabRect.width - dragData.offsetX) / 2}px, ${(tabRect.height - dragData.offsetY) / 2}px)`; } - tabClone.setAttribute('drag-image', 'true'); + tabClone.setAttribute("drag-image", "true"); wrapper.appendChild(tabClone); - if (isTab(tabClone) && !tabClone.hasAttribute('zen-essential')) { + if (isTab(tabClone) && !tabClone.hasAttribute("zen-essential")) { // We need to limit the label content so the drag image doesn't grow too big. const label = tabClone.textLabel; const tabLabelParentWidth = label.parentElement.getBoundingClientRect().width; @@ -147,32 +147,34 @@ #maybeCreateDragImageDot(movingTabs, wrapper) { if (movingTabs.length > 1) { - const dot = document.createElement('div'); + const dot = document.createElement("div"); dot.textContent = movingTabs.length; - dot.style.position = 'absolute'; - dot.style.top = '-10px'; - dot.style.left = '-16px'; - dot.style.background = 'red'; - dot.style.borderRadius = '50%'; - dot.style.fontWeight = 'bold'; - dot.style.fontSize = '10px'; - dot.style.lineHeight = '16px'; - dot.style.justifyContent = dot.style.alignItems = 'center'; - dot.style.height = dot.style.minWidth = '16px'; - dot.style.textAlign = 'center'; - dot.style.color = 'white'; + dot.style.position = "absolute"; + dot.style.top = "-10px"; + dot.style.left = "-16px"; + dot.style.background = "red"; + dot.style.borderRadius = "50%"; + dot.style.fontWeight = "bold"; + dot.style.fontSize = "10px"; + dot.style.lineHeight = "16px"; + dot.style.justifyContent = dot.style.alignItems = "center"; + dot.style.height = dot.style.minWidth = "16px"; + dot.style.textAlign = "center"; + dot.style.color = "white"; wrapper.appendChild(dot); } } + // eslint-disable-next-line complexity _animateTabMove(event) { let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0); - if (event.target.closest('#zen-essentials')) { + if (event.target.closest("#zen-essentials")) { if (!isTab(draggedTab)) { this.clearDragOverVisuals(); return; } - return this.#animateVerticalPinnedGridDragOver(event); + this.#animateVerticalPinnedGridDragOver(event); + return; } else if (this._fakeEssentialTab) { this.#makeDragImageNonEssential(event); } @@ -185,7 +187,7 @@ : dragData.screenX; let allTabs = this._tabbrowserTabs.ariaFocusableItems; let numEssentials = gBrowser._numZenEssentials; - let isEssential = draggedTab.hasAttribute('zen-essential'); + let isEssential = draggedTab.hasAttribute("zen-essential"); let tabs = allTabs.slice( isEssential ? 0 : numEssentials, isEssential ? numEssentials : undefined @@ -206,8 +208,8 @@ let bounds = (ele) => window.windowUtils.getBoundsWithoutFlushing(ele); let logicalForward = screenForward != this._rtlMode; - let screenAxis = this._tabbrowserTabs.verticalMode ? 'screenY' : 'screenX'; - let size = this._tabbrowserTabs.verticalMode ? 'height' : 'width'; + let screenAxis = this._tabbrowserTabs.verticalMode ? "screenY" : "screenX"; + let size = this._tabbrowserTabs.verticalMode ? "height" : "width"; let { width: tabWidth, height: tabHeight } = bounds(draggedTab); let tabSize = this._tabbrowserTabs.verticalMode ? tabHeight : tabWidth; let translateX = event.screenX - dragData.screenX; @@ -219,7 +221,7 @@ dragData.translateY = translateY; // Move the dragged tab based on the mouse position. - let periphery = document.getElementById('tabbrowser-arrowscrollbox-periphery'); + let periphery = document.getElementById("tabbrowser-arrowscrollbox-periphery"); let lastMovingTab = movingTabs.at(-1); let firstMovingTab = movingTabs[0]; let endEdge = (ele) => ele[screenAxis] + bounds(ele)[size]; @@ -485,7 +487,7 @@ ); moveOverThreshold = gBrowser._tabGroupsEnabled - ? Services.prefs.getIntPref('browser.tabs.dragDrop.moveOverThresholdPercent') / 100 + ? Services.prefs.getIntPref("browser.tabs.dragDrop.moveOverThresholdPercent") / 100 : 0.5; moveOverThreshold = Math.min(1, Math.max(0, moveOverThreshold)); let shouldMoveOver = overlapPercent > moveOverThreshold; @@ -516,8 +518,8 @@ } } - this._tabbrowserTabs.removeAttribute('movingtab-group'); - this._resetGroupTarget(document.querySelector('[dragover-groupTarget]')); + this._tabbrowserTabs.removeAttribute("movingtab-group"); + this._resetGroupTarget(document.querySelector("[dragover-groupTarget]")); delete dragData.shouldDropIntoCollapsedTabGroup; @@ -538,8 +540,8 @@ dropBefore = true; } this._setDragOverGroupColor(colorCode); - this._tabbrowserTabs.toggleAttribute('movingtab-addToGroup', colorCode); - this._tabbrowserTabs.toggleAttribute('movingtab-ungroup', !colorCode); + this._tabbrowserTabs.toggleAttribute("movingtab-addToGroup", colorCode); + this._tabbrowserTabs.toggleAttribute("movingtab-ungroup", !colorCode); if ( newDropElementIndex == oldDropElementIndex && @@ -555,15 +557,15 @@ } #isMovingTab() { - return this._tabbrowserTabs.hasAttribute('movingtab'); + return this._tabbrowserTabs.hasAttribute("movingtab"); } get #dragShiftableItems() { const separator = gZenWorkspaces.pinnedTabsContainer.querySelector( - '.pinned-tabs-container-separator' + ".pinned-tabs-container-separator" ); // Make sure to always return the separator at the start of the array - return Services.prefs.getBoolPref('zen.view.show-newtab-button-top') + return Services.prefs.getBoolPref("zen.view.show-newtab-button-top") ? [separator, gZenWorkspaces.activeWorkspaceElement.newTabButton] : [separator]; } @@ -577,10 +579,10 @@ } #shouldSwitchSpace(event) { - const padding = Services.prefs.getIntPref('zen.workspaces.dnd-switch-padding'); + const padding = Services.prefs.getIntPref("zen.workspaces.dnd-switch-padding"); // If we are hovering over the edges of the gNavToolbox or the splitter, we // can change the workspace after a short delay. - const splitter = document.getElementById('zen-sidebar-splitter'); + const splitter = document.getElementById("zen-sidebar-splitter"); let rect = window.windowUtils.getBoundsWithoutFlushing(gNavToolbox); if (!(gZenCompactModeManager.preference && gZenCompactModeManager.canHideSidebar)) { rect.width += window.windowUtils.getBoundsWithoutFlushing(splitter).width; @@ -601,7 +603,7 @@ #handle_sidebarDragOver(event) { const dt = event.dataTransfer; const draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0); - if (draggedTab.hasAttribute('zen-essential')) { + if (draggedTab.hasAttribute("zen-essential")) { this.clearSpaceSwitchTimer(); return; } @@ -655,12 +657,12 @@ let dragData = draggedTab._dragData; let movingTabs = dragData.movingTabs; if (!this._browserDragImageWrapper) { - const wrappingDiv = document.createXULElement('vbox'); - canvas.style.borderRadius = '8px'; - canvas.style.border = '2px solid white'; - wrappingDiv.style.width = 200 + 'px'; - wrappingDiv.style.height = 130 + 'px'; - wrappingDiv.style.position = 'relative'; + const wrappingDiv = document.createXULElement("vbox"); + canvas.style.borderRadius = "8px"; + canvas.style.border = "2px solid white"; + wrappingDiv.style.width = 200 + "px"; + wrappingDiv.style.height = 130 + "px"; + wrappingDiv.style.position = "relative"; this.#maybeCreateDragImageDot(movingTabs, wrappingDiv); wrappingDiv.appendChild(canvas); this._browserDragImageWrapper = wrappingDiv; @@ -671,7 +673,7 @@ this.originalDragImageArgs[1], this.originalDragImageArgs[2] ); - window.addEventListener('dragover', this.handle_windowDragEnter, { + window.addEventListener("dragover", this.handle_windowDragEnter, { once: true, capture: true, }); @@ -686,12 +688,12 @@ let draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0); if ( isTab(draggedTab) && - !draggedTab.hasAttribute('zen-essential') && - draggedTab.getAttribute('zen-workspace-id') != activeWorkspace + !draggedTab.hasAttribute("zen-essential") && + draggedTab.getAttribute("zen-workspace-id") != activeWorkspace ) { const movingTabs = draggedTab._dragData?.movingTabs || [draggedTab]; for (let tab of movingTabs) { - tab.setAttribute('zen-workspace-id', activeWorkspace); + tab.setAttribute("zen-workspace-id", activeWorkspace); } gBrowser.selectedTab = draggedTab; } @@ -716,9 +718,9 @@ !gZenStartup.isReady || gReduceMotion || !dropElement || - dropElement.hasAttribute('zen-essential') || - draggedTab.hasAttribute('zen-essential') || - draggedTab.getAttribute('zen-workspace-id') != gZenWorkspaces.activeWorkspace || + dropElement.hasAttribute("zen-essential") || + draggedTab.hasAttribute("zen-essential") || + draggedTab.getAttribute("zen-workspace-id") != gZenWorkspaces.activeWorkspace || !dropElement.visible || !draggedTab.visible ) { @@ -727,16 +729,16 @@ this.#isAnimatingTabMove = true; for (let item of this._tabbrowserTabs.ariaFocusableItems) { item = elementToMove(item); - item.style.transform = ''; + item.style.transform = ""; } const animateElement = (ele, translateY) => { ele.style.transform = `translateY(${translateY}px)`; let animateInternal = (resolve) => { gZenUIManager - .elementAnimate(ele, { y: [translateY, 0] }, { duration: 100, easing: 'ease-out' }) + .elementAnimate(ele, { y: [translateY, 0] }, { duration: 100, easing: "ease-out" }) .then(() => { - ele.style.transform = ''; - ele.style.zIndex = ''; + ele.style.transform = ""; + ele.style.zIndex = ""; }) .finally(resolve); }; @@ -785,7 +787,7 @@ : -rect.height * tabsInBetween.length; draggedTabTranslateY += extraTranslate * (draggedTab.elementIndex > dropElement.elementIndex ? 1 : -1); - draggedTab.style.zIndex = '9'; + draggedTab.style.zIndex = "9"; animateElement(draggedTab, draggedTabTranslateY); } catch (e) { console.error(e); @@ -802,7 +804,7 @@ gZenPinnedTabManager.removeTabContainersDragoverClass(); this.#maybeClearVerticalPinnedGridDragOver(); this.originalDragImageArgs = []; - window.removeEventListener('dragover', this.handle_windowDragEnter, { capture: true }); + window.removeEventListener("dragover", this.handle_windowDragEnter, { capture: true }); this.#isOutOfWindow = false; if (this._browserDragImageWrapper) { this._browserDragImageWrapper.remove(); @@ -820,8 +822,8 @@ } const margin = 2; const rect = window.windowUtils.getBoundsWithoutFlushing(element); - this.#dragOverBackground = document.createElement('div'); - this.#dragOverBackground.id = 'zen-dragover-background'; + this.#dragOverBackground = document.createElement("div"); + this.#dragOverBackground.id = "zen-dragover-background"; this.#dragOverBackground.style.height = `${rect.height - margin * 2}px`; this.#dragOverBackground.style.top = `${rect.top + margin}px`; gNavToolbox.appendChild(this.#dragOverBackground); @@ -842,16 +844,16 @@ gZenPinnedTabManager.removeTabContainersDragoverClass(); } + // eslint-disable-next-line complexity #applyDragoverIndicator(event, tabs, movingTabs, draggedTab) { const separation = 4; const dropZoneSelector = - ':is(.tabbrowser-tab, .zen-drop-target, .tab-group-label, tab-group[split-view-group])'; + ":is(.tabbrowser-tab, .zen-drop-target, .tab-group-label, tab-group[split-view-group])"; let shouldPlayHapticFeedback = false; let showIndicatorUnderNewTabButton = false; - let dropBefore = false; let dropElement = event.target.closest(dropZoneSelector); if (!dropElement) { - if (event.target.classList.contains('zen-workspace-empty-space')) { + if (event.target.classList.contains("zen-workspace-empty-space")) { dropElement = this._tabbrowserTabs.ariaFocusableItems.at(-1); // Only if there are no normal tabs to drop after showIndicatorUnderNewTabButton = !tabs.some((tab) => !(tab.group || tab).pinned); @@ -884,14 +886,14 @@ const overlapPercent = (event.clientY - rect.top) / rect.height; // We wan't to leave a small threshold (20% for example) so we can drag tabs below and above // a folder label without dragging into the folder. - let threshold = Services.prefs.getIntPref('zen.tabs.folder-dragover-threshold-percent') / 100; + let threshold = Services.prefs.getIntPref("zen.tabs.folder-dragover-threshold-percent") / 100; let dropIntoFolder = isZenFolder && (overlapPercent < threshold || overlapPercent > 1 - threshold); if ( isTabGroupLabel(draggedTab) && draggedTab.group?.isZenFolder && - (isTab(dropElement) || dropElement.hasAttribute('split-view-group')) && - (!dropElement.pinned || dropElement.hasAttribute('zen-essential')) + (isTab(dropElement) || dropElement.hasAttribute("split-view-group")) && + (!dropElement.pinned || dropElement.hasAttribute("zen-essential")) ) { this.clearDragOverVisuals(); return; @@ -900,7 +902,7 @@ isTab(dropElement) || dropIntoFolder || showIndicatorUnderNewTabButton || - dropElement.hasAttribute('split-view-group') + dropElement.hasAttribute("split-view-group") ) { if (showIndicatorUnderNewTabButton) { rect = window.windowUtils.getBoundsWithoutFlushing(this.#dragShiftableItems.at(-1)); @@ -908,42 +910,39 @@ const indicator = gZenPinnedTabManager.dragIndicator; let top = 0; threshold = - Services.prefs.getIntPref('browser.tabs.dragDrop.moveOverThresholdPercent') / 100; + Services.prefs.getIntPref("browser.tabs.dragDrop.moveOverThresholdPercent") / 100; if (overlapPercent > threshold) { - top = Math.round(rect.top + rect.height) + 'px'; - dropBefore = false; + top = Math.round(rect.top + rect.height) + "px"; } else { - top = Math.round(rect.top) + 'px'; - dropBefore = true; + top = Math.round(rect.top) + "px"; } if (indicator.style.top !== top) { shouldPlayHapticFeedback = true; } - indicator.setAttribute('orientation', 'horizontal'); - indicator.style.setProperty('--indicator-left', rect.left + separation / 2 + 'px'); - indicator.style.setProperty('--indicator-width', rect.width - separation + 'px'); + indicator.setAttribute("orientation", "horizontal"); + indicator.style.setProperty("--indicator-left", rect.left + separation / 2 + "px"); + indicator.style.setProperty("--indicator-width", rect.width - separation + "px"); indicator.style.top = top; - indicator.style.removeProperty('left'); + indicator.style.removeProperty("left"); this.#removeDragOverBackground(); if (!isTab(dropElement) && dropElement?.parentElement?.isZenFolder) { dropElement = dropElement.parentElement; } - } else if (dropElement.classList.contains('zen-drop-target') && canHightlightGroup) { + } else if (dropElement.classList.contains("zen-drop-target") && canHightlightGroup) { shouldPlayHapticFeedback = this.#applyDragOverBackground(dropElement) && !gZenPinnedTabManager._dragIndicator; gZenPinnedTabManager.removeTabContainersDragoverClass(); dropElement = dropElement.parentElement?.labelElement || dropElement; - if (dropElement.classList.contains('zen-current-workspace-indicator')) { + if (dropElement.classList.contains("zen-current-workspace-indicator")) { dropElement = elementToMove(this._tabbrowserTabs.ariaFocusableItems.at(gBrowser._numZenEssentials)) || dropElement; - dropBefore = true; } } if (shouldPlayHapticFeedback) { + // eslint-disable-next-line mozilla/valid-services Services.zen.playHapticFeedback(); } - return [dropBefore, dropElement]; } #getDragImageOffset(event, tab, draggingTabs) { @@ -960,13 +959,14 @@ }; } + // eslint-disable-next-line complexity #animateVerticalPinnedGridDragOver(event) { let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0); let dragData = draggedTab._dragData; let movingTabs = dragData.movingTabs; this.clearDragOverVisuals(); if ( - !draggedTab.hasAttribute('zen-essential') && + !draggedTab.hasAttribute("zen-essential") && gBrowser._numZenEssentials >= gZenPinnedTabManager.maxEssentialTabs ) { return; @@ -975,11 +975,11 @@ if (!this._fakeEssentialTab) { const numEssentials = gBrowser._numZenEssentials; let pinnedTabs = this._tabbrowserTabs.ariaFocusableItems.slice(0, numEssentials); - this._fakeEssentialTab = document.createXULElement('vbox'); + this._fakeEssentialTab = document.createXULElement("vbox"); this._fakeEssentialTab.elementIndex = numEssentials; delete dragData.animDropElementIndex; - if (!draggedTab.hasAttribute('zen-essential')) { - event.target.closest('.zen-essentials-container').appendChild(this._fakeEssentialTab); + if (!draggedTab.hasAttribute("zen-essential")) { + event.target.closest(".zen-essentials-container").appendChild(this._fakeEssentialTab); gZenWorkspaces.updateTabsContainers(); pinnedTabs.push(this._fakeEssentialTab); } @@ -1180,7 +1180,7 @@ for (let tab of tabs) { if (tab != draggedTab) { let [shiftX, shiftY] = getTabShift(tab, newIndex); - tab.style.transform = shiftX || shiftY ? `translate(${shiftX}px, ${shiftY}px)` : ''; + tab.style.transform = shiftX || shiftY ? `translate(${shiftX}px, ${shiftY}px)` : ""; } } } @@ -1190,7 +1190,7 @@ this._fakeEssentialTab.remove(); delete this._fakeEssentialTab; for (let tab of this._tabbrowserTabs.visibleTabs.slice(0, gBrowser._numZenEssentials)) { - tab.style.transform = ''; + tab.style.transform = ""; } gZenWorkspaces.updateTabsContainers(); } @@ -1202,15 +1202,15 @@ const dragData = draggedTab._dragData; const [wrapper] = this.originalDragImageArgs; const tab = wrapper.firstElementChild; - tab.setAttribute('zen-essential', 'true'); - tab.setAttribute('pinned', 'true'); - tab.setAttribute('selected', 'true'); + tab.setAttribute("zen-essential", "true"); + tab.setAttribute("pinned", "true"); + tab.setAttribute("selected", "true"); const draggedTabRect = window.windowUtils.getBoundsWithoutFlushing(this._fakeEssentialTab); - tab.style.minWidth = tab.style.maxWidth = wrapper.style.width = draggedTabRect.width + 'px'; + tab.style.minWidth = tab.style.maxWidth = wrapper.style.width = draggedTabRect.width + "px"; tab.style.minHeight = tab.style.maxHeight = wrapper.style.height = - draggedTabRect.height + 'px'; + draggedTabRect.height + "px"; const offsetY = dragData.offsetY; const offsetX = dragData.offsetX; // Apply a transform translate to the tab in order to center it within the drag image @@ -1224,17 +1224,17 @@ const draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0); const wrapper = this.originalDragImageArgs[0]; const tab = wrapper.firstElementChild; - tab.style.setProperty('transition', 'none', 'important'); - tab.removeAttribute('zen-essential'); - tab.removeAttribute('pinned'); - tab.style.minWidth = tab.style.maxWidth = ''; - tab.style.minHeight = tab.style.maxHeight = ''; - tab.style.transform = ''; + tab.style.setProperty("transition", "none", "important"); + tab.removeAttribute("zen-essential"); + tab.removeAttribute("pinned"); + tab.style.minWidth = tab.style.maxWidth = ""; + tab.style.minHeight = tab.style.maxHeight = ""; + tab.style.transform = ""; const rect = window.windowUtils.getBoundsWithoutFlushing(draggedTab); - wrapper.style.width = rect.width + 'px'; - wrapper.style.height = rect.height + 'px'; + wrapper.style.width = rect.width + "px"; + wrapper.style.height = rect.height + "px"; setTimeout(() => { - tab.style.transition = ''; + tab.style.transition = ""; dt.updateDragImage(...this.originalDragImageArgs); }, 50); } diff --git a/src/zen/folders/ZenFolder.mjs b/src/zen/folders/ZenFolder.mjs index 89f77e168..cddb56104 100644 --- a/src/zen/folders/ZenFolder.mjs +++ b/src/zen/folders/ZenFolder.mjs @@ -53,7 +53,7 @@ export class nsZenFolder extends MozTabbrowserTabGroup { `, - 'image/svg+xml' + "image/svg+xml" ).documentElement; constructor() { @@ -70,29 +70,30 @@ export class nsZenFolder extends MozTabbrowserTabGroup { this._activeTabs = []; this.icon.appendChild(nsZenFolder.rawIcon.cloneNode(true)); - this.labelElement.parentElement.setAttribute('context', 'zenFolderActions'); + this.labelElement.parentElement.setAttribute("context", "zenFolderActions"); this.labelElement.onRenameFinished = (newLabel) => { - this.name = newLabel.trim() || 'Folder'; - const event = new CustomEvent('ZenFolderRenamed', { + this.name = newLabel.trim() || "Folder"; + const event = new CustomEvent("ZenFolderRenamed", { bubbles: true, }); this.dispatchEvent(event); }; if (this.collapsed) { - this.groupContainer.setAttribute('hidden', true); + this.groupContainer.setAttribute("hidden", true); } } get icon() { - return this.querySelector('.tab-group-folder-icon'); + return this.querySelector(".tab-group-folder-icon"); } /** * Returns the group this folder belongs to. + * * @returns {MozTabbrowserTabGroup|null} The group this folder belongs to, or null if it is not part of a group. - **/ + */ get group() { if (gBrowser.isTabGroup(this.parentElement?.parentElement)) { return this.parentElement.parentElement; @@ -107,10 +108,12 @@ export class nsZenFolder extends MozTabbrowserTabGroup { get activeGroups() { let activeGroups = []; let currentGroup = this; - if (currentGroup?.hasAttribute('has-active')) activeGroups.push(currentGroup); + if (currentGroup?.hasAttribute("has-active")) { + activeGroups.push(currentGroup); + } while (currentGroup?.group) { currentGroup = currentGroup?.group; - if (currentGroup?.hasAttribute('has-active')) { + if (currentGroup?.hasAttribute("has-active")) { activeGroups.push(currentGroup); } } @@ -118,14 +121,14 @@ export class nsZenFolder extends MozTabbrowserTabGroup { } get childActiveGroups() { - if (this.tagName === 'zen-workspace-collapsible-pins') { - return Array.from(this.parentElement.querySelectorAll('zen-folder[has-active]')); + if (this.tagName === "zen-workspace-collapsible-pins") { + return Array.from(this.parentElement.querySelectorAll("zen-folder[has-active]")); } - return Array.from(this.querySelectorAll('zen-folder[has-active]')); + return Array.from(this.querySelectorAll("zen-folder[has-active]")); } rename() { - if (!document.documentElement.hasAttribute('zen-sidebar-expanded')) { + if (!document.documentElement.hasAttribute("zen-sidebar-expanded")) { return; } gZenVerticalTabsManager.renameTabStart({ @@ -143,7 +146,7 @@ export class nsZenFolder extends MozTabbrowserTabGroup { } while (currentFolder); gZenFolders.createFolder([], { renameFolder: !gZenUIManager.testingEnabled, - label: 'Subfolder', + label: "Subfolder", insertAfter: this.groupContainer.lastElementChild, }); } @@ -151,8 +154,8 @@ export class nsZenFolder extends MozTabbrowserTabGroup { async unpackTabs() { this.collapsed = false; for (let tab of this.allItems.reverse()) { - tab = tab.group.hasAttribute('split-view-group') ? tab.group : tab; - if (tab.hasAttribute('zen-empty-tab')) { + tab = tab.group.hasAttribute("split-view-group") ? tab.group : tab; + if (tab.hasAttribute("zen-empty-tab")) { gBrowser.removeTab(tab); } else { gBrowser.ungroupTab(tab); @@ -162,7 +165,7 @@ export class nsZenFolder extends MozTabbrowserTabGroup { async delete() { for (const tab of this.allItemsRecursive) { - if (tab.hasAttribute('zen-empty-tab')) { + if (tab.hasAttribute("zen-empty-tab")) { // Manually remove the empty tabs as removeTabs() inside removeTabGroup // does ignore them. gBrowser.removeTab(tab); @@ -187,8 +190,8 @@ export class nsZenFolder extends MozTabbrowserTabGroup { return [...this.groupContainer.children].filter( (child) => !( - child.classList.contains('zen-tab-group-start') || - child.classList.contains('pinned-tabs-container-separator') + child.classList.contains("zen-tab-group-start") || + child.classList.contains("pinned-tabs-container-separator") ) ); } @@ -207,26 +210,26 @@ export class nsZenFolder extends MozTabbrowserTabGroup { set pinned(value) {} get iconURL() { - return this.icon.querySelector('image')?.getAttribute('href') || ''; + return this.icon.querySelector("image")?.getAttribute("href") || ""; } set activeTabs(tabs) { if (tabs.length) { this._activeTabs = tabs; for (let tab of tabs) { - tab.setAttribute('folder-active', 'true'); + tab.setAttribute("folder-active", "true"); } } else { const folders = new Map(); for (let tab of this._activeTabs) { - const group = tab?.group?.hasAttribute('split-view-group') ? tab?.group?.group : tab?.group; + const group = tab?.group?.hasAttribute("split-view-group") ? tab?.group?.group : tab?.group; if (!folders.has(group?.id)) { folders.set(group?.id, group?.activeGroups?.at(-1)); } let activeGroup = folders.get(group?.id); if (!activeGroup) { - tab.removeAttribute('folder-active'); - tab.style.removeProperty('--zen-folder-indent'); + tab.removeAttribute("folder-active"); + tab.style.removeProperty("--zen-folder-indent"); } } this._activeTabs = []; @@ -239,7 +242,7 @@ export class nsZenFolder extends MozTabbrowserTabGroup { } get resetButton() { - return this.labelElement.parentElement.querySelector('.tab-reset-button'); + return this.labelElement.parentElement.querySelector(".tab-reset-button"); } unloadAllTabs(event) { @@ -266,6 +269,7 @@ export class nsZenFolder extends MozTabbrowserTabGroup { /** * Get the root most collapsed folder in the tree. + * * @returns {ZenFolder|null} The root most collapsed folder, or null if none are collapsed. */ get rootMostCollapsedFolder() { @@ -281,4 +285,4 @@ export class nsZenFolder extends MozTabbrowserTabGroup { } } -customElements.define('zen-folder', nsZenFolder); +customElements.define("zen-folder", nsZenFolder); diff --git a/src/zen/folders/ZenFolders.mjs b/src/zen/folders/ZenFolders.mjs index b51a912c8..a33b89a5f 100644 --- a/src/zen/folders/ZenFolders.mjs +++ b/src/zen/folders/ZenFolders.mjs @@ -2,41 +2,41 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -import { nsZenDOMOperatedFeature } from 'chrome://browser/content/zen-components/ZenCommonUtils.mjs'; +import { nsZenDOMOperatedFeature } from "chrome://browser/content/zen-components/ZenCommonUtils.mjs"; function formatRelativeTime(timestamp) { const now = Date.now(); const sec = Math.floor((now - timestamp) / 1000); if (sec < 60) { - return 'Just now'; + return "Just now"; } const min = Math.floor(sec / 60); if (min < 60) { - return `${min} minute${min === 1 ? '' : 's'} ago`; + return `${min} minute${min === 1 ? "" : "s"} ago`; } const hour = Math.floor(min / 60); if (hour < 24) { - return `${hour} hour${hour === 1 ? '' : 's'} ago`; + return `${hour} hour${hour === 1 ? "" : "s"} ago`; } const day = Math.floor(hour / 24); if (day < 30) { - return `${day} day${day === 1 ? '' : 's'} ago`; + return `${day} day${day === 1 ? "" : "s"} ago`; } const month = Math.floor(day / 30); - return `${month} month${month === 1 ? '' : 's'} ago`; + return `${month} month${month === 1 ? "" : "s"} ago`; } function groupIsCollapsiblePins(group) { - return group?.tagName.toLowerCase() === 'zen-workspace-collapsible-pins'; + return group?.tagName.toLowerCase() === "zen-workspace-collapsible-pins"; } class nsZenFolders extends nsZenDOMOperatedFeature { - #ZEN_MAX_SUBFOLDERS = Services.prefs.getIntPref('zen.folders.max-subfolders', 5); + #ZEN_MAX_SUBFOLDERS = Services.prefs.getIntPref("zen.folders.max-subfolders", 5); #popup = null; #popupTimer = null; @@ -65,14 +65,14 @@ class nsZenFolders extends nsZenDOMOperatedFeature { const contextMenuItems = window.MozXULElement.parseXULToFragment( `` ); - document.getElementById('context_moveTabToGroup').before(contextMenuItems); + document.getElementById("context_moveTabToGroup").before(contextMenuItems); const contextMenuItemsToolbar = window.MozXULElement.parseXULToFragment( `` ); - document.getElementById('toolbar-context-openANewTab').after(contextMenuItemsToolbar); + document.getElementById("toolbar-context-openANewTab").after(contextMenuItemsToolbar); - const folderActionsMenu = document.getElementById('zenFolderActions'); - folderActionsMenu.addEventListener('popupshowing', (event) => { + const folderActionsMenu = document.getElementById("zenFolderActions"); + folderActionsMenu.addEventListener("popupshowing", (event) => { const target = event.explicitOriginalTarget; let folder; if (gBrowser.isTabGroupLabel(target)) { @@ -81,7 +81,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { folder = target.parentElement.group; } else if ( target.parentElement?.isZenFolder && - target?.classList.contains('tab-group-label-container') + target?.classList.contains("tab-group-label-container") ) { folder = target.parentElement; } @@ -92,23 +92,25 @@ class nsZenFolders extends nsZenDOMOperatedFeature { } this.#lastFolderContextMenu = folder; - const newSubfolderItem = document.getElementById('context_zenFolderNewSubfolder'); + const newSubfolderItem = document.getElementById("context_zenFolderNewSubfolder"); newSubfolderItem.setAttribute( - 'disabled', - folder.level >= this.#ZEN_MAX_SUBFOLDERS - 1 ? 'true' : 'false' + "disabled", + folder.level >= this.#ZEN_MAX_SUBFOLDERS - 1 ? "true" : "false" ); const changeFolderSpace = document - .getElementById('context_zenChangeFolderSpace') - .querySelector('menupopup'); - changeFolderSpace.innerHTML = ''; + .getElementById("context_zenChangeFolderSpace") + .querySelector("menupopup"); + changeFolderSpace.innerHTML = ""; for (const workspace of [...gZenWorkspaces.getWorkspaces()].reverse()) { const item = gZenWorkspaces.generateMenuItemForWorkspace(workspace); - item.addEventListener('command', (event) => { - if (!this.#lastFolderContextMenu) return; + item.addEventListener("command", (event) => { + if (!this.#lastFolderContextMenu) { + return; + } this.changeFolderToSpace( this.#lastFolderContextMenu, - event.target.closest('menuitem').getAttribute('zen-workspace-id') + event.target.closest("menuitem").getAttribute("zen-workspace-id") ); }); changeFolderSpace.appendChild(item); @@ -116,7 +118,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { }); folderActionsMenu.addEventListener( - 'popuphidden', + "popuphidden", (event) => { if (event.target === folderActionsMenu) { this.#lastFolderContextMenu = null; @@ -125,28 +127,30 @@ class nsZenFolders extends nsZenDOMOperatedFeature { { once: true } ); - folderActionsMenu.addEventListener('command', (event) => { - if (!this.#lastFolderContextMenu) return; + folderActionsMenu.addEventListener("command", (event) => { + if (!this.#lastFolderContextMenu) { + return; + } switch (event.target.id) { - case 'context_zenFolderRename': + case "context_zenFolderRename": this.#lastFolderContextMenu.rename(); break; - case 'context_zenFolderUnpack': + case "context_zenFolderUnpack": this.#lastFolderContextMenu.unpackTabs(); break; - case 'context_zenFolderUnloadAll': + case "context_zenFolderUnloadAll": this.#lastFolderContextMenu.unloadAllTabs(event); break; - case 'context_zenFolderNewSubfolder': + case "context_zenFolderNewSubfolder": this.#lastFolderContextMenu.createSubfolder(); break; - case 'context_zenFolderDelete': + case "context_zenFolderDelete": this.#lastFolderContextMenu.delete(); break; - case 'context_zenFolderToSpace': + case "context_zenFolderToSpace": this.#convertFolderToSpace(this.#lastFolderContextMenu); break; - case 'context_zenFolderChangeIcon': + case "context_zenFolderChangeIcon": this.changeFolderUserIcon(this.#lastFolderContextMenu); break; } @@ -154,49 +158,51 @@ class nsZenFolders extends nsZenDOMOperatedFeature { } #initTabsPopup() { - this.#popup = document.getElementById('zen-folder-tabs-popup'); + this.#popup = document.getElementById("zen-folder-tabs-popup"); - const search = this.#popup.querySelector('#zen-folder-tabs-list-search'); - const tabsList = this.#popup.querySelector('#zen-folder-tabs-list'); + const search = this.#popup.querySelector("#zen-folder-tabs-list-search"); + const tabsList = this.#popup.querySelector("#zen-folder-tabs-list"); - search.addEventListener('input', () => { + search.addEventListener("input", () => { const query = search.value.toLowerCase(); for (const item of tabsList.children) { - item.hidden = !item.getAttribute('data-label').includes(query); + item.hidden = !item.getAttribute("data-label").includes(query); } }); - this.#popup.addEventListener('mouseover', () => { + this.#popup.addEventListener("mouseover", () => { clearTimeout(this.#popupTimer); }); - this.#popup.addEventListener('mouseout', () => { + this.#popup.addEventListener("mouseout", () => { this.#popupTimer = setTimeout(() => { - if (this.#popup.matches(':hover')) return; + if (this.#popup.matches(":hover")) { + return; + } this.#popup.hidePopup(); }, 200); }); } #initEventListeners() { - window.addEventListener('TabGrouped', this); - window.addEventListener('TabUngrouped', this); - window.addEventListener('TabGroupCreate', this); - window.addEventListener('TabPinned', this); - window.addEventListener('TabUnpinned', this); - window.addEventListener('TabGroupExpand', this); - window.addEventListener('TabGroupCollapse', this); - window.addEventListener('FolderGrouped', this); - window.addEventListener('FolderUngrouped', this); - window.addEventListener('TabSelect', this); - window.addEventListener('TabOpen', this); + window.addEventListener("TabGrouped", this); + window.addEventListener("TabUngrouped", this); + window.addEventListener("TabGroupCreate", this); + window.addEventListener("TabPinned", this); + window.addEventListener("TabUnpinned", this); + window.addEventListener("TabGroupExpand", this); + window.addEventListener("TabGroupCollapse", this); + window.addEventListener("FolderGrouped", this); + window.addEventListener("FolderUngrouped", this); + window.addEventListener("TabSelect", this); + window.addEventListener("TabOpen", this); const onNewFolder = this.#onNewFolder.bind(this); - document.getElementById('zen-context-menu-new-folder').addEventListener('command', onNewFolder); + document.getElementById("zen-context-menu-new-folder").addEventListener("command", onNewFolder); document - .getElementById('zen-context-menu-new-folder-toolbar') - .addEventListener('command', onNewFolder); + .getElementById("zen-context-menu-new-folder-toolbar") + .addEventListener("command", onNewFolder); SessionStore.promiseInitialized.then(() => { - gBrowser.tabContainer.addEventListener('dragstart', this.cancelPopupTimer.bind(this)); + gBrowser.tabContainer.addEventListener("dragstart", this.cancelPopupTimer.bind(this)); }); } @@ -227,27 +233,29 @@ class nsZenFolders extends nsZenDOMOperatedFeature { } } - if (group.hasAttribute('split-view-group') && group.hasAttribute('zen-pinned-changed')) { + if (group.hasAttribute("split-view-group") && group.hasAttribute("zen-pinned-changed")) { // zen-pinned-changed remove it and set it to had-zen-pinned-changed to keep // track of the original pinned state - group.removeAttribute('zen-pinned-changed'); - group.setAttribute('had-zen-pinned-changed', true); + group.removeAttribute("zen-pinned-changed"); + group.setAttribute("had-zen-pinned-changed", true); } if (group.collapsed && !this._sessionRestoring) { - group.collapsed = group.hasAttribute('has-active'); + group.collapsed = group.hasAttribute("has-active"); } } on_FolderGrouped(event) { - if (this._sessionRestoring) return; + if (this._sessionRestoring) { + return; + } const folder = event.detail; const parentFolder = event.target; if (groupIsCollapsiblePins(parentFolder)) { return; } const isActiveFolder = parentFolder?.activeGroups?.length > 0; - const isSplitView = folder.hasAttribute('split-view-group'); + const isSplitView = folder.hasAttribute("split-view-group"); if (isActiveFolder && isSplitView) { parentFolder.activeTabs = [...new Set([...parentFolder.activeTabs, ...folder.tabs])].sort( (a, b) => a._tPos > b._tPos @@ -257,7 +265,9 @@ class nsZenFolders extends nsZenDOMOperatedFeature { } on_FolderUngrouped(event) { - if (this._sessionRestoring) return; + if (this._sessionRestoring) { + return; + } const parentFolder = event.target; const folder = event.detail; for (const tab of folder.tabs) { @@ -268,7 +278,9 @@ class nsZenFolders extends nsZenDOMOperatedFeature { async on_TabSelect(event) { const tab = gZenGlanceManager.getTabOrGlanceParent(event.target); let group = tab?.group; - if (group?.hasAttribute('split-view-group')) group = group?.group; + if (group?.hasAttribute("split-view-group")) { + group = group?.group; + } if (!group?.isZenFolder) { return; } @@ -278,7 +290,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { return; } - collapsedRoot.setAttribute('has-active', 'true'); + collapsedRoot.setAttribute("has-active", "true"); await this.animateSelect(collapsedRoot); gBrowser.tabContainer._invalidateCachedTabs(); } @@ -286,11 +298,13 @@ class nsZenFolders extends nsZenDOMOperatedFeature { on_TabOpen(event) { const tab = event.target; const group = tab.group; - if (!group?.isZenFolder || tab.pinned) return; + if (!group?.isZenFolder || tab.pinned) { + return; + } // Edge case: In occations where we add a tab with an ownerTab // inside a folder, the tab gets added into the folder in an // unpinned state. We need to pin it and re-add it into the folder. - if (Services.prefs.getBoolPref('zen.folders.owned-tabs-in-folder')) { + if (Services.prefs.getBoolPref("zen.folders.owned-tabs-in-folder")) { gBrowser.pinTab(tab); group.addTabs([tab]); } @@ -299,9 +313,9 @@ class nsZenFolders extends nsZenDOMOperatedFeature { async on_TabUngrouped(event) { const tab = event.detail; const group = event.target; - if (group.hasAttribute('split-view-group') && tab.hasAttribute('had-zen-pinned-changed')) { - tab.setAttribute('zen-pinned-changed', true); - tab.removeAttribute('had-zen-pinned-changed'); + if (group.hasAttribute("split-view-group") && tab.hasAttribute("had-zen-pinned-changed")) { + tab.setAttribute("zen-pinned-changed", true); + tab.removeAttribute("had-zen-pinned-changed"); } await this.animateUnload(group, tab, true); @@ -314,9 +328,9 @@ class nsZenFolders extends nsZenDOMOperatedFeature { return; } for (const tab of tabs) { - if (tab.hasAttribute('zen-pinned-changed')) { - tab.removeAttribute('zen-pinned-changed'); - tab.setAttribute('had-zen-pinned-changed', true); + if (tab.hasAttribute("zen-pinned-changed")) { + tab.removeAttribute("zen-pinned-changed"); + tab.setAttribute("had-zen-pinned-changed", true); } } } @@ -324,7 +338,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { on_TabPinned(event) { const tab = event.target; const group = tab.group; - if (group && group.hasAttribute('split-view-group')) { + if (group && group.hasAttribute("split-view-group")) { group.pinned = true; } } @@ -332,7 +346,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { on_TabUnpinned(event) { const tab = event.target; const group = tab.group; - if (group && group.hasAttribute('split-view-group')) { + if (group && group.hasAttribute("split-view-group")) { group.pinned = false; } } @@ -349,27 +363,31 @@ class nsZenFolders extends nsZenDOMOperatedFeature { async on_TabGroupCollapse(event) { const group = event.target; - if (!group.isZenFolder) return; + if (!group.isZenFolder) { + return; + } await this.animateCollapse(group); } async on_TabGroupExpand(event) { const group = event.target; - if (!group.isZenFolder) return; + if (!group.isZenFolder) { + return; + } await this.animateExpand(group); } #onNewFolder(event) { - const isFromToolbar = event.target.id === 'zen-context-menu-new-folder-toolbar'; + const isFromToolbar = event.target.id === "zen-context-menu-new-folder-toolbar"; const contextMenu = event.target.parentElement; let tabs = TabContextMenu.contextTab?.multiselected ? gBrowser.selectedTabs : [TabContextMenu.contextTab]; let triggerTab = contextMenu.triggerNode && - (contextMenu.triggerNode.tab || contextMenu.triggerNode.closest('tab')); + (contextMenu.triggerNode.tab || contextMenu.triggerNode.closest("tab")); const selectedTabs = gBrowser.selectedTabs; if (selectedTabs.length > 1) { @@ -383,8 +401,8 @@ class nsZenFolders extends nsZenDOMOperatedFeature { const canInsertBefore = !isFromToolbar && - !triggerTab.hasAttribute('zen-essential') && - !triggerTab?.group?.hasAttribute('split-view-group') && + !triggerTab.hasAttribute("zen-essential") && + !triggerTab?.group?.hasAttribute("split-view-group") && this.canDropElement({ isZenFolder: true }, triggerTab); this.createFolder(tabs, { @@ -397,11 +415,11 @@ class nsZenFolders extends nsZenDOMOperatedFeature { async #convertFolderToSpace(folder) { const currentWorkspace = gZenWorkspaces.getActiveWorkspaceFromCache(); let selectedTab = folder.tabs.find((tab) => tab.selected); - const icon = folder.icon?.querySelector('svg .icon image'); + const icon = folder.icon?.querySelector("svg .icon image"); const newSpace = await gZenWorkspaces.createAndSaveWorkspace( folder.label, - /* icon= */ icon?.getAttribute('href'), + /* icon= */ icon?.getAttribute("href"), /* dontChange= */ false, currentWorkspace.containerTabId, { @@ -411,13 +429,13 @@ class nsZenFolders extends nsZenDOMOperatedFeature { const workspacePinnedContainer = gZenWorkspaces.workspaceElement( newWorkspace.uuid ).pinnedTabsContainer; - const tabs = folder.allItems.filter((tab) => !tab.hasAttribute('zen-empty-tab')); + const tabs = folder.allItems.filter((tab) => !tab.hasAttribute("zen-empty-tab")); workspacePinnedContainer.append(...tabs); await folder.delete(); gBrowser.tabContainer._invalidateCachedTabs(); if (selectedTab) { - selectedTab.setAttribute('zen-workspace-id', newWorkspace.uuid); - selectedTab.removeAttribute('folder-active'); + selectedTab.setAttribute("zen-workspace-id", newWorkspace.uuid); + selectedTab.removeAttribute("folder-active"); gZenWorkspaces.lastSelectedWorkspaceTabs[newWorkspace.uuid] = selectedTab; } resolve(); @@ -428,10 +446,10 @@ class nsZenFolders extends nsZenDOMOperatedFeature { ); // Change the ID for all tabs for (const tab of gBrowser.tabs) { - if (!tab.hasAttribute('zen-essential')) { - tab.setAttribute('zen-workspace-id', newSpace.uuid); - tab.style.opacity = ''; - tab.style.height = ''; + if (!tab.hasAttribute("zen-essential")) { + tab.setAttribute("zen-workspace-id", newSpace.uuid); + tab.style.opacity = ""; + tab.style.height = ""; } gBrowser.TabStateFlusher.flush(tab.linkedBrowser); if (gZenWorkspaces.lastSelectedWorkspaceTabs[currentWorkspace.uuid] === tab) { @@ -443,7 +461,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { } changeFolderToSpace(folder, workspaceId, { hasDndSwitch = false } = {}) { - if (folder.getAttribute('zen-workspace-id') == workspaceId) { + if (folder.getAttribute("zen-workspace-id") == workspaceId) { return; } @@ -459,8 +477,8 @@ class nsZenFolders extends nsZenDOMOperatedFeature { for (const tab of folder.tabs) { // This sets the ID for the current folder and any sub-folder // we may encounter - tab.setAttribute('zen-workspace-id', workspaceId); - tab.group.setAttribute('zen-workspace-id', workspaceId); + tab.setAttribute("zen-workspace-id", workspaceId); + tab.group.setAttribute("zen-workspace-id", workspaceId); gBrowser.TabStateFlusher.flush(tab.linkedBrowser); if (lastSelectedWorkspaceTabs[workspaceId] === tab) { @@ -469,7 +487,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { } } - folder.dispatchEvent(new CustomEvent('ZenFolderChangedWorkspace', { bubbles: true })); + folder.dispatchEvent(new CustomEvent("ZenFolderChangedWorkspace", { bubbles: true })); if (!hasDndSwitch) { gZenWorkspaces.changeWorkspaceWithID(workspaceId).then(() => { @@ -486,10 +504,10 @@ class nsZenFolders extends nsZenDOMOperatedFeature { createFolder(tabs = [], options = {}) { const filteredTabs = tabs - .filter((tab) => !tab.hasAttribute('zen-essential')) + .filter((tab) => !tab.hasAttribute("zen-essential")) .map((tab) => { gBrowser.pinTab(tab); - if (tab?.group?.hasAttribute('split-view-group')) { + if (tab?.group?.hasAttribute("split-view-group")) { tab = tab.group; } return tab; @@ -501,8 +519,8 @@ class nsZenFolders extends nsZenDOMOperatedFeature { const pinnedContainer = options.workspaceId && workspacePinned ? workspacePinned : gZenWorkspaces.pinnedTabsContainer; const insertBefore = - options.insertBefore || pinnedContainer.querySelector('.pinned-tabs-container-separator'); - const emptyTab = gBrowser.addTab('about:blank', { + options.insertBefore || pinnedContainer.querySelector(".pinned-tabs-container-separator"); + const emptyTab = gBrowser.addTab("about:blank", { skipAnimation: true, pinned: true, triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(), @@ -534,7 +552,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { gBrowser.TabStateFlusher.flush(tab.linkedBrowser); }); - this.updateFolderIcon(folder, 'auto'); + this.updateFolderIcon(folder, "auto"); if (options.renameFolder) { folder.rename(); @@ -545,7 +563,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { } _createFolderNode(options = {}) { - const folder = document.createXULElement('zen-folder', { is: 'zen-folder' }); + const folder = document.createXULElement("zen-folder", { is: "zen-folder" }); let id = options.id; if (!id) { // Note: If this changes, make sure to also update the @@ -555,16 +573,17 @@ class nsZenFolders extends nsZenDOMOperatedFeature { id = `${Date.now()}-${Math.round(Math.random() * 100)}`; } folder.id = id; - folder.label = options.label || 'New Folder'; + folder.label = options.label || "New Folder"; folder.saveOnWindowClose = !!options.saveOnWindowClose; - folder.color = 'zen-workspace-color'; + folder.color = "zen-workspace-color"; - folder.setAttribute('zen-workspace-id', options.workspaceId || gZenWorkspaces.activeWorkspace); + folder.setAttribute("zen-workspace-id", options.workspaceId || gZenWorkspaces.activeWorkspace); // note: We set if the folder is collapsed some time after creation. // we do this to ensure marginBottom is set correctly in the case // that we want it to initially be collapsed. setTimeout( + // eslint-disable-next-line no-shadow (folder) => { folder.collapsed = !!options.collapsed; }, @@ -579,7 +598,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { if (!group) { return false; } - if (group.hasAttribute('split-view-group') && !this._piningFolder) { + if (group.hasAttribute("split-view-group") && !this._piningFolder) { this._piningFolder = true; for (const otherTab of group.tabs) { gZenPinnedTabManager.resetPinChangedUrl(otherTab); @@ -597,12 +616,12 @@ class nsZenFolders extends nsZenDOMOperatedFeature { } handleTabUnpin(tab) { - tab.style.removeProperty('--zen-folder-indent'); + tab.style.removeProperty("--zen-folder-indent"); const group = tab.group; if (!group) { return false; } - if (group.hasAttribute('split-view-group') && !this._piningFolder) { + if (group.hasAttribute("split-view-group") && !this._piningFolder) { this._piningFolder = true; for (const otherTab of group.tabs) { if (tab === otherTab) { @@ -620,7 +639,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { openTabsPopup(event) { event.stopPropagation(); - if (document.documentElement.getAttribute('zen-renaming-tab') || gURLBar.focused) { + if (document.documentElement.getAttribute("zen-renaming-tab") || gURLBar.focused) { return; } @@ -631,68 +650,72 @@ class nsZenFolders extends nsZenDOMOperatedFeature { // If the group has no tabs, we don't show the popup return; } - document.getElementById('zen-folder-tabs-search-no-results').hidden = true; + document.getElementById("zen-folder-tabs-search-no-results").hidden = true; this.#populateTabsList(activeGroup); - const search = this.#popup.querySelector('#zen-folder-tabs-list-search'); + const search = this.#popup.querySelector("#zen-folder-tabs-list-search"); document.l10n.setArgs(search, { - 'folder-name': activeGroup.name, + "folder-name": activeGroup.name, }); - const tabsList = this.#popup.querySelector('#zen-folder-tabs-list'); + const tabsList = this.#popup.querySelector("#zen-folder-tabs-list"); const onSearchInput = () => { const query = search.value.toLowerCase(); let foundTabs = 0; for (const item of tabsList.children) { - const found = item.getAttribute('data-label').includes(query); + const found = item.getAttribute("data-label").includes(query); item.hidden = !found; if (found) { foundTabs++; } } - document.getElementById('zen-folder-tabs-search-no-results').hidden = foundTabs > 0; + document.getElementById("zen-folder-tabs-search-no-results").hidden = foundTabs > 0; }; - search.addEventListener('input', onSearchInput); + search.addEventListener("input", onSearchInput); const onKeyDown = (event) => { // Arrow down and up to navigate through the list - if (event.key === 'ArrowDown' || event.key === 'ArrowUp') { + if (event.key === "ArrowDown" || event.key === "ArrowUp") { event.preventDefault(); const items = Array.from(tabsList.children).filter((item) => !item.hidden); - if (items.length === 0) return; - let index = items.indexOf(tabsList.querySelector('.folders-tabs-list-item[selected]')); - if (event.key === 'ArrowDown') { + if (items.length === 0) { + return; + } + let index = items.indexOf(tabsList.querySelector(".folders-tabs-list-item[selected]")); + if (event.key === "ArrowDown") { index = (index + 1) % items.length; - } else if (event.key === 'ArrowUp') { + } else if (event.key === "ArrowUp") { index = (index - 1 + items.length) % items.length; } - items.forEach((item) => item.removeAttribute('selected')); + items.forEach((item) => item.removeAttribute("selected")); const targetItem = items[index]; - targetItem.setAttribute('selected', 'true'); - targetItem.scrollIntoView({ block: 'start', behavior: 'smooth' }); - } else if (event.key === 'Enter') { + targetItem.setAttribute("selected", "true"); + targetItem.scrollIntoView({ block: "start", behavior: "smooth" }); + } else if (event.key === "Enter") { // Enter to select the currently highlighted item - const highlightedItem = tabsList.querySelector('.folders-tabs-list-item[selected]'); + const highlightedItem = tabsList.querySelector(".folders-tabs-list-item[selected]"); if (highlightedItem) { highlightedItem.click(); } } }; - document.addEventListener('keydown', onKeyDown); + document.addEventListener("keydown", onKeyDown); const target = event.target; - target.setAttribute('open', true); + target.setAttribute("open", true); const handlePopupHidden = (event) => { - if (event.target !== this.#popup) return; - search.value = ''; - target.removeAttribute('open'); - search.removeEventListener('input', onSearchInput); - document.removeEventListener('keydown', onKeyDown); + if (event.target !== this.#popup) { + return; + } + search.value = ""; + target.removeAttribute("open"); + search.removeEventListener("input", onSearchInput); + document.removeEventListener("keydown", onKeyDown); }; this.#popup.addEventListener( - 'popupshown', + "popupshown", () => { search.focus(); search.select(); @@ -700,15 +723,15 @@ class nsZenFolders extends nsZenDOMOperatedFeature { { once: true } ); - this.#popup.addEventListener('popuphidden', handlePopupHidden, { once: true }); + this.#popup.addEventListener("popuphidden", handlePopupHidden, { once: true }); this.#popup.openPopup(target, this.#searchPopupOptions); } get #searchPopupOptions() { const isRightSide = gZenVerticalTabsManager._prefsRightSide; - const position = isRightSide ? 'topleft topright' : 'topright topleft'; + const position = isRightSide ? "topleft topright" : "topright topleft"; return { - position: position, + position, x: 10, y: -25, }; @@ -721,26 +744,28 @@ class nsZenFolders extends nsZenDOMOperatedFeature { // account for the visibility of the tab itself, it's just a literal // representation of the `hidden` attribute. const tabIsInActiveGroup = group.activeTabs.includes(tab); - return !tabIsInActiveGroup && !(tab.hidden || tab.hasAttribute('zen-empty-tab')); + return !tabIsInActiveGroup && !(tab.hidden || tab.hasAttribute("zen-empty-tab")); } #populateTabsList(group) { - const tabsList = this.#popup.querySelector('#zen-folder-tabs-list'); + const tabsList = this.#popup.querySelector("#zen-folder-tabs-list"); tabsList.replaceChildren(); for (const tab of group.tabs) { - if (!this.#shouldAppearOnTabSearch(tab, group)) continue; + if (!this.#shouldAppearOnTabSearch(tab, group)) { + continue; + } - const item = document.createElement('div'); - item.className = 'folders-tabs-list-item'; + const item = document.createElement("div"); + item.className = "folders-tabs-list-item"; - const content = document.createElement('div'); - content.className = 'folders-tabs-list-item-content'; + const content = document.createElement("div"); + content.className = "folders-tabs-list-item-content"; - const icon = document.createElement('img'); - icon.className = 'folders-tabs-list-item-icon'; + const icon = document.createElement("img"); + icon.className = "folders-tabs-list-item-icon"; - let tabURL = tab.linkedBrowser?.currentURI?.spec || ''; + let tabURL = tab.linkedBrowser?.currentURI?.spec || ""; try { // Get the hostname from the URL const url = new URL(tabURL); @@ -748,20 +773,20 @@ class nsZenFolders extends nsZenDOMOperatedFeature { } catch { // We don't need to do anything if the URL is invalid. e.g. about:blank } - let tabLabel = tab.label || ''; + let tabLabel = tab.label || ""; let iconURL = gBrowser.getIcon(tab) || PlacesUtils.favicons.defaultFavicon.spec; icon.src = iconURL; - const labelsContainer = document.createElement('div'); - labelsContainer.className = 'folders-tabs-list-item-labels'; + const labelsContainer = document.createElement("div"); + labelsContainer.className = "folders-tabs-list-item-labels"; - const mainLabel = document.createElement('div'); - mainLabel.className = 'folders-tabs-list-item-label'; + const mainLabel = document.createElement("div"); + mainLabel.className = "folders-tabs-list-item-label"; mainLabel.textContent = tabLabel; - const secondaryLabel = document.createElement('div'); - secondaryLabel.className = 'tab-list-item-secondary-label'; + const secondaryLabel = document.createElement("div"); + secondaryLabel.className = "tab-list-item-secondary-label"; secondaryLabel.textContent = `${formatRelativeTime(tab.lastAccessed)} • ${tab.group.label}`; labelsContainer.append(mainLabel, secondaryLabel); @@ -769,38 +794,46 @@ class nsZenFolders extends nsZenDOMOperatedFeature { item.append(content); if (tab.selected) { - item.setAttribute('selected', 'true'); + item.setAttribute("selected", "true"); } - item.setAttribute('data-label', `${tabLabel.toLowerCase()} ${tabURL.toLowerCase()}`); + item.setAttribute("data-label", `${tabLabel.toLowerCase()} ${tabURL.toLowerCase()}`); - item.addEventListener('click', () => { + item.addEventListener("click", () => { gBrowser.selectedTab = tab; }); - item.addEventListener('mouseenter', () => { + item.addEventListener("mouseenter", () => { for (const sibling of tabsList.children) { - sibling.removeAttribute('selected'); + sibling.removeAttribute("selected"); } - item.setAttribute('selected', 'true'); + item.setAttribute("selected", "true"); }); tabsList.appendChild(item); } } - updateFolderIcon(group, state = 'auto') { - const svg = group.querySelector('svg'); - if (!svg) return []; + updateFolderIcon(group, state = "auto") { + const svg = group.querySelector("svg"); + if (!svg) { + return []; + } const isCollapsed = group.collapsed; - svg.setAttribute('state', state === 'auto' ? (isCollapsed ? 'close' : 'open') : state); - const hasActive = group.hasAttribute('has-active'); - svg.setAttribute('active', hasActive && isCollapsed ? 'true' : 'false'); + let stateValue = state; + if (state === "auto") { + stateValue = isCollapsed ? "close" : "open"; + } + svg.setAttribute("state", stateValue); + const hasActive = group.hasAttribute("has-active"); + const activeValue = hasActive && isCollapsed ? "true" : "false"; + svg.setAttribute("active", activeValue); return []; } + // eslint-disable-next-line complexity setFolderIndentation(tabs, groupElem = undefined, forCollapse = true, animate = true) { if (!gZenPinnedTabManager.expandedSidebarMode) { return; @@ -809,7 +842,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { let tab = tabs[0]; let isTab = false; - if (tab.group?.hasAttribute('split-view-group')) { + if (tab.group?.hasAttribute("split-view-group")) { tab = tab.group; isTab = true; } @@ -818,13 +851,13 @@ class nsZenFolders extends nsZenDOMOperatedFeature { } if ( gBrowser.isTab(groupElem) && - (!(groupElem.hasAttribute('zen-empty-tab') && groupElem.group === tab.group) || - groupElem?.hasAttribute('zen-empty-tab')) + (!(groupElem.hasAttribute("zen-empty-tab") && groupElem.group === tab.group) || + groupElem?.hasAttribute("zen-empty-tab")) ) { groupElem = groupElem.group; isTab = true; } - if (!isTab && !groupElem?.hasAttribute('selected') && !forCollapse) { + if (!isTab && !groupElem?.hasAttribute("selected") && !forCollapse) { groupElem = null; // Don't indent if the group is not selected } if (groupIsCollapsiblePins(groupElem) || isSpaceCollapsed) { @@ -843,53 +876,56 @@ class nsZenFolders extends nsZenDOMOperatedFeature { const tabLevel = tabToAnimate?.group?.level || 0; const spacing = (level - tabLevel) * baseSpacing; if (!animate) { - for (const tab of tabs) { - tab.style.setProperty('transition', 'none', 'important'); + for (const tabItem of tabs) { + tabItem.style.setProperty("transition", "none", "important"); } } - for (const tab of tabs) { - if (gBrowser.isTabGroupLabel(tab) || tab.group?.hasAttribute('split-view-group')) { - tab.group.style.setProperty('--zen-folder-indent', `${spacing}px`); + for (const tabItem of tabs) { + if (gBrowser.isTabGroupLabel(tabItem) || tabItem.group?.hasAttribute("split-view-group")) { + tabItem.group.style.setProperty("--zen-folder-indent", `${spacing}px`); continue; } - tab.style.setProperty('--zen-folder-indent', `${spacing}px`); + tabItem.style.setProperty("--zen-folder-indent", `${spacing}px`); } if (!animate) { - for (const tab of tabs) { - tab.style.removeProperty('transition'); + for (const tabItem of tabs) { + tabItem.style.removeProperty("transition"); } } } changeFolderUserIcon(group) { - if (!group) return; + if (!group) { + return; + } gZenEmojiPicker .open(group.icon, { onlySvgIcons: true }) .then((icon) => { this.setFolderUserIcon(group, icon); - group.dispatchEvent(new CustomEvent('TabGroupUpdate', { bubbles: true })); + group.dispatchEvent(new CustomEvent("TabGroupUpdate", { bubbles: true })); }) .catch((err) => { console.error(err); - return; }); } setFolderUserIcon(group, icon) { - const svgIcon = group.icon.querySelector('svg .icon image'); - if (!svgIcon) return; - svgIcon.setAttribute('href', icon ?? ''); - if (svgIcon.getAttribute('href') !== icon) { - svgIcon.style.opacity = '0'; + const svgIcon = group.icon.querySelector("svg .icon image"); + if (!svgIcon) { + return; + } + svgIcon.setAttribute("href", icon ?? ""); + if (svgIcon.getAttribute("href") !== icon) { + svgIcon.style.opacity = "0"; } else { - svgIcon.style.opacity = '1'; + svgIcon.style.opacity = "1"; } } #groupInit(group, stateData) { // Setup zen-folder icon to the correct position - this.updateFolderIcon(group, 'auto'); + this.updateFolderIcon(group, "auto"); if (stateData?.userIcon) { this.setFolderUserIcon(group, stateData.userIcon); } @@ -898,85 +934,95 @@ class nsZenFolders extends nsZenDOMOperatedFeature { this.on_TabGroupCollapse({ target: group }); } - const labelContainer = group.querySelector('.tab-group-label-container'); + const labelContainer = group.querySelector(".tab-group-label-container"); // Setup mouseenter/mouseleave events for the folder - labelContainer.addEventListener('mouseenter', (event) => { + labelContainer.addEventListener("mouseenter", (event) => { if ( !group.collapsed || - !Services.prefs.getBoolPref('zen.folders.search.enabled') || - gBrowser.tabContainer.hasAttribute('movingtab') + !Services.prefs.getBoolPref("zen.folders.search.enabled") || + gBrowser.tabContainer.hasAttribute("movingtab") ) { return; } this.#mouseTimer = setTimeout(() => { this.openTabsPopup(event); - }, Services.prefs.getIntPref('zen.folders.search.hover-delay')); + }, Services.prefs.getIntPref("zen.folders.search.hover-delay")); }); - labelContainer.addEventListener('mouseleave', () => { + labelContainer.addEventListener("mouseleave", () => { clearTimeout(this.#mouseTimer); - if (!group.collapsed) return; + if (!group.collapsed) { + return; + } this.#mouseTimer = setTimeout(() => { // If popup is focused don't hide it - if (this.#popup.matches(':hover')) return; + if (this.#popup.matches(":hover")) { + return; + } this.#popup.hidePopup(); }, 200); }); } storeDataForSessionStore() { - const folders = Array.from(gBrowser.tabContainer.querySelectorAll('zen-folder')); + const folders = Array.from(gBrowser.tabContainer.querySelectorAll("zen-folder")); const splitGroups = Array.from( - gBrowser.tabContainer.querySelectorAll('tab-group[split-view-group]') + gBrowser.tabContainer.querySelectorAll("tab-group[split-view-group]") ); const allData = [...folders, ...splitGroups]; // Sort elements in the order in which they appear in the DOM allData.sort((a, b) => { const position = a.compareDocumentPosition(b); - if (position & Node.DOCUMENT_POSITION_FOLLOWING) return -1; - if (position & Node.DOCUMENT_POSITION_PRECEDING) return 1; + if (position & Node.DOCUMENT_POSITION_FOLLOWING) { + return -1; + } + if (position & Node.DOCUMENT_POSITION_PRECEDING) { + return 1; + } return 0; }); const storedData = []; for (const folder of allData) { - const parentFolder = folder.parentElement.closest('zen-folder'); + const parentFolder = folder.parentElement.closest("zen-folder"); // Skip split-view-group if it's not a zen-folder child - if (!parentFolder && folder.hasAttribute('split-view-group')) continue; + if (!parentFolder && folder.hasAttribute("split-view-group")) { + continue; + } const emptyFolderTabs = folder.tabs - .filter((tab) => tab.hasAttribute('zen-empty-tab')) - .map((tab) => tab.getAttribute('id')); + .filter((tab) => tab.hasAttribute("zen-empty-tab")) + .map((tab) => tab.getAttribute("id")); let prevSiblingInfo = null; const prevSibling = folder.previousElementSibling; - const userIcon = folder?.icon?.querySelector('svg .icon image'); + const userIcon = folder?.icon?.querySelector("svg .icon image"); if (prevSibling) { if (gBrowser.isTabGroup(prevSibling)) { - prevSiblingInfo = { type: 'group', id: prevSibling.id }; - } else if (gBrowser.isTab(prevSibling) && prevSibling.hasAttribute('id')) { - prevSiblingInfo = { type: 'tab', id: prevSibling.getAttribute('id') }; + prevSiblingInfo = { type: "group", id: prevSibling.id }; + } else if (gBrowser.isTab(prevSibling) && prevSibling.hasAttribute("id")) { + prevSiblingInfo = { type: "tab", id: prevSibling.getAttribute("id") }; } else { - prevSiblingInfo = { type: 'start', id: null }; + prevSiblingInfo = { type: "start", id: null }; } } storedData.push({ pinned: folder.pinned, essential: folder.essential, - splitViewGroup: folder.hasAttribute('split-view-group'), + splitViewGroup: folder.hasAttribute("split-view-group"), id: folder.id, name: folder.label, collapsed: folder.collapsed, saveOnWindowClose: folder.saveOnWindowClose, parentId: parentFolder ? parentFolder.id : null, - prevSiblingInfo: prevSiblingInfo, + prevSiblingInfo, emptyTabIds: emptyFolderTabs, - userIcon: userIcon?.getAttribute('href'), + userIcon: userIcon?.getAttribute("href"), // note: We shouldn't be using the workspace-id anywhere, we are just // remembering it for the pinned tabs manager to use it later. - workspaceId: folder.getAttribute('zen-workspace-id'), + workspaceId: folder.getAttribute("zen-workspace-id"), }); } return storedData; @@ -1001,7 +1047,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { const oldGroup = document.getElementById(folderData.id); folderData.emptyTabIds.forEach((id) => { - oldGroup?.querySelector(`tab[id="${id}"]`)?.setAttribute('zen-empty-tab', true); + oldGroup?.querySelector(`tab[id="${id}"]`)?.setAttribute("zen-empty-tab", true); }); if (gBrowser.isTabGroup(oldGroup)) { if (!folderData.splitViewGroup) { @@ -1013,16 +1059,16 @@ class nsZenFolders extends nsZenDOMOperatedFeature { saveOnWindowClose: folderData.saveOnWindowClose, workspaceId: folderData.workspaceId, }); - folder.setAttribute('id', folderData.id); + folder.setAttribute("id", folderData.id); workingData.node = folder; oldGroup.before(folder); } else { workingData.node = oldGroup; } - while (oldGroup.tabs.length > 0) { + while (oldGroup.tabs.length) { const tab = oldGroup.tabs[0]; if (folderData.workspaceId) { - tab.setAttribute('zen-workspace-id', folderData.workspaceId); + tab.setAttribute("zen-workspace-id", folderData.workspaceId); } workingData.containingTabsFragment.appendChild(tab); } @@ -1044,12 +1090,12 @@ class nsZenFolders extends nsZenDOMOperatedFeature { const parentWorkingData = tabFolderWorkingData.get(stateData.parentId); if (parentWorkingData && parentWorkingData.node) { switch (stateData?.prevSiblingInfo?.type) { - case 'tab': { + case "tab": { const tab = document.getElementById(stateData.prevSiblingInfo.id); tab.after(node); break; } - case 'group': { + case "group": { const folder = document.getElementById(stateData.prevSiblingInfo.id); if (folder) { folder.after(node); @@ -1084,21 +1130,24 @@ class nsZenFolders extends nsZenDOMOperatedFeature { /** * Highlights the given tab group and removes highlight from any previously highlighted group. + * * @param {MozTabbrowserTabGroup|undefined|null} folder The folder to highlight, or null to clear highlight. * @param {Array|null} movingTabs The tabs being moved. */ highlightGroupOnDragOver(folder, movingTabs) { - if (folder === this.#lastHighlightedGroup) return true; + if (folder === this.#lastHighlightedGroup) { + return true; + } const tab = movingTabs ? movingTabs[0] : null; if (this.#lastHighlightedGroup && this.#lastHighlightedGroup !== folder) { if (this.#lastHighlightedGroup.collapsed) { - this.updateFolderIcon(this.#lastHighlightedGroup, 'close'); + this.updateFolderIcon(this.#lastHighlightedGroup, "close"); } this.#lastHighlightedGroup = null; } if ( folder?.isZenFolder && - (!folder.hasAttribute('split-view-group') || !folder.hasAttribute('selected')) && + (!folder.hasAttribute("split-view-group") || !folder.hasAttribute("selected")) && folder !== tab?.group && !( folder.level >= this.#ZEN_MAX_SUBFOLDERS && @@ -1106,7 +1155,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { ) ) { if (folder.collapsed) { - this.updateFolderIcon(folder, 'open'); + this.updateFolderIcon(folder, "open"); } this.#lastHighlightedGroup = folder; return true; @@ -1116,6 +1165,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { /** * Ungroup a tab from all the active groups it belongs to. + * * @param {MozTabbrowserTab[]} tabs The tab to ungroup. */ ungroupTabsFromActiveGroups(tabs) { @@ -1126,12 +1176,12 @@ class nsZenFolders extends nsZenDOMOperatedFeature { #normalizeGroupItems(items) { return items - .filter((item) => !item.hasAttribute('zen-empty-tab')) + .filter((item) => !item.hasAttribute("zen-empty-tab")) .map((item) => { if (gBrowser.isTabGroup(item)) { item = item.firstChild; } else if (gBrowser.isTabGroupLabel(item)) { - if (item?.group?.hasAttribute('split-view-group')) { + if (item?.group?.hasAttribute("split-view-group")) { item = item.group; } else { item = item.parentElement; @@ -1145,21 +1195,25 @@ class nsZenFolders extends nsZenDOMOperatedFeature { const { selectedTabs = [], splitViewIds = new Set(), activeFoldersIds = new Set() } = opts; const folders = new Map(); return group.childGroupsAndTabs - .filter((item) => !item.hasAttribute('zen-empty-tab')) + .filter((item) => !item.hasAttribute("zen-empty-tab")) .map((item) => { - const isSplitView = item.group?.hasAttribute?.('split-view-group'); - const group = isSplitView ? item.group.group : item.group; - if (!folders.has(group?.id)) { - folders.set(group?.id, group?.activeGroups[0]); + const isSplitView = item.group?.hasAttribute?.("split-view-group"); + const itemGroup = isSplitView ? item.group.group : item.group; + if (!folders.has(itemGroup?.id)) { + folders.set(itemGroup?.id, itemGroup?.activeGroups[0]); } - const lastActiveFolder = folders.get(group?.id); + const lastActiveFolder = folders.get(itemGroup?.id); const activeFolderId = lastActiveFolder?.id; const splitViewId = isSplitView ? item?.group?.id : null; - if (item.multiselected || item.selected || item.hasAttribute('folder-active')) { + if (item.multiselected || item.selected || item.hasAttribute("folder-active")) { selectedTabs.push(item); - if (splitViewId) splitViewIds.add(splitViewId); - if (activeFolderId) activeFoldersIds.add(activeFolderId); + if (splitViewId) { + splitViewIds.add(splitViewId); + } + if (activeFolderId) { + activeFoldersIds.add(activeFolderId); + } } if (gBrowser.isTabGroupLabel(item)) { @@ -1185,14 +1239,14 @@ class nsZenFolders extends nsZenDOMOperatedFeature { let heightShift = 0; if (selectedTabs.length) { return heightShift; - } else { - heightShift += window.windowUtils.getBoundsWithoutFlushing(tabsContainer).height; - if (tabsContainer.separatorElement) { - heightShift -= window.windowUtils.getBoundsWithoutFlushing( - tabsContainer.separatorElement - ).height; - } } + heightShift += window.windowUtils.getBoundsWithoutFlushing(tabsContainer).height; + if (tabsContainer.separatorElement) { + heightShift -= window.windowUtils.getBoundsWithoutFlushing( + tabsContainer.separatorElement + ).height; + } + return heightShift; } @@ -1220,16 +1274,20 @@ class nsZenFolders extends nsZenDOMOperatedFeature { const { item, splitViewId, activeFolderId } = groupItems[i]; // Skip selected items - if (selectedTabs.includes(item)) continue; + if (selectedTabs.includes(item)) { + continue; + } // Skip items from selected split-view groups - if (splitViewId && splitViewIds.has(splitViewId)) continue; + if (splitViewId && splitViewIds.has(splitViewId)) { + continue; + } // Skip items from selected active groups if (activeFolderId && activeFoldersIds.has(activeFolderId)) { // If item is tab-group-label-container we should hide it. // Other items between tab-group-labe-container and folder-active tab should be visible cuz they are hidden by margin-top - if (item.parentElement.id !== activeFolderId && !item.hasAttribute('folder-active')) { + if (item.parentElement.id !== activeFolderId && !item.hasAttribute("folder-active")) { continue; } } @@ -1239,7 +1297,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { } } - group.setAttribute('has-active', 'true'); + group.setAttribute("has-active", "true"); group.activeTabs = selectedTabs; selectedTabs.forEach((tab) => { @@ -1250,8 +1308,8 @@ class nsZenFolders extends nsZenDOMOperatedFeature { animations.push( ...this.#createAnimation( itemsToHide, - { opacity: [1, 0], height: ['auto', 0] }, - { duration: 0.12, ease: 'easeInOut' } + { opacity: [1, 0], height: ["auto", 0] }, + { duration: 0.12, ease: "easeInOut" } ), ...this.updateFolderIcon(group), ...this.#createAnimation( @@ -1259,7 +1317,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { { marginTop: -(collapsedHeight + 4 * (selectedTabs.length === 0 ? 1 : 0)), }, - { duration: 0.12, ease: 'easeInOut' } + { duration: 0.12, ease: "easeInOut" } ) ); @@ -1272,7 +1330,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { } // Prevent hiding if we spam the group animations if (!selectedTabs.length && !this.#animationCount) { - tabsContainer.setAttribute('hidden', true); + tabsContainer.setAttribute("hidden", true); } this.styleCleanup(itemsToHide); @@ -1285,8 +1343,8 @@ class nsZenFolders extends nsZenDOMOperatedFeature { const itemsToHide = []; const tabsContainer = group.groupContainer; - tabsContainer.removeAttribute('hidden'); - tabsContainer.style.overflow = 'hidden'; + tabsContainer.removeAttribute("hidden"); + tabsContainer.style.overflow = "hidden"; const groupStart = group.groupStartElement; const itemsToShow = this.#normalizeGroupItems(group.childGroupsAndTabs); @@ -1307,17 +1365,21 @@ class nsZenFolders extends nsZenDOMOperatedFeature { const { item, splitViewId, activeFolderId } = activeFolderItems[i]; // Skip selected items - if (selectedTabs.includes(item)) continue; + if (selectedTabs.includes(item)) { + continue; + } // Skip items from selected split-view groups - if (splitViewId && splitViewIds.has(splitViewId)) continue; + if (splitViewId && splitViewIds.has(splitViewId)) { + continue; + } if (activeFolderId && activeFoldersIds.has(activeFolderId)) { - const folder = item.parentElement; + const parentFolder = item.parentElement; if ( - gBrowser.isTabGroup(folder) && - folder.id !== activeFolderId && - item.hasAttribute('folder-active') + gBrowser.isTabGroup(parentFolder) && + parentFolder.id !== activeFolderId && + item.hasAttribute("folder-active") ) { continue; } @@ -1331,29 +1393,29 @@ class nsZenFolders extends nsZenDOMOperatedFeature { } const afterMarginTop = () => { - tabsContainer.style.overflow = ''; - if (group.hasAttribute('has-active')) { + tabsContainer.style.overflow = ""; + if (group.hasAttribute("has-active")) { const activeTabs = group.activeTabs; const folders = new Map(); - group.removeAttribute('has-active'); + group.removeAttribute("has-active"); for (let tab of activeTabs) { - const group = tab?.group?.hasAttribute('split-view-group') + const tabGroup = tab?.group?.hasAttribute("split-view-group") ? tab?.group?.group : tab?.group; - if (!folders.has(group?.id)) { - folders.set(group?.id, group?.activeGroups?.at(-1)); + if (!folders.has(tabGroup?.id)) { + folders.set(tabGroup?.id, tabGroup?.activeGroups?.at(-1)); } - let activeGroup = folders.get(group?.id); + let activeGroup = folders.get(tabGroup?.id); if (activeGroup) { this.setFolderIndentation([tab], activeGroup, /* for collapse = */ true); } else { // Since the folder is now expanded, we should remove active attribute // to the tab that was previously visible - tab.removeAttribute('folder-active'); - if (tab.group?.hasAttribute('split-view-group')) { - tab.group.style.removeProperty('--zen-folder-indent'); + tab.removeAttribute("folder-active"); + if (tab.group?.hasAttribute("split-view-group")) { + tab.group.style.removeProperty("--zen-folder-indent"); } else { - tab.style.removeProperty('--zen-folder-indent'); + tab.style.removeProperty("--zen-folder-indent"); } } } @@ -1366,13 +1428,13 @@ class nsZenFolders extends nsZenDOMOperatedFeature { animations.push( ...this.#createAnimation( itemsToShow, - { opacity: '', height: '' }, - { duration: 0.12, ease: 'easeInOut' } + { opacity: "", height: "" }, + { duration: 0.12, ease: "easeInOut" } ), ...this.#createAnimation( itemsToHide, { opacity: 0, height: 0 }, - { duration: 0.12, ease: 'easeInOut' } + { duration: 0.12, ease: "easeInOut" } ), ...this.updateFolderIcon(group), ...this.#createAnimation( @@ -1380,7 +1442,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { { marginTop: 0, }, - { duration: 0.12, ease: 'easeInOut' }, + { duration: 0.12, ease: "easeInOut" }, afterMarginTop ) ); @@ -1399,19 +1461,19 @@ class nsZenFolders extends nsZenDOMOperatedFeature { const activeGroups = [group, ...group.childActiveGroups]; for (const folder of activeGroups) { - folder.removeAttribute('has-active'); + folder.removeAttribute("has-active"); folder.activeTabs = []; const groupItems = this.#normalizeGroupItems(folder.allItems); const tabsContainer = folder.groupContainer; // Set correct margin-top after animation const afterAnimate = () => { - groupStart.style.removeProperty('margin-top'); + groupStart.style.removeProperty("margin-top"); this.styleCleanup(groupItems); // Trigger the recalculation so that zen returns // the correct container size in the DOM tabsContainer.offsetHeight; - tabsContainer.setAttribute('hidden', true); + tabsContainer.setAttribute("hidden", true); const collapsedHeight = this.#calculateHeightShift(tabsContainer, []); groupStart.style.marginTop = `${-(collapsedHeight + 4)}px`; }; @@ -1421,13 +1483,13 @@ class nsZenFolders extends nsZenDOMOperatedFeature { // Collect animations for this specific folder becoming inactive animations.push( - ...this.updateFolderIcon(folder, 'close', false), + ...this.updateFolderIcon(folder, "close", false), ...this.#createAnimation( groupStart, { marginTop: -(collapsedHeight + 4), }, - { duration: 0.12, ease: 'easeInOut' }, + { duration: 0.12, ease: "easeInOut" }, afterAnimate ) ); @@ -1440,8 +1502,10 @@ class nsZenFolders extends nsZenDOMOperatedFeature { } async animateUnload(group, tabToUnload, ungroup = false) { - const isSplitView = tabToUnload.group?.hasAttribute('split-view-group'); - if ((!group?.isZenFolder || !isSplitView) && !tabToUnload.hasAttribute('folder-active')) return; + const isSplitView = tabToUnload.group?.hasAttribute("split-view-group"); + if ((!group?.isZenFolder || !isSplitView) && !tabToUnload.hasAttribute("folder-active")) { + return; + } const animations = []; let lastTab = false; @@ -1452,18 +1516,18 @@ class nsZenFolders extends nsZenDOMOperatedFeature { if (folder.activeTabs.length === 0) { lastTab = true; animations.push(async () => { - folder.removeAttribute('has-active'); + folder.removeAttribute("has-active"); const groupItems = this.#normalizeGroupItems(folder.allItems); const tabsContainer = folder.groupContainer; // Set correct margin-top after animation const afterAnimate = () => { - groupStart.style.removeProperty('margin-top'); + groupStart.style.removeProperty("margin-top"); this.styleCleanup(groupItems); // Trigger the recalculation so that zen returns // the correct container size in the DOM tabsContainer.offsetHeight; - tabsContainer.setAttribute('hidden', true); + tabsContainer.setAttribute("hidden", true); const collapsedHeight = this.#calculateHeightShift(tabsContainer, []); groupStart.style.marginTop = `${-(collapsedHeight + 4)}px`; }; @@ -1473,13 +1537,13 @@ class nsZenFolders extends nsZenDOMOperatedFeature { // Collect animations for this specific folder becoming inactive const folderAnimation = [ - ...this.updateFolderIcon(folder, 'close', false), + ...this.updateFolderIcon(folder, "close", false), ...this.#createAnimation( groupStart, { marginTop: -(collapsedHeight + 4), }, - { duration: 0.12, ease: 'easeInOut' }, + { duration: 0.12, ease: "easeInOut" }, afterAnimate ), ]; @@ -1488,12 +1552,12 @@ class nsZenFolders extends nsZenDOMOperatedFeature { } } - tabToUnload.removeAttribute('folder-active'); + tabToUnload.removeAttribute("folder-active"); if (isSplitView) { tabToUnload = tabToUnload.group; } - tabToUnload.style.removeProperty('--zen-folder-indent'); + tabToUnload.style.removeProperty("--zen-folder-indent"); let tabUnloadAnimations = []; if (!ungroup && !lastTab) { @@ -1505,7 +1569,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { }, { duration: 0.12, - ease: 'easeInOut', + ease: "easeInOut", } ); } @@ -1515,13 +1579,15 @@ class nsZenFolders extends nsZenDOMOperatedFeature { // Await the tab unload animation first await Promise.all(tabUnloadAnimations); - await Promise.all(animations.map((item) => (typeof item === 'function' ? item() : item))); + await Promise.all(animations.map((item) => (typeof item === "function" ? item() : item))); this.#animationCount -= 1; gBrowser.tabContainer._invalidateCachedTabs(); } async animateSelect(group) { - if (!group?.isZenFolder) return; + if (!group?.isZenFolder) { + return; + } this.cancelPopupTimer(); @@ -1536,47 +1602,49 @@ class nsZenFolders extends nsZenDOMOperatedFeature { }); for (const tab of selectedTabs) { - let currentGroup = tab?.group?.hasAttribute('split-view-group') + let currentGroup = tab?.group?.hasAttribute("split-view-group") ? tab.group.group : tab?.group; while (currentGroup) { const activeTabs = selectedTabs.filter((t) => currentGroup.tabs.includes(t)); if (activeTabs.length) { if (currentGroup.collapsed) { - if (currentGroup.hasAttribute('has-active')) { + if (currentGroup.hasAttribute("has-active")) { // It is important to keep the sequence of elements as in the DOM currentGroup.activeTabs = [ ...new Set([...currentGroup.activeTabs, ...activeTabs]), ].sort((a, b) => a._tPos > b._tPos); } else { - currentGroup.setAttribute('has-active', 'true'); + currentGroup.setAttribute("has-active", "true"); currentGroup.activeTabs = activeTabs; } const tabsContainer = currentGroup.groupContainer; const groupStart = currentGroup.groupStartElement; - tabsContainer.style.overflow = 'clip'; + tabsContainer.style.overflow = "clip"; - if (tabsContainer.hasAttribute('hidden')) tabsContainer.removeAttribute('hidden'); + if (tabsContainer.hasAttribute("hidden")) { + tabsContainer.removeAttribute("hidden"); + } const afterMarginTop = () => { - tabsContainer.style.overflow = ''; + tabsContainer.style.overflow = ""; }; animations.push( - ...this.updateFolderIcon(currentGroup, 'close', false), + ...this.updateFolderIcon(currentGroup, "close", false), ...this.#createAnimation( groupStart, { marginTop: 0, }, - { duration: 0.12, ease: 'easeInOut' }, + { duration: 0.12, ease: "easeInOut" }, afterMarginTop ) ); - for (const tab of activeTabs) { + for (const activeTab of activeTabs) { this.setFolderIndentation( - [tab], + [activeTab], currentGroup, /* for collapse = */ true, /* animate = */ false @@ -1596,13 +1664,19 @@ class nsZenFolders extends nsZenDOMOperatedFeature { itemsToShow.push(item); // Skip selected items - if (selectedTabs.includes(item)) continue; + if (selectedTabs.includes(item)) { + continue; + } // Skip items from selected split-view groups - if (splitViewId && splitViewIds.has(splitViewId)) continue; + if (splitViewId && splitViewIds.has(splitViewId)) { + continue; + } - if (!item.hasAttribute?.('folder-active')) { - if (!itemsToHide.includes(item)) itemsToHide.push(item); + if (!item.hasAttribute?.("folder-active")) { + if (!itemsToHide.includes(item)) { + itemsToHide.push(item); + } } } } @@ -1618,12 +1692,12 @@ class nsZenFolders extends nsZenDOMOperatedFeature { ...this.#createAnimation( itemsToShow, { - opacity: '', - height: '', + opacity: "", + height: "", }, { duration: 0.12, - ease: 'easeInOut', + ease: "easeInOut", } ), ...this.#createAnimation( @@ -1634,7 +1708,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { }, { duration: 0.12, - ease: 'easeInOut', + ease: "easeInOut", } ) ); @@ -1652,25 +1726,27 @@ class nsZenFolders extends nsZenDOMOperatedFeature { } animateGroupMove(group, expand = false) { - if (!group?.isZenFolder) return; + if (!group?.isZenFolder) { + return; + } const groupStart = group.groupStartElement; const tabsContainer = group.groupContainer; const heightContainer = expand ? 0 : this.#calculateHeightShift(tabsContainer, []); - tabsContainer.style.overflow = 'clip'; + tabsContainer.style.overflow = "clip"; this.#createAnimation( groupStart, { marginTop: expand ? 0 : -(heightContainer + 4), }, - { duration: 0.12, ease: 'easeInOut' } + { duration: 0.12, ease: "easeInOut" } ); } styleCleanup(items) { items.forEach((item) => { - item.style.removeProperty('opacity'); - item.style.removeProperty('height'); + item.style.removeProperty("opacity"); + item.style.removeProperty("height"); }); } } diff --git a/src/zen/folders/zen-folders.css b/src/zen/folders/zen-folders.css index 1cd1cb43d..5c21c8b02 100644 --- a/src/zen/folders/zen-folders.css +++ b/src/zen/folders/zen-folders.css @@ -13,23 +13,14 @@ zen-folder { flex-direction: column; visibility: visible; - --zen-folder-behind-bgcolor: light-dark( - color-mix(in srgb, var(--zen-primary-color) 60%, gray), - color-mix(in srgb, var(--zen-primary-color) 60%, #c1c1c1) - ); - --zen-folder-front-bgcolor: light-dark( - color-mix(in srgb, var(--zen-primary-color), white 70%), - color-mix(in srgb, var(--zen-primary-color), black 40%) - ); - --zen-folder-stroke: light-dark( - color-mix(in srgb, var(--zen-primary-color) 50%, black), - color-mix(in srgb, var(--zen-colors-primary) 15%, #ebebeb) - ); + --zen-folder-behind-bgcolor: light-dark(color-mix(in srgb, var(--zen-primary-color) 60%, gray), color-mix(in srgb, var(--zen-primary-color) 60%, #c1c1c1)); + --zen-folder-front-bgcolor: light-dark(color-mix(in srgb, var(--zen-primary-color), white 70%), color-mix(in srgb, var(--zen-primary-color), black 40%)); + --zen-folder-stroke: light-dark(color-mix(in srgb, var(--zen-primary-color) 50%, black), color-mix(in srgb, var(--zen-colors-primary) 15%, #ebebeb)); -moz-window-dragging: no-drag; transition: var(--zen-tabbox-element-indent-transition); - :root[zen-sidebar-expanded='true'] & { + :root[zen-sidebar-expanded="true"] & { margin-inline-start: var(--zen-folder-indent) !important; } @@ -82,7 +73,7 @@ zen-folder { height: calc(var(--tab-block-margin) * 2 + var(--tab-min-height)); padding-inline: var(--tab-group-label-padding); - :root[zen-sidebar-expanded='true'] & { + :root[zen-sidebar-expanded="true"] & { padding-inline-end: calc(var(--tab-group-label-padding) * 2); } @@ -111,7 +102,7 @@ zen-folder { :root:not([zen-sidebar-expanded]) & { transition: transform 0.1s ease; - &[state='open'] { + &[state="open"] { transform: translate(-2px); } } @@ -131,11 +122,11 @@ zen-folder { opacity 0.3s cubic-bezier(0.42, 0, 0, 1); } - &[state='open'] .back { + &[state="open"] .back { transform: skewX(16deg) translate(-2px, 3.4px) scale(0.85); } - &[state='open'] :is(.front, .dots, .icon) { + &[state="open"] :is(.front, .dots, .icon) { transform: skewX(-16deg) translate(11.1px, 3.4px) scale(0.85); } @@ -147,18 +138,18 @@ zen-folder { opacity: 0; } - &[active='true'] .icon { + &[active="true"] .icon { opacity: 0; } - &[active='true'] .dots { + &[active="true"] .dots { opacity: 1; } } } &::before { - content: ''; + content: ""; position: absolute; top: 2px; left: 2px; diff --git a/src/zen/glance/ZenGlanceManager.mjs b/src/zen/glance/ZenGlanceManager.mjs index 2815a8636..e2d44d176 100644 --- a/src/zen/glance/ZenGlanceManager.mjs +++ b/src/zen/glance/ZenGlanceManager.mjs @@ -2,7 +2,7 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -import { nsZenDOMOperatedFeature } from 'chrome://browser/content/zen-components/ZenCommonUtils.mjs'; +import { nsZenDOMOperatedFeature } from "chrome://browser/content/zen-components/ZenCommonUtils.mjs"; /** * Manages the Zen Glance feature - a preview overlay system for tabs @@ -35,7 +35,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { ARC_HEIGHT_RATIO: 0.2, // Arc height = distance * ratio (capped at MAX_ARC_HEIGHT) }); - #GLANCE_ANIMATION_DURATION = Services.prefs.getIntPref('zen.glance.animation-duration') / 1000; + #GLANCE_ANIMATION_DURATION = Services.prefs.getIntPref("zen.glance.animation-duration") / 1000; init() { this.#setupEventListeners(); @@ -45,40 +45,41 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { } #setupEventListeners() { - window.addEventListener('TabClose', this.onTabClose.bind(this)); - window.addEventListener('TabSelect', this.onLocationChange.bind(this)); + window.addEventListener("TabClose", this.onTabClose.bind(this)); + window.addEventListener("TabSelect", this.onLocationChange.bind(this)); document - .getElementById('tabbrowser-tabpanels') - .addEventListener('click', this.onOverlayClick.bind(this)); + .getElementById("tabbrowser-tabpanels") + .addEventListener("click", this.onOverlayClick.bind(this)); } #setupPreferences() { XPCOMUtils.defineLazyPreferenceGetter( this._lazyPref, - 'SHOULD_OPEN_EXTERNAL_TABS_IN_GLANCE', - 'zen.glance.open-essential-external-links', + "SHOULD_OPEN_EXTERNAL_TABS_IN_GLANCE", + "zen.glance.open-essential-external-links", false ); } #setupObservers() { - Services.obs.addObserver(this, 'quit-application-requested'); + Services.obs.addObserver(this, "quit-application-requested"); } #insertIntoContextMenu() { - const menuitem = document.createXULElement('menuitem'); - menuitem.setAttribute('id', 'context-zenOpenLinkInGlance'); - menuitem.setAttribute('hidden', 'true'); - menuitem.setAttribute('data-l10n-id', 'zen-open-link-in-glance'); + const menuitem = document.createXULElement("menuitem"); + menuitem.setAttribute("id", "context-zenOpenLinkInGlance"); + menuitem.setAttribute("hidden", "true"); + menuitem.setAttribute("data-l10n-id", "zen-open-link-in-glance"); - menuitem.addEventListener('command', () => this.openGlance({ url: gContextMenu.linkURL })); + menuitem.addEventListener("command", () => this.openGlance({ url: gContextMenu.linkURL })); - document.getElementById('context-sep-open').insertAdjacentElement('beforebegin', menuitem); + document.getElementById("context-sep-open").insertAdjacentElement("beforebegin", menuitem); } /** * Handle main command set events for glance operations + * * @param {Event} event - The command event */ handleMainCommandSet(event) { @@ -97,6 +98,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Get the current glance browser element + * * @returns {Browser} The current browser or null */ get #currentBrowser() { @@ -105,6 +107,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Get the current glance tab element + * * @returns {Tab} The current tab or null */ get #currentTab() { @@ -113,6 +116,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Get the current glance parent tab element + * * @returns {Tab} The parent tab or null */ get #currentParentTab() { @@ -121,6 +125,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Handle clicks on the glance overlay + * * @param {Event} event - The click event */ onOverlayClick(event) { @@ -134,11 +139,12 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Handle application observer notifications - * @param {Object} subject - The subject of the notification + * + * @param {object} subject - The subject of the notification * @param {string} topic - The topic of the notification */ observe(subject, topic) { - if (topic === 'quit-application-requested') { + if (topic === "quit-application-requested") { this.onUnload(); } } @@ -155,6 +161,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Create a new browser element for a glance + * * @param {string} url - The URL to load * @param {Tab} currentTab - The current tab * @param {Tab} existingTab - Optional existing tab to reuse @@ -177,12 +184,13 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Create tab options for a new glance tab + * * @param {Tab} currentTab - The current tab - * @returns {Object} Tab options + * @returns {object} Tab options */ #createTabOptions(currentTab) { return { - userContextId: currentTab.getAttribute('usercontextid') || '', + userContextId: currentTab.getAttribute("usercontextid") || "", skipBackgroundNotify: true, insertTab: true, skipLoad: false, @@ -191,23 +199,25 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Configure a new tab for glance usage + * * @param {Tab} newTab - The new tab to configure * @param {Tab} currentTab - The current tab * @param {string} glanceId - The glance ID */ #configureNewTab(newTab, currentTab, glanceId) { - if (currentTab.hasAttribute('zenDefaultUserContextId')) { - newTab.setAttribute('zenDefaultUserContextId', true); + if (currentTab.hasAttribute("zenDefaultUserContextId")) { + newTab.setAttribute("zenDefaultUserContextId", true); } - currentTab.querySelector('.tab-content').appendChild(newTab); - newTab.setAttribute('zen-glance-tab', true); - newTab.setAttribute('glance-id', glanceId); - currentTab.setAttribute('glance-id', glanceId); + currentTab.querySelector(".tab-content").appendChild(newTab); + newTab.setAttribute("zen-glance-tab", true); + newTab.setAttribute("glance-id", glanceId); + currentTab.setAttribute("glance-id", glanceId); } /** * Register a new glance in the glances map + * * @param {Tab} newTab - The new tab * @param {Tab} currentTab - The current tab * @param {string} glanceId - The glance ID @@ -223,22 +233,24 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Fill overlay references from a browser element + * * @param {Browser} browser - The browser element */ fillOverlay(browser) { - this.overlay = browser.closest('.browserSidebarContainer'); - this.browserWrapper = browser.closest('.browserContainer'); - this.contentWrapper = browser.closest('.browserStack'); + this.overlay = browser.closest(".browserSidebarContainer"); + this.browserWrapper = browser.closest(".browserContainer"); + this.contentWrapper = browser.closest(".browserStack"); } /** * Create new overlay buttons with animation + * * @returns {DocumentFragment} The cloned button template */ #createNewOverlayButtons() { - const template = document.getElementById('zen-glance-sidebar-template'); + const template = document.getElementById("zen-glance-sidebar-template"); const newButtons = template.content.cloneNode(true); - const container = newButtons.querySelector('.zen-glance-sidebar-container'); + const container = newButtons.querySelector(".zen-glance-sidebar-container"); this.#animateOverlayButtons(container); return newButtons; @@ -246,6 +258,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Animate the overlay buttons entrance + * * @param {Element} container - The button container */ #animateOverlayButtons(container) { @@ -261,7 +274,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { }, { duration: 0.2, - type: 'spring', + type: "spring", delay: this.#GLANCE_ANIMATION_DURATION - 0.2, bounce: 0, } @@ -270,7 +283,8 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Get element preview data as a data URL - * @param {Object} data - Glance data + * + * @param {object} data - Glance data * @returns {Promise} Promise resolving to data URL or null * if not available */ @@ -289,7 +303,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { await window.browsingContext.currentWindowGlobal.drawSnapshot( rect, 1, - 'transparent', + "transparent", undefined ) ); @@ -297,7 +311,8 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Set the last link click data - * @param {Object} data - The link click data + * + * @param {object} data - The link click data */ set lastLinkClickData(data) { this.#lastLinkClickData = data; @@ -305,7 +320,8 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Get the last link click data - * @returns {Object} The last link click data + * + * @returns {object} The last link click data */ get lastLinkClickData() { return this.#lastLinkClickData; @@ -313,19 +329,19 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Open a glance overlay with the specified data - * @param {Object} data - Glance data including URL, position, and dimensions + * + * @param {object} data - Glance data including URL, position, and dimensions * @param {Tab} existingTab - Optional existing tab to reuse * @param {Tab} ownerTab - The tab that owns this glance - * @returns {Promise} Promise that resolves to the glance tab */ openGlance(data, existingTab = null, ownerTab = null) { if (this.#currentBrowser) { - return; + return Promise.resolve(this.#currentTab); } if (gBrowser.selectedTab === this.#currentParentTab) { gBrowser.selectedTab = this.#currentTab; - return; + return Promise.resolve(this.#currentTab); } if (!data.height || !data.width) { @@ -340,13 +356,14 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { const browserElement = this.#createBrowserElement(data.url, currentTab, existingTab); this.fillOverlay(browserElement); - this.overlay.classList.add('zen-glance-overlay'); + this.overlay.classList.add("zen-glance-overlay"); return this.#animateGlanceOpening(data, browserElement); } /** * Set animation state flags + * * @param {boolean} isAnimating - Whether animations are active */ #setAnimationState(isAnimating) { @@ -356,7 +373,8 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Animate the glance opening process - * @param {Object} data - Glance data + * + * @param {object} data - Glance data * @param {Browser} browserElement - The browser element * @returns {Promise} Promise that resolves to the glance tab */ @@ -383,7 +401,8 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Prepare the glance for animation - * @param {Object} data - Glance data + * + * @param {object} data - Glance data * @param {Browser} browserElement - The browser element */ #prepareGlanceAnimation(data, browserElement) { @@ -400,7 +419,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { */ #animateParentBackground() { const parentSidebarContainer = this.#currentParentTab.linkedBrowser.closest( - '.browserSidebarContainer' + ".browserSidebarContainer" ); gZenUIManager.motion.animate( @@ -411,7 +430,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { }, { duration: this.#GLANCE_ANIMATION_DURATION, - type: 'spring', + type: "spring", bounce: 0.2, } ); @@ -419,22 +438,24 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Set up glance positioning - * @param {Object} data - Glance data with position and dimensions + * + * @param {object} data - Glance data with position and dimensions */ #setupGlancePositioning(data) { const { clientX, clientY, width, height } = data; + // eslint-disable-next-line no-shadow const top = clientY + height / 2; const left = clientX + width / 2; - this.overlay.removeAttribute('fade-out'); - this.browserWrapper.setAttribute('animate', true); + this.overlay.removeAttribute("fade-out"); + this.browserWrapper.setAttribute("animate", true); this.browserWrapper.style.top = `${top}px`; this.browserWrapper.style.left = `${left}px`; this.browserWrapper.style.width = `${width}px`; this.browserWrapper.style.height = `${height}px`; this.#storeOriginalPosition(); - this.overlay.style.overflow = 'visible'; + this.overlay.style.overflow = "visible"; } /** @@ -450,18 +471,20 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { } #createGlancePreviewElement(src) { - const imageDataElement = document.createXULElement('image'); - imageDataElement.setAttribute('src', src); + const imageDataElement = document.createXULElement("image"); + imageDataElement.setAttribute("src", src); - const parent = document.createElement('div'); - parent.classList.add('zen-glance-element-preview'); + // eslint-disable-next-line no-shadow + const parent = document.createElement("div"); + parent.classList.add("zen-glance-element-preview"); parent.appendChild(imageDataElement); return parent; } /** * Handle element preview if provided - * @param {Object} data - Glance data + * + * @param {object} data - Glance data * @returns {Element|null} The preview element or null */ #handleElementPreview(data) { @@ -480,7 +503,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { }, { duration: this.#GLANCE_ANIMATION_DURATION / 2, - easing: 'easeInOut', + easing: "easeInOut", } ); @@ -489,6 +512,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Configure browser element for animation + * * @param {Browser} browserElement - The browser element */ #configureBrowserElement(browserElement) { @@ -502,7 +526,8 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Get the transform origin for the animation - * @param {Object} data - Glance data with position and dimensions + * + * @param {object} data - Glance data with position and dimensions * @returns {string} The transform origin CSS value */ #getTransformOrigin(data) { @@ -512,7 +537,8 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Execute the main glance animation - * @param {Object} data - Glance data + * + * @param {object} data - Glance data * @param {Browser} browserElement - The browser element * @param {Function} resolve - Promise resolve function */ @@ -520,7 +546,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { const imageDataElement = this.#handleElementPreview(data); // Create curved animation sequence - const arcSequence = this.#createGlanceArcSequence(data, 'opening'); + const arcSequence = this.#createGlanceArcSequence(data, "opening"); const transformOrigin = this.#getTransformOrigin(data); this.browserWrapper.style.transformOrigin = transformOrigin; @@ -535,11 +561,11 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { { opacity: [0, 1] }, { duration: this.#GLANCE_ANIMATION_DURATION / 2, - easing: 'easeInOut', + easing: "easeInOut", } ) .then(() => { - this.contentWrapper.style.opacity = ''; + this.contentWrapper.style.opacity = ""; }); } @@ -547,7 +573,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { gZenUIManager.motion .animate(this.browserWrapper, arcSequence, { duration: gZenUIManager.testingEnabled ? 0 : this.#GLANCE_ANIMATION_DURATION, - ease: 'easeInOut', + ease: "easeInOut", }) .then(() => { this.#finalizeGlanceOpening(imageDataElement, browserElement, resolve); @@ -556,9 +582,10 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Create arc animation sequence for glance animations - * @param {Object} data - Glance data with position and dimensions + * + * @param {object} data - Glance data with position and dimensions * @param {string} direction - 'opening' or 'closing' - * @returns {Object} Animation sequence object + * @returns {object} Animation sequence object */ #createGlanceArcSequence(data, direction) { const { clientX, clientY, width, height } = data; @@ -569,12 +596,12 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { const tabPanelsRect = window.windowUtils.getBoundsWithoutFlushing(gBrowser.tabpanels); const widthPercent = 0.85; - if (direction === 'opening') { + if (direction === "opening") { startPosition = { x: clientX + width / 2, y: clientY + height / 2, - width: width, - height: height, + width, + height, }; endPosition = { x: tabPanelsRect.width / 2, @@ -593,8 +620,8 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { endPosition = { x: Math.floor(clientX + width / 2), y: Math.floor(clientY + height / 2), - width: width, - height: height, + width, + height, }; } @@ -630,7 +657,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { // First, create the main animation steps for (let i = 0; i <= steps; i++) { const progress = i / steps; - const eased = direction === 'opening' ? easeOutBack(progress) : easeOutCubic(progress); + const eased = direction === "opening" ? easeOutBack(progress) : easeOutCubic(progress); // Calculate size interpolation const currentWidth = startPosition.width + (endPosition.width - startPosition.width) * eased; @@ -657,8 +684,9 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Calculate distance between two positions - * @param {Object} start - Start position - * @param {Object} end - End position + * + * @param {object} start - Start position + * @param {object} end - End position * @returns {number} Distance */ #calculateDistance(start, end) { @@ -669,10 +697,11 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Calculate optimal arc parameters - * @param {Object} startPosition - Start position - * @param {Object} endPosition - End position + * + * @param {object} startPosition - Start position + * @param {object} endPosition - End position * @param {number} distance - Distance between positions - * @returns {Object} Arc parameters + * @returns {object} Arc parameters */ #calculateOptimalArc(startPosition, endPosition, distance) { // Calculate available space for the arc @@ -698,6 +727,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Finalize the glance opening process + * * @param {Element|null} imageDataElement - The preview element * @param {Browser} browserElement - The browser element * @param {Function} resolve - Promise resolve function @@ -707,37 +737,39 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { imageDataElement.remove(); } - this.browserWrapper.style.transformOrigin = ''; + this.browserWrapper.style.transformOrigin = ""; - browserElement.style.minWidth = ''; - browserElement.style.minHeight = ''; + browserElement.style.minWidth = ""; + browserElement.style.minHeight = ""; - this.browserWrapper.style.height = '100%'; - this.browserWrapper.style.width = '85%'; + this.browserWrapper.style.height = "100%"; + this.browserWrapper.style.width = "85%"; gBrowser.tabContainer._invalidateCachedTabs(); - this.overlay.style.removeProperty('overflow'); - this.browserWrapper.removeAttribute('animate'); - this.browserWrapper.setAttribute('has-finished-animation', true); + this.overlay.style.removeProperty("overflow"); + this.browserWrapper.removeAttribute("animate"); + this.browserWrapper.setAttribute("has-finished-animation", true); this.#setAnimationState(false); - this.#currentTab.dispatchEvent(new Event('GlanceOpen', { bubbles: true })); + this.#currentTab.dispatchEvent(new Event("GlanceOpen", { bubbles: true })); resolve(this.#currentTab); } /** * Clear container styles while preserving inset + * * @param {Element} container - The container element */ #clearContainerStyles(container) { const inset = container.style.inset; - container.removeAttribute('style'); + container.removeAttribute("style"); container.style.inset = inset; } /** * Close the current glance - * @param {Object} options - Close options + * + * @param {object} options - Close options * @param {boolean} options.noAnimation - Skip animation * @param {boolean} options.onTabClose - Called during tab close * @param {string} options.setNewID - Set new glance ID @@ -761,15 +793,15 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { } const browserSidebarContainer = this.#currentParentTab?.linkedBrowser?.closest( - '.browserSidebarContainer' + ".browserSidebarContainer" ); - const sidebarButtons = this.browserWrapper.querySelector('.zen-glance-sidebar-container'); + const sidebarButtons = this.browserWrapper.querySelector(".zen-glance-sidebar-container"); if (this.#handleConfirmationTimeout(onTabClose, hasFocused, sidebarButtons)) { return; } - this.browserWrapper.removeAttribute('has-finished-animation'); + this.browserWrapper.removeAttribute("has-finished-animation"); if (noAnimation) { this.#clearContainerStyles(browserSidebarContainer); @@ -777,16 +809,12 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { return; } - return this.#animateGlanceClosing( - onTabClose, - browserSidebarContainer, - sidebarButtons, - setNewID - ); + this.#animateGlanceClosing(onTabClose, browserSidebarContainer, sidebarButtons, setNewID); } /** * Check if glance can be closed + * * @param {boolean} onTabClose - Whether this is called during tab close * @returns {boolean} True if can close */ @@ -801,6 +829,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Check if unload is permitted + * * @returns {boolean} True if unload is permitted */ #checkPermitUnload() { @@ -810,6 +839,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Handle confirmation timeout for focused close + * * @param {boolean} onTabClose - Whether this is called during tab close * @param {boolean} hasFocused - Has focus confirmation * @param {Element} sidebarButtons - The sidebar buttons element @@ -817,10 +847,10 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { */ #handleConfirmationTimeout(onTabClose, hasFocused, sidebarButtons) { if (onTabClose && hasFocused && !this.#confirmationTimeout && sidebarButtons) { - const cancelButton = sidebarButtons.querySelector('.zen-glance-sidebar-close'); - cancelButton.setAttribute('waitconfirmation', true); + const cancelButton = sidebarButtons.querySelector(".zen-glance-sidebar-close"); + cancelButton.setAttribute("waitconfirmation", true); this.#confirmationTimeout = setTimeout(() => { - cancelButton.removeAttribute('waitconfirmation'); + cancelButton.removeAttribute("waitconfirmation"); this.#confirmationTimeout = null; }, 3000); return true; @@ -830,11 +860,11 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Animate the glance closing process + * * @param {boolean} onTabClose - Whether this is called during tab close * @param {Element} browserSidebarContainer - The sidebar container * @param {Element} sidebarButtons - The sidebar buttons * @param {string} setNewID - New glance ID to set - * @returns {Promise} Promise that resolves when closing is complete */ #animateGlanceClosing(onTabClose, browserSidebarContainer, sidebarButtons, setNewID) { if (this.closingGlance) { @@ -855,7 +885,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { this.#animateSidebarButtons(sidebarButtons); this.#animateParentBackgroundClose(browserSidebarContainer); - return this.#executeClosingAnimation(setNewID, onTabClose); + this.#executeClosingAnimation(setNewID, onTabClose); } /** @@ -863,14 +893,15 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { */ #prepareGlanceForClosing() { // Critical: This line must not be touched - it works for unknown reasons - this.#currentTab.style.display = 'none'; - this.overlay.setAttribute('fade-out', true); - this.overlay.style.pointerEvents = 'none'; + this.#currentTab.style.display = "none"; + this.overlay.setAttribute("fade-out", true); + this.overlay.style.pointerEvents = "none"; this.quickCloseGlance({ justAnimateParent: true, clearID: false }); } /** * Animate sidebar buttons out + * * @param {Element} sidebarButtons - The sidebar buttons element */ #animateSidebarButtons(sidebarButtons) { @@ -881,7 +912,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { { opacity: [1, 0] }, { duration: 0.2, - type: 'spring', + type: "spring", bounce: this.#GLANCE_ANIMATION_DURATION - 0.1, } ) @@ -893,21 +924,22 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { #imageBitmapToBase64(imageBitmap) { // 1. Create a canvas with the same size as the ImageBitmap - const canvas = document.createElement('canvas'); + const canvas = document.createElement("canvas"); canvas.width = imageBitmap.width; canvas.height = imageBitmap.height; // 2. Draw the ImageBitmap onto the canvas - const ctx = canvas.getContext('2d'); + const ctx = canvas.getContext("2d"); ctx.drawImage(imageBitmap, 0, 0); // 3. Convert the canvas content to a Base64 string (PNG by default) - const base64String = canvas.toDataURL('image/png'); + const base64String = canvas.toDataURL("image/png"); return base64String; } /** * Animate parent background restoration + * * @param {Element} browserSidebarContainer - The sidebar container */ #animateParentBackgroundClose(browserSidebarContainer) { @@ -920,7 +952,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { }, { duration: this.#GLANCE_ANIMATION_DURATION / 1.5, - type: 'spring', + type: "spring", bounce: 0, } ) @@ -933,6 +965,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Execute the main closing animation + * * @param {string} setNewID - New glance ID to set * @param {boolean} onTabClose - Whether this is called during tab close * @returns {Promise} Promise that resolves when complete @@ -946,16 +979,16 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { // Create curved closing animation sequence const closingData = this.#createClosingDataFromOriginalPosition(originalPosition); - const arcSequence = this.#createGlanceArcSequence(closingData, 'closing'); + const arcSequence = this.#createGlanceArcSequence(closingData, "closing"); gZenUIManager.motion .animate(this.browserWrapper, arcSequence, { duration: this.#GLANCE_ANIMATION_DURATION, - ease: 'easeOut', + ease: "easeOut", }) .then(() => { // Remove element preview after closing animation - const elementPreview = this.browserWrapper.querySelector('.zen-glance-element-preview'); + const elementPreview = this.browserWrapper.querySelector(".zen-glance-element-preview"); if (elementPreview) { elementPreview.remove(); } @@ -966,11 +999,13 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Create closing data from original position for arc animation - * @param {Object} originalPosition - Original position object - * @returns {Object} Closing data object + * + * @param {object} originalPosition - Original position object + * @returns {object} Closing data object */ #createClosingDataFromOriginalPosition(originalPosition) { // Parse the original position values + // eslint-disable-next-line no-shadow const top = parseFloat(originalPosition.top) || 0; const left = parseFloat(originalPosition.left) || 0; const width = parseFloat(originalPosition.width) || 0; @@ -979,13 +1014,14 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { return { clientX: left - width / 2, clientY: top - height / 2, - width: width, - height: height, + width, + height, }; } /** * Add element preview if available, used for the closing animation + * * @param {string} elementImageData - The element image data */ #addElementPreview(elementImageData) { @@ -997,12 +1033,13 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Finalize the glance closing process + * * @param {string} setNewID - New glance ID to set * @param {Function} resolve - Promise resolve function * @param {boolean} onTabClose - Whether this is called during tab close */ #finalizeGlanceClosing(setNewID, resolve, onTabClose) { - this.browserWrapper.removeAttribute('animate'); + this.browserWrapper.removeAttribute("animate"); if (!this.#currentParentTab) { this.closingGlance = false; @@ -1012,9 +1049,9 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { if (!onTabClose) { this.quickCloseGlance({ clearID: false }); } - this.overlay.style.display = 'none'; - this.overlay.removeAttribute('fade-out'); - this.browserWrapper.removeAttribute('animate'); + this.overlay.style.display = "none"; + this.overlay.removeAttribute("fade-out"); + this.browserWrapper.removeAttribute("animate"); const lastCurrentTab = this.#currentTab; this.#cleanupGlanceElements(lastCurrentTab); @@ -1032,10 +1069,11 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Clean up glance DOM elements + * * @param {Tab} lastCurrentTab - The tab being closed */ #cleanupGlanceElements(lastCurrentTab) { - this.overlay.classList.remove('zen-glance-overlay'); + this.overlay.classList.remove("zen-glance-overlay"); gBrowser ._getSwitcher() .setTabStateNoAction(lastCurrentTab, gBrowser.AsyncTabSwitcher.STATE_UNLOADED); @@ -1050,7 +1088,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { if ( this.#currentParentTab.linkedBrowser && - !this.#currentParentTab.hasAttribute('split-view') + !this.#currentParentTab.hasAttribute("split-view") ) { this.#currentParentTab.linkedBrowser.zenModeActive = false; } @@ -1060,20 +1098,21 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { this.overlay = null; this.contentWrapper = null; - lastCurrentTab.removeAttribute('zen-glance-tab'); + lastCurrentTab.removeAttribute("zen-glance-tab"); this.#ignoreClose = true; - lastCurrentTab.dispatchEvent(new Event('GlanceClose', { bubbles: true })); + lastCurrentTab.dispatchEvent(new Event("GlanceClose", { bubbles: true })); gBrowser.removeTab(lastCurrentTab, { animate: true, skipPermitUnload: true }); gBrowser.tabContainer._invalidateCachedTabs(); } /** * Reset glance state + * * @param {string} setNewID - New glance ID to set */ #resetGlanceState(setNewID) { - this.#currentParentTab.removeAttribute('glance-id'); + this.#currentParentTab.removeAttribute("glance-id"); this.#glances.delete(this.#currentGlanceID); this.#currentGlanceID = setNewID; this.#duringOpening = false; @@ -1101,15 +1140,15 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { */ #configureGlanceElements() { const parentBrowserContainer = this.#currentParentTab.linkedBrowser.closest( - '.browserSidebarContainer' + ".browserSidebarContainer" ); - parentBrowserContainer.classList.add('zen-glance-background'); - parentBrowserContainer.classList.remove('zen-glance-overlay'); - parentBrowserContainer.classList.add('deck-selected'); + parentBrowserContainer.classList.add("zen-glance-background"); + parentBrowserContainer.classList.remove("zen-glance-overlay"); + parentBrowserContainer.classList.add("deck-selected"); - this.overlay.classList.add('deck-selected'); - this.overlay.classList.add('zen-glance-overlay'); + this.overlay.classList.add("deck-selected"); + this.overlay.classList.add("zen-glance-overlay"); } /** @@ -1120,14 +1159,15 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { this.#currentParentTab.linkedBrowser.docShellIsActive = true; this.#currentBrowser.zenModeActive = true; this.#currentBrowser.docShellIsActive = true; - this.#currentBrowser.setAttribute('zen-glance-selected', true); + this.#currentBrowser.setAttribute("zen-glance-selected", true); this.fillOverlay(this.#currentBrowser); this.#currentParentTab._visuallySelected = true; } /** * Quickly close glance without animation - * @param {Object} options - Close options + * + * @param {object} options - Close options * @param {boolean} options.closeCurrentTab - Close current tab * @param {boolean} options.closeParentTab - Close parent tab * @param {boolean} options.justAnimateParent - Only animate parent @@ -1141,7 +1181,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { } = {}) { const parentHasBrowser = !!this.#currentParentTab.linkedBrowser; const browserContainer = this.#currentParentTab.linkedBrowser.closest( - '.browserSidebarContainer' + ".browserSidebarContainer" ); this.#removeParentBackground(parentHasBrowser, browserContainer); @@ -1157,26 +1197,28 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Remove parent background styling + * * @param {boolean} parentHasBrowser - Whether parent has browser * @param {Element} browserContainer - The browser container */ #removeParentBackground(parentHasBrowser, browserContainer) { if (parentHasBrowser) { - browserContainer.classList.remove('zen-glance-background'); + browserContainer.classList.remove("zen-glance-background"); } } /** * Reset glance states + * * @param {boolean} closeCurrentTab - Whether to close current tab * @param {boolean} closeParentTab - Whether to close parent tab * @param {boolean} parentHasBrowser - Whether parent has browser * @param {Element} browserContainer - The browser container */ #resetGlanceStates(closeCurrentTab, closeParentTab, parentHasBrowser, browserContainer) { - if (parentHasBrowser && !this.#currentParentTab.hasAttribute('split-view')) { + if (parentHasBrowser && !this.#currentParentTab.hasAttribute("split-view")) { if (closeParentTab) { - browserContainer.classList.remove('deck-selected'); + browserContainer.classList.remove("deck-selected"); } this.#currentParentTab.linkedBrowser.zenModeActive = false; } @@ -1189,7 +1231,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { if (closeCurrentTab) { this.#currentBrowser.docShellIsActive = false; - this.overlay.classList.remove('deck-selected'); + this.overlay.classList.remove("deck-selected"); this.#currentTab._selected = false; } @@ -1197,12 +1239,13 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { this.#currentParentTab._visuallySelected = false; } - this.#currentBrowser.removeAttribute('zen-glance-selected'); - this.overlay.classList.remove('zen-glance-overlay'); + this.#currentBrowser.removeAttribute("zen-glance-selected"); + this.overlay.classList.remove("zen-glance-overlay"); } /** * Open glance on location change if not animating + * * @param {Tab} prevTab - The previous tab */ #onLocationChangeOpenGlance(prevTab) { @@ -1210,7 +1253,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { this.quickOpenGlance(); if (prevTab && prevTab.linkedBrowser) { prevTab.linkedBrowser.docShellIsActive = false; - prevTab.linkedBrowser.closest('.browserSidebarContainer').classList.remove('deck-selected'); + prevTab.linkedBrowser.closest(".browserSidebarContainer").classList.remove("deck-selected"); } } } @@ -1218,6 +1261,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Handle location change events * Note: Must be sync to avoid timing issues + * * @param {Event} event - The location change event */ onLocationChange(event) { @@ -1228,18 +1272,18 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { return; } - if (this.#duringOpening || !tab.hasAttribute('glance-id')) { + if (this.#duringOpening || !tab.hasAttribute("glance-id")) { if (this.#currentGlanceID && !this.#duringOpening) { this.quickCloseGlance(); } return; } - if (this.#currentGlanceID && this.#currentGlanceID !== tab.getAttribute('glance-id')) { + if (this.#currentGlanceID && this.#currentGlanceID !== tab.getAttribute("glance-id")) { this.quickCloseGlance(); } - this.#currentGlanceID = tab.getAttribute('glance-id'); + this.#currentGlanceID = tab.getAttribute("glance-id"); if (gBrowser.selectedTab === this.#currentTab) { this.#onLocationChangeOpenGlance(prevTab); return; @@ -1249,6 +1293,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Handle tab close events + * * @param {Event} event - The tab close event */ onTabClose(event) { @@ -1259,16 +1304,17 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Manage tab close for glance tabs + * * @param {Tab} tab - The tab being closed * @returns {boolean} Whether to continue with tab close */ manageTabClose(tab) { - if (!tab.hasAttribute('glance-id')) { + if (!tab.hasAttribute("glance-id")) { return false; } const oldGlanceID = this.#currentGlanceID; - const newGlanceID = tab.getAttribute('glance-id'); + const newGlanceID = tab.getAttribute("glance-id"); this.#currentGlanceID = newGlanceID; const isDifferent = newGlanceID !== oldGlanceID; @@ -1288,6 +1334,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Check if two tabs have different domains + * * @param {Tab} tab1 - First tab * @param {nsIURI} url2 - Second URL * @returns {boolean} True if domains differ @@ -1299,7 +1346,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { } const url1 = tab1.linkedBrowser.currentURI.spec; - if (url1.startsWith('about:')) { + if (url1.startsWith("about:")) { return true; } @@ -1318,15 +1365,17 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Check if URL is valid for glance + * * @param {string} urlSpec - The URL spec * @returns {boolean} True if valid */ #isValidGlanceUrl(urlSpec) { - return urlSpec.startsWith('http') || urlSpec.startsWith('https') || urlSpec.startsWith('file'); + return urlSpec.startsWith("http") || urlSpec.startsWith("https") || urlSpec.startsWith("file"); } /** * Check if a tab should be opened in glance + * * @param {Tab} tab - The tab to check * @param {nsIURI} uri - The URI to check * @returns {boolean} True if should open in glance @@ -1340,12 +1389,13 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { this._lazyPref.SHOULD_OPEN_EXTERNAL_TABS_IN_GLANCE && owner.linkedBrowser?.browsingContext?.isAppTab && this.tabDomainsDiffer(owner, uri) && - Services.prefs.getBoolPref('zen.glance.enabled', true) + Services.prefs.getBoolPref("zen.glance.enabled", true) ); } /** * Handle tab open events + * * @param {Browser} browser - The browser element * @param {nsIURI} uri - The URI being opened */ @@ -1360,12 +1410,13 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { this.#openGlanceForTab(tab); } } catch (e) { - console.error('Error opening glance for tab:', e); + console.error("Error opening glance for tab:", e); } } /** * Open glance for a specific tab + * * @param {Tab} tab - The tab to open glance for */ #openGlanceForTab(tab) { @@ -1384,7 +1435,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { finishOpeningGlance() { gBrowser.tabContainer._invalidateCachedTabs(); gZenWorkspaces.updateTabsContainers(); - this.overlay.classList.remove('zen-glance-overlay'); + this.overlay.classList.remove("zen-glance-overlay"); this.#clearContainerStyles(this.browserWrapper); this.animatingFullOpen = false; const glanceID = this.#currentGlanceID; @@ -1394,7 +1445,8 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Fully open glance (convert to regular tab) - * @param {Object} options - Options for full opening + * + * @param {object} options - Options for full opening * @param {boolean} options.forSplit - Whether this is for split view */ async fullyOpenGlance({ forSplit = false } = {}) { @@ -1403,7 +1455,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { } this.animatingFullOpen = true; - this.#currentTab.setAttribute('zen-dont-split-glance', true); + this.#currentTab.setAttribute("zen-dont-split-glance", true); this.#handleZenFolderPinning(); gBrowser.moveTabAfter(this.#currentTab, this.#currentParentTab); @@ -1411,7 +1463,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { const browserRect = window.windowUtils.getBoundsWithoutFlushing(this.browserWrapper); this.#prepareTabForFullOpen(); - const sidebarButtons = this.browserWrapper.querySelector('.zen-glance-sidebar-container'); + const sidebarButtons = this.browserWrapper.querySelector(".zen-glance-sidebar-container"); if (sidebarButtons) { sidebarButtons.remove(); } @@ -1436,7 +1488,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { */ #handleZenFolderPinning() { const isZenFolder = this.#currentParentTab?.group?.isZenFolder; - if (Services.prefs.getBoolPref('zen.folders.owned-tabs-in-folder') && isZenFolder) { + if (Services.prefs.getBoolPref("zen.folders.owned-tabs-in-folder") && isZenFolder) { gBrowser.pinTab(this.#currentTab); } } @@ -1445,22 +1497,23 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { * Prepare tab for full opening */ #prepareTabForFullOpen() { - this.#currentTab.removeAttribute('zen-glance-tab'); + this.#currentTab.removeAttribute("zen-glance-tab"); this.#clearContainerStyles(this.browserWrapper); - this.#currentTab.removeAttribute('glance-id'); - this.#currentParentTab.removeAttribute('glance-id'); + this.#currentTab.removeAttribute("glance-id"); + this.#currentParentTab.removeAttribute("glance-id"); gBrowser.selectedTab = this.#currentTab; this.#currentParentTab.linkedBrowser - .closest('.browserSidebarContainer') - .classList.remove('zen-glance-background'); + .closest(".browserSidebarContainer") + .classList.remove("zen-glance-background"); this.#currentParentTab._visuallySelected = false; gBrowser.TabStateFlusher.flush(this.#currentTab.linkedBrowser); } /** * Animate the full opening process - * @param {Object} browserRect - The browser rectangle + * + * @param {object} browserRect - The browser rectangle */ async #animateFullOpen(browserRect) { // Write styles early to avoid flickering @@ -1471,29 +1524,29 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { await gZenUIManager.motion.animate( this.browserWrapper, { - width: ['85%', '100%'], - height: ['100%', '100%'], + width: ["85%", "100%"], + height: ["100%", "100%"], }, { duration: this.#GLANCE_ANIMATION_DURATION, - type: 'spring', + type: "spring", bounce: 0, } ); - this.browserWrapper.style.width = ''; - this.browserWrapper.style.height = ''; - this.browserWrapper.style.opacity = ''; + this.browserWrapper.style.width = ""; + this.browserWrapper.style.height = ""; + this.browserWrapper.style.opacity = ""; gZenViewSplitter.deactivateCurrentSplitView({ removeDeckSelected: true }); } /** * Open glance for bookmark activation + * * @param {Event} event - The bookmark click event - * @returns {boolean} False to prevent default behavior */ openGlanceForBookmark(event) { - const activationMethod = Services.prefs.getStringPref('zen.glance.activation-method', 'ctrl'); + const activationMethod = Services.prefs.getStringPref("zen.glance.activation-method", "ctrl"); if (!this.#isActivationKeyPressed(event, activationMethod)) { return; @@ -1504,12 +1557,11 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { const data = this.#createGlanceDataFromBookmark(event); this.openGlance(data); - - return false; } /** * Check if the correct activation key is pressed + * * @param {Event} event - The event * @param {string} activationMethod - The activation method * @returns {boolean} True if key is pressed @@ -1527,14 +1579,16 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Create glance data from bookmark event + * * @param {Event} event - The bookmark event - * @returns {Object} Glance data object + * @returns {object} Glance data object */ #createGlanceDataFromBookmark(event) { const rect = window.windowUtils.getBoundsWithoutFlushing(event.target); const tabPanelRect = window.windowUtils.getBoundsWithoutFlushing(gBrowser.tabpanels); // the bookmark is most likely outisde the tabpanel, so we need to give a negative number // so it can be corrected later + // eslint-disable-next-line no-shadow let top = rect.top - tabPanelRect.top; let left = rect.left - tabPanelRect.left; return { @@ -1548,6 +1602,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Get the focused tab based on direction + * * @param {number} aDir - Direction (-1 for parent, 1 for current) * @returns {Tab} The focused tab */ @@ -1569,9 +1624,9 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { this.#handleZenFolderPinningForSplit(currentParentTab); await this.fullyOpenGlance({ forSplit: true }); - gZenViewSplitter.splitTabs([currentTab, currentParentTab], 'vsep', 1); + gZenViewSplitter.splitTabs([currentTab, currentParentTab], "vsep", 1); - const browserContainer = currentTab.linkedBrowser?.closest('.browserSidebarContainer'); + const browserContainer = currentTab.linkedBrowser?.closest(".browserSidebarContainer"); if (!gReduceMotion && browserContainer) { gZenViewSplitter.animateBrowserDrop(browserContainer); } @@ -1579,23 +1634,25 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Handle Zen folder pinning for split view + * * @param {Tab} parentTab - The parent tab */ #handleZenFolderPinningForSplit(parentTab) { const isZenFolder = parentTab?.group?.isZenFolder; - if (Services.prefs.getBoolPref('zen.folders.owned-tabs-in-folder') && isZenFolder) { + if (Services.prefs.getBoolPref("zen.folders.owned-tabs-in-folder") && isZenFolder) { gBrowser.pinTab(this.#currentTab); } } /** * Get the tab or its glance parent + * * @param {Tab} tab - The tab to check * @returns {Tab} The tab or its parent */ getTabOrGlanceParent(tab) { - if (tab?.hasAttribute('glance-id') && this.#glances) { - const parentTab = this.#glances.get(tab.getAttribute('glance-id'))?.parentTab; + if (tab?.hasAttribute("glance-id") && this.#glances) { + const parentTab = this.#glances.get(tab.getAttribute("glance-id"))?.parentTab; if (parentTab) { return parentTab; } @@ -1605,6 +1662,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Get the tab or its glance child + * * @param {Tab} tab - The tab to check * @returns {Tab} The tab or its child */ @@ -1614,13 +1672,14 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Check if deck should remain selected + * * @param {Element} currentPanel - Current panel * @param {Element} oldPanel - Previous panel * @returns {boolean} True if deck should remain selected */ shouldShowDeckSelected(currentPanel, oldPanel) { - const currentBrowser = currentPanel?.querySelector('browser'); - const oldBrowser = oldPanel?.querySelector('browser'); + const currentBrowser = currentPanel?.querySelector("browser"); + const oldBrowser = oldPanel?.querySelector("browser"); if (!currentBrowser || !oldBrowser) { return false; @@ -1633,12 +1692,12 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { return false; } - const currentGlanceID = currentTab.getAttribute('glance-id'); - const oldGlanceID = oldTab.getAttribute('glance-id'); + const currentGlanceID = currentTab.getAttribute("glance-id"); + const oldGlanceID = oldTab.getAttribute("glance-id"); if (currentGlanceID && oldGlanceID) { return ( - currentGlanceID === oldGlanceID && oldPanel.classList.contains('zen-glance-background') + currentGlanceID === oldGlanceID && oldPanel.classList.contains("zen-glance-background") ); } @@ -1647,6 +1706,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Handle search select command + * * @param {string} where - Where to open the search result */ onSearchSelectCommand(where) { @@ -1654,14 +1714,14 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { return; } - if (where !== 'tab') { + if (where !== "tab") { return; } const currentTab = gBrowser.selectedTab; const parentTab = currentTab.owner; - if (!parentTab || parentTab.hasAttribute('glance-id')) { + if (!parentTab || parentTab.hasAttribute("glance-id")) { return; } @@ -1670,17 +1730,19 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Check if glance is enabled for search + * * @returns {boolean} True if enabled */ #isGlanceEnabledForSearch() { return ( - Services.prefs.getBoolPref('zen.glance.enabled', false) && - Services.prefs.getBoolPref('zen.glance.enable-contextmenu-search', true) + Services.prefs.getBoolPref("zen.glance.enabled", false) && + Services.prefs.getBoolPref("zen.glance.enable-contextmenu-search", true) ); } /** * Open glance for search result + * * @param {Tab} currentTab - Current tab * @param {Tab} parentTab - Parent tab */ diff --git a/src/zen/glance/actors/ZenGlanceChild.sys.mjs b/src/zen/glance/actors/ZenGlanceChild.sys.mjs index 8de0fc65f..6d9324ed9 100644 --- a/src/zen/glance/actors/ZenGlanceChild.sys.mjs +++ b/src/zen/glance/actors/ZenGlanceChild.sys.mjs @@ -1,6 +1,7 @@ // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. + export class ZenGlanceChild extends JSWindowActorChild { #activationMethod; @@ -10,13 +11,13 @@ export class ZenGlanceChild extends JSWindowActorChild { async handleEvent(event) { const handler = this[`on_${event.type}`]; - if (typeof handler === 'function') { + if (typeof handler === "function") { await handler.call(this, event); } } async #initActivationMethod() { - this.#activationMethod = await this.sendQuery('ZenGlance:GetActivationMethod'); + this.#activationMethod = await this.sendQuery("ZenGlance:GetActivationMethod"); } #ensureOnlyKeyModifiers(event) { @@ -29,7 +30,7 @@ export class ZenGlanceChild extends JSWindowActorChild { if (!url.match(/^(?:[a-z]+:)?\/\//i)) { url = this.contentWindow.location.origin + url; } - this.sendAsyncMessage('ZenGlance:OpenGlance', { + this.sendAsyncMessage("ZenGlance:OpenGlance", { url, }); } @@ -49,7 +50,7 @@ export class ZenGlanceChild extends JSWindowActorChild { if (anchorRect.width * anchorRect.height > rect.width * rect.height) { rect = anchorRect; } - this.sendAsyncMessage('ZenGlance:RecordLinkClickData', { + this.sendAsyncMessage("ZenGlance:RecordLinkClickData", { clientX: rect.left, clientY: rect.top, width: rect.width, @@ -60,10 +61,12 @@ export class ZenGlanceChild extends JSWindowActorChild { /** * Returns the closest A element from the event target * and the element to record (originalTarget or target) + * + * @param {Event} event */ #getTargetFromEvent(event) { // get closest A element - const target = event.target.closest('A'); + const target = event.target.closest("A"); const elementToRecord = event.originalTarget || event.target; return { target, @@ -87,13 +90,13 @@ export class ZenGlanceChild extends JSWindowActorChild { return; } const activationMethod = this.#activationMethod; - if (activationMethod === 'ctrl' && !event.ctrlKey) { + if (activationMethod === "ctrl" && !event.ctrlKey) { return; - } else if (activationMethod === 'alt' && !event.altKey) { + } else if (activationMethod === "alt" && !event.altKey) { return; - } else if (activationMethod === 'shift' && !event.shiftKey) { + } else if (activationMethod === "shift" && !event.shiftKey) { return; - } else if (activationMethod === 'meta' && !event.metaKey) { + } else if (activationMethod === "meta" && !event.metaKey) { return; } event.preventDefault(); @@ -102,10 +105,10 @@ export class ZenGlanceChild extends JSWindowActorChild { } on_keydown(event) { - if (event.defaultPrevented || event.key !== 'Escape') { + if (event.defaultPrevented || event.key !== "Escape") { return; } - this.sendAsyncMessage('ZenGlance:CloseGlance', { + this.sendAsyncMessage("ZenGlance:CloseGlance", { hasFocused: this.contentWindow.document.activeElement !== this.contentWindow.document.body, }); } diff --git a/src/zen/glance/actors/ZenGlanceParent.sys.mjs b/src/zen/glance/actors/ZenGlanceParent.sys.mjs index 159a5f559..9c2aa9278 100644 --- a/src/zen/glance/actors/ZenGlanceParent.sys.mjs +++ b/src/zen/glance/actors/ZenGlanceParent.sys.mjs @@ -1,6 +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/. + +/* eslint-disable consistent-return */ + export class ZenGlanceParent extends JSWindowActorParent { constructor() { super(); @@ -8,14 +11,14 @@ export class ZenGlanceParent extends JSWindowActorParent { async receiveMessage(message) { switch (message.name) { - case 'ZenGlance:GetActivationMethod': { - return Services.prefs.getStringPref('zen.glance.activation-method', 'ctrl'); + case "ZenGlance:GetActivationMethod": { + return Services.prefs.getStringPref("zen.glance.activation-method", "ctrl"); } - case 'ZenGlance:OpenGlance': { + case "ZenGlance:OpenGlance": { this.openGlance(this.browsingContext.topChromeWindow, message.data); break; } - case 'ZenGlance:CloseGlance': { + case "ZenGlance:CloseGlance": { const params = { onTabClose: true, ...message.data, @@ -23,7 +26,7 @@ export class ZenGlanceParent extends JSWindowActorParent { this.browsingContext.topChromeWindow.gZenGlanceManager.closeGlance(params); break; } - case 'ZenGlance:RecordLinkClickData': { + case "ZenGlance:RecordLinkClickData": { this.browsingContext.topChromeWindow.gZenGlanceManager.lastLinkClickData = message.data; break; } diff --git a/src/zen/glance/tests/GlanceTestUtils.sys.mjs b/src/zen/glance/tests/GlanceTestUtils.sys.mjs index 08fbe8dee..97bebf25f 100644 --- a/src/zen/glance/tests/GlanceTestUtils.sys.mjs +++ b/src/zen/glance/tests/GlanceTestUtils.sys.mjs @@ -3,10 +3,11 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ export function openGlanceOnTab(window, callback, close = true) { + // eslint-disable-next-line no-async-promise-executor return new Promise(async (resolve) => { window.gZenGlanceManager .openGlance({ - url: 'https://example.com', + url: "https://example.com", clientX: 0, clientY: 0, width: 0, diff --git a/src/zen/glance/zen-glance.css b/src/zen/glance/zen-glance.css index 1a9188295..d272b815e 100644 --- a/src/zen/glance/zen-glance.css +++ b/src/zen/glance/zen-glance.css @@ -14,22 +14,18 @@ gap: 12px; max-width: 56px; - :root:not([zen-right-side='true']) & { + :root:not([zen-right-side="true"]) & { left: 100%; } - :root[zen-right-side='true'] & { + :root[zen-right-side="true"] & { right: 100%; } & toolbarbutton { width: 32px; height: 32px; - background: color-mix( - in srgb, - light-dark(rgb(24, 24, 24), rgb(231, 231, 231)) 96%, - var(--zen-primary-color) - ); + background: color-mix(in srgb, light-dark(rgb(24, 24, 24), rgb(231, 231, 231)) 96%, var(--zen-primary-color)); transition: background 0.05s ease, scale 0.05s ease; @@ -57,7 +53,7 @@ } } - &[disabled='true'] { + &[disabled="true"] { scale: 1 !important; & image { opacity: 0.5; @@ -93,7 +89,7 @@ } } -:root[zen-no-padding='true'] .browserSidebarContainer.zen-glance-background { +:root[zen-no-padding="true"] .browserSidebarContainer.zen-glance-background { --zen-native-inner-radius: 6px; --zen-element-separation: 6px; } @@ -103,7 +99,7 @@ } .browserSidebarContainer.zen-glance-background, -.browserSidebarContainer.zen-glance-overlay .browserContainer:not([fade-out='true']) { +.browserSidebarContainer.zen-glance-overlay .browserContainer:not([fade-out="true"]) { border-radius: var(--zen-native-inner-radius); } @@ -114,7 +110,7 @@ /* Hint compositor to optimize animations and scrolling */ will-change: transform, opacity, filter; - :root[zen-no-padding='true'] & { + :root[zen-no-padding="true"] & { --zen-native-inner-radius: 0px; } @@ -129,11 +125,11 @@ width: 85%; height: 100%; - &:not([has-finished-animation='true']) #statuspanel { + &:not([has-finished-animation="true"]) #statuspanel { display: none; } - &[has-finished-animation='true'] { + &[has-finished-animation="true"] { position: relative !important; transition: 0s !important; transform: none !important; @@ -154,12 +150,12 @@ height: 100%; } - &[animate='true'] { + &[animate="true"] { position: absolute; } } - &[fade-out='true'] { + &[fade-out="true"] { & .browserStack { transition: opacity 0.15s ease-in-out; opacity: 0; diff --git a/src/zen/kbs/ZenKeyboardShortcuts.mjs b/src/zen/kbs/ZenKeyboardShortcuts.mjs index b342a1081..a2765f114 100644 --- a/src/zen/kbs/ZenKeyboardShortcuts.mjs +++ b/src/zen/kbs/ZenKeyboardShortcuts.mjs @@ -2,114 +2,114 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -import { nsZenMultiWindowFeature } from 'chrome://browser/content/zen-components/ZenCommonUtils.mjs'; +import { nsZenMultiWindowFeature } from "chrome://browser/content/zen-components/ZenCommonUtils.mjs"; const KEYCODE_MAP = { - F1: 'VK_F1', - F2: 'VK_F2', - F3: 'VK_F3', - F4: 'VK_F4', - F5: 'VK_F5', - F6: 'VK_F6', - F7: 'VK_F7', - F8: 'VK_F8', - F9: 'VK_F9', - F10: 'VK_F10', - F11: 'VK_F11', - F12: 'VK_F12', - F13: 'VK_F13', - F14: 'VK_F14', - F15: 'VK_F15', - F16: 'VK_F16', - F17: 'VK_F17', - F18: 'VK_F18', - F19: 'VK_F19', - F20: 'VK_F20', - F21: 'VK_F21', - F22: 'VK_F22', - F23: 'VK_F23', - F24: 'VK_F24', - TAB: 'VK_TAB', - ENTER: 'VK_RETURN', - ESCAPE: 'VK_ESCAPE', - SPACE: 'VK_SPACE', - ARROWLEFT: 'VK_LEFT', - ARROWRIGHT: 'VK_RIGHT', - ARROWUP: 'VK_UP', - ARROWDOWN: 'VK_DOWN', - DELETE: 'VK_DELETE', - BACKSPACE: 'VK_BACK', - HOME: 'VK_HOME', - NUM_LOCK: 'VK_NUMLOCK', - SCROLL_LOCK: 'VK_SCROLL', + F1: "VK_F1", + F2: "VK_F2", + F3: "VK_F3", + F4: "VK_F4", + F5: "VK_F5", + F6: "VK_F6", + F7: "VK_F7", + F8: "VK_F8", + F9: "VK_F9", + F10: "VK_F10", + F11: "VK_F11", + F12: "VK_F12", + F13: "VK_F13", + F14: "VK_F14", + F15: "VK_F15", + F16: "VK_F16", + F17: "VK_F17", + F18: "VK_F18", + F19: "VK_F19", + F20: "VK_F20", + F21: "VK_F21", + F22: "VK_F22", + F23: "VK_F23", + F24: "VK_F24", + TAB: "VK_TAB", + ENTER: "VK_RETURN", + ESCAPE: "VK_ESCAPE", + SPACE: "VK_SPACE", + ARROWLEFT: "VK_LEFT", + ARROWRIGHT: "VK_RIGHT", + ARROWUP: "VK_UP", + ARROWDOWN: "VK_DOWN", + DELETE: "VK_DELETE", + BACKSPACE: "VK_BACK", + HOME: "VK_HOME", + NUM_LOCK: "VK_NUMLOCK", + SCROLL_LOCK: "VK_SCROLL", }; const defaultKeyboardGroups = { windowAndTabManagement: [ - 'zen-window-new-shortcut', - 'zen-new-unsynced-window-shortcut', - 'zen-tab-new-shortcut', - 'zen-key-enter-full-screen', - 'zen-key-exit-full-screen', - 'zen-quit-app-shortcut', - 'zen-close-all-unpinned-tabs-shortcut', - 'zen-close-tab-shortcut', - 'zen-close-shortcut', - 'id:key_selectTab1', - 'id:key_selectTab2', - 'id:key_selectTab3', - 'id:key_selectTab4', - 'id:key_selectTab5', - 'id:key_selectTab6', - 'id:key_selectTab7', - 'id:key_selectTab8', - 'id:key_selectLastTab', + "zen-window-new-shortcut", + "zen-new-unsynced-window-shortcut", + "zen-tab-new-shortcut", + "zen-key-enter-full-screen", + "zen-key-exit-full-screen", + "zen-quit-app-shortcut", + "zen-close-all-unpinned-tabs-shortcut", + "zen-close-tab-shortcut", + "zen-close-shortcut", + "id:key_selectTab1", + "id:key_selectTab2", + "id:key_selectTab3", + "id:key_selectTab4", + "id:key_selectTab5", + "id:key_selectTab6", + "id:key_selectTab7", + "id:key_selectTab8", + "id:key_selectLastTab", ], navigation: [ - 'zen-nav-back-shortcut-alt', - 'zen-nav-fwd-shortcut-alt', - 'zen-nav-reload-shortcut-2', - 'zen-nav-reload-shortcut-skip-cache', - 'zen-nav-reload-shortcut', - 'zen-key-stop', - 'zen-private-browsing-shortcut', - 'id:goHome', - 'id:key_gotoHistory', - 'id:goBackKb', - 'id:goForwardKb', + "zen-nav-back-shortcut-alt", + "zen-nav-fwd-shortcut-alt", + "zen-nav-reload-shortcut-2", + "zen-nav-reload-shortcut-skip-cache", + "zen-nav-reload-shortcut", + "zen-key-stop", + "zen-private-browsing-shortcut", + "id:goHome", + "id:key_gotoHistory", + "id:goBackKb", + "id:goForwardKb", ], searchAndFind: [ - 'zen-search-focus-shortcut', - 'zen-search-focus-shortcut-alt', - 'zen-find-shortcut', - 'zen-search-find-again-shortcut-2', - 'zen-search-find-again-shortcut', - 'zen-search-find-again-shortcut-prev', + "zen-search-focus-shortcut", + "zen-search-focus-shortcut-alt", + "zen-find-shortcut", + "zen-search-find-again-shortcut-2", + "zen-search-find-again-shortcut", + "zen-search-find-again-shortcut-prev", ], pageOperations: [ - 'zen-text-action-copy-url-markdown-shortcut', - 'zen-text-action-copy-url-shortcut', - 'zen-location-open-shortcut', - 'zen-location-open-shortcut-alt', - 'zen-save-page-shortcut', - 'zen-print-shortcut', - 'zen-page-source-shortcut', - 'zen-page-info-shortcut', - 'zen-reader-mode-toggle-shortcut-other', - 'zen-picture-in-picture-toggle-shortcut', + "zen-text-action-copy-url-markdown-shortcut", + "zen-text-action-copy-url-shortcut", + "zen-location-open-shortcut", + "zen-location-open-shortcut-alt", + "zen-save-page-shortcut", + "zen-print-shortcut", + "zen-page-source-shortcut", + "zen-page-info-shortcut", + "zen-reader-mode-toggle-shortcut-other", + "zen-picture-in-picture-toggle-shortcut", ], historyAndBookmarks: [ - 'zen-history-show-all-shortcut', - 'zen-bookmark-this-page-shortcut', - 'zen-bookmark-show-library-shortcut', + "zen-history-show-all-shortcut", + "zen-bookmark-this-page-shortcut", + "zen-bookmark-show-library-shortcut", ], mediaAndDisplay: [ - 'zen-mute-toggle-shortcut', - 'zen-full-zoom-reduce-shortcut', - 'zen-full-zoom-enlarge-shortcut', - 'zen-full-zoom-reset-shortcut', - 'zen-bidi-switch-direction-shortcut', - 'zen-screenshot-shortcut', + "zen-mute-toggle-shortcut", + "zen-full-zoom-reduce-shortcut", + "zen-full-zoom-enlarge-shortcut", + "zen-full-zoom-reset-shortcut", + "zen-bidi-switch-direction-shortcut", + "zen-screenshot-shortcut", ], devTools: [ /*Filled automatically*/ @@ -117,28 +117,28 @@ const defaultKeyboardGroups = { }; const fixedL10nIds = { - cmd_findPrevious: 'zen-search-find-again-shortcut-prev', - 'Browser:ReloadSkipCache': 'zen-nav-reload-shortcut-skip-cache', - cmd_close: 'zen-close-tab-shortcut', - 'History:RestoreLastClosedTabOrWindowOrSession': 'zen-restore-last-closed-tab-shortcut', + cmd_findPrevious: "zen-search-find-again-shortcut-prev", + "Browser:ReloadSkipCache": "zen-nav-reload-shortcut-skip-cache", + cmd_close: "zen-close-tab-shortcut", + "History:RestoreLastClosedTabOrWindowOrSession": "zen-restore-last-closed-tab-shortcut", }; -const ZEN_MAIN_KEYSET_ID = 'mainKeyset'; -const ZEN_DEVTOOLS_KEYSET_ID = 'devtoolsKeyset'; -window.ZEN_KEYSET_ID = 'zenKeyset'; +const ZEN_MAIN_KEYSET_ID = "mainKeyset"; +const ZEN_DEVTOOLS_KEYSET_ID = "devtoolsKeyset"; +window.ZEN_KEYSET_ID = "zenKeyset"; -const ZEN_COMPACT_MODE_SHORTCUTS_GROUP = 'zen-compact-mode'; -const ZEN_WORKSPACE_SHORTCUTS_GROUP = 'zen-workspace'; -const ZEN_OTHER_SHORTCUTS_GROUP = 'zen-other'; -const ZEN_SPLIT_VIEW_SHORTCUTS_GROUP = 'zen-split-view'; -const FIREFOX_SHORTCUTS_GROUP = 'zen-kbs-invalid'; +const ZEN_COMPACT_MODE_SHORTCUTS_GROUP = "zen-compact-mode"; +const ZEN_WORKSPACE_SHORTCUTS_GROUP = "zen-workspace"; +const ZEN_OTHER_SHORTCUTS_GROUP = "zen-other"; +const ZEN_SPLIT_VIEW_SHORTCUTS_GROUP = "zen-split-view"; +const FIREFOX_SHORTCUTS_GROUP = "zen-kbs-invalid"; window.VALID_SHORTCUT_GROUPS = [ ZEN_COMPACT_MODE_SHORTCUTS_GROUP, ZEN_WORKSPACE_SHORTCUTS_GROUP, ZEN_SPLIT_VIEW_SHORTCUTS_GROUP, ZEN_OTHER_SHORTCUTS_GROUP, ...Object.keys(defaultKeyboardGroups), - 'other', + "other", ]; export class nsKeyShortcutModifiers { @@ -155,7 +155,7 @@ export class nsKeyShortcutModifiers { this.#meta = meta; this.#accel = accel; - if (AppConstants.platform != 'macosx') { + if (AppConstants.platform != "macosx") { // Replace control with accel, to make it more consistent this.#accel = ctrl || accel; this.#control = false; @@ -168,11 +168,11 @@ export class nsKeyShortcutModifiers { } return new nsKeyShortcutModifiers( - modifiers['control'] == true, - modifiers['alt'] == true, - modifiers['shift'] == true, - modifiers['meta'] == true, - modifiers['accel'] == true + modifiers.control, + modifiers.alt, + modifiers.shift, + modifiers.meta, + modifiers.accel ); } @@ -182,11 +182,11 @@ export class nsKeyShortcutModifiers { } return new nsKeyShortcutModifiers( - modifiers.includes('control'), - modifiers.includes('alt'), - modifiers.includes('shift'), - modifiers.includes('meta'), - modifiers.includes('accel') + modifiers.includes("control"), + modifiers.includes("alt"), + modifiers.includes("shift"), + modifiers.includes("meta"), + modifiers.includes("accel") ); } @@ -196,26 +196,26 @@ export class nsKeyShortcutModifiers { } toDisplayString() { - let str = ''; - const separation = AppConstants.platform == 'macosx' ? ' ' : '+'; + let str = ""; + const separation = AppConstants.platform == "macosx" ? " " : "+"; if (this.#control && !this.#accel) { - str += AppConstants.platform == 'macosx' ? '⌃' : 'Ctrl'; + str += AppConstants.platform == "macosx" ? "⌃" : "Ctrl"; str += separation; } if (this.#meta) { - str += AppConstants.platform == 'macosx' ? '⌘' : 'Win'; + str += AppConstants.platform == "macosx" ? "⌘" : "Win"; str += separation; } if (this.#accel) { - str += AppConstants.platform == 'macosx' ? '⌘' : 'Ctrl'; + str += AppConstants.platform == "macosx" ? "⌘" : "Ctrl"; str += separation; } if (this.#alt) { - str += AppConstants.platform == 'macosx' ? '⌥' : 'Alt'; + str += AppConstants.platform == "macosx" ? "⌥" : "Alt"; str += separation; } if (this.#shift) { - str += '⇧'; + str += "⇧"; str += separation; } return str; @@ -230,7 +230,7 @@ export class nsKeyShortcutModifiers { this.#alt == other.#alt && this.#shift == other.#shift && this.#control == other.#control && - (AppConstants.platform == 'macosx' + (AppConstants.platform == "macosx" ? (this.#meta || this.#accel) == (other.#meta || other.#accel) && this.#control == other.#control : // In other platforms, we can have control and accel counting as the same thing @@ -240,21 +240,21 @@ export class nsKeyShortcutModifiers { } toString() { - let str = ''; + let str = ""; if (this.#control) { - str += 'control,'; + str += "control,"; } if (this.#accel) { - str += 'accel,'; + str += "accel,"; } if (this.#shift) { - str += 'shift,'; + str += "shift,"; } if (this.#alt) { - str += 'alt,'; + str += "alt,"; } if (this.#meta) { - str += 'meta,'; + str += "meta,"; } return str.slice(0, -1); } @@ -295,13 +295,13 @@ export class nsKeyShortcutModifiers { } class KeyShortcut { - #id = ''; - #key = ''; - #keycode = ''; + #id = ""; + #key = ""; + #keycode = ""; #group = FIREFOX_SHORTCUTS_GROUP; #modifiers = new nsKeyShortcutModifiers(false, false, false, false, false); - #action = ''; - #l10nId = ''; + #action = ""; + #l10nId = ""; #disabled = false; #reserved = false; #internal = false; @@ -323,7 +323,7 @@ class KeyShortcut { this.#keycode = keycode; if (!window.VALID_SHORTCUT_GROUPS.includes(group)) { - throw new Error('Illegal group value: ' + group); + throw new Error("Illegal group value: " + group); } this.#group = group; @@ -352,50 +352,50 @@ class KeyShortcut { // Find inside defaultKeyboardGroups for (let group of Object.keys(defaultKeyboardGroups)) { for (let shortcut of defaultKeyboardGroups[group]) { - if (shortcut == l10nId || shortcut == 'id:' + id) { + if (shortcut == l10nId || shortcut == "id:" + id) { return group; } } } - return 'other'; + return "other"; } static #parseFromJSON(json) { return new KeyShortcut( - json['id'], - json['key'], - json['keycode'], - json['group'], - nsKeyShortcutModifiers.parseFromJSON(json['modifiers']), - json['action'], - json['l10nId'], - json['disabled'], - json['reserved'], - json['internal'] + json.id, + json.key, + json.keycode, + json.group, + nsKeyShortcutModifiers.parseFromJSON(json.modifiers), + json.action, + json.l10nId, + json.disabled, + json.reserved, + json.internal ); } static parseFromXHTML(key, { group = undefined } = {}) { return new KeyShortcut( - key.getAttribute('id'), - key.getAttribute('key'), - key.getAttribute('keycode'), + key.getAttribute("id"), + key.getAttribute("key"), + key.getAttribute("keycode"), group ?? KeyShortcut.getGroupFromL10nId( - KeyShortcut.sanitizeL10nId(key.getAttribute('data-l10n-id')), - key.getAttribute('id') + KeyShortcut.sanitizeL10nId(key.getAttribute("data-l10n-id")), + key.getAttribute("id") ), - nsKeyShortcutModifiers.parseFromXHTMLAttribute(key.getAttribute('modifiers')), - key.getAttribute('command'), - key.getAttribute('data-l10n-id'), - key.getAttribute('disabled') == 'true', - key.getAttribute('reserved') == 'true', - key.getAttribute('internal') == 'true' + nsKeyShortcutModifiers.parseFromXHTMLAttribute(key.getAttribute("modifiers")), + key.getAttribute("command"), + key.getAttribute("data-l10n-id"), + key.getAttribute("disabled") == "true", + key.getAttribute("reserved") == "true", + key.getAttribute("internal") == "true" ); } static sanitizeL10nId(id, action) { - if (!id || id.startsWith('zen-')) { + if (!id || id.startsWith("zen-")) { return id; } // Check if any action is on the list of fixed l10n ids @@ -411,23 +411,23 @@ class KeyShortcut { } } - toXHTMLElement(window) { - let key = window.document.createXULElement('key'); + toXHTMLElement(aWindow) { + let key = aWindow.document.createXULElement("key"); return this.replaceWithChild(key); } replaceWithChild(key) { key.id = this.#id; if (this.#keycode) { - key.setAttribute('keycode', this.#keycode); - key.removeAttribute('key'); + key.setAttribute("keycode", this.#keycode); + key.removeAttribute("key"); } else { // note to "mr. macos": Better use setAttribute, because without it, there's a // risk of malforming the XUL element. - key.setAttribute('key', this.#key); - key.removeAttribute('keycode'); + key.setAttribute("key", this.#key); + key.removeAttribute("keycode"); } - key.setAttribute('group', this.#group); + key.setAttribute("group", this.#group); // note to "mr. macos": We add the `zen-` prefix because Firefox hasnt been built with the // shortcuts in mind, it will simply just override the shortcuts with whatever the default is. @@ -436,20 +436,20 @@ class KeyShortcut { if (this.#l10nId) { // key.setAttribute('data-l10n-id', this.#l10nId); } - key.setAttribute('modifiers', this.#modifiers.toString()); + key.setAttribute("modifiers", this.#modifiers.toString()); if (this.#action) { - key.setAttribute('command', this.#action); + key.setAttribute("command", this.#action); } if (this.#disabled) { - key.setAttribute('disabled', this.#disabled); + key.setAttribute("disabled", this.#disabled); } if (this.#reserved) { - key.setAttribute('reserved', this.#reserved); + key.setAttribute("reserved", this.#reserved); } if (this.#internal) { - key.setAttribute('internal', this.#internal); + key.setAttribute("internal", this.#internal); } - key.setAttribute('zen-keybind', 'true'); + key.setAttribute("zen-keybind", "true"); return key; } @@ -459,7 +459,7 @@ class KeyShortcut { } getRealKeycode() { - if (this.#keycode === '') { + if (this.#keycode === "") { return null; } return this.#keycode; @@ -515,12 +515,12 @@ class KeyShortcut { } isInvalid() { - return this.#key == '' && this.#keycode == '' && this.#l10nId == null; + return this.#key == "" && this.#keycode == "" && this.#l10nId == null; } setModifiers(modifiers) { if ((!modifiers) instanceof nsKeyShortcutModifiers) { - throw new Error('Only nsKeyShortcutModifiers allowed'); + throw new Error("Only nsKeyShortcutModifiers allowed"); } this.#modifiers = modifiers; } @@ -551,26 +551,26 @@ class KeyShortcut { if (value == this.#keycode) { const normalizedKey = key.toLowerCase(); switch (normalizedKey) { - case 'arrowleft': - str += '←'; + case "arrowleft": + str += "←"; break; - case 'arrowright': - str += '→'; + case "arrowright": + str += "→"; break; - case 'arrowup': - str += '↑'; + case "arrowup": + str += "↑"; break; - case 'arrowdown': - str += '↓'; + case "arrowdown": + str += "↓"; break; - case 'escape': - str += AppConstants.platform == 'macosx' ? '⎋' : 'Esc'; + case "escape": + str += AppConstants.platform == "macosx" ? "⎋" : "Esc"; break; - case 'enter': - str += AppConstants.platform == 'macosx' ? '↩' : 'Enter'; + case "enter": + str += AppConstants.platform == "macosx" ? "↩" : "Enter"; break; - case 'space': - str += AppConstants.platform == 'macosx' ? '␣' : 'Space'; + case "space": + str += AppConstants.platform == "macosx" ? "␣" : "Space"; break; default: str += normalizedKey; @@ -579,7 +579,7 @@ class KeyShortcut { } } } else { - return ''; + return ""; } return str; } @@ -592,8 +592,8 @@ class KeyShortcut { } clearKeybind() { - this.#key = ''; - this.#keycode = ''; + this.#key = ""; + this.#keycode = ""; this.#modifiers = new nsKeyShortcutModifiers(false, false, false, false); } @@ -601,12 +601,12 @@ class KeyShortcut { for (let keycode of Object.keys(KEYCODE_MAP)) { if (keycode == shortcut.toUpperCase()) { this.#keycode = KEYCODE_MAP[keycode]; - this.#key = ''; + this.#key = ""; return; } } - this.#keycode = ''; // Clear the keycode + this.#keycode = ""; // Clear the keycode this.#key = shortcut; } } @@ -615,7 +615,7 @@ class nsZenKeyboardShortcutsLoader { constructor() {} get shortcutsFile() { - return PathUtils.join(PathUtils.profileDir, 'zen-keyboard-shortcuts.json'); + return PathUtils.join(PathUtils.profileDir, "zen-keyboard-shortcuts.json"); } async save(data) { @@ -627,8 +627,8 @@ class nsZenKeyboardShortcutsLoader { return await IOUtils.readJSON(this.shortcutsFile); } catch (e) { // Recreate shortcuts file - Services.prefs.clearUserPref('zen.keyboard.shortcuts.version'); - console.warn('Error loading shortcuts file', e); + Services.prefs.clearUserPref("zen.keyboard.shortcuts.version"); + console.warn("Error loading shortcuts file", e); return null; } } @@ -650,7 +650,7 @@ class nsZenKeyboardShortcutsLoader { let newShortcutList = []; const correctDefaultShortcut = (shortcut) => { - if (shortcut.getID() === 'key_savePage') { + if (shortcut.getID() === "key_savePage") { shortcut.setModifiers( nsKeyShortcutModifiers.fromObject({ accel: true, alt: true, shift: true }) ); @@ -668,24 +668,24 @@ class nsZenKeyboardShortcutsLoader { // Compact mode's keyset newShortcutList.push( new KeyShortcut( - 'zen-compact-mode-toggle', - 'S', - '', + "zen-compact-mode-toggle", + "S", + "", ZEN_COMPACT_MODE_SHORTCUTS_GROUP, nsKeyShortcutModifiers.fromObject({ accel: true }), - 'cmd_zenCompactModeToggle', - 'zen-compact-mode-shortcut-toggle' + "cmd_zenCompactModeToggle", + "zen-compact-mode-shortcut-toggle" ) ); newShortcutList.push( new KeyShortcut( - 'zen-compact-mode-show-sidebar', - 'S', - '', + "zen-compact-mode-show-sidebar", + "S", + "", ZEN_COMPACT_MODE_SHORTCUTS_GROUP, nsKeyShortcutModifiers.fromObject({ accel: true, alt: true }), - 'cmd_zenCompactModeShowSidebar', - 'zen-compact-mode-shortcut-show-sidebar' + "cmd_zenCompactModeShowSidebar", + "zen-compact-mode-shortcut-show-sidebar" ) ); @@ -694,11 +694,11 @@ class nsZenKeyboardShortcutsLoader { newShortcutList.push( new KeyShortcut( `zen-workspace-switch-${i}`, - AppConstants.platform == 'macosx' ? `${i === 10 ? 0 : i}` : '', - '', + AppConstants.platform == "macosx" ? `${i === 10 ? 0 : i}` : "", + "", ZEN_WORKSPACE_SHORTCUTS_GROUP, nsKeyShortcutModifiers.fromObject( - AppConstants.platform == 'macosx' ? { ctrl: true } : {} + AppConstants.platform == "macosx" ? { ctrl: true } : {} ), `cmd_zenWorkspaceSwitch${i}`, `zen-workspace-shortcut-switch-${i}` @@ -707,70 +707,70 @@ class nsZenKeyboardShortcutsLoader { } newShortcutList.push( new KeyShortcut( - 'zen-workspace-forward', - '', - 'VK_RIGHT', + "zen-workspace-forward", + "", + "VK_RIGHT", ZEN_WORKSPACE_SHORTCUTS_GROUP, nsKeyShortcutModifiers.fromObject({ alt: true, accel: true }), - 'cmd_zenWorkspaceForward', - 'zen-workspace-shortcut-forward' + "cmd_zenWorkspaceForward", + "zen-workspace-shortcut-forward" ) ); newShortcutList.push( new KeyShortcut( - 'zen-workspace-backward', - '', - 'VK_LEFT', + "zen-workspace-backward", + "", + "VK_LEFT", ZEN_WORKSPACE_SHORTCUTS_GROUP, nsKeyShortcutModifiers.fromObject({ alt: true, accel: true }), - 'cmd_zenWorkspaceBackward', - 'zen-workspace-shortcut-backward' + "cmd_zenWorkspaceBackward", + "zen-workspace-shortcut-backward" ) ); // Split view newShortcutList.push( new KeyShortcut( - 'zen-split-view-grid', - 'G', - '', + "zen-split-view-grid", + "G", + "", ZEN_SPLIT_VIEW_SHORTCUTS_GROUP, nsKeyShortcutModifiers.fromObject({ accel: true, alt: true }), - 'cmd_zenSplitViewGrid', - 'zen-split-view-shortcut-grid' + "cmd_zenSplitViewGrid", + "zen-split-view-shortcut-grid" ) ); newShortcutList.push( new KeyShortcut( - 'zen-split-view-vertical', - 'V', - '', + "zen-split-view-vertical", + "V", + "", ZEN_SPLIT_VIEW_SHORTCUTS_GROUP, nsKeyShortcutModifiers.fromObject({ accel: true, alt: true }), - 'cmd_zenSplitViewVertical', - 'zen-split-view-shortcut-vertical' + "cmd_zenSplitViewVertical", + "zen-split-view-shortcut-vertical" ) ); newShortcutList.push( new KeyShortcut( - 'zen-split-view-horizontal', - 'H', - '', + "zen-split-view-horizontal", + "H", + "", ZEN_SPLIT_VIEW_SHORTCUTS_GROUP, nsKeyShortcutModifiers.fromObject({ accel: true, alt: true }), - 'cmd_zenSplitViewHorizontal', - 'zen-split-view-shortcut-horizontal' + "cmd_zenSplitViewHorizontal", + "zen-split-view-shortcut-horizontal" ) ); newShortcutList.push( new KeyShortcut( - 'zen-split-view-unsplit', - 'U', - '', + "zen-split-view-unsplit", + "U", + "", ZEN_SPLIT_VIEW_SHORTCUTS_GROUP, nsKeyShortcutModifiers.fromObject({ accel: true, alt: true }), - 'cmd_zenSplitViewUnsplit', - 'zen-split-view-shortcut-unsplit' + "cmd_zenSplitViewUnsplit", + "zen-split-view-shortcut-unsplit" ) ); @@ -779,12 +779,12 @@ class nsZenKeyboardShortcutsLoader { // Make sure to stay in sync with https://searchfox.org/mozilla-central/source/devtools/startup/DevToolsStartup.sys.mjs#879 static IGNORED_DEVTOOLS_SHORTCUTS = [ - 'key_toggleToolboxF12', - 'profilerStartStop', - 'profilerStartStopAlternate', - 'profilerCapture', - 'profilerCaptureAlternate', - 'javascriptTracingToggle', + "key_toggleToolboxF12", + "profilerStartStop", + "profilerStartStopAlternate", + "profilerCapture", + "profilerCaptureAlternate", + "javascriptTracingToggle", ]; static zenGetDefaultDevToolsShortcuts() { @@ -795,7 +795,7 @@ class nsZenKeyboardShortcutsLoader { if (this.IGNORED_DEVTOOLS_SHORTCUTS.includes(key.id)) { continue; } - let parsed = KeyShortcut.parseFromXHTML(key, { group: 'devTools' }); + let parsed = KeyShortcut.parseFromXHTML(key, { group: "devTools" }); newShortcutList.push(parsed); } @@ -809,11 +809,11 @@ class nsZenKeyboardShortcutsVersioner { constructor() {} get version() { - return Services.prefs.getIntPref('zen.keyboard.shortcuts.version', 0); + return Services.prefs.getIntPref("zen.keyboard.shortcuts.version", 0); } set version(version) { - Services.prefs.setIntPref('zen.keyboard.shortcuts.version', version); + Services.prefs.setIntPref("zen.keyboard.shortcuts.version", version); } getVersionedData(data) { @@ -842,10 +842,10 @@ class nsZenKeyboardShortcutsVersioner { if (this.isVersionOutdated()) { const version = this.version; - console.info( - 'Zen CKS: Migrating shortcuts from version', + console.warn( + "Zen CKS: Migrating shortcuts from version", version, - 'to', + "to", nsZenKeyboardShortcutsVersioner.LATEST_KBS_VERSION ); const newData = this.migrate(data, version); @@ -853,7 +853,7 @@ class nsZenKeyboardShortcutsVersioner { return newData; } - console.error('Unknown keyboard shortcuts version'); + console.error("Unknown keyboard shortcuts version"); this.version = 0; return this.migrateIfNeeded(data); } @@ -894,13 +894,13 @@ class nsZenKeyboardShortcutsVersioner { } data.push( new KeyShortcut( - 'zen-pinned-tab-reset-shortcut', - '', - '', + "zen-pinned-tab-reset-shortcut", + "", + "", ZEN_OTHER_SHORTCUTS_GROUP, nsKeyShortcutModifiers.fromObject({}), - 'cmd_zenPinnedTabReset', - 'zen-pinned-tab-shortcut-reset' + "cmd_zenPinnedTabReset", + "zen-pinned-tab-shortcut-reset" ) ); } @@ -924,20 +924,20 @@ class nsZenKeyboardShortcutsVersioner { // Migrate from 3 to 4 // In this new version, we are just removing the 'zen-toggle-sidebar' shortcut // since it's not used anymore. - data = data.filter((shortcut) => shortcut.getID() != 'zen-toggle-sidebar'); + data = data.filter((shortcut) => shortcut.getID() != "zen-toggle-sidebar"); } if (version < 5) { // Migrate from 4 to 5 // Here, we are adding the 'zen-toggle-sidebar' shortcut back, but with a new action data.push( new KeyShortcut( - 'zen-toggle-sidebar', - '', - '', + "zen-toggle-sidebar", + "", + "", ZEN_OTHER_SHORTCUTS_GROUP, nsKeyShortcutModifiers.fromObject({}), - 'cmd_zenToggleSidebar', - 'zen-sidebar-shortcut-toggle' + "cmd_zenToggleSidebar", + "zen-sidebar-shortcut-toggle" ) ); } @@ -946,13 +946,13 @@ class nsZenKeyboardShortcutsVersioner { // In this new version, we add the "Copy URL" shortcut to the default shortcuts data.push( new KeyShortcut( - 'zen-copy-url', - 'C', - '', + "zen-copy-url", + "C", + "", ZEN_OTHER_SHORTCUTS_GROUP, nsKeyShortcutModifiers.fromObject({ accel: true, shift: true }), - 'cmd_zenCopyCurrentURL', - 'zen-text-action-copy-url-shortcut' + "cmd_zenCopyCurrentURL", + "zen-text-action-copy-url-shortcut" ) ); } @@ -965,26 +965,26 @@ class nsZenKeyboardShortcutsVersioner { const devToolsShortcuts = nsZenKeyboardShortcutsLoader.zenGetDefaultDevToolsShortcuts(); gZenKeyboardShortcutsManager.updatedDefaultDevtoolsShortcuts(devToolsShortcuts); - window.removeEventListener('zen-devtools-keyset-added', listener); + window.removeEventListener("zen-devtools-keyset-added", listener); }; // We need to load after an event because the devtools keyset is not in the DOM yet // and we need to wait for it to be added. gZenKeyboardShortcutsManager._hasToLoadDefaultDevtools = true; - window.addEventListener('zen-devtools-keyset-added', listener); + window.addEventListener("zen-devtools-keyset-added", listener); } if (version < 8) { // Migrate from 7 to 8 // In this new version, we add the "Copy URL as Markdown" shortcut to the default shortcuts data.push( new KeyShortcut( - 'zen-copy-url-markdown', - 'C', - '', + "zen-copy-url-markdown", + "C", + "", ZEN_OTHER_SHORTCUTS_GROUP, nsKeyShortcutModifiers.fromObject({ accel: true, shift: true, alt: true }), - 'cmd_zenCopyCurrentURLMarkdown', - 'zen-text-action-copy-url-markdown-shortcut' + "cmd_zenCopyCurrentURLMarkdown", + "zen-text-action-copy-url-markdown-shortcut" ) ); } @@ -992,30 +992,30 @@ class nsZenKeyboardShortcutsVersioner { // Migrate from version 8 to 9 // Due to security concerns, replace "code:" actions with corresponding IDs // we also remove 'zen-toggle-web-panel' since it's not used anymore - data = data.filter((shortcut) => shortcut.getID() != 'zen-toggle-web-panel'); + data = data.filter((shortcut) => shortcut.getID() != "zen-toggle-web-panel"); for (let shortcut of data) { - if (shortcut.getAction()?.startsWith('code:')) { + if (shortcut.getAction()?.startsWith("code:")) { const id = shortcut.getID(); // Map old shortcut IDs to new IDs const commandMap = { - 'zen-compact-mode-toggle': 'cmd_zenCompactModeToggle', - 'zen-compact-mode-show-sidebar': 'cmd_zenCompactModeShowSidebar', - 'zen-workspace-forward': 'cmd_zenWorkspaceForward', - 'zen-workspace-backward': 'cmd_zenWorkspaceBackward', - 'zen-split-view-grid': 'cmd_zenSplitViewGrid', - 'zen-split-view-vertical': 'cmd_zenSplitViewVertical', - 'zen-split-view-horizontal': 'cmd_zenSplitViewHorizontal', - 'zen-split-view-unsplit': 'cmd_zenSplitViewUnsplit', - 'zen-copy-url': 'cmd_zenCopyCurrentURL', - 'zen-copy-url-markdown': 'cmd_zenCopyCurrentURLMarkdown', - 'zen-pinned-tab-reset-shortcut': 'cmd_zenPinnedTabReset', - 'zen-toggle-sidebar': 'cmd_zenToggleSidebar', + "zen-compact-mode-toggle": "cmd_zenCompactModeToggle", + "zen-compact-mode-show-sidebar": "cmd_zenCompactModeShowSidebar", + "zen-workspace-forward": "cmd_zenWorkspaceForward", + "zen-workspace-backward": "cmd_zenWorkspaceBackward", + "zen-split-view-grid": "cmd_zenSplitViewGrid", + "zen-split-view-vertical": "cmd_zenSplitViewVertical", + "zen-split-view-horizontal": "cmd_zenSplitViewHorizontal", + "zen-split-view-unsplit": "cmd_zenSplitViewUnsplit", + "zen-copy-url": "cmd_zenCopyCurrentURL", + "zen-copy-url-markdown": "cmd_zenCopyCurrentURLMarkdown", + "zen-pinned-tab-reset-shortcut": "cmd_zenPinnedTabReset", + "zen-toggle-sidebar": "cmd_zenToggleSidebar", }; // Dynamically handle workspace switch shortcuts (zen-workspace-switch-1 to 10) - if (id?.startsWith('zen-workspace-switch-')) { - const num = id.replace('zen-workspace-switch-', ''); + if (id?.startsWith("zen-workspace-switch-")) { + const num = id.replace("zen-workspace-switch-", ""); commandMap[id] = `cmd_zenWorkspaceSwitch${num}`; } @@ -1031,26 +1031,26 @@ class nsZenKeyboardShortcutsVersioner { // 1) Add the new pin/unpin tab toggle shortcut with Ctrl+Shift+D data.push( new KeyShortcut( - 'zen-toggle-pin-tab', - 'D', - '', + "zen-toggle-pin-tab", + "D", + "", ZEN_OTHER_SHORTCUTS_GROUP, nsKeyShortcutModifiers.fromObject({ accel: true, shift: true }), - 'cmd_zenTogglePinTab', - 'zen-toggle-pin-tab-shortcut' + "cmd_zenTogglePinTab", + "zen-toggle-pin-tab-shortcut" ) ); // 2) Add shortcut to expand Glance into a full tab: Default Accel+O data.push( new KeyShortcut( - 'zen-glance-expand', - 'O', - '', + "zen-glance-expand", + "O", + "", ZEN_OTHER_SHORTCUTS_GROUP, nsKeyShortcutModifiers.fromObject({ accel: true }), - 'cmd_zenGlanceExpand', - '' + "cmd_zenGlanceExpand", + "" ) ); } @@ -1059,13 +1059,13 @@ class nsZenKeyboardShortcutsVersioner { // Migrate from version 10 to 11 data.push( new KeyShortcut( - 'zen-new-empty-split-view', - AppConstants.platform == 'macosx' ? '+' : '*', - '', + "zen-new-empty-split-view", + AppConstants.platform == "macosx" ? "+" : "*", + "", ZEN_SPLIT_VIEW_SHORTCUTS_GROUP, nsKeyShortcutModifiers.fromObject({ accel: true, shift: true }), - 'cmd_zenNewEmptySplit', - 'zen-new-empty-split-view-shortcut' + "cmd_zenNewEmptySplit", + "zen-new-empty-split-view-shortcut" ) ); } @@ -1075,7 +1075,7 @@ class nsZenKeyboardShortcutsVersioner { // - Remove the built-in "Open File" keybinding; menu item remains available // - Remove default "Bookmark All Tabs" keybinding (Ctrl+Shift+D) to avoid conflict // - Remove "Stop" keybinding to avoid conflict with Firefox's built-in binding - const shouldBeEmptyShortcuts = ['openFileKb', 'bookmarkAllTabsKb', 'key_stop']; + const shouldBeEmptyShortcuts = ["openFileKb", "bookmarkAllTabsKb", "key_stop"]; for (let shortcut of data) { if (shouldBeEmptyShortcuts.includes(shortcut.getID?.())) { shortcut.shouldBeEmpty = true; @@ -1083,7 +1083,7 @@ class nsZenKeyboardShortcutsVersioner { } // Also remove zen-compact-mode-show-toolbar - data = data.filter((shortcut) => shortcut.getID() != 'zen-compact-mode-show-toolbar'); + data = data.filter((shortcut) => shortcut.getID() != "zen-compact-mode-show-toolbar"); } if (version < 13) { @@ -1091,13 +1091,13 @@ class nsZenKeyboardShortcutsVersioner { // Add shortcut to close all unpinned tabs: Default Accel+Shift+K data.push( new KeyShortcut( - 'zen-close-all-unpinned-tabs', - 'K', - '', + "zen-close-all-unpinned-tabs", + "K", + "", ZEN_WORKSPACE_SHORTCUTS_GROUP, nsKeyShortcutModifiers.fromObject({ accel: true, shift: true }), - 'cmd_zenCloseUnpinnedTabs', - 'zen-close-all-unpinned-tabs-shortcut' + "cmd_zenCloseUnpinnedTabs", + "zen-close-all-unpinned-tabs-shortcut" ) ); } @@ -1107,13 +1107,13 @@ class nsZenKeyboardShortcutsVersioner { // Add shortcut to open a new unsynced window: Default accelt+option+N (Ctrl+Alt+N on non-macOS) data.push( new KeyShortcut( - 'zen-new-unsynced-window', - 'N', - '', + "zen-new-unsynced-window", + "N", + "", ZEN_OTHER_SHORTCUTS_GROUP, nsKeyShortcutModifiers.fromObject({ accel: true, alt: true }), - 'cmd_zenNewNavigatorUnsynced', - 'zen-new-unsynced-window-shortcut' + "cmd_zenNewNavigatorUnsynced", + "zen-new-unsynced-window-shortcut" ) ); } @@ -1137,10 +1137,10 @@ window.gZenKeyboardShortcutsManager = { void this.getZenKeyset(); this._hasCleared = Services.prefs.getBoolPref( - 'zen.keyboard.shortcuts.disable-mainkeyset-clear', + "zen.keyboard.shortcuts.disable-mainkeyset-clear", false ); - window.addEventListener('zen-devtools-keyset-added', this._hasAddedDevtoolShortcuts.bind(this)); + window.addEventListener("zen-devtools-keyset-added", this._hasAddedDevtoolShortcuts.bind(this)); this.init(); }, @@ -1157,25 +1157,25 @@ window.gZenKeyboardShortcutsManager = { }, get inBrowserView() { - return window.location.href == 'chrome://browser/content/browser.xhtml'; + return window.location.href == "chrome://browser/content/browser.xhtml"; }, async _loadSaved() { var innerLoad = async () => { let data = await this.loader.load(); - if (!data || data.length == 0) { + if (!data || !data.length) { return null; } try { return KeyShortcut.parseFromSaved(data); } catch (e) { - console.error('Zen CKS: Error parsing saved shortcuts. Resetting to defaults...', e); + console.error("Zen CKS: Error parsing saved shortcuts. Resetting to defaults...", e); gNotificationBox.appendNotification( - 'zen-shortcuts-corrupted', + "zen-shortcuts-corrupted", { - label: { 'l10n-id': 'zen-shortcuts-corrupted' }, - image: 'chrome://browser/skin/notification-icons/persistent-storage-blocked.svg', + label: { "l10n-id": "zen-shortcuts-corrupted" }, + image: "chrome://browser/skin/notification-icons/persistent-storage-blocked.svg", priority: gNotificationBox.PRIORITY_WARNING_HIGH, }, [] @@ -1197,7 +1197,7 @@ window.gZenKeyboardShortcutsManager = { return browser.gZenKeyboardShortcutsManager._zenKeyset; } - throw new Error('Zen keyset not found'); + throw new Error("Zen keyset not found"); } return browser.gZenKeyboardShortcutsManager._zenKeyset; }, @@ -1212,7 +1212,7 @@ window.gZenKeyboardShortcutsManager = { return existingKeyset; } - this._zenDevtoolsKeyset = document.createXULElement('keyset'); + this._zenDevtoolsKeyset = document.createXULElement("keyset"); this._zenDevtoolsKeyset.id = id; const mainKeyset = document.getElementById(ZEN_DEVTOOLS_KEYSET_ID); @@ -1229,13 +1229,14 @@ window.gZenKeyboardShortcutsManager = { const children = element.children; for (let i = children.length - 1; i >= 0; i--) { const key = children[i]; - if (key.getAttribute('internal') == 'true') { + if (key.getAttribute("internal") == "true") { continue; } key.remove(); } // Restore the keyset, https://searchfox.org/mozilla-central/rev/a59018f9ff34170810b43e12bf6f09a1512de7ab/dom/events/GlobalKeyListener.cpp#478 + // eslint-disable-next-line no-shadow const parent = element.parentElement; element.remove(); parent.prepend(element); @@ -1260,12 +1261,12 @@ window.gZenKeyboardShortcutsManager = { for (const browser of nsZenMultiWindowFeature.browsers) { let mainKeyset = browser.document.getElementById(ZEN_MAIN_KEYSET_ID); if (!mainKeyset) { - throw new Error('Main keyset not found'); + throw new Error("Main keyset not found"); } browser.gZenKeyboardShortcutsManager.clearMainKeyset(mainKeyset); const keyset = this.getZenKeyset(browser); - keyset.innerHTML = ''; + keyset.innerHTML = ""; // We dont check this anymore since we are skiping internal keys //if (mainKeyset.children.length > 0) { @@ -1291,7 +1292,7 @@ window.gZenKeyboardShortcutsManager = { } let devtoolsKeyset = browser.gZenKeyboardShortcutsManager.getZenDevtoolsKeyset(browser); for (let key of this._currentShortcutList) { - if (key.getGroup() != 'devTools') { + if (key.getGroup() != "devTools") { continue; } if (nsZenKeyboardShortcutsLoader.IGNORED_DEVTOOLS_SHORTCUTS.includes(key.getID())) { @@ -1315,7 +1316,7 @@ window.gZenKeyboardShortcutsManager = { async resetAllShortcuts() { await this.loader.remove(); - Services.prefs.clearUserPref('zen.keyboard.shortcuts.version'); + Services.prefs.clearUserPref("zen.keyboard.shortcuts.version"); }, async _saveShortcuts() { @@ -1333,7 +1334,7 @@ window.gZenKeyboardShortcutsManager = { async setShortcut(action, shortcut, modifiers) { if (!action) { - throw new Error('Action cannot be null'); + throw new Error("Action cannot be null"); } // Unsetting shortcut @@ -1403,6 +1404,7 @@ window.gZenKeyboardShortcutsManager = { /** * Get the shortcut as a display format for a given action/command. + * * @param {string} command The action/command to search for * @returns {string|null} The shortcut as a string or null if not found */ diff --git a/src/zen/media/ZenMediaController.mjs b/src/zen/media/ZenMediaController.mjs index f3566c028..9a396fc84 100644 --- a/src/zen/media/ZenMediaController.mjs +++ b/src/zen/media/ZenMediaController.mjs @@ -5,11 +5,15 @@ const lazy = {}; XPCOMUtils.defineLazyPreferenceGetter( lazy, - 'RESPECT_PIP_DISABLED', - 'media.videocontrols.picture-in-picture.respect-disablePictureInPicture', + "RESPECT_PIP_DISABLED", + "media.videocontrols.picture-in-picture.respect-disablePictureInPicture", true ); +/** + * Zen Media Controller, handles the small media control bar UI and interactions + * located at the bottom of the sidebar. + */ class nsZenMediaController { _currentMediaController = null; _currentBrowser = null; @@ -24,7 +28,7 @@ class nsZenMediaController { mediaFocusButton = null; mediaProgressBarContainer = null; - supportedKeys = ['playpause', 'previoustrack', 'nexttrack']; + supportedKeys = ["playpause", "previoustrack", "nexttrack"]; mediaControllersMap = new Map(); _tabTimeout = null; @@ -33,16 +37,18 @@ class nsZenMediaController { #isSeeking = false; init() { - if (!Services.prefs.getBoolPref('zen.mediacontrols.enabled', true)) return; + if (!Services.prefs.getBoolPref("zen.mediacontrols.enabled", true)) { + return; + } - this.mediaTitle = document.querySelector('#zen-media-title'); - this.mediaArtist = document.querySelector('#zen-media-artist'); - this.mediaControlBar = document.querySelector('#zen-media-controls-toolbar'); - this.mediaProgressBar = document.querySelector('#zen-media-progress-bar'); - this.mediaCurrentTime = document.querySelector('#zen-media-current-time'); - this.mediaDuration = document.querySelector('#zen-media-duration'); - this.mediaFocusButton = document.querySelector('#zen-media-focus-button'); - this.mediaProgressBarContainer = document.querySelector('#zen-media-progress-hbox'); + this.mediaTitle = document.querySelector("#zen-media-title"); + this.mediaArtist = document.querySelector("#zen-media-artist"); + this.mediaControlBar = document.querySelector("#zen-media-controls-toolbar"); + this.mediaProgressBar = document.querySelector("#zen-media-progress-bar"); + this.mediaCurrentTime = document.querySelector("#zen-media-current-time"); + this.mediaDuration = document.querySelector("#zen-media-duration"); + this.mediaFocusButton = document.querySelector("#zen-media-focus-button"); + this.mediaProgressBarContainer = document.querySelector("#zen-media-progress-hbox"); this.onPositionstateChange = this._onPositionstateChange.bind(this); this.onPlaybackstateChange = this._onPlaybackstateChange.bind(this); @@ -55,50 +61,56 @@ class nsZenMediaController { } #initEventListeners() { - this.mediaControlBar.addEventListener('mousedown', (event) => { - if (event.target.closest(':is(toolbarbutton,#zen-media-progress-hbox)')) return; - else this.onMediaFocus(); + this.mediaControlBar.addEventListener("mousedown", (event) => { + if (event.target.closest(":is(toolbarbutton,#zen-media-progress-hbox)")) { + return; + } + this.onMediaFocus(); }); - this.mediaControlBar.addEventListener('command', (event) => { - const button = event.target.closest('toolbarbutton'); - if (!button) return; + this.mediaControlBar.addEventListener("command", (event) => { + const button = event.target.closest("toolbarbutton"); + if (!button) { + return; + } switch (button.id) { - case 'zen-media-pip-button': + case "zen-media-pip-button": this.onMediaPip(); break; - case 'zen-media-close-button': + case "zen-media-close-button": this.onControllerClose(); break; - case 'zen-media-focus-button': + case "zen-media-focus-button": this.onMediaFocus(); break; - case 'zen-media-mute-button': + case "zen-media-mute-button": this.onMediaMute(); break; - case 'zen-media-previoustrack-button': + case "zen-media-previoustrack-button": this.onMediaPlayPrev(); break; - case 'zen-media-nexttrack-button': + case "zen-media-nexttrack-button": this.onMediaPlayNext(); break; - case 'zen-media-playpause-button': + case "zen-media-playpause-button": this.onMediaToggle(); break; - case 'zen-media-mute-mic-button': + case "zen-media-mute-mic-button": this.onMicrophoneMuteToggle(); break; - case 'zen-media-mute-camera-button': + case "zen-media-mute-camera-button": this.onCameraMuteToggle(); break; } }); - this.mediaProgressBar.addEventListener('input', this.onMediaSeekDrag.bind(this)); - this.mediaProgressBar.addEventListener('change', this.onMediaSeekComplete.bind(this)); + this.mediaProgressBar.addEventListener("input", this.onMediaSeekDrag.bind(this)); + this.mediaProgressBar.addEventListener("change", this.onMediaSeekComplete.bind(this)); - window.addEventListener('TabSelect', (event) => { - if (this.isSharing) return; + window.addEventListener("TabSelect", (event) => { + if (this.isSharing) { + return; + } const linkedBrowser = event.target.linkedBrowser; this.switchController(); @@ -113,8 +125,11 @@ class nsZenMediaController { this.hideMediaControls(); } else { this._tabTimeout = setTimeout(() => { - if (!this.mediaControlBar.hasAttribute('pip')) this.showMediaControls(); - else this._tabTimeout = null; + if (!this.mediaControlBar.hasAttribute("pip")) { + this.showMediaControls(); + } else { + this._tabTimeout = null; + } }, 500); } } @@ -122,15 +137,15 @@ class nsZenMediaController { const onTabDiscardedOrClosed = this.onTabDiscardedOrClosed.bind(this); - window.addEventListener('TabClose', onTabDiscardedOrClosed); - window.addEventListener('TabBrowserDiscarded', onTabDiscardedOrClosed); + window.addEventListener("TabClose", onTabDiscardedOrClosed); + window.addEventListener("TabBrowserDiscarded", onTabDiscardedOrClosed); - window.addEventListener('DOMAudioPlaybackStarted', (event) => { + window.addEventListener("DOMAudioPlaybackStarted", (event) => { setTimeout(() => { if ( this._currentMediaController?.isPlaying && - this.mediaControlBar.hasAttribute('hidden') && - !this.mediaControlBar.hasAttribute('pip') + this.mediaControlBar.hasAttribute("hidden") && + !this.mediaControlBar.hasAttribute("pip") ) { const { selectedBrowser } = gBrowser; if (selectedBrowser.browserId !== this._currentBrowser.browserId) { @@ -142,7 +157,7 @@ class nsZenMediaController { this.activateMediaControls(event.target.browsingContext.mediaController, event.target); }); - window.addEventListener('DOMAudioPlaybackStopped', () => this.updateMuteState()); + window.addEventListener("DOMAudioPlaybackStopped", () => this.updateMuteState()); } onTabDiscardedOrClosed(event) { @@ -171,12 +186,12 @@ class nsZenMediaController { shouldHide = true ) { if (shouldForget && mediaController) { - mediaController.removeEventListener('pictureinpicturemodechange', this.onPipModeChange); - mediaController.removeEventListener('positionstatechange', this.onPositionstateChange); - mediaController.removeEventListener('playbackstatechange', this.onPlaybackstateChange); - mediaController.removeEventListener('supportedkeyschange', this.onSupportedKeysChange); - mediaController.removeEventListener('metadatachange', this.onMetadataChange); - mediaController.removeEventListener('deactivated', this.onDeactivated); + mediaController.removeEventListener("pictureinpicturemodechange", this.onPipModeChange); + mediaController.removeEventListener("positionstatechange", this.onPositionstateChange); + mediaController.removeEventListener("playbackstatechange", this.onPlaybackstateChange); + mediaController.removeEventListener("supportedkeyschange", this.onSupportedKeysChange); + mediaController.removeEventListener("metadatachange", this.onMetadataChange); + mediaController.removeEventListener("deactivated", this.onDeactivated); this.mediaControllersMap.delete(mediaController.id); } @@ -190,36 +205,40 @@ class nsZenMediaController { this._mediaUpdateInterval = null; } - if (shouldHide) await this.hideMediaControls(); - this.mediaControlBar.removeAttribute('muted'); - this.mediaControlBar.classList.remove('playing'); + if (shouldHide) { + await this.hideMediaControls(); + } + this.mediaControlBar.removeAttribute("muted"); + this.mediaControlBar.classList.remove("playing"); } } get isSharing() { - return this.mediaControlBar.hasAttribute('media-sharing'); + return this.mediaControlBar.hasAttribute("media-sharing"); } set isSharing(value) { if (this._currentBrowser?.browsingContext && !value) { - const webRTC = this._currentBrowser.browsingContext.currentWindowGlobal.getActor('WebRTC'); - webRTC.sendAsyncMessage('webrtc:UnmuteMicrophone'); - webRTC.sendAsyncMessage('webrtc:UnmuteCamera'); + const webRTC = this._currentBrowser.browsingContext.currentWindowGlobal.getActor("WebRTC"); + webRTC.sendAsyncMessage("webrtc:UnmuteMicrophone"); + webRTC.sendAsyncMessage("webrtc:UnmuteCamera"); } if (!value) { - this.mediaControlBar.removeAttribute('mic-muted'); - this.mediaControlBar.removeAttribute('camera-muted'); + this.mediaControlBar.removeAttribute("mic-muted"); + this.mediaControlBar.removeAttribute("camera-muted"); } else { - this.mediaControlBar.setAttribute('media-position-hidden', ''); - this.mediaControlBar.setAttribute('media-sharing', ''); + this.mediaControlBar.setAttribute("media-position-hidden", ""); + this.mediaControlBar.setAttribute("media-sharing", ""); } } hideMediaControls() { - if (this.mediaControlBar.hasAttribute('hidden')) return; + if (this.mediaControlBar.hasAttribute("hidden")) { + return; + } - return gZenUIManager.motion + gZenUIManager.motion .animate( this.mediaControlBar, { @@ -231,32 +250,38 @@ class nsZenMediaController { } ) .then(() => { - this.mediaControlBar.setAttribute('hidden', 'true'); - this.mediaControlBar.removeAttribute('media-sharing'); + this.mediaControlBar.setAttribute("hidden", "true"); + this.mediaControlBar.removeAttribute("media-sharing"); gZenUIManager.updateTabsToolbar(); }); } showMediaControls() { - if (!this.mediaControlBar.hasAttribute('hidden')) return; + if (!this.mediaControlBar.hasAttribute("hidden")) { + return; + } if (!this.isSharing) { - if (!this._currentMediaController) return; - if (this._currentMediaController.isBeingUsedInPIPModeOrFullscreen) - return this.hideMediaControls(); + if (!this._currentMediaController) { + return; + } + if (this._currentMediaController.isBeingUsedInPIPModeOrFullscreen) { + this.hideMediaControls(); + return; + } this.updatePipButton(); } const mediaInfoElements = [this.mediaTitle, this.mediaArtist]; for (const element of mediaInfoElements) { - element.removeAttribute('overflow'); // So we can properly recalculate the overflow + element.removeAttribute("overflow"); // So we can properly recalculate the overflow } - this.mediaControlBar.removeAttribute('hidden'); + this.mediaControlBar.removeAttribute("hidden"); window.requestAnimationFrame(() => { this.mediaControlBar.style.height = - this.mediaControlBar.querySelector('toolbaritem').getBoundingClientRect().height + 'px'; + this.mediaControlBar.querySelector("toolbaritem").getBoundingClientRect().height + "px"; this.mediaControlBar.style.opacity = 0; gZenUIManager.updateTabsToolbar(); gZenUIManager.motion.animate( @@ -273,11 +298,12 @@ class nsZenMediaController { addLabelOverflows(elements) { for (const element of elements) { + // eslint-disable-next-line no-shadow const parent = element.parentElement; if (element.scrollWidth > parent.clientWidth) { - element.setAttribute('overflow', ''); + element.setAttribute("overflow", ""); } else { - element.removeAttribute('overflow'); + element.removeAttribute("overflow"); } } } @@ -293,18 +319,18 @@ class nsZenMediaController { this.updatePipButton(); if ( - !this.mediaControlBar.classList.contains('playing') && + !this.mediaControlBar.classList.contains("playing") && this._currentMediaController.isPlaying ) { - this.mediaControlBar.classList.add('playing'); + this.mediaControlBar.classList.add("playing"); } const iconURL = this._currentBrowser.mIconURL || `page-icon:${this._currentBrowser.currentURI.spec}`; this.mediaFocusButton.style.listStyleImage = `url(${iconURL})`; - this.mediaTitle.textContent = metadata.title || ''; - this.mediaArtist.textContent = metadata.artist || ''; + this.mediaTitle.textContent = metadata.title || ""; + this.mediaArtist.textContent = metadata.artist || ""; gZenUIManager.updateTabsToolbar(); @@ -324,7 +350,9 @@ class nsZenMediaController { this.updateMuteState(); this.switchController(); - if (!mediaController.isActive || this._currentBrowser?.browserId === browser.browserId) return; + if (!mediaController.isActive || this._currentBrowser?.browserId === browser.browserId) { + return; + } const metadata = mediaController.getMetadata(); const positionState = mediaController.getPositionState(); @@ -342,17 +370,17 @@ class nsZenMediaController { this.setupMediaControlUI(metadata, positionState); } - mediaController.addEventListener('pictureinpicturemodechange', this.onPipModeChange); - mediaController.addEventListener('positionstatechange', this.onPositionstateChange); - mediaController.addEventListener('playbackstatechange', this.onPlaybackstateChange); - mediaController.addEventListener('supportedkeyschange', this.onSupportedKeysChange); - mediaController.addEventListener('metadatachange', this.onMetadataChange); - mediaController.addEventListener('deactivated', this.onDeactivated); + mediaController.addEventListener("pictureinpicturemodechange", this.onPipModeChange); + mediaController.addEventListener("positionstatechange", this.onPositionstateChange); + mediaController.addEventListener("playbackstatechange", this.onPlaybackstateChange); + mediaController.addEventListener("supportedkeyschange", this.onSupportedKeysChange); + mediaController.addEventListener("metadatachange", this.onMetadataChange); + mediaController.addEventListener("deactivated", this.onDeactivated); } activateMediaDeviceControls(browser) { if (browser?.browsingContext.currentWindowGlobal.hasActivePeerConnections()) { - this.mediaControlBar.removeAttribute('can-pip'); + this.mediaControlBar.removeAttribute("can-pip"); this._currentBrowser = browser; const tab = window.gBrowser.getTabForBrowser(browser); @@ -362,7 +390,7 @@ class nsZenMediaController { this.mediaFocusButton.style.listStyleImage = `url(${iconURL})`; this.mediaTitle.textContent = tab.label; - this.mediaArtist.textContent = ''; + this.mediaArtist.textContent = ""; this.showMediaControls(); } @@ -376,19 +404,25 @@ class nsZenMediaController { const isCurrentBrowser = this._currentBrowser?.browserId === browser.browserId; const shouldShow = showCameraIndicator || showMicrophoneIndicator; - if (!isMatch) continue; + if (!isMatch) { + continue; + } if (shouldShow && !(isCurrentBrowser && this.isSharing)) { - const webRTC = browser.browsingContext.currentWindowGlobal.getActor('WebRTC'); - webRTC.sendAsyncMessage('webrtc:UnmuteMicrophone'); - webRTC.sendAsyncMessage('webrtc:UnmuteCamera'); + const webRTC = browser.browsingContext.currentWindowGlobal.getActor("WebRTC"); + webRTC.sendAsyncMessage("webrtc:UnmuteMicrophone"); + webRTC.sendAsyncMessage("webrtc:UnmuteCamera"); - if (this._currentBrowser) this.isSharing = false; + if (this._currentBrowser) { + this.isSharing = false; + } if (this._currentMediaController) { this._currentMediaController.pause(); this.deinitMediaController(this._currentMediaController, true, true).then(() => this.activateMediaDeviceControls(browser) ); - } else this.activateMediaDeviceControls(browser); + } else { + this.activateMediaDeviceControls(browser); + } } else if (!shouldShow && isCurrentBrowser && this.isSharing) { this.isSharing = false; this._currentBrowser = null; @@ -411,15 +445,17 @@ class nsZenMediaController { _onPlaybackstateChange() { if (this._currentMediaController?.isPlaying) { - this.mediaControlBar.classList.add('playing'); + this.mediaControlBar.classList.add("playing"); } else { this.switchController(); - this.mediaControlBar.classList.remove('playing'); + this.mediaControlBar.classList.remove("playing"); } } _onSupportedKeysChange(event) { - if (event.target.id !== this._currentMediaController?.id) return; + if (event.target.id !== this._currentMediaController?.id) { + return; + } for (const key of this.supportedKeys) { const button = this.mediaControlBar.querySelector(`#zen-media-${key}-button`); button.disabled = !event.target.supportedKeys.includes(key); @@ -436,7 +472,9 @@ class nsZenMediaController { lastUpdated: Date.now(), }); - if (event.target.id !== this._currentMediaController?.id) return; + if (event.target.id !== this._currentMediaController?.id) { + return; + } this._currentPosition = event.position; this._currentDuration = event.duration; @@ -448,15 +486,21 @@ class nsZenMediaController { switchController(force = false) { let timeout = 3000; - if (this.isSharing) return; - if (this.#isSeeking) return; + if (this.isSharing) { + return; + } + if (this.#isSeeking) { + return; + } if (this._controllerSwitchTimeout) { clearTimeout(this._controllerSwitchTimeout); this._controllerSwitchTimeout = null; } - if (this.mediaControllersMap.size === 1) timeout = 0; + if (this.mediaControllersMap.size === 1) { + timeout = 0; + } this._controllerSwitchTimeout = setTimeout(() => { if (!this._currentMediaController?.isPlaying || force) { const nextController = Array.from(this.mediaControllersMap.values()) @@ -496,11 +540,15 @@ class nsZenMediaController { this._mediaUpdateInterval = null; } - if (this._currentDuration >= 900_000) - return this.mediaControlBar.setAttribute('media-position-hidden', 'true'); - else this.mediaControlBar.removeAttribute('media-position-hidden'); + if (this._currentDuration >= 900_000) { + this.mediaControlBar.setAttribute("media-position-hidden", "true"); + return; + } + this.mediaControlBar.removeAttribute("media-position-hidden"); - if (!this._currentDuration) return; + if (!this._currentDuration) { + return; + } this.mediaCurrentTime.textContent = this.formatSecondsToTime(this._currentPosition); this.mediaDuration.textContent = this.formatSecondsToTime(this._currentDuration); @@ -522,7 +570,9 @@ class nsZenMediaController { } formatSecondsToTime(seconds) { - if (!seconds || isNaN(seconds)) return '0:00'; + if (!seconds || isNaN(seconds)) { + return "0:00"; + } const totalSeconds = Math.max(0, Math.ceil(seconds)); const hours = Math.floor(totalSeconds / 3600); @@ -530,51 +580,55 @@ class nsZenMediaController { const secs = (totalSeconds % 60).toString(); if (hours > 0) { - return `${hours}:${minutes.padStart(2, '0')}:${secs.padStart(2, '0')}`; + return `${hours}:${minutes.padStart(2, "0")}:${secs.padStart(2, "0")}`; } - return `${minutes}:${secs.padStart(2, '0')}`; + return `${minutes}:${secs.padStart(2, "0")}`; } _onMetadataChange(event) { - if (event.target.id !== this._currentMediaController?.id) return; + if (event.target.id !== this._currentMediaController?.id) { + return; + } this.updatePipButton(); const metadata = event.target.getMetadata(); - this.mediaTitle.textContent = metadata.title || ''; - this.mediaArtist.textContent = metadata.artist || ''; + this.mediaTitle.textContent = metadata.title || ""; + this.mediaArtist.textContent = metadata.artist || ""; const mediaInfoElements = [this.mediaTitle, this.mediaArtist]; for (const element of mediaInfoElements) { - element.removeAttribute('overflow'); + element.removeAttribute("overflow"); } this.addLabelOverflows(mediaInfoElements); } _onPictureInPictureModeChange(event) { - if (event.target.id !== this._currentMediaController?.id) return; + if (event.target.id !== this._currentMediaController?.id) { + return; + } if (event.target.isBeingUsedInPIPModeOrFullscreen) { this.hideMediaControls(); - this.mediaControlBar.setAttribute('pip', ''); + this.mediaControlBar.setAttribute("pip", ""); } else { const { selectedBrowser } = gBrowser; if (selectedBrowser.browserId !== this._currentBrowser.browserId) { this.showMediaControls(); } - this.mediaControlBar.removeAttribute('pip'); + this.mediaControlBar.removeAttribute("pip"); } } onMediaPlayPrev() { - if (this._currentMediaController?.supportedKeys.includes('previoustrack')) { + if (this._currentMediaController?.supportedKeys.includes("previoustrack")) { this._currentMediaController.prevTrack(); } } onMediaPlayNext() { - if (this._currentMediaController?.supportedKeys.includes('nexttrack')) { + if (this._currentMediaController?.supportedKeys.includes("nexttrack")) { this._currentMediaController.nextTrack(); } } @@ -589,7 +643,7 @@ class nsZenMediaController { onMediaSeekComplete(event) { const newPosition = (event.target.value / 100) * this._currentDuration; - if (this._currentMediaController?.supportedKeys.includes('seekto')) { + if (this._currentMediaController?.supportedKeys.includes("seekto")) { this._currentMediaController.seekTo(newPosition); this._currentMediaController.play(); } @@ -598,12 +652,17 @@ class nsZenMediaController { } onMediaFocus() { - if (!this._currentBrowser) return; + if (!this._currentBrowser) { + return; + } - if (this._currentMediaController) this._currentMediaController.focus(); - else if (this._currentBrowser) { + if (this._currentMediaController) { + this._currentMediaController.focus(); + } else if (this._currentBrowser) { const tab = window.gBrowser.getTabForBrowser(this._currentBrowser); - if (tab) window.gZenWorkspaces.switchTabIfNeeded(tab); + if (tab) { + window.gZenWorkspaces.switchTabIfNeeded(tab); + } } } @@ -616,7 +675,7 @@ class nsZenMediaController { } onMediaToggle() { - if (this.mediaControlBar.classList.contains('playing')) { + if (this.mediaControlBar.classList.contains("playing")) { this._currentMediaController?.pause(); } else { this._currentMediaController?.play(); @@ -627,7 +686,9 @@ class nsZenMediaController { if (this._currentMediaController) { this._currentMediaController.pause(); this.deinitMediaController(this._currentMediaController); - } else if (this.isSharing) this.isSharing = false; + } else if (this.isSharing) { + this.isSharing = false; + } this.hideMediaControls(); this.switchController(true); @@ -635,51 +696,57 @@ class nsZenMediaController { onMediaPip() { this._currentBrowser.browsingContext.currentWindowGlobal - .getActor('PictureInPictureLauncher') - .sendAsyncMessage('PictureInPicture:KeyToggle'); + .getActor("PictureInPictureLauncher") + .sendAsyncMessage("PictureInPicture:KeyToggle"); } onMicrophoneMuteToggle() { if (this._currentBrowser) { - const shouldMute = this.mediaControlBar.hasAttribute('mic-muted') - ? 'webrtc:UnmuteMicrophone' - : 'webrtc:MuteMicrophone'; + const shouldMute = this.mediaControlBar.hasAttribute("mic-muted") + ? "webrtc:UnmuteMicrophone" + : "webrtc:MuteMicrophone"; this._currentBrowser.browsingContext.currentWindowGlobal - .getActor('WebRTC') + .getActor("WebRTC") .sendAsyncMessage(shouldMute); - this.mediaControlBar.toggleAttribute('mic-muted'); + this.mediaControlBar.toggleAttribute("mic-muted"); } } onCameraMuteToggle() { if (this._currentBrowser) { - const shouldMute = this.mediaControlBar.hasAttribute('camera-muted') - ? 'webrtc:UnmuteCamera' - : 'webrtc:MuteCamera'; + const shouldMute = this.mediaControlBar.hasAttribute("camera-muted") + ? "webrtc:UnmuteCamera" + : "webrtc:MuteCamera"; this._currentBrowser.browsingContext.currentWindowGlobal - .getActor('WebRTC') + .getActor("WebRTC") .sendAsyncMessage(shouldMute); - this.mediaControlBar.toggleAttribute('camera-muted'); + this.mediaControlBar.toggleAttribute("camera-muted"); } } updateMuteState() { - if (!this._currentBrowser) return; - this.mediaControlBar.toggleAttribute('muted', this._currentBrowser.audioMuted); + if (!this._currentBrowser) { + return; + } + this.mediaControlBar.toggleAttribute("muted", this._currentBrowser.audioMuted); } updatePipButton() { - if (!this._currentBrowser) return; - if (this.isSharing) return; + if (!this._currentBrowser) { + return; + } + if (this.isSharing) { + return; + } const { totalPipCount, totalPipDisabled } = PictureInPicture.getEligiblePipVideoCount( this._currentBrowser ); const canPip = totalPipCount === 1 || (totalPipDisabled > 0 && lazy.RESPECT_PIP_DISABLED); - this.mediaControlBar.toggleAttribute('can-pip', canPip); + this.mediaControlBar.toggleAttribute("can-pip", canPip); } } diff --git a/src/zen/media/zen-media-controls.css b/src/zen/media/zen-media-controls.css index 4358a1609..a30fca410 100644 --- a/src/zen/media/zen-media-controls.css +++ b/src/zen/media/zen-media-controls.css @@ -115,13 +115,13 @@ } & #zen-media-focus-button::after { - content: ''; + content: ""; position: absolute; width: 110%; height: 110%; background-repeat: no-repeat; opacity: 1; - background: url('chrome://browser/content/zen-images/note-indicator.svg') no-repeat; + background: url("chrome://browser/content/zen-images/note-indicator.svg") no-repeat; top: -70%; left: 50%; transform: translateX(-50%); @@ -238,7 +238,7 @@ min-width: 1px; &::before { - content: ''; + content: ""; position: absolute; width: 0.6em; background: linear-gradient(to right, var(--zen-sidebar-notification-bg) 0%, transparent 100%); @@ -309,7 +309,7 @@ } } -:root:not([zen-sidebar-expanded='true']) { +:root:not([zen-sidebar-expanded="true"]) { #zen-media-controls-toolbar { display: none; } diff --git a/src/zen/mods/ZenMods.mjs b/src/zen/mods/ZenMods.mjs index 49eab0b31..075b7349d 100644 --- a/src/zen/mods/ZenMods.mjs +++ b/src/zen/mods/ZenMods.mjs @@ -5,11 +5,16 @@ import { nsZenPreloadedFeature, nsZenMultiWindowFeature, -} from 'chrome://browser/content/zen-components/ZenCommonUtils.mjs'; +} from "chrome://browser/content/zen-components/ZenCommonUtils.mjs"; +/** + * Zen Mods Manager, handles downloading, updating and applying Zen Mods. + * + * @augments nsZenPreloadedFeature + */ class nsZenMods extends nsZenPreloadedFeature { // private properties start - #kZenStylesheetModHeader = '/* Zen Mods - Generated by ZenMods.'; + #kZenStylesheetModHeader = "/* Zen Mods - Generated by ZenMods."; #kZenStylesheetModHeaderBody = `* DO NOT EDIT THIS FILE DIRECTLY! * Your changes will be overwritten. * Instead, go to the preferences and edit the mods there. @@ -19,9 +24,9 @@ class nsZenMods extends nsZenPreloadedFeature { /* End of Zen Mods */ `; #getCurrentDateTime = () => - new Intl.DateTimeFormat('en-US', { - dateStyle: 'full', - timeStyle: 'full', + new Intl.DateTimeFormat("en-US", { + dateStyle: "full", + timeStyle: "full", }).format(new Date().getTime()); constructor() { @@ -33,13 +38,13 @@ class nsZenMods extends nsZenPreloadedFeature { get #modsBackend() { if (!this.#_modsBackend) { - this.#_modsBackend = Cc['@mozilla.org/zen/mods-backend;1'].getService(Ci.nsIZenModsBackend); + this.#_modsBackend = Cc["@mozilla.org/zen/mods-backend;1"].getService(Ci.nsIZenModsBackend); } return this.#_modsBackend; } get #styleSheetPath() { - return PathUtils.join(PathUtils.profileDir, 'chrome', 'zen-themes.css'); + return PathUtils.join(PathUtils.profileDir, "chrome", "zen-themes.css"); } async #handleDisableMods() { @@ -47,13 +52,13 @@ class nsZenMods extends nsZenPreloadedFeature { } #getStylesheetPathForMod(mod) { - return PathUtils.join(this.getModFolder(mod.id), 'chrome.css'); + return PathUtils.join(this.getModFolder(mod.id), "chrome.css"); } async #readStylesheet() { const path = this.modsRootPath; if (!(await IOUtils.exists(path))) { - return ''; + return ""; } return await IOUtils.readUTF8(this.#styleSheetPath); } @@ -63,7 +68,7 @@ class nsZenMods extends nsZenPreloadedFeature { const content = await this.#readStylesheet(); this.#modsBackend.rebuildModsStyles(content); } catch (e) { - console.warn('[ZenMods]: Error rebuilding mods styles:', e); + console.warn("[ZenMods]: Error rebuilding mods styles:", e); } } @@ -91,8 +96,9 @@ class nsZenMods extends nsZenPreloadedFeature { } async #getEnabledMods() { - if (Services.prefs.getBoolPref('zen.themes.disable-all', false)) { - console.log('[ZenMods]: Mods are disabled by user preference.'); + if (Services.prefs.getBoolPref("zen.themes.disable-all", false)) { + // eslint-disable-next-line no-console + console.info("[ZenMods]: Mods are disabled by user preference."); return []; } const modsObject = await this.getMods(); @@ -100,14 +106,15 @@ class nsZenMods extends nsZenPreloadedFeature { (mod) => mod.enabled === undefined || mod.enabled ); - const modList = mods.map(({ name }) => name).join(', '); + // eslint-disable-next-line no-shadow + const modList = mods.map(({ name }) => name).join(", "); const message = - modList !== '' + modList !== "" ? `[ZenMods]: Loading enabled Zen mods: ${modList}.` - : '[ZenMods]: No enabled Zen mods.'; + : "[ZenMods]: No enabled Zen mods."; - console.log(message); + console.warn(message); return mods; } @@ -124,21 +131,21 @@ class nsZenMods extends nsZenPreloadedFeature { } const getProperty = - type === 'checkbox' ? Services.prefs.getBoolPref : Services.prefs.getStringPref; + type === "checkbox" ? Services.prefs.getBoolPref : Services.prefs.getStringPref; const setProperty = - type === 'checkbox' ? Services.prefs.setBoolPref : Services.prefs.setStringPref; + type === "checkbox" ? Services.prefs.setBoolPref : Services.prefs.setStringPref; try { getProperty(property); } catch { - console.debug( + console.warn( `[ZenMods]: Setting default value for ${property} to ${defaultValue} (${typeof defaultValue})` ); if ( - typeof defaultValue !== 'boolean' && - typeof defaultValue !== 'string' && - typeof defaultValue !== 'number' + typeof defaultValue !== "boolean" && + typeof defaultValue !== "string" && + typeof defaultValue !== "number" ) { console.warn( `[ZenMods]: Warning, invalid data type received (${typeof defaultValue}), skipping.` @@ -148,7 +155,7 @@ class nsZenMods extends nsZenPreloadedFeature { setProperty( property, - typeof defaultValue === 'boolean' ? defaultValue : defaultValue.toString() + typeof defaultValue === "boolean" ? defaultValue : defaultValue.toString() ); } } @@ -157,6 +164,7 @@ class nsZenMods extends nsZenPreloadedFeature { #writeToDom(modsWithPreferences) { for (const browser of nsZenMultiWindowFeature.browsers) { + // eslint-disable-next-line no-shadow for (const { enabled, preferences, name } of modsWithPreferences) { const sanitizedName = this.sanitizeModName(name); @@ -167,29 +175,29 @@ class nsZenMods extends nsZenPreloadedFeature { element.remove(); } - for (const { property } of preferences.filter(({ type }) => type !== 'checkbox')) { - const sanitizedProperty = property?.replaceAll(/\./g, '-'); + for (const { property } of preferences.filter(({ type }) => type !== "checkbox")) { + const sanitizedProperty = property?.replaceAll(/\./g, "-"); - browser.document.querySelector(':root').style.removeProperty(`--${sanitizedProperty}`); + browser.document.querySelector(":root").style.removeProperty(`--${sanitizedProperty}`); } continue; } for (const { property, type } of preferences) { - const value = Services.prefs.getStringPref(property, ''); - const sanitizedProperty = property?.replaceAll(/\./g, '-'); + const value = Services.prefs.getStringPref(property, ""); + const sanitizedProperty = property?.replaceAll(/\./g, "-"); switch (type) { - case 'dropdown': { - if (value !== '') { + case "dropdown": { + if (value !== "") { let element = browser.document.getElementById(sanitizedName); if (!element) { - element = browser.document.createElement('div'); + element = browser.document.createElement("div"); - element.style.display = 'none'; - element.setAttribute('id', sanitizedName); + element.style.display = "none"; + element.setAttribute("id", sanitizedName); browser.document.body.appendChild(element); } @@ -199,14 +207,14 @@ class nsZenMods extends nsZenPreloadedFeature { break; } - case 'string': { - if (value === '') { + case "string": { + if (value === "") { browser.document - .querySelector(':root') + .querySelector(":root") .style.removeProperty(`--${sanitizedProperty}`); } else { browser.document - .querySelector(':root') + .querySelector(":root") .style.setProperty(`--${sanitizedProperty}`, value); } break; @@ -256,12 +264,12 @@ class nsZenMods extends nsZenPreloadedFeature { #compareVersions(version1, version2) { let result = false; - if (typeof version1 !== 'object') { - version1 = version1.toString().split('.'); + if (typeof version1 !== "object") { + version1 = version1.toString().split("."); } - if (typeof version2 !== 'object') { - version2 = version2.toString().split('.'); + if (typeof version2 !== "object") { + version2 = version2.toString().split("."); } for (let i = 0; i < Math.max(version1.length, version2.length); i++) { @@ -287,7 +295,6 @@ class nsZenMods extends nsZenPreloadedFeature { return `https://zen-browser.github.io/theme-store/themes/${modId}/theme.json`; } - /* eslint-disable no-unused-vars */ async #downloadUrlToFile(url, path, isStyleSheet = false, maxRetries = 3, retryDelayMs = 500) { let attempt = 0; @@ -309,7 +316,7 @@ class nsZenMods extends nsZenPreloadedFeature { } catch (e) { attempt++; if (attempt >= maxRetries) { - console.error('[ZenMods]: Error downloading file after retries', url, e); + console.error("[ZenMods]: Error downloading file after retries", url, e); } else { console.warn( `[ZenMods]: Download failed (attempt ${attempt} of ${maxRetries}), retrying in ${retryDelayMs}ms...`, @@ -350,21 +357,22 @@ class nsZenMods extends nsZenPreloadedFeature { }; } - sanitizeModName(name) { + sanitizeModName(aName) { // Do not change to "mod-" for backwards compatibility - return `theme-${name?.replaceAll(/\s/g, '-')?.replaceAll(/[^A-Za-z_-]+/g, '')}`; + // eslint-disable-next-line no-shadow + return `theme-${aName?.replaceAll(/\s/g, "-")?.replaceAll(/[^A-Za-z_-]+/g, "")}`; } get updatePref() { - return 'zen.mods.updated-value-observer'; + return "zen.mods.updated-value-observer"; } get modsRootPath() { - return PathUtils.join(PathUtils.profileDir, 'chrome', 'zen-themes'); + return PathUtils.join(PathUtils.profileDir, "chrome", "zen-themes"); } get modsDataFile() { - return PathUtils.join(PathUtils.profileDir, 'zen-themes.json'); + return PathUtils.join(PathUtils.profileDir, "zen-themes.json"); } getModFolder(modId) { @@ -383,16 +391,16 @@ class nsZenMods extends nsZenPreloadedFeature { try { mods = await IOUtils.readJSON(this.modsDataFile); - if (mods === null || typeof mods !== 'object') { - throw new Error('Mods data file is invalid'); + if (mods === null || typeof mods !== "object") { + throw new Error("Mods data file is invalid"); } } catch { // If we have a corrupted file, reset it await IOUtils.writeJSON(this.modsDataFile, {}); Services.wm - .getMostRecentWindow('navigator:browser') - .gZenUIManager.showToast('zen-themes-corrupted', { + .getMostRecentWindow("navigator:browser") + .gZenUIManager.showToast("zen-themes-corrupted", { timeout: 8000, }); } @@ -401,7 +409,7 @@ class nsZenMods extends nsZenPreloadedFeature { } async getModPreferences(mod) { - const modPath = PathUtils.join(this.modsRootPath, mod.id, 'preferences.json'); + const modPath = PathUtils.join(this.modsRootPath, mod.id, "preferences.json"); if (!(await IOUtils.exists(modPath)) || !mod.preferences) { return []; @@ -424,10 +432,10 @@ class nsZenMods extends nsZenPreloadedFeature { await SessionStore.promiseInitialized; if ( - Services.prefs.getBoolPref('zen.themes.disable-all', false) || + Services.prefs.getBoolPref("zen.themes.disable-all", false) || Services.appinfo.inSafeMode ) { - console.log('[ZenMods]: Mods disabled by user or in safe mode.'); + console.warn("[ZenMods]: Mods disabled by user or in safe mode."); return; } @@ -464,29 +472,29 @@ class nsZenMods extends nsZenPreloadedFeature { ); } } catch (e) { - console.error('[ZenMods]: Error loading Zen Mods:', e); + console.error("[ZenMods]: Error loading Zen Mods:", e); } - Services.prefs.addObserver(this.updatePref, this.#rebuildModsStylesheet.bind(this), false); - Services.prefs.addObserver('zen.themes.disable-all', this.#handleDisableMods.bind(this), false); + Services.prefs.addObserver(this.updatePref, this.#rebuildModsStylesheet.bind(this)); + Services.prefs.addObserver("zen.themes.disable-all", this.#handleDisableMods.bind(this)); } #setNewMilestoneIfNeeded() { - const previousMilestone = Services.prefs.getStringPref('zen.mods.milestone', ''); + const previousMilestone = Services.prefs.getStringPref("zen.mods.milestone", ""); if (previousMilestone != Services.appinfo.version) { - Services.prefs.setStringPref('zen.mods.milestone', Services.appinfo.version); - Services.prefs.clearUserPref('zen.mods.last-update'); + Services.prefs.setStringPref("zen.mods.milestone", Services.appinfo.version); + Services.prefs.clearUserPref("zen.mods.last-update"); } } #shouldAutoUpdate() { - const daysBeforeUpdate = Services.prefs.getIntPref('zen.mods.auto-update-days'); - const lastUpdatedSec = Services.prefs.getIntPref('zen.mods.last-update', -1); + const daysBeforeUpdate = Services.prefs.getIntPref("zen.mods.auto-update-days"); + const lastUpdatedSec = Services.prefs.getIntPref("zen.mods.last-update", -1); const nowSec = Math.floor(Date.now() / 1000); const daysSinceUpdate = (nowSec - lastUpdatedSec) / (60 * 60 * 24); return ( - (Services.prefs.getBoolPref('zen.mods.auto-update', true) && + (Services.prefs.getBoolPref("zen.mods.auto-update", true) && daysSinceUpdate >= daysBeforeUpdate) || lastUpdatedSec < 0 ); @@ -505,10 +513,10 @@ class nsZenMods extends nsZenPreloadedFeature { } if ( - !this.#compareVersions(possibleNewModVersion.version, currentMod.version ?? '0.0.0') && + !this.#compareVersions(possibleNewModVersion.version, currentMod.version ?? "0.0.0") && possibleNewModVersion.version != currentMod.version ) { - console.log( + console.warn( `[ZenMods]: Mod update found for mod ${currentMod.name} (${currentMod.id}), current: ${currentMod.version}, new: ${possibleNewModVersion.version}` ); @@ -523,7 +531,7 @@ class nsZenMods extends nsZenPreloadedFeature { return null; } catch (e) { - console.error('[ZenMods]: Error checking for mod updates', e); + console.error("[ZenMods]: Error checking for mod updates", e); return null; } @@ -531,7 +539,7 @@ class nsZenMods extends nsZenPreloadedFeature { ); await this.updateMods(mods); - Services.prefs.setIntPref('zen.mods.last-update', Math.floor(Date.now() / 1000)); + Services.prefs.setIntPref("zen.mods.last-update", Math.floor(Date.now() / 1000)); return updates.filter((update) => { return update !== null; }); @@ -540,7 +548,7 @@ class nsZenMods extends nsZenPreloadedFeature { async removeMod(modId, triggerUpdate = true) { const modPath = this.getModFolder(modId); - console.log(`[ZenMods]: Removing mod ${modPath}`); + console.warn(`[ZenMods]: Removing mod ${modPath}`); await IOUtils.remove(modPath, { recursive: true, ignoreAbsent: true }); @@ -559,7 +567,7 @@ class nsZenMods extends nsZenPreloadedFeature { const mods = await this.getMods(); const mod = mods[modId]; - console.log(`[ZenMods]: Enabling mod ${mod.name}`); + console.warn(`[ZenMods]: Enabling mod ${mod.name}`); mod.enabled = true; @@ -570,7 +578,7 @@ class nsZenMods extends nsZenPreloadedFeature { const mods = await this.getMods(); const mod = mods[modId]; - console.log(`[ZenMods]: Disabling mod ${mod.name}`); + console.warn(`[ZenMods]: Disabling mod ${mod.name}`); mod.enabled = false; @@ -595,14 +603,14 @@ class nsZenMods extends nsZenPreloadedFeature { const modPath = PathUtils.join(this.modsRootPath, mod.id); await IOUtils.makeDirectory(modPath, { ignoreExisting: true }); - await this.#downloadUrlToFile(mod.style, PathUtils.join(modPath, 'chrome.css'), true); - await this.#downloadUrlToFile(mod.readme, PathUtils.join(modPath, 'readme.md')); + await this.#downloadUrlToFile(mod.style, PathUtils.join(modPath, "chrome.css"), true); + await this.#downloadUrlToFile(mod.readme, PathUtils.join(modPath, "readme.md")); if (mod.preferences) { - await this.#downloadUrlToFile(mod.preferences, PathUtils.join(modPath, 'preferences.json')); + await this.#downloadUrlToFile(mod.preferences, PathUtils.join(modPath, "preferences.json")); } } catch (e) { - console.error('[ZenMods]: Error installing mod', mod.id, e); + console.error("[ZenMods]: Error installing mod", mod.id, e); } } @@ -619,7 +627,7 @@ class nsZenMods extends nsZenPreloadedFeature { await this.installMod(mod); } } catch (e) { - console.error('[ZenMods]: Error checking for mod changes', e); + console.error("[ZenMods]: Error checking for mod changes", e); } } @@ -629,10 +637,10 @@ class nsZenMods extends nsZenPreloadedFeature { async requestMod(modId) { const url = this.#composeModApiUrl(modId); - console.debug(`[ZenMods]: Fetching mod ${modId} info from ${url}`); + console.warn(`[ZenMods]: Fetching mod ${modId} info from ${url}`); const data = await fetch(url, { - mode: 'no-cors', + mode: "no-cors", }); if (data.ok) { diff --git a/src/zen/mods/actors/ZenModsMarketplaceChild.sys.mjs b/src/zen/mods/actors/ZenModsMarketplaceChild.sys.mjs index 2690ecae5..abfc10aed 100644 --- a/src/zen/mods/actors/ZenModsMarketplaceChild.sys.mjs +++ b/src/zen/mods/actors/ZenModsMarketplaceChild.sys.mjs @@ -8,19 +8,19 @@ export class ZenModsMarketplaceChild extends JSWindowActorChild { } handleEvent(event) { - if (event.type === 'DOMContentLoaded') { + if (event.type === "DOMContentLoaded") { const verifier = this.contentWindow.document.querySelector( 'meta[name="zen-content-verified"]' ); if (verifier) { - verifier.setAttribute('content', 'verified'); + verifier.setAttribute("content", "verified"); } this.initiateModsMarketplace(); this.contentWindow.document.addEventListener( - 'ZenCheckForModUpdates', + "ZenCheckForModUpdates", this.checkForModUpdates.bind(this) ); } @@ -30,7 +30,7 @@ export class ZenModsMarketplaceChild extends JSWindowActorChild { checkForModUpdates(event) { event.preventDefault(); - this.sendAsyncMessage('ZenModsMarketplace:CheckForUpdates'); + this.sendAsyncMessage("ZenModsMarketplace:CheckForUpdates"); } initiateModsMarketplace() { @@ -41,20 +41,20 @@ export class ZenModsMarketplaceChild extends JSWindowActorChild { } get actionButton() { - return this.contentWindow.document.getElementById('install-theme'); + return this.contentWindow.document.getElementById("install-theme"); } get actionButtonUninstall() { - return this.contentWindow.document.getElementById('install-theme-uninstall'); + return this.contentWindow.document.getElementById("install-theme-uninstall"); } async isThemeInstalled(themeId) { - return await this.sendQuery('ZenModsMarketplace:IsModInstalled', { themeId }); + return await this.sendQuery("ZenModsMarketplace:IsModInstalled", { themeId }); } async receiveMessage(message) { switch (message.name) { - case 'ZenModsMarketplace:ModChanged': { + case "ZenModsMarketplace:ModChanged": { const modId = message.data.modId; const actionButton = this.actionButton; const actionButtonInstalled = this.actionButtonUninstall; @@ -64,22 +64,22 @@ export class ZenModsMarketplaceChild extends JSWindowActorChild { actionButtonInstalled.disabled = false; if (await this.isThemeInstalled(modId)) { - actionButton.classList.add('hidden'); - actionButtonInstalled.classList.remove('hidden'); + actionButton.classList.add("hidden"); + actionButtonInstalled.classList.remove("hidden"); } else { - actionButton.classList.remove('hidden'); - actionButtonInstalled.classList.add('hidden'); + actionButton.classList.remove("hidden"); + actionButtonInstalled.classList.add("hidden"); } } break; } - case 'ZenModsMarketplace:CheckForUpdatesFinished': { + case "ZenModsMarketplace:CheckForUpdatesFinished": { const updates = message.data.updates; this.contentWindow.document.dispatchEvent( - new CustomEvent('ZenModsMarketplace:CheckForUpdatesFinished', { detail: { updates } }) + new CustomEvent("ZenModsMarketplace:CheckForUpdatesFinished", { detail: { updates } }) ); break; @@ -89,38 +89,38 @@ export class ZenModsMarketplaceChild extends JSWindowActorChild { injectMarketplaceAPI() { Cu.exportFunction(this.handleModInstallationEvent.bind(this), this.contentWindow, { - defineAs: 'ZenInstallMod', + defineAs: "ZenInstallMod", }); } async addButtons() { const actionButton = this.actionButton; const actionButtonUninstall = this.actionButtonUninstall; - const errorMessage = this.contentWindow.document.getElementById('install-theme-error'); + const errorMessage = this.contentWindow.document.getElementById("install-theme-error"); if (!actionButton || !actionButtonUninstall) { return; } - errorMessage.classList.add('hidden'); + errorMessage.classList.add("hidden"); - const themeId = actionButton.getAttribute('zen-theme-id'); + const themeId = actionButton.getAttribute("zen-theme-id"); if (await this.isThemeInstalled(themeId)) { - actionButtonUninstall.classList.remove('hidden'); + actionButtonUninstall.classList.remove("hidden"); } else { - actionButton.classList.remove('hidden'); + actionButton.classList.remove("hidden"); } - actionButton.addEventListener('click', this.handleModInstallationEvent.bind(this)); - actionButtonUninstall.addEventListener('click', this.handleModUninstallEvent.bind(this)); + actionButton.addEventListener("click", this.handleModInstallationEvent.bind(this)); + actionButtonUninstall.addEventListener("click", this.handleModUninstallEvent.bind(this)); } async handleModUninstallEvent(event) { const button = event.target; button.disabled = true; - const modId = button.getAttribute('zen-theme-id'); + const modId = button.getAttribute("zen-theme-id"); - this.sendAsyncMessage('ZenModsMarketplace:UninstallMod', { modId }); + this.sendAsyncMessage("ZenModsMarketplace:UninstallMod", { modId }); } async handleModInstallationEvent(event) { @@ -131,12 +131,12 @@ export class ZenModsMarketplaceChild extends JSWindowActorChild { const button = event.target; button.disabled = true; - modId = button.getAttribute('zen-theme-id'); + modId = button.getAttribute("zen-theme-id"); } else { // Backwards compatibility is... Interesting modId = event.themeId ?? event.modId ?? event.id; } - this.sendAsyncMessage('ZenModsMarketplace:InstallMod', { modId }); + this.sendAsyncMessage("ZenModsMarketplace:InstallMod", { modId }); } } diff --git a/src/zen/mods/actors/ZenModsMarketplaceParent.sys.mjs b/src/zen/mods/actors/ZenModsMarketplaceParent.sys.mjs index 806ca52a0..19f73dac7 100644 --- a/src/zen/mods/actors/ZenModsMarketplaceParent.sys.mjs +++ b/src/zen/mods/actors/ZenModsMarketplaceParent.sys.mjs @@ -13,11 +13,11 @@ export class ZenModsMarketplaceParent extends JSWindowActorParent { async receiveMessage(message) { switch (message.name) { - case 'ZenModsMarketplace:InstallMod': { + case "ZenModsMarketplace:InstallMod": { const modId = message.data.modId; const mod = await this.modsManager.requestMod(modId); - console.log(`[ZenModsMarketplaceParent]: Installing mod ${mod.id}`); + console.warn(`[ZenModsMarketplaceParent]: Installing mod ${mod.id}`); mod.enabled = true; @@ -29,9 +29,9 @@ export class ZenModsMarketplaceParent extends JSWindowActorParent { break; } - case 'ZenModsMarketplace:UninstallMod': { + case "ZenModsMarketplace:UninstallMod": { const modId = message.data.modId; - console.log(`[ZenModsMarketplaceParent]: Uninstalling mod ${modId}`); + console.warn(`[ZenModsMarketplaceParent]: Uninstalling mod ${modId}`); const mods = await this.modsManager.getMods(); @@ -44,22 +44,23 @@ export class ZenModsMarketplaceParent extends JSWindowActorParent { break; } - case 'ZenModsMarketplace:CheckForUpdates': { + case "ZenModsMarketplace:CheckForUpdates": { const updates = await this.modsManager.checkForModsUpdates(); - this.sendAsyncMessage('ZenModsMarketplace:CheckForUpdatesFinished', { updates }); + this.sendAsyncMessage("ZenModsMarketplace:CheckForUpdatesFinished", { updates }); break; } - case 'ZenModsMarketplace:IsModInstalled': { + case "ZenModsMarketplace:IsModInstalled": { const themeId = message.data.themeId; const themes = await this.modsManager.getMods(); return Boolean(themes?.[themeId]); } } + return undefined; } async updateChildProcesses(modId) { - this.sendAsyncMessage('ZenModsMarketplace:ModChanged', { modId }); + this.sendAsyncMessage("ZenModsMarketplace:ModChanged", { modId }); } } diff --git a/src/zen/sessionstore/ZenSessionManager.sys.mjs b/src/zen/sessionstore/ZenSessionManager.sys.mjs index 01f8d1aac..65b70733a 100644 --- a/src/zen/sessionstore/ZenSessionManager.sys.mjs +++ b/src/zen/sessionstore/ZenSessionManager.sys.mjs @@ -2,37 +2,41 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { JSONFile } from 'resource://gre/modules/JSONFile.sys.mjs'; -import { XPCOMUtils } from 'resource://gre/modules/XPCOMUtils.sys.mjs'; +import { JSONFile } from "resource://gre/modules/JSONFile.sys.mjs"; +import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs"; const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { - 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', - setTimeout: 'resource://gre/modules/Timer.sys.mjs', - gWindowSyncEnabled: 'resource:///modules/zen/ZenWindowSync.sys.mjs', - DeferredTask: 'resource://gre/modules/DeferredTask.sys.mjs', + PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs", + // eslint-disable-next-line mozilla/valid-lazy + BrowserWindowTracker: "resource:///modules/BrowserWindowTracker.sys.mjs", + // eslint-disable-next-line mozilla/valid-lazy + TabGroupState: "resource:///modules/sessionstore/TabGroupState.sys.mjs", + SessionStore: "resource:///modules/sessionstore/SessionStore.sys.mjs", + // eslint-disable-next-line mozilla/valid-lazy + SessionSaver: "resource:///modules/sessionstore/SessionSaver.sys.mjs", + // eslint-disable-next-line mozilla/valid-lazy + setTimeout: "resource://gre/modules/Timer.sys.mjs", + gWindowSyncEnabled: "resource:///modules/zen/ZenWindowSync.sys.mjs", + DeferredTask: "resource://gre/modules/DeferredTask.sys.mjs", }); -XPCOMUtils.defineLazyPreferenceGetter(lazy, 'gShouldLog', 'zen.session-store.log', true); +XPCOMUtils.defineLazyPreferenceGetter(lazy, "gShouldLog", "zen.session-store.log", true); XPCOMUtils.defineLazyPreferenceGetter( lazy, - 'gMaxSessionBackups', - 'zen.session-store.max-backups', + "gMaxSessionBackups", + "zen.session-store.max-backups", 10 ); // 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 SHOULD_BACKUP_FILE = Services.prefs.getBoolPref('zen.session-store.backup-file', true); +const SHOULD_COMPRESS_FILE = Services.prefs.getBoolPref("zen.session-store.compress-file", true); +const SHOULD_BACKUP_FILE = Services.prefs.getBoolPref("zen.session-store.backup-file", true); -const FILE_NAME = SHOULD_COMPRESS_FILE ? 'zen-sessions.jsonlz4' : 'zen-sessions.json'; -const MIGRATION_PREF = 'zen.ui.migration.session-manager-restore'; +const FILE_NAME = SHOULD_COMPRESS_FILE ? "zen-sessions.jsonlz4" : "zen-sessions.json"; +const MIGRATION_PREF = "zen.ui.migration.session-manager-restore"; // 'browser.startup.page' preference value to resume the previous session. const BROWSER_STARTUP_RESUME_SESSION = 3; @@ -61,11 +65,13 @@ class nsZenSidebarObject { export class nsZenSessionManager { /** * The JSON file instance used to read/write session data. + * * @type {JSONFile} */ #file = null; /** * The sidebar object holding tabs, groups, folders and split view data. + * * @type {nsZenSidebarObject} */ #sidebarObject = new nsZenSidebarObject(); @@ -76,8 +82,8 @@ export class nsZenSessionManager { // Called from SessionComponents.manifest on app-startup init() { - this.log('Initializing session manager'); - let profileDir = Services.dirsvc.get('ProfD', Ci.nsIFile).path; + this.log("Initializing session manager"); + let profileDir = Services.dirsvc.get("ProfD", Ci.nsIFile).path; let backupFile = null; if (SHOULD_BACKUP_FILE) { backupFile = PathUtils.join(this.#backupFolderPath, FILE_NAME); @@ -85,7 +91,7 @@ export class nsZenSessionManager { let filePath = PathUtils.join(profileDir, FILE_NAME); this.#file = new JSONFile({ path: filePath, - compression: SHOULD_COMPRESS_FILE ? 'lz4' : undefined, + compression: SHOULD_COMPRESS_FILE ? "lz4" : undefined, backupFile, }); this.#deferredBackupTask = new lazy.DeferredTask(async () => { @@ -95,13 +101,13 @@ export class nsZenSessionManager { log(...args) { if (lazy.gShouldLog) { - console.info('ZenSessionManager:', ...args); + console.warn("ZenSessionManager:", ...args); } } get #backupFolderPath() { - let profileDir = Services.dirsvc.get('ProfD', Ci.nsIFile).path; - return PathUtils.join(profileDir, 'zen-sessions-backup'); + let profileDir = Services.dirsvc.get("ProfD", Ci.nsIFile).path; + return PathUtils.join(profileDir, "zen-sessions-backup"); } /** @@ -112,24 +118,24 @@ export class nsZenSessionManager { async #getDataFromDBForMigration() { try { const { PlacesUtils } = ChromeUtils.importESModule( - 'resource://gre/modules/PlacesUtils.sys.mjs' + "resource://gre/modules/PlacesUtils.sys.mjs" ); const db = await PlacesUtils.promiseDBConnection(); let data = {}; - let rows = await db.execute('SELECT * FROM zen_workspaces ORDER BY created_at ASC'); + let rows = await db.execute("SELECT * FROM zen_workspaces ORDER BY created_at ASC"); data.spaces = rows.map((row) => ({ - uuid: row.getResultByName('uuid'), - name: row.getResultByName('name'), - icon: row.getResultByName('icon'), - containerTabId: row.getResultByName('container_id') ?? 0, - position: row.getResultByName('position'), - theme: row.getResultByName('theme_type') + uuid: row.getResultByName("uuid"), + name: row.getResultByName("name"), + icon: row.getResultByName("icon"), + containerTabId: row.getResultByName("container_id") ?? 0, + position: row.getResultByName("position"), + theme: row.getResultByName("theme_type") ? { - type: row.getResultByName('theme_type'), - gradientColors: JSON.parse(row.getResultByName('theme_colors')), - opacity: row.getResultByName('theme_opacity'), - rotation: row.getResultByName('theme_rotation'), - texture: row.getResultByName('theme_texture'), + type: row.getResultByName("theme_type"), + gradientColors: JSON.parse(row.getResultByName("theme_colors")), + opacity: row.getResultByName("theme_opacity"), + rotation: row.getResultByName("theme_rotation"), + texture: row.getResultByName("theme_texture"), } : null, })); @@ -142,11 +148,12 @@ export class nsZenSessionManager { /** * Reads the session file and populates the sidebar object. * This should be only called once at startup. + * * @see SessionFileInternal.read */ async readFile() { try { - this.log('Reading Zen session file from disk'); + this.log("Reading Zen session file from disk"); let promises = []; promises.push(this.#file.load()); if (!Services.prefs.getBoolPref(MIGRATION_PREF, false)) { @@ -154,7 +161,7 @@ export class nsZenSessionManager { } await Promise.all(promises); } catch (e) { - console.error('ZenSessionManager: Failed to read session file', e); + console.error("ZenSessionManager: Failed to read session file", e); } this.#sidebar = this.#file.data || {}; } @@ -163,18 +170,20 @@ export class nsZenSessionManager { * Called when the session file is read. Restores the sidebar data * into all windows. * - * @param initialState + * @param {object} initialState * The initial session state read from the session file. */ onFileRead(initialState) { - if (!lazy.gWindowSyncEnabled) return; + if (!lazy.gWindowSyncEnabled) { + return; + } // For the first time after migration, we restore the tabs // That where going to be restored by SessionStore. The sidebar // object will always be empty after migration because we haven't // gotten the opportunity to save the session yet. if (!Services.prefs.getBoolPref(MIGRATION_PREF, false)) { Services.prefs.setBoolPref(MIGRATION_PREF, true); - this.log('Restoring tabs from Places DB after migration'); + this.log("Restoring tabs from Places DB after migration"); this.#sidebar = { ...this.#sidebar, spaces: this._migrationData?.spaces || [], @@ -189,7 +198,7 @@ export class nsZenSessionManager { ); if (normalClosedWindow) { initialState.windows = [Cu.cloneInto(normalClosedWindow, {})]; - this.log('Restoring tabs from last closed normal window'); + this.log("Restoring tabs from last closed normal window"); } } for (const winData of initialState?.windows || []) { @@ -207,17 +216,17 @@ export class nsZenSessionManager { // This would happen on first run after having a single private window // open when quitting the app, for example. if (!initialState?.windows?.length) { - this.log('No windows found in initial state, creating an empty one'); + this.log("No windows found in initial state, creating an empty one"); initialState ||= {}; initialState.windows = [{}]; } // When we don't have browser.startup.page set to resume session, // we only want to restore the pinned tabs into the new windows. const shouldRestoreOnlyPinned = - Services.prefs.getIntPref('browser.startup.page', 1) !== BROWSER_STARTUP_RESUME_SESSION || + Services.prefs.getIntPref("browser.startup.page", 1) !== BROWSER_STARTUP_RESUME_SESSION || lazy.PrivateBrowsingUtils.permanentPrivateBrowsing; if (shouldRestoreOnlyPinned && this.#sidebar?.tabs) { - this.log('Restoring only pinned tabs into windows'); + this.log("Restoring only pinned tabs into windows"); const sidebar = this.#sidebar; sidebar.tabs = (sidebar.tabs || []).filter((tab) => tab.pinned); this.#sidebar = sidebar; @@ -226,7 +235,7 @@ export class nsZenSessionManager { // guarantee that all tabs, groups, folders and split view data // are properly synced across all windows. const allowRestoreUnsynced = Services.prefs.getBoolPref( - 'zen.session-store.restore-unsynced-windows', + "zen.session-store.restore-unsynced-windows", true ); this.log(`Restoring Zen session data into ${initialState.windows?.length || 0} windows`); @@ -235,7 +244,7 @@ export class nsZenSessionManager { if (winData.isZenUnsynced) { if (!allowRestoreUnsynced) { // We don't wan't to restore any unsynced windows with the sidebar data. - this.log('Skipping restore of unsynced window'); + this.log("Skipping restore of unsynced window"); delete initialState.windows[i]; } continue; @@ -255,7 +264,7 @@ export class nsZenSessionManager { /** * Saves the current session state. Collects data and writes to disk. * - * @param state The current session state. + * @param {object} state The current session state. */ saveState(state) { if (!state?.windows?.length || !lazy.gWindowSyncEnabled) { @@ -306,8 +315,8 @@ export class nsZenSessionManager { }); const todayFileName = `zen-sessions-${today.getFullYear()}-${(today.getMonth() + 1) .toString() - .padStart(2, '0')}-${today.getDate().toString().padStart(2, '0')}.json${ - SHOULD_COMPRESS_FILE ? 'lz4' : '' + .padStart(2, "0")}-${today.getDate().toString().padStart(2, "0")}.json${ + SHOULD_COMPRESS_FILE ? "lz4" : "" }`; const todayFilePath = PathUtils.join(backupFolder, todayFileName); const sessionFilePath = this.#file.path; @@ -317,14 +326,14 @@ export class nsZenSessionManager { // number of backups allowed, and delete the oldest ones // if needed. let files = await IOUtils.getChildren(backupFolder); - files = files.filter((file) => file.startsWith('zen-sessions-')).sort(); + files = files.filter((file) => file.startsWith("zen-sessions-")).sort(); for (let i = 0; i < files.length - lazy.gMaxSessionBackups; i++) { const fileToDelete = PathUtils.join(backupFolder, files[i].name); this.log(`Deleting old backup file ${files[i].name}`); await IOUtils.remove(fileToDelete); } } catch (e) { - console.error('ZenSessionManager: Failed to create session file backups', e); + console.error("ZenSessionManager: Failed to create session file backups", e); } } @@ -332,8 +341,8 @@ export class nsZenSessionManager { * Saves the session data for a closed window if it meets the criteria. * See SessionStoreInternal.maybeSaveClosedWindow for more details. * - * @param aWinData - The window data object to save. - * @param isLastWindow - Whether this is the last saveable window. + * @param {object} aWinData - The window data object to save. + * @param {boolean} isLastWindow - Whether this is the last saveable window. */ maybeSaveClosedWindow(aWinData, isLastWindow) { // We only want to save the *last* normal window that is closed. @@ -342,14 +351,14 @@ export class nsZenSessionManager { if (aWinData.isPopup || aWinData.isTaskbarTab || aWinData.isZenUnsynced || !isLastWindow) { return; } - this.log('Saving closed window session data into Zen session store'); + this.log("Saving closed window session data into Zen session store"); this.saveState({ windows: [aWinData] }); } /** * Collects session data for a given window. * - * @param state + * @param {object} state * The current session state. */ #collectWindowData(state) { @@ -374,8 +383,8 @@ export class nsZenSessionManager { /** * Collects session data for all tabs in a given window. * - * @param sidebarData The sidebar data object to populate. - * @param state The current session state. + * @param {object} sidebarData The sidebar data object to populate. + * @param {object} state The current session state. */ #collectTabsData(sidebarData, state) { const tabIdRelationMap = new Map(); @@ -404,7 +413,7 @@ export class nsZenSessionManager { * We do this in order to make sure all new window objects * have the same sidebar data. * - * @param aWindowData The window data object to restore into. + * @param {object} aWindowData The window data object to restore into. */ #restoreWindowData(aWindowData) { const sidebar = this.#sidebar; @@ -422,18 +431,18 @@ export class nsZenSessionManager { * Restores a new window with Zen session data. This should be called * not at startup, but when a new window is opened by the user. * - * @param aWindow + * @param {Window} aWindow * The window to restore. - * @param SessionStoreInternal + * @param {object} SessionStoreInternal * The SessionStore module instance. - * @param fromClosedWindow + * @param {boolean} fromClosedWindow * Whether this new window is being restored from a closed window. */ restoreNewWindow(aWindow, SessionStoreInternal, fromClosedWindow = false) { if (aWindow.gZenWorkspaces?.privateWindowOrDisabled || !lazy.gWindowSyncEnabled) { return; } - this.log('Restoring new window with Zen session data'); + this.log("Restoring new window with Zen session data"); const state = lazy.SessionStore.getCurrentState(true); const windows = (state.windows || []).filter( (win) => !win.isPrivate && !win.isPopup && !win.isTaskbarTab && !win.isZenUnsynced @@ -444,7 +453,7 @@ export class nsZenSessionManager { // We only want to restore the sidebar object if we found // only one normal window to clone from (which is the one // we are opening). - this.log('Restoring sidebar data into new window'); + this.log("Restoring sidebar data into new window"); this.#restoreWindowData(newWindow); } newWindow.tabs = this.#filterUnusedTabs(newWindow.tabs || []); @@ -477,11 +486,11 @@ export class nsZenSessionManager { * Called when a new empty session is created. For example, * when creating a new profile or when the user installed it for * the first time. - * @param {*} aWindow - * @returns + * + * @param {Window} aWindow */ onNewEmptySession(aWindow) { - this.log('Restoring empty session with Zen session data'); + this.log("Restoring empty session with Zen session data"); aWindow.gZenWorkspaces.restoreWorkspacesFromSessionStore({ spaces: this.#sidebar.spaces || [], }); diff --git a/src/zen/sessionstore/ZenWindowSync.sys.mjs b/src/zen/sessionstore/ZenWindowSync.sys.mjs index ac693560a..6e289804c 100644 --- a/src/zen/sessionstore/ZenWindowSync.sys.mjs +++ b/src/zen/sessionstore/ZenWindowSync.sys.mjs @@ -2,47 +2,48 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { XPCOMUtils } from 'resource://gre/modules/XPCOMUtils.sys.mjs'; +import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs"; const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { - BrowserWindowTracker: 'resource:///modules/BrowserWindowTracker.sys.mjs', - SessionStore: 'resource:///modules/sessionstore/SessionStore.sys.mjs', - TabStateFlusher: 'resource:///modules/sessionstore/TabStateFlusher.sys.mjs', - ZenSessionStore: 'resource:///modules/zen/ZenSessionManager.sys.mjs', - TabStateCache: 'resource:///modules/sessionstore/TabStateCache.sys.mjs', + BrowserWindowTracker: "resource:///modules/BrowserWindowTracker.sys.mjs", + SessionStore: "resource:///modules/sessionstore/SessionStore.sys.mjs", + TabStateFlusher: "resource:///modules/sessionstore/TabStateFlusher.sys.mjs", + // eslint-disable-next-line mozilla/valid-lazy + ZenSessionStore: "resource:///modules/zen/ZenSessionManager.sys.mjs", + TabStateCache: "resource:///modules/sessionstore/TabStateCache.sys.mjs", }); -XPCOMUtils.defineLazyPreferenceGetter(lazy, 'gWindowSyncEnabled', 'zen.window-sync.enabled'); -XPCOMUtils.defineLazyPreferenceGetter(lazy, 'gShouldLog', 'zen.window-sync.log', true); +XPCOMUtils.defineLazyPreferenceGetter(lazy, "gWindowSyncEnabled", "zen.window-sync.enabled"); +XPCOMUtils.defineLazyPreferenceGetter(lazy, "gShouldLog", "zen.window-sync.log", true); -const OBSERVING = ['browser-window-before-show']; -const INSTANT_EVENTS = ['SSWindowClosing']; +const OBSERVING = ["browser-window-before-show"]; +const INSTANT_EVENTS = ["SSWindowClosing"]; const EVENTS = [ - 'TabOpen', - 'TabClose', + "TabOpen", + "TabClose", - 'ZenTabIconChanged', - 'ZenTabLabelChanged', + "ZenTabIconChanged", + "ZenTabLabelChanged", - 'TabMove', - 'TabPinned', - 'TabUnpinned', - 'TabAddedToEssentials', - 'TabRemovedFromEssentials', + "TabMove", + "TabPinned", + "TabUnpinned", + "TabAddedToEssentials", + "TabRemovedFromEssentials", - 'TabGroupUpdate', - 'TabGroupCreate', - 'TabGroupRemoved', - 'TabGroupMoved', + "TabGroupUpdate", + "TabGroupCreate", + "TabGroupRemoved", + "TabGroupMoved", - 'ZenTabRemovedFromSplit', - 'ZenSplitViewTabsSplit', + "ZenTabRemovedFromSplit", + "ZenSplitViewTabsSplit", - 'TabSelect', + "TabSelect", - 'focus', + "focus", ...INSTANT_EVENTS, ]; @@ -124,7 +125,7 @@ class nsZenWindowSync { log(...args) { if (lazy.gShouldLog) { - console.info('ZenWindowSync:', ...args); + console.warn("ZenWindowSync:", ...args); } } @@ -144,21 +145,21 @@ class nsZenWindowSync { // to avoid confusing the old private window behavior. let forcedSync = !aWindow.gZenWorkspaces?.privateWindowOrDisabled; let hasUnsyncedArg = false; - if (aWindow._zenStartupSyncFlag === 'synced') { + if (aWindow._zenStartupSyncFlag === "synced") { forcedSync = true; - } else if (aWindow._zenStartupSyncFlag === 'unsynced') { + } else if (aWindow._zenStartupSyncFlag === "unsynced") { hasUnsyncedArg = true; } delete aWindow._zenStartupSyncFlag; if ( !forcedSync && (hasUnsyncedArg || - (typeof aWindow.arguments[0] === 'string' && + (typeof aWindow.arguments[0] === "string" && aWindow.arguments.length > 1 && - [...this.#browserWindows].length > 0)) + !![...this.#browserWindows].length)) ) { - this.log('Not syncing new window due to unsynced argument or existing synced windows'); - aWindow.document.documentElement.setAttribute('zen-unsynced-window', 'true'); + this.log("Not syncing new window due to unsynced argument or existing synced windows"); + aWindow.document.documentElement.setAttribute("zen-unsynced-window", "true"); return; } aWindow.gZenWindowSync = this; @@ -169,8 +170,6 @@ class nsZenWindowSync { /** * Called when the session store has finished initializing for a window. - * - * @param {Window} aWindow - The browser window that has initialized session store. */ async #onSessionStoreInitialized() { // For every tab we have in where there's no sync ID, we need to @@ -226,6 +225,7 @@ class nsZenWindowSync { /** * Runs a callback function on all browser windows except the specified one. * This version supports asynchronous callbacks. + * * @see #runOnAllWindows - Make sure functionality is the same. * @param {Window} aWindow - The browser window to exclude. * @param {Function} aCallback - The asynchronous callback function to run on each window. @@ -240,7 +240,7 @@ class nsZenWindowSync { observe(aSubject, aTopic) { switch (aTopic) { - case 'browser-window-before-show': { + case "browser-window-before-show": { this.#onWindowBeforeShow(aSubject); break; } @@ -257,7 +257,8 @@ class nsZenWindowSync { return; } if (INSTANT_EVENTS.includes(aEvent.type)) { - return this.#handleNextEvent(aEvent); + this.#handleNextEvent(aEvent); + return; } if (this.#eventHandlingContext.window && this.#eventHandlingContext.window !== window) { // We're already handling an event for another window. @@ -284,6 +285,7 @@ class nsZenWindowSync { /** * Adds a sync handler for a specific event type. + * * @param {Function} aHandler - The sync handler function to add. */ addSyncHandler(aHandler) { @@ -295,6 +297,7 @@ class nsZenWindowSync { /** * Removes a sync handler for a specific event type. + * * @param {Function} aHandler - The sync handler function to remove. */ removeSyncHandler(aHandler) { @@ -309,7 +312,7 @@ class nsZenWindowSync { #handleNextEvent(aEvent) { const handler = `on_${aEvent.type}`; try { - if (typeof this[handler] === 'function') { + if (typeof this[handler] === "function") { let promise = this[handler](aEvent) || Promise.resolve(); promise.then(() => { for (let syncHandler of this.#syncHandlers) { @@ -321,9 +324,8 @@ class nsZenWindowSync { } }); return promise; - } else { - throw new Error(`No handler for event type: ${aEvent.type}`); } + throw new Error(`No handler for event type: ${aEvent.type}`); } catch (e) { return Promise.reject(e); } @@ -345,6 +347,7 @@ class nsZenWindowSync { /** * Synchronizes a specific attribute from the original item to the target item. + * * @param {MozTabbrowserTab|MozTabbrowserTabGroup} aOriginalItem - The original item to copy from. * @param {MozTabbrowserTab|MozTabbrowserTabGroup} aTargetItem - The target item to copy to. * @param {string} aAttributeName - The name of the attribute to synchronize. @@ -360,8 +363,8 @@ class nsZenWindowSync { /** * Synchronizes the icon and label of the target tab with the original tab. * - * @param {Object} aOriginalTab - The original tab to copy from. - * @param {Object} aTargetTab - The target tab to copy to. + * @param {object} aOriginalItem - The original item to copy from. + * @param {object} aTargetItem - The target item to copy to. * @param {Window} aWindow - The window containing the tabs. * @param {number} flags - The sync flags indicating what to synchronize. */ @@ -375,7 +378,7 @@ class nsZenWindowSync { if (gBrowser.isTab(aOriginalItem)) { gBrowser.setIcon( aTargetItem, - aOriginalItem.getAttribute('image') || gBrowser.getIcon(aOriginalItem) + aOriginalItem.getAttribute("image") || gBrowser.getIcon(aOriginalItem) ); } else if (aOriginalItem.isZenFolder) { // Icons are a zen-only feature for tab groups. @@ -392,8 +395,8 @@ class nsZenWindowSync { aTargetItem.label = aOriginalItem.label; } } - if (flags & SYNC_FLAG_MOVE && !aTargetItem.hasAttribute('zen-empty-tab')) { - this.#maybeSyncAttributeChange(aOriginalItem, aTargetItem, 'zen-workspace-id'); + if (flags & SYNC_FLAG_MOVE && !aTargetItem.hasAttribute("zen-empty-tab")) { + this.#maybeSyncAttributeChange(aOriginalItem, aTargetItem, "zen-workspace-id"); this.#syncItemPosition(aOriginalItem, aTargetItem, aWindow); } if (gBrowser.isTab(aTargetItem)) { @@ -410,8 +413,8 @@ class nsZenWindowSync { */ #syncItemPosition(aOriginalItem, aTargetItem, aWindow) { const { gBrowser, gZenPinnedTabManager } = aWindow; - const originalIsEssential = aOriginalItem.hasAttribute('zen-essential'); - const targetIsEssential = aTargetItem.hasAttribute('zen-essential'); + const originalIsEssential = aOriginalItem.hasAttribute("zen-essential"); + const targetIsEssential = aTargetItem.hasAttribute("zen-essential"); const originalIsPinned = aOriginalItem.pinned; const targetIsPinned = aTargetItem.pinned; @@ -448,7 +451,7 @@ class nsZenWindowSync { * @param {MozTabbrowserTab|MozTabbrowserTabGroup} aOriginalItem - The original item to match. * @param {MozTabbrowserTab|MozTabbrowserTabGroup} aTargetItem - The target item to move. * @param {Window} aWindow - The window containing the items. - * @param {Object} options - Additional options for moving the item. + * @param {object} options - Additional options for moving the item. * @param {boolean} options.isEssential - Indicates if the item is essential. * @param {boolean} options.isPinned - Indicates if the item is pinned. */ @@ -458,15 +461,15 @@ class nsZenWindowSync { let isFirstTab = true; if (gBrowser.isTabGroup(originalSibling) || gBrowser.isTab(originalSibling)) { isFirstTab = - !originalSibling.hasAttribute('id') || originalSibling.hasAttribute('zen-empty-tab'); + !originalSibling.hasAttribute("id") || originalSibling.hasAttribute("zen-empty-tab"); } gBrowser.zenHandleTabMove(aTargetItem, () => { if (isFirstTab) { let container; const parentGroup = aOriginalItem.group; - if (parentGroup?.hasAttribute('id')) { - container = this.getItemFromWindow(aWindow, parentGroup.getAttribute('id')); + if (parentGroup?.hasAttribute("id")) { + container = this.getItemFromWindow(aWindow, parentGroup.getAttribute("id")); if (container) { if (container?.tabs?.length) { // First tab in folders is the empty tab placeholder. @@ -481,7 +484,7 @@ class nsZenWindowSync { container = gZenWorkspaces.getEssentialsSection(aTargetItem); } else { const workspaceId = - aTargetItem.getAttribute('zen-workspace-id') || + aTargetItem.getAttribute("zen-workspace-id") || aOriginalItem.ownerGlobal.gZenWorkspaces.activeWorkspace; const workspaceElement = gZenWorkspaces.workspaceElement(workspaceId); container = isPinned @@ -522,8 +525,8 @@ class nsZenWindowSync { /** * Swaps the browser docshells between two tabs. * - * @param {Object} aOurTab - The tab in the current window. - * @param {Object} aOtherTab - The tab in the other window. + * @param {object} aOurTab - The tab in the current window. + * @param {object} aOtherTab - The tab in the other window. */ async #swapBrowserDocShellsAsync(aOurTab, aOtherTab) { lazy.TabStateFlusher.flush(aOtherTab.linkedBrowser); @@ -535,7 +538,7 @@ class nsZenWindowSync { /** * Restores the tab progress listener for a given tab. * - * @param {Object} aTab - The tab to restore the progress listener for. + * @param {object} aTab - The tab to restore the progress listener for. * @param {Function} callback - The callback function to execute while the listener is removed. * @param {boolean} onClose - Indicates if the swap is done during a tab close operation. */ @@ -573,8 +576,9 @@ class nsZenWindowSync { /** * Swaps the browser docshells between two tabs. * - * @param {Object} aOurTab - The tab in the current window. - * @param {Object} aOtherTab - The tab in the other window. + * @param {object} aOurTab - The tab in the current window. + * @param {object} aOtherTab - The tab in the other window. + * @param {object} options - Options object. * @param {boolean} options.focus - Indicates if the tab should be focused after the swap. * @param {boolean} options.onClose - Indicates if the swap is done during a tab close operation. */ @@ -601,8 +605,8 @@ class nsZenWindowSync { // and will stay in a 'busy' state forever. // To avoid this, we manually check if the other tab is still busy after the swap, // and if not, we remove the busy attribute from our tab. - if (!aOtherTab.hasAttribute('busy')) { - aOurTab.removeAttribute('busy'); + if (!aOtherTab.hasAttribute("busy")) { + aOurTab.removeAttribute("busy"); } // Load about:blank if by any chance we loaded the previous tab's URL. // TODO: We should maybe start using a singular about:blank preloaded view @@ -612,11 +616,11 @@ class nsZenWindowSync { // around this limitation somehow. if ( !onClose && - (aOtherTab.linkedBrowser?.currentURI.spec !== 'about:blank' || - aOtherTab.hasAttribute('busy')) + (aOtherTab.linkedBrowser?.currentURI.spec !== "about:blank" || + aOtherTab.hasAttribute("busy")) ) { this.log(`Loading about:blank in our tab ${aOtherTab.id} before swap`); - aOtherTab.linkedBrowser.loadURI(Services.io.newURI('about:blank'), { + aOtherTab.linkedBrowser.loadURI(Services.io.newURI("about:blank"), { triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(), loadFlags: Ci.nsIWebNavigation.LOAD_FLAGS_REPLACE_HISTORY, }); @@ -624,7 +628,7 @@ class nsZenWindowSync { }, onClose ); - const kAttributesToRemove = ['muted', 'soundplaying', 'sharing', 'pictureinpicture', 'busy']; + const kAttributesToRemove = ["muted", "soundplaying", "sharing", "pictureinpicture", "busy"]; // swapBrowsersAndCloseOther already takes care of transferring attributes like 'muted', // but we need to manually remove some attributes from the other tab. for (let attr of kAttributesToRemove) { @@ -656,8 +660,8 @@ class nsZenWindowSync { /** * Styles the swapped browsers to ensure proper visibility and layout. * - * @param {Object} aOurTab - The tab in the current window. - * @param {Object} aOtherTab - The tab in the other window. + * @param {object} aOurTab - The tab in the current window. + * @param {object} aOtherTab - The tab in the other window. * @param {Function|undefined} callback - The callback function to execute after styling. */ async #styleSwapedBrowsers(aOurTab, aOtherTab, callback = undefined) { @@ -681,7 +685,7 @@ class nsZenWindowSync { resolve(reader.result); }; reader.onerror = function () { - reject(new Error('Failed to read blob as data URL')); + reject(new Error("Failed to read blob as data URL")); }; }); @@ -689,25 +693,25 @@ class nsZenWindowSync { // Run a reflow to ensure the image is rendered before hiding the browser. void img.getBoundingClientRect(); await loadPromise; - otherBrowser.setAttribute('zen-pseudo-hidden', 'true'); + otherBrowser.setAttribute("zen-pseudo-hidden", "true"); callback(); } this.#maybeRemovePseudoImageForBrowser(ourBrowser); - ourBrowser.removeAttribute('zen-pseudo-hidden'); + ourBrowser.removeAttribute("zen-pseudo-hidden"); } /** * Create and insert a new pseudo image for a browser element. * - * @param {Object} aBrowser - The browser element to create the pseudo image for. + * @param {object} aBrowser - The browser element to create the pseudo image for. * @param {string} aSrc - The source URL of the image. - * @returns {Object} The created pseudo image element. + * @returns {object} The created pseudo image element. */ #createPseudoImageForBrowser(aBrowser, aSrc) { const doc = aBrowser.ownerDocument; - const img = doc.createElement('img'); - img.className = 'zen-pseudo-browser-image'; + const img = doc.createElement("img"); + img.className = "zen-pseudo-browser-image"; aBrowser.after(img); const loadPromise = new Promise((resolve) => { img.onload = () => resolve(); @@ -719,10 +723,10 @@ class nsZenWindowSync { /** * Removes the pseudo image element for a browser if it exists. * - * @param {Object} aBrowser - The browser element to remove the pseudo image for. + * @param {object} aBrowser - The browser element to remove the pseudo image for. */ #maybeRemovePseudoImageForBrowser(aBrowser) { - const elements = aBrowser.parentNode?.querySelectorAll('.zen-pseudo-browser-image'); + const elements = aBrowser.parentNode?.querySelectorAll(".zen-pseudo-browser-image"); if (elements) { elements.forEach((element) => element.remove()); } @@ -735,7 +739,7 @@ class nsZenWindowSync { * @param {Window} aWindow - The window to exclude. * @param {string} aTabId - The ID of the tab to retrieve. * @param {Function} filter - A function to filter the tabs. - * @returns {Object|null} The active tab from other windows if found, otherwise null. + * @returns {object | null} The active tab from other windows if found, otherwise null. */ #getActiveTabFromOtherWindows(aWindow, aTabId, filter = (tab) => tab?._zenContentsVisible) { return this.#runOnAllWindows(aWindow, (win) => { @@ -743,6 +747,7 @@ class nsZenWindowSync { if (filter(tab)) { return tab; } + return undefined; }); } @@ -781,7 +786,7 @@ class nsZenWindowSync { * Handles tab switch or window focus events to synchronize tab contents visibility. * * @param {Window} aWindow - The window that triggered the event. - * @param {Object} aPreviousTab - The previously selected tab. + * @param {object} aPreviousTab - The previously selected tab. * @param {boolean} ignoreSameTab - Indicates if the same tab should be ignored. */ async #onTabSwitchOrWindowFocus(aWindow, aPreviousTab = null, ignoreSameTab = false) { @@ -805,7 +810,7 @@ class nsZenWindowSync { let promises = []; for (const browserView of aWindow.gBrowser.selectedBrowsers) { const selectedTab = aWindow.gBrowser.getTabForBrowser(browserView); - if (selectedTab._zenContentsVisible || selectedTab.hasAttribute('zen-empty-tab')) { + if (selectedTab._zenContentsVisible || selectedTab.hasAttribute("zen-empty-tab")) { continue; } const otherSelectedTab = this.#getActiveTabFromOtherWindows(aWindow, selectedTab.id); @@ -832,8 +837,8 @@ class nsZenWindowSync { /** * Retrieves the tab state for a given tab. * - * @param {Object} tab - The tab to retrieve the state for. - * @returns {Object} The tab state. + * @param {object} tab - The tab to retrieve the state for. + * @returns {object} The tab state. */ #getTabState(tab) { return JSON.parse(lazy.SessionStore.getTabState(tab)); @@ -844,14 +849,14 @@ class nsZenWindowSync { /** * Sets the initial pinned state for a tab across all windows. * - * @param {Object} aTab - The tab to set the pinned state for. + * @param {object} aTab - The tab to set the pinned state for. * @returns {Promise} A promise that resolves when the operation is complete. */ setPinnedTabState(aTab) { return lazy.TabStateFlusher.flush(aTab.linkedBrowser).finally(() => { this.log(`Setting pinned initial state for tab ${aTab.id}`); const state = this.#getTabState(aTab); - let activeIndex = 'index' in state ? state.index : state.entries.length - 1; + let activeIndex = "index" in state ? state.index : state.entries.length - 1; activeIndex = Math.min(activeIndex, state.entries.length - 1); activeIndex = Math.max(activeIndex, 0); const initialState = { @@ -869,6 +874,7 @@ class nsZenWindowSync { /** * Propagates the workspaces to all windows. + * * @param {Array} aWorkspaces - The workspaces to propagate. */ propagateWorkspacesToAllWindows(aWorkspaces) { @@ -886,7 +892,7 @@ class nsZenWindowSync { */ moveTabsToSyncedWorkspace(aWindow, aWorkspaceId) { const tabsToMove = aWindow.gZenWorkspaces.allStoredTabs.filter( - (tab) => !tab.hasAttribute('zen-empty-tab') + (tab) => !tab.hasAttribute("zen-empty-tab") ); const selectedTab = aWindow.gBrowser.selectedTab; let win = [...this.#browserWindows][0]; @@ -899,7 +905,7 @@ class nsZenWindowSync { const newTab = gBrowser.adoptTab(tab, { tabIndex: Infinity }); if (!newTab) { // The adoption failed. Restore "fadein" and don't increase the index. - tab.setAttribute('fadein', 'true'); + tab.setAttribute("fadein", "true"); success = false; continue; } @@ -913,7 +919,7 @@ class nsZenWindowSync { } }; if (!win) { - this.log('No synced window found, creating a new one'); + this.log("No synced window found, creating a new one"); win = aWindow.gBrowser.replaceTabWithWindow(selectedTab, {}, /* zenForceSync = */ true); win.gZenWorkspaces.promiseInitialized.then(() => { moveAllTabsToWindow(); @@ -935,11 +941,11 @@ class nsZenWindowSync { tab._zenContentsVisible = true; tab.id = this.#newTabSyncId; this.#runOnAllWindows(window, (win) => { - const newTab = win.gBrowser.addTrustedTab('about:blank', { + const newTab = win.gBrowser.addTrustedTab("about:blank", { animate: true, createLazyBrowser: true, - zenWorkspaceId: tab.getAttribute('zen-workspace-id') || '', - _forZenEmptyTab: tab.hasAttribute('zen-empty-tab'), + zenWorkspaceId: tab.getAttribute("zen-workspace-id") || "", + _forZenEmptyTab: tab.hasAttribute("zen-empty-tab"), }); newTab.id = tab.id; this.#syncItemWithOriginal( @@ -957,7 +963,7 @@ class nsZenWindowSync { // No need to sync icon changes for tabs that aren't active in this window. return; } - return this.#delegateGenericSyncEvent(aEvent, SYNC_FLAG_ICON); + this.#delegateGenericSyncEvent(aEvent, SYNC_FLAG_ICON); } on_ZenTabLabelChanged(aEvent) { @@ -965,7 +971,7 @@ class nsZenWindowSync { // No need to sync label changes for tabs that aren't active in this window. return; } - return this.#delegateGenericSyncEvent(aEvent, SYNC_FLAG_LABEL); + this.#delegateGenericSyncEvent(aEvent, SYNC_FLAG_LABEL); } on_TabMove(aEvent) { @@ -1025,7 +1031,7 @@ class nsZenWindowSync { } this.#lastFocusedWindow = new WeakRef(window); this.#lastSelectedTab = new WeakRef(window.gBrowser.selectedTab); - return this.#onTabSwitchOrWindowFocus(window); + this.#onTabSwitchOrWindowFocus(window); } on_TabSelect(aEvent) { @@ -1035,7 +1041,7 @@ class nsZenWindowSync { } this.#lastSelectedTab = new WeakRef(tab); const previousTab = aEvent.detail.previousTab; - return this.#onTabSwitchOrWindowFocus(aEvent.target.ownerGlobal, previousTab); + this.#onTabSwitchOrWindowFocus(aEvent.target.ownerGlobal, previousTab); } on_SSWindowClosing(aEvent) { @@ -1056,7 +1062,7 @@ class nsZenWindowSync { } const window = tabGroup.ownerGlobal; const isFolder = tabGroup.isZenFolder; - const isSplitView = tabGroup.hasAttribute('split-view-group'); + const isSplitView = tabGroup.hasAttribute("split-view-group"); if (isSplitView) { return; // Split view groups are synced via ZenSplitViewTabsSplit event. } @@ -1066,7 +1072,7 @@ class nsZenWindowSync { const existingGroup = this.getItemFromWindow(win, tabGroup.id); if (existingGroup) { this.log( - `Attempted to create group ${tabGroup.id} in window ${win}, ` + `but it already exists.` + `Attempted to create group ${tabGroup.id} in window ${win}, but it already exists.` ); return; // Do not proceed with creation. } @@ -1127,8 +1133,8 @@ class nsZenWindowSync { const otherWindowTabs = tabs .map((tab) => this.getItemFromWindow(win, tab.id)) .filter(Boolean); - if (otherWindowTabs.length > 0 && win.gZenViewSplitter) { - const group = win.gZenViewSplitter.splitTabs(otherWindowTabs, 'grid', -1); + if (otherWindowTabs.length && win.gZenViewSplitter) { + const group = win.gZenViewSplitter.splitTabs(otherWindowTabs, "grid", -1); if (group) { let otherTabGroup = group.tabs[0].group; otherTabGroup.id = tabGroup.id; @@ -1141,5 +1147,6 @@ class nsZenWindowSync { } } +// eslint-disable-next-line mozilla/valid-lazy export const gWindowSyncEnabled = lazy.gWindowSyncEnabled; export const ZenWindowSync = new nsZenWindowSync(); diff --git a/src/zen/split-view/ZenViewSplitter.mjs b/src/zen/split-view/ZenViewSplitter.mjs index 51afb6a61..4d3919638 100644 --- a/src/zen/split-view/ZenViewSplitter.mjs +++ b/src/zen/split-view/ZenViewSplitter.mjs @@ -2,17 +2,18 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -import { nsZenDOMOperatedFeature } from 'chrome://browser/content/zen-components/ZenCommonUtils.mjs'; +import { nsZenDOMOperatedFeature } from "chrome://browser/content/zen-components/ZenCommonUtils.mjs"; class nsSplitLeafNode { /** * The percentage of the size of the parent the node takes up, dependent on parent direction this is either * width or height. + * * @type {number} */ sizeInParent; /** - * @type {Object} + * @type {object} */ positionToRoot; // position relative to root node /** @@ -25,11 +26,11 @@ class nsSplitLeafNode { } get heightInParent() { - return this.parent.direction === 'column' ? this.sizeInParent : 100; + return this.parent.direction === "column" ? this.sizeInParent : 100; } get widthInParent() { - return this.parent.direction === 'row' ? this.sizeInParent : 100; + return this.parent.direction === "row" ? this.sizeInParent : 100; } } @@ -47,7 +48,9 @@ class nsSplitNode extends nsSplitLeafNode { } set children(children) { - if (children) children.forEach((c) => (c.parent = this)); + if (children) { + children.forEach((c) => (c.parent = this)); + } this._children = children; } @@ -86,33 +89,33 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { XPCOMUtils.defineLazyPreferenceGetter( this, - 'minResizeWidth', - 'zen.splitView.min-resize-width', + "minResizeWidth", + "zen.splitView.min-resize-width", 7 ); XPCOMUtils.defineLazyPreferenceGetter( this, - '_edgeHoverSize', - 'zen.splitView.rearrange-edge-hover-size', + "_edgeHoverSize", + "zen.splitView.rearrange-edge-hover-size", 24 ); - ChromeUtils.defineLazyGetter(this, 'overlay', () => - document.getElementById('zen-splitview-overlay') + ChromeUtils.defineLazyGetter(this, "overlay", () => + document.getElementById("zen-splitview-overlay") ); - ChromeUtils.defineLazyGetter(this, 'dropZone', () => - document.getElementById('zen-splitview-dropzone') + ChromeUtils.defineLazyGetter(this, "dropZone", () => + document.getElementById("zen-splitview-dropzone") ); - window.addEventListener('TabClose', this.handleTabClose.bind(this)); - window.addEventListener('TabBrowserDiscarded', this.handleTabBrowserDiscarded.bind(this)); - window.addEventListener('TabSelect', this.onTabSelect.bind(this)); + window.addEventListener("TabClose", this.handleTabClose.bind(this)); + window.addEventListener("TabBrowserDiscarded", this.handleTabBrowserDiscarded.bind(this)); + window.addEventListener("TabSelect", this.onTabSelect.bind(this)); this.initializeContextMenu(); this.insertIntoContextMenu(); window.addEventListener( - 'AfterWorkspacesSessionRestore', + "AfterWorkspacesSessionRestore", this.onAfterWorkspaceSessionRestore.bind(this), { once: true, @@ -120,21 +123,21 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { ); // Add drag over listener to the browser view - if (Services.prefs.getBoolPref('zen.splitView.enable-tab-drop')) { - const tabBox = document.getElementById('tabbrowser-tabbox'); - tabBox.addEventListener('dragover', this.onBrowserDragOverToSplit.bind(this)); + if (Services.prefs.getBoolPref("zen.splitView.enable-tab-drop")) { + const tabBox = document.getElementById("tabbrowser-tabbox"); + tabBox.addEventListener("dragover", this.onBrowserDragOverToSplit.bind(this)); this.onBrowserDragEndToSplit = this.onBrowserDragEndToSplit.bind(this); } } insertIntoContextMenu() { - const sibling = document.getElementById('context-sep-open'); - const menuitem = document.createXULElement('menuitem'); - menuitem.setAttribute('id', 'context-zenSplitLink'); - menuitem.setAttribute('hidden', 'true'); - menuitem.setAttribute('command', 'cmd_zenSplitViewLinkInNewTab'); - menuitem.setAttribute('data-l10n-id', 'zen-split-link'); - sibling.insertAdjacentElement('beforebegin', menuitem); + const sibling = document.getElementById("context-sep-open"); + const menuitem = document.createXULElement("menuitem"); + menuitem.setAttribute("id", "context-zenSplitLink"); + menuitem.setAttribute("hidden", "true"); + menuitem.setAttribute("command", "cmd_zenSplitViewLinkInNewTab"); + menuitem.setAttribute("data-l10n-id", "zen-split-link"); + sibling.insertAdjacentElement("beforebegin", menuitem); } /** @@ -159,7 +162,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { */ async handleTabBrowserDiscarded(event) { const tab = event.target; - if (tab.group?.hasAttribute('split-view-group')) { + if (tab.group?.hasAttribute("split-view-group")) { gBrowser.explicitUnloadTabs(tab.group.tabs); for (const t of tab.group.tabs) { if (t.glanceTab) { @@ -176,7 +179,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { */ onTabSelect(event) { const previousTab = event.detail.previousTab; - if (previousTab && !previousTab.hasAttribute('zen-empty-tab')) { + if (previousTab && !previousTab.hasAttribute("zen-empty-tab")) { this._lastOpenedTab = previousTab; } this.onLocationChange(event.target.linkedBrowser); @@ -188,7 +191,6 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { * @param {Tab} tab - The tab to remove. * @param {number} groupIndex - The index of the group. * @param {boolean} [forUnsplit=false] - Whether the removal is for unsplitting. - * @param {boolean} [dontRebuildGrid=false] - Whether to skip rebuilding the grid layout. */ removeTabFromGroup( tab, @@ -200,9 +202,9 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { group.tabs.splice(tabIndex, 1); this.resetTabState(tab, forUnsplit); - if (tab.group && tab.group.hasAttribute('split-view-group')) { + if (tab.group && tab.group.hasAttribute("split-view-group")) { gBrowser.ungroupTab(tab); - this.#dispatchItemEvent('ZenTabRemovedFromSplit', tab); + this.#dispatchItemEvent("ZenTabRemovedFromSplit", tab); } if (group.tabs.length < 2) { // We need to remove all remaining tabs from the group when unsplitting @@ -215,7 +217,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { this.removeGroup(groupIndex); if (changeTab) { gBrowser.selectedTab = remainingTabs[remainingTabs.length - 1]; - document.getElementById('cmd_zenNewEmptySplit').removeAttribute('disabled'); + document.getElementById("cmd_zenNewEmptySplit").removeAttribute("disabled"); } } else { const node = this.getSplitNodeFromTab(tab); @@ -236,10 +238,10 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
`); - listItems.querySelector('.zen-theme-picker-custom-list-item').setAttribute('data-color', color); + listItems.querySelector(".zen-theme-picker-custom-list-item").setAttribute("data-color", color); listItems - .querySelector('.zen-theme-picker-dot') - .style.setProperty('--zen-theme-picker-dot-color', color); - listItems.querySelector('.zen-theme-picker-custom-list-item-label').textContent = color; + .querySelector(".zen-theme-picker-dot") + .style.setProperty("--zen-theme-picker-dot-color", color); + listItems.querySelector(".zen-theme-picker-custom-list-item-label").textContent = color; listItems - .querySelector('.zen-theme-picker-custom-list-item-remove') - .addEventListener('command', this.removeCustomColor.bind(this)); + .querySelector(".zen-theme-picker-custom-list-item-remove") + .addEventListener("command", this.removeCustomColor.bind(this)); this.customColorList.appendChild(listItems); } @@ -563,16 +587,16 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { } let colorOpacity = - document.getElementById('PanelUI-zen-gradient-generator-custom-opacity')?.value ?? 1; + document.getElementById("PanelUI-zen-gradient-generator-custom-opacity")?.value ?? 1; // Convert the opacity into a hex value if it's not already if (colorOpacity < 1) { // e.g. if opacity is 1, we add to the color FF, if it's 0.5 we add 80, etc. const hexOpacity = Math.round(colorOpacity * 255) .toString(16) - .padStart(2, '0') + .padStart(2, "0") .toUpperCase(); // If the color is in hex format - if (color.startsWith('#')) { + if (color.startsWith("#")) { // If the color is already in hex format, we just append the opacity if (color.length === 7) { color += hexOpacity; @@ -581,42 +605,42 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { } // Add '#' prefix if it's missing and the input appears to be a hex color - if (!color.startsWith('#') && /^[0-9A-Fa-f]{3,6}$/.test(color)) { - color = '#' + color; + if (!color.startsWith("#") && /^[0-9A-Fa-f]{3,6}$/.test(color)) { + color = "#" + color; } // can be any color format, we just add it to the list as a dot, but hidden - const dot = document.createElement('div'); - dot.classList.add('zen-theme-picker-dot', 'hidden', 'custom'); + const dot = document.createElement("div"); + dot.classList.add("zen-theme-picker-dot", "hidden", "custom"); dot.style.opacity = 0; - dot.style.setProperty('--zen-theme-picker-dot-color', color); - this.panel.querySelector('#PanelUI-zen-gradient-generator-custom-list').prepend(dot); - this.customColorInput.value = ''; - document.getElementById('PanelUI-zen-gradient-generator-custom-opacity').value = 1; + dot.style.setProperty("--zen-theme-picker-dot-color", color); + this.panel.querySelector("#PanelUI-zen-gradient-generator-custom-list").prepend(dot); + this.customColorInput.value = ""; + document.getElementById("PanelUI-zen-gradient-generator-custom-opacity").value = 1; this.updateCurrentWorkspace(); } handlePanelCommand(event) { - const target = event.target.closest('toolbarbutton'); + const target = event.target.closest("toolbarbutton"); if (!target) { return; } switch (target.id) { - case 'PanelUI-zen-gradient-generator-color-custom-add': + case "PanelUI-zen-gradient-generator-color-custom-add": this.addCustomColor(); break; } } spawnDot(dotData, primary = false) { - const dotPad = this.panel.querySelector('.zen-theme-picker-gradient'); + const dotPad = this.panel.querySelector(".zen-theme-picker-gradient"); const relativePosition = { x: dotData.x, y: dotData.y, }; - const dot = document.createElement('div'); - dot.classList.add('zen-theme-picker-dot'); + const dot = document.createElement("div"); + dot.classList.add("zen-theme-picker-dot"); dot.style.left = `${dotData.x}px`; dot.style.top = `${dotData.y}px`; @@ -627,12 +651,12 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { if (primary) { id = 0; - dot.classList.add('primary'); + dot.classList.add("primary"); const existingPrimaryDot = this.dots.find((d) => d.ID === 0); if (existingPrimaryDot) { existingPrimaryDot.ID = this.dots.length; - existingPrimaryDot.element.classList.remove('primary'); + existingPrimaryDot.element.classList.remove("primary"); } } @@ -642,11 +666,11 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { dotData.type ); dot.style.setProperty( - '--zen-theme-picker-dot-color', + "--zen-theme-picker-dot-color", `rgb(${colorFromPos[0]}, ${colorFromPos[1]}, ${colorFromPos[2]})` ); - dot.setAttribute('data-position', this.getJSONPos(relativePosition.x, relativePosition.y)); - dot.setAttribute('data-type', dotData.type); + dot.setAttribute("data-position", this.getJSONPos(relativePosition.x, relativePosition.y)); + dot.setAttribute("data-type", dotData.type); this.dots.push({ ID: id, @@ -657,53 +681,54 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { }); } - calculateCompliments(dots, action = 'update', useHarmony = '') { + calculateCompliments(dots, action = "update", useHarmony = "") { const colorHarmonies = this.colorHarmonies; if (dots.length === 0) { return []; } + /* eslint-disable no-shadow */ function getColorHarmonyType(numDots, dots) { - if (useHarmony !== '') { + if (useHarmony !== "") { const selectedHarmony = colorHarmonies.find((harmony) => harmony.type === useHarmony); if (selectedHarmony) { - if (action === 'remove') { + if (action === "remove") { if (dots.length !== 0) { return colorHarmonies.find( (harmony) => harmony.angles.length === selectedHarmony.angles.length - 1 ); - } else { - return { type: 'floating', angles: [] }; } + return { type: "floating", angles: [] }; } - if (action === 'add') { + if (action === "add") { return colorHarmonies.find( (harmony) => harmony.angles.length === selectedHarmony.angles.length + 1 ); } - if (action === 'update') { + if (action === "update") { return selectedHarmony; } } } - if (action === 'remove') { - let harmony = colorHarmonies.find((harmony) => harmony.angles.length === numDots); + if (action === "remove") { + let harmony = colorHarmonies.find((h) => h.angles.length === numDots); // If we are coming from 3 analogous dots, we should now go to singleAnalogous if // there are 2 dots left - if (harmony.type === 'analogous' && numDots === 1) { - harmony = colorHarmonies.find((harmony) => harmony.type === 'singleAnalogous'); + if (harmony.type === "analogous" && numDots === 1) { + harmony = colorHarmonies.find((h) => h.type === "singleAnalogous"); } return harmony; } - if (action === 'add') { - return colorHarmonies.find((harmony) => harmony.angles.length + 1 === numDots); + if (action === "add") { + return colorHarmonies.find((h) => h.angles.length + 1 === numDots); } - if (action === 'update') { - return colorHarmonies.find((harmony) => harmony.angles.length + 1 === numDots); + if (action === "update") { + return colorHarmonies.find((h) => h.angles.length + 1 === numDots); } + return null; } function getAngleFromPosition(position, centerPosition) { @@ -719,7 +744,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { return Math.sqrt(deltaX * deltaX + deltaY * deltaY); } - const dotPad = this.panel.querySelector('.zen-theme-picker-gradient'); + const dotPad = this.panel.querySelector(".zen-theme-picker-gradient"); const rect = dotPad.getBoundingClientRect(); const padding = 0; @@ -727,23 +752,30 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { const centerPosition = { x: rect.width / 2, y: rect.height / 2 }; const harmonyAngles = getColorHarmonyType( - dots.length + (action === 'add' ? 1 : action === 'remove' ? -1 : 0), + /* eslint-disable no-nested-ternary */ + dots.length + (action === "add" ? 1 : action === "remove" ? -1 : 0), this.dots ); this.useAlgo = harmonyAngles.type; - if (!harmonyAngles || harmonyAngles.angles.length === 0) return dots; + if (!harmonyAngles || harmonyAngles.angles.length === 0) { + return dots; + } let primaryDot = dots.find((dot) => dot.ID === 0); - if (!primaryDot) return []; + if (!primaryDot) { + return []; + } - if (action === 'add' && this.dots.length) { + if (action === "add" && this.dots.length) { updatedDots.push({ ID: this.dots.length, position: centerPosition }); } const baseAngle = getAngleFromPosition(primaryDot.position, centerPosition); let distance = getDistanceFromCenter(primaryDot.position, centerPosition); const radius = (rect.width - padding) / 2; - if (distance > radius) distance = radius; - if (this.dots.length > 0) { + if (distance > radius) { + distance = radius; + } + if (this.dots.length) { updatedDots = [ { ID: 0, @@ -777,7 +809,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { if (this.isLegacyVersion && !ignoreLegacy) { this.isLegacyVersion = false; - Services.prefs.setIntPref('zen.theme.gradient-legacy-version', 1); + Services.prefs.setIntPref("zen.theme.gradient-legacy-version", 1); } colorPositions.forEach((dotPosition) => { @@ -793,14 +825,14 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { ); existingDot.lightness = this.#currentLightness; existingDot.element.style.setProperty( - '--zen-theme-picker-dot-color', + "--zen-theme-picker-dot-color", `rgb(${colorFromPos[0]}, ${colorFromPos[1]}, ${colorFromPos[2]})` ); existingDot.element.setAttribute( - 'data-position', + "data-position", this.getJSONPos(dotPosition.position.x, dotPosition.position.y) ); - existingDot.element.setAttribute('data-type', dotPosition.type); + existingDot.element.setAttribute("data-type", dotPosition.type); if (!this.dragging) { gZenUIManager.motion.animate( @@ -815,7 +847,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { }, { duration: 0.4, - type: 'spring', + type: "spring", bounce: 0.3, } ); @@ -836,21 +868,25 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { if (this._rotating) { return; } - if (event.target.closest('#PanelUI-zen-gradient-generator-scheme')) { + if (event.target.closest("#PanelUI-zen-gradient-generator-scheme")) { return; } event.preventDefault(); const target = event.target; - if (target.id === 'PanelUI-zen-gradient-generator-color-add') { - if (this.dots.length >= nsZenThemePicker.MAX_DOTS) return; - let colorPositions = this.calculateCompliments(this.dots, 'add', this.useAlgo); + if (target.id === "PanelUI-zen-gradient-generator-color-add") { + if (this.dots.length >= nsZenThemePicker.MAX_DOTS) { + return; + } + let colorPositions = this.calculateCompliments(this.dots, "add", this.useAlgo); this.handleColorPositions(colorPositions); this.updateCurrentWorkspace(); return; - } else if (target.id === 'PanelUI-zen-gradient-generator-color-remove') { + } else if (target.id === "PanelUI-zen-gradient-generator-color-remove") { this.dots.sort((a, b) => a.ID - b.ID); - if (this.dots.length === 0) return; + if (this.dots.length === 0) { + return; + } const lastDot = this.dots.pop(); lastDot.element.remove(); @@ -858,17 +894,17 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { this.dots.forEach((dot, index) => { dot.ID = index; if (index === 0) { - dot.element.classList.add('primary'); + dot.element.classList.add("primary"); } else { - dot.element.classList.remove('primary'); + dot.element.classList.remove("primary"); } }); - let colorPositions = this.calculateCompliments(this.dots, 'remove'); + let colorPositions = this.calculateCompliments(this.dots, "remove"); this.handleColorPositions(colorPositions); this.updateCurrentWorkspace(); return; - } else if (target.id === 'PanelUI-zen-gradient-generator-color-toggle-algo') { + } else if (target.id === "PanelUI-zen-gradient-generator-color-toggle-algo") { const applicableHarmonies = this.colorHarmonies.filter( (harmony) => harmony.angles.length + 1 === this.dots.length ); @@ -878,15 +914,17 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % applicableHarmonies.length; this.useAlgo = applicableHarmonies[nextIndex].type; - let colorPositions = this.calculateCompliments(this.dots, 'update', this.useAlgo); + let colorPositions = this.calculateCompliments(this.dots, "update", this.useAlgo); this.handleColorPositions(colorPositions); this.updateCurrentWorkspace(); return; } - if (event.button !== 0 || this.dragging || this.recentlyDragged) return; + if (event.button !== 0 || this.dragging || this.recentlyDragged) { + return; + } - const gradient = this.panel.querySelector('.zen-theme-picker-gradient'); + const gradient = this.panel.querySelector(".zen-theme-picker-gradient"); const rect = gradient.getBoundingClientRect(); const padding = 0; @@ -908,7 +946,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { clickedDot.ID = 0; clickedDot.element.style.zIndex = 999; - let colorPositions = this.calculateCompliments(this.dots, 'update', this.useAlgo); + let colorPositions = this.calculateCompliments(this.dots, "update", this.useAlgo); this.handleColorPositions(colorPositions); return; } @@ -933,7 +971,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { y: relativeY, }; - let colorPositions = this.calculateCompliments(this.dots, 'update', this.useAlgo); + let colorPositions = this.calculateCompliments(this.dots, "update", this.useAlgo); this.handleColorPositions(colorPositions); this.updateCurrentWorkspace(true); @@ -945,7 +983,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { }, { duration: 0.4, - type: 'spring', + type: "spring", bounce: 0.3, } ); @@ -961,7 +999,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { event.preventDefault(); this.dragging = true; this.draggedDot = event.target; - this.draggedDot.classList.add('dragging'); + this.draggedDot.classList.add("dragging"); } // Store the starting position of the drag @@ -976,7 +1014,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { return; } if (event.button === 2) { - if (!event.target.classList.contains('zen-theme-picker-dot')) { + if (!event.target.classList.contains("zen-theme-picker-dot")) { return; } this.dots = this.dots.filter((dot) => dot.element !== event.target); @@ -988,13 +1026,13 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { this.dots.forEach((dot, index) => { dot.ID = index; if (index === 0) { - dot.element.classList.add('primary'); + dot.element.classList.add("primary"); } else { - dot.element.classList.remove('primary'); + dot.element.classList.remove("primary"); } }); - let colorPositions = this.calculateCompliments(this.dots, 'remove'); + let colorPositions = this.calculateCompliments(this.dots, "remove"); this.handleColorPositions(colorPositions); this.updateCurrentWorkspace(); @@ -1005,7 +1043,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { event.preventDefault(); event.stopPropagation(); this.dragging = false; - this.draggedDot.classList.remove('dragging'); + this.draggedDot.classList.remove("dragging"); this.draggedDot = null; this.dragStartPosition = null; // Reset the drag start position @@ -1013,14 +1051,13 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { setTimeout(() => { this.recentlyDragged = false; }, 100); - return; } } onDotMouseMove(event) { if (this.dragging) { event.preventDefault(); - const rect = this.panel.querySelector('.zen-theme-picker-gradient').getBoundingClientRect(); + const rect = this.panel.querySelector(".zen-theme-picker-gradient").getBoundingClientRect(); const padding = 0; // each side // do NOT let the ball be draged outside of an imaginary circle. You can drag it anywhere inside the circle // if the distance between the center of the circle and the dragged ball is bigger than the radius, then the ball @@ -1049,7 +1086,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { x: relativeX, y: relativeY, }; - let colorPositions = this.calculateCompliments(this.dots, 'update', this.useAlgo); + let colorPositions = this.calculateCompliments(this.dots, "update", this.useAlgo); this.handleColorPositions(colorPositions); this.updateCurrentWorkspace(); @@ -1082,7 +1119,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { } get isMica() { - return window.matchMedia('(-moz-windows-mica)').matches; + return window.matchMedia("(-moz-windows-mica)").matches; } get canBeTransparent() { @@ -1100,7 +1137,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { if (this.isMica) { colorToBlend = !this.isDarkMode ? [0, 0, 0] : [255, 255, 255]; colorToBlendOpacity = 0.35; - } else if (AppConstants.platform === 'macosx') { + } else if (AppConstants.platform === "macosx") { colorToBlend = [255, 255, 255]; colorToBlendOpacity = 0.35; } @@ -1110,7 +1147,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { opacity + lazy.MIN_OPACITY + colorToBlendOpacity * (1 - (opacity + lazy.MIN_OPACITY)) ); baseColor = this.blendColors(baseColor, colorToBlend, blendedAlpha * 100); - if (AppConstants.platform !== 'macosx') { + if (AppConstants.platform !== "macosx") { opacity += colorToBlendOpacity * (1 - opacity); } } @@ -1171,61 +1208,60 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { getGradient(colors, forToolbar = false) { const themedColors = this.themedColors(colors); - this.useAlgo = themedColors[0]?.algorithm ?? ''; + this.useAlgo = themedColors[0]?.algorithm ?? ""; this.#currentLightness = themedColors[0]?.lightness ?? 50; const rotation = -45; // TODO: Detect rotation based on the accent color if (themedColors.length === 0) { const getBrowserBg = () => { if (this.canBeTransparent) { - return this.isDarkMode ? 'rgba(0, 0, 0, 0.4)' : 'transparent'; + return this.isDarkMode ? "rgba(0, 0, 0, 0.4)" : "transparent"; } - return this.isDarkMode ? '#131313' : '#e9e9e9'; + return this.isDarkMode ? "#131313" : "#e9e9e9"; }; return forToolbar ? this.getToolbarModifiedBase() : getBrowserBg(); } else if (themedColors.length === 1) { return this.getSingleRGBColor(themedColors[0], forToolbar); - } else { - // If there are custom colors, we just return a linear gradient with all colors - if (themedColors.find((color) => color.isCustom)) { - // Just return a linear gradient with all colors - const gradientColors = themedColors.map((color) => - this.getSingleRGBColor(color, forToolbar) - ); - // Divide all colors evenly in the gradient - const colorStops = gradientColors - .map((color, index) => { - const position = (index / (gradientColors.length - 1)) * 100; - return `${color} ${position}%`; - }) - .join(', '); - return `linear-gradient(${rotation}deg, ${colorStops})`; - } - if (themedColors.length === 2) { - if (!forToolbar) { - return [ - `linear-gradient(${rotation}deg, ${this.getSingleRGBColor(themedColors[1], forToolbar)} 0%, transparent 100%)`, - `linear-gradient(${rotation + 180}deg, ${this.getSingleRGBColor(themedColors[0], forToolbar)} 0%, transparent 100%)`, - ] - .reverse() - .join(', '); - } - return `linear-gradient(${rotation}deg, ${this.getSingleRGBColor(themedColors[1], forToolbar)} 0%, ${this.getSingleRGBColor(themedColors[0], forToolbar)} 100%)`; - } else if (themedColors.length === 3) { - let color1 = this.getSingleRGBColor(themedColors[2], forToolbar); - let color2 = this.getSingleRGBColor(themedColors[0], forToolbar); - let color3 = this.getSingleRGBColor(themedColors[1], forToolbar); - return [ - `linear-gradient(-5deg, ${color1} 10%, transparent 80%)`, - `radial-gradient(circle at 95% 0%, ${color3} 0%, transparent 75%)`, - `radial-gradient(circle at 0% 0%, ${color2} 10%, transparent 70%)`, - ].join(', '); - } } + // If there are custom colors, we just return a linear gradient with all colors + if (themedColors.find((color) => color.isCustom)) { + // Just return a linear gradient with all colors + const gradientColors = themedColors.map((color) => this.getSingleRGBColor(color, forToolbar)); + // Divide all colors evenly in the gradient + const colorStops = gradientColors + .map((color, index) => { + const position = (index / (gradientColors.length - 1)) * 100; + return `${color} ${position}%`; + }) + .join(", "); + return `linear-gradient(${rotation}deg, ${colorStops})`; + } + if (themedColors.length === 2) { + if (!forToolbar) { + return [ + `linear-gradient(${rotation}deg, ${this.getSingleRGBColor(themedColors[1], forToolbar)} 0%, transparent 100%)`, + `linear-gradient(${rotation + 180}deg, ${this.getSingleRGBColor(themedColors[0], forToolbar)} 0%, transparent 100%)`, + ] + .reverse() + .join(", "); + } + return `linear-gradient(${rotation}deg, ${this.getSingleRGBColor(themedColors[1], forToolbar)} 0%, ${this.getSingleRGBColor(themedColors[0], forToolbar)} 100%)`; + } else if (themedColors.length === 3) { + let color1 = this.getSingleRGBColor(themedColors[2], forToolbar); + let color2 = this.getSingleRGBColor(themedColors[0], forToolbar); + let color3 = this.getSingleRGBColor(themedColors[1], forToolbar); + return [ + `linear-gradient(-5deg, ${color1} 10%, transparent 80%)`, + `radial-gradient(circle at 95% 0%, ${color3} 0%, transparent 75%)`, + `radial-gradient(circle at 0% 0%, ${color2} 10%, transparent 70%)`, + ].join(", "); + } + // We shouldn't really reach here but just in case, we return an empty array + return []; } shouldBeDarkMode(accentColor) { - if (Services.prefs.getBoolPref('zen.theme.use-system-colors')) { + if (Services.prefs.getBoolPref("zen.theme.use-system-colors")) { return this.isDarkMode; } @@ -1260,7 +1296,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { static getTheme(colors = [], opacity = 0.5, texture = 0) { return { - type: 'gradient', + type: "gradient", gradientColors: colors ? colors.filter((color) => color) : [], // remove undefined opacity, texture, @@ -1268,22 +1304,22 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { } updateNoise(texture) { - document.documentElement.style.setProperty('--zen-grainy-background-opacity', texture); + document.documentElement.style.setProperty("--zen-grainy-background-opacity", texture); document.documentElement.setAttribute( - 'zen-show-grainy-background', - texture > 0 ? 'true' : 'false' + "zen-show-grainy-background", + texture > 0 ? "true" : "false" ); } hexToRgb(hex) { - if (hex.startsWith('#')) { + if (hex.startsWith("#")) { hex = hex.substring(1); } if (hex.length === 3) { hex = hex - .split('') + .split("") .map((char) => char + char) - .join(''); + .join(""); } return [ parseInt(hex.substring(0, 2), 16), @@ -1294,6 +1330,8 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { /** * Get the primary color from a list of colors. + * + * @param {Array} accentColor The accent color as an array of RGB values. * @returns {string} The primary color in hex format. */ getAccentColorForUI(accentColor) { @@ -1302,7 +1340,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { getMostDominantColor(allColors) { const color = this.getPrimaryColor(allColors); - if (typeof color === 'string') { + if (typeof color === "string") { // We found a custom color, we should rather return the native accent color return this.getNativeAccentColor(); } @@ -1318,6 +1356,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { // Use theme from workspace object or passed theme let workspaceTheme = theme || workspace.theme; + /* eslint-disable complexity */ this.forEachWindowSync((browser) => { if (!browser.gZenThemePicker?.promiseInitialized) { return; @@ -1342,7 +1381,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { const docElement = browser.document.documentElement; if (!skipUpdate) { - for (const dot of browser.gZenThemePicker.panel.querySelectorAll('.zen-theme-picker-dot')) { + for (const dot of browser.gZenThemePicker.panel.querySelectorAll(".zen-theme-picker-dot")) { dot.remove(); } } @@ -1356,15 +1395,15 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { if (!skipUpdate) { docElement.style.setProperty( - '--zen-main-browser-background-old', - docElement.style.getPropertyValue('--zen-main-browser-background') + "--zen-main-browser-background-old", + docElement.style.getPropertyValue("--zen-main-browser-background") ); docElement.style.setProperty( - '--zen-main-browser-background-toolbar-old', - docElement.style.getPropertyValue('--zen-main-browser-background-toolbar') + "--zen-main-browser-background-toolbar-old", + docElement.style.getPropertyValue("--zen-main-browser-background-toolbar") ); docElement.style.setProperty( - '--zen-background-opacity', + "--zen-background-opacity", browser.gZenThemePicker.previousBackgroundOpacity ?? 1 ); if (browser.gZenThemePicker.previousBackgroundResolve) { @@ -1385,7 +1424,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { } const opacitySlider = browser.document.getElementById( - 'PanelUI-zen-gradient-generator-opacity' + "PanelUI-zen-gradient-generator-opacity" ); { @@ -1393,7 +1432,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { const svg = browser.gZenThemePicker.sliderWavePath; /* eslint-disable no-unused-vars */ const [_, secondStop, thirdStop] = document.querySelectorAll( - '#PanelUI-zen-gradient-generator-slider-wave-gradient stop' + "#PanelUI-zen-gradient-generator-slider-wave-gradient stop" ); // Opacity can only be between lazy.MIN_OPACITY to lazy.MAX_OPACITY. Make opacity relative to that range if (opacity < lazy.MIN_OPACITY) { @@ -1410,63 +1449,64 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { // The offset is the percentage of the wave that is visible, so we need to multiply // the opacity by 100 to get the percentage. // Set the offset of the stops - secondStop.setAttribute('offset', `${opacity * 100}%`); - thirdStop.setAttribute('offset', `${opacity * 100}%`); + secondStop.setAttribute("offset", `${opacity * 100}%`); + thirdStop.setAttribute("offset", `${opacity * 100}%`); const interpolatedPath = this.#interpolateWavePath(opacity); - svg.setAttribute('d', interpolatedPath); - opacitySlider.style.setProperty('--zen-thumb-height', `${40 + opacity * 15}px`); - opacitySlider.style.setProperty('--zen-thumb-width', `${10 + opacity * 15}px`); + svg.setAttribute("d", interpolatedPath); + opacitySlider.style.setProperty("--zen-thumb-height", `${40 + opacity * 15}px`); + opacitySlider.style.setProperty("--zen-thumb-width", `${10 + opacity * 15}px`); svg.style.stroke = interpolatedPath === this.#linePath - ? thirdStop.getAttribute('stop-color') - : 'url(#PanelUI-zen-gradient-generator-slider-wave-gradient)'; + ? thirdStop.getAttribute("stop-color") + : "url(#PanelUI-zen-gradient-generator-slider-wave-gradient)"; } for (const button of browser.document.querySelectorAll( - '#PanelUI-zen-gradient-generator-color-actions button' + "#PanelUI-zen-gradient-generator-color-actions button" )) { // disable if there are no buttons button.disabled = workspaceTheme.gradientColors.length === 0 || - (button.id === 'PanelUI-zen-gradient-generator-color-add' + (button.id === "PanelUI-zen-gradient-generator-color-add" ? workspaceTheme.gradientColors.length >= nsZenThemePicker.MAX_DOTS : false) || - (button.id === 'PanelUI-zen-gradient-generator-color-toggle-algo' + (button.id === "PanelUI-zen-gradient-generator-color-toggle-algo" ? workspaceTheme.gradientColors.length < 2 : false); } const clickToAdd = browser.document.getElementById( - 'PanelUI-zen-gradient-generator-color-click-to-add' + "PanelUI-zen-gradient-generator-color-click-to-add" ); - if (workspaceTheme.gradientColors.length > 0) { - clickToAdd.setAttribute('hidden', 'true'); + if (workspaceTheme.gradientColors.length) { + clickToAdd.setAttribute("hidden", "true"); } else { - clickToAdd.removeAttribute('hidden'); + clickToAdd.removeAttribute("hidden"); } opacitySlider.value = browser.gZenThemePicker.currentOpacity; const textureSelectWrapper = browser.document.getElementById( - 'PanelUI-zen-gradient-generator-texture-wrapper' + "PanelUI-zen-gradient-generator-texture-wrapper" ); const textureWrapperWidth = textureSelectWrapper.getBoundingClientRect().width; // Dont show when hidden if (textureWrapperWidth) { // rotate and trasnform relative to the wrapper width depending on the texture value - const textureValue = this.currentTexture; - const textureHandler = browser.gZenThemePicker._textureHandler; - const rotation = textureValue * 360 - 90; + let textureValue = this.currentTexture; + let textureHandler = browser.gZenThemePicker._textureHandler; + let rotation = textureValue * 360 - 90; textureHandler.style.transform = `rotate(${rotation + 90}deg)`; // add top and left to center the texture handler in relation with textureWrapperWidth // based on the rotation - const top = Math.sin((rotation * Math.PI) / 180) * (textureWrapperWidth / 2) - 6; - const left = Math.cos((rotation * Math.PI) / 180) * (textureWrapperWidth / 2) - 3; + /* eslint-disable no-shadow */ + let top = Math.sin((rotation * Math.PI) / 180) * (textureWrapperWidth / 2) - 6; + let left = Math.cos((rotation * Math.PI) / 180) * (textureWrapperWidth / 2) - 3; textureHandler.style.top = `${textureWrapperWidth / 2 + top}px`; textureHandler.style.left = `${textureWrapperWidth / 2 + left}px`; // Highlight the 16 buttons based on the texture value - const buttons = browser.document.querySelectorAll('.zen-theme-picker-texture-dot'); + let buttons = browser.document.querySelectorAll(".zen-theme-picker-texture-dot"); let i = 4; for (const button of buttons) { - button.classList.toggle('active', i / 16 <= textureValue); + button.classList.toggle("active", i / 16 <= textureValue); i++; // We start at point 4 because that's the first point that is not in the middle of the texture if (i === 16) { @@ -1482,46 +1522,46 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { ); browser.gZenThemePicker.updateNoise(workspaceTheme.texture); - browser.gZenThemePicker.customColorList.innerHTML = ''; + browser.gZenThemePicker.customColorList.innerHTML = ""; for (const dot of workspaceTheme.gradientColors) { if (dot.isCustom) { browser.gZenThemePicker.addColorToCustomList(dot.c); } } - docElement.style.setProperty('--zen-main-browser-background-toolbar', gradientToolbar); - docElement.style.setProperty('--zen-main-browser-background', gradient); + docElement.style.setProperty("--zen-main-browser-background-toolbar", gradientToolbar); + docElement.style.setProperty("--zen-main-browser-background", gradient); const isDarkModeWindow = browser.gZenThemePicker.isDarkMode; if (isDefaultTheme) { - docElement.setAttribute('zen-default-theme', 'true'); + docElement.setAttribute("zen-default-theme", "true"); } else { - docElement.removeAttribute('zen-default-theme'); + docElement.removeAttribute("zen-default-theme"); } if (dominantColor) { const primaryColor = this.getAccentColorForUI(dominantColor); - docElement.style.setProperty('--zen-primary-color', primaryColor); + docElement.style.setProperty("--zen-primary-color", primaryColor); // Should be set to `this.isLegacyVersion` but for some reason it is set to undefined if we open a private window, // so instead get the pref value directly. browser.gZenThemePicker.isLegacyVersion = - Services.prefs.getIntPref('zen.theme.gradient-legacy-version', 1) === 0; + Services.prefs.getIntPref("zen.theme.gradient-legacy-version", 1) === 0; let isDarkMode = isDarkModeWindow; if (!isDefaultTheme && !this.isLegacyVersion) { // Check for the primary color isDarkMode = browser.gZenThemePicker.shouldBeDarkMode(dominantColor); - docElement.setAttribute('zen-should-be-dark-mode', isDarkMode); - browser.gZenThemePicker.panel.removeAttribute('invalidate-controls'); + docElement.setAttribute("zen-should-be-dark-mode", isDarkMode); + browser.gZenThemePicker.panel.removeAttribute("invalidate-controls"); } else { - docElement.removeAttribute('zen-should-be-dark-mode'); + docElement.removeAttribute("zen-should-be-dark-mode"); if (!this.isLegacyVersion) { - browser.gZenThemePicker.panel.setAttribute('invalidate-controls', 'true'); + browser.gZenThemePicker.panel.setAttribute("invalidate-controls", "true"); } } // Set `--toolbox-textcolor` to have a contrast with the primary color const textColor = this.getToolbarColor(isDarkMode); docElement.style.setProperty( - '--toolbox-textcolor', + "--toolbox-textcolor", `rgba(${textColor[0]}, ${textColor[1]}, ${textColor[2]}, ${textColor[3]})` ); } @@ -1535,19 +1575,19 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { fixTheme(theme) { // add a primary color if there isn't one - if (!theme.gradientColors.find((color) => color.isPrimary) && theme.gradientColors.length > 0) { + if (!theme.gradientColors.find((color) => color.isPrimary) && theme.gradientColors.length) { theme.gradientColors[0].isPrimary = true; } return theme; } getNativeAccentColor() { - let accentColor = Services.prefs.getStringPref('zen.theme.accent-color'); + let accentColor = Services.prefs.getStringPref("zen.theme.accent-color"); let rgb; - if (accentColor === 'AccentColor') { - const rawRgb = window.getComputedStyle(document.getElementById('zen-browser-background'))[ - 'color' - ]; + if (accentColor === "AccentColor") { + const rawRgb = window.getComputedStyle( + document.getElementById("zen-browser-background") + ).color; rgb = rawRgb.match(/\d+/g).map(Number); // Match our theme a bit more, since we can't always expect the OS // to give us a color matching our theme scheme @@ -1567,15 +1607,15 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { } resetCustomColorList() { - this.customColorList.innerHTML = ''; + this.customColorList.innerHTML = ""; } removeCustomColor(event) { - const target = event.target.closest('.zen-theme-picker-custom-list-item'); - const color = target.getAttribute('data-color'); - const dots = this.panel.querySelectorAll('.zen-theme-picker-dot'); + const target = event.target.closest(".zen-theme-picker-custom-list-item"); + const color = target.getAttribute("data-color"); + const dots = this.panel.querySelectorAll(".zen-theme-picker-dot"); for (const dot of dots) { - if (dot.style.getPropertyValue('--zen-theme-picker-dot-color') === color) { + if (dot.style.getPropertyValue("--zen-theme-picker-dot-color") === color) { dot.remove(); break; } @@ -1604,21 +1644,21 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { updateCurrentWorkspace(skipSave = true) { this.updated = skipSave; - const dots = this.panel.querySelectorAll('.zen-theme-picker-dot'); + const dots = this.panel.querySelectorAll(".zen-theme-picker-dot"); const colors = Array.from(dots) - .sort((a, b) => a.getAttribute('data-index') - b.getAttribute('data-index')) + .sort((a, b) => a.getAttribute("data-index") - b.getAttribute("data-index")) .map((dot) => { - const color = dot.style.getPropertyValue('--zen-theme-picker-dot-color'); - const isPrimary = dot.classList.contains('primary'); + const color = dot.style.getPropertyValue("--zen-theme-picker-dot-color"); + const isPrimary = dot.classList.contains("primary"); - if (color === 'undefined') { - return; + if (color === "undefined") { + return null; } - const isCustom = dot.classList.contains('custom'); + const isCustom = dot.classList.contains("custom"); const algorithm = this.useAlgo; const position = - dot.getAttribute('data-position') && JSON.parse(dot.getAttribute('data-position')); - const type = dot.getAttribute('data-type'); + dot.getAttribute("data-position") && JSON.parse(dot.getAttribute("data-position")); + const type = dot.getAttribute("data-type"); return { c: isCustom ? color : color.match(/\d+/g).map(Number), isCustom, @@ -1628,7 +1668,8 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { position, type, }; - }); + }) + .filter((color) => Boolean(color)); // remove nulls const gradient = nsZenThemePicker.getTheme(colors, this.currentOpacity, this.currentTexture); let currentWorkspace = gZenWorkspaces.getActiveWorkspace(); @@ -1661,25 +1702,29 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { if (this.#sinePoints.length === 0) { return progress < 0.5 ? linePath : sinePath; } - if (progress <= 0.001) return linePath; - if (progress >= 0.999) return sinePath; + if (progress <= 0.001) { + return linePath; + } + if (progress >= 0.999) { + return sinePath; + } const t = progress; - let newPathData = ''; + let newPathData = ""; this.#sinePoints.forEach((p) => { switch (p.type) { - case 'M': { + case "M": { const interpolatedY = referenceY + (p.y - referenceY) * t; newPathData += `M ${p.x} ${interpolatedY} `; break; } - case 'C': { + case "C": { const y1 = referenceY + (p.y1 - referenceY) * t; const y2 = referenceY + (p.y2 - referenceY) * t; const y = referenceY + (p.y - referenceY) * t; newPathData += `C ${p.x1} ${y1} ${p.x2} ${y2} ${p.x} ${y} `; break; } - case 'L': + case "L": newPathData += `L ${p.x} ${p.y} `; break; } @@ -1689,7 +1734,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { invalidateGradientCache() { this.#gradientsCache = {}; - window.dispatchEvent(new Event('ZenGradientCacheChanged', { bubbles: true })); + window.dispatchEvent(new Event("ZenGradientCacheChanged", { bubbles: true })); } getGradientForWorkspace(workspace) { diff --git a/src/zen/workspaces/ZenWorkspace.mjs b/src/zen/workspaces/ZenWorkspace.mjs index 5cef801f4..3208c4a42 100644 --- a/src/zen/workspaces/ZenWorkspace.mjs +++ b/src/zen/workspaces/ZenWorkspace.mjs @@ -2,14 +2,15 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { nsZenFolder } from 'chrome://browser/content/zen-components/ZenFolder.mjs'; +import { nsZenFolder } from "chrome://browser/content/zen-components/ZenFolder.mjs"; // A helper class to manage collapsible pinned tabs in a workspace. + class nsZenCollapsiblePins extends nsZenFolder { #spaceElement; connectedCallback() { - this.setAttribute('hidden', 'true'); + this.setAttribute("hidden", "true"); this.#spaceElement = this.parentElement; super.connectedCallback(); } @@ -21,7 +22,7 @@ class nsZenCollapsiblePins extends nsZenFolder { get groupStartElement() { // Fetch this instead of the tab-group-start since it is not guaranteed this // element will be the first child of the pinned tabs container. - return this.#spaceElement.pinnedTabsContainer.querySelector('.space-fake-collapsible-start'); + return this.#spaceElement.pinnedTabsContainer.querySelector(".space-fake-collapsible-start"); } get collapsed() { @@ -30,9 +31,9 @@ class nsZenCollapsiblePins extends nsZenFolder { set collapsed(value) { if (value) { - this.#spaceElement.setAttribute('collapsedpinnedtabs', 'true'); + this.#spaceElement.setAttribute("collapsedpinnedtabs", "true"); } else { - this.#spaceElement.removeAttribute('collapsedpinnedtabs'); + this.#spaceElement.removeAttribute("collapsedpinnedtabs"); } super.collapsed = value; gBrowser.tabContainer._invalidateCachedVisibleTabs(); @@ -95,7 +96,7 @@ export class nsZenWorkspace extends MozXULElement { static get inheritedAttributes() { return { - '.zen-workspace-tabs-section': 'zen-workspace-id=id', + ".zen-workspace-tabs-section": "zen-workspace-id=id", }; } @@ -113,27 +114,27 @@ export class nsZenWorkspace extends MozXULElement { this.#hasConnected = true; this.appendChild(this.constructor.fragment); - this.tabsContainer = this.querySelector('.zen-workspace-normal-tabs-section'); - this.indicator = this.querySelector('.zen-current-workspace-indicator'); - this.pinnedTabsContainer = this.querySelector('.zen-workspace-pinned-tabs-section'); + this.tabsContainer = this.querySelector(".zen-workspace-normal-tabs-section"); + this.indicator = this.querySelector(".zen-current-workspace-indicator"); + this.pinnedTabsContainer = this.querySelector(".zen-workspace-pinned-tabs-section"); this.pinnedTabsContainer.separatorElement = this.pinnedTabsContainer.querySelector( - '.pinned-tabs-container-separator' + ".pinned-tabs-container-separator" ); this.initializeAttributeInheritance(); - this.scrollbox = this.querySelector('arrowscrollbox'); + this.scrollbox = this.querySelector("arrowscrollbox"); this.scrollbox.smoothScroll = Services.prefs.getBoolPref( - 'zen.startup.smooth-scroll-in-tabs', + "zen.startup.smooth-scroll-in-tabs", false ); - this.scrollbox.addEventListener('wheel', this, true); - this.scrollbox.addEventListener('underflow', this); - this.scrollbox.addEventListener('overflow', this); + this.scrollbox.addEventListener("wheel", this, true); + this.scrollbox.addEventListener("underflow", this); + this.scrollbox.addEventListener("overflow", this); - const indicatorName = this.indicator.querySelector('.zen-current-workspace-indicator-name'); + const indicatorName = this.indicator.querySelector(".zen-current-workspace-indicator-name"); indicatorName.onRenameFinished = this.onIndicatorRenameFinished.bind(this); - indicatorName.addEventListener('dblclick', (event) => { + indicatorName.addEventListener("dblclick", (event) => { if (this.hasPinnedTabs) { // Prevent renaming when there are pinned tabs event.stopPropagation(); @@ -144,12 +145,12 @@ export class nsZenWorkspace extends MozXULElement { this.#initialPinnedElementChildrenCount = this.pinnedTabsContainer.children.length; this.indicator - .querySelector('.zen-workspaces-actions') - .addEventListener('click', this.onActionsCommand.bind(this)); + .querySelector(".zen-workspaces-actions") + .addEventListener("click", this.onActionsCommand.bind(this)); this.indicator - .querySelector('.zen-current-workspace-indicator-icon') - .addEventListener('dblclick', (event) => { + .querySelector(".zen-current-workspace-indicator-icon") + .addEventListener("dblclick", (event) => { if (this.hasPinnedTabs) { return; } @@ -157,7 +158,7 @@ export class nsZenWorkspace extends MozXULElement { gZenWorkspaces.changeWorkspaceIcon(); }); - this.indicator.addEventListener('click', (event) => { + this.indicator.addEventListener("click", (event) => { if (this.hasPinnedTabs && event.button === 0) { event.stopPropagation(); this.collapsiblePins.toggle(); @@ -165,14 +166,14 @@ export class nsZenWorkspace extends MozXULElement { }); if (!gZenWorkspaces.currentWindowIsSyncing) { - let actionsButton = this.indicator.querySelector('.zen-workspaces-actions'); + let actionsButton = this.indicator.querySelector(".zen-workspaces-actions"); const moveTabToFragment = window.MozXULElement.parseXULToFragment( nsZenWorkspace.moveTabToButtonMarkup ); actionsButton.after(moveTabToFragment); - actionsButton.setAttribute('hidden', 'true'); + actionsButton.setAttribute("hidden", "true"); actionsButton = actionsButton.nextElementSibling; - actionsButton.addEventListener('command', (event) => { + actionsButton.addEventListener("command", (event) => { event.stopPropagation(); this.#openMoveTabsToWorkspacePanel(event.target); }); @@ -180,9 +181,9 @@ export class nsZenWorkspace extends MozXULElement { this.scrollbox._getScrollableElements = () => { const children = [...this.pinnedTabsContainer.children, ...this.tabsContainer.children]; - if (Services.prefs.getBoolPref('zen.view.show-newtab-button-top', false)) { + if (Services.prefs.getBoolPref("zen.view.show-newtab-button-top", false)) { // Move the perifery to the first non-pinned tab - const periphery = this.tabsContainer.querySelector('#tabbrowser-arrowscrollbox-periphery'); + const periphery = this.tabsContainer.querySelector("#tabbrowser-arrowscrollbox-periphery"); if (periphery) { const firstNonPinnedTabIndex = children.findIndex( (child) => gBrowser.isTab(child) && !child.pinned @@ -207,9 +208,9 @@ export class nsZenWorkspace extends MozXULElement { this.scrollbox._canScrollToElement = (element) => { if (gBrowser.isTab(element)) { return ( - !element.hasAttribute('zen-essential') && - !this.hasAttribute('positionpinnedtabs') && - !element.hasAttribute('zen-empty-tab') + !element.hasAttribute("zen-essential") && + !this.hasAttribute("positionpinnedtabs") && + !element.hasAttribute("zen-empty-tab") ); } return true; @@ -225,27 +226,27 @@ export class nsZenWorkspace extends MozXULElement { // that shouldn't be a problem in practice since the arrowscrollbox // stops at element bounds when finishing scrolling. try { - Object.defineProperty(this.scrollbox, 'lineScrollAmount', { + Object.defineProperty(this.scrollbox, "lineScrollAmount", { get: () => 36, }); } catch (e) { - console.warn('Failed to set lineScrollAmount', e); + console.warn("Failed to set lineScrollAmount", e); } // Add them manually since attribute inheritance doesn't work // for multiple layers of shadow DOM. - this.tabsContainer.setAttribute('zen-workspace-id', this.id); - this.pinnedTabsContainer.setAttribute('zen-workspace-id', this.id); + this.tabsContainer.setAttribute("zen-workspace-id", this.id); + this.pinnedTabsContainer.setAttribute("zen-workspace-id", this.id); - this.collapsiblePins = document.createXULElement('zen-workspace-collapsible-pins'); + this.collapsiblePins = document.createXULElement("zen-workspace-collapsible-pins"); this.prepend(this.collapsiblePins); this.#updateOverflow(); this.onGradientCacheChanged = this.#onGradientCacheChanged.bind(this); - window.addEventListener('ZenGradientCacheChanged', this.onGradientCacheChanged); + window.addEventListener("ZenGradientCacheChanged", this.onGradientCacheChanged); - this.pinnedTabsContainer.addEventListener('TabPinned', () => { + this.pinnedTabsContainer.addEventListener("TabPinned", () => { // If a tab is pinned and the pinned tabs section is collapsed, uncollapse it. if (this.collapsiblePins.collapsed) { this.collapsiblePins.collapsed = false; @@ -256,9 +257,9 @@ export class nsZenWorkspace extends MozXULElement { this.checkPinsExistence(); }; - this.addEventListener('TabPinned', tabPinCallback); - this.addEventListener('TabUnpinned', tabPinCallback); - this.addEventListener('TabClose', (event) => { + this.addEventListener("TabPinned", tabPinCallback); + this.addEventListener("TabUnpinned", tabPinCallback); + this.addEventListener("TabClose", (event) => { if (event.target.pinned) { tabPinCallback(); } @@ -266,36 +267,38 @@ export class nsZenWorkspace extends MozXULElement { } disconnectedCallback() { - window.removeEventListener('ZenGradientCacheChanged', this.onGradientCacheChanged); + window.removeEventListener("ZenGradientCacheChanged", this.onGradientCacheChanged); } get active() { - return this.hasAttribute('active'); + return this.hasAttribute("active"); } set active(value) { if (value) { - this.setAttribute('active', 'true'); + this.setAttribute("active", "true"); } else { - this.removeAttribute('active'); + this.removeAttribute("active"); } this.#updateOverflow(); } get hasPinnedTabs() { - return this.hasAttribute('haspinnedtabs'); + return this.hasAttribute("haspinnedtabs"); } get hasCollapsedPinnedTabs() { - return this.hasAttribute('collapsedpinnedtabs'); + return this.hasAttribute("collapsedpinnedtabs"); } #updateOverflow() { - if (!this.scrollbox) return; + if (!this.scrollbox) { + return; + } if (this.overflows) { - this.#dispatchEventFromScrollbox('overflow'); + this.#dispatchEventFromScrollbox("overflow"); } else { - this.#dispatchEventFromScrollbox('underflow'); + this.#dispatchEventFromScrollbox("underflow"); } } @@ -318,35 +321,37 @@ export class nsZenWorkspace extends MozXULElement { } async onIndicatorRenameFinished(newName) { - if (newName === '') { + if (newName === "") { return; } let workspaces = gZenWorkspaces.getWorkspaces(); let workspaceData = workspaces.find((workspace) => workspace.uuid === this.workspaceUuid); workspaceData.name = newName; await gZenWorkspaces.saveWorkspace(workspaceData); - this.indicator.querySelector('.zen-current-workspace-indicator-name').textContent = newName; - gZenUIManager.showToast('zen-workspace-renamed-toast'); + this.indicator.querySelector(".zen-current-workspace-indicator-name").textContent = newName; + gZenUIManager.showToast("zen-workspace-renamed-toast"); } onActionsCommand(event) { event.stopPropagation(); - const popup = document.getElementById('zenWorkspaceMoreActions'); + const popup = document.getElementById("zenWorkspaceMoreActions"); const target = event.target; - target.setAttribute('open', 'true'); - this.indicator.setAttribute('open', 'true'); + target.setAttribute("open", "true"); + this.indicator.setAttribute("open", "true"); const handlePopupHidden = (event) => { - if (event.target !== popup) return; - target.removeAttribute('open'); - this.indicator.removeAttribute('open'); - popup.removeEventListener('popuphidden', handlePopupHidden); + if (event.target !== popup) { + return; + } + target.removeAttribute("open"); + this.indicator.removeAttribute("open"); + popup.removeEventListener("popuphidden", handlePopupHidden); }; - popup.addEventListener('popuphidden', handlePopupHidden); - popup.openPopup(event.target, 'after_start'); + popup.addEventListener("popuphidden", handlePopupHidden); + popup.openPopup(event.target, "after_start"); } get newTabButton() { - return this.querySelector('#tabs-newtab-button'); + return this.querySelector("#tabs-newtab-button"); } #onGradientCacheChanged() { @@ -355,59 +360,61 @@ export class nsZenWorkspace extends MozXULElement { gZenWorkspaces.getWorkspaceFromId(this.workspaceUuid) ); if (isExplicitMode) { - this.style.colorScheme = isDarkMode ? 'dark' : 'light'; + this.style.colorScheme = isDarkMode ? "dark" : "light"; } else { - this.style.colorScheme = ''; + this.style.colorScheme = ""; } - this.style.setProperty('--toolbox-textcolor', `rgb(${toolbarColor.join(',')})`); - this.style.setProperty('--zen-primary-color', primaryColor); + this.style.setProperty("--toolbox-textcolor", `rgb(${toolbarColor.join(",")})`); + this.style.setProperty("--zen-primary-color", primaryColor); } checkPinsExistence() { if (this.pinnedTabsContainer.children.length > this.#initialPinnedElementChildrenCount) { - this.setAttribute('haspinnedtabs', 'true'); + this.setAttribute("haspinnedtabs", "true"); } else { - this.removeAttribute('haspinnedtabs'); + this.removeAttribute("haspinnedtabs"); this.collapsiblePins.collapsed = false; } } clearThemeStyles() { - this.style.colorScheme = ''; - this.style.removeProperty('--toolbox-textcolor'); - this.style.removeProperty('--zen-primary-color'); + this.style.colorScheme = ""; + this.style.removeProperty("--toolbox-textcolor"); + this.style.removeProperty("--zen-primary-color"); } #openMoveTabsToWorkspacePanel(button) { - button = button.closest('toolbarbutton'); - if (!button) return; + button = button.closest("toolbarbutton"); + if (!button) { + return; + } - const popup = document.getElementById('zenMoveTabsToSyncedWorkspacePopup'); - popup.innerHTML = ''; + const popup = document.getElementById("zenMoveTabsToSyncedWorkspacePopup"); + popup.innerHTML = ""; const workspaces = gZenWorkspaces.getWorkspaces(true); for (const workspace of workspaces) { const item = gZenWorkspaces.generateMenuItemForWorkspace(workspace); - item.addEventListener('command', async () => { + item.addEventListener("command", async () => { const { ZenWindowSync } = ChromeUtils.importESModule( - 'resource:///modules/zen/ZenWindowSync.sys.mjs' + "resource:///modules/zen/ZenWindowSync.sys.mjs" ); ZenWindowSync.moveTabsToSyncedWorkspace(window, workspace.uuid); }); popup.appendChild(item); } - button.setAttribute('open', 'true'); + button.setAttribute("open", "true"); popup.addEventListener( - 'popuphidden', + "popuphidden", () => { - button.removeAttribute('open'); + button.removeAttribute("open"); }, { once: true } ); - popup.openPopup(button, 'after_start', 0, 0, true /* isContextMenu */); + popup.openPopup(button, "after_start", 0, 0, true /* isContextMenu */); } } -customElements.define('zen-workspace', nsZenWorkspace); -customElements.define('zen-workspace-collapsible-pins', nsZenCollapsiblePins); +customElements.define("zen-workspace", nsZenWorkspace); +customElements.define("zen-workspace-collapsible-pins", nsZenCollapsiblePins); diff --git a/src/zen/workspaces/ZenWorkspaceBookmarksStorage.js b/src/zen/workspaces/ZenWorkspaceBookmarksStorage.js index f7df8a31e..547ed5783 100644 --- a/src/zen/workspaces/ZenWorkspaceBookmarksStorage.js +++ b/src/zen/workspaces/ZenWorkspaceBookmarksStorage.js @@ -8,15 +8,17 @@ window.ZenWorkspaceBookmarksStorage = { async init() { ChromeUtils.defineESModuleGetters(this.lazy, { - PlacesUtils: 'resource://gre/modules/PlacesUtils.sys.mjs', + PlacesUtils: "resource://gre/modules/PlacesUtils.sys.mjs", }); - if (!window.gZenWorkspaces) return; + if (!window.gZenWorkspaces) { + return; + } await this._ensureTable(); }, async _ensureTable() { await this.lazy.PlacesUtils.withConnectionWrapper( - 'ZenWorkspaceBookmarksStorage.init', + "ZenWorkspaceBookmarksStorage.init", async (db) => { // Create table using GUIDs instead of IDs await db.execute(` @@ -61,7 +63,8 @@ window.ZenWorkspaceBookmarksStorage = { /** * Updates the last change timestamp in the metadata table. - * @param {Object} db - The database connection. + * + * @param {object} db - The database connection. */ async updateLastChangeTimestamp(db) { const now = Date.now(); @@ -76,6 +79,7 @@ window.ZenWorkspaceBookmarksStorage = { /** * Gets the timestamp of the last change. + * * @returns {Promise} The timestamp of the last change. */ async getLastChangeTimestamp() { @@ -83,7 +87,7 @@ window.ZenWorkspaceBookmarksStorage = { const result = await db.executeCached(` SELECT value FROM moz_meta WHERE key = 'zen_bookmarks_workspaces_last_change' `); - return result.length ? parseInt(result[0].getResultByName('value'), 10) : 0; + return result.length ? parseInt(result[0].getResultByName("value"), 10) : 0; }, async getBookmarkWorkspaces(bookmarkGuid) { @@ -98,12 +102,13 @@ window.ZenWorkspaceBookmarksStorage = { { bookmark_guid: bookmarkGuid } ); - return rows.map((row) => row.getResultByName('workspace_uuid')); + return rows.map((row) => row.getResultByName("workspace_uuid")); }, /** * Get all bookmark GUIDs organized by workspace UUID. - * @returns {Promise} A dictionary with workspace UUIDs as keys and arrays of bookmark GUIDs as values. + * + * @returns {Promise} A dictionary with workspace UUIDs as keys and arrays of bookmark GUIDs as values. * @example * // Returns: * { @@ -122,9 +127,9 @@ window.ZenWorkspaceBookmarksStorage = { const result = {}; for (const row of rows) { - const workspaceUuid = row.getResultByName('workspace_uuid'); - const bookmarkGuids = row.getResultByName('bookmark_guids'); - result[workspaceUuid] = bookmarkGuids ? bookmarkGuids.split(',') : []; + const workspaceUuid = row.getResultByName("workspace_uuid"); + const bookmarkGuids = row.getResultByName("bookmark_guids"); + result[workspaceUuid] = bookmarkGuids ? bookmarkGuids.split(",") : []; } return result; @@ -132,7 +137,8 @@ window.ZenWorkspaceBookmarksStorage = { /** * Get all changed bookmarks with their change types. - * @returns {Promise} An object mapping bookmark+workspace pairs to their change data. + * + * @returns {Promise} An object mapping bookmark+workspace pairs to their change data. */ async getChangedIDs() { const db = await this.lazy.PlacesUtils.promiseDBConnection(); @@ -143,10 +149,10 @@ window.ZenWorkspaceBookmarksStorage = { const changes = {}; for (const row of rows) { - const key = `${row.getResultByName('bookmark_guid')}:${row.getResultByName('workspace_uuid')}`; + const key = `${row.getResultByName("bookmark_guid")}:${row.getResultByName("workspace_uuid")}`; changes[key] = { - type: row.getResultByName('change_type'), - timestamp: row.getResultByName('timestamp'), + type: row.getResultByName("change_type"), + timestamp: row.getResultByName("timestamp"), }; } return changes; @@ -157,7 +163,7 @@ window.ZenWorkspaceBookmarksStorage = { */ async clearChangedIDs() { await this.lazy.PlacesUtils.withConnectionWrapper( - 'ZenWorkspaceBookmarksStorage.clearChangedIDs', + "ZenWorkspaceBookmarksStorage.clearChangedIDs", async (db) => { await db.execute(`DELETE FROM zen_bookmarks_workspaces_changes`); } diff --git a/src/zen/workspaces/ZenWorkspaceCreation.mjs b/src/zen/workspaces/ZenWorkspaceCreation.mjs index 4144ac4f5..05db95c35 100644 --- a/src/zen/workspaces/ZenWorkspaceCreation.mjs +++ b/src/zen/workspaces/ZenWorkspaceCreation.mjs @@ -13,12 +13,12 @@ class nsZenWorkspaceCreation extends MozXULElement { static get elementsToDisable() { return [ - 'cmd_zenOpenWorkspacePanel', - 'cmd_zenOpenWorkspaceCreation', - 'cmd_zenOpenFolderCreation', - 'cmd_zenToggleSidebar', - 'cmd_newNavigatorTab', - 'cmd_newNavigatorTabNoEvent', + "cmd_zenOpenWorkspacePanel", + "cmd_zenOpenWorkspaceCreation", + "cmd_zenOpenFolderCreation", + "cmd_zenToggleSidebar", + "cmd_newNavigatorTab", + "cmd_newNavigatorTabNoEvent", ]; } @@ -64,20 +64,20 @@ class nsZenWorkspaceCreation extends MozXULElement { } get workspaceId() { - return this.getAttribute('workspace-id'); + return this.getAttribute("workspace-id"); } get previousWorkspaceId() { - return this.getAttribute('previous-workspace-id'); + return this.getAttribute("previous-workspace-id"); } get elementsToAnimate() { return [ - this.querySelector('.zen-workspace-creation-title'), - this.querySelector('.zen-workspace-creation-label').parentElement, - this.querySelector('.zen-workspace-creation-name-wrapper'), - this.querySelector('.zen-workspace-creation-profile-wrapper'), - this.querySelector('.zen-workspace-creation-edit-theme-button'), + this.querySelector(".zen-workspace-creation-title"), + this.querySelector(".zen-workspace-creation-label").parentElement, + this.querySelector(".zen-workspace-creation-name-wrapper"), + this.querySelector(".zen-workspace-creation-profile-wrapper"), + this.querySelector(".zen-workspace-creation-edit-theme-button"), this.createButton.parentNode, this.cancelButton, ]; @@ -93,21 +93,21 @@ class nsZenWorkspaceCreation extends MozXULElement { this.appendChild(this.constructor.fragment); this.initializeAttributeInheritance(); - this.inputName = this.querySelector('.zen-workspace-creation-name'); - this.inputIcon = this.querySelector('.zen-workspace-creation-icon-label'); - this.inputProfile = this.querySelector('.zen-workspace-creation-profile'); - this.createButton = this.querySelector('.zen-workspace-creation-create-button'); - this.cancelButton = this.querySelector('.zen-workspace-creation-cancel-button'); + this.inputName = this.querySelector(".zen-workspace-creation-name"); + this.inputIcon = this.querySelector(".zen-workspace-creation-icon-label"); + this.inputProfile = this.querySelector(".zen-workspace-creation-profile"); + this.createButton = this.querySelector(".zen-workspace-creation-create-button"); + this.cancelButton = this.querySelector(".zen-workspace-creation-cancel-button"); for (const element of this.elementsToAnimate) { element.style.opacity = 0; } this.#wasInCollapsedMode = - document.documentElement.getAttribute('zen-sidebar-expanded') !== 'true'; + document.documentElement.getAttribute("zen-sidebar-expanded") !== "true"; - gNavToolbox.setAttribute('zen-sidebar-expanded', 'true'); - document.documentElement.setAttribute('zen-sidebar-expanded', 'true'); + gNavToolbox.setAttribute("zen-sidebar-expanded", "true"); + document.documentElement.setAttribute("zen-sidebar-expanded", "true"); window.docShell.treeOwner .QueryInterface(Ci.nsIInterfaceRequestor) @@ -126,35 +126,35 @@ class nsZenWorkspaceCreation extends MozXULElement { for (const element of nsZenWorkspaceCreation.elementsToDisable) { const el = document.getElementById(element); if (el) { - el.setAttribute('disabled', 'true'); + el.setAttribute("disabled", "true"); } } - this.createButton.addEventListener('command', this.onCreateButtonCommand.bind(this)); - this.cancelButton.addEventListener('command', this.onCancelButtonCommand.bind(this)); + this.createButton.addEventListener("command", this.onCreateButtonCommand.bind(this)); + this.cancelButton.addEventListener("command", this.onCancelButtonCommand.bind(this)); - this.inputName.addEventListener('input', () => { + this.inputName.addEventListener("input", () => { this.createButton.disabled = !this.inputName.value.trim(); }); - this.inputIcon.addEventListener('command', this.onIconCommand.bind(this)); + this.inputIcon.addEventListener("command", this.onIconCommand.bind(this)); - this.profilesPopup = this.querySelector('.zen-workspace-creation-profiles-popup'); + this.profilesPopup = this.querySelector(".zen-workspace-creation-profiles-popup"); if (gZenWorkspaces.shouldShowContainers) { - this.inputProfile.addEventListener('command', this.onProfileCommand.bind(this)); - this.profilesPopup.addEventListener('popupshown', this.onProfilePopupShown.bind(this)); - this.profilesPopup.addEventListener('command', this.onProfilePopupCommand.bind(this)); + this.inputProfile.addEventListener("command", this.onProfileCommand.bind(this)); + this.profilesPopup.addEventListener("popupshown", this.onProfilePopupShown.bind(this)); + this.profilesPopup.addEventListener("command", this.onProfilePopupCommand.bind(this)); this.currentProfile = { id: 0, - name: 'Default', + name: "Default", }; } else { this.inputProfile.parentNode.hidden = true; } - document.getElementById('zen-sidebar-splitter').style.pointerEvents = 'none'; + document.getElementById("zen-sidebar-splitter").style.pointerEvents = "none"; gZenUIManager.motion .animate( @@ -164,16 +164,16 @@ class nsZenWorkspaceCreation extends MozXULElement { }, { duration: 0.3, - type: 'spring', + type: "spring", bounce: 0, } ) .then(() => { - gBrowser.tabContainer.style.visibility = 'collapse'; + gBrowser.tabContainer.style.visibility = "collapse"; if (gZenVerticalTabsManager._hasSetSingleToolbar) { - document.getElementById('nav-bar').style.visibility = 'collapse'; + document.getElementById("nav-bar").style.visibility = "collapse"; } - this.style.visibility = 'visible'; + this.style.visibility = "visible"; gZenCompactModeManager.getAndApplySidebarWidth(); this.resolveInitialized(); gZenUIManager.motion @@ -182,11 +182,11 @@ class nsZenWorkspaceCreation extends MozXULElement { { y: [20, 0], opacity: [0, 1], - filter: ['blur(2px)', 'blur(0)'], + filter: ["blur(2px)", "blur(0)"], }, { duration: 0.6, - type: 'spring', + type: "spring", bounce: 0, delay: gZenUIManager.motion.stagger(0.05, { startDelay: 0.2 }), } @@ -221,19 +221,19 @@ class nsZenWorkspaceCreation extends MozXULElement { gZenEmojiPicker .open(event.target) .then(async (emoji) => { - const isSvg = emoji && emoji.endsWith('.svg'); + const isSvg = emoji && emoji.endsWith(".svg"); if (isSvg) { - this.inputIcon.label = ''; + this.inputIcon.label = ""; this.inputIcon.image = emoji; - this.inputIcon.setAttribute('has-svg-icon', 'true'); + this.inputIcon.setAttribute("has-svg-icon", "true"); } else { - this.inputIcon.image = ''; - this.inputIcon.label = emoji || ''; - this.inputIcon.removeAttribute('has-svg-icon'); + this.inputIcon.image = ""; + this.inputIcon.label = emoji || ""; + this.inputIcon.removeAttribute("has-svg-icon"); } }) .catch((error) => { - console.warn('Error changing workspace icon:', error); + console.warn("Error changing workspace icon:", error); }); } @@ -247,7 +247,7 @@ class nsZenWorkspaceCreation extends MozXULElement { } onProfileCommand(event) { - this.profilesPopup.openPopup(event.target, 'after_start'); + this.profilesPopup.openPopup(event.target, "after_start"); } onProfilePopupShown(event) { @@ -258,7 +258,7 @@ class nsZenWorkspaceCreation extends MozXULElement { } onProfilePopupCommand(event) { - let userContextId = parseInt(event.target.getAttribute('data-usercontextid')); + let userContextId = parseInt(event.target.getAttribute("data-usercontextid")); if (isNaN(userContextId)) { return; } @@ -283,37 +283,37 @@ class nsZenWorkspaceCreation extends MozXULElement { { y: [0, 20], opacity: [1, 0], - filter: ['blur(0)', 'blur(2px)'], + filter: ["blur(0)", "blur(2px)"], }, { duration: 0.4, - type: 'spring', + type: "spring", bounce: 0, delay: gZenUIManager.motion.stagger(0.05), } ); - document.getElementById('zen-sidebar-splitter').style.pointerEvents = ''; + document.getElementById("zen-sidebar-splitter").style.pointerEvents = ""; gZenWorkspaces.removeChangeListeners(this.handleZenWorkspacesChangeBind); for (const element of this.constructor.elementsToDisable) { const el = document.getElementById(element); if (el) { - el.removeAttribute('disabled'); + el.removeAttribute("disabled"); } } if (this.#wasInCollapsedMode) { - gNavToolbox.removeAttribute('zen-sidebar-expanded'); - document.documentElement.removeAttribute('zen-sidebar-expanded'); + gNavToolbox.removeAttribute("zen-sidebar-expanded"); + document.documentElement.removeAttribute("zen-sidebar-expanded"); } - document.documentElement.removeAttribute('zen-creating-workspace'); + document.documentElement.removeAttribute("zen-creating-workspace"); - gBrowser.tabContainer.style.visibility = ''; + gBrowser.tabContainer.style.visibility = ""; gBrowser.tabContainer.style.opacity = 0; if (gZenVerticalTabsManager._hasSetSingleToolbar) { - document.getElementById('nav-bar').style.visibility = ''; + document.getElementById("nav-bar").style.visibility = ""; gURLBar.style.opacity = 0; } @@ -331,14 +331,14 @@ class nsZenWorkspaceCreation extends MozXULElement { }, { duration: 0.3, - type: 'spring', + type: "spring", bounce: 0, } ); - gBrowser.tabContainer.style.opacity = ''; + gBrowser.tabContainer.style.opacity = ""; if (gZenVerticalTabsManager._hasSetSingleToolbar) { - gURLBar.style.opacity = ''; + gURLBar.style.opacity = ""; } for (const element of this.#hiddenElements) { @@ -349,4 +349,4 @@ class nsZenWorkspaceCreation extends MozXULElement { } } -customElements.define('zen-workspace-creation', nsZenWorkspaceCreation); +customElements.define("zen-workspace-creation", nsZenWorkspaceCreation); diff --git a/src/zen/workspaces/ZenWorkspaceIcons.mjs b/src/zen/workspaces/ZenWorkspaceIcons.mjs index 85628dcf3..94ec518cf 100644 --- a/src/zen/workspaces/ZenWorkspaceIcons.mjs +++ b/src/zen/workspaces/ZenWorkspaceIcons.mjs @@ -15,14 +15,14 @@ class nsZenWorkspaceIcons extends MozXULElement { } this.#hasConnected = true; - window.addEventListener('ZenWorkspacesUIUpdate', this, true); + window.addEventListener("ZenWorkspacesUIUpdate", this, true); this.initDragAndDrop(); - this.addEventListener('mouseover', (e) => { + this.addEventListener("mouseover", (e) => { if (this.isReorderMode) { return; } - const target = e.target.closest('toolbarbutton[zen-workspace-id]'); + const target = e.target.closest("toolbarbutton[zen-workspace-id]"); if (target) { this.scrollLeft = target.offsetLeft - 10; } @@ -33,19 +33,19 @@ class nsZenWorkspaceIcons extends MozXULElement { let dragStart = 0; let draggedTab = null; - this.addEventListener('mousedown', (e) => { - const target = e.target.closest('toolbarbutton[zen-workspace-id]'); + this.addEventListener("mousedown", (e) => { + const target = e.target.closest("toolbarbutton[zen-workspace-id]"); if (!target || e.button != 0 || e.ctrlKey || e.shiftKey || e.altKey) { return; } - const isVertical = document.documentElement.getAttribute('zen-sidebar-expanded') != 'true'; - const clientPos = isVertical ? 'clientY' : 'clientX'; + const isVertical = document.documentElement.getAttribute("zen-sidebar-expanded") != "true"; + const clientPos = isVertical ? "clientY" : "clientX"; this.isReorderMode = false; dragStart = e[clientPos]; draggedTab = target; - draggedTab.setAttribute('dragged', 'true'); + draggedTab.setAttribute("dragged", "true"); e.stopPropagation(); @@ -59,22 +59,25 @@ class nsZenWorkspaceIcons extends MozXULElement { const mouse = moveEvent[clientPos]; for (const tab of tabs) { - if (tab === draggedTab) continue; + if (tab === draggedTab) { + continue; + } const rect = tab.getBoundingClientRect(); if ( - mouse > rect[isVertical ? 'top' : 'left'] && - mouse < rect[isVertical ? 'bottom' : 'right'] + mouse > rect[isVertical ? "top" : "left"] && + mouse < rect[isVertical ? "bottom" : "right"] ) { const nextSibling = draggedTab.nextSibling; if ( mouse < - rect[isVertical ? 'top' : 'left'] + rect[isVertical ? 'height' : 'width'] / 2 + rect[isVertical ? "top" : "left"] + rect[isVertical ? "height" : "width"] / 2 ) { this.insertBefore(draggedTab, tab); } else { this.insertBefore(draggedTab, tab.nextSibling); } if (nextSibling !== draggedTab.nextSibling) { + /* eslint-disable mozilla/valid-services */ Services.zen.playHapticFeedback(); } } @@ -83,10 +86,10 @@ class nsZenWorkspaceIcons extends MozXULElement { }; const mouseUpHandler = () => { - document.removeEventListener('mousemove', mouseMoveHandler); - document.removeEventListener('mouseup', mouseUpHandler); + document.removeEventListener("mousemove", mouseMoveHandler); + document.removeEventListener("mouseup", mouseUpHandler); - draggedTab.removeAttribute('dragged'); + draggedTab.removeAttribute("dragged"); this.reorderWorkspaceToIndex(draggedTab, Array.from(this.children).indexOf(draggedTab)); @@ -94,57 +97,57 @@ class nsZenWorkspaceIcons extends MozXULElement { this.isReorderMode = false; }; - document.addEventListener('mousemove', mouseMoveHandler); - document.addEventListener('mouseup', mouseUpHandler); + document.addEventListener("mousemove", mouseMoveHandler); + document.addEventListener("mouseup", mouseUpHandler); }); } #createWorkspaceIcon(workspace) { - const button = document.createXULElement('toolbarbutton'); - button.setAttribute('class', 'subviewbutton toolbarbutton-1'); - button.setAttribute('tooltiptext', workspace.name); - button.setAttribute('zen-workspace-id', workspace.uuid); - button.setAttribute('context', 'zenWorkspaceMoreActions'); - const icon = document.createXULElement('label'); - icon.setAttribute('class', 'zen-workspace-icon'); - const isSvgIcon = workspace.icon && workspace.icon.endsWith('.svg'); + const button = document.createXULElement("toolbarbutton"); + button.setAttribute("class", "subviewbutton toolbarbutton-1"); + button.setAttribute("tooltiptext", workspace.name); + button.setAttribute("zen-workspace-id", workspace.uuid); + button.setAttribute("context", "zenWorkspaceMoreActions"); + const icon = document.createXULElement("label"); + icon.setAttribute("class", "zen-workspace-icon"); + const isSvgIcon = workspace.icon && workspace.icon.endsWith(".svg"); if (gZenWorkspaces.workspaceHasIcon(workspace)) { if (isSvgIcon) { - const image = document.createElement('img'); + const image = document.createElement("img"); image.src = workspace.icon; - image.classList.add('zen-workspace-icon'); + image.classList.add("zen-workspace-icon"); button.appendChild(image); } else { icon.textContent = workspace.icon; } } else { - icon.setAttribute('no-icon', true); + icon.setAttribute("no-icon", true); } if (!isSvgIcon) { button.appendChild(icon); } - button.addEventListener('command', this); + button.addEventListener("command", this); return button; } async #updateIcons() { const workspaces = gZenWorkspaces.getWorkspaces(); - this.innerHTML = ''; + this.innerHTML = ""; for (const workspace of workspaces) { const button = this.#createWorkspaceIcon(workspace); this.appendChild(button); } if (workspaces.length <= 1) { - this.setAttribute('dont-show', 'true'); + this.setAttribute("dont-show", "true"); } else { - this.removeAttribute('dont-show'); + this.removeAttribute("dont-show"); } gZenWorkspaces.onWindowResize(); } on_command(event) { const button = event.target; - const uuid = button.getAttribute('zen-workspace-id'); + const uuid = button.getAttribute("zen-workspace-id"); if (uuid) { gZenWorkspaces.changeWorkspaceWithID(uuid); } @@ -156,35 +159,35 @@ class nsZenWorkspaceIcons extends MozXULElement { } set activeIndex(uuid) { - const buttons = this.querySelectorAll('toolbarbutton'); + const buttons = this.querySelectorAll("toolbarbutton"); if (!buttons.length) { return; } let i = 0; let selected = -1; for (const button of buttons) { - if (button.getAttribute('zen-workspace-id') == uuid) { + if (button.getAttribute("zen-workspace-id") == uuid) { selected = i; } else { - button.removeAttribute('active'); + button.removeAttribute("active"); } i++; } if (selected == -1) { return; } - buttons[selected].setAttribute('active', true); + buttons[selected].setAttribute("active", true); this.scrollLeft = buttons[selected].offsetLeft - 10; - this.setAttribute('selected', selected); + this.setAttribute("selected", selected); } get activeIndex() { - const selected = this.getAttribute('selected'); - const buttons = this.querySelectorAll('toolbarbutton'); + const selected = this.getAttribute("selected"); + const buttons = this.querySelectorAll("toolbarbutton"); let i = 0; for (const button of buttons) { if (i == selected) { - return button.getAttribute('zen-workspace-id'); + return button.getAttribute("zen-workspace-id"); } i++; } @@ -192,23 +195,23 @@ class nsZenWorkspaceIcons extends MozXULElement { } get isReorderMode() { - return this.hasAttribute('reorder-mode'); + return this.hasAttribute("reorder-mode"); } set isReorderMode(value) { if (value) { - this.setAttribute('reorder-mode', 'true'); + this.setAttribute("reorder-mode", "true"); } else { - this.removeAttribute('reorder-mode'); - this.style.removeProperty('--zen-workspace-icon-width'); - this.style.removeProperty('--zen-workspace-icon-height'); + this.removeAttribute("reorder-mode"); + this.style.removeProperty("--zen-workspace-icon-width"); + this.style.removeProperty("--zen-workspace-icon-height"); } } reorderWorkspaceToIndex(draggedTab, index) { - const workspaceId = draggedTab.getAttribute('zen-workspace-id'); + const workspaceId = draggedTab.getAttribute("zen-workspace-id"); gZenWorkspaces.reorderWorkspace(workspaceId, index); } } -customElements.define('zen-workspace-icons', nsZenWorkspaceIcons); +customElements.define("zen-workspace-icons", nsZenWorkspaceIcons); diff --git a/src/zen/workspaces/ZenWorkspaces.mjs b/src/zen/workspaces/ZenWorkspaces.mjs index ee7ca465f..207125d23 100644 --- a/src/zen/workspaces/ZenWorkspaces.mjs +++ b/src/zen/workspaces/ZenWorkspaces.mjs @@ -2,8 +2,17 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { nsZenThemePicker } from 'chrome://browser/content/zen-components/ZenGradientGenerator.mjs'; +/* eslint-disable no-shadow */ +import { nsZenThemePicker } from "chrome://browser/content/zen-components/ZenGradientGenerator.mjs"; + +/** + * Zen Spaces manager. This class is mainly responsible for the UI + * and user interactions but it also contains some logic to manage + * the workspaces and their tabs. + * + * For window sync, please @see ZenWindowSync + */ class nsZenWorkspaces { /** * Stores workspace IDs and their last selected tabs. @@ -14,8 +23,8 @@ class nsZenWorkspaces { #hasInitialized = false; - #canDebug = Services.prefs.getBoolPref('zen.workspaces.debug', false); - #activeWorkspace = ''; + #canDebug = Services.prefs.getBoolPref("zen.workspaces.debug", false); + #activeWorkspace = ""; _swipeState = { isGestureActive: true, @@ -28,11 +37,11 @@ class nsZenWorkspaces { #lastScrollTime = 0; bookmarkMenus = [ - 'PlacesToolbar', - 'bookmarks-menu-button', - 'BMB_bookmarksToolbar', - 'BMB_unsortedBookmarks', - 'BMB_mobileBookmarks', + "PlacesToolbar", + "bookmarks-menu-button", + "BMB_bookmarksToolbar", + "BMB_unsortedBookmarks", + "BMB_mobileBookmarks", ]; promisePinnedInitialized = new Promise((resolve) => { @@ -63,60 +72,60 @@ class nsZenWorkspaces { if (!this.shouldHaveWorkspaces) { this._resolveInitialized(); - console.warn('gZenWorkspaces: !!! gZenWorkspaces is disabled in hidden windows !!!'); + console.warn("gZenWorkspaces: !!! gZenWorkspaces is disabled in hidden windows !!!"); return; // We are in a hidden window, don't initialize gZenWorkspaces } this.ownerWindow = window; XPCOMUtils.defineLazyPreferenceGetter( this, - 'activationMethod', - 'zen.workspaces.scroll-modifier-key', - 'ctrl' + "activationMethod", + "zen.workspaces.scroll-modifier-key", + "ctrl" ); XPCOMUtils.defineLazyPreferenceGetter( this, - 'naturalScroll', - 'zen.workspaces.natural-scroll', + "naturalScroll", + "zen.workspaces.natural-scroll", true ); XPCOMUtils.defineLazyPreferenceGetter( this, - 'shouldWrapAroundNavigation', - 'zen.workspaces.wrap-around-navigation', + "shouldWrapAroundNavigation", + "zen.workspaces.wrap-around-navigation", true ); XPCOMUtils.defineLazyPreferenceGetter( this, - 'shouldForceContainerTabsToWorkspace', - 'zen.workspaces.force-container-workspace', + "shouldForceContainerTabsToWorkspace", + "zen.workspaces.force-container-workspace", true ); XPCOMUtils.defineLazyPreferenceGetter( this, - 'shouldOpenNewTabIfLastUnpinnedTabIsClosed', - 'zen.workspaces.open-new-tab-if-last-unpinned-tab-is-closed', + "shouldOpenNewTabIfLastUnpinnedTabIsClosed", + "zen.workspaces.open-new-tab-if-last-unpinned-tab-is-closed", false ); this.containerSpecificEssentials = Services.prefs.getBoolPref( - 'zen.workspaces.separate-essentials', + "zen.workspaces.separate-essentials", false ); - ChromeUtils.defineLazyGetter(this, 'tabContainer', () => - document.getElementById('tabbrowser-tabs') + ChromeUtils.defineLazyGetter(this, "tabContainer", () => + document.getElementById("tabbrowser-tabs") ); - ChromeUtils.defineLazyGetter(this, 'workspaceIcons', () => - document.getElementById('zen-workspaces-button') + ChromeUtils.defineLazyGetter(this, "workspaceIcons", () => + document.getElementById("zen-workspaces-button") ); - this.#activeWorkspace ||= Services.prefs.getStringPref('zen.workspaces.active', ''); + this.#activeWorkspace ||= Services.prefs.getStringPref("zen.workspaces.active", ""); if (this.isPrivateWindow) { - document.documentElement.setAttribute('zen-private-window', 'true'); + document.documentElement.setAttribute("zen-private-window", "true"); } this.popupOpenHandler = this._popupOpenHandler.bind(this); - window.addEventListener('resize', this.onWindowResize.bind(this)); + window.addEventListener("resize", this.onWindowResize.bind(this)); this.addPopupListeners(); if (this.privateWindowOrDisabled) { @@ -127,6 +136,7 @@ class nsZenWorkspaces { log(...args) { if (this.#canDebug) { + /* eslint-disable no-console */ console.debug(`[gZenWorkspaces]:`, ...args); } } @@ -143,7 +153,7 @@ class nsZenWorkspaces { // Non UI related initializations if ( - Services.prefs.getBoolPref('zen.workspaces.swipe-actions', false) && + Services.prefs.getBoolPref("zen.workspaces.swipe-actions", false) && this.workspaceEnabled && !this.isPrivateWindow ) { @@ -196,7 +206,7 @@ class nsZenWorkspaces { this._tabSelectionState.lastSelectionTime = Date.now(); return true; } catch (e) { - console.error('Error selecting tab:', e); + console.error("Error selecting tab:", e); return false; } finally { this._tabSelectionState.inProgress = false; @@ -206,7 +216,7 @@ class nsZenWorkspaces { async selectEmptyTab(newTabTarget = null, selectURLBar = true) { // Validate browser state first if (!this._validateBrowserState()) { - console.warn('Browser state invalid for empty tab selection'); + console.warn("Browser state invalid for empty tab selection"); return null; } @@ -227,7 +237,7 @@ class nsZenWorkspaces { if (gBrowser.selectedTab !== this._emptyTab && selectURLBar) { const tabSelectListener = () => { // Remove the event listener first to prevent any chance of multiple executions - window.removeEventListener('TabSelect', tabSelectListener); + window.removeEventListener("TabSelect", tabSelectListener); // Use requestAnimationFrame to ensure DOM is updated requestAnimationFrame(() => { @@ -237,44 +247,44 @@ class nsZenWorkspaces { try { gURLBar.select(); } catch (e) { - console.warn('Error selecting URL bar:', e); + console.warn("Error selecting URL bar:", e); } } }, 50); }); }; - window.addEventListener('TabSelect', tabSelectListener, { once: true }); + window.addEventListener("TabSelect", tabSelectListener, { once: true }); } // Safely switch to the empty tab using our debounced method const success = await this._safelySelectTab(this._emptyTab); if (!success) { - throw new Error('Failed to select empty tab'); + throw new Error("Failed to select empty tab"); } return this._emptyTab; } // Fall back to creating a new tab - const newTabUrl = newTabTarget || Services.prefs.getStringPref('browser.startup.homepage'); + const newTabUrl = newTabTarget || Services.prefs.getStringPref("browser.startup.homepage"); let tab = gZenUIManager.openAndChangeToTab(newTabUrl); // Set workspace ID if available if (window.uuid) { - tab.setAttribute('zen-workspace-id', this.activeWorkspace); + tab.setAttribute("zen-workspace-id", this.activeWorkspace); } return tab; } catch (e) { - console.error('Error in selectEmptyTab:', e); + console.error("Error in selectEmptyTab:", e); // Create a fallback tab as a last resort, with proper validation try { if (this._validateBrowserState()) { - return gBrowser.addTrustedTab('about:blank'); + return gBrowser.addTrustedTab("about:blank"); } } catch (fallbackError) { - console.error('Critical error creating fallback tab:', fallbackError); + console.error("Critical error creating fallback tab:", fallbackError); } return null; } @@ -283,13 +293,13 @@ class nsZenWorkspaces { #initializeEmptyTab() { for (const tab of gBrowser.tabs) { // Check if session store has an empty tab - if (tab.hasAttribute('zen-empty-tab') && !tab.pinned) { - this.log('Found existing empty tab from session store!'); + if (tab.hasAttribute("zen-empty-tab") && !tab.pinned) { + this.log("Found existing empty tab from session store!"); this._emptyTab = tab; return; } } - this._emptyTab = gBrowser.addTrustedTab('about:blank', { + this._emptyTab = gBrowser.addTrustedTab("about:blank", { inBackground: true, userContextId: 0, _forZenEmptyTab: true, @@ -301,11 +311,11 @@ class nsZenWorkspaces { return; } this._pinnedTabsResizeObserver.disconnect(); - for (let element of document.getElementById('zen-essentials').children) { - if (element.classList.contains('tabbrowser-tab')) { + for (let element of document.getElementById("zen-essentials").children) { + if (element.classList.contains("tabbrowser-tab")) { continue; } - this._pinnedTabsResizeObserver.observe(element, { box: 'border-box' }); + this._pinnedTabsResizeObserver.observe(element, { box: "border-box" }); } } @@ -318,7 +328,7 @@ class nsZenWorkspaces { get pinnedTabsContainer() { if (!this.workspaceEnabled || !this._hasInitializedTabsStrip) { - return document.getElementById('pinned-tabs-container'); + return document.getElementById("pinned-tabs-container"); } return this.activeWorkspaceElement?.pinnedTabsContainer; } @@ -336,13 +346,13 @@ class nsZenWorkspaces { } get tabboxChildrenWithoutEmpty() { - return this.tabboxChildren.filter((child) => !child.hasAttribute('zen-empty-tab')); + return this.tabboxChildren.filter((child) => !child.hasAttribute("zen-empty-tab")); } get shouldAnimateEssentials() { return ( this.containerSpecificEssentials || - document.documentElement.hasAttribute('zen-creating-workspace') + document.documentElement.hasAttribute("zen-creating-workspace") ); } @@ -351,15 +361,15 @@ class nsZenWorkspaces { } workspaceElement(workspaceId) { - if (typeof workspaceId !== 'string') { + if (typeof workspaceId !== "string") { workspaceId = workspaceId?.uuid; } return document.getElementById(workspaceId); } #initializeTabsStripSections() { - const perifery = document.getElementById('tabbrowser-arrowscrollbox-periphery'); - perifery.setAttribute('hidden', 'true'); + const perifery = document.getElementById("tabbrowser-arrowscrollbox-periphery"); + perifery.setAttribute("hidden", "true"); const tabs = gBrowser.tabContainer.allTabs; const workspaces = this.getWorkspaces(); for (const workspace of workspaces) { @@ -367,15 +377,15 @@ class nsZenWorkspaces { } if (tabs.length) { const defaultSelectedContainer = this.workspaceElement(this.activeWorkspace)?.querySelector( - '.zen-workspace-normal-tabs-section' + ".zen-workspace-normal-tabs-section" ); const pinnedContainer = this.workspaceElement(this.activeWorkspace).querySelector( - '.zen-workspace-pinned-tabs-section' + ".zen-workspace-pinned-tabs-section" ); // New profile with no workspaces does not have a default selected container if (defaultSelectedContainer) { for (const tab of tabs) { - if (tab.hasAttribute('zen-essential')) { + if (tab.hasAttribute("zen-essential")) { this.getEssentialsSection(tab).appendChild(tab); continue; } else if (tab.pinned) { @@ -388,14 +398,14 @@ class nsZenWorkspaces { } gBrowser.tabContainer._invalidateCachedTabs(); } - perifery.setAttribute('hidden', 'true'); + perifery.setAttribute("hidden", "true"); this._hasInitializedTabsStrip = true; this._fixIndicatorsNames(workspaces); } getEssentialsSection(container = 0) { - if (typeof container !== 'number') { - container = container?.getAttribute('usercontextid'); + if (typeof container !== "number") { + container = container?.getAttribute("usercontextid"); } container ??= 0; if (!this.containerSpecificEssentials) { @@ -405,11 +415,11 @@ class nsZenWorkspaces { `.zen-essentials-container[container="${container}"]:not([cloned])` ); if (!essentialsContainer) { - essentialsContainer = document.createXULElement('hbox'); - essentialsContainer.className = 'zen-essentials-container zen-workspace-tabs-section'; - essentialsContainer.setAttribute('flex', '1'); - essentialsContainer.setAttribute('container', container); - document.getElementById('zen-essentials').appendChild(essentialsContainer); + essentialsContainer = document.createXULElement("hbox"); + essentialsContainer.className = "zen-essentials-container zen-workspace-tabs-section"; + essentialsContainer.setAttribute("flex", "1"); + essentialsContainer.setAttribute("container", container); + document.getElementById("zen-essentials").appendChild(essentialsContainer); // Set an initial hidden state if the essentials section is not supposed // to be shown on the current workspace @@ -417,7 +427,7 @@ class nsZenWorkspaces { this.containerSpecificEssentials && this.getActiveWorkspaceFromCache()?.containerTabId != container ) { - essentialsContainer.setAttribute('hidden', 'true'); + essentialsContainer.setAttribute("hidden", "true"); } } return essentialsContainer; @@ -425,7 +435,7 @@ class nsZenWorkspaces { getCurrentSpaceContainerId() { const currentWorkspace = this.getActiveWorkspaceFromCache(); - return typeof currentWorkspace?.containerTabId === 'number' + return typeof currentWorkspace?.containerTabId === "number" ? currentWorkspace.containerTabId : 0; } @@ -435,14 +445,14 @@ class nsZenWorkspaces { } #createWorkspaceTabsSection(workspace, tabs = []) { - const workspaceWrapper = document.createXULElement('zen-workspace'); - const container = document.getElementById('tabbrowser-arrowscrollbox'); + const workspaceWrapper = document.createXULElement("zen-workspace"); + const container = document.getElementById("tabbrowser-arrowscrollbox"); workspaceWrapper.id = workspace.uuid; if (this.activeWorkspace === workspace.uuid) { workspaceWrapper.active = true; } - if (document.documentElement.hasAttribute('zen-creating-workspace')) { + if (document.documentElement.hasAttribute("zen-creating-workspace")) { workspaceWrapper.hidden = true; // Hide workspace while creating it } container.appendChild(workspaceWrapper); @@ -458,8 +468,8 @@ class nsZenWorkspaces { #organizeTabsToWorkspaceSections(workspace, section, pinnedSection, tabs) { const workspaceTabs = Array.from(tabs).filter( (tab) => - tab.getAttribute('zen-workspace-id') === workspace.uuid && - !tab.hasAttribute('zen-essential') + tab.getAttribute("zen-workspace-id") === workspace.uuid && + !tab.hasAttribute("zen-essential") ); let folders = new Set(); const getFolderRoot = (tab) => { @@ -471,7 +481,9 @@ class nsZenWorkspaces { }; for (let i = workspaceTabs.length - 1; i >= 0; i--) { let tab = workspaceTabs[i]; - if (tab.hasAttribute('zen-essential')) continue; // Ignore essentials as they need to be in their own section + if (tab.hasAttribute("zen-essential")) { + continue; + } // Ignore essentials as they need to be in their own section // remove tab from list tabs.splice(tabs.indexOf(tab), 1); tab = tab.group ?? tab; @@ -479,7 +491,9 @@ class nsZenWorkspaces { if (gBrowser.isTabGroup(tab)) { let rootGroup = getFolderRoot(tab); - if (folders.has(rootGroup)) continue; + if (folders.has(rootGroup)) { + continue; + } folders.add(rootGroup); tab = rootGroup; @@ -500,17 +514,17 @@ class nsZenWorkspaces { #setupAppCommandHandlers() { // Remove existing handler temporarily - this is needed so that _handleAppCommand is called before the original - window.removeEventListener('AppCommand', HandleAppCommandEvent, true); + window.removeEventListener("AppCommand", HandleAppCommandEvent, true); // Add our handler first - window.addEventListener('AppCommand', this._handleAppCommand.bind(this), true); + window.addEventListener("AppCommand", this._handleAppCommand.bind(this), true); // Re-add original handler - window.addEventListener('AppCommand', HandleAppCommandEvent, true); + window.addEventListener("AppCommand", HandleAppCommandEvent, true); } get _hoveringSidebar() { - return gNavToolbox.hasAttribute('zen-has-implicit-hover'); + return gNavToolbox.hasAttribute("zen-has-implicit-hover"); } _handleAppCommand(event) { @@ -522,12 +536,12 @@ class nsZenWorkspaces { const direction = this.naturalScroll ? -1 : 1; // event is forward or back switch (event.command) { - case 'Forward': + case "Forward": this.changeWorkspaceShortcut(1 * direction); event.stopImmediatePropagation(); event.preventDefault(); break; - case 'Back': + case "Back": this.changeWorkspaceShortcut(-1 * direction); event.stopImmediatePropagation(); event.preventDefault(); @@ -535,7 +549,7 @@ class nsZenWorkspaces { } requestAnimationFrame(() => { requestAnimationFrame(() => { - gNavToolbox.setAttribute('zen-has-hover', 'true'); + gNavToolbox.setAttribute("zen-has-hover", "true"); }); }); } @@ -547,12 +561,16 @@ class nsZenWorkspaces { const scrollThreshold = 1; // Minimum scroll delta to trigger workspace change toolbox.addEventListener( - 'wheel', + "wheel", (event) => { - if (this.privateWindowOrDisabled) return; + if (this.privateWindowOrDisabled) { + return; + } // Only process non-gesture scrolls - if (event.deltaMode !== 1) return; + if (event.deltaMode !== 1) { + return; + } const isVerticalScroll = event.deltaY && !event.deltaX; @@ -573,12 +591,16 @@ class nsZenWorkspaces { } } - const currentTime = Date.now(); - if (currentTime - this.#lastScrollTime < scrollCooldown) return; + let currentTime = Date.now(); + if (currentTime - this.#lastScrollTime < scrollCooldown) { + return; + } //this decides which delta to use const delta = isVerticalScroll ? event.deltaY : event.deltaX; - if (Math.abs(delta) < scrollThreshold) return; + if (Math.abs(delta) < scrollThreshold) { + return; + } // Determine scroll direction let rawDirection = delta > 0 ? 1 : -1; @@ -596,35 +618,37 @@ class nsZenWorkspaces { const elements = [ gNavToolbox, // event handlers do not work on elements inside shadow DOM so we need to attach them directly - document.getElementById('tabbrowser-arrowscrollbox').shadowRoot.querySelector('scrollbox'), + document.getElementById("tabbrowser-arrowscrollbox").shadowRoot.querySelector("scrollbox"), ]; // Attach gesture handlers to each element for (const element of elements) { - if (!element) continue; + if (!element) { + continue; + } this.attachGestureHandlers(element); } } attachGestureHandlers(element) { - element.addEventListener('MozSwipeGestureMayStart', this._handleSwipeMayStart.bind(this), true); - element.addEventListener('MozSwipeGestureStart', this._handleSwipeStart.bind(this), true); - element.addEventListener('MozSwipeGestureUpdate', this._handleSwipeUpdate.bind(this), true); + element.addEventListener("MozSwipeGestureMayStart", this._handleSwipeMayStart.bind(this), true); + element.addEventListener("MozSwipeGestureStart", this._handleSwipeStart.bind(this), true); + element.addEventListener("MozSwipeGestureUpdate", this._handleSwipeUpdate.bind(this), true); // Use MozSwipeGesture instead of MozSwipeGestureEnd because MozSwipeGestureEnd is fired after animation ends, // while MozSwipeGesture is fired immediately after swipe ends. - element.addEventListener('MozSwipeGesture', this._handleSwipeEnd.bind(this), true); + element.addEventListener("MozSwipeGesture", this._handleSwipeEnd.bind(this), true); element.addEventListener( - 'MozSwipeGestureEnd', + "MozSwipeGestureEnd", () => { - Services.prefs.setBoolPref('zen.swipe.is-fast-swipe', false); - document.documentElement.removeAttribute('swipe-gesture'); - gZenUIManager.tabsWrapper.style.removeProperty('scrollbar-width'); - document.documentElement.style.setProperty('--zen-background-opacity', '1'); + Services.prefs.setBoolPref("zen.swipe.is-fast-swipe", false); + document.documentElement.removeAttribute("swipe-gesture"); + gZenUIManager.tabsWrapper.style.removeProperty("scrollbar-width"); + document.documentElement.style.setProperty("--zen-background-opacity", "1"); delete this._hasAnimatedBackgrounds; this.updateTabsContainers(); - document.removeEventListener('popupshown', this.popupOpenHandler, { once: true }); + document.removeEventListener("popupshown", this.popupOpenHandler, { once: true }); }, true ); @@ -633,17 +657,19 @@ class nsZenWorkspaces { _popupOpenHandler() { // If a popup is opened, we should stop the swipe gesture if (this._swipeState?.isGestureActive) { - document.documentElement.removeAttribute('swipe-gesture'); - gZenUIManager.tabsWrapper.style.removeProperty('scrollbar-width'); + document.documentElement.removeAttribute("swipe-gesture"); + gZenUIManager.tabsWrapper.style.removeProperty("scrollbar-width"); this.updateTabsContainers(); this._cancelSwipeAnimation(); } } _handleSwipeMayStart(event) { - if (this.privateWindowOrDisabled || this.#inChangingWorkspace) return; + if (this.privateWindowOrDisabled || this.#inChangingWorkspace) { + return; + } if ( - event.target.closest('#zen-sidebar-foot-buttons') || + event.target.closest("#zen-sidebar-foot-buttons") || event.target.closest('#urlbar[zen-floating-urlbar="true"]') ) { return; @@ -660,12 +686,14 @@ class nsZenWorkspaces { } _handleSwipeStart(event) { - if (!this.workspaceEnabled) return; + if (!this.workspaceEnabled) { + return; + } gZenFolders.cancelPopupTimer(); - document.documentElement.setAttribute('swipe-gesture', 'true'); - document.addEventListener('popupshown', this.popupOpenHandler, { once: true }); + document.documentElement.setAttribute("swipe-gesture", "true"); + document.addEventListener("popupshown", this.popupOpenHandler, { once: true }); event.preventDefault(); event.stopPropagation(); @@ -674,20 +702,22 @@ class nsZenWorkspaces { lastDelta: 0, direction: null, }; - Services.prefs.setBoolPref('zen.swipe.is-fast-swipe', true); + Services.prefs.setBoolPref("zen.swipe.is-fast-swipe", true); } _handleSwipeUpdate(event) { - if (!this.workspaceEnabled || !this._swipeState?.isGestureActive) return; + if (!this.workspaceEnabled || !this._swipeState?.isGestureActive) { + return; + } event.preventDefault(); event.stopPropagation(); const delta = event.delta * 300; const stripWidth = - window.windowUtils.getBoundsWithoutFlushing(document.getElementById('navigator-toolbox')) + window.windowUtils.getBoundsWithoutFlushing(document.getElementById("navigator-toolbox")) .width + - window.windowUtils.getBoundsWithoutFlushing(document.getElementById('zen-sidebar-splitter')) + window.windowUtils.getBoundsWithoutFlushing(document.getElementById("zen-sidebar-splitter")) .width * 2; let translateX = this._swipeState.lastDelta + delta; @@ -701,7 +731,7 @@ class nsZenWorkspaces { } if (Math.abs(delta) > 0.8) { - this._swipeState.direction = delta > 0 ? 'left' : 'right'; + this._swipeState.direction = delta > 0 ? "left" : "right"; } // Apply a translateX to the tab strip to give the user feedback on the swipe @@ -710,10 +740,12 @@ class nsZenWorkspaces { } async _handleSwipeEnd(event) { - if (!this.workspaceEnabled) return; + if (!this.workspaceEnabled) { + return; + } event.preventDefault(); event.stopPropagation(); - const isRTL = document.documentElement.matches(':-moz-locale-dir(rtl)'); + const isRTL = document.documentElement.matches(":-moz-locale-dir(rtl)"); const moveForward = (event.direction === SimpleGestureEvent.DIRECTION_RIGHT) !== isRTL; const rawDirection = moveForward ? 1 : -1; @@ -735,7 +767,7 @@ class nsZenWorkspaces { set activeWorkspace(value) { const spaces = this.getWorkspaces(); if (!spaces.some((ws) => ws.uuid === value)) { - value = spaces[0]?.uuid || ''; + value = spaces[0]?.uuid || ""; } if (value === this.#activeWorkspace) { return; @@ -744,11 +776,11 @@ class nsZenWorkspaces { if (this.privateWindowOrDisabled) { return; } - Services.prefs.setStringPref('zen.workspaces.active', value); + Services.prefs.setStringPref("zen.workspaces.active", value); } get shouldHaveWorkspaces() { - if (typeof this._shouldHaveWorkspaces === 'undefined') { + if (typeof this._shouldHaveWorkspaces === "undefined") { let chromeFlags = window.docShell.treeOwner .QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIAppWindow).chromeFlags; @@ -766,8 +798,8 @@ class nsZenWorkspaces { get currentWindowIsSyncing() { return ( - !document.documentElement.hasAttribute('zen-unsynced-window') && - window._zenStartupSyncFlag !== 'unsynced' && + !document.documentElement.hasAttribute("zen-unsynced-window") && + window._zenStartupSyncFlag !== "unsynced" && !this.isPrivateWindow ); } @@ -795,7 +827,7 @@ class nsZenWorkspaces { getWorkspaces(lieToMe = false) { if (lieToMe) { const { ZenSessionStore } = ChromeUtils.importESModule( - 'resource:///modules/zen/ZenSessionManager.sys.mjs' + "resource:///modules/zen/ZenSessionManager.sys.mjs" ); return ZenSessionStore.getClonedSpaces(); } @@ -841,12 +873,12 @@ class nsZenWorkspaces { restoreWorkspacesFromSessionStore(aWinData = {}) { if (this.#hasInitialized || !this.workspaceEnabled) { - return; + return Promise.resolve(); } const spacesFromStore = aWinData.spaces || []; this._workspaceCache = spacesFromStore.length ? [...spacesFromStore] - : [this.#createWorkspaceData('Space', undefined)]; + : [this.#createWorkspaceData("Space", undefined)]; this.activeWorkspace = aWinData.activeZenSpace || this._workspaceCache[0].uuid; let promise = this.#initializeWorkspaces(); for (const workspace of spacesFromStore) { @@ -879,7 +911,7 @@ class nsZenWorkspaces { gZenThemePicker.onWorkspaceChange(activeWorkspace); } } catch (e) { - console.error('gZenWorkspaces: Error initializing theme picker', e); + console.error("gZenWorkspaces: Error initializing theme picker", e); } this.#initializeTabsStripSections(); this.#initializeEmptyTab(); @@ -895,15 +927,15 @@ class nsZenWorkspaces { delete this._resolveInitialized; const tabUpdateListener = this.updateTabsContainers.bind(this); - window.addEventListener('TabOpen', tabUpdateListener); - window.addEventListener('TabClose', tabUpdateListener); - window.addEventListener('TabAddedToEssentials', tabUpdateListener); - window.addEventListener('TabRemovedFromEssentials', tabUpdateListener); - window.addEventListener('TabPinned', tabUpdateListener); - window.addEventListener('TabUnpinned', tabUpdateListener); - window.addEventListener('aftercustomization', tabUpdateListener); - window.addEventListener('TabSelect', this.onLocationChange.bind(this)); - window.addEventListener('TabBrowserInserted', this.onTabBrowserInserted.bind(this)); + window.addEventListener("TabOpen", tabUpdateListener); + window.addEventListener("TabClose", tabUpdateListener); + window.addEventListener("TabAddedToEssentials", tabUpdateListener); + window.addEventListener("TabRemovedFromEssentials", tabUpdateListener); + window.addEventListener("TabPinned", tabUpdateListener); + window.addEventListener("TabUnpinned", tabUpdateListener); + window.addEventListener("aftercustomization", tabUpdateListener); + window.addEventListener("TabSelect", this.onLocationChange.bind(this)); + window.addEventListener("TabBrowserInserted", this.onTabBrowserInserted.bind(this)); this.updateWorkspacesChangeContextMenu(); })(); @@ -942,7 +974,7 @@ class nsZenWorkspaces { if (this._tabToRemoveForEmpty && !removedEmptyTab && !this._shouldOverrideTabs) { const tabs = gBrowser.tabs.filter((tab) => !tab.collapsed); if ( - typeof this._tabToSelect === 'number' && + typeof this._tabToSelect === "number" && this._tabToSelect >= 0 && tabs[this._tabToSelect] && (await this.#shouldShowTabInCurrentWorkspace(tabs[this._tabToSelect])) && @@ -995,13 +1027,13 @@ class nsZenWorkspaces { if ( !gZenVerticalTabsManager._canReplaceNewTab && - !Services.prefs.getBoolPref('zen.workspaces.continue-where-left-off') + !Services.prefs.getBoolPref("zen.workspaces.continue-where-left-off") ) { // Go through each tab and see if there's another tab with the same startup URL. // If we do find one, remove it. - const newTabUrl = Services.prefs.getStringPref('browser.startup.homepage'); + const newTabUrl = Services.prefs.getStringPref("browser.startup.homepage"); const tabs = gBrowser.tabs.filter( - (tab) => !tab.collapsed && !tab.hasAttribute('zen-empty-tab') && !tab.pinned + (tab) => !tab.collapsed && !tab.hasAttribute("zen-empty-tab") && !tab.pinned ); for (const tab of tabs) { if (tab._originalUrl === newTabUrl && tab !== gBrowser.selectedTab) { @@ -1012,7 +1044,7 @@ class nsZenWorkspaces { } } - window.dispatchEvent(new CustomEvent('AfterWorkspacesSessionRestore', { bubbles: true })); + window.dispatchEvent(new CustomEvent("AfterWorkspacesSessionRestore", { bubbles: true })); } handleInitialTab(tab, isEmpty) { @@ -1020,7 +1052,7 @@ class nsZenWorkspaces { return; } // note: We cant access `gZenVerticalTabsManager._canReplaceNewTab` this early - if (isEmpty && Services.prefs.getBoolPref('zen.urlbar.replace-newtab', true)) { + if (isEmpty && Services.prefs.getBoolPref("zen.urlbar.replace-newtab", true)) { this._tabToRemoveForEmpty = tab; } else { this._initialTab = tab; @@ -1030,7 +1062,7 @@ class nsZenWorkspaces { changeWorkspaceIcon() { let anchor = this.activeWorkspaceIndicator?.querySelector( - '.zen-current-workspace-indicator-icon' + ".zen-current-workspace-indicator-icon" ); if (this.#contextMenuData?.workspaceId) { anchor = this.#contextMenuData.originalTarget; @@ -1039,26 +1071,26 @@ class nsZenWorkspaces { if (!anchor) { return; } - const hasNoIcon = anchor.hasAttribute('no-icon'); - anchor.removeAttribute('no-icon'); + const hasNoIcon = anchor.hasAttribute("no-icon"); + anchor.removeAttribute("no-icon"); if (hasNoIcon) { - anchor.textContent = ''; + anchor.textContent = ""; } gZenEmojiPicker .open(anchor) .then(async (emoji) => { const workspace = this.getWorkspaceFromId(workspaceId); if (!workspace) { - console.warn('No active workspace found to change icon'); + console.warn("No active workspace found to change icon"); return; } workspace.icon = emoji; await this.saveWorkspace(workspace); }) .catch((error) => { - console.warn('Error changing workspace icon:', error); + console.warn("Error changing workspace icon:", error); if (hasNoIcon) { - anchor.setAttribute('no-icon', 'true'); + anchor.setAttribute("no-icon", "true"); } }); } @@ -1066,7 +1098,7 @@ class nsZenWorkspaces { shouldCloseWindow() { return ( !window.toolbar.visible || - Services.prefs.getBoolPref('browser.tabs.closeWindowWithLastTab') || + Services.prefs.getBoolPref("browser.tabs.closeWindowWithLastTab") || this.privateWindowOrDisabled ); } @@ -1075,14 +1107,14 @@ class nsZenWorkspaces { const tabs = this.allStoredTabs; const workspaces = this.getWorkspaces(); for (let tab of tabs) { - const workspaceID = tab.getAttribute('zen-workspace-id'); + const workspaceID = tab.getAttribute("zen-workspace-id"); if ( (workspaceID && - !tab.hasAttribute('zen-essential') && + !tab.hasAttribute("zen-essential") && !workspaces.find((workspace) => workspace.uuid === workspaceID)) || // Also remove empty tabs that are supposed to be from parent folders but // they dont exist anymore - (tab.pinned && tab.hasAttribute('zen-empty-tab') && !tab.group) + (tab.pinned && tab.hasAttribute("zen-empty-tab") && !tab.group) ) { // Remove any tabs where their workspace doesn't exist anymore gBrowser.unpinTab(tab); @@ -1099,7 +1131,7 @@ class nsZenWorkspaces { return null; } - let workspaceID = tab.getAttribute('zen-workspace-id'); + let workspaceID = tab.getAttribute("zen-workspace-id"); if (!workspaceID) { return null; } @@ -1125,7 +1157,7 @@ class nsZenWorkspaces { this._isClosingWindow = true; // Inside a setTimeout to avoid reentrancy issues. setTimeout(() => { - document.getElementById('cmd_closeWindow').doCommand(); + document.getElementById("cmd_closeWindow").doCommand(); }, 100); } return null; @@ -1138,9 +1170,9 @@ class nsZenWorkspaces { } addPopupListeners() { - const workspaceActions = document.getElementById('zenWorkspaceMoreActions'); - workspaceActions.addEventListener('popupshowing', this.updateWorkspaceActionsMenu.bind(this)); - workspaceActions.addEventListener('popuphidden', () => { + const workspaceActions = document.getElementById("zenWorkspaceMoreActions"); + workspaceActions.addEventListener("popupshowing", this.updateWorkspaceActionsMenu.bind(this)); + workspaceActions.addEventListener("popuphidden", () => { setTimeout(() => { setTimeout(() => { this.#contextMenuData = null; @@ -1149,70 +1181,70 @@ class nsZenWorkspaces { }); const contextChangeContainerTabMenu = document.getElementById( - 'context_zenWorkspacesOpenInContainerTab' + "context_zenWorkspacesOpenInContainerTab" ); contextChangeContainerTabMenu.addEventListener( - 'popupshowing', + "popupshowing", this.updateWorkspaceActionsMenuContainer.bind(this) ); contextChangeContainerTabMenu.addEventListener( - 'command', + "command", this.contextChangeContainerTab.bind(this) ); } generateMenuItemForWorkspace(workspace, disableCurrent = false) { - const item = document.createXULElement('menuitem'); - item.className = 'zen-workspace-context-menu-item'; - item.setAttribute('zen-workspace-id', workspace.uuid); + const item = document.createXULElement("menuitem"); + item.className = "zen-workspace-context-menu-item"; + item.setAttribute("zen-workspace-id", workspace.uuid); if (!disableCurrent) { - item.setAttribute('type', 'radio'); + item.setAttribute("type", "radio"); } if (workspace.uuid === this.activeWorkspace) { - item.setAttribute(disableCurrent ? 'disabled' : 'checked', true); + item.setAttribute(disableCurrent ? "disabled" : "checked", true); } let name = workspace.name; - const iconIsSvg = workspace.icon && workspace.icon.endsWith('.svg'); - if (workspace.icon && workspace.icon !== '' && !iconIsSvg) { + const iconIsSvg = workspace.icon && workspace.icon.endsWith(".svg"); + if (workspace.icon && workspace.icon !== "" && !iconIsSvg) { name = `${workspace.icon} ${name}`; } - item.setAttribute('label', name); + item.setAttribute("label", name); if (iconIsSvg) { - item.setAttribute('image', workspace.icon); - item.classList.add('zen-workspace-context-icon'); + item.setAttribute("image", workspace.icon); + item.classList.add("zen-workspace-context-icon"); } return item; } #contextMenuData = null; updateWorkspaceActionsMenu(event) { - if (event.target.id !== 'zenWorkspaceMoreActions') { + if (event.target.id !== "zenWorkspaceMoreActions") { return; } const openInContainerMenuItem = document.getElementById( - 'context_zenWorkspacesOpenInContainerTab' + "context_zenWorkspacesOpenInContainerTab" ); if (this.shouldShowContainers) { - openInContainerMenuItem.removeAttribute('hidden'); + openInContainerMenuItem.removeAttribute("hidden"); } else { - openInContainerMenuItem.setAttribute('hidden', 'true'); + openInContainerMenuItem.setAttribute("hidden", "true"); } // Call parent node as on windows, the text can be double clicked let target; try { - target = event.explicitOriginalTarget?.closest('toolbarbutton'); + target = event.explicitOriginalTarget?.closest("toolbarbutton"); } catch (e) { - console.error('Error getting explicitOriginalTarget in context menu:', e); + console.error("Error getting explicitOriginalTarget in context menu:", e); } this.#contextMenuData = { - workspaceId: target?.getAttribute('zen-workspace-id'), + workspaceId: target?.getAttribute("zen-workspace-id"), originalTarget: target, }; - const workspaceName = document.getElementById('context_zenEditWorkspace'); - const themePicker = document.getElementById('context_zenChangeWorkspaceTheme'); + const workspaceName = document.getElementById("context_zenEditWorkspace"); + const themePicker = document.getElementById("context_zenChangeWorkspaceTheme"); /* We can't show the rename input properly in collapsed state, so hide the workspace edit input */ - const isCollapsed = !Services.prefs.getBoolPref('zen.view.sidebar-expanded'); + const isCollapsed = !Services.prefs.getBoolPref("zen.view.sidebar-expanded"); workspaceName.hidden = isCollapsed || (this.#contextMenuData.workspaceId && @@ -1220,16 +1252,16 @@ class nsZenWorkspaces { themePicker.hidden = this.#contextMenuData.workspaceId && this.#contextMenuData.workspaceId !== this.activeWorkspace; - const separator = document.getElementById('context_zenWorkspacesSeparator'); - for (const item of event.target.querySelectorAll('.zen-workspace-context-menu-item')) { + const separator = document.getElementById("context_zenWorkspacesSeparator"); + for (const item of event.target.querySelectorAll(".zen-workspace-context-menu-item")) { item.remove(); } if (!this.#contextMenuData.workspaceId) { separator.hidden = false; for (const workspace of this.getWorkspaces().reverse()) { const item = this.generateMenuItemForWorkspace(workspace); - item.addEventListener('command', (e) => { - this.changeWorkspaceWithID(e.target.closest('menuitem').getAttribute('zen-workspace-id')); + item.addEventListener("command", (e) => { + this.changeWorkspaceWithID(e.target.closest("menuitem").getAttribute("zen-workspace-id")); }); separator.after(item); } @@ -1237,7 +1269,7 @@ class nsZenWorkspaces { separator.hidden = true; } event.target.addEventListener( - 'popuphidden', + "popuphidden", () => { this.#contextMenuData = null; }, @@ -1290,7 +1322,7 @@ class nsZenWorkspaces { } workspaceHasIcon(workspace) { - return workspace.icon && workspace.icon !== ''; + return workspace.icon && workspace.icon !== ""; } getWorkspaceIcon(workspace) { @@ -1306,8 +1338,8 @@ class nsZenWorkspaces { get shouldShowContainers() { return ( - Services.prefs.getBoolPref('privacy.userContext.ui.enabled') && - ContextualIdentityService.getPublicIdentities().length > 0 + Services.prefs.getBoolPref("privacy.userContext.ui.enabled") && + !!ContextualIdentityService.getPublicIdentities().length ); } @@ -1315,7 +1347,7 @@ class nsZenWorkspaces { if (!this.#hasInitialized || this.privateWindowOrDisabled) { return; } - window.dispatchEvent(new CustomEvent('ZenWorkspaceDataChanged'), { bubbles: true }); + window.dispatchEvent(new CustomEvent("ZenWorkspaceDataChanged"), { bubbles: true }); window.gZenWindowSync.propagateWorkspacesToAllWindows(aSpaceData ?? this._workspaceCache); } @@ -1353,7 +1385,7 @@ class nsZenWorkspaces { } // Order the workspace elements correctly let previousElement = null; - const arrowScrollbox = document.getElementById('tabbrowser-arrowscrollbox'); + const arrowScrollbox = document.getElementById("tabbrowser-arrowscrollbox"); for (const workspace of aWorkspaces) { const workspaceElement = this.workspaceElement(workspace.uuid); if (workspaceElement) { @@ -1410,12 +1442,12 @@ class nsZenWorkspaces { async openWorkspaceCreation() { let createForm; const previousWorkspace = this.getActiveWorkspace(); - document.documentElement.setAttribute('zen-creating-workspace', 'true'); - await this.createAndSaveWorkspace('Space', undefined, false, 0, { + document.documentElement.setAttribute("zen-creating-workspace", "true"); + await this.createAndSaveWorkspace("Space", undefined, false, 0, { beforeChangeCallback: async (workspace) => { - createForm = document.createXULElement('zen-workspace-creation'); - createForm.setAttribute('workspace-id', workspace.uuid); - createForm.setAttribute('previous-workspace-id', previousWorkspace?.uuid || ''); + createForm = document.createXULElement("zen-workspace-creation"); + createForm.setAttribute("workspace-id", workspace.uuid); + createForm.setAttribute("previous-workspace-id", previousWorkspace?.uuid || ""); gBrowser.tabContainer.after(createForm); await createForm.promiseInitialized; }, @@ -1425,13 +1457,13 @@ class nsZenWorkspaces { #unpinnedTabsInWorkspace(workspaceID) { return Array.from(this.allStoredTabs).filter( - (tab) => tab.getAttribute('zen-workspace-id') === workspaceID && tab.visible && !tab.pinned + (tab) => tab.getAttribute("zen-workspace-id") === workspaceID && tab.visible && !tab.pinned ); } #getClosableTabs(tabs) { const remainingTabs = tabs.filter((tab) => { - const attributes = ['selected', 'multiselected', 'pictureinpicture', 'soundplaying']; + const attributes = ["selected", "multiselected", "pictureinpicture", "soundplaying"]; for (const attr of attributes) { if (tab.hasAttribute(attr)) { return false; @@ -1463,17 +1495,17 @@ class nsZenWorkspaces { const tabsToUnload = this.allStoredTabs.filter( (tab) => - tab.getAttribute('zen-workspace-id') === workspaceId && - !tab.hasAttribute('zen-empty-tab') && - !tab.hasAttribute('zen-essential') && - !tab.hasAttribute('pending') + tab.getAttribute("zen-workspace-id") === workspaceId && + !tab.hasAttribute("zen-empty-tab") && + !tab.hasAttribute("zen-essential") && + !tab.hasAttribute("pending") ); if (tabsToUnload.length === 0) { return; } - this.log('Unloading workspace', workspaceId); + this.log("Unloading workspace", workspaceId); await gBrowser.explicitUnloadTabs(tabsToUnload); // TODO: unit test this } @@ -1492,42 +1524,42 @@ class nsZenWorkspaces { continue; } - if (tab.hasAttribute('zen-essential')) { + if (tab.hasAttribute("zen-essential")) { continue; } tab.owner = null; if (container) { - if (tab.group?.hasAttribute('split-view-group')) { + if (tab.group?.hasAttribute("split-view-group")) { gBrowser.zenHandleTabMove(tab.group, () => { for (const subTab of tab.group.tabs) { - subTab.setAttribute('zen-workspace-id', workspaceID); + subTab.setAttribute("zen-workspace-id", workspaceID); } container.insertBefore(tab.group, container.lastChild); }); continue; } gBrowser.zenHandleTabMove(tab, () => { - tab.setAttribute('zen-workspace-id', workspaceID); + tab.setAttribute("zen-workspace-id", workspaceID); container.insertBefore(tab, container.lastChild); }); } // also change glance tab if it's the same tab - const glanceTab = tab.querySelector('.tabbrowser-tab[zen-glance-tab]'); + const glanceTab = tab.querySelector(".tabbrowser-tab[zen-glance-tab]"); if (glanceTab) { - glanceTab.setAttribute('zen-workspace-id', workspaceID); + glanceTab.setAttribute("zen-workspace-id", workspaceID); } } return true; } - #prepareNewWorkspace(window) { - document.documentElement.setAttribute('zen-workspace-id', window.uuid); + #prepareNewWorkspace(space) { + document.documentElement.setAttribute("zen-workspace-id", space.uuid); let tabCount = 0; for (let tab of gBrowser.tabs) { - const isEssential = tab.getAttribute('zen-essential') === 'true'; - if (!tab.hasAttribute('zen-workspace-id') && !tab.pinned && !isEssential) { - this.moveTabToWorkspace(tab, window.uuid); + const isEssential = tab.getAttribute("zen-essential") === "true"; + if (!tab.hasAttribute("zen-workspace-id") && !tab.pinned && !isEssential) { + this.moveTabToWorkspace(tab, space.uuid); tabCount++; } } @@ -1566,10 +1598,10 @@ class nsZenWorkspaces { } this.#inChangingWorkspace = true; try { - this.log('Changing workspace to', workspace?.uuid); + this.log("Changing workspace to", workspace?.uuid); await this._performWorkspaceChange(workspace, ...args); } catch (e) { - console.error('gZenWorkspaces: Error changing workspace', e); + console.error("gZenWorkspaces: Error changing workspace", e); } this.#inChangingWorkspace = false; } @@ -1628,7 +1660,7 @@ class nsZenWorkspaces { makeSureEmptyTabIsFirst() { const emptyTab = this._emptyTab; if (emptyTab) { - emptyTab.setAttribute('zen-workspace-id', this.activeWorkspace); + emptyTab.setAttribute("zen-workspace-id", this.activeWorkspace); if (emptyTab.linkedBrowser) { gBrowser.TabStateFlusher.flush(emptyTab.linkedBrowser); } @@ -1662,7 +1694,7 @@ class nsZenWorkspaces { for (const tab of tabs) { recurseFolder(tab); tab._tPos = tPos++; - if (!tab.hasAttribute('zen-empty-tab')) { + if (!tab.hasAttribute("zen-empty-tab")) { tab._pPos = pPos++; } } @@ -1677,13 +1709,13 @@ class nsZenWorkspaces { const essentialsHeight = window.windowUtils.getBoundsWithoutFlushing(essentialContainer).height; requestAnimationFrame(() => { - workspaceElement.style.paddingTop = essentialsHeight + 'px'; + workspaceElement.style.paddingTop = essentialsHeight + "px"; }); } } _organizeWorkspaceStripLocations(workspace, justMove = false, offsetPixels = 0) { - if (document.documentElement.hasAttribute('zen-creating-workspace')) { + if (document.documentElement.hasAttribute("zen-creating-workspace")) { // If we are creating a workspace, we don't want to animate the strip return; } @@ -1709,23 +1741,23 @@ class nsZenWorkspaces { // Get the next workspace contextId, if it's the same, dont apply offsetPixels // if it's not we do apply it if ( - container.getAttribute('container') != workspace.containerTabId && + container.getAttribute("container") != workspace.containerTabId && this.shouldAnimateEssentials ) { - container.setAttribute('hidden', 'true'); + container.setAttribute("hidden", "true"); } else { - container.removeAttribute('hidden'); + container.removeAttribute("hidden"); } if ( nextWorkspaceContextId !== workspaceContextId && offsetPixels && this.shouldAnimateEssentials && - (container.getAttribute('container') == nextWorkspaceContextId || - container.getAttribute('container') == workspaceContextId) + (container.getAttribute("container") == nextWorkspaceContextId || + container.getAttribute("container") == workspaceContextId) ) { - container.removeAttribute('hidden'); + container.removeAttribute("hidden"); // Animate from the currently selected workspace - if (container.getAttribute('container') == workspaceContextId) { + if (container.getAttribute("container") == workspaceContextId) { container.style.transform = `translateX(${offsetPixels / 2}%)`; } else { // Animate from the next workspace, transitioning towards the current one @@ -1744,18 +1776,18 @@ class nsZenWorkspaces { } = gZenThemePicker.getGradientForWorkspace(nextWorkspace); const existingGrain = gZenThemePicker.getGradientForWorkspace(workspace).grain; const percentage = Math.abs(offsetPixels) / 200; - document.documentElement.style.setProperty('--zen-background-opacity', 1 - percentage); + document.documentElement.style.setProperty("--zen-background-opacity", 1 - percentage); if (!this._hasAnimatedBackgrounds) { this._hasAnimatedBackgrounds = true; document.documentElement.style.setProperty( - '--zen-main-browser-background-old', + "--zen-main-browser-background-old", nextGradient ); document.documentElement.style.setProperty( - '--zen-main-browser-background-toolbar-old', + "--zen-main-browser-background-toolbar-old", nextToolbarGradient ); - document.documentElement.setAttribute('animating-background', 'true'); + document.documentElement.setAttribute("animating-background", "true"); } // Fit the offsetPixels into the grain limits. Both ends may be nextGrain and existingGrain, // so we need to use the min and max of both. For example, existing may be 0.2 and next may be 0.5, @@ -1780,21 +1812,21 @@ class nsZenWorkspaces { if (!workspaceIndicator) { return; } - const indicatorName = workspaceIndicator.querySelector('.zen-current-workspace-indicator-name'); - const indicatorIcon = workspaceIndicator.querySelector('.zen-current-workspace-indicator-icon'); - const iconStack = workspaceIndicator.querySelector('.zen-current-workspace-indicator-stack'); + const indicatorName = workspaceIndicator.querySelector(".zen-current-workspace-indicator-name"); + const indicatorIcon = workspaceIndicator.querySelector(".zen-current-workspace-indicator-icon"); + const iconStack = workspaceIndicator.querySelector(".zen-current-workspace-indicator-stack"); if (this.workspaceHasIcon(currentWorkspace)) { - indicatorIcon.removeAttribute('no-icon'); - iconStack.removeAttribute('no-icon'); + indicatorIcon.removeAttribute("no-icon"); + iconStack.removeAttribute("no-icon"); } else { - indicatorIcon.setAttribute('no-icon', 'true'); - iconStack.setAttribute('no-icon', 'true'); + indicatorIcon.setAttribute("no-icon", "true"); + iconStack.setAttribute("no-icon", "true"); } const icon = this.getWorkspaceIcon(currentWorkspace); - indicatorIcon.innerHTML = ''; - if (icon?.endsWith('.svg')) { - const img = document.createElement('img'); + indicatorIcon.innerHTML = ""; + if (icon?.endsWith(".svg")) { + const img = document.createElement("img"); img.src = icon; indicatorIcon.appendChild(img); } else { @@ -1810,13 +1842,14 @@ class nsZenWorkspaces { } } + /* eslint-disable complexity */ async _animateTabs( newWorkspace, shouldAnimate, tabToSelect = null, { previousWorkspaceIndex = null, previousWorkspace = null, onInit = false } = {} ) { - gZenUIManager.tabsWrapper.style.scrollbarWidth = 'none'; + gZenUIManager.tabsWrapper.style.scrollbarWidth = "none"; const kGlobalAnimationDuration = 0.2; this._animatingChange = true; const animations = []; @@ -1832,10 +1865,10 @@ class nsZenWorkspaces { clonedEssentials[clonedEssentials.length - 1].workspaces.push(workspace); continue; } - essentialsContainer.setAttribute('hidden', 'true'); + essentialsContainer.setAttribute("hidden", "true"); const essentialsClone = essentialsContainer.cloneNode(true); - essentialsClone.removeAttribute('hidden'); - essentialsClone.setAttribute('cloned', 'true'); + essentialsClone.removeAttribute("hidden"); + essentialsClone.setAttribute("cloned", "true"); clonedEssentials.push({ container: essentialsClone, workspaces: [workspace], @@ -1845,10 +1878,10 @@ class nsZenWorkspaces { }); } } - document.documentElement.setAttribute('animating-background', 'true'); + document.documentElement.setAttribute("animating-background", "true"); if (shouldAnimate && previousWorkspace) { let previousBackgroundOpacity = document.documentElement.style.getPropertyValue( - '--zen-background-opacity' + "--zen-background-opacity" ); try { // Prevent NaN from being set @@ -1865,25 +1898,25 @@ class nsZenWorkspaces { } gZenThemePicker.previousBackgroundOpacity = previousBackgroundOpacity; document.documentElement.style.setProperty( - '--zen-background-opacity', + "--zen-background-opacity", previousBackgroundOpacity ); animations.push( gZenUIManager.motion.animate( document.documentElement, { - '--zen-background-opacity': [previousBackgroundOpacity, 1], + "--zen-background-opacity": [previousBackgroundOpacity, 1], }, { - type: 'spring', + type: "spring", bounce: 0, duration: kGlobalAnimationDuration, } ) ); } - for (const element of document.querySelectorAll('zen-workspace')) { - if (element.classList.contains('zen-essentials-container')) { + for (const element of document.querySelectorAll("zen-workspace")) { + if (element.classList.contains("zen-essentials-container")) { continue; } const existingTransform = element.style.transform; @@ -1903,7 +1936,7 @@ class nsZenWorkspaces { : existingPaddingTop, }, { - type: 'spring', + type: "spring", bounce: 0, duration: kGlobalAnimationDuration, } @@ -1961,7 +1994,7 @@ class nsZenWorkspaces { const lastWorkspaceIndex = workspaces.findIndex( (w) => w.uuid === essentialsWorkspaces[essentialsWorkspaces.length - 1].uuid ); - cloned.originalContainer.style.removeProperty('transform'); + cloned.originalContainer.style.removeProperty("transform"); // Check if the container is even going to appear on the screen, to save on animation if ( // We also need to check if the container is even going to appear on the screen. @@ -1970,9 +2003,9 @@ class nsZenWorkspaces { // so we need to check if any of the workspaces in the container are between the // first and last workspace. !essentialsContainersInBetween.find( - (clonedEssentials) => - clonedEssentials.workspaces.some((w) => w.uuid === essentialsWorkspaces[0].uuid) && - clonedEssentials.workspaces.some( + (ce) => + ce.workspaces.some((w) => w.uuid === essentialsWorkspaces[0].uuid) && + ce.workspaces.some( (w) => w.uuid === essentialsWorkspaces[essentialsWorkspaces.length - 1].uuid ) ) @@ -2016,11 +2049,19 @@ class nsZenWorkspaces { if (repeats > 0 && needsOffsetAdjustment) { if (!isGoingLeft) { - if (existingOffset !== 0) existingOffset += 100; - if (newOffset !== 0) newOffset += 100; + if (existingOffset !== 0) { + existingOffset += 100; + } + if (newOffset !== 0) { + newOffset += 100; + } } else { - if (existingOffset !== 0) existingOffset -= 100; - if (newOffset !== 0) newOffset -= 100; + if (existingOffset !== 0) { + existingOffset -= 100; + } + if (newOffset !== 0) { + newOffset -= 100; + } } } @@ -2053,7 +2094,7 @@ class nsZenWorkspaces { const newTransform = `translateX(${newOffset}%)`; let existingTransform = `translateX(${existingOffset}%)`; - if (container.style.transform && container.style.transform !== 'none') { + if (container.style.transform && container.style.transform !== "none") { existingTransform = container.style.transform; } if (shouldAnimate) { @@ -2064,11 +2105,11 @@ class nsZenWorkspaces { { transform: [ existingTransform, - new Array(stepsInBetween).fill(newTransform).join(','), + new Array(stepsInBetween).fill(newTransform).join(","), ], }, { - type: 'spring', + type: "spring", bounce: 0, duration: kGlobalAnimationDuration, } @@ -2088,7 +2129,7 @@ class nsZenWorkspaces { // some sort of timeout to the animation promise, just in case it gets stuck. // We are doing a race between the timeout and the animations finishing. await Promise.race([Promise.all(animations), promiseTimeout]).catch(console.error); - document.documentElement.removeAttribute('animating-background'); + document.documentElement.removeAttribute("animating-background"); if (shouldAnimate) { for (const cloned of clonedEssentials) { cloned.container.remove(); @@ -2097,15 +2138,15 @@ class nsZenWorkspaces { this.updateTabsContainers(); } const essentialsContainer = this.getEssentialsSection(newWorkspace.containerTabId); - essentialsContainer.removeAttribute('hidden'); - essentialsContainer.style.transform = 'none'; + essentialsContainer.removeAttribute("hidden"); + essentialsContainer.style.transform = "none"; gBrowser.tabContainer._invalidateCachedTabs(); - gZenUIManager.tabsWrapper.style.removeProperty('scrollbar-width'); + gZenUIManager.tabsWrapper.style.removeProperty("scrollbar-width"); this._animatingChange = false; } _shouldChangeToTab(aTab) { - return !(aTab?.pinned && aTab?.hasAttribute('pending')); + return !(aTab?.pinned && aTab?.hasAttribute("pending")); } async #shouldShowTabInCurrentWorkspace(tab) { @@ -2119,11 +2160,11 @@ class nsZenWorkspaces { } _shouldShowTab(tab, workspaceUuid, containerId, workspaces) { - const isEssential = tab.getAttribute('zen-essential') === 'true'; - const tabWorkspaceId = tab.getAttribute('zen-workspace-id'); - const tabContextId = tab.getAttribute('usercontextid') ?? '0'; + const isEssential = tab.getAttribute("zen-essential") === "true"; + const tabWorkspaceId = tab.getAttribute("zen-workspace-id"); + const tabContextId = tab.getAttribute("usercontextid") ?? "0"; - if (tab.hasAttribute('zen-glance-tab')) { + if (tab.hasAttribute("zen-glance-tab")) { return true; // Always show glance tabs } @@ -2143,15 +2184,14 @@ class nsZenWorkspaces { if (containerId) { // In workspaces with default container: Show essentials that match the container return tabContextId == containerId; - } else { - // In workspaces without a default container: Show essentials that aren't in container-specific workspaces - // or have usercontextid="0" or no usercontextid - return ( - !tabContextId || - tabContextId === '0' || - !workspaces.some((workspace) => workspace.containerTabId === parseInt(tabContextId, 10)) - ); } + // In workspaces without a default container: Show essentials that aren't in container-specific workspaces + // or have usercontextid="0" or no usercontextid + return ( + !tabContextId || + tabContextId === "0" || + !workspaces.some((workspace) => workspace.containerTabId === parseInt(tabContextId, 10)) + ); } // For non-essential tabs (both normal and pinned) @@ -2223,10 +2263,10 @@ class nsZenWorkspaces { { previousWorkspaceIndex, previousWorkspace } = {} ) { // Update document state - document.documentElement.setAttribute('zen-workspace-id', workspace.uuid); + document.documentElement.setAttribute("zen-workspace-id", workspace.uuid); // Recalculate new tab observers - gBrowser.tabContainer.observe(null, 'nsPref:changed', 'privacy.userContext.enabled'); + gBrowser.tabContainer.observe(null, "nsPref:changed", "privacy.userContext.enabled"); gBrowser.tabContainer.arrowScrollbox = this.activeScrollbox; @@ -2235,7 +2275,7 @@ class nsZenWorkspaces { gZenThemePicker.onWorkspaceChange(workspace); }); - gZenUIManager.tabsWrapper.scrollbarWidth = 'none'; + gZenUIManager.tabsWrapper.scrollbarWidth = "none"; this.workspaceIcons.activeIndex = workspace.uuid; await this._animateTabs(workspace, !onInit && !this._animatingChange, tabToSelect, { previousWorkspaceIndex, @@ -2243,7 +2283,7 @@ class nsZenWorkspaces { onInit, }); this._organizeWorkspaceStripLocations(workspace, true); - gZenUIManager.tabsWrapper.style.scrollbarWidth = ''; + gZenUIManager.tabsWrapper.style.scrollbarWidth = ""; // Notify listeners if (this._changeListeners?.length) { @@ -2273,8 +2313,8 @@ class nsZenWorkspaces { gBrowser.showTab(tab); } for (const tab of gBrowser.tabs) { - if (!tab.hasAttribute('zen-workspace-id') && !tab.hasAttribute('zen-workspace-id')) { - tab.setAttribute('zen-workspace-id', workspace.uuid); + if (!tab.hasAttribute("zen-workspace-id") && !tab.hasAttribute("zen-workspace-id")) { + tab.setAttribute("zen-workspace-id", workspace.uuid); } } this.#fireSpaceUIUpdate(); @@ -2283,7 +2323,7 @@ class nsZenWorkspaces { #fireSpaceUIUpdate() { window.dispatchEvent( - new CustomEvent('ZenWorkspacesUIUpdate', { + new CustomEvent("ZenWorkspacesUIUpdate", { bubbles: true, detail: { activeIndex: this.activeWorkspace }, }) @@ -2306,29 +2346,31 @@ class nsZenWorkspaces { } updateWorkspacesChangeContextMenu() { - if (gZenWorkspaces.privateWindowOrDisabled) return; + if (gZenWorkspaces.privateWindowOrDisabled) { + return; + } const workspaces = this.getWorkspaces(); - const ctxCommand = document.getElementById('cmd_zenCtxDeleteWorkspace'); + const ctxCommand = document.getElementById("cmd_zenCtxDeleteWorkspace"); if (workspaces.length <= 1) { - ctxCommand.setAttribute('disabled', 'true'); + ctxCommand.setAttribute("disabled", "true"); } else { - ctxCommand.removeAttribute('disabled'); + ctxCommand.removeAttribute("disabled"); } - let menuPopupID = 'moveTabOptionsMenu'; - const menuPopup = document.getElementById(menuPopupID); - let menubar = document.getElementById('zen-spaces-menubar'); + let menuPopupID = "moveTabOptionsMenu"; + let menuPopup = document.getElementById(menuPopupID); + let menubar = document.getElementById("zen-spaces-menubar"); if (!menuPopup || !menubar) { return; } - let itemsToFill = [menubar.querySelector('menupopup'), menuPopup]; + let itemsToFill = [menubar.querySelector("menupopup"), menuPopup]; for (const popup of itemsToFill) { let isMoveTabPopup = popup.id === menuPopupID; - for (const item of popup.querySelectorAll('.zen-workspace-context-menu-item')) { + for (const item of popup.querySelectorAll(".zen-workspace-context-menu-item")) { item.remove(); } - const separator = document.createXULElement('menuseparator'); - separator.classList.add('zen-workspace-context-menu-item'); + const separator = document.createXULElement("menuseparator"); + separator.classList.add("zen-workspace-context-menu-item"); if (isMoveTabPopup) { popup.prepend(separator); } else { @@ -2342,12 +2384,12 @@ class nsZenWorkspaces { ); if (isMoveTabPopup) { popup.prepend(menuItem); - menuItem.setAttribute('command', 'cmd_zenChangeWorkspaceTab'); + menuItem.setAttribute("command", "cmd_zenChangeWorkspaceTab"); } else { if (i < 10) { - menuItem.setAttribute('key', `zen-workspace-switch-${i + 1}`); + menuItem.setAttribute("key", `zen-workspace-switch-${i + 1}`); } - menuItem.addEventListener('command', () => { + menuItem.addEventListener("command", () => { this.changeWorkspace(workspace); }); popup.appendChild(menuItem); @@ -2359,14 +2401,14 @@ class nsZenWorkspaces { #createWorkspaceData(name, icon, containerTabId = 0) { if (!this.currentWindowIsSyncing) { - containerTabId = parseInt(gBrowser.selectedTab.getAttribute('usercontextid')) || 0; - let label = ContextualIdentityService.getUserContextLabel(containerTabId) || 'Default'; - name = this.isPrivateWindow ? 'Private ' + name : label; + containerTabId = parseInt(gBrowser.selectedTab.getAttribute("usercontextid")) || 0; + let label = ContextualIdentityService.getUserContextLabel(containerTabId) || "Default"; + name = this.isPrivateWindow ? "Private " + name : label; } let workspace = { uuid: gZenUIManager.generateUuidv4(), - icon: icon, - name: name, + icon, + name, theme: nsZenThemePicker.getTheme([]), containerTabId, }; @@ -2374,22 +2416,22 @@ class nsZenWorkspaces { } async createAndSaveWorkspace( - name = 'Space', + name = "Space", icon = undefined, dontChange = false, containerTabId = 0, { beforeChangeCallback } = { beforeChangeCallback: null } // Callback to run before changing workspace ) { if (!this.workspaceEnabled) { - return; + return null; } // get extra tabs remaning (e.g. on new profiles) and just move them to the new workspace const extraTabs = Array.from(gBrowser.tabContainer.arrowScrollbox.children).filter( (child) => gBrowser.isTab(child) && - !child.hasAttribute('zen-workspace-id') && - !child.hasAttribute('zen-empty-tab') && - !child.hasAttribute('zen-essential') + !child.hasAttribute("zen-workspace-id") && + !child.hasAttribute("zen-empty-tab") && + !child.hasAttribute("zen-essential") ); let workspaceData = this.#createWorkspaceData(name, icon, containerTabId); if (!dontChange) { @@ -2403,14 +2445,14 @@ class nsZenWorkspaces { try { await beforeChangeCallback(workspaceData); } catch (e) { - console.error('Error in beforeChangeCallback:', e); + console.error("Error in beforeChangeCallback:", e); } } this.registerPinnedResizeObserver(); this.updateTabsContainers({ target: this.workspaceElement(workspaceData.uuid).pinnedTabsContainer, }); - let changed = extraTabs.length > 0; + let changed = !!extraTabs.length; if (changed) { gBrowser.tabContainer._invalidateCachedTabs(); gBrowser.selectedTab = extraTabs[0]; @@ -2439,9 +2481,9 @@ class nsZenWorkspaces { let count = 0; for (const child of arrowScrollbox.children) { if ( - !child.hasAttribute('hidden') && + !child.hasAttribute("hidden") && !child.closing && - !child.hasAttribute('zen-empty-tab') + !child.hasAttribute("zen-empty-tab") ) { count++; if (count > 1) { @@ -2455,47 +2497,47 @@ class nsZenWorkspaces { // <= 2 because we have the empty tab and the new tab button const shouldHideSeparator = fromTabSelection - ? pinnedContainer.hasAttribute('hide-separator') + ? pinnedContainer.hasAttribute("hide-separator") : !visibleTabsFound(); if (shouldHideSeparator) { - pinnedContainer.setAttribute('hide-separator', 'true'); + pinnedContainer.setAttribute("hide-separator", "true"); } else { - const workspaceID = pinnedContainer.getAttribute('zen-workspace-id'); + const workspaceID = pinnedContainer.getAttribute("zen-workspace-id"); const tabs = this.#unpinnedTabsInWorkspace(workspaceID); const closableTabs = this.#getClosableTabs(tabs); - const button = pinnedContainer.querySelector('.zen-workspace-close-unpinned-tabs-button'); + const button = pinnedContainer.querySelector(".zen-workspace-close-unpinned-tabs-button"); if (tabs.length === closableTabs.length) { - button.setAttribute('can-close', 'true'); + button.setAttribute("can-close", "true"); } else { - button.removeAttribute('can-close'); + button.removeAttribute("can-close"); } - pinnedContainer.removeAttribute('hide-separator'); + pinnedContainer.removeAttribute("hide-separator"); } } onPinnedTabsResize(entries, forAnimation = false) { if ( - document.documentElement.hasAttribute('inDOMFullscreen') || + document.documentElement.hasAttribute("inDOMFullscreen") || !this._hasInitializedTabsStrip || (this._organizingWorkspaceStrip && !forAnimation) || - document.documentElement.hasAttribute('zen-creating-workspace') || - document.documentElement.hasAttribute('customizing') + document.documentElement.hasAttribute("zen-creating-workspace") || + document.documentElement.hasAttribute("customizing") ) { return; } // forAnimation may be of type "ResizeObserver" if it's not a boolean, just ignore it - if (typeof forAnimation !== 'boolean') { + if (typeof forAnimation !== "boolean") { forAnimation = false; } for (const entry of entries) { - let originalWorkspaceId = entry.target.getAttribute('zen-workspace-id'); + let originalWorkspaceId = entry.target.getAttribute("zen-workspace-id"); if (!originalWorkspaceId) { - originalWorkspaceId = entry.target.closest('zen-workspace')?.id || this.activeWorkspace; + originalWorkspaceId = entry.target.closest("zen-workspace")?.id || this.activeWorkspace; } const workspacesIds = []; - if (entry.target.closest('#zen-essentials')) { + if (entry.target.closest("#zen-essentials")) { // Get all workspaces that have the same userContextId - const userContextId = parseInt(entry.target.getAttribute('container') || '0'); + const userContextId = parseInt(entry.target.getAttribute("container") || "0"); const workspaces = this.getWorkspaces().filter((w) => w.containerTabId === userContextId); workspacesIds.push(...workspaces.map((w) => w.uuid)); } else { @@ -2505,7 +2547,7 @@ class nsZenWorkspaces { const workspaceElement = this.workspaceElement(workspaceId); const workspaceObject = this.getWorkspaceFromId(workspaceId); if (!workspaceElement || !workspaceObject) { - console.warn('Workspace element or object not found for id', workspaceId); + console.warn("Workspace element or object not found for id", workspaceId); continue; } const arrowScrollbox = workspaceElement.tabsContainer; @@ -2521,9 +2563,9 @@ class nsZenWorkspaces { essentialHackType = 3; } if (essentialHackType > 0) { - essentialContainer.setAttribute('data-hack-type', essentialHackType); + essentialContainer.setAttribute("data-hack-type", essentialHackType); } else { - essentialContainer.removeAttribute('data-hack-type'); + essentialContainer.removeAttribute("data-hack-type"); } this.#updatePaddingTopOnTabs(workspaceElement, essentialContainer, forAnimation); this.updateShouldHideSeparator(arrowScrollbox, pinnedContainer); @@ -2533,17 +2575,17 @@ class nsZenWorkspaces { async onTabBrowserInserted(event) { let tab = event.originalTarget; - const isEssential = tab.getAttribute('zen-essential') === 'true'; - const workspaceID = tab.getAttribute('zen-workspace-id'); + const isEssential = tab.getAttribute("zen-essential") === "true"; + const workspaceID = tab.getAttribute("zen-workspace-id"); if (!this.workspaceEnabled || isEssential) { return; } if (workspaceID) { - if (tab.hasAttribute('change-workspace') && this.moveTabToWorkspace(tab, workspaceID)) { + if (tab.hasAttribute("change-workspace") && this.moveTabToWorkspace(tab, workspaceID)) { this.lastSelectedWorkspaceTabs[workspaceID] = gZenGlanceManager.getTabOrGlanceParent(tab); - tab.removeAttribute('change-workspace'); + tab.removeAttribute("change-workspace"); const workspace = this.getWorkspaceFromId(workspaceID); setTimeout(() => { this.changeWorkspace(workspace); @@ -2556,19 +2598,19 @@ class nsZenWorkspaces { if (!activeWorkspace) { return; } - if (tab.hasAttribute('zen-workspace-id')) { - const tabWorkspaceId = tab.getAttribute('zen-workspace-id'); + if (tab.hasAttribute("zen-workspace-id")) { + const tabWorkspaceId = tab.getAttribute("zen-workspace-id"); this.moveTabToWorkspace(tab, tabWorkspaceId); await this.changeWorkspaceWithID(tabWorkspaceId); } else { - tab.setAttribute('zen-workspace-id', activeWorkspace.uuid); + tab.setAttribute("zen-workspace-id", activeWorkspace.uuid); } } #changeToEmptyTab() { - const isEmpty = gBrowser.selectedTab.hasAttribute('zen-empty-tab'); - gZenCompactModeManager.sidebar.toggleAttribute('zen-has-empty-tab', isEmpty); - document.documentElement.setAttribute('zen-has-empty-tab', isEmpty); + const isEmpty = gBrowser.selectedTab.hasAttribute("zen-empty-tab"); + gZenCompactModeManager.sidebar.toggleAttribute("zen-has-empty-tab", isEmpty); + document.documentElement.setAttribute("zen-has-empty-tab", isEmpty); } async onLocationChange(event) { @@ -2578,14 +2620,14 @@ class nsZenWorkspaces { return; } - if (tab.hasAttribute('zen-glance-tab')) { + if (tab.hasAttribute("zen-glance-tab")) { // Extract from parent node so we are not selecting the wrong (current) tab - tab = tab.parentNode.closest('.tabbrowser-tab'); - console.assert(tab, 'Tab not found for zen-glance-tab'); + tab = tab.parentNode.closest(".tabbrowser-tab"); + console.assert(tab, "Tab not found for zen-glance-tab"); } - const workspaceID = tab.getAttribute('zen-workspace-id'); - const isEssential = tab.getAttribute('zen-essential') === 'true'; - if (tab.hasAttribute('zen-empty-tab')) { + const workspaceID = tab.getAttribute("zen-workspace-id"); + const isEssential = tab.getAttribute("zen-essential") === "true"; + if (tab.hasAttribute("zen-empty-tab")) { return; } @@ -2616,9 +2658,9 @@ class nsZenWorkspaces { this._organizingWorkspaceStrip = true; let workspaces = this.getWorkspaces(); let workspace = workspaces.find( - (workspace) => workspace.uuid === (this.#contextMenuData?.workspaceId || this.activeWorkspace) + (w) => w.uuid === (this.#contextMenuData?.workspaceId || this.activeWorkspace) ); - let userContextId = parseInt(event.target.getAttribute('data-usercontextid')); + let userContextId = parseInt(event.target.getAttribute("data-usercontextid")); workspace.containerTabId = userContextId + 0; // +0 to convert to number this.saveWorkspace(workspace); } @@ -2628,14 +2670,16 @@ class nsZenWorkspaces { const unpinnedTabs = this.#unpinnedTabsInWorkspace(workspaceId); const closableTabs = this.#getClosableTabs(unpinnedTabs); - if (!closableTabs.length) return; + if (!closableTabs.length) { + return; + } this.#deleteAllUnpinnedTabsInWorkspace(closableTabs); const restoreClosedTabsShortcut = gZenKeyboardShortcutsManager.getShortcutDisplayFromCommand( - 'History:RestoreLastClosedTabOrWindowOrSession' + "History:RestoreLastClosedTabOrWindowOrSession" ); - gZenUIManager.showToast('zen-workspaces-close-all-unpinned-tabs-toast', { + gZenUIManager.showToast("zen-workspaces-close-all-unpinned-tabs-toast", { l10nArgs: { shortcut: restoreClosedTabsShortcut, }, @@ -2645,9 +2689,9 @@ class nsZenWorkspaces { async contextDeleteWorkspace() { const workspaceId = this.#contextMenuData?.workspaceId || this.activeWorkspace; const [title, body] = await document.l10n.formatValues([ - { id: 'zen-workspaces-delete-workspace-title' }, + { id: "zen-workspaces-delete-workspace-title" }, { - id: 'zen-workspaces-delete-workspace-body', + id: "zen-workspaces-delete-workspace-body", args: { name: this.getWorkspaceFromId(workspaceId).name }, }, ]); @@ -2686,17 +2730,16 @@ class nsZenWorkspaces { #initializeWorkspaceTabContextMenus() { if (this.privateWindowOrDisabled) { const commandsToDisable = [ - 'cmd_zenOpenFolderCreation', - 'cmd_zenOpenWorkspaceCreation', - 'zen-context-menu-new-folder-toolbar', + "cmd_zenOpenFolderCreation", + "cmd_zenOpenWorkspaceCreation", + "zen-context-menu-new-folder-toolbar", ]; commandsToDisable.forEach((cmd) => { const element = document.getElementById(cmd); if (element) { - element.setAttribute('disabled', true); + element.setAttribute("disabled", true); } }); - return; } } @@ -2704,8 +2747,8 @@ class nsZenWorkspaces { const tabs = TabContextMenu.contextTab.multiselected ? gBrowser.selectedTabs : [TabContextMenu.contextTab]; - document.getElementById('tabContextMenu').hidePopup(); - const previousWorkspaceID = document.documentElement.getAttribute('zen-workspace-id'); + document.getElementById("tabContextMenu").hidePopup(); + const previousWorkspaceID = document.documentElement.getAttribute("zen-workspace-id"); for (let tab of tabs) { this.moveTabToWorkspace(tab, workspaceID); if (this.lastSelectedWorkspaceTabs[previousWorkspaceID] === tab) { @@ -2731,7 +2774,7 @@ class nsZenWorkspaces { if ( this.shouldForceContainerTabsToWorkspace && - typeof userContextId !== 'undefined' && + typeof userContextId !== "undefined" && this._workspaceCache && !fromExternal ) { @@ -2754,7 +2797,7 @@ class nsZenWorkspaces { if ( fromExternal !== true && - typeof userContextId !== 'undefined' && + typeof userContextId !== "undefined" && userContextId !== activeWorkspaceUserContextId ) { return [userContextId, false, undefined]; @@ -2763,14 +2806,14 @@ class nsZenWorkspaces { } getTabsToExclude(aTab) { - const tabWorkspaceId = aTab.getAttribute('zen-workspace-id'); - const containerId = aTab.getAttribute('usercontextid') ?? '0'; + const tabWorkspaceId = aTab.getAttribute("zen-workspace-id"); + const containerId = aTab.getAttribute("usercontextid") ?? "0"; // Return all tabs that are not on the same workspace return this.allStoredTabs.filter( (tab) => - tab.getAttribute('zen-workspace-id') !== tabWorkspaceId && + tab.getAttribute("zen-workspace-id") !== tabWorkspaceId && !this._shouldShowTab(tab, tabWorkspaceId, containerId, this._workspaceCache) && - !tab.hasAttribute('zen-empty-tab') + !tab.hasAttribute("zen-empty-tab") ); } @@ -2785,7 +2828,9 @@ class nsZenWorkspaces { } isBookmarkInAnotherWorkspace(bookmark) { - if (!this._workspaceBookmarksCache?.bookmarks) return false; + if (!this._workspaceBookmarksCache?.bookmarks) { + return false; + } const bookmarkGuid = bookmark.bookmarkGuid; const activeWorkspaceUuid = this.activeWorkspace; let isInActiveWorkspace = false; @@ -2816,17 +2861,18 @@ class nsZenWorkspaces { const tabs = []; // we need to go through each tab in each container const essentialsContainer = document.querySelectorAll( - '#zen-essentials .zen-workspace-tabs-section' + "#zen-essentials .zen-workspace-tabs-section" ); let pinnedContainers = []; let normalContainers = []; if (!this._hasInitializedTabsStrip) { - pinnedContainers = [document.getElementById('pinned-tabs-container')]; + pinnedContainers = [document.getElementById("pinned-tabs-container")]; normalContainers = [this.activeWorkspaceStrip]; } else { let workspaces = Array.from(this._workspaceCache || []); // Make the active workspace first workspaces = workspaces.sort((a, b) => + /* eslint-disable no-nested-ternary */ a.uuid === this.activeWorkspace ? -1 : b.uuid === this.activeWorkspace ? 1 : 0 ); for (const workspace of workspaces) { @@ -2839,20 +2885,20 @@ class nsZenWorkspaces { } const containers = [...essentialsContainer, ...pinnedContainers, ...normalContainers]; for (const container of containers) { - if (container.hasAttribute('cloned')) { + if (container.hasAttribute("cloned")) { continue; } for (const tab of container.children) { if (gBrowser.isTab(tab)) { tabs.push(tab); - const glance = tab.querySelector('.tabbrowser-tab[glance-id]'); + const glance = tab.querySelector(".tabbrowser-tab[glance-id]"); if (glance) { tabs.push(glance); } } else if (gBrowser.isTabGroup(tab)) { for (const groupTab of tab.tabs) { tabs.push(groupTab); - const glance = groupTab.querySelector('.tabbrowser-tab[glance-id]'); + const glance = groupTab.querySelector(".tabbrowser-tab[glance-id]"); if (glance) { tabs.push(glance); } @@ -2880,10 +2926,10 @@ class nsZenWorkspaces { const containers = [...pinnedContainers, ...normalContainers]; const tabGroups = []; for (const container of containers) { - for (const tabGroup of container.querySelectorAll('tab-group')) { + for (const tabGroup of container.querySelectorAll("tab-group")) { tabGroups.push(tabGroup); } - for (const tabGroup of container.querySelectorAll('zen-folder')) { + for (const tabGroup of container.querySelectorAll("zen-folder")) { tabGroups.push(tabGroup); } } @@ -2912,8 +2958,8 @@ class nsZenWorkspaces { const currentWorkspace = this.activeWorkspace; return this.allStoredTabs.filter( (tab) => - tab.hasAttribute('zen-essential') || - tab.getAttribute('zen-workspace-id') === currentWorkspace + tab.hasAttribute("zen-essential") || + tab.getAttribute("zen-workspace-id") === currentWorkspace ); } @@ -2933,18 +2979,18 @@ class nsZenWorkspaces { async switchTabIfNeeded(tab) { // Validate browser state first if (!this._validateBrowserState()) { - console.warn('Browser state invalid for tab switching'); + console.warn("Browser state invalid for tab switching"); return; } if (!tab) { - console.warn('switchTabIfNeeded called with null tab'); + console.warn("switchTabIfNeeded called with null tab"); return; } // Validate tab state if (tab.closing || !tab.ownerGlobal || tab.ownerGlobal.closed || !tab.linkedBrowser) { - console.warn('Tab is no longer valid, cannot select it'); + console.warn("Tab is no longer valid, cannot select it"); return; } @@ -2952,30 +2998,30 @@ class nsZenWorkspaces { const currentWorkspace = this.getActiveWorkspaceFromCache(); // Check if we need to change workspace if ( - (tab.getAttribute('zen-workspace-id') !== this.activeWorkspace && - !tab.hasAttribute('zen-essential')) || - (currentWorkspace.containerTabId !== parseInt(tab.parentNode.getAttribute('container')) && + (tab.getAttribute("zen-workspace-id") !== this.activeWorkspace && + !tab.hasAttribute("zen-essential")) || + (currentWorkspace.containerTabId !== parseInt(tab.parentNode.getAttribute("container")) && this.containerSpecificEssentials) ) { // Use a mutex-like approach to prevent concurrent workspace changes if (this._workspaceChangeInProgress) { - console.warn('Workspace change already in progress, deferring tab switch'); + console.warn("Workspace change already in progress, deferring tab switch"); return; } let workspaceToSwitch = undefined; - if (tab.hasAttribute('zen-essential')) { + if (tab.hasAttribute("zen-essential")) { // Find first workspace with the same container - const containerTabId = parseInt(tab.parentNode.getAttribute('container')); + const containerTabId = parseInt(tab.parentNode.getAttribute("container")); // +0 to convert to number workspaceToSwitch = this._workspaceCache.find( (workspace) => workspace.containerTabId + 0 === containerTabId ); } else { - workspaceToSwitch = this.getWorkspaceFromId(tab.getAttribute('zen-workspace-id')); + workspaceToSwitch = this.getWorkspaceFromId(tab.getAttribute("zen-workspace-id")); } if (!workspaceToSwitch) { - console.error('No workspace found for tab, cannot switch'); + console.error("No workspace found for tab, cannot switch"); await this._safelySelectTab(tab); return; } @@ -2993,7 +3039,7 @@ class nsZenWorkspaces { // Safely switch to the tab using our debounced method await this._safelySelectTab(tab); } catch (e) { - console.error('Error in switchTabIfNeeded:', e); + console.error("Error in switchTabIfNeeded:", e); } } @@ -3006,25 +3052,27 @@ class nsZenWorkspaces { return 0; } const activeWorkspace = this.activeWorkspace; - const workspace = workspaces.find((workspace) => workspace.uuid === activeWorkspace); + const workspace = workspaces.find((w) => w.uuid === activeWorkspace); return workspace.containerTabId; } onWindowResize(event = undefined) { - if (!(!event || event.target === window)) return; + if (!(!event || event.target === window)) { + return; + } gZenUIManager.updateTabsToolbar(); // Check if workspace icons overflow the parent container - const parent = this.workspaceIcons; + let parent = this.workspaceIcons; if (!parent || this._processingResize) { return; } if (!gZenPinnedTabManager.expandedSidebarMode) { for (const icon of parent.children) { - if (icon.tagName === 'toolbarbutton') { - icon.style.width = ''; // Reset to default size when in expanded mode + if (icon.tagName === "toolbarbutton") { + icon.style.width = ""; // Reset to default size when in expanded mode } } - parent.removeAttribute('icons-overflow'); + parent.removeAttribute("icons-overflow"); return; } const maxButtonSize = 32; // IMPORTANT: This should match the CSS size of the icons @@ -3033,7 +3081,7 @@ class nsZenWorkspaces { // Calculate the total width needed for all icons const totalWidth = Array.from(parent.children).reduce((width, icon) => { - if (icon.tagName === 'toolbarbutton') { + if (icon.tagName === "toolbarbutton") { return width + minButtonSize + separation; } return width; @@ -3041,9 +3089,9 @@ class nsZenWorkspaces { // Check if the total width exceeds the parent's width if (totalWidth > parent.clientWidth) { - parent.setAttribute('icons-overflow', 'true'); + parent.setAttribute("icons-overflow", "true"); } else { - parent.removeAttribute('icons-overflow'); + parent.removeAttribute("icons-overflow"); } // Set the width of each icon to the maximum size they can fit on @@ -3052,14 +3100,14 @@ class nsZenWorkspaces { minButtonSize ); for (const icon of parent.children) { - if (icon.tagName === 'toolbarbutton') { + if (icon.tagName === "toolbarbutton") { icon.style.width = `${Math.min(widthPerButton, maxButtonSize)}px`; } } } fixTabInsertLocation(tab) { - if (tab.hasAttribute('zen-essential')) { + if (tab.hasAttribute("zen-essential")) { // Essential tabs should always be inserted at the end of the essentials section const essentialsSection = this.getEssentialsSection(tab); if (essentialsSection) { @@ -3083,15 +3131,15 @@ class nsZenWorkspaces { return; } if (currentWorkspaceStrip.overflows) { - gBrowser.tabContainer.setAttribute('overflow', 'true'); + gBrowser.tabContainer.setAttribute("overflow", "true"); } else { - gBrowser.tabContainer.removeAttribute('overflow'); + gBrowser.tabContainer.removeAttribute("overflow"); } } handleTabCloseWindow() { - if (Services.prefs.getBoolPref('zen.tabs.close-window-with-empty')) { - document.getElementById('cmd_closeWindow').doCommand(); + if (Services.prefs.getBoolPref("zen.tabs.close-window-with-empty")) { + document.getElementById("cmd_closeWindow").doCommand(); } } } diff --git a/src/zen/workspaces/create-workspace-form.css b/src/zen/workspaces/create-workspace-form.css index b6ad9c060..62e6fb0cd 100644 --- a/src/zen/workspaces/create-workspace-form.css +++ b/src/zen/workspaces/create-workspace-form.css @@ -79,7 +79,7 @@ zen-workspace-creation { fill: currentColor; } - &:not([has-svg-icon='true']) image { + &:not([has-svg-icon="true"]) image { display: none; } @@ -89,7 +89,7 @@ zen-workspace-creation { justify-content: center; } - &[has-svg-icon='true'] label { + &[has-svg-icon="true"] label { display: none; } @@ -98,7 +98,7 @@ zen-workspace-creation { border-radius: 4px; width: calc(100% + 2px); height: calc(100% + 2px); - content: ''; + content: ""; position: absolute; top: -2px; left: -2px; diff --git a/src/zen/workspaces/zen-gradient-generator.css b/src/zen/workspaces/zen-gradient-generator.css index d609aeaae..b7396a3cc 100644 --- a/src/zen/workspaces/zen-gradient-generator.css +++ b/src/zen/workspaces/zen-gradient-generator.css @@ -117,10 +117,9 @@ position: relative; transition: transform 0.1s; - &[data-num-dots='3'] { + &[data-num-dots="3"] { background: - radial-gradient(circle at 0% 0%, var(--c1), transparent 100%), - radial-gradient(circle at 100% 0%, var(--c2), transparent 100%), + radial-gradient(circle at 0% 0%, var(--c1), transparent 100%), radial-gradient(circle at 100% 0%, var(--c2), transparent 100%), linear-gradient(to top, var(--c3) 0%, transparent 60%); } @@ -198,7 +197,7 @@ justify-content: flex-start; &::before { - content: ''; + content: ""; position: absolute; width: calc(100% - 8px); height: 16px; @@ -251,10 +250,7 @@ min-height: calc(var(--panel-width) - var(--panel-padding) * 2 - 2px); background: light-dark(rgba(0, 0, 0, 0.05), rgba(255, 255, 255, 0.03)); - background-image: radial-gradient( - light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.05)) 1px, - transparent 0 - ); + background-image: radial-gradient(light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.05)) 1px, transparent 0); background-position: -23px -23px; background-size: 6px 6px; @@ -289,7 +285,7 @@ } } - &[dragging='true'] { + &[dragging="true"] { transform: scale(1.2) translate(-25%, -25%) !important; } } @@ -361,7 +357,7 @@ max-height: 32px; } -@media not -moz-pref('zen.theme.gradient.show-custom-colors') { +@media not -moz-pref("zen.theme.gradient.show-custom-colors") { #PanelUI-zen-gradient-generator-custom-colors { display: none !important; } @@ -378,18 +374,14 @@ } &::after { - content: ''; + content: ""; position: absolute; width: 60%; height: 60%; border: 1px solid color-mix(in srgb, var(--zen-colors-border) 50%, transparent 50%); border-radius: 50%; /* 3d effect */ - background: linear-gradient( - -45deg, - transparent -10%, - light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.1)) 110% - ); + background: linear-gradient(-45deg, transparent -10%, light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.1)) 110%); z-index: 2; top: 50%; left: 50%; @@ -409,7 +401,7 @@ left: 50%; transform: translate(-50%, -50%); z-index: 1; - content: ''; + content: ""; position: absolute; } @@ -449,7 +441,7 @@ margin: 0 !important; } -#PanelUI-zen-gradient-generator[invalidate-controls='true'] { +#PanelUI-zen-gradient-generator[invalidate-controls="true"] { #PanelUI-zen-gradient-generator-opacity { display: none !important; } diff --git a/src/zen/zen.globals.js b/src/zen/zen.globals.js deleted file mode 100644 index 30374b9ff..000000000 --- a/src/zen/zen.globals.js +++ /dev/null @@ -1,306 +0,0 @@ -// This Source Code Form is subject to the terms of the Mozilla Public -// License, v. 2.0. If a copy of the MPL was not distributed with this -// file, You can obtain one at http://mozilla.org/MPL/2.0/. - -export default [ - 'nsZenSiteDataPanel', - - 'ZenThemeModifier', - 'ZenHasPolyfill', - - 'gZenOperatingSystemCommonUtils', - 'gZenCommonActions', - - 'gZenCompactModeManager', - - 'gZenUIManager', - 'gZenVerticalTabsManager', - 'gZenStartup', - - 'gZenWorkspaces', - 'gZenKeyboardShortcutsManager', - 'ZenWorkspacesEngine', - 'ZenWorkspaceBookmarksStorage', - - 'ZEN_KEYSET_ID', - - 'gZenPinnedTabManager', - - 'gZenEmojiPicker', - 'gZenSessionStore', - 'gZenFolders', - 'gZenMediaController', - 'gZenGlanceManager', - - 'gZenThemePicker', - - 'gZenViewSplitter', - - 'Ci', - 'Cu', - 'Cc', - - 'JSWindowActorParent', - 'JSWindowActorChild', - - 'delayedStartupPromise', - - 'Services', - 'PathUtils', - 'ChromeUtils', - 'IOUtils', - 'XPCOMUtils', - 'AppConstants', - 'gBrowserInit', - 'gBrowser', - 'gContextMenu', - 'gMultiProcessBrowser', - 'gFissionBrowser', - 'gBrowserAllowScriptsToCloseInitialTabs', - 'gEditUIVisible', - 'gReduceMotionSetting', - 'gReduceMotionOverride', - 'shouldSuppressPopupNotifications', - 'gLazyFindCommand', - 'gPageIcons', - 'gInitialPages', - 'isInitialPage', - 'browserWindows', - 'MozTabbrowserTabGroup', - 'updateBookmarkToolbarVisibility', - 'gNavigatorBundle', - 'updateFxaToolbarMenu', - 'UpdateBackForwardCommands', - 'updatePrintCommands', - 'SetClickAndHoldHandlers', - 'gClickAndHoldListenersOnElement', - 'gSessionHistoryObserver', - 'gStoragePressureObserver', - 'PopupBlockerObserver', - 'gKeywordURIFixup', - '_createNullPrincipalFromTabUserContextId', - 'HandleAppCommandEvent', - 'BrowserCommands', - 'kSkipCacheFlags', - 'loadOneOrMoreURIs', - 'openLocation', - 'gLastOpenDirectory', - 'readFromClipboard', - 'UpdateUrlbarSearchSplitterState', - 'UpdatePopupNotificationsVisibility', - 'PageProxyClickHandler', - 'OpenSearchManager', - 'SimpleGestureEvent', - 'MozXULElement', - 'TabContextMenu', - 'CreateContainerTabMenu', - 'FillHistoryMenu', - 'toOpenWindowByType', - 'OpenBrowserWindow', - 'updateEditUIVisibility', - 'gFileMenu', - 'openNewUserContextTab', - 'XULBrowserWindow', - 'LinkTargetDisplay', - 'CombinedStopReload', - 'TabsProgressListener', - 'showFullScreenViewContextMenuItems', - 'onViewToolbarCommand', - 'setToolbarVisibility', - 'updateToggleControlLabel', - 'Win10TabletModeUpdater', - 'displaySecurityInfo', - 'gUIDensity', - 'nodeToTooltipMap', - 'nodeToShortcutMap', - 'gDynamicTooltipCache', - 'GetDynamicShortcutTooltipText', - 'UpdateDynamicShortcutTooltipText', - 'hrefAndLinkNodeForClickEvent', - 'contentAreaClick', - 'handleLinkClick', - 'middleMousePaste', - 'handleDroppedLink', - 'ToolbarContextMenu', - 'BrowserOffline', - 'CanvasPermissionPromptHelper', - 'WebAuthnPromptHelper', - 'CanCloseWindow', - 'WindowIsClosing', - 'warnAboutClosingWindow', - 'MailIntegration', - 'gRemoteControl', - 'gPrivateBrowsingUI', - 'switchToTabHavingURI', - 'gRestoreLastSessionObserver', - 'safeModeRestart', - 'duplicateTabIn', - 'MousePosTracker', - 'ToolbarIconColor', - 'PanicButtonNotifier', - 'TabDialogBox', - 'gDialogBox', - 'ConfirmationHint', - 'FirefoxViewHandler', - 'AMTelemetry', - 'AboutNewTab', - 'AboutReaderParent', - 'AddonManager', - 'BrowserTelemetryUtils', - 'BrowserUIUtils', - 'BrowserUsageTelemetry', - 'BrowserWindowTracker', - 'CFRPageActions', - 'Color', - 'ContentAnalysis', - 'ContextualIdentityService', - 'CustomizableUI', - 'DevToolsSocketStatus', - 'DownloadUtils', - 'DownloadsCommon', - 'E10SUtils', - 'ExtensionsUI', - 'HomePage', - 'LightweightThemeConsumer', - 'LoginHelper', - 'LoginManagerParent', - 'MigrationUtils', - 'NetUtil', - 'NewTabPagePreloading', - 'NewTabUtils', - 'NimbusFeatures', - 'OpenInTabsUtils', - 'PageActions', - 'PageThumbs', - 'PanelMultiView', - 'PanelView', - 'PictureInPicture', - 'PlacesTransactions', - 'PlacesUIUtils', - 'PlacesUtils', - 'PrivateBrowsingUtils', - 'ProcessHangMonitor', - 'PromptUtils', - 'ReaderMode', - 'ResetPBMPanel', - 'SafeBrowsing', - 'Sanitizer', - 'ScreenshotsUtils', - 'SearchUIUtils', - 'SessionStartup', - 'SessionStore', - 'SessionWindowUI', - 'SharingUtils', - 'ShortcutUtils', - 'SiteDataManager', - 'SitePermissions', - 'SubDialog', - 'SubDialogManager', - 'TabCrashHandler', - 'TabsSetupFlowManager', - 'TaskbarTabsChrome', - 'TelemetryEnvironment', - 'TranslationsParent', - 'UITour', - 'UpdateUtils', - 'URILoadingHelper', - 'UrlbarInput', - 'UrlbarPrefs', - 'UrlbarProviderSearchTips', - 'UrlbarTokenizer', - 'UrlbarUtils', - 'UrlbarValueFormatter', - 'Weave', - 'WebNavigationFrames', - 'webrtcUI', - 'WebsiteFilter', - 'ZoomUI', - 'fxAccounts', - 'PlacesTreeView', - 'PlacesInsertionPoint', - 'PlacesController', - 'PlacesControllerDragHelper', - 'PrintUtils', - 'ZoomManager', - 'FullZoom', - 'PanelUI', - 'gViewSourceUtils', - 'gTabsPanel', - 'BrowserAddonUI', - 'gExtensionsNotifications', - 'gUnifiedExtensions', - 'gXPInstallObserver', - 'ctrlTab', - 'CustomizationHandler', - 'AutoHideMenubar', - 'PointerLock', - 'FullScreen', - 'gIdentityHandler', - 'gPermissionPanel', - 'SelectTranslationsPanel', - 'FullPageTranslationsPanel', - 'gProtectionsHandler', - 'gGestureSupport', - 'gHistorySwipeAnimation', - 'gSafeBrowsing', - 'gSync', - 'gBrowserThumbnails', - 'nsContextMenu', - 'DownloadsPanel', - 'DownloadsOverlayLoader', - 'DownloadsView', - 'DownloadsViewUI', - 'DownloadsViewController', - 'DownloadsSummary', - 'DownloadsFooter', - 'DownloadsBlockedSubview', - 'DownloadsButton', - 'DownloadsIndicatorView', - 'gEditItemOverlay', - 'gGfxUtils', - 'ToolbarKeyboardNavigator', - 'A11yUtils', - 'gSharedTabWarning', - 'gPageStyleMenu', - 'gProfiles', - 'ContentPrefService2', - 'classifierService', - 'Favicons', - 'WindowsUIUtils', - 'BrowserHandler', - 'Marionette', - 'RemoteAgent', - 'Marionette', - 'RemoteAgent', - 'RTL_UI', - 'gLocaleChangeObserver', - 'gBrandBundle', - 'gBrowserBundle', - 'gCustomizeMode', - 'gNavToolbox', - 'gURLBar', - 'gNotificationBox', - 'InlineSpellCheckerUI', - 'PopupNotifications', - 'MacUserActivityUpdater', - 'Win7Features', - 'gToolbarKeyNavEnabled', - 'gBookmarksToolbarVisibility', - 'gFxaToolbarEnabled', - 'gFxaToolbarAccessed', - 'gAddonAbuseReportEnabled', - 'gMiddleClickNewTabUsesPasteboard', - 'gPrintEnabled', - 'gTranslationsEnabled', - 'gUseFeltPrivacyUI', - 'gReduceMotion', - 'gFindBar', - 'gFindBarInitialized', - 'gFindBarPromise', - 'SelectableProfileService', - 'ActionsProviderContextualSearch', - 'ToolbarDropHandler', - 'ProfilesDatastoreService', - - 'TAB_DROP_TYPE', -]; diff --git a/src/zen/zen.globals.mjs b/src/zen/zen.globals.mjs new file mode 100644 index 000000000..c4b60a32b --- /dev/null +++ b/src/zen/zen.globals.mjs @@ -0,0 +1,308 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +export default [ + "nsZenSiteDataPanel", + + "ZenThemeModifier", + "ZenHasPolyfill", + + "gZenOperatingSystemCommonUtils", + "gZenCommonActions", + + "gZenCompactModeManager", + + "gZenWindowSync", + + "gZenUIManager", + "gZenVerticalTabsManager", + "gZenStartup", + + "gZenWorkspaces", + "gZenKeyboardShortcutsManager", + "ZenWorkspacesEngine", + "ZenWorkspaceBookmarksStorage", + + "ZEN_KEYSET_ID", + + "gZenPinnedTabManager", + + "gZenEmojiPicker", + "gZenSessionStore", + "gZenFolders", + "gZenMediaController", + "gZenGlanceManager", + + "gZenThemePicker", + + "gZenViewSplitter", + + "Ci", + "Cu", + "Cc", + + "JSWindowActorParent", + "JSWindowActorChild", + + "delayedStartupPromise", + + "Services", + "PathUtils", + "ChromeUtils", + "IOUtils", + "XPCOMUtils", + "AppConstants", + "gBrowserInit", + "gBrowser", + "gContextMenu", + "gMultiProcessBrowser", + "gFissionBrowser", + "gBrowserAllowScriptsToCloseInitialTabs", + "gEditUIVisible", + "gReduceMotionSetting", + "gReduceMotionOverride", + "shouldSuppressPopupNotifications", + "gLazyFindCommand", + "gPageIcons", + "gInitialPages", + "isInitialPage", + "browserWindows", + "MozTabbrowserTabGroup", + "updateBookmarkToolbarVisibility", + "gNavigatorBundle", + "updateFxaToolbarMenu", + "UpdateBackForwardCommands", + "updatePrintCommands", + "SetClickAndHoldHandlers", + "gClickAndHoldListenersOnElement", + "gSessionHistoryObserver", + "gStoragePressureObserver", + "PopupBlockerObserver", + "gKeywordURIFixup", + "_createNullPrincipalFromTabUserContextId", + "HandleAppCommandEvent", + "BrowserCommands", + "kSkipCacheFlags", + "loadOneOrMoreURIs", + "openLocation", + "gLastOpenDirectory", + "readFromClipboard", + "UpdateUrlbarSearchSplitterState", + "UpdatePopupNotificationsVisibility", + "PageProxyClickHandler", + "OpenSearchManager", + "SimpleGestureEvent", + "MozXULElement", + "TabContextMenu", + "CreateContainerTabMenu", + "FillHistoryMenu", + "toOpenWindowByType", + "OpenBrowserWindow", + "updateEditUIVisibility", + "gFileMenu", + "openNewUserContextTab", + "XULBrowserWindow", + "LinkTargetDisplay", + "CombinedStopReload", + "TabsProgressListener", + "showFullScreenViewContextMenuItems", + "onViewToolbarCommand", + "setToolbarVisibility", + "updateToggleControlLabel", + "Win10TabletModeUpdater", + "displaySecurityInfo", + "gUIDensity", + "nodeToTooltipMap", + "nodeToShortcutMap", + "gDynamicTooltipCache", + "GetDynamicShortcutTooltipText", + "UpdateDynamicShortcutTooltipText", + "hrefAndLinkNodeForClickEvent", + "contentAreaClick", + "handleLinkClick", + "middleMousePaste", + "handleDroppedLink", + "ToolbarContextMenu", + "BrowserOffline", + "CanvasPermissionPromptHelper", + "WebAuthnPromptHelper", + "CanCloseWindow", + "WindowIsClosing", + "warnAboutClosingWindow", + "MailIntegration", + "gRemoteControl", + "gPrivateBrowsingUI", + "switchToTabHavingURI", + "gRestoreLastSessionObserver", + "safeModeRestart", + "duplicateTabIn", + "MousePosTracker", + "ToolbarIconColor", + "PanicButtonNotifier", + "TabDialogBox", + "gDialogBox", + "ConfirmationHint", + "FirefoxViewHandler", + "AMTelemetry", + "AboutNewTab", + "AboutReaderParent", + "AddonManager", + "BrowserTelemetryUtils", + "BrowserUIUtils", + "BrowserUsageTelemetry", + "BrowserWindowTracker", + "CFRPageActions", + "Color", + "ContentAnalysis", + "ContextualIdentityService", + "CustomizableUI", + "DevToolsSocketStatus", + "DownloadUtils", + "DownloadsCommon", + "E10SUtils", + "ExtensionsUI", + "HomePage", + "LightweightThemeConsumer", + "LoginHelper", + "LoginManagerParent", + "MigrationUtils", + "NetUtil", + "NewTabPagePreloading", + "NewTabUtils", + "NimbusFeatures", + "OpenInTabsUtils", + "PageActions", + "PageThumbs", + "PanelMultiView", + "PanelView", + "PictureInPicture", + "PlacesTransactions", + "PlacesUIUtils", + "PlacesUtils", + "PrivateBrowsingUtils", + "ProcessHangMonitor", + "PromptUtils", + "ReaderMode", + "ResetPBMPanel", + "SafeBrowsing", + "Sanitizer", + "ScreenshotsUtils", + "SearchUIUtils", + "SessionStartup", + "SessionStore", + "SessionWindowUI", + "SharingUtils", + "ShortcutUtils", + "SiteDataManager", + "SitePermissions", + "SubDialog", + "SubDialogManager", + "TabCrashHandler", + "TabsSetupFlowManager", + "TaskbarTabsChrome", + "TelemetryEnvironment", + "TranslationsParent", + "UITour", + "UpdateUtils", + "URILoadingHelper", + "UrlbarInput", + "UrlbarPrefs", + "UrlbarProviderSearchTips", + "UrlbarTokenizer", + "UrlbarUtils", + "UrlbarValueFormatter", + "Weave", + "WebNavigationFrames", + "webrtcUI", + "WebsiteFilter", + "ZoomUI", + "fxAccounts", + "PlacesTreeView", + "PlacesInsertionPoint", + "PlacesController", + "PlacesControllerDragHelper", + "PrintUtils", + "ZoomManager", + "FullZoom", + "PanelUI", + "gViewSourceUtils", + "gTabsPanel", + "BrowserAddonUI", + "gExtensionsNotifications", + "gUnifiedExtensions", + "gXPInstallObserver", + "ctrlTab", + "CustomizationHandler", + "AutoHideMenubar", + "PointerLock", + "FullScreen", + "gIdentityHandler", + "gPermissionPanel", + "SelectTranslationsPanel", + "FullPageTranslationsPanel", + "gProtectionsHandler", + "gGestureSupport", + "gHistorySwipeAnimation", + "gSafeBrowsing", + "gSync", + "gBrowserThumbnails", + "nsContextMenu", + "DownloadsPanel", + "DownloadsOverlayLoader", + "DownloadsView", + "DownloadsViewUI", + "DownloadsViewController", + "DownloadsSummary", + "DownloadsFooter", + "DownloadsBlockedSubview", + "DownloadsButton", + "DownloadsIndicatorView", + "gEditItemOverlay", + "gGfxUtils", + "ToolbarKeyboardNavigator", + "A11yUtils", + "gSharedTabWarning", + "gPageStyleMenu", + "gProfiles", + "ContentPrefService2", + "classifierService", + "Favicons", + "WindowsUIUtils", + "BrowserHandler", + "Marionette", + "RemoteAgent", + "Marionette", + "RemoteAgent", + "RTL_UI", + "gLocaleChangeObserver", + "gBrandBundle", + "gBrowserBundle", + "gCustomizeMode", + "gNavToolbox", + "gURLBar", + "gNotificationBox", + "InlineSpellCheckerUI", + "PopupNotifications", + "MacUserActivityUpdater", + "Win7Features", + "gToolbarKeyNavEnabled", + "gBookmarksToolbarVisibility", + "gFxaToolbarEnabled", + "gFxaToolbarAccessed", + "gAddonAbuseReportEnabled", + "gMiddleClickNewTabUsesPasteboard", + "gPrintEnabled", + "gTranslationsEnabled", + "gUseFeltPrivacyUI", + "gReduceMotion", + "gFindBar", + "gFindBarInitialized", + "gFindBarPromise", + "SelectableProfileService", + "ActionsProviderContextualSearch", + "ToolbarDropHandler", + "ProfilesDatastoreService", + + "TAB_DROP_TYPE", +]; diff --git a/svgo.config.js b/svgo.config.js index d2ed6f2c2..3a00a8fda 100644 --- a/svgo.config.js +++ b/svgo.config.js @@ -4,21 +4,21 @@ export default { plugins: [ - 'removeMetadata', - 'removeEditorsNSData', - 'removeEmptyAttrs', - 'convertShapeToPath', - 'collapseGroups', - 'mergePaths', - 'removeXMLProcInst', - 'removeUnknownsAndDefaults', - 'removeUselessDefs', - 'reusePaths', - 'convertStyleToAttrs', + "removeMetadata", + "removeEditorsNSData", + "removeEmptyAttrs", + "convertShapeToPath", + "collapseGroups", + "mergePaths", + "removeXMLProcInst", + "removeUnknownsAndDefaults", + "removeUselessDefs", + "reusePaths", + "convertStyleToAttrs", { - name: 'removeAttrs', + name: "removeAttrs", params: { - attrs: ['version', 'y', 'x', 'id'], + attrs: ["version", "y", "x", "id"], }, }, ], diff --git a/tools/eslint-plugin-spidermonkey-js/LICENSE b/tools/eslint-plugin-spidermonkey-js/LICENSE new file mode 100644 index 000000000..e87a115e4 --- /dev/null +++ b/tools/eslint-plugin-spidermonkey-js/LICENSE @@ -0,0 +1,363 @@ +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. "Contributor" + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. "Contributor Version" + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the terms of + a Secondary License. + +1.6. "Executable Form" + + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + + means a work that combines Covered Software with other material, in a + separate file or files, that is not Covered Software. + +1.8. "License" + + means this document. + +1.9. "Licensable" + + means having the right to grant, to the maximum extent possible, whether + at the time of the initial grant or subsequently, any and all of the + rights conveyed by this License. + +1.10. "Modifications" + + means any of the following: + + a. any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. "Patent Claims" of a Contributor + + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the License, + by the making, using, selling, offering for sale, having made, import, + or transfer of either its Contributions or its Contributor Version. + +1.12. "Secondary License" + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. "Source Code Form" + + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, "control" means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution + become effective for each Contribution on the date the Contributor first + distributes such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under + this License. No additional rights or licenses will be implied from the + distribution or licensing of Covered Software under this License. + Notwithstanding Section 2.1(b) above, no patent license is granted by a + Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of + its Contributions. + + This License does not grant any rights in the trademarks, service marks, + or logos of any Contributor (except as may be necessary to comply with + the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this + License (see Section 10.2) or under the terms of a Secondary License (if + permitted under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its + Contributions are its original creation(s) or it has sufficient rights to + grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under + applicable copyright doctrines of fair use, fair dealing, or other + equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under + the terms of this License. You must inform recipients that the Source + Code Form of the Covered Software is governed by the terms of this + License, and how they can obtain a copy of this License. You may not + attempt to alter or restrict the recipients' rights in the Source Code + Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter the + recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for + the Covered Software. If the Larger Work is a combination of Covered + Software with a work governed by one or more Secondary Licenses, and the + Covered Software is not Incompatible With Secondary Licenses, this + License permits You to additionally distribute such Covered Software + under the terms of such Secondary License(s), so that the recipient of + the Larger Work may, at their option, further distribute the Covered + Software under the terms of either this License or such Secondary + License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices + (including copyright notices, patent notices, disclaimers of warranty, or + limitations of liability) contained within the Source Code Form of the + Covered Software, except that You may alter any license notices to the + extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on + behalf of any Contributor. You must make it absolutely clear that any + such warranty, support, indemnity, or liability obligation is offered by + You alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, + judicial order, or regulation then You must: (a) comply with the terms of + this License to the maximum extent possible; and (b) describe the + limitations and the code they affect. Such description must be placed in a + text file included with all distributions of the Covered Software under + this License. Except to the extent prohibited by statute or regulation, + such description must be sufficiently detailed for a recipient of ordinary + skill to be able to understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing + basis, if such Contributor fails to notify You of the non-compliance by + some reasonable means prior to 60 days after You have come back into + compliance. Moreover, Your grants from a particular Contributor are + reinstated on an ongoing basis if such Contributor notifies You of the + non-compliance by some reasonable means, this is the first time You have + received notice of non-compliance with this License from such + Contributor, and You become compliant prior to 30 days after Your receipt + of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, + counter-claims, and cross-claims) alleging that a Contributor Version + directly or indirectly infringes any patent, then the rights granted to + You by any and all Contributors for the Covered Software under Section + 2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an "as is" basis, + without warranty of any kind, either expressed, implied, or statutory, + including, without limitation, warranties that the Covered Software is free + of defects, merchantable, fit for a particular purpose or non-infringing. + The entire risk as to the quality and performance of the Covered Software + is with You. Should any Covered Software prove defective in any respect, + You (not any Contributor) assume the cost of any necessary servicing, + repair, or correction. This disclaimer of warranty constitutes an essential + part of this License. No use of any Covered Software is authorized under + this License except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from + such party's negligence to the extent applicable law prohibits such + limitation. Some jurisdictions do not allow the exclusion or limitation of + incidental or consequential damages, so this exclusion and limitation may + not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts + of a jurisdiction where the defendant maintains its principal place of + business and such litigation shall be governed by laws of that + jurisdiction, without reference to its conflict-of-law provisions. Nothing + in this Section shall prevent a party's ability to bring cross-claims or + counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. Any law or regulation which provides that + the language of a contract shall be construed against the drafter shall not + be used to construe this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version + of the License under which You originally received the Covered Software, + or under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a + modified version of this License if you rename the license and remove + any references to the name of the license steward (except to note that + such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary + Licenses If You choose to distribute Source Code Form that is + Incompatible With Secondary Licenses under the terms of this version of + the License, the notice described in Exhibit B of this License must be + attached. + +Exhibit A - Source Code Form License Notice + + 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/. + +If it is not possible or desirable to put the notice in a particular file, +then You may include the notice in a location (such as a LICENSE file in a +relevant directory) where a recipient would be likely to look for such a +notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice + + This Source Code Form is "Incompatible + With Secondary Licenses", as defined by + the Mozilla Public License, v. 2.0. + diff --git a/tools/eslint-plugin-spidermonkey-js/lib/environments/self-hosted.js b/tools/eslint-plugin-spidermonkey-js/lib/environments/self-hosted.js new file mode 100644 index 000000000..7a8e68c59 --- /dev/null +++ b/tools/eslint-plugin-spidermonkey-js/lib/environments/self-hosted.js @@ -0,0 +1,182 @@ +/** + * @file Add environment defaults to SpiderMonkey's self-hosted JS. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +"use strict"; + +const path = require("path"); +const fs = require("fs"); + +let gRootDir = null; + +/** + * Gets the root directory of the repository by walking up directories from + * this file until the top-level mozilla-central package.json file is found. + * If this fails, the same procedure will be attempted from the current + * working dir. + * Copied from `tools/lint/eslint/eslint-plugin-mozilla/lib/helpers.js`. + * + * @returns {string} The absolute path of the repository directory + */ +function getRootDir() { + if (!gRootDir) { + function searchUpForPackage(dirName) { + let parsed = path.parse(dirName); + while (parsed.root !== dirName) { + let possibleFile = path.join(dirName, "package.json"); + if (fs.existsSync(possibleFile)) { + let packageData = require(possibleFile); + if (packageData.name == "mozilla-central") { + return dirName; + } + } + // Move up a level + dirName = parsed.dir; + parsed = path.parse(dirName); + } + return null; + } + let possibleRoot = searchUpForPackage(path.dirname(module.filename)); + if (!possibleRoot) { + possibleRoot = searchUpForPackage(path.resolve()); + } + if (!possibleRoot) { + // We've couldn't find a root from the module or CWD, so lets just go + // for the CWD. We really don't want to throw if possible, as that + // tends to give confusing results when used with ESLint. + possibleRoot = process.cwd(); + } + + gRootDir = possibleRoot; + } + + return gRootDir; +} + +function tryReadFile(filePath) { + let absPath = path.join(getRootDir(), filePath); + if (!fs.existsSync(absPath)) { + // Safely handle the case when the file wasn't found, because throwing + // errors can lead to confusing result when used with ESLint. + return ""; + } + return fs.readFileSync(absPath, "utf-8"); +} + +// Search for top-level declarations, #defines, and #includes. +function addGlobalsFrom(dirName, fileName, globals) { + let filePath = path.join(dirName, fileName); + + // Definitions are separated by line. + let lines = tryReadFile(filePath).split("\n"); + + // We don't have to fully parse the source code, because it's formatted + // through "prettier", which means we know the exact code structure. + // + // |class| is disallowed in self-hosted code, so we don't have to handle it. + for (let line of lines) { + if ( + line.startsWith("function") || + line.startsWith("function*") || + line.startsWith("async function") || + line.startsWith("async function*") + ) { + let m = line.match(/^(?:async )?function(?:\*)?\s+([\w\$]+)\s*\(/); + if (m) { + globals[m[1]] = "readonly"; + } + } else if (line.startsWith("var") || line.startsWith("let") || line.startsWith("const")) { + let m = line.match(/^(?:var|let|const)\s+([\w\$]+)\s*[;=]/); + if (m) { + globals[m[1]] = "readonly"; + } + } else if (line.startsWith("#define")) { + let m = line.match(/^#define (\w+)/); + if (m) { + globals[m[1]] = "readonly"; + } + } else if (line.startsWith("#include")) { + let m = line.match(/^#include \"([\w\.]+)\"$/); + if (m) { + // Also process definitions from includes. + addGlobalsFrom(dirName, m[1], globals); + } + } + } +} + +function selfHostingDefines(dirName = "js/src/builtin/") { + let absDir = path.join(getRootDir(), dirName); + if (!fs.existsSync(absDir)) { + // See |tryReadFile| for why we avoid to throw any errors. + return {}; + } + + // Search sub-directories and js-files within |dirName|. + let dirs = []; + let jsFiles = []; + for (let name of fs.readdirSync(absDir)) { + let stat = fs.statSync(path.join(absDir, name)); + if (stat.isDirectory()) { + dirs.push(name); + } else if (stat.isFile() && name.endsWith(".js")) { + jsFiles.push(name); + } + } + + let globals = Object.create(null); + + // Process each js-file. + for (let jsFile of jsFiles) { + addGlobalsFrom(dirName, jsFile, globals); + } + + // Recursively traverse all sub-directories. + for (let dir of dirs) { + globals = { ...globals, ...selfHostingDefines(path.join(dirName, dir)) }; + } + + return globals; +} + +function selfHostingFunctions() { + // Definitions can be spread across multiple lines and may have extra + // whitespace, so we simply remove all whitespace and match over the complete + // file. + let content = tryReadFile("js/src/vm/SelfHosting.cpp").replace(/\s+/g, ""); + + let globals = Object.create(null); + let re = /(?:JS_FN|JS_INLINABLE_FN|JS_TRAMPOLINE_FN)\("(\w+)"/g; + for (let m of content.matchAll(re)) { + globals[m[1]] = "readonly"; + } + return globals; +} + +function errorNumbers() { + // Definitions are separated by line. + let lines = tryReadFile("js/public/friend/ErrorNumbers.msg").split("\n"); + + let globals = Object.create(null); + for (let line of lines) { + let m = line.match(/^MSG_DEF\((\w+),/); + if (m) { + globals[m[1]] = "readonly"; + } + } + return globals; +} + +const globals = { + ...selfHostingDefines(), + ...selfHostingFunctions(), + ...errorNumbers(), +}; + +module.exports = { + globals, +}; diff --git a/tools/eslint-plugin-spidermonkey-js/lib/index.js b/tools/eslint-plugin-spidermonkey-js/lib/index.js new file mode 100644 index 000000000..9beaf6b24 --- /dev/null +++ b/tools/eslint-plugin-spidermonkey-js/lib/index.js @@ -0,0 +1,21 @@ +/** + * @file A processor to help parse the spidermonkey js code. + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +"use strict"; + +// ------------------------------------------------------------------------------ +// Plugin Definition +// ------------------------------------------------------------------------------ +module.exports = { + meta: { name: "eslint-plugin-spidermonkey-js", version: "0.1.1" }, + processors: { + processor: require("./processors/self-hosted"), + }, + environments: { + environment: require("./environments/self-hosted"), + }, +}; diff --git a/tools/eslint-plugin-spidermonkey-js/lib/processors/self-hosted.js b/tools/eslint-plugin-spidermonkey-js/lib/processors/self-hosted.js new file mode 100644 index 000000000..84210a5bf --- /dev/null +++ b/tools/eslint-plugin-spidermonkey-js/lib/processors/self-hosted.js @@ -0,0 +1,128 @@ +/** + * @file Remove macros from SpiderMonkey's self-hosted JS. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +"use strict"; + +const path = require("path"); +const fs = require("fs"); + +const selfHostedRegex = /js\/src\/builtin\/.*?\.js$/; +const macroRegex = /\s*\#(if|ifdef|else|elif|endif|include|define|undef|error).*/; + +function isSelfHostedFile(filename) { + if (path.win32) { + filename = filename.split(path.sep).join("/"); + } + return selfHostedRegex.test(filename); +} + +function tryReadFile(filePath) { + if (!path.isAbsolute(filePath)) { + return ""; + } + if (!fs.existsSync(filePath)) { + // Safely handle the case when the file wasn't found, because throwing + // errors can lead to confusing result when used with ESLint. + return ""; + } + return fs.readFileSync(filePath, "utf-8"); +} + +// Adjust the range of fixes to match the original source code. +function createFix(lines, message) { + let { line, column, fix } = message; + + // Line and column are 1-based. Make sure we got a valid input. + if (line <= 0 || column <= 0) { + return null; + } + + // Reject to create a fix when the line is out of range for some reason. + if (line > lines.length) { + return null; + } + + // Find the absolute start position of the line in the original file. + let startOfLine = 0; + for (let i = 0; i < line - 1; ++i) { + // Add the length of the line, including its line separator. + startOfLine += lines[i].length + "\n".length; + } + + // Add the 1-based column to the start of line to get the start position. + let start = startOfLine + (column - 1); + + // Add the fix range to get the end position. + let end = start + (fix.range[1] - fix.range[0]); + + // And finally return the new fix object. + return { text: fix.text, range: [start, end] }; +} + +module.exports = { + preprocess(text, filename) { + if (!isSelfHostedFile(filename)) { + return [text]; + } + + let lines = text.split(/\n/); + for (let i = 0; i < lines.length; i++) { + if (!macroRegex.test(lines[i])) { + // No macro here, nothing to do. + continue; + } + + for (; i < lines.length; i++) { + // The macro isn't correctly indented, so we need to instruct + // prettier to ignore them. + lines[i] = "// prettier-ignore -- " + lines[i]; + + // If the line ends with a backslash (\), the next line + // is also part of part of the macro. + if (!lines[i].endsWith("\\")) { + break; + } + } + } + + return [lines.join("\n")]; + }, + + postprocess(messages, filename) { + // Don't attempt to create fixes for any non-selfhosted files. + if (!isSelfHostedFile(filename)) { + return [].concat(...messages); + } + + let lines = null; + + let result = []; + for (let message of messages.flat()) { + if (message.fix) { + if (lines === null) { + lines = tryReadFile(filename).split(/\n/); + } + + let fix = createFix(lines, message); + if (fix) { + message.fix = fix; + } else { + // We couldn't create a fix, so we better remove the passed in fix, + // because its range points to the preprocessor output, but the post- + // processor must translate it into a range of the original source. + delete message.fix; + } + } + + result.push(message); + } + return result; + }, + + supportsAutofix: true, +}; diff --git a/tools/eslint-plugin-spidermonkey-js/package.json b/tools/eslint-plugin-spidermonkey-js/package.json new file mode 100644 index 000000000..7563a3199 --- /dev/null +++ b/tools/eslint-plugin-spidermonkey-js/package.json @@ -0,0 +1,28 @@ +{ + "description": "A collection of rules that help enforce JavaScript coding standard in the Mozilla SpiderMonkey project.", + "keywords": [ + "eslint", + "eslintplugin", + "eslint-plugin", + "mozilla", + "spidermonkey" + ], + "bugs": { + "url": "https://bugzilla.mozilla.org/enter_bug.cgi?product=Testing&component=Lint" + }, + "homepage": "http://firefox-source-docs.mozilla.org/tools/lint/linters/eslint-plugin-spidermonkey-js.html", + "repository": { + "type": "hg", + "url": "https://hg.mozilla.org/mozilla-central/" + }, + "author": "Mozilla", + "main": "lib/index.js", + "dependencies": {}, + "devDependencies": {}, + "engines": { + "node": ">=6.9.1" + }, + "license": "MPL-2.0", + "notes(private)": "We don't want to publish to npm, so this is marked as private", + "private": true +} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index dc77eccaf..000000000 --- a/tsconfig.json +++ /dev/null @@ -1,113 +0,0 @@ -{ - "compilerOptions": { - /* Visit https://aka.ms/tsconfig to read more about this file */ - - /* Projects */ - // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ - // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ - // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ - // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ - // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ - // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ - - /* Language and Environment */ - "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, - // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ - // "jsx": "preserve", /* Specify what JSX code is generated. */ - // "libReplacement": true, /* Enable lib replacement. */ - // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ - // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ - // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ - // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ - // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ - // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ - // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ - // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ - // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ - - /* Modules */ - "module": "commonjs" /* Specify what module code is generated. */, - // "rootDir": "./", /* Specify the root folder within your source files. */ - // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ - // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ - // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ - // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ - // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ - // "types": [], /* Specify type package names to be included without being referenced in a source file. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ - // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ - // "rewriteRelativeImportExtensions": true, /* Rewrite '.ts', '.tsx', '.mts', and '.cts' file extensions in relative import paths to their JavaScript equivalent in output files. */ - // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ - // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ - // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ - // "noUncheckedSideEffectImports": true, /* Check side effect imports. */ - // "resolveJsonModule": true, /* Enable importing .json files. */ - // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ - // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ - - /* JavaScript Support */ - // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ - // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ - // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ - - /* Emit */ - // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ - // "declarationMap": true, /* Create sourcemaps for d.ts files. */ - // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ - // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ - // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ - // "noEmit": true, /* Disable emitting files from a compilation. */ - // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ - // "outDir": "./", /* Specify an output folder for all emitted files. */ - // "removeComments": true, /* Disable emitting comments. */ - // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ - // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ - // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ - // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ - // "newLine": "crlf", /* Set the newline character for emitting files. */ - // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ - // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ - // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ - // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ - // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ - - /* Interop Constraints */ - // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ - // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ - // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ - // "erasableSyntaxOnly": true, /* Do not allow runtime constructs that are not part of ECMAScript. */ - // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ - "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, - // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ - "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, - - /* Type Checking */ - "strict": true /* Enable all strict type-checking options. */, - // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ - // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ - // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ - // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ - // "strictBuiltinIteratorReturn": true, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */ - // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ - // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ - // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ - // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ - // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ - // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ - // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ - // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ - // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ - // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ - // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ - - /* Completeness */ - // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ - "skipLibCheck": true /* Skip type checking all .d.ts files. */ - } -}