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(
``,
- '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 {
`
- ).querySelector('#zen-split-view-drag-image');
- const image = element.querySelector('image');
- const label = element.querySelector('label');
- image.src = tab.getAttribute('image');
+ ).querySelector("#zen-split-view-drag-image");
+ const image = element.querySelector("image");
+ const label = element.querySelector("label");
+ image.src = tab.getAttribute("image");
label.textContent = tab.label;
document.documentElement.appendChild(element);
this._dndElement = element;
@@ -258,7 +260,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
// not our drop then
if (
!gBrowser.isTab(draggedTab) ||
- gBrowser.selectedTab.hasAttribute('zen-empty-tab') ||
+ gBrowser.selectedTab.hasAttribute("zen-empty-tab") ||
draggedTab.ownerGlobal !== window
) {
return;
@@ -269,9 +271,9 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
}
if (
!this._lastOpenedTab ||
- (this._lastOpenedTab.getAttribute('zen-workspace-id') !==
- draggedTab.getAttribute('zen-workspace-id') &&
- !this._lastOpenedTab.hasAttribute('zen-essential'))
+ (this._lastOpenedTab.getAttribute("zen-workspace-id") !==
+ draggedTab.getAttribute("zen-workspace-id") &&
+ !this._lastOpenedTab.hasAttribute("zen-essential"))
) {
this._lastOpenedTab = gBrowser.selectedTab;
}
@@ -304,7 +306,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
) {
return;
}
- dt.mozCursor = 'default';
+ dt.mozCursor = "default";
if (!this._dndElement) {
const originalDNDArgs = gBrowser.tabContainer.tabDragAndDrop.originalDragImageArgs;
requestAnimationFrame(() => {
@@ -318,13 +320,15 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
}
const oldTab = this._lastOpenedTab;
this._canDrop = true;
+ // eslint-disable-next-line mozilla/valid-services
Services.zen.playHapticFeedback();
{
this._draggingTab = draggedTab;
gBrowser.selectedTab = oldTab;
this._hasAnimated = true;
- this.tabBrowserPanel.setAttribute('dragging-split', 'true');
+ this.tabBrowserPanel.setAttribute("dragging-split", "true");
// Add a min width to all the browser elements to prevent them from resizing
+ // eslint-disable-next-line no-shadow
const panelsWidth = gBrowser.tabbox.getBoundingClientRect().width;
let numOfTabsToDivide = 2;
if (currentView) {
@@ -337,31 +341,33 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
if (gZenCompactModeManager.preference) {
threshold = 0;
}
- const side = event.clientX - threshold > halfWidth ? 'right' : 'left';
+ const side = event.clientX - threshold > halfWidth ? "right" : "left";
for (const browser of gBrowser.browsers) {
- if (!browser) continue;
+ if (!browser) {
+ continue;
+ }
const width = browser.getBoundingClientRect().width;
// Only apply it to the left side because if we add it to the right side,
// we wont be able to move the element to the left.
// FIXME: This is a workaround, we should find a better way to do this
- if (side === 'left') {
+ if (side === "left") {
browser.style.minWidth = `${width}px`;
}
}
- this.fakeBrowser = document.createXULElement('vbox');
- window.addEventListener('dragend', this.onBrowserDragEndToSplit, { once: true });
+ this.fakeBrowser = document.createXULElement("vbox");
+ window.addEventListener("dragend", this.onBrowserDragEndToSplit, { once: true });
const padding = ZenThemeModifier.elementSeparation;
- this.fakeBrowser.setAttribute('flex', '1');
- this.fakeBrowser.id = 'zen-split-view-fake-browser';
+ this.fakeBrowser.setAttribute("flex", "1");
+ this.fakeBrowser.id = "zen-split-view-fake-browser";
if (oldTab.splitView) {
- this.fakeBrowser.setAttribute('has-split-view', 'true');
+ this.fakeBrowser.setAttribute("has-split-view", "true");
}
gBrowser.tabbox.appendChild(this.fakeBrowser);
- this.fakeBrowser.setAttribute('side', side);
+ this.fakeBrowser.setAttribute("side", side);
this._finishAllAnimatingPromise = Promise.all([
gZenUIManager.elementAnimate(
gBrowser.tabbox,
- side === 'left'
+ side === "left"
? {
paddingLeft: [0, `${halfWidth}px`],
paddingRight: 0,
@@ -372,15 +378,15 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
},
{
duration: 110,
- easing: 'ease-out',
- fill: 'forwards',
+ easing: "ease-out",
+ fill: "forwards",
}
),
gZenUIManager.elementAnimate(
this.fakeBrowser,
{
width: [0, `${halfWidth - padding}px`],
- ...(side === 'left'
+ ...(side === "left"
? {
marginLeft: [0, `${-halfWidth}px`],
}
@@ -388,8 +394,8 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
},
{
duration: 110,
- easing: 'ease-out',
- fill: 'forwards',
+ easing: "ease-out",
+ fill: "forwards",
}
),
]);
@@ -398,10 +404,10 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
if (draggedTab !== oldTab) {
draggedTab.linkedBrowser.docShellIsActive = false;
draggedTab.linkedBrowser
- .closest('.browserSidebarContainer')
- .classList.remove('deck-selected');
+ .closest(".browserSidebarContainer")
+ .classList.remove("deck-selected");
}
- this.fakeBrowser.addEventListener('dragleave', this.onBrowserDragEndToSplit);
+ this.fakeBrowser.addEventListener("dragleave", this.onBrowserDragEndToSplit);
this._canDrop = true;
});
}
@@ -439,7 +445,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
if (!this.fakeBrowser) {
return;
}
- const side = this.fakeBrowser.getAttribute('side');
+ const side = this.fakeBrowser.getAttribute("side");
this._lastOpenedTab = gBrowser.selectedTab;
this._draggingTab = null;
gBrowser.tabContainer.tabDragAndDrop.clearSpaceSwitchTimer();
@@ -450,7 +456,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
Promise.all([
gZenUIManager.elementAnimate(
gBrowser.tabbox,
- side === 'left'
+ side === "left"
? {
paddingLeft: [`${halfWidth}px`, 0],
}
@@ -459,15 +465,15 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
},
{
duration: 110,
- easing: 'ease-out',
- fill: 'forwards',
+ easing: "ease-out",
+ fill: "forwards",
}
),
gZenUIManager.elementAnimate(
this.fakeBrowser,
{
width: [`${halfWidth - padding * 2}px`, 0],
- ...(side === 'left'
+ ...(side === "left"
? {
marginLeft: [`${-halfWidth}px`, 0],
}
@@ -475,8 +481,8 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
},
{
duration: 110,
- easing: 'ease-out',
- fill: 'forwards',
+ easing: "ease-out",
+ fill: "forwards",
}
),
]).finally(() => {
@@ -486,11 +492,13 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
/**
* Remove a nsSplitNode from its tree and the view
+ *
* @param {nsSplitNode} toRemove
- * @return {nsSplitNode} that has to be updated
+ * @returns {nsSplitNode} that has to be updated
*/
removeNode(toRemove) {
this._removeNodeSplitters(toRemove, true);
+ // eslint-disable-next-line no-shadow
const parent = toRemove.parent;
const childIndex = parent.children.indexOf(toRemove);
parent.children.splice(childIndex, 1);
@@ -519,89 +527,98 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
}
this._removeNodeSplitters(parent, false);
return parent.parent;
- } else {
- const viewData = Object.values(this._data).find((s) => s.layoutTree === parent);
- viewData.layoutTree = leftOverChild;
- leftOverChild.positionToRoot = null;
- leftOverChild.parent = null;
- return leftOverChild;
}
+ const viewData = Object.values(this._data).find((s) => s.layoutTree === parent);
+ viewData.layoutTree = leftOverChild;
+ leftOverChild.positionToRoot = null;
+ leftOverChild.parent = null;
+ return leftOverChild;
}
/**
- * @param node
+ * @param {object} node
* @param {boolean} recursive
* @private
*/
_removeNodeSplitters(node, recursive) {
this.getSplitters(node)?.forEach((s) => s.remove());
this._splitNodeToSplitters.delete(node);
- if (!recursive) return;
- if (node && node.children) node.children.forEach((c) => this._removeNodeSplitters(c));
+ if (!recursive) {
+ return;
+ }
+ if (node && node.children) {
+ node.children.forEach((c) => this._removeNodeSplitters(c));
+ }
}
get rearangeActionTarget() {
- return document.getElementById('urlbar-container');
+ return document.getElementById("urlbar-container");
}
afterRearangeAction() {
- document.getElementById('zenSplitViewModifier').hidePopup();
- gZenUIManager.showToast('zen-split-view-modifier-enabled-toast', {
- descriptionId: 'zen-split-view-modifier-enabled-toast-description',
+ document.getElementById("zenSplitViewModifier").hidePopup();
+ gZenUIManager.showToast("zen-split-view-modifier-enabled-toast", {
+ descriptionId: "zen-split-view-modifier-enabled-toast-description",
});
}
afterRearangeRemove() {
- gZenUIManager.showToast('zen-split-view-modifier-disabled-toast');
+ gZenUIManager.showToast("zen-split-view-modifier-disabled-toast");
}
toggleWrapperDisplay(value) {
const wrapper = this.overlay?.parentNode;
- if (!wrapper) return;
+ if (!wrapper) {
+ return;
+ }
if (!value) {
- wrapper.setAttribute('hidden', 'true');
+ wrapper.setAttribute("hidden", "true");
} else {
- wrapper.removeAttribute('hidden');
+ wrapper.removeAttribute("hidden");
}
}
enableTabRearrangeView(tabDrag = false) {
- if (this.rearrangeViewEnabled) return;
+ if (this.rearrangeViewEnabled) {
+ return;
+ }
this.rearrangeViewEnabled = true;
this.rearrangeViewView = this.currentView;
if (!this._thumnailCanvas) {
- this._thumnailCanvas = document.createElement('canvas');
+ this._thumnailCanvas = document.createElement("canvas");
this._thumnailCanvas.width = 280 * devicePixelRatio;
this._thumnailCanvas.height = 140 * devicePixelRatio;
}
const browsers = this._data[this.currentView].tabs.map((t) => t.linkedBrowser);
browsers.forEach((b) => {
- b.style.pointerEvents = 'none';
- b.style.opacity = '.85';
+ b.style.pointerEvents = "none";
+ b.style.opacity = ".85";
});
if (!tabDrag) {
- this.tabBrowserPanel.addEventListener('dragstart', this.onBrowserDragStart);
- this.tabBrowserPanel.addEventListener('dragend', this.onBrowserDragEnd);
+ this.tabBrowserPanel.addEventListener("dragstart", this.onBrowserDragStart);
+ this.tabBrowserPanel.addEventListener("dragend", this.onBrowserDragEnd);
}
- this.tabBrowserPanel.addEventListener('dragover', this.onBrowserDragOver);
- this.tabBrowserPanel.addEventListener('drop', this.onBrowserDrop);
+ this.tabBrowserPanel.addEventListener("dragover", this.onBrowserDragOver);
+ this.tabBrowserPanel.addEventListener("drop", this.onBrowserDrop);
- this.tabBrowserPanel.addEventListener('click', this.disableTabRearrangeView);
- window.addEventListener('keydown', this.disableTabRearrangeView);
+ this.tabBrowserPanel.addEventListener("click", this.disableTabRearrangeView);
+ window.addEventListener("keydown", this.disableTabRearrangeView);
if (!tabDrag) {
this.afterRearangeAction();
}
}
disableTabRearrangeView = (event = null) => {
- if (!this.rearrangeViewEnabled) return;
+ if (!this.rearrangeViewEnabled) {
+ return;
+ }
if (event) {
// Click or "ESC" key
if (
- (event.type === 'click' && event.button !== 0) ||
- (event.type === 'keydown' && event.key !== 'Escape')
+ (event.type === "click" && event.button !== 0) ||
+ (event.type === "keydown" && event.key !== "Escape")
) {
return;
}
@@ -609,37 +626,39 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
if (
!this.rearrangeViewEnabled ||
- (event && event.target.classList.contains('zen-split-view-splitter'))
+ (event && event.target.classList.contains("zen-split-view-splitter"))
) {
return;
}
- this.tabBrowserPanel.removeEventListener('dragstart', this.onBrowserDragStart);
- this.tabBrowserPanel.removeEventListener('dragover', this.onBrowserDragOver);
- this.tabBrowserPanel.removeEventListener('drop', this.onBrowserDrop);
- this.tabBrowserPanel.removeEventListener('click', this.disableTabRearrangeView);
- window.removeEventListener('keydown', this.disableTabRearrangeView);
+ this.tabBrowserPanel.removeEventListener("dragstart", this.onBrowserDragStart);
+ this.tabBrowserPanel.removeEventListener("dragover", this.onBrowserDragOver);
+ this.tabBrowserPanel.removeEventListener("drop", this.onBrowserDrop);
+ this.tabBrowserPanel.removeEventListener("click", this.disableTabRearrangeView);
+ window.removeEventListener("keydown", this.disableTabRearrangeView);
const browsers = this._data[this.rearrangeViewView].tabs.map((t) => t.linkedBrowser);
browsers.forEach((b) => {
- b.style.pointerEvents = '';
- b.style.opacity = '';
+ b.style.pointerEvents = "";
+ b.style.opacity = "";
});
this.rearrangeViewEnabled = false;
this.rearrangeViewView = null;
- if (!event?.type === 'dragend') {
+ if (!event?.type === "dragend") {
// Don't show toast if exiting from drag
this.afterRearangeRemove();
}
};
onBrowserDragStart = (event) => {
- if (!this.splitViewActive) return;
+ if (!this.splitViewActive) {
+ return;
+ }
let browser;
let isSplitHeaderDrag = false;
- const container = event.target.closest('.browserSidebarContainer[zen-split]');
- if (container && event.target.closest('.zen-tab-rearrange-button')) {
+ const container = event.target.closest(".browserSidebarContainer[zen-split]");
+ if (container && event.target.closest(".zen-tab-rearrange-button")) {
// Split tab header drag case
const containerRect = container.getBoundingClientRect();
const clickX = event.clientX - containerRect.left;
@@ -649,17 +668,21 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
return;
}
- browser = container.querySelector('browser');
+ browser = container.querySelector("browser");
isSplitHeaderDrag = true;
} else {
// Regular browser drag case
- browser = event.target.querySelector('browser');
+ browser = event.target.querySelector("browser");
}
- if (!browser) return;
+ if (!browser) {
+ return;
+ }
const tab = gBrowser.getTabForBrowser(browser);
- if (!tab) return;
+ if (!tab) {
+ return;
+ }
// Store the necessary state for drag end
this._dragState = {
@@ -672,17 +695,17 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
this.enableTabRearrangeView(true);
}
- browser.style.opacity = '.2';
- event.dataTransfer.setData('text/plain', browser.closest('.browserSidebarContainer').id);
+ browser.style.opacity = ".2";
+ event.dataTransfer.setData("text/plain", browser.closest(".browserSidebarContainer").id);
this._draggingTab = tab;
// Canvas setup for drag image
let scale = window.devicePixelRatio;
let canvas = this._dndCanvas;
if (!canvas) {
- this._dndCanvas = canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');
- canvas.style.width = '100%';
- canvas.style.height = '100%';
+ this._dndCanvas = canvas = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
+ canvas.style.width = "100%";
+ canvas.style.height = "100%";
}
canvas.width = 160 * scale;
@@ -690,15 +713,15 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
let toDrag = canvas;
let dragImageOffset = -16;
if (gMultiProcessBrowser) {
- var context = canvas.getContext('2d');
- context.fillStyle = 'white';
+ var context = canvas.getContext("2d");
+ context.fillStyle = "white";
context.fillRect(0, 0, canvas.width, canvas.height);
let captureListener;
let platform = AppConstants.platform;
// On Windows and Mac we can update the drag image during a drag
// using updateDragImage. On Linux, we can use a panel.
- if (platform === 'win' || platform === 'macosx') {
+ if (platform === "win" || platform === "macosx") {
captureListener = () => {
event.dataTransfer.updateDragImage(canvas, dragImageOffset, dragImageOffset);
};
@@ -708,12 +731,12 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
// the pointer while a dnd session is on.
if (!this._dndPanel) {
this._dndCanvas = canvas;
- this._dndPanel = document.createXULElement('panel');
- this._dndPanel.className = 'dragfeedback-tab';
- this._dndPanel.setAttribute('type', 'drag');
- let wrapper = document.createElementNS('http://www.w3.org/1999/xhtml', 'div');
- wrapper.style.width = '160px';
- wrapper.style.height = '90px';
+ this._dndPanel = document.createXULElement("panel");
+ this._dndPanel.className = "dragfeedback-tab";
+ this._dndPanel.setAttribute("type", "drag");
+ let wrapper = document.createElementNS("http://www.w3.org/1999/xhtml", "div");
+ wrapper.style.width = "160px";
+ wrapper.style.height = "90px";
wrapper.appendChild(canvas);
this._dndPanel.appendChild(wrapper);
document.documentElement.appendChild(this._dndPanel);
@@ -732,32 +755,35 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
dragImageOffset = dragImageOffset * scale;
}
event.dataTransfer.setDragImage(toDrag, dragImageOffset, dragImageOffset);
- return true;
};
onBrowserDragOver = (event) => {
event.preventDefault();
- const browser = event.target.querySelector('browser');
- if (!browser) return;
+ const browser = event.target.querySelector("browser");
+ if (!browser) {
+ return;
+ }
const tab = gBrowser.getTabForBrowser(browser);
if (tab === this._draggingTab) {
- if (this.dropZone.hasAttribute('enabled')) {
- this.dropZone.removeAttribute('enabled');
+ if (this.dropZone.hasAttribute("enabled")) {
+ this.dropZone.removeAttribute("enabled");
}
return;
}
- if (!this.dropZone.hasAttribute('enabled')) {
- this.dropZone.setAttribute('enabled', true);
+ if (!this.dropZone.hasAttribute("enabled")) {
+ this.dropZone.setAttribute("enabled", true);
}
const splitNode = this.getSplitNodeFromTab(tab);
- if (!splitNode) return;
+ if (!splitNode) {
+ return;
+ }
const posToRoot = { ...splitNode.positionToRoot };
const browserRect = browser.getBoundingClientRect();
const hoverSide = this.calculateHoverSide(event.clientX, event.clientY, browserRect);
- if (hoverSide !== 'center') {
- const isVertical = hoverSide === 'top' || hoverSide === 'bottom';
+ if (hoverSide !== "center") {
+ const isVertical = hoverSide === "top" || hoverSide === "bottom";
const browserSize =
100 - (isVertical ? posToRoot.top + posToRoot.bottom : posToRoot.right + posToRoot.left);
const reduce = browserSize * 0.5;
@@ -771,7 +797,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
};
onBrowserDragEnd = (event) => {
- this.dropZone?.removeAttribute('enabled');
+ this.dropZone?.removeAttribute("enabled");
// If we don't have drag state, just clean up what we can
if (!this._dragState) {
@@ -782,7 +808,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
const { browser, isSplitHeaderDrag } = this._dragState;
if (browser) {
- browser.style.opacity = isSplitHeaderDrag ? '1' : '.85';
+ browser.style.opacity = isSplitHeaderDrag ? "1" : ".85";
}
// Handle split view specific cleanup
@@ -796,30 +822,53 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
};
_oppositeSide(side) {
- if (side === 'top') return 'bottom';
- if (side === 'bottom') return 'top';
- if (side === 'left') return 'right';
- if (side === 'right') return 'left';
+ if (side === "top") {
+ return "bottom";
+ }
+ if (side === "bottom") {
+ return "top";
+ }
+ if (side === "left") {
+ return "right";
+ }
+ if (side === "right") {
+ return "left";
+ }
+ return undefined;
}
calculateHoverSide(x, y, elementRect) {
const hPixelHoverSize = ((elementRect.right - elementRect.left) * this._edgeHoverSize) / 100;
const vPixelHoverSize = ((elementRect.bottom - elementRect.top) * this._edgeHoverSize) / 100;
- if (x <= elementRect.left + hPixelHoverSize) return 'left';
- if (x > elementRect.right - hPixelHoverSize) return 'right';
- if (y <= elementRect.top + vPixelHoverSize) return 'top';
- if (y > elementRect.bottom - vPixelHoverSize) return 'bottom';
- return 'center';
+ if (x <= elementRect.left + hPixelHoverSize) {
+ return "left";
+ }
+ if (x > elementRect.right - hPixelHoverSize) {
+ return "right";
+ }
+ if (y <= elementRect.top + vPixelHoverSize) {
+ return "top";
+ }
+ if (y > elementRect.bottom - vPixelHoverSize) {
+ return "bottom";
+ }
+ return "center";
}
onBrowserDrop = (event) => {
- const browserDroppedOn = event.target.querySelector('browser');
- if (!browserDroppedOn) return;
+ const browserDroppedOn = event.target.querySelector("browser");
+ if (!browserDroppedOn) {
+ return;
+ }
const droppedTab = this._draggingTab;
- if (!droppedTab) return;
- const droppedOnTab = gBrowser.getTabForBrowser(event.target.querySelector('browser'));
- if (droppedTab === droppedOnTab) return;
+ if (!droppedTab) {
+ return;
+ }
+ const droppedOnTab = gBrowser.getTabForBrowser(event.target.querySelector("browser"));
+ if (droppedTab === droppedOnTab) {
+ return;
+ }
const hoverSide = this.calculateHoverSide(
event.clientX,
@@ -828,7 +877,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
);
const droppedSplitNode = this.getSplitNodeFromTab(droppedTab);
const droppedOnSplitNode = this.getSplitNodeFromTab(droppedOnTab);
- if (hoverSide === 'center') {
+ if (hoverSide === "center") {
this.swapNodes(droppedSplitNode, droppedOnSplitNode);
this.applyGridLayout(this._data[this.currentView].layoutTree);
return;
@@ -840,30 +889,30 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
/**
*
- * @param node1
- * @param node2
+ * @param {object} node1
+ * @param {object} node2
*/
swapNodes(node1, node2) {
- this._swapField('sizeInParent', node1, node2);
+ this._swapField("sizeInParent", node1, node2);
const node1Idx = node1.parent.children.indexOf(node1);
const node2Idx = node2.parent.children.indexOf(node2);
node1.parent.children[node1Idx] = node2;
node2.parent.children[node2Idx] = node1;
- this._swapField('parent', node1, node2);
+ this._swapField("parent", node1, node2);
}
/**
*
- * @param node
- * @param nodeToInsert
- * @param side
- * @param sizeOfInsertedNode percentage of node width or height that nodeToInsert will take
+ * @param {object} node
+ * @param {object} nodeToInsert
+ * @param {string} side
+ * @param {number} sizeOfInsertedNode percentage of node width or height that nodeToInsert will take
*/
splitIntoNode(node, nodeToInsert, side, sizeOfInsertedNode) {
- const splitDirection = side === 'left' || side === 'right' ? 'row' : 'column';
- const splitPosition = side === 'left' || side === 'top' ? 0 : 1;
+ const splitDirection = side === "left" || side === "right" ? "row" : "column";
+ const splitPosition = side === "left" || side === "top" ? 0 : 1;
let nodeSize;
let newParent;
@@ -906,14 +955,14 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
resetTabState(tab, forUnsplit) {
tab.splitView = false;
delete tab.splitViewValue;
- tab.removeAttribute('split-view');
+ tab.removeAttribute("split-view");
tab.linkedBrowser.zenModeActive = false;
- const container = tab.linkedBrowser.closest('.browserSidebarContainer');
- container.removeAttribute('is-zen-split');
- container.style.inset = '';
+ const container = tab.linkedBrowser.closest(".browserSidebarContainer");
+ container.removeAttribute("is-zen-split");
+ container.style.inset = "";
this._removeHeader(container);
this.resetContainerStyle(container);
- container.removeEventListener('mousedown', this.handleTabEvent);
+ container.removeEventListener("mousedown", this.handleTabEvent);
if (!forUnsplit) {
tab.linkedBrowser.docShellIsActive = false;
}
@@ -942,9 +991,9 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
removeGroup(groupIndex) {
const group = this._data[groupIndex];
for (const tab of group.tabs.reverse()) {
- if (tab.group?.hasAttribute('split-view-group')) {
+ if (tab.group?.hasAttribute("split-view-group")) {
gBrowser.ungroupTab(tab);
- this.#dispatchItemEvent('ZenTabRemovedFromSplit', tab);
+ this.#dispatchItemEvent("ZenTabRemovedFromSplit", tab);
}
}
if (this.currentView === groupIndex) {
@@ -960,17 +1009,17 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
* context menu item display update
*/
insetUpdateContextMenuItems() {
- const contentAreaContextMenu = document.getElementById('tabContextMenu');
- contentAreaContextMenu.addEventListener('popupshowing', () => {
+ const contentAreaContextMenu = document.getElementById("tabContextMenu");
+ contentAreaContextMenu.addEventListener("popupshowing", () => {
const tabCountInfo = JSON.stringify({
tabCount: window.gBrowser.selectedTabs.length,
});
- document.getElementById('context_zenSplitTabs').setAttribute('data-l10n-args', tabCountInfo);
- const splitTabs = document.getElementById('context_zenSplitTabs');
+ document.getElementById("context_zenSplitTabs").setAttribute("data-l10n-args", tabCountInfo);
+ const splitTabs = document.getElementById("context_zenSplitTabs");
if (!this.contextCanSplitTabs()) {
- splitTabs.setAttribute('hidden', 'true');
+ splitTabs.setAttribute("hidden", "true");
} else {
- splitTabs.removeAttribute('hidden');
+ splitTabs.removeAttribute("hidden");
}
});
}
@@ -985,7 +1034,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
data-l10n-args='{"tabCount": 1}'
command="cmd_zenSplitViewContextMenu"/>
`);
- document.getElementById('context_duplicateTab').before(element);
+ document.getElementById("context_duplicateTab").before(element);
}
/**
@@ -1044,7 +1093,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
return false;
}
for (const tab of window.gBrowser.selectedTabs) {
- if (tab.splitView || tab.hasAttribute('zen-empty-tab')) {
+ if (tab.splitView || tab.hasAttribute("zen-empty-tab")) {
return false;
}
}
@@ -1059,14 +1108,16 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
onLocationChange(browser) {
this.disableTabRearrangeView();
let tab = window.gBrowser.getTabForBrowser(browser);
- const ignoreSplit = tab.hasAttribute('zen-dont-split-glance');
- tab.removeAttribute('zen-dont-split-glance');
+ const ignoreSplit = tab.hasAttribute("zen-dont-split-glance");
+ tab.removeAttribute("zen-dont-split-glance");
let isGlanceTab = false;
- if (tab.hasAttribute('zen-glance-tab') && !ignoreSplit) {
+ if (tab.hasAttribute("zen-glance-tab") && !ignoreSplit) {
// Extract from parent node so we are not selecting the wrong (current) tab
- tab = tab.parentNode.closest('.tabbrowser-tab');
+ tab = tab.parentNode.closest(".tabbrowser-tab");
isGlanceTab = true;
- console.assert(tab, 'Tab not found for zen-glance-tab');
+ if (!tab) {
+ console.error("Tab not found for zen-glance-tab");
+ }
}
if (tab) {
this.updateSplitView(tab);
@@ -1078,22 +1129,23 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
}
this._maybeRemoveFakeBrowser();
{
- const shouldDisableEmptySplits = tab.hasAttribute('zen-empty-tab') || tab.splitView;
- const command = document.getElementById('cmd_zenNewEmptySplit');
+ const shouldDisableEmptySplits = tab.hasAttribute("zen-empty-tab") || tab.splitView;
+ const command = document.getElementById("cmd_zenNewEmptySplit");
if (shouldDisableEmptySplits) {
- command.setAttribute('disabled', 'true');
+ command.setAttribute("disabled", "true");
} else {
- command.removeAttribute('disabled');
+ command.removeAttribute("disabled");
}
}
}
/**
- * @param {Tab} tab
+ * @param {Array} tabs
+ * @param {Tab} relativeTab
*/
_moveTabsToContainer(tabs, relativeTab) {
const relativeTabIsPinned = relativeTab.pinned;
- const relativeTabIsEssential = relativeTab.hasAttribute('zen-essential');
+ const relativeTabIsEssential = relativeTab.hasAttribute("zen-essential");
if (relativeTabIsEssential) {
gZenPinnedTabManager.addToEssentials(tabs);
@@ -1115,13 +1167,13 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
* @param {string|undefined} gridType - The type of grid layout.
* @param {number} initialIndex - The index of the initially active tab.
* use -1 to avoid selecting any tab.
- * @return {object|undefined} The split view data or undefined if the split was not performed.
+ * @returns {object|undefined} The split view data or undefined if the split was not performed.
*/
splitTabs(tabs, gridType, initialIndex = 0) {
const tabIndexToUse = Math.max(0, initialIndex);
return this.#withoutSplitViewTransition(() => {
// TODO: Add support for splitting essential tabs
- tabs = tabs.filter((t) => !t.hidden && !t.hasAttribute('zen-empty-tab'));
+ tabs = tabs.filter((t) => !t.hidden && !t.hasAttribute("zen-empty-tab"));
if (tabs.length < 2 || tabs.length > this.MAX_TABS) {
return;
}
@@ -1155,7 +1207,8 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
return;
}
this.activateSplitView(group, true);
- this.#dispatchItemEvent('ZenSplitViewTabsSplit', group);
+ this.#dispatchItemEvent("ZenSplitViewTabsSplit", group);
+ // eslint-disable-next-line consistent-return
return group;
}
@@ -1164,7 +1217,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
// state to all the tabs
const allArePinned = tabs.every((tab) => tab.pinned);
const thereIsOnePinned = tabs.some((tab) => tab.pinned);
- const thereIsOneEssential = tabs.some((tab) => tab.hasAttribute('zen-essential'));
+ const thereIsOneEssential = tabs.some((tab) => tab.hasAttribute("zen-essential"));
if (thereIsOneEssential || (thereIsOnePinned && !allArePinned)) {
for (let i = 0; i < tabs.length; i++) {
@@ -1175,7 +1228,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
}
}
- gridType ??= 'grid';
+ gridType ??= "grid";
const splitData = {
tabs,
@@ -1201,7 +1254,8 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
return;
}
this.activateSplitView(splitData);
- this.#dispatchItemEvent('ZenSplitViewTabsSplit', splitGroup);
+ this.#dispatchItemEvent("ZenSplitViewTabsSplit", splitGroup);
+ // eslint-disable-next-line consistent-return
return splitData;
});
}
@@ -1234,63 +1288,73 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
/**
* Deactivates the split view.
+ *
+ * @param {object} options - Options object.
+ * @param {boolean} options.removeDeckSelected - Whether to remove deck selected attribute.
*/
deactivateCurrentSplitView({ removeDeckSelected = false } = {}) {
- if (this.currentView < 0) return;
+ if (this.currentView < 0) {
+ return;
+ }
this.setTabsDocShellState(this._data[this.currentView].tabs, false);
for (const tab of this._data[this.currentView].tabs) {
- const container = tab.linkedBrowser.closest('.browserSidebarContainer');
+ const container = tab.linkedBrowser.closest(".browserSidebarContainer");
this.resetContainerStyle(container, removeDeckSelected);
}
this.removeSplitters();
- this.tabBrowserPanel.removeAttribute('zen-split-view');
- document.getElementById('tabbrowser-tabbox').removeAttribute('zen-split-view');
+ this.tabBrowserPanel.removeAttribute("zen-split-view");
+ document.getElementById("tabbrowser-tabbox").removeAttribute("zen-split-view");
this.currentView = -1;
this.toggleWrapperDisplay(false);
this.maybeDisableOpeningTabOnSplitView();
- window.dispatchEvent(new CustomEvent('ZenViewSplitter:SplitViewDeactivated'));
+ window.dispatchEvent(new CustomEvent("ZenViewSplitter:SplitViewDeactivated"));
}
/**
* Activates the split view.
*
* @param {object} splitData - The split data.
+ * @param {boolean} reset - Whether to reset the split view.
*/
activateSplitView(splitData, reset = false) {
const oldView = this.currentView;
const newView = this._data.indexOf(splitData);
- if (oldView >= 0 && oldView !== newView) this.deactivateCurrentSplitView();
+ if (oldView >= 0 && oldView !== newView) {
+ this.deactivateCurrentSplitView();
+ }
this.currentView = newView;
- if (reset) this.removeSplitters();
+ if (reset) {
+ this.removeSplitters();
+ }
splitData.tabs.forEach((tab) => {
- if (tab.hasAttribute('pending')) {
+ if (tab.hasAttribute("pending")) {
gBrowser.getBrowserForTab(tab).reload();
}
});
- this.tabBrowserPanel.setAttribute('zen-split-view', 'true');
- document.getElementById('tabbrowser-tabbox').setAttribute('zen-split-view', 'true');
+ this.tabBrowserPanel.setAttribute("zen-split-view", "true");
+ document.getElementById("tabbrowser-tabbox").setAttribute("zen-split-view", "true");
this.applyGridToTabs(splitData.tabs);
this.applyGridLayout(splitData.layoutTree);
this.setTabsDocShellState(splitData.tabs, true);
this.toggleWrapperDisplay(true);
- window.dispatchEvent(new CustomEvent('ZenViewSplitter:SplitViewActivated'));
+ window.dispatchEvent(new CustomEvent("ZenViewSplitter:SplitViewActivated"));
}
calculateLayoutTree(tabs, gridType) {
let rootNode;
- if (gridType === 'vsep' || (tabs.length === 2 && gridType === 'grid')) {
- rootNode = new nsSplitNode('row');
+ if (gridType === "vsep" || (tabs.length === 2 && gridType === "grid")) {
+ rootNode = new nsSplitNode("row");
rootNode.children = tabs.map((tab) => new nsSplitLeafNode(tab, 100 / tabs.length));
- } else if (gridType === 'hsep') {
- rootNode = new nsSplitNode('column');
+ } else if (gridType === "hsep") {
+ rootNode = new nsSplitNode("column");
rootNode.children = tabs.map((tab) => new nsSplitLeafNode(tab, 100 / tabs.length));
- } else if (gridType === 'grid') {
- rootNode = new nsSplitNode('row');
+ } else if (gridType === "grid") {
+ rootNode = new nsSplitNode("row");
const rowWidth = 100 / Math.ceil(tabs.length / 2);
for (let i = 0; i < tabs.length - 1; i += 2) {
- const columnNode = new nsSplitNode('column', rowWidth, 100);
+ const columnNode = new nsSplitNode("column", rowWidth, 100);
columnNode.children = [
new nsSplitLeafNode(tabs[i], 50),
new nsSplitLeafNode(tabs[i + 1], 50),
@@ -1309,16 +1373,15 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
* Applies the grid layout to the tabs.
*
* @param {Tab[]} tabs - The tabs to apply the grid layout to.
- * @param {Tab} activeTab - The active tab.
*/
applyGridToTabs(tabs) {
tabs.forEach((tab) => {
tab.splitView = true;
tab.splitViewValue = this.currentView;
- tab.setAttribute('split-view', 'true');
- const container = tab.linkedBrowser?.closest('.browserSidebarContainer');
- container.setAttribute('is-zen-split', 'true');
- if (!container?.querySelector('.zen-tab-rearrange-button')) {
+ tab.setAttribute("split-view", "true");
+ const container = tab.linkedBrowser?.closest(".browserSidebarContainer");
+ container.setAttribute("is-zen-split", "true");
+ if (!container?.querySelector(".zen-tab-rearrange-button")) {
// insert a header into the container
const header = this._createHeader(container);
container.insertBefore(header, container.firstChild);
@@ -1329,22 +1392,23 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
/**
* Creates a header for the tab.
- * @param container
+ *
+ * @param {Element} container
* @returns {*|!Element|HTMLElement|HTMLUnknownElement|HTMLDirectoryElement|HTMLFontElement|HTMLFrameElement|HTMLFrameSetElement|HTMLPreElement|HTMLMarqueeElement|HTMLParamElement}
* @private
*/
_createHeader(container) {
- const headerContainer = document.createElement('div');
- headerContainer.classList.add('zen-view-splitter-header-container');
- const header = document.createElement('div');
- header.classList.add('zen-view-splitter-header');
- const removeButton = document.createXULElement('toolbarbutton');
- removeButton.classList.add('zen-tab-unsplit-button');
- removeButton.addEventListener('click', () => {
+ const headerContainer = document.createElement("div");
+ headerContainer.classList.add("zen-view-splitter-header-container");
+ const header = document.createElement("div");
+ header.classList.add("zen-view-splitter-header");
+ const removeButton = document.createXULElement("toolbarbutton");
+ removeButton.classList.add("zen-tab-unsplit-button");
+ removeButton.addEventListener("click", () => {
this.removeTabFromSplit(container);
});
- const rearrangeButton = document.createXULElement('toolbarbutton');
- rearrangeButton.classList.add('zen-tab-rearrange-button');
+ const rearrangeButton = document.createXULElement("toolbarbutton");
+ rearrangeButton.classList.add("zen-tab-rearrange-button");
header.appendChild(rearrangeButton);
header.appendChild(removeButton);
headerContainer.appendChild(header);
@@ -1352,7 +1416,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
}
_removeHeader(container) {
- const header = container.querySelector('.zen-view-splitter-header-container');
+ const header = container.querySelector(".zen-view-splitter-header-container");
if (header) {
header.remove();
}
@@ -1369,7 +1433,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
}
const nodeRootPosition = splitNode.positionToRoot;
if (!splitNode.children) {
- const browserContainer = splitNode.tab.linkedBrowser.closest('.browserSidebarContainer');
+ const browserContainer = splitNode.tab.linkedBrowser.closest(".browserSidebarContainer");
browserContainer.style.inset = `${nodeRootPosition.top}% ${nodeRootPosition.right}% ${nodeRootPosition.bottom}% ${nodeRootPosition.left}%`;
this._tabToSplitNode.set(splitNode.tab, splitNode);
return;
@@ -1393,7 +1457,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
childNode.positionToRoot = childRootPosition;
this.applyGridLayout(childNode);
- if (splitNode.direction === 'column') {
+ if (splitNode.direction === "column") {
topOffset += childNode.sizeInParent * rootToNodeHeightRatio;
} else {
leftOffset += childNode.sizeInParent * rootToNodeWidthRatio;
@@ -1401,7 +1465,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
if (i < splittersNeeded) {
const splitter = currentSplitters[i];
- if (splitNode.direction === 'column') {
+ if (splitNode.direction === "column") {
splitter.style.inset = `${100 - childRootPosition.bottom}% ${childRootPosition.right}% 0% ${childRootPosition.left}%`;
} else {
splitter.style.inset = `${childRootPosition.top}% 0% ${childRootPosition.bottom}% ${100 - childRootPosition.right}%`;
@@ -1413,18 +1477,18 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
/**
*
- * @param {String} orient
+ * @param {string} orient
* @param {nsSplitNode} parentNode
- * @param {Number} idx
+ * @param {number} idx
*/
createSplitter(orient, parentNode, idx) {
- const splitter = document.createElement('div');
- splitter.className = 'zen-split-view-splitter';
- splitter.setAttribute('orient', orient);
- splitter.setAttribute('gridIdx', idx);
- this.overlay.insertAdjacentElement('afterbegin', splitter);
+ const splitter = document.createElement("div");
+ splitter.className = "zen-split-view-splitter";
+ splitter.setAttribute("orient", orient);
+ splitter.setAttribute("gridIdx", idx);
+ this.overlay.insertAdjacentElement("afterbegin", splitter);
- splitter.addEventListener('mousedown', this.handleSplitterMouseDown);
+ splitter.addEventListener("mousedown", this.handleSplitterMouseDown);
return splitter;
}
@@ -1434,11 +1498,13 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
*/
getSplitters(parentNode, splittersNeeded) {
let currentSplitters = this._splitNodeToSplitters.get(parentNode) || [];
- if (!splittersNeeded || currentSplitters.length === splittersNeeded) return currentSplitters;
+ if (!splittersNeeded || currentSplitters.length === splittersNeeded) {
+ return currentSplitters;
+ }
for (let i = currentSplitters?.length || 0; i < splittersNeeded; i++) {
currentSplitters.push(
this.createSplitter(
- parentNode.direction === 'column' ? 'horizontal' : 'vertical',
+ parentNode.direction === "column" ? "horizontal" : "vertical",
parentNode,
i
)
@@ -1455,14 +1521,14 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
removeSplitters() {
[...this.overlay.children]
- .filter((c) => c.classList.contains('zen-split-view-splitter'))
+ .filter((c) => c.classList.contains("zen-split-view-splitter"))
.forEach((s) => s.remove());
this._splitNodeToSplitters.clear();
}
/**
* @param {Tab} tab
- * @return {nsSplitNode} splitNode
+ * @returns {nsSplitNode} splitNode
*/
getSplitNodeFromTab(tab) {
return this._tabToSplitNode.get(tab);
@@ -1474,7 +1540,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
* @param {Element} container - The container element.
*/
styleContainer(container) {
- container.addEventListener('mousedown', this.handleTabEvent);
+ container.addEventListener("mousedown", this.handleTabEvent);
}
/**
@@ -1486,9 +1552,9 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
if (this.rearrangeViewEnabled) {
return;
}
- const container = event.currentTarget.closest('.browserSidebarContainer');
+ const container = event.currentTarget.closest(".browserSidebarContainer");
const tab = window.gBrowser.tabs.find(
- (t) => t.linkedBrowser?.closest('.browserSidebarContainer') === container
+ (t) => t.linkedBrowser?.closest(".browserSidebarContainer") === container
);
if (tab) {
window.gBrowser.selectedTab = tab;
@@ -1496,19 +1562,20 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
};
handleSplitterMouseDown = (event) => {
- this.tabBrowserPanel.setAttribute('zen-split-resizing', true);
- const isVertical = event.target.getAttribute('orient') === 'vertical';
- const dimension = isVertical ? 'width' : 'height';
- const clientAxis = isVertical ? 'clientX' : 'clientY';
+ this.tabBrowserPanel.setAttribute("zen-split-resizing", true);
+ const isVertical = event.target.getAttribute("orient") === "vertical";
+ const dimension = isVertical ? "width" : "height";
+ const clientAxis = isVertical ? "clientX" : "clientY";
- const gridIdx = parseInt(event.target.getAttribute('gridIdx'));
+ const gridIdx = parseInt(event.target.getAttribute("gridIdx"));
const startPosition = event[clientAxis];
const splitNode = event.target.parentSplitNode;
let rootToNodeSize;
- if (isVertical)
+ if (isVertical) {
rootToNodeSize = 100 / (100 - splitNode.positionToRoot.right - splitNode.positionToRoot.left);
- else
+ } else {
rootToNodeSize = 100 / (100 - splitNode.positionToRoot.bottom - splitNode.positionToRoot.top);
+ }
const originalSizes = splitNode.children.map((c) => c.sizeInParent);
const dragFunc = (dEvent) => {
@@ -1532,7 +1599,9 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
splitNode.children[i].sizeInParent = newSize;
const amountReduced = current - newSize;
reducingMovement -= amountReduced;
- if (reducingMovement <= 0) break;
+ if (reducingMovement <= 0) {
+ break;
+ }
}
const increasingMovement = Math.max(movementPercent, -movementPercent) - reducingMovement;
const increaseIndex = gridIdx + (movementPercent < 0 ? 1 : 0);
@@ -1542,14 +1611,14 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
});
};
- window.setCursor(isVertical ? 'ew-resize' : 'ns-resize');
- document.addEventListener('mousemove', dragFunc);
+ window.setCursor(isVertical ? "ew-resize" : "ns-resize");
+ document.addEventListener("mousemove", dragFunc);
document.addEventListener(
- 'mouseup',
+ "mouseup",
() => {
- document.removeEventListener('mousemove', dragFunc);
- window.setCursor('auto');
- this.tabBrowserPanel.removeAttribute('zen-split-resizing');
+ document.removeEventListener("mousemove", dragFunc);
+ window.setCursor("auto");
+ this.tabBrowserPanel.removeAttribute("zen-split-resizing");
},
{ once: true }
);
@@ -1566,25 +1635,27 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
// zenModeActive allow us to avoid setting docShellisActive to false later on,
// see browser-custom-elements.js's patch
tab.linkedBrowser.zenModeActive = active;
- if (!active && tab === gBrowser.selectedTab) continue;
+ if (!active && tab === gBrowser.selectedTab) {
+ continue;
+ }
try {
tab.linkedBrowser.docShellIsActive = active;
} catch (e) {
console.error(e);
}
- const browser = tab.linkedBrowser.closest('.browserSidebarContainer');
+ const browser = tab.linkedBrowser.closest(".browserSidebarContainer");
if (active) {
- tab.removeAttribute('pending');
- browser.setAttribute('zen-split', 'true');
+ tab.removeAttribute("pending");
+ browser.setAttribute("zen-split", "true");
- browser.addEventListener('dragstart', this.onBrowserDragStart);
- browser.addEventListener('dragend', this.onBrowserDragEnd);
+ browser.addEventListener("dragstart", this.onBrowserDragStart);
+ browser.addEventListener("dragend", this.onBrowserDragEnd);
} else {
// browser.removeAttribute('zen-split');
// browser.removeAttribute('style');
- browser.removeEventListener('dragstart', this.onBrowserDragStart);
- browser.removeEventListener('dragend', this.onBrowserDragEnd);
+ browser.removeEventListener("dragstart", this.onBrowserDragStart);
+ browser.removeEventListener("dragend", this.onBrowserDragEnd);
}
}
}
@@ -1596,9 +1667,9 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
* @param {boolean} [removeDeckSelected=false] - Whether to remove the 'deck-selected' attribute.
*/
resetContainerStyle(container, removeDeckSelected = false) {
- container.removeAttribute('zen-split');
+ container.removeAttribute("zen-split");
if (removeDeckSelected) {
- container.classList.remove('deck-selected');
+ container.classList.remove("deck-selected");
}
}
@@ -1608,11 +1679,11 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
* @param {Element} panel - The panel element.
*/
updatePanelUI(panel) {
- for (const gridType of ['hsep', 'vsep', 'grid', 'unsplit']) {
+ for (const gridType of ["hsep", "vsep", "grid", "unsplit"]) {
const selector = panel.querySelector(`.zen-split-view-modifier-preview.${gridType}`);
- selector.classList.remove('active');
+ selector.classList.remove("active");
if (this.currentView >= 0 && this._data[this.currentView].gridType === gridType) {
- selector.classList.add('active');
+ selector.classList.add("active");
}
}
}
@@ -1621,7 +1692,9 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
* @description unsplit the current view.]
*/
unsplitCurrentView() {
- if (this.currentView < 0) return;
+ if (this.currentView < 0) {
+ return;
+ }
this.removeGroup(this.currentView);
const currentTab = window.gBrowser.selectedTab;
window.gBrowser.selectedTab = currentTab;
@@ -1642,7 +1715,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
}
toggleShortcut(gridType) {
- if (gridType === 'unsplit') {
+ if (gridType === "unsplit") {
this.unsplitCurrentView();
return;
}
@@ -1669,10 +1742,10 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
/**
* @description removes the tab from the split
- * @param container - The container element
+ * @param {Element} container - The container element
*/
removeTabFromSplit = (container) => {
- const browser = container.querySelector('browser');
+ const browser = container.querySelector("browser");
if (browser) {
const tab = gBrowser.getTabForBrowser(browser);
if (tab) {
@@ -1693,10 +1766,10 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
delete this._dndElement;
}
if (this.fakeBrowser) {
- gBrowser.tabbox.removeAttribute('style');
- this.tabBrowserPanel.removeAttribute('dragging-split');
- const tabboxAnimations = document.getElementById('tabbrowser-tabbox').getAnimations();
- if (tabboxAnimations.length > 0) {
+ gBrowser.tabbox.removeAttribute("style");
+ this.tabBrowserPanel.removeAttribute("dragging-split");
+ const tabboxAnimations = document.getElementById("tabbrowser-tabbox").getAnimations();
+ if (tabboxAnimations.length) {
tabboxAnimations.forEach((a) => a.cancel());
}
delete this._hasAnimated;
@@ -1707,17 +1780,18 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
this._draggingTab = null;
}
for (const browser of gBrowser.browsers) {
- browser.removeAttribute('style');
+ browser.removeAttribute("style");
}
}
}
/**
* @description moves the tab to the split view if dragged on a browser
- * @param event - The event
- * @param draggedTab - The dragged tab
+ * @param {Event} event - The event
+ * @param {Tab} draggedTab - The dragged tab
* @returns {boolean} true if the tab was moved to the split view
*/
+ // eslint-disable-next-line complexity
moveTabToSplitView(event, draggedTab) {
const canDrop = this._canDrop;
this._canDrop = false;
@@ -1740,18 +1814,18 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
return false;
}
- const dropSide = this.fakeBrowser?.getAttribute('side');
+ const dropSide = this.fakeBrowser?.getAttribute("side");
const containerRect = this.fakeBrowser.getBoundingClientRect();
const padding = ZenThemeModifier.elementSeparation;
const dropTarget = document.elementFromPoint(
- dropSide === 'left'
+ dropSide === "left"
? containerRect.left + containerRect.width + padding + 5
: containerRect.left - padding - 5,
event.clientY
);
const browser =
- dropTarget?.closest('browser') ??
- dropTarget?.closest('.browserSidebarContainer')?.querySelector('browser');
+ dropTarget?.closest("browser") ??
+ dropTarget?.closest(".browserSidebarContainer")?.querySelector("browser");
if (!browser) {
this._maybeRemoveFakeBrowser(false);
@@ -1760,15 +1834,15 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
const droppedOnTab = gZenGlanceManager.getTabOrGlanceParent(gBrowser.getTabForBrowser(browser));
if (droppedOnTab === this._draggingTab) {
- this.createEmptySplit(dropSide == 'right');
+ this.createEmptySplit(dropSide == "right");
return true;
}
gBrowser.selectedTab = this._draggingTab;
this._draggingTab = null;
- const browserContainer = draggedTab.linkedBrowser?.closest('.browserSidebarContainer');
+ const browserContainer = draggedTab.linkedBrowser?.closest(".browserSidebarContainer");
if (browserContainer) {
- browserContainer.style.opacity = '0';
+ browserContainer.style.opacity = "0";
}
if (droppedOnTab && droppedOnTab !== draggedTab) {
@@ -1788,7 +1862,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
if (splitGroup && (!draggedTab.group || draggedTab.group !== splitGroup)) {
this._moveTabsToContainer([draggedTab], droppedOnTab);
gBrowser.moveTabToExistingGroup(draggedTab, splitGroup);
- if (hoverSide === 'left' || hoverSide === 'top') {
+ if (hoverSide === "left" || hoverSide === "top") {
try {
splitGroup.tabs[0].before(draggedTab);
} catch (e) {
@@ -1806,8 +1880,8 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
group.tabs.push(draggedTab);
// If dropping on a side, create a new split in that direction
- if (hoverSide !== 'center') {
- const splitDirection = hoverSide === 'left' || hoverSide === 'right' ? 'row' : 'column';
+ if (hoverSide !== "center") {
+ const splitDirection = hoverSide === "left" || hoverSide === "right" ? "row" : "column";
if (parentNode.direction !== splitDirection) {
this.splitIntoNode(
droppedOnSplitNode,
@@ -1819,7 +1893,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
this.addTabToSplit(
draggedTab,
parentNode,
- /* prepend = */ hoverSide === 'left' || hoverSide === 'top'
+ /* prepend = */ hoverSide === "left" || hoverSide === "top"
);
}
} else {
@@ -1830,13 +1904,13 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
}
} else {
// Create new split view with layout based on drop position
- let gridType = 'vsep';
+ let gridType = "vsep";
// Put tabs always as if it was dropped from the left
this.splitTabs(
- dropSide == 'left' ? [draggedTab, droppedOnTab] : [droppedOnTab, draggedTab],
+ dropSide == "left" ? [draggedTab, droppedOnTab] : [droppedOnTab, draggedTab],
gridType,
- dropSide == 'left' ? 0 : 1
+ dropSide == "left" ? 0 : 1
);
}
}
@@ -1864,7 +1938,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
opacity: [0, 1],
},
{
- type: 'spring',
+ type: "spring",
bounce: 0.4,
duration: 0.2,
delay: 0.1,
@@ -1878,11 +1952,11 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
return false;
}
const url = urls[0];
- if (!url.startsWith('panel-')) {
+ if (!url.startsWith("panel-")) {
return false;
}
const browserContainer = document.getElementById(url);
- const browser = browserContainer?.querySelector('browser');
+ const browser = browserContainer?.querySelector("browser");
if (!browser) {
return false;
}
@@ -1892,7 +1966,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
}
if (tab.splitView) {
// Unsplit the tab and exit from the drag view
- this.dropZone?.removeAttribute('enabled');
+ this.dropZone?.removeAttribute("enabled");
this.disableTabRearrangeView(event);
this.removeTabFromSplit(browserContainer);
return true;
@@ -1902,18 +1976,19 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
/**
* Gets or creates a tab group for split view tabs
+ *
* @param {Array} tabs Initial tabs to add to the group if creating new
* @returns {TabGroup} The tab group for split view tabs
*/
_getSplitViewGroup(tabs) {
- if (tabs.some((tab) => tab.hasAttribute('zen-essential'))) {
+ if (tabs.some((tab) => tab.hasAttribute("zen-essential"))) {
return null;
}
// Try to find an existing split view group
let splitGroup = gBrowser.tabGroups.find(
(group) =>
- group.getAttribute('split-view-group') &&
+ group.getAttribute("split-view-group") &&
group.tabs.some((tab) => tabs.includes(tab) && tab.splitView)
);
@@ -1926,7 +2001,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
if (tabs?.length) {
// Create a new group with the initial tabs
group = gBrowser.addTabGroup(tabs, {
- label: '',
+ label: "",
showCreateUI: false,
insertBefore: tabs[0],
forSplitView: true,
@@ -1967,7 +2042,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
onAfterWorkspaceSessionRestore() {
if (
- gBrowser.selectedTab.group?.hasAttribute('split-view-group') &&
+ gBrowser.selectedTab.group?.hasAttribute("split-view-group") &&
!gBrowser.selectedTab.pinned
) {
// Activate all browsers in the split view
@@ -1979,13 +2054,13 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
maybeDisableOpeningTabOnSplitView() {
const shouldBeDisabled = !this.canOpenLinkInSplitView();
document
- .getElementById('cmd_zenSplitViewLinkInNewTab')
- .setAttribute('disabled', shouldBeDisabled);
- const splitGlanceCommand = document.getElementById('cmd_zenGlanceSplit');
+ .getElementById("cmd_zenSplitViewLinkInNewTab")
+ .setAttribute("disabled", shouldBeDisabled);
+ const splitGlanceCommand = document.getElementById("cmd_zenGlanceSplit");
if (shouldBeDisabled) {
- splitGlanceCommand.setAttribute('disabled', true);
+ splitGlanceCommand.setAttribute("disabled", true);
} else {
- splitGlanceCommand.removeAttribute('disabled');
+ splitGlanceCommand.removeAttribute("disabled");
}
}
@@ -2002,12 +2077,12 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
}
#withoutSplitViewTransition(callback) {
- this.tabBrowserPanel.classList.add('zen-split-view-no-transition');
+ this.tabBrowserPanel.classList.add("zen-split-view-no-transition");
try {
return callback();
} finally {
requestAnimationFrame(() => {
- this.tabBrowserPanel.classList.remove('zen-split-view-no-transition');
+ this.tabBrowserPanel.classList.remove("zen-split-view-no-transition");
}, 0);
}
}
@@ -2017,16 +2092,16 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
const emptyTab = gZenWorkspaces._emptyTab;
let tabs = rightSide ? [selectedTab, emptyTab] : [emptyTab, selectedTab];
const data = {
- tabs: tabs,
- gridType: 'grid',
- layoutTree: this.calculateLayoutTree(tabs, 'grid'),
+ tabs,
+ gridType: "grid",
+ layoutTree: this.calculateLayoutTree(tabs, "grid"),
};
this._data.push(data);
this.activateSplitView(data);
gBrowser.selectedTab = emptyTab;
setTimeout(() => {
window.addEventListener(
- 'ZenURLBarClosed',
+ "ZenURLBarClosed",
(event) => {
const { onElementPicked, onSwitch } = event.detail;
const groupIndex = this._data.findIndex((group) => group.tabs.includes(emptyTab));
@@ -2036,15 +2111,15 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
changeTab: !onSwitch,
forUnsplit: true,
});
- const command = document.getElementById('cmd_zenNewEmptySplit');
- command.removeAttribute('disabled');
+ const command = document.getElementById("cmd_zenNewEmptySplit");
+ command.removeAttribute("disabled");
};
if (onElementPicked) {
if (
newSelectedTab === emptyTab ||
newSelectedTab === selectedTab ||
- selectedTab.getAttribute('zen-workspace-id') !==
- newSelectedTab.getAttribute('zen-workspace-id')
+ selectedTab.getAttribute("zen-workspace-id") !==
+ newSelectedTab.getAttribute("zen-workspace-id")
) {
cleanup();
return;
@@ -2054,7 +2129,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
this.resetTabState(emptyTab, false);
this.splitTabs(
rightSide ? [selectedTab, newSelectedTab] : [newSelectedTab, selectedTab],
- 'grid',
+ "grid",
rightSide ? 1 : 0
);
} else {
@@ -2063,7 +2138,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
},
{ once: true }
);
- gZenUIManager.handleNewTab(false, false, 'tab', true);
+ gZenUIManager.handleNewTab(false, false, "tab", true);
});
}
diff --git a/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs
index dc1e602c4..e7a21d1cd 100644
--- a/src/zen/tabs/ZenPinnedTabManager.mjs
+++ b/src/zen/tabs/ZenPinnedTabManager.mjs
@@ -2,37 +2,39 @@
// 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";
const lazy = {};
class ZenPinnedTabsObserver {
- static ALL_EVENTS = ['TabPinned', 'TabUnpinned'];
+ static ALL_EVENTS = ["TabPinned", "TabUnpinned"];
#listeners = [];
constructor() {
+ // eslint-disable-next-line mozilla/valid-lazy
XPCOMUtils.defineLazyPreferenceGetter(
lazy,
- 'zenPinnedTabRestorePinnedTabsToPinnedUrl',
- 'zen.pinned-tab-manager.restore-pinned-tabs-to-pinned-url',
+ "zenPinnedTabRestorePinnedTabsToPinnedUrl",
+ "zen.pinned-tab-manager.restore-pinned-tabs-to-pinned-url",
false
);
XPCOMUtils.defineLazyPreferenceGetter(
lazy,
- 'zenPinnedTabCloseShortcutBehavior',
- 'zen.pinned-tab-manager.close-shortcut-behavior',
- 'switch'
+ "zenPinnedTabCloseShortcutBehavior",
+ "zen.pinned-tab-manager.close-shortcut-behavior",
+ "switch"
);
XPCOMUtils.defineLazyPreferenceGetter(
lazy,
- 'zenTabsEssentialsMax',
- 'zen.tabs.essentials.max',
+ "zenTabsEssentialsMax",
+ "zen.tabs.essentials.max",
12
);
ChromeUtils.defineESModuleGetters(lazy, {
- E10SUtils: 'resource://gre/modules/E10SUtils.sys.mjs',
- TabStateCache: 'resource:///modules/sessionstore/TabStateCache.sys.mjs',
+ // eslint-disable-next-line mozilla/valid-lazy
+ E10SUtils: "resource://gre/modules/E10SUtils.sys.mjs",
+ TabStateCache: "resource:///modules/sessionstore/TabStateCache.sys.mjs",
});
this.#listenPinnedTabEvents();
}
@@ -42,7 +44,7 @@ class ZenPinnedTabsObserver {
for (const event of ZenPinnedTabsObserver.ALL_EVENTS) {
window.addEventListener(event, eventListener);
}
- window.addEventListener('unload', () => {
+ window.addEventListener("unload", () => {
for (const event of ZenPinnedTabsObserver.ALL_EVENTS) {
window.removeEventListener(event, eventListener);
}
@@ -65,7 +67,7 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
if (!this.enabled) {
return;
}
- this._canLog = Services.prefs.getBoolPref('zen.pinned-tab-manager.debug', false);
+ this._canLog = Services.prefs.getBoolPref("zen.pinned-tab-manager.debug", false);
this.observer = new ZenPinnedTabsObserver();
this._initClosePinnedTabShortcut();
this._insertItemsIntoTabContextMenu();
@@ -78,20 +80,21 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
log(message) {
if (this._canLog) {
+ /* eslint-disable-next-line no-console */
console.log(`[ZenPinnedTabManager] ${message}`);
}
}
onTabIconChanged(tab, url = null) {
- tab.dispatchEvent(new CustomEvent('ZenTabIconChanged', { bubbles: true, detail: { tab } }));
- if (tab.hasAttribute('zen-essential')) {
+ tab.dispatchEvent(new CustomEvent("ZenTabIconChanged", { bubbles: true, detail: { tab } }));
+ if (tab.hasAttribute("zen-essential")) {
this.setEssentialTabIcon(tab, url);
}
}
setEssentialTabIcon(tab, url = null) {
- const iconUrl = url ?? tab.getAttribute('image') ?? '';
- tab.style.setProperty('--zen-essential-tab-icon', `url(${iconUrl})`);
+ const iconUrl = url ?? tab.getAttribute("image") ?? "";
+ tab.style.setProperty("--zen-essential-tab-icon", `url(${iconUrl})`);
}
_onTabResetPinButton(event, tab) {
@@ -108,26 +111,28 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
}
_onPinnedTabEvent(action, event) {
- if (!this.enabled) return;
+ if (!this.enabled) {
+ return;
+ }
const tab = event.target;
if (this._ignoreNextTabPinnedEvent) {
delete this._ignoreNextTabPinnedEvent;
return;
}
switch (action) {
- case 'TabPinned':
+ case "TabPinned":
tab._zenClickEventListener = this._zenClickEventListener;
- tab.addEventListener('click', tab._zenClickEventListener);
+ tab.addEventListener("click", tab._zenClickEventListener);
break;
// [Fall through]
- case 'TabUnpinned':
+ case "TabUnpinned":
if (tab._zenClickEventListener) {
- tab.removeEventListener('click', tab._zenClickEventListener);
+ tab.removeEventListener("click", tab._zenClickEventListener);
delete tab._zenClickEventListener;
}
break;
default:
- console.warn('ZenPinnedTabManager: Unhandled tab event', action);
+ console.warn("ZenPinnedTabManager: Unhandled tab event", action);
break;
}
}
@@ -137,10 +142,10 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
}
async _onTabClick(e) {
- const tab = e.target?.closest('tab');
+ const tab = e.target?.closest("tab");
if (e.button === 1 && tab) {
await this.onCloseTabShortcut(e, tab, {
- closeIfPending: Services.prefs.getBoolPref('zen.pinned-tab-manager.wheel-close-if-pending'),
+ closeIfPending: Services.prefs.getBoolPref("zen.pinned-tab-manager.wheel-close-if-pending"),
});
}
}
@@ -165,17 +170,18 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
window.gZenWindowSync.setPinnedTabState(tab);
this.resetPinChangedUrl(tab);
- gZenUIManager.showToast('zen-pinned-tab-replaced');
+ gZenUIManager.showToast("zen-pinned-tab-replaced");
}
_initClosePinnedTabShortcut() {
- let cmdClose = document.getElementById('cmd_close');
+ let cmdClose = document.getElementById("cmd_close");
if (cmdClose) {
- cmdClose.addEventListener('command', this.onCloseTabShortcut.bind(this));
+ cmdClose.addEventListener("command", this.onCloseTabShortcut.bind(this));
}
}
+ // eslint-disable-next-line complexity
async onCloseTabShortcut(
event,
selectedTab = gBrowser.selectedTab,
@@ -193,7 +199,7 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
...new Set(
tabs
.flatMap((tab) => {
- if (tab.group?.hasAttribute('split-view-group')) {
+ if (tab.group?.hasAttribute("split-view-group")) {
return tab.group.tabs;
}
return tab;
@@ -211,28 +217,28 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
event.stopPropagation();
event.preventDefault();
- if (noClose && behavior === 'close') {
- behavior = 'unload-switch';
+ if (noClose && behavior === "close") {
+ behavior = "unload-switch";
}
- if (alwaysUnload && ['close', 'reset', 'switch', 'reset-switch'].includes(behavior)) {
- behavior = behavior.contains('reset') ? 'reset-unload-switch' : 'unload-switch';
+ if (alwaysUnload && ["close", "reset", "switch", "reset-switch"].includes(behavior)) {
+ behavior = behavior.contains("reset") ? "reset-unload-switch" : "unload-switch";
}
switch (behavior) {
- case 'close': {
+ case "close": {
for (const tab of pinnedTabs) {
gBrowser.removeTab(tab, { animate: true });
}
break;
}
- case 'reset-unload-switch':
- case 'unload-switch':
- case 'reset-switch':
- case 'switch':
- if (behavior.includes('unload')) {
+ case "reset-unload-switch":
+ case "unload-switch":
+ case "reset-switch":
+ case "switch":
+ if (behavior.includes("unload")) {
for (const tab of pinnedTabs) {
- if (tab.hasAttribute('glance-id')) {
+ if (tab.hasAttribute("glance-id")) {
// We have a glance tab inside the tab we are trying to unload,
// before we used to just ignore it but now we need to fully close
// it as well.
@@ -243,22 +249,22 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
hasRan = true;
resolve();
};
- window.addEventListener('GlanceClose', onGlanceClose, { once: true });
+ window.addEventListener("GlanceClose", onGlanceClose, { once: true });
// Set a timeout to resolve the promise if the event doesn't fire.
// We do this to prevent any future issues where glance woudnt close such as
// glance requering to ask for permit unload.
setTimeout(() => {
if (!hasRan) {
- console.warn('GlanceClose event did not fire within 3 seconds');
+ console.warn("GlanceClose event did not fire within 3 seconds");
resolve();
}
}, 3000);
});
return;
}
- const isSpltView = tab.group?.hasAttribute('split-view-group');
+ const isSpltView = tab.group?.hasAttribute("split-view-group");
const group = isSpltView ? tab.group.group : tab.group;
- if (!folderToUnload && tab.hasAttribute('folder-active')) {
+ if (!folderToUnload && tab.hasAttribute("folder-active")) {
await gZenFolders.animateUnload(group, tab);
}
}
@@ -266,37 +272,37 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
await gZenFolders.animateUnloadAll(folderToUnload);
}
const allAreUnloaded = pinnedTabs.every(
- (tab) => tab.hasAttribute('pending') && !tab.hasAttribute('zen-essential')
+ (tab) => tab.hasAttribute("pending") && !tab.hasAttribute("zen-essential")
);
- for (const tab of pinnedTabs) {
+ for (const tabItem of pinnedTabs) {
if (allAreUnloaded && closeIfPending) {
- return await this.onCloseTabShortcut(event, tab, { behavior: 'close' });
+ await this.onCloseTabShortcut(event, tabItem, { behavior: "close" });
+ return;
}
}
await gBrowser.explicitUnloadTabs(pinnedTabs);
for (const tab of pinnedTabs) {
- tab.removeAttribute('discarded');
+ tab.removeAttribute("discarded");
}
}
if (selectedTabs.length) {
this._handleTabSwitch(selectedTabs[0]);
}
- if (behavior.includes('reset')) {
+ if (behavior.includes("reset")) {
for (const tab of pinnedTabs) {
this._resetTabToStoredState(tab);
}
}
break;
- case 'reset':
+ case "reset":
for (const tab of pinnedTabs) {
this._resetTabToStoredState(tab);
}
break;
default:
- return;
}
} catch (ex) {
- console.error('Error handling close tab shortcut for pinned tab:', ex);
+ console.error("Error handling close tab shortcut for pinned tab:", ex);
}
}
@@ -349,12 +355,13 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
}
return faviconData.dataURI;
} catch (ex) {
- console.error('Failed to get favicon:', ex);
+ console.error("Failed to get favicon:", ex);
return null;
}
}
addToEssentials(tab) {
+ // eslint-disable-next-line no-nested-ternary
const tabs = tab
? // if it's already an array, dont make it [tab]
tab?.length
@@ -365,18 +372,19 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
: [TabContextMenu.contextTab];
let movedAll = true;
for (let i = 0; i < tabs.length; i++) {
+ // eslint-disable-next-line no-shadow
let tab = tabs[i];
const section = gZenWorkspaces.getEssentialsSection(tab);
if (!this.canEssentialBeAdded(tab)) {
movedAll = false;
continue;
}
- if (tab.hasAttribute('zen-essential')) {
+ if (tab.hasAttribute("zen-essential")) {
continue;
}
- tab.setAttribute('zen-essential', 'true');
- if (tab.hasAttribute('zen-workspace-id')) {
- tab.removeAttribute('zen-workspace-id');
+ tab.setAttribute("zen-essential", "true");
+ if (tab.hasAttribute("zen-workspace-id")) {
+ tab.removeAttribute("zen-workspace-id");
}
if (tab.pinned) {
gBrowser.zenHandleTabMove(tab, () => {
@@ -384,7 +392,7 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
tab = gBrowser.adoptTab(tab, {
selectTab: tab.selected,
});
- tab.setAttribute('zen-essential', 'true');
+ tab.setAttribute("zen-essential", "true");
}
section.appendChild(tab);
});
@@ -392,13 +400,13 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
gBrowser.pinTab(tab);
this._ignoreNextTabPinnedEvent = true;
}
- tab.setAttribute('zenDefaultUserContextId', true);
+ tab.setAttribute("zenDefaultUserContextId", true);
if (tab.selected) {
gZenWorkspaces.switchTabIfNeeded(tab);
}
this.onTabIconChanged(tab);
// Dispatch the event to update the UI
- const event = new CustomEvent('TabAddedToEssentials', {
+ const event = new CustomEvent("TabAddedToEssentials", {
detail: { tab },
bubbles: true,
cancelable: false,
@@ -410,16 +418,18 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
}
removeEssentials(tab, unpin = true) {
+ // eslint-disable-next-line no-nested-ternary
const tabs = tab
? [tab]
: TabContextMenu.contextTab.multiselected
? gBrowser.selectedTabs
: [TabContextMenu.contextTab];
for (let i = 0; i < tabs.length; i++) {
+ // eslint-disable-next-line no-shadow
const tab = tabs[i];
- tab.removeAttribute('zen-essential');
+ tab.removeAttribute("zen-essential");
if (gZenWorkspaces.workspaceEnabled && gZenWorkspaces.getActiveWorkspaceFromCache().uuid) {
- tab.setAttribute('zen-workspace-id', gZenWorkspaces.getActiveWorkspaceFromCache().uuid);
+ tab.setAttribute("zen-workspace-id", gZenWorkspaces.getActiveWorkspaceFromCache().uuid);
}
if (unpin) {
gBrowser.unpinTab(tab);
@@ -430,7 +440,7 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
});
}
// Dispatch the event to update the UI
- const event = new CustomEvent('TabRemovedFromEssentials', {
+ const event = new CustomEvent("TabRemovedFromEssentials", {
detail: { tab },
bubbles: true,
cancelable: false,
@@ -455,7 +465,7 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
hidden="true"
command="cmd_zenPinnedTabResetNoTab"/>
`);
- document.getElementById('tabContextMenu').appendChild(elements);
+ document.getElementById("tabContextMenu").appendChild(elements);
const element = window.MozXULElement.parseXULToFragment(`
`);
- document.getElementById('context_pinTab')?.before(element);
- document.getElementById('context_zen-edit-tab-title').addEventListener('command', (event) => {
+ document.getElementById("context_pinTab")?.before(element);
+ document.getElementById("context_zen-edit-tab-title").addEventListener("command", (event) => {
gZenVerticalTabsManager.renameTabStart(event);
});
- document.getElementById('context_zen-edit-tab-icon').addEventListener('command', () => {
+ document.getElementById("context_zen-edit-tab-icon").addEventListener("command", () => {
const tab = TabContextMenu.contextTab;
gZenEmojiPicker
.open(tab.iconImage, { emojiAsSVG: true })
@@ -497,46 +507,46 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
})
.catch((err) => {
console.error(err);
- return;
});
});
}
updatePinnedTabContextMenu(contextTab) {
if (!this.enabled) {
- document.getElementById('context_pinTab').hidden = true;
+ document.getElementById("context_pinTab").hidden = true;
return;
}
const isVisible = contextTab.pinned && !contextTab.multiselected;
- const isEssential = contextTab.getAttribute('zen-essential');
- const zenAddEssential = document.getElementById('context_zen-add-essential');
- document.getElementById('context_zen-reset-pinned-tab').hidden = !isVisible;
- document.getElementById('context_zen-replace-pinned-url-with-current').hidden = !isVisible;
+ const isEssential = contextTab.getAttribute("zen-essential");
+ const zenAddEssential = document.getElementById("context_zen-add-essential");
+ document.getElementById("context_zen-reset-pinned-tab").hidden = !isVisible;
+ document.getElementById("context_zen-replace-pinned-url-with-current").hidden = !isVisible;
zenAddEssential.hidden = isEssential || !!contextTab.group;
document.l10n
- .formatValue('tab-context-zen-add-essential-badge', {
+ .formatValue("tab-context-zen-add-essential-badge", {
num: gBrowser._numZenEssentials,
max: this.maxEssentialTabs,
})
.then((badgeText) => {
- zenAddEssential.setAttribute('badge', badgeText);
+ zenAddEssential.setAttribute("badge", badgeText);
});
document
- .getElementById('cmd_contextZenAddToEssentials')
- .setAttribute('disabled', !this.canEssentialBeAdded(contextTab));
- document.getElementById('context_closeTab').hidden = contextTab.hasAttribute('zen-essential');
- document.getElementById('context_zen-remove-essential').hidden = !isEssential;
- document.getElementById('context_unpinTab').hidden =
- document.getElementById('context_unpinTab').hidden || isEssential;
- document.getElementById('context_unpinSelectedTabs').hidden =
- document.getElementById('context_unpinSelectedTabs').hidden || isEssential;
- document.getElementById('context_zen-pinned-tab-separator').hidden = !isVisible;
- document.getElementById('context_zen-edit-tab-title').hidden =
+ .getElementById("cmd_contextZenAddToEssentials")
+ .setAttribute("disabled", !this.canEssentialBeAdded(contextTab));
+ document.getElementById("context_closeTab").hidden = contextTab.hasAttribute("zen-essential");
+ document.getElementById("context_zen-remove-essential").hidden = !isEssential;
+ document.getElementById("context_unpinTab").hidden =
+ document.getElementById("context_unpinTab").hidden || isEssential;
+ document.getElementById("context_unpinSelectedTabs").hidden =
+ document.getElementById("context_unpinSelectedTabs").hidden || isEssential;
+ document.getElementById("context_zen-pinned-tab-separator").hidden = !isVisible;
+ document.getElementById("context_zen-edit-tab-title").hidden =
isEssential ||
- !Services.prefs.getBoolPref('zen.tabs.rename-tabs') ||
+ !Services.prefs.getBoolPref("zen.tabs.rename-tabs") ||
!gZenVerticalTabsManager._prefsSidebarExpanded;
}
+ // eslint-disable-next-line complexity
moveToAnotherTabContainerIfNecessary(event, movingTabs) {
movingTabs = [...movingTabs];
if (!this.enabled) {
@@ -544,9 +554,9 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
}
try {
const pinnedTabsTarget = event.target.closest(
- ':is(.zen-current-workspace-indicator, .zen-workspace-pinned-tabs-section)'
+ ":is(.zen-current-workspace-indicator, .zen-workspace-pinned-tabs-section)"
);
- const essentialTabsTarget = event.target.closest('.zen-essentials-container');
+ const essentialTabsTarget = event.target.closest(".zen-essentials-container");
const tabsTarget = !pinnedTabsTarget;
// TODO: Solve the issue of adding a tab between two groups
@@ -570,7 +580,7 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
let isRegularTabs = false;
// Check for essentials container
if (essentialTabsTarget) {
- if (!draggedTab.hasAttribute('zen-essential') && !draggedTab?.group) {
+ if (!draggedTab.hasAttribute("zen-essential") && !draggedTab?.group) {
moved = true;
isVertical = false;
hasActuallyMoved = this.addToEssentials(draggedTab);
@@ -580,31 +590,31 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
else if (pinnedTabsTarget) {
if (!draggedTab.pinned) {
gBrowser.pinTab(draggedTab);
- } else if (draggedTab.hasAttribute('zen-essential')) {
+ } else if (draggedTab.hasAttribute("zen-essential")) {
this.removeEssentials(draggedTab, false);
moved = true;
}
}
// Check for normal tabs container
- else if (tabsTarget || event.target.id === 'zen-tabs-wrapper') {
- if (draggedTab.pinned && !draggedTab.hasAttribute('zen-essential')) {
+ else if (tabsTarget || event.target.id === "zen-tabs-wrapper") {
+ if (draggedTab.pinned && !draggedTab.hasAttribute("zen-essential")) {
gBrowser.unpinTab(draggedTab);
isRegularTabs = true;
- } else if (draggedTab.hasAttribute('zen-essential')) {
+ } else if (draggedTab.hasAttribute("zen-essential")) {
this.removeEssentials(draggedTab);
moved = true;
isRegularTabs = true;
}
}
- if (typeof hasActuallyMoved === 'undefined') {
+ if (typeof hasActuallyMoved === "undefined") {
hasActuallyMoved = moved;
}
// If the tab was moved, adjust its position relative to the target tab
if (hasActuallyMoved) {
- const targetTab = event.target.closest('.tabbrowser-tab');
- const targetFolder = event.target.closest('zen-folder');
+ const targetTab = event.target.closest(".tabbrowser-tab");
+ const targetFolder = event.target.closest("zen-folder");
let targetElem = targetTab || targetFolder?.labelElement;
if (targetElem?.group?.activeGroups?.length > 0) {
const activeGroup = targetElem.group.activeGroups.at(-1);
@@ -642,7 +652,7 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
return moved;
} catch (ex) {
- console.error('Error moving tabs:', ex);
+ console.error("Error moving tabs:", ex);
return false;
}
}
@@ -652,14 +662,14 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
if (
!tab ||
!tab.pinned ||
- tab.hasAttribute('zen-essential') ||
+ tab.hasAttribute("zen-essential") ||
!tab._zenPinnedInitialState?.entry
) {
return;
}
// Remove # and ? from the URL
- const pinUrl = tab._zenPinnedInitialState.entry.url.split('#')[0];
- const currentUrl = browser.currentURI.spec.split('#')[0];
+ const pinUrl = tab._zenPinnedInitialState.entry.url.split("#")[0];
+ const currentUrl = browser.currentURI.spec.split("#")[0];
// Add an indicator that the pin has been changed
if (pinUrl === currentUrl) {
this.resetPinChangedUrl(tab);
@@ -669,57 +679,58 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
}
resetPinChangedUrl(tab) {
- if (!tab.hasAttribute('zen-pinned-changed')) {
+ if (!tab.hasAttribute("zen-pinned-changed")) {
return;
}
- tab.removeAttribute('zen-pinned-changed');
- tab.removeAttribute('had-zen-pinned-changed');
- tab.style.removeProperty('--zen-original-tab-icon');
+ tab.removeAttribute("zen-pinned-changed");
+ tab.removeAttribute("had-zen-pinned-changed");
+ tab.style.removeProperty("--zen-original-tab-icon");
}
pinHasChangedUrl(tab) {
- if (tab.hasAttribute('zen-pinned-changed')) {
+ if (tab.hasAttribute("zen-pinned-changed")) {
return;
}
- if (tab.group?.hasAttribute('split-view-group')) {
- tab.setAttribute('had-zen-pinned-changed', 'true');
+ if (tab.group?.hasAttribute("split-view-group")) {
+ tab.setAttribute("had-zen-pinned-changed", "true");
} else {
- tab.setAttribute('zen-pinned-changed', 'true');
+ tab.setAttribute("zen-pinned-changed", "true");
}
- tab.style.setProperty('--zen-original-tab-icon', `url(${tab._zenPinnedInitialState.image})`);
+ tab.style.setProperty("--zen-original-tab-icon", `url(${tab._zenPinnedInitialState.image})`);
}
removeTabContainersDragoverClass(hideIndicator = true) {
this.dragIndicator.remove();
this._dragIndicator = null;
if (hideIndicator) {
- gZenWorkspaces.activeWorkspaceIndicator?.removeAttribute('open');
+ gZenWorkspaces.activeWorkspaceIndicator?.removeAttribute("open");
}
}
get dragIndicator() {
if (!this._dragIndicator) {
- this._dragIndicator = document.createElement('div');
- this._dragIndicator.id = 'zen-drag-indicator';
+ this._dragIndicator = document.createElement("div");
+ this._dragIndicator.id = "zen-drag-indicator";
gNavToolbox.appendChild(this._dragIndicator);
}
return this._dragIndicator;
}
get expandedSidebarMode() {
- return document.documentElement.getAttribute('zen-sidebar-expanded') === 'true';
+ return document.documentElement.getAttribute("zen-sidebar-expanded") === "true";
}
canEssentialBeAdded(tab) {
return (
!(
- (tab.getAttribute('usercontextid') || 0) !=
+ (tab.getAttribute("usercontextid") || 0) !=
gZenWorkspaces.getActiveWorkspaceFromCache().containerTabId &&
gZenWorkspaces.containerSpecificEssentials
) && gBrowser._numZenEssentials < this.maxEssentialTabs
);
}
+ // eslint-disable-next-line complexity
applyDragoverClass(event, draggedTab) {
if (!this.enabled) {
return;
@@ -727,27 +738,27 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
let isVertical = this.expandedSidebarMode;
if (
gBrowser.isTabGroupLabel(draggedTab) &&
- !draggedTab?.group?.hasAttribute('split-view-group')
+ !draggedTab?.group?.hasAttribute("split-view-group")
) {
// If the target is a tab group label, we don't want to apply the dragover class
this.removeTabContainersDragoverClass();
return;
}
- const pinnedTabsTarget = event.target.closest('.zen-workspace-pinned-tabs-section');
- const essentialTabsTarget = event.target.closest('.zen-essentials-container');
- const tabsTarget = event.target.closest('.zen-workspace-normal-tabs-section');
- const folderTarget = event.target.closest('zen-folder');
- let targetTab = event.target.closest('.tabbrowser-tab');
+ const pinnedTabsTarget = event.target.closest(".zen-workspace-pinned-tabs-section");
+ const essentialTabsTarget = event.target.closest(".zen-essentials-container");
+ const tabsTarget = event.target.closest(".zen-workspace-normal-tabs-section");
+ const folderTarget = event.target.closest("zen-folder");
+ let targetTab = event.target.closest(".tabbrowser-tab");
targetTab = targetTab?.group || targetTab;
- draggedTab = draggedTab?.group?.hasAttribute('split-view-group')
+ draggedTab = draggedTab?.group?.hasAttribute("split-view-group")
? draggedTab.group
: draggedTab;
- const isHoveringIndicator = !!event.target.closest('.zen-current-workspace-indicator');
+ const isHoveringIndicator = !!event.target.closest(".zen-current-workspace-indicator");
if (isHoveringIndicator) {
this.removeTabContainersDragoverClass(false);
- gZenWorkspaces.activeWorkspaceIndicator?.setAttribute('open', true);
+ gZenWorkspaces.activeWorkspaceIndicator?.setAttribute("open", true);
} else {
- gZenWorkspaces.activeWorkspaceIndicator?.removeAttribute('open');
+ gZenWorkspaces.activeWorkspaceIndicator?.removeAttribute("open");
}
if (draggedTab?._dragData?.movingTabs) {
@@ -758,16 +769,16 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
// Decide whether we should show a dragover class for the given target
if (essentialTabsTarget) {
- if (!draggedTab.hasAttribute('zen-essential') && this.canEssentialBeAdded(draggedTab)) {
+ if (!draggedTab.hasAttribute("zen-essential") && this.canEssentialBeAdded(draggedTab)) {
shouldAddDragOverElement = true;
isVertical = false;
}
} else if (pinnedTabsTarget) {
- if (draggedTab.hasAttribute('zen-essential')) {
+ if (draggedTab.hasAttribute("zen-essential")) {
shouldAddDragOverElement = true;
}
} else if (tabsTarget) {
- if (draggedTab.hasAttribute('zen-essential')) {
+ if (draggedTab.hasAttribute("zen-essential")) {
shouldAddDragOverElement = true;
}
}
@@ -784,46 +795,48 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
const separation = 8;
const middleY = targetTab.screenY + rect.height / 2;
const indicator = this.dragIndicator;
+ // eslint-disable-next-line no-shadow
let top = 0;
if (event.screenY > middleY) {
- top = Math.round(rect.top + rect.height) + 'px';
+ top = Math.round(rect.top + rect.height) + "px";
} else {
- top = Math.round(rect.top) + 'px';
+ 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");
} else {
const separation = 8;
const middleX = targetTab.screenX + rect.width / 2;
const indicator = this.dragIndicator;
let left = 0;
if (event.screenX > middleX) {
- left = Math.round(rect.left + rect.width + 1) + 'px';
+ left = Math.round(rect.left + rect.width + 1) + "px";
} else {
- left = Math.round(rect.left - 2) + 'px';
+ left = Math.round(rect.left - 2) + "px";
}
if (indicator.style.left !== left) {
shouldPlayHapticFeedback = true;
}
- indicator.setAttribute('orientation', 'vertical');
- indicator.style.setProperty('--indicator-top', rect.top + separation / 2 + 'px');
- indicator.style.setProperty('--indicator-height', rect.height - separation + 'px');
+ indicator.setAttribute("orientation", "vertical");
+ indicator.style.setProperty("--indicator-top", rect.top + separation / 2 + "px");
+ indicator.style.setProperty("--indicator-height", rect.height - separation + "px");
indicator.style.left = left;
- indicator.style.removeProperty('top');
+ indicator.style.removeProperty("top");
}
if (shouldPlayHapticFeedback) {
+ // eslint-disable-next-line mozilla/valid-services
Services.zen.playHapticFeedback();
}
}
onTabLabelChanged(tab) {
- tab.dispatchEvent(new CustomEvent('ZenTabLabelChanged', { bubbles: true, detail: { tab } }));
+ tab.dispatchEvent(new CustomEvent("ZenTabLabelChanged", { bubbles: true, detail: { tab } }));
}
}
diff --git a/src/zen/tabs/zen-tabs/vertical-tabs-topbuttons-fix.css b/src/zen/tabs/zen-tabs/vertical-tabs-topbuttons-fix.css
index 4d0d8e534..aec12142c 100644
--- a/src/zen/tabs/zen-tabs/vertical-tabs-topbuttons-fix.css
+++ b/src/zen/tabs/zen-tabs/vertical-tabs-topbuttons-fix.css
@@ -5,12 +5,7 @@
*/
&:not([zen-compact-animating])
- #zen-sidebar-top-buttons:not(
- :has(
- #zen-sidebar-top-buttons-customization-target > *:not(#zen-sidebar-top-buttons-separator),
- .titlebar-buttonbox-container
- )
- ) {
+ #zen-sidebar-top-buttons:not(:has(#zen-sidebar-top-buttons-customization-target > *:not(#zen-sidebar-top-buttons-separator), .titlebar-buttonbox-container)) {
max-height: 0 !important;
min-height: 0 !important;
opacity: 0;
diff --git a/src/zen/tabs/zen-tabs/vertical-tabs.css b/src/zen/tabs/zen-tabs/vertical-tabs.css
index 47807cf3f..a502f540b 100644
--- a/src/zen/tabs/zen-tabs/vertical-tabs.css
+++ b/src/zen/tabs/zen-tabs/vertical-tabs.css
@@ -29,8 +29,8 @@
/* ==========================================================================
Single Toolbar Mode Specific Styles (`zen-single-toolbar='true'`)
========================================================================== */
-:root[zen-single-toolbar='true'] {
- @media (-moz-platform: macos) and (not -moz-pref('zen.view.mac.show-three-dot-menu')) {
+:root[zen-single-toolbar="true"] {
+ @media (-moz-platform: macos) and (not -moz-pref("zen.view.mac.show-three-dot-menu")) {
&:not([customizing]) #PanelUI-button:not([open]):not([panelopen]) {
position: absolute;
opacity: 0;
@@ -51,20 +51,20 @@
/* ==========================================================================
Vertical Tabs Mode Specific Styles (`zen.tabs.vertical` pref)
========================================================================== */
-@media -moz-pref('zen.tabs.vertical') {
- :root:not([zen-window-buttons-reversed='true']) {
+@media -moz-pref("zen.tabs.vertical") {
+ :root:not([zen-window-buttons-reversed="true"]) {
& .titlebar-buttonbox-container {
margin-left: auto;
width: fit-content;
}
- &:root[zen-right-side='true'] #zen-sidebar-top-buttons .titlebar-buttonbox-container {
+ &:root[zen-right-side="true"] #zen-sidebar-top-buttons .titlebar-buttonbox-container {
margin-right: calc(-1 * var(--zen-toolbox-padding));
}
}
}
-:root[zen-window-buttons-reversed='true'] .titlebar-buttonbox-container {
+:root[zen-window-buttons-reversed="true"] .titlebar-buttonbox-container {
margin-right: auto;
width: fit-content;
}
@@ -89,21 +89,18 @@
--zen-min-toolbox-padding: 0.35rem;
}
- --zen-toolbox-padding: max(
- var(--zen-min-toolbox-padding),
- calc(var(--zen-element-separation) / 1.5)
- );
+ --zen-toolbox-padding: max(var(--zen-min-toolbox-padding), calc(var(--zen-element-separation) / 1.5));
}
/* ==========================================================================
Single Toolbar Mode - Further Layout Adjustments
========================================================================== */
-:root[zen-single-toolbar='true'] {
+:root[zen-single-toolbar="true"] {
#urlbar-container {
width: -moz-available !important;
}
- & #urlbar-container[breakout='true']:has(#urlbar[zen-floating-urlbar='true']) {
+ & #urlbar-container[breakout="true"]:has(#urlbar[zen-floating-urlbar="true"]) {
--urlbar-container-height: 36px !important;
--urlbar-height: 38px !important;
}
@@ -116,7 +113,7 @@
& #zen-sidebar-top-buttons {
margin: calc(var(--zen-toolbox-padding) / 2) 0;
- :root[zen-right-side='true']:not([zen-window-buttons-reversed='true']) & {
+ :root[zen-right-side="true"]:not([zen-window-buttons-reversed="true"]) & {
margin-top: 0;
}
}
@@ -182,7 +179,7 @@
font-weight: 500;
gap: 2px;
- #navigator-toolbox[zen-has-implicit-hover='true'] & {
+ #navigator-toolbox[zen-has-implicit-hover="true"] & {
visibility: visible;
opacity: 0.5;
}
@@ -191,7 +188,7 @@
opacity: 1 !important;
}
- :root:not([zen-sidebar-expanded='true']) & {
+ :root:not([zen-sidebar-expanded="true"]) & {
display: none;
}
@@ -214,7 +211,7 @@
}
}
- :root[zen-unsynced-window='true'] & {
+ :root[zen-unsynced-window="true"] & {
transform: translateY(-4px);
}
}
@@ -246,8 +243,8 @@
}
/* Hide default titlebar spacers */
-.titlebar-spacer[type='pre-tabs'],
-.titlebar-spacer[type='post-tabs'] {
+.titlebar-spacer[type="pre-tabs"],
+.titlebar-spacer[type="post-tabs"] {
display: none;
}
@@ -260,7 +257,7 @@
gap: 0;
&::after {
- content: '';
+ content: "";
display: block;
height: 1px;
margin: 0 auto;
@@ -320,7 +317,7 @@
var(--zen-tabbox-element-indent-transition);
}
- :root[zen-sidebar-expanded='true'] &:not([zen-glance-tab]) {
+ :root[zen-sidebar-expanded="true"] &:not([zen-glance-tab]) {
margin-inline-start: var(--zen-folder-indent) !important;
}
@@ -344,11 +341,7 @@
&:not([src]),
&:-moz-broken {
content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100'%3E%3C/svg%3E") !important;
- background: color-mix(
- in srgb,
- var(--zen-primary-color) 80%,
- light-dark(rgb(0, 0, 0), rgb(255, 255, 255))
- );
+ background: color-mix(in srgb, var(--zen-primary-color) 80%, light-dark(rgb(0, 0, 0), rgb(255, 255, 255)));
}
}
@@ -408,13 +401,13 @@
}
&[soundplaying]:not([muted]) .tab-icon-stack::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%);
@@ -427,7 +420,7 @@
/* --- Essentials Glance Tab Specifics (Floating) --- */
/* Additional styles for glance tabs in "essential" mode */
- &[zen-essential='true'] .tabbrowser-tab {
+ &[zen-essential="true"] .tabbrowser-tab {
position: absolute;
top: 0px;
right: 0px;
@@ -472,7 +465,7 @@
overflow-y: auto;
height: 100%;
- :root[zen-workspace-id][zen-sidebar-expanded='true'] & {
+ :root[zen-workspace-id][zen-sidebar-expanded="true"] & {
margin-left: calc(-1 * var(--zen-toolbox-padding));
width: calc(100% + var(--zen-toolbox-padding) * 2);
}
@@ -495,7 +488,7 @@
margin: 0;
}
-#navigator-toolbox[zen-sidebar-expanded='true'] {
+#navigator-toolbox[zen-sidebar-expanded="true"] {
--zen-toolbox-min-width: fit-content;
padding: var(--zen-toolbox-padding);
@@ -523,8 +516,8 @@
& #nav-bar {
padding-right: 0;
- :root[zen-single-toolbar='true']:not([zen-has-empty-tab='true']) & {
- & #urlbar:not([breakout-extend='true']) .urlbar-input-container {
+ :root[zen-single-toolbar="true"]:not([zen-has-empty-tab="true"]) & {
+ & #urlbar:not([breakout-extend="true"]) .urlbar-input-container {
padding-left: 8px;
padding-right: 4px;
}
@@ -535,12 +528,12 @@
margin-top: 0;
}
- & .zen-current-workspace-indicator-icon[no-icon='true'] {
+ & .zen-current-workspace-indicator-icon[no-icon="true"] {
display: none;
}
& #zen-workspaces-button {
- & .zen-workspace-sidebar-icon[no-icon='true'] {
+ & .zen-workspace-sidebar-icon[no-icon="true"] {
display: none;
}
}
@@ -557,10 +550,10 @@
--tab-min-height: 44px;
}
- &[zen-right-side='true'] {
+ &[zen-right-side="true"] {
padding-left: 0;
}
- &:not([zen-right-side='true']) {
+ &:not([zen-right-side="true"]) {
padding-right: 0;
padding-left: var(--zen-toolbox-padding);
}
@@ -624,10 +617,7 @@
/* --- Pinned Tab Icon Repositioning & Reset Button --- */
/* Reposition icon stack absolutely when tab is pinned (and not essential) */
- &[zen-pinned-changed='true']:not([zen-essential])
- > .tab-stack
- > .tab-content
- > .tab-icon-stack {
+ &[zen-pinned-changed="true"]:not([zen-essential]) > .tab-stack > .tab-content > .tab-icon-stack {
position: absolute;
top: 50%;
transform: translateY(-50%);
@@ -640,11 +630,11 @@
}
}
- &[zen-pinned-changed='true']:not([zen-essential]) .tab-reset-pin-button image {
+ &[zen-pinned-changed="true"]:not([zen-essential]) .tab-reset-pin-button image {
opacity: 0;
}
- &[zen-pinned-changed='true']:not([zen-essential]) .tab-reset-pin-button:hover {
+ &[zen-pinned-changed="true"]:not([zen-essential]) .tab-reset-pin-button:hover {
& ~ .tab-label-container .tab-reset-pin-label {
max-height: 10px;
opacity: 0.6;
@@ -684,13 +674,13 @@
}
}
-:root:not([zen-sidebar-expanded='true']) {
+:root:not([zen-sidebar-expanded="true"]) {
--tab-min-width: 48px !important;
--zen-toolbox-padding: 6px !important;
--zen-toolbox-max-width: calc(var(--tab-min-width) + var(--zen-toolbox-padding) * 2);
}
-#navigator-toolbox:not([zen-sidebar-expanded='true']) {
+#navigator-toolbox:not([zen-sidebar-expanded="true"]) {
max-width: var(--zen-toolbox-max-width) !important;
min-width: var(--zen-toolbox-max-width) !important;
padding-bottom: var(--zen-toolbox-padding);
@@ -713,7 +703,7 @@
height: 100%;
}
- &:is([open='true'], :hover) .zen-current-workspace-indicator-icon {
+ &:is([open="true"], :hover) .zen-current-workspace-indicator-icon {
display: none;
}
}
@@ -857,7 +847,7 @@
}
}
-:root:not([zen-sidebar-expanded='true']) #zen-sidebar-splitter {
+:root:not([zen-sidebar-expanded="true"]) #zen-sidebar-splitter {
display: none !important;
}
@@ -873,7 +863,7 @@
order: 0;
}
-:root[zen-right-side='true'] {
+:root[zen-right-side="true"] {
& #navigator-toolbox {
order: 10 !important;
}
@@ -885,18 +875,18 @@
#tabbrowser-tabs {
& .tabbrowser-tab {
- &[pinned]:not([pending='true']) .tab-close-button {
+ &[pinned]:not([pending="true"]) .tab-close-button {
display: none !important;
}
- &[pinned]:not([pending='true']):not([zen-essential]) {
+ &[pinned]:not([pending="true"]):not([zen-essential]) {
&:hover .tab-reset-button,
&[visuallyselected] .tab-reset-button {
display: block;
}
}
- &:not([zen-pinned-changed='true']) .tab-reset-pin-button {
+ &:not([zen-pinned-changed="true"]) .tab-reset-pin-button {
display: none;
}
@@ -942,8 +932,7 @@
height: calc(100% - var(--tab-block-margin) * 2);
margin-left: calc(-1 * var(--tab-inline-padding) + var(--tab-block-margin));
margin-right: 8px;
- padding: 0 calc(var(--toolbarbutton-inner-padding) - 2px) 0
- calc(var(--toolbarbutton-inner-padding) / 4 + var(--tab-inline-padding) - 2px);
+ padding: 0 calc(var(--toolbarbutton-inner-padding) - 2px) 0 calc(var(--toolbarbutton-inner-padding) / 4 + var(--tab-inline-padding) - 2px);
border-radius: 0;
border-top-left-radius: var(--border-radius-medium);
width: unset;
@@ -960,7 +949,7 @@
}
&::after {
- content: '';
+ content: "";
display: block;
width: 2.5px;
height: 16px;
@@ -1019,11 +1008,11 @@
order: -1;
min-width: unset !important;
- :root[zen-sidebar-expanded='true'] & {
+ :root[zen-sidebar-expanded="true"] & {
--toolbarbutton-inner-padding: var(--zen-toolbar-button-inner-padding) !important;
}
- :root[zen-single-toolbar='true'] & {
+ :root[zen-single-toolbar="true"] & {
--zen-toolbar-height: 36px;
@media (-moz-platform: macos) {
--zen-toolbar-height: 38px;
@@ -1042,7 +1031,7 @@
padding-inline-end: var(--toolbarbutton-outer-padding);
}
- :root:not([zen-sidebar-expanded='true']) & toolbarspring {
+ :root:not([zen-sidebar-expanded="true"]) & toolbarspring {
display: none;
}
}
@@ -1061,7 +1050,7 @@
-moz-user-focus: ignore !important;
}
-@media -moz-pref('zen.tabs.show-newtab-vertical') {
+@media -moz-pref("zen.tabs.show-newtab-vertical") {
#tabs-newtab-button {
max-height: var(--tab-min-height);
display: flex !important;
@@ -1091,7 +1080,7 @@
--zen-colors-border: var(--zen-colors-tertiary);
}
- @media -moz-pref('zen.view.show-newtab-button-top') {
+ @media -moz-pref("zen.view.show-newtab-button-top") {
order: -1;
}
}
@@ -1119,24 +1108,14 @@
grid-template-columns 0.3s ease-out;
opacity: 1;
--min-essentials-width-wrap: calc(var(--tab-min-height) + 4px);
- grid-template-columns: repeat(
- auto-fit,
- minmax(max(23.7%, var(--min-essentials-width-wrap)), 1fr)
- );
- &[data-hack-type='1'] {
- grid-template-columns: repeat(
- auto-fit,
- minmax(max(30%, var(--min-essentials-width-wrap)), auto)
- );
+ grid-template-columns: repeat(auto-fit, minmax(max(23.7%, var(--min-essentials-width-wrap)), 1fr));
+ &[data-hack-type="1"] {
+ grid-template-columns: repeat(auto-fit, minmax(max(30%, var(--min-essentials-width-wrap)), auto));
}
- &[data-hack-type='2'] {
- grid-template-columns: repeat(
- auto-fit,
- minmax(max(23%, var(--min-essentials-width-wrap)), 1fr)
- minmax(max(23%, var(--min-essentials-width-wrap)), 1fr)
- );
+ &[data-hack-type="2"] {
+ grid-template-columns: repeat(auto-fit, minmax(max(23%, var(--min-essentials-width-wrap)), 1fr) minmax(max(23%, var(--min-essentials-width-wrap)), 1fr));
}
- &[data-hack-type='3'] {
+ &[data-hack-type="3"] {
grid-template-columns: repeat(auto-fit, minmax(max(25%, 48px), 1fr));
}
scrollbar-width: thin;
@@ -1147,15 +1126,13 @@
position: absolute;
- :root[zen-single-toolbar='true'] &:not(:empty) {
+ :root[zen-single-toolbar="true"] &:not(:empty) {
padding-top: 6px;
}
- &[hidden='true'] {
+ &[hidden="true"] {
--hidden-essentials-width: calc(var(--zen-sidebar-width) + var(--zen-toolbox-padding));
- max-width: var(
- --hidden-essentials-width
- ) !important; /* To still allow essentials to grid the tabs */
+ max-width: var(--hidden-essentials-width) !important; /* To still allow essentials to grid the tabs */
min-width: var(--hidden-essentials-width) !important;
visibility: hidden;
@@ -1168,7 +1145,7 @@
}
}
-.tabbrowser-tab[zen-essential='true'],
+.tabbrowser-tab[zen-essential="true"],
#zen-welcome-initial-essentials-browser-sidebar-essentials .tabbrowser-tab {
--toolbarbutton-inner-padding: 0;
max-width: unset;
@@ -1180,7 +1157,7 @@
--tab-selected-bgcolor: light-dark(rgba(255, 255, 255, 0.85), rgba(255, 255, 255, 0.2));
- &:not([visuallyselected], [multiselected='true']) .tab-background {
+ &:not([visuallyselected], [multiselected="true"]) .tab-background {
background: var(--zen-toolbar-element-bg);
border: none;
}
@@ -1204,10 +1181,10 @@
background: light-dark(rgba(0, 0, 0, 0.1), var(--tab-selected-bgcolor));
}
- @media -moz-pref('zen.theme.essentials-favicon-bg') {
+ @media -moz-pref("zen.theme.essentials-favicon-bg") {
&[visuallyselected] > .tab-stack > .tab-background {
&::after {
- content: '';
+ content: "";
inset: -50%;
filter: blur(20px);
position: absolute;
@@ -1225,24 +1202,12 @@
position: relative;
--zen-essential-bg-margin: 2px;
- --zen-essential-tab-selected-bg: light-dark(
- rgba(255, 255, 255, 0.85),
- color-mix(in srgb, var(--zen-primary-color), rgba(132, 132, 132, 0.85) 40%)
- );
- --zen-essential-tab-selected-bg-hover: light-dark(
- rgba(255, 255, 255, 0.8),
- color-mix(in srgb, var(--zen-primary-color), rgba(132, 132, 132, 0.85) 30%)
- );
+ --zen-essential-tab-selected-bg: light-dark(rgba(255, 255, 255, 0.85), color-mix(in srgb, var(--zen-primary-color), rgba(132, 132, 132, 0.85) 40%));
+ --zen-essential-tab-selected-bg-hover: light-dark(rgba(255, 255, 255, 0.8), color-mix(in srgb, var(--zen-primary-color), rgba(132, 132, 132, 0.85) 30%));
- :root[zen-default-theme='true'] & {
- --zen-essential-tab-selected-bg: light-dark(
- rgba(255, 255, 255, 0.85),
- rgba(68, 64, 64, 0.85)
- );
- --zen-essential-tab-selected-bg-hover: light-dark(
- rgba(255, 255, 255, 0.8),
- rgba(68, 64, 64, 0.75)
- );
+ :root[zen-default-theme="true"] & {
+ --zen-essential-tab-selected-bg: light-dark(rgba(255, 255, 255, 0.85), rgba(68, 64, 64, 0.85));
+ --zen-essential-tab-selected-bg-hover: light-dark(rgba(255, 255, 255, 0.8), rgba(68, 64, 64, 0.75));
}
&::before {
@@ -1252,7 +1217,7 @@
position: absolute;
inset: 0;
z-index: 0;
- content: '';
+ content: "";
transition: background 0.1s ease-in-out;
}
}
@@ -1265,11 +1230,7 @@
#zen-drag-indicator {
--zen-drag-indicator-height: 2px;
- --zen-drag-indicator-bg: color-mix(
- in srgb,
- var(--zen-primary-color) 50%,
- light-dark(rgba(0, 0, 0, 0.85), rgba(255, 255, 255, 0.95)) 50%
- );
+ --zen-drag-indicator-bg: color-mix(in srgb, var(--zen-primary-color) 50%, light-dark(rgba(0, 0, 0, 0.85), rgba(255, 255, 255, 0.95)) 50%);
position: fixed;
z-index: 1000;
@@ -1278,7 +1239,7 @@
border-radius: 5px;
&::before {
- content: '';
+ content: "";
position: absolute;
height: calc(2 * var(--zen-drag-indicator-height));
width: calc(2 * var(--zen-drag-indicator-height));
@@ -1287,7 +1248,7 @@
background: transparent;
}
- &[orientation='horizontal'] {
+ &[orientation="horizontal"] {
left: calc(var(--indicator-left) + 2 * var(--zen-drag-indicator-height) + 4px);
width: calc(var(--indicator-width) - 2 * var(--zen-drag-indicator-height) - 4px);
height: var(--zen-drag-indicator-height);
@@ -1303,7 +1264,7 @@
}
}
- &[orientation='vertical'] {
+ &[orientation="vertical"] {
top: calc(var(--indicator-top) + 2 * var(--zen-drag-indicator-height) + 4px);
height: calc(var(--indicator-height) - 2 * var(--zen-drag-indicator-height) - 4px);
width: var(--zen-drag-indicator-height);
@@ -1347,11 +1308,11 @@
&:not(.zen-essentials-container) {
display: flex;
- :root[zen-sidebar-expanded='true'] & {
+ :root[zen-sidebar-expanded="true"] & {
min-width: calc(100% - var(--zen-toolbox-padding) * 2);
}
- :root:not([zen-sidebar-expanded='true']) & {
+ :root:not([zen-sidebar-expanded="true"]) & {
max-width: var(--zen-sidebar-width);
align-items: center;
}
@@ -1363,12 +1324,12 @@
}
}
-#tabs-newtab-button:not([in-urlbar='true']) label,
+#tabs-newtab-button:not([in-urlbar="true"]) label,
.zen-current-workspace-indicator-name {
opacity: 0.7;
}
-@media (-moz-pref('zen.theme.hide-tab-throbber')) {
+@media (-moz-pref("zen.theme.hide-tab-throbber")) {
.tab-throbber {
display: none !important;
}
diff --git a/src/zen/tests/compact_mode/browser_compact_mode_width.js b/src/zen/tests/compact_mode/browser_compact_mode_width.js
index dd41d37f6..cb5896a73 100644
--- a/src/zen/tests/compact_mode/browser_compact_mode_width.js
+++ b/src/zen/tests/compact_mode/browser_compact_mode_width.js
@@ -1,16 +1,19 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
function goToRightSideTabs(callback) {
+ // eslint-disable-next-line no-async-promise-executor
return new Promise(async (resolve) => {
await SpecialPowers.pushPrefEnv({
- set: [['zen.tabs.vertical.right-side', true]],
+ set: [["zen.tabs.vertical.right-side", true]],
});
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
setTimeout(async () => {
await callback();
await SpecialPowers.popPrefEnv();
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
setTimeout(() => {
resolve();
}, 1000); // Wait for new layout
@@ -26,20 +29,22 @@ async function testSidebarWidth() {
let hasRan = false;
const ogSize = gNavToolbox.getBoundingClientRect().width;
- const onCompactChanged = (event) => {
+ const onCompactChanged = (_event) => {
if (hasRan) {
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
setTimeout(() => {
gZenCompactModeManager.removeEventListener(onCompactChanged);
resolvePromise();
}, 500);
return;
}
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
setTimeout(() => {
- const newSize = gNavToolbox.style.getPropertyValue('--zen-sidebar-width').replace('px', '');
+ const newSize = gNavToolbox.style.getPropertyValue("--zen-sidebar-width").replace("px", "");
Assert.equal(
newSize,
ogSize,
- 'The size of the titlebar should be the same as the original size'
+ "The size of the titlebar should be the same as the original size"
);
hasRan = true;
gZenCompactModeManager.preference = false;
@@ -61,7 +66,7 @@ add_task(async function test_Compact_Mode_Width_Right_Side() {
});
add_task(async function test_Compact_Mode_Hover() {
- gNavToolbox.setAttribute('zen-has-hover', true);
+ gNavToolbox.setAttribute("zen-has-hover", true);
await testSidebarWidth();
- gNavToolbox.removeAttribute('zen-has-hover');
+ gNavToolbox.removeAttribute("zen-has-hover");
});
diff --git a/src/zen/tests/container_essentials/browser_container_auto_switch.js b/src/zen/tests/container_essentials/browser_container_auto_switch.js
index 1e9a94826..7167e5c9b 100644
--- a/src/zen/tests/container_essentials/browser_container_auto_switch.js
+++ b/src/zen/tests/container_essentials/browser_container_auto_switch.js
@@ -1,34 +1,34 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Container_Essentials_Auto_Swithc() {
- await gZenWorkspaces.createAndSaveWorkspace('Container Profile 1', undefined, false, 1);
+ await gZenWorkspaces.createAndSaveWorkspace("Container Profile 1", undefined, false, 1);
const workspaces = await gZenWorkspaces._workspaces();
- ok(workspaces.length === 2, 'Two workspaces should exist.');
+ Assert.strictEqual(workspaces.length, 2, "Two workspaces should exist.");
- let newTab = BrowserTestUtils.addTab(gBrowser, 'about:blank', {
+ let newTab = BrowserTestUtils.addTab(gBrowser, "about:blank", {
skipAnimation: true,
userContextId: 1,
});
- ok(newTab, 'New tab should be opened.');
+ ok(newTab, "New tab should be opened.");
gZenPinnedTabManager.addToEssentials(newTab);
ok(
- newTab.hasAttribute('zen-essential') && newTab.parentNode.getAttribute('container') == '1',
- 'New tab should be marked as essential.'
+ newTab.hasAttribute("zen-essential") && newTab.parentNode.getAttribute("container") == "1",
+ "New tab should be marked as essential."
);
ok(
gBrowser.tabs.find(
- (t) => t.hasAttribute('zen-essential') && t.getAttribute('usercontextid') == 1
+ (t) => t.hasAttribute("zen-essential") && t.getAttribute("usercontextid") == 1
),
- 'New tab should be marked as essential.'
+ "New tab should be marked as essential."
);
const newWorkspaceUUID = gZenWorkspaces.activeWorkspace;
Assert.equal(
gZenWorkspaces.activeWorkspace,
workspaces[1].uuid,
- 'The new workspace should be active.'
+ "The new workspace should be active."
);
// Change to the original workspace, there should be no essential tabs
diff --git a/src/zen/tests/container_essentials/browser_container_specific_essentials.js b/src/zen/tests/container_essentials/browser_container_specific_essentials.js
index 3d0b82ec8..e1a680a23 100644
--- a/src/zen/tests/container_essentials/browser_container_specific_essentials.js
+++ b/src/zen/tests/container_essentials/browser_container_specific_essentials.js
@@ -1,29 +1,29 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Check_Creation() {
- await gZenWorkspaces.createAndSaveWorkspace('Container Profile 1', undefined, false, 1);
+ await gZenWorkspaces.createAndSaveWorkspace("Container Profile 1", undefined, false, 1);
const workspaces = await gZenWorkspaces._workspaces();
- ok(workspaces.length === 2, 'Two workspaces should exist.');
+ Assert.strictEqual(workspaces.length, 2, "Two workspaces should exist.");
await gZenWorkspaces.changeWorkspace(workspaces[1]);
- let newTab = BrowserTestUtils.addTab(gBrowser, 'about:blank', {
+ let newTab = BrowserTestUtils.addTab(gBrowser, "about:blank", {
skipAnimation: true,
userContextId: 1,
});
- ok(newTab, 'New tab should be opened.');
+ ok(newTab, "New tab should be opened.");
gZenPinnedTabManager.addToEssentials(newTab);
ok(
- newTab.hasAttribute('zen-essential') && newTab.parentNode.getAttribute('container') == '1',
- 'New tab should be marked as essential.'
+ newTab.hasAttribute("zen-essential") && newTab.parentNode.getAttribute("container") == "1",
+ "New tab should be marked as essential."
);
ok(
gBrowser.tabs.find(
- (t) => t.hasAttribute('zen-essential') && t.getAttribute('usercontextid') == 1
+ (t) => t.hasAttribute("zen-essential") && t.getAttribute("usercontextid") == 1
),
- 'New tab should be marked as essential.'
+ "New tab should be marked as essential."
);
const newWorkspaceUUID = gZenWorkspaces.activeWorkspace;
@@ -31,9 +31,9 @@ add_task(async function test_Check_Creation() {
await gZenWorkspaces.changeWorkspace(workspaces[0]);
ok(
!gBrowser.tabs.find(
- (t) => t.hasAttribute('zen-essential') && t.getAttribute('usercontextid') == 1
+ (t) => t.hasAttribute("zen-essential") && t.getAttribute("usercontextid") == 1
),
- 'No essential tabs should be found in the original workspace.'
+ "No essential tabs should be found in the original workspace."
);
await gZenWorkspaces.removeWorkspace(newWorkspaceUUID);
diff --git a/src/zen/tests/folders/browser_folder_basic_toggle.js b/src/zen/tests/folders/browser_folder_basic_toggle.js
index 244a22aec..70d998a55 100644
--- a/src/zen/tests/folders/browser_folder_basic_toggle.js
+++ b/src/zen/tests/folders/browser_folder_basic_toggle.js
@@ -1,21 +1,21 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Basic_Toggle() {
const folder = await gZenFolders.createFolder([], {
renameFolder: false,
- label: 'subfolder',
+ label: "subfolder",
});
- ok(!folder.collapsed, 'Folder should not be collapsed by default');
+ ok(!folder.collapsed, "Folder should not be collapsed by default");
folder.labelElement.click();
- ok(folder.collapsed, 'Folder should be collapsed after clicking on it');
+ ok(folder.collapsed, "Folder should be collapsed after clicking on it");
folder.labelElement.click();
- ok(!folder.collapsed, 'Folder should be expanded after clicking on it again');
+ ok(!folder.collapsed, "Folder should be expanded after clicking on it again");
await removeFolder(folder);
});
diff --git a/src/zen/tests/folders/browser_folder_create.js b/src/zen/tests/folders/browser_folder_create.js
index bfd8890da..39627b1a7 100644
--- a/src/zen/tests/folders/browser_folder_create.js
+++ b/src/zen/tests/folders/browser_folder_create.js
@@ -1,25 +1,25 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Create_Folder() {
- const tab = BrowserTestUtils.addTab(gBrowser, 'about:blank');
+ const tab = BrowserTestUtils.addTab(gBrowser, "about:blank");
const folder = await gZenFolders.createFolder([tab], {
renameFolder: false,
- label: 'test',
+ label: "test",
});
- ok(folder, 'Folder created successfully');
+ ok(folder, "Folder created successfully");
Assert.equal(
folder.tabs.length,
2,
- 'Folder contains the tab and the empty tab created by Zen Folders'
+ "Folder contains the tab and the empty tab created by Zen Folders"
);
- ok(tab.pinned, 'Tab is pinned after folder creation');
- Assert.equal(folder.label, 'test', 'Folder label is set correctly');
- ok(!folder.collapsed, 'Folder is expanded after creation');
+ ok(tab.pinned, "Tab is pinned after folder creation");
+ Assert.equal(folder.label, "test", "Folder label is set correctly");
+ ok(!folder.collapsed, "Folder is expanded after creation");
await removeFolder(folder);
- Assert.equal(folder.tabs.length, 0, 'Folder is empty after deletion');
- ok(!folder.parentElement, 'Folder is removed from the DOM');
- ok(tab.closing, 'Tab is closing after folder deletion');
+ Assert.equal(folder.tabs.length, 0, "Folder is empty after deletion");
+ ok(!folder.parentElement, "Folder is removed from the DOM");
+ ok(tab.closing, "Tab is closing after folder deletion");
});
diff --git a/src/zen/tests/folders/browser_folder_density.js b/src/zen/tests/folders/browser_folder_density.js
index e3948fed1..3a726559f 100644
--- a/src/zen/tests/folders/browser_folder_density.js
+++ b/src/zen/tests/folders/browser_folder_density.js
@@ -1,7 +1,7 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Folder_Density() {
const tab = gBrowser.selectedTab;
@@ -11,15 +11,15 @@ add_task(async function test_Folder_Density() {
let tabRect = tab.getBoundingClientRect();
let folderRect = folder.labelElement.parentElement.getBoundingClientRect();
- Assert.equal(tabRect.height, folderRect.height, 'Folder height matches tab height');
- Assert.equal(tabRect.width, folderRect.width, 'Folder width matches tab width');
+ Assert.equal(tabRect.height, folderRect.height, "Folder height matches tab height");
+ Assert.equal(tabRect.width, folderRect.width, "Folder width matches tab width");
gUIDensity.update(gUIDensity.MODE_TOUCH);
tabRect = tab.getBoundingClientRect();
folderRect = folder.getBoundingClientRect();
- Assert.equal(tabRect.height, folderRect.height, 'Folder height matches tab height');
- Assert.equal(tabRect.width, folderRect.width, 'Folder width matches tab width');
+ Assert.equal(tabRect.height, folderRect.height, "Folder height matches tab height");
+ Assert.equal(tabRect.width, folderRect.width, "Folder width matches tab width");
gUIDensity.update();
await removeFolder(folder);
diff --git a/src/zen/tests/folders/browser_folder_empty_tab.js b/src/zen/tests/folders/browser_folder_empty_tab.js
index 9214928e4..a1fe7760f 100644
--- a/src/zen/tests/folders/browser_folder_empty_tab.js
+++ b/src/zen/tests/folders/browser_folder_empty_tab.js
@@ -1,22 +1,20 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Empty_Tab_First() {
- const tab = gBrowser.selectedTab;
-
const [tab1, tab2] = await Promise.all([addTabTo(gBrowser), addTabTo(gBrowser)]);
const folder = await gZenFolders.createFolder([tab1], {
renameFolder: false,
});
- Assert.equal(folder.tabs.length, 2, 'Folder should contain the original tab');
- ok(folder.tabs[0].hasAttribute('zen-empty-tab'), 'First tab should be an empty tab');
+ Assert.equal(folder.tabs.length, 2, "Folder should contain the original tab");
+ ok(folder.tabs[0].hasAttribute("zen-empty-tab"), "First tab should be an empty tab");
folder.appendChild(tab2);
- Assert.equal(folder.tabs.length, 3, 'Folder should contain the second tab');
- ok(folder.tabs[0].hasAttribute('zen-empty-tab'), 'First tab should be an empty tab');
+ Assert.equal(folder.tabs.length, 3, "Folder should contain the second tab");
+ ok(folder.tabs[0].hasAttribute("zen-empty-tab"), "First tab should be an empty tab");
await removeFolder(folder);
});
diff --git a/src/zen/tests/folders/browser_folder_issue_9885.js b/src/zen/tests/folders/browser_folder_issue_9885.js
index a99234a2c..9d30e6aae 100644
--- a/src/zen/tests/folders/browser_folder_issue_9885.js
+++ b/src/zen/tests/folders/browser_folder_issue_9885.js
@@ -1,27 +1,27 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Issue_9885() {
const subfolder = await gZenFolders.createFolder([], {
renameFolder: false,
- label: 'subfolder',
+ label: "subfolder",
});
const parent = await gZenFolders.createFolder([], {
renameFolder: false,
- label: 'parent',
+ label: "parent",
});
parent.tabs[0].after(subfolder);
- Assert.equal(parent, subfolder.group, 'Parent folder is set correctly');
+ Assert.equal(parent, subfolder.group, "Parent folder is set correctly");
- ok(!subfolder.collapsed, 'Subfolder should not be collapsed by default');
- ok(!parent.collapsed, 'Parent folder should not be collapsed by default');
+ ok(!subfolder.collapsed, "Subfolder should not be collapsed by default");
+ ok(!parent.collapsed, "Parent folder should not be collapsed by default");
subfolder.labelElement.click();
- ok(subfolder.collapsed, 'Subfolder should be collapsed after clicking on it');
- ok(!parent.collapsed, 'Parent folder should be collapsed after clicking on subfolder');
+ ok(subfolder.collapsed, "Subfolder should be collapsed after clicking on it");
+ ok(!parent.collapsed, "Parent folder should be collapsed after clicking on subfolder");
await removeFolder(subfolder);
await removeFolder(parent);
diff --git a/src/zen/tests/folders/browser_folder_issue_9981.js b/src/zen/tests/folders/browser_folder_issue_9981.js
index f3d33be00..b09114d0f 100644
--- a/src/zen/tests/folders/browser_folder_issue_9981.js
+++ b/src/zen/tests/folders/browser_folder_issue_9981.js
@@ -1,40 +1,40 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Issue_9981() {
const selectedTab = gBrowser.selectedTab;
- const tab1 = BrowserTestUtils.addTab(gBrowser, 'about:blank');
- const tab2 = BrowserTestUtils.addTab(gBrowser, 'about:blank');
+ const tab1 = BrowserTestUtils.addTab(gBrowser, "about:blank");
+ const tab2 = BrowserTestUtils.addTab(gBrowser, "about:blank");
const folder = await gZenFolders.createFolder([tab1, tab2], {});
gBrowser.selectedTab = tab2;
gBrowser.addRangeToMultiSelectedTabs(tab1, tab2);
- ok(tab1.multiselected, 'Tab 1 should be multiselected');
- ok(tab2.multiselected, 'Tab 2 should be multiselected');
- Assert.equal(gBrowser.multiSelectedTabsCount, 2, 'There should be 2 multiselected tabs');
+ ok(tab1.multiselected, "Tab 1 should be multiselected");
+ ok(tab2.multiselected, "Tab 2 should be multiselected");
+ Assert.equal(gBrowser.multiSelectedTabsCount, 2, "There should be 2 multiselected tabs");
await new Promise((resolve) => setTimeout(resolve, 0));
- const collapseEvent = BrowserTestUtils.waitForEvent(window, 'TabGroupCollapse');
+ const collapseEvent = BrowserTestUtils.waitForEvent(window, "TabGroupCollapse");
EventUtils.synthesizeMouseAtCenter(folder.labelElement, {});
await collapseEvent;
gBrowser.clearMultiSelectedTabs();
gBrowser.selectedTab = selectedTab;
- Assert.equal(folder.activeTabs.length, 2, 'Folder should have 2 active tabs');
+ Assert.equal(folder.activeTabs.length, 2, "Folder should have 2 active tabs");
- ok(tab1.hasAttribute('folder-active'), 'Tab 1 should be in the active folder');
- ok(tab2.hasAttribute('folder-active'), 'Tab 2 should be in the active folder');
+ ok(tab1.hasAttribute("folder-active"), "Tab 1 should be in the active folder");
+ ok(tab2.hasAttribute("folder-active"), "Tab 2 should be in the active folder");
- const tab2ResetButton = tab2.querySelector('.tab-reset-button');
- tab2ResetButton.style.display = 'flex';
+ const tab2ResetButton = tab2.querySelector(".tab-reset-button");
+ tab2ResetButton.style.display = "flex";
EventUtils.synthesizeMouseAtCenter(tab2ResetButton, {});
- ok(tab1.hasAttribute('folder-active'), 'Tab 1 should be in the active folder');
- ok(!tab2.hasAttribute('folder-active'), 'Tab 2 should not be in the active folder');
+ ok(tab1.hasAttribute("folder-active"), "Tab 1 should be in the active folder");
+ ok(!tab2.hasAttribute("folder-active"), "Tab 2 should not be in the active folder");
await removeFolder(folder);
});
diff --git a/src/zen/tests/folders/browser_folder_level_checks.js b/src/zen/tests/folders/browser_folder_level_checks.js
index ac1ddeddf..63b6e13e7 100644
--- a/src/zen/tests/folders/browser_folder_level_checks.js
+++ b/src/zen/tests/folders/browser_folder_level_checks.js
@@ -1,21 +1,21 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Issue_9885() {
const subfolder = await gZenFolders.createFolder([], {
renameFolder: false,
- label: 'subfolder',
+ label: "subfolder",
});
const parent = await gZenFolders.createFolder([], {
renameFolder: false,
- label: 'parent',
+ label: "parent",
});
parent.tabs[0].after(subfolder);
- Assert.equal(parent.level, 0, 'Parent folder should be at level 0');
- Assert.equal(subfolder.level, 1, 'Subfolder should be at level 1');
+ Assert.equal(parent.level, 0, "Parent folder should be at level 0");
+ Assert.equal(subfolder.level, 1, "Subfolder should be at level 1");
await removeFolder(parent);
});
diff --git a/src/zen/tests/folders/browser_folder_max_subfolders.js b/src/zen/tests/folders/browser_folder_max_subfolders.js
index 38b488dbb..16725e2aa 100644
--- a/src/zen/tests/folders/browser_folder_max_subfolders.js
+++ b/src/zen/tests/folders/browser_folder_max_subfolders.js
@@ -1,7 +1,7 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
// Keep in sync with the default value for `zen.folders.max-subfolders`
const TEST_MAX_FOLDERS = 5;
@@ -11,13 +11,16 @@ add_task(async function test_Max_Subfolders() {
renameFolder: false,
});
- const subfolderItem = document.getElementById('context_zenFolderNewSubfolder');
- debugger;
+ const subfolderItem = document.getElementById("context_zenFolderNewSubfolder");
let currentFolder = folder;
for (let i = 1; i < TEST_MAX_FOLDERS; i++) {
await openFolderContextMenu(currentFolder);
- ok(subfolderItem.getAttribute('disabled') !== 'true', `Subfolder item should be enabled`);
- const folderCreateEvent = BrowserTestUtils.waitForEvent(window, 'TabGroupCreate');
+ Assert.notStrictEqual(
+ subfolderItem.getAttribute("disabled"),
+ "true",
+ `Subfolder item should be enabled`
+ );
+ const folderCreateEvent = BrowserTestUtils.waitForEvent(window, "TabGroupCreate");
EventUtils.synthesizeMouseAtCenter(subfolderItem, {});
await folderCreateEvent;
const items = currentFolder.allItems;
@@ -28,12 +31,12 @@ add_task(async function test_Max_Subfolders() {
await openFolderContextMenu(currentFolder);
Assert.equal(
- subfolderItem.getAttribute('disabled'),
- 'true',
+ subfolderItem.getAttribute("disabled"),
+ "true",
`Subfolder item should be disabled after reaching max subfolders`
);
- document.getElementById('zenFolderActions').hidePopup();
+ document.getElementById("zenFolderActions").hidePopup();
await removeFolder(folder);
});
diff --git a/src/zen/tests/folders/browser_folder_multiselected.js b/src/zen/tests/folders/browser_folder_multiselected.js
index 39a0659c2..6a31a5384 100644
--- a/src/zen/tests/folders/browser_folder_multiselected.js
+++ b/src/zen/tests/folders/browser_folder_multiselected.js
@@ -1,25 +1,25 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Folder_Multiselected_Tabs() {
const selectedTab = gBrowser.selectedTab;
- const tab1 = BrowserTestUtils.addTab(gBrowser, 'about:blank');
- const tab2 = BrowserTestUtils.addTab(gBrowser, 'about:blank');
+ const tab1 = BrowserTestUtils.addTab(gBrowser, "about:blank");
+ const tab2 = BrowserTestUtils.addTab(gBrowser, "about:blank");
const folder = await gZenFolders.createFolder([tab1], {});
gBrowser.addRangeToMultiSelectedTabs(tab1, tab2);
- ok(tab1.multiselected, 'Tab 1 should be multiselected');
- ok(tab2.multiselected, 'Tab 2 should be multiselected');
- Assert.greater(gBrowser.multiSelectedTabsCount, 1, 'There should be 2 multiselected tabs');
+ ok(tab1.multiselected, "Tab 1 should be multiselected");
+ ok(tab2.multiselected, "Tab 2 should be multiselected");
+ Assert.greater(gBrowser.multiSelectedTabsCount, 1, "There should be 2 multiselected tabs");
- const collapseEvent = BrowserTestUtils.waitForEvent(window, 'TabGroupCollapse');
+ const collapseEvent = BrowserTestUtils.waitForEvent(window, "TabGroupCollapse");
folder.collapsed = true;
await collapseEvent;
- ok(tab2.multiselected, 'Tab 2 should not be multiselected');
- Assert.equal(gBrowser.multiSelectedTabsCount, 3, 'There should be 3 multiselected tabs');
+ ok(tab2.multiselected, "Tab 2 should not be multiselected");
+ Assert.equal(gBrowser.multiSelectedTabsCount, 3, "There should be 3 multiselected tabs");
for (const t of [tab1, tab2]) {
BrowserTestUtils.removeTab(t);
diff --git a/src/zen/tests/folders/browser_folder_owner_tabs.js b/src/zen/tests/folders/browser_folder_owner_tabs.js
index 7af7c963a..01d0c1320 100644
--- a/src/zen/tests/folders/browser_folder_owner_tabs.js
+++ b/src/zen/tests/folders/browser_folder_owner_tabs.js
@@ -1,20 +1,20 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Duplicate_Tab_Inside_Folder() {
await SpecialPowers.pushPrefEnv({
- set: [['zen.folders.owned-tabs-in-folder', true]],
+ set: [["zen.folders.owned-tabs-in-folder", true]],
});
const selectedTab = gBrowser.selectedTab;
- const tab = BrowserTestUtils.addTab(gBrowser, 'about:blank');
+ const tab = BrowserTestUtils.addTab(gBrowser, "about:blank");
const folder = await gZenFolders.createFolder([tab], {
renameFolder: false,
});
gBrowser.selectedTab = tab;
const triggeringPrincipal = Services.scriptSecurityManager.getSystemPrincipal();
- gBrowser.addTab('https://example.com', {
+ gBrowser.addTab("https://example.com", {
tabIndex: undefined,
relatedToCurrent: true,
ownerTab: tab,
@@ -24,13 +24,14 @@ add_task(async function test_Duplicate_Tab_Inside_Folder() {
Assert.equal(
folder.tabs.length,
3,
- 'Folder contains the original tab and the two duplicated tabs'
+ "Folder contains the original tab and the two duplicated tabs"
);
+ /* eslint-disable mozilla/no-arbitrary-setTimeout */
await new Promise((resolve) => setTimeout(resolve, 100));
for (const t of folder.tabs) {
- ok(t.pinned, 'All tabs in the folder should be pinned');
+ ok(t.pinned, "All tabs in the folder should be pinned");
}
gBrowser.selectedTab = selectedTab;
@@ -40,16 +41,16 @@ add_task(async function test_Duplicate_Tab_Inside_Folder() {
add_task(async function test_Duplicate_Tab_Inside_Folder_Unpinned() {
await SpecialPowers.pushPrefEnv({
- set: [['zen.folders.owned-tabs-in-folder', false]],
+ set: [["zen.folders.owned-tabs-in-folder", false]],
});
const selectedTab = gBrowser.selectedTab;
- const tab = BrowserTestUtils.addTab(gBrowser, 'about:blank');
+ const tab = BrowserTestUtils.addTab(gBrowser, "about:blank");
const folder = await gZenFolders.createFolder([tab], {
renameFolder: false,
});
gBrowser.selectedTab = tab;
const triggeringPrincipal = Services.scriptSecurityManager.getSystemPrincipal();
- let newTab = gBrowser.addTab('https://example.com', {
+ let newTab = gBrowser.addTab("https://example.com", {
tabIndex: undefined,
relatedToCurrent: true,
ownerTab: tab,
@@ -59,10 +60,10 @@ add_task(async function test_Duplicate_Tab_Inside_Folder_Unpinned() {
Assert.equal(
folder.tabs.length,
2,
- 'Folder contains the original tab and the two duplicated tabs'
+ "Folder contains the original tab and the two duplicated tabs"
);
- ok(!newTab.group, 'New tab should not be grouped');
+ ok(!newTab.group, "New tab should not be grouped");
gBrowser.selectedTab = selectedTab;
BrowserTestUtils.removeTab(newTab);
diff --git a/src/zen/tests/folders/browser_folder_reset_button.js b/src/zen/tests/folders/browser_folder_reset_button.js
index 979824df9..256d27f21 100644
--- a/src/zen/tests/folders/browser_folder_reset_button.js
+++ b/src/zen/tests/folders/browser_folder_reset_button.js
@@ -1,40 +1,41 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Issue_() {
const selectedTab = gBrowser.selectedTab;
- const tab1 = BrowserTestUtils.addTab(gBrowser, 'about:blank');
- const tab2 = BrowserTestUtils.addTab(gBrowser, 'about:blank');
+ const tab1 = BrowserTestUtils.addTab(gBrowser, "about:blank");
+ const tab2 = BrowserTestUtils.addTab(gBrowser, "about:blank");
const folder = await gZenFolders.createFolder([tab1, tab2], {});
gBrowser.selectedTab = tab2;
gBrowser.addRangeToMultiSelectedTabs(tab1, tab2);
- ok(tab1.multiselected, 'Tab 1 should be multiselected');
- ok(tab2.multiselected, 'Tab 2 should be multiselected');
- Assert.equal(gBrowser.multiSelectedTabsCount, 2, 'There should be 2 multiselected tabs');
+ ok(tab1.multiselected, "Tab 1 should be multiselected");
+ ok(tab2.multiselected, "Tab 2 should be multiselected");
+ Assert.equal(gBrowser.multiSelectedTabsCount, 2, "There should be 2 multiselected tabs");
await new Promise((resolve) => setTimeout(resolve, 0));
- const collapseEvent = BrowserTestUtils.waitForEvent(window, 'TabGroupCollapse');
+ const collapseEvent = BrowserTestUtils.waitForEvent(window, "TabGroupCollapse");
EventUtils.synthesizeMouseAtCenter(folder.labelElement, {});
await collapseEvent;
gBrowser.clearMultiSelectedTabs();
gBrowser.selectedTab = selectedTab;
- Assert.equal(folder.activeTabs.length, 2, 'Folder should have 2 active tabs');
+ Assert.equal(folder.activeTabs.length, 2, "Folder should have 2 active tabs");
- ok(tab1.hasAttribute('folder-active'), 'Tab 1 should be in the active folder');
- ok(tab2.hasAttribute('folder-active'), 'Tab 2 should be in the active folder');
+ ok(tab1.hasAttribute("folder-active"), "Tab 1 should be in the active folder");
+ ok(tab2.hasAttribute("folder-active"), "Tab 2 should be in the active folder");
EventUtils.synthesizeMouseAtCenter(folder.resetButton, {});
await new Promise((resolve) =>
+ /* eslint-disable mozilla/no-arbitrary-setTimeout */
setTimeout(() => {
- ok(!tab1.hasAttribute('folder-active'), 'Tab 1 should not be in the active folder');
- ok(!tab2.hasAttribute('folder-active'), 'Tab 2 should not be in the active folder');
+ ok(!tab1.hasAttribute("folder-active"), "Tab 1 should not be in the active folder");
+ ok(!tab2.hasAttribute("folder-active"), "Tab 2 should not be in the active folder");
resolve();
}, 500)
);
diff --git a/src/zen/tests/folders/browser_folder_subfolder.js b/src/zen/tests/folders/browser_folder_subfolder.js
index c216cef93..330773cf2 100644
--- a/src/zen/tests/folders/browser_folder_subfolder.js
+++ b/src/zen/tests/folders/browser_folder_subfolder.js
@@ -1,28 +1,28 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Create_Folder() {
- const tab = BrowserTestUtils.addTab(gBrowser, 'data:text/html,tab1');
- const tab2 = BrowserTestUtils.addTab(gBrowser, 'data:text/html,tab2');
+ const tab = BrowserTestUtils.addTab(gBrowser, "data:text/html,tab1");
+ const tab2 = BrowserTestUtils.addTab(gBrowser, "data:text/html,tab2");
const subfolder = await gZenFolders.createFolder([tab], {
renameFolder: false,
- label: 'subfolder',
+ label: "subfolder",
});
const parent = await gZenFolders.createFolder([tab2], {
renameFolder: false,
- label: 'parent',
+ label: "parent",
});
parent.tabs[0].after(subfolder);
- Assert.equal(parent, subfolder.group, 'Parent folder is set correctly');
+ Assert.equal(parent, subfolder.group, "Parent folder is set correctly");
Assert.equal(
subfolder.tabs.length,
2,
- 'Subfolder contains the tab and the empty tab created by Zen Folders'
+ "Subfolder contains the tab and the empty tab created by Zen Folders"
);
- Assert.equal(parent.tabs.length, 4, 'Parent folder contains the subfolder');
+ Assert.equal(parent.tabs.length, 4, "Parent folder contains the subfolder");
await removeFolder(subfolder);
await removeFolder(parent);
});
diff --git a/src/zen/tests/folders/browser_folder_visible_tabs.js b/src/zen/tests/folders/browser_folder_visible_tabs.js
index 45ca8210d..99beb7d35 100644
--- a/src/zen/tests/folders/browser_folder_visible_tabs.js
+++ b/src/zen/tests/folders/browser_folder_visible_tabs.js
@@ -1,47 +1,47 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Not_Visible_Collapsed() {
- const tab = BrowserTestUtils.addTab(gBrowser, 'data:text/html,tab1');
+ const tab = BrowserTestUtils.addTab(gBrowser, "data:text/html,tab1");
const folder = await gZenFolders.createFolder([tab]);
Assert.equal(
folder.tabs.length,
2,
- 'Subfolder contains the tab and the empty tab created by Zen Folders'
+ "Subfolder contains the tab and the empty tab created by Zen Folders"
);
- ok(tab.visible, 'Tab is visible in the folder');
+ ok(tab.visible, "Tab is visible in the folder");
folder.collapsed = true;
- ok(!tab.visible, 'Tab is not visible in the folder when collapsed');
+ ok(!tab.visible, "Tab is not visible in the folder when collapsed");
await removeFolder(folder);
});
add_task(async function test_Visible_Selected() {
const originalTab = gBrowser.selectedTab;
- const tab = BrowserTestUtils.addTab(gBrowser, 'data:text/html,tab1');
+ const tab = BrowserTestUtils.addTab(gBrowser, "data:text/html,tab1");
const folder = await gZenFolders.createFolder([tab]);
Assert.equal(
folder.tabs.length,
2,
- 'Subfolder contains the tab and the empty tab created by Zen Folders'
+ "Subfolder contains the tab and the empty tab created by Zen Folders"
);
- ok(tab.visible, 'Tab is visible in the folder');
+ ok(tab.visible, "Tab is visible in the folder");
gBrowser.selectedTab = tab;
folder.collapsed = true;
- ok(tab.visible, 'Tab is visible in the folder when collapsed');
- ok(tab.hasAttribute('folder-active'), 'Tab is marked as active in the folder when selected');
+ ok(tab.visible, "Tab is visible in the folder when collapsed");
+ ok(tab.hasAttribute("folder-active"), "Tab is marked as active in the folder when selected");
ok(
- tab.group.hasAttribute('has-active'),
- 'Tab group is marked as active when the tab is selected'
+ tab.group.hasAttribute("has-active"),
+ "Tab group is marked as active when the tab is selected"
);
Assert.deepEqual(
tab.group.activeTabs,
[tab],
- 'Tab is included in the active tabs of the group when selected'
+ "Tab is included in the active tabs of the group when selected"
);
gBrowser.selectedTab = originalTab;
@@ -50,28 +50,28 @@ add_task(async function test_Visible_Selected() {
add_task(async function test_Visible_Not_Selected() {
const originalTab = gBrowser.selectedTab;
- const tab = BrowserTestUtils.addTab(gBrowser, 'data:text/html,tab1');
+ const tab = BrowserTestUtils.addTab(gBrowser, "data:text/html,tab1");
const folder = await gZenFolders.createFolder([tab]);
Assert.equal(
folder.tabs.length,
2,
- 'Subfolder contains the tab and the empty tab created by Zen Folders'
+ "Subfolder contains the tab and the empty tab created by Zen Folders"
);
- ok(tab.visible, 'Tab is visible in the folder');
+ ok(tab.visible, "Tab is visible in the folder");
gBrowser.selectedTab = tab;
folder.collapsed = true;
gBrowser.selectedTab = originalTab;
- ok(tab.visible, 'Tab is visible in the folder when collapsed');
- ok(tab.hasAttribute('folder-active'), 'Tab is marked as active in the folder when selected');
+ ok(tab.visible, "Tab is visible in the folder when collapsed");
+ ok(tab.hasAttribute("folder-active"), "Tab is marked as active in the folder when selected");
ok(
- tab.group.hasAttribute('has-active'),
- 'Tab group is marked as active when the tab is selected'
+ tab.group.hasAttribute("has-active"),
+ "Tab group is marked as active when the tab is selected"
);
Assert.deepEqual(
tab.group.activeTabs,
[tab],
- 'Tab is included in the active tabs of the group when selected'
+ "Tab is included in the active tabs of the group when selected"
);
await removeFolder(folder);
diff --git a/src/zen/tests/folders/head.js b/src/zen/tests/folders/head.js
index 4864c9bd2..a5fbc5f12 100644
--- a/src/zen/tests/folders/head.js
+++ b/src/zen/tests/folders/head.js
@@ -1,25 +1,27 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
async function removeFolder(folder) {
- if (!folder) return;
- const removeEvent = BrowserTestUtils.waitForEvent(folder, 'TabGroupRemoved');
+ if (!folder) {
+ return;
+ }
+ const removeEvent = BrowserTestUtils.waitForEvent(folder, "TabGroupRemoved");
folder.delete();
await removeEvent;
}
async function openFolderContextMenu(folder) {
- const popup = document.getElementById('zenFolderActions');
- let menuEvent = BrowserTestUtils.waitForEvent(popup, 'popupshown');
+ const popup = document.getElementById("zenFolderActions");
+ let menuEvent = BrowserTestUtils.waitForEvent(popup, "popupshown");
EventUtils.synthesizeMouseAtCenter(folder.labelElement, {
- type: 'contextmenu',
+ type: "contextmenu",
});
await menuEvent;
}
-async function addTabTo(targetBrowser, url = 'http://mochi.test:8888/', params = {}) {
+async function addTabTo(targetBrowser, url = "http://mochi.test:8888/", params = {}) {
params.skipAnimation = true;
const tab = BrowserTestUtils.addTab(targetBrowser, url, params);
const browser = targetBrowser.getBrowserForTab(tab);
diff --git a/src/zen/tests/glance/browser_glance_basic.js b/src/zen/tests/glance/browser_glance_basic.js
index 881a26c86..1e055eb19 100644
--- a/src/zen/tests/glance/browser_glance_basic.js
+++ b/src/zen/tests/glance/browser_glance_basic.js
@@ -1,13 +1,13 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Glance_Basic_Open() {
await openGlanceOnTab(async (glanceTab) => {
ok(
- glanceTab.hasAttribute('zen-glance-tab'),
- 'The glance tab should have the zen-glance-tab attribute'
+ glanceTab.hasAttribute("zen-glance-tab"),
+ "The glance tab should have the zen-glance-tab attribute"
);
});
});
diff --git a/src/zen/tests/glance/browser_glance_close.js b/src/zen/tests/glance/browser_glance_close.js
index d9735d4be..5c65a0ee9 100644
--- a/src/zen/tests/glance/browser_glance_close.js
+++ b/src/zen/tests/glance/browser_glance_close.js
@@ -1,24 +1,25 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Glance_Basic_Close() {
const currentTab = gBrowser.selectedTab;
await openGlanceOnTab(async (glanceTab) => {
ok(
- currentTab.hasAttribute('glance-id'),
- 'The glance tab should have the zen-glance-tab attribute'
+ currentTab.hasAttribute("glance-id"),
+ "The glance tab should have the zen-glance-tab attribute"
);
await BrowserTestUtils.removeTab(glanceTab);
await new Promise((resolve) => {
+ /* eslint-disable mozilla/no-arbitrary-setTimeout */
setTimeout(() => {
resolve();
}, 1000);
});
ok(
- !currentTab.hasAttribute('glance-id'),
- 'The glance tab should not have the zen-glance-tab attribute'
+ !currentTab.hasAttribute("glance-id"),
+ "The glance tab should not have the zen-glance-tab attribute"
);
await BrowserTestUtils.removeTab(glanceTab);
}, false);
diff --git a/src/zen/tests/glance/browser_glance_close_select.js b/src/zen/tests/glance/browser_glance_close_select.js
index e073ec53a..7e43720c3 100644
--- a/src/zen/tests/glance/browser_glance_close_select.js
+++ b/src/zen/tests/glance/browser_glance_close_select.js
@@ -1,13 +1,13 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
async function openAndCloseGlance() {
await openGlanceOnTab(async (glanceTab) => {
ok(
- glanceTab.hasAttribute('zen-glance-tab'),
- 'The glance tab should have the zen-glance-tab attribute'
+ glanceTab.hasAttribute("zen-glance-tab"),
+ "The glance tab should have the zen-glance-tab attribute"
);
});
}
@@ -15,20 +15,20 @@ async function openAndCloseGlance() {
add_task(async function test_Glance_Close_No_Tabs() {
const currentTab = gBrowser.selectedTab;
await openAndCloseGlance();
- Assert.equal(gBrowser.selectedTab, currentTab, 'The original tab should be selected');
- ok(currentTab.selected, 'The original tab should be visually selected');
+ Assert.equal(gBrowser.selectedTab, currentTab, "The original tab should be selected");
+ ok(currentTab.selected, "The original tab should be visually selected");
});
add_task(async function test_Glance_Close_With_Next_Tab() {
const originalTab = gBrowser.selectedTab;
await BrowserTestUtils.withNewTab(
- { url: 'http://example.com', gBrowser, waitForLoad: false },
+ { url: "https://example.com", gBrowser, waitForLoad: false },
async function () {
const selectedTab = gBrowser.selectedTab;
- Assert.notEqual(selectedTab, originalTab, 'A new tab should be selected');
+ Assert.notEqual(selectedTab, originalTab, "A new tab should be selected");
await openAndCloseGlance();
- Assert.equal(gBrowser.selectedTab, selectedTab, 'The new tab should still be selected');
- ok(selectedTab.selected, 'The new tab should be visually selected');
+ Assert.equal(gBrowser.selectedTab, selectedTab, "The new tab should still be selected");
+ ok(selectedTab.selected, "The new tab should be visually selected");
gBrowser.selectedTab = originalTab;
}
diff --git a/src/zen/tests/glance/browser_glance_expand.js b/src/zen/tests/glance/browser_glance_expand.js
index 59ad25379..0c29cb70a 100644
--- a/src/zen/tests/glance/browser_glance_expand.js
+++ b/src/zen/tests/glance/browser_glance_expand.js
@@ -1,24 +1,25 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Glance_Basic_Open() {
const selectedTab = gBrowser.selectedTab;
await openGlanceOnTab(async (glanceTab) => {
await gZenGlanceManager.fullyOpenGlance();
ok(
- !glanceTab.hasAttribute('zen-glance-tab'),
- 'The glance tab should not have the zen-glance-tab attribute'
+ !glanceTab.hasAttribute("zen-glance-tab"),
+ "The glance tab should not have the zen-glance-tab attribute"
);
- ok(
- gBrowser.tabs.filter((tab) => tab.hasAttribute('zen-glance-tab')).length === 0,
- 'There should be no zen-glance-tab attribute on any tab'
+ Assert.strictEqual(
+ gBrowser.tabs.filter((tab) => tab.hasAttribute("zen-glance-tab")).length,
+ 0,
+ "There should be no zen-glance-tab attribute on any tab"
);
Assert.greater(
glanceTab._tPos,
selectedTab._tPos,
- 'The glance tab should be on the right of the selected tab'
+ "The glance tab should be on the right of the selected tab"
);
BrowserTestUtils.removeTab(glanceTab);
}, false);
@@ -27,7 +28,7 @@ add_task(async function test_Glance_Basic_Open() {
add_task(async function test_Glance_Open_Sibling() {
const tabsToRemove = [];
for (let i = 0; i < 5; i++) {
- await BrowserTestUtils.openNewForegroundTab(window.gBrowser, 'https://example.com/', true);
+ await BrowserTestUtils.openNewForegroundTab(window.gBrowser, "https://example.com/", true);
tabsToRemove.push(gBrowser.selectedTab);
}
@@ -39,7 +40,7 @@ add_task(async function test_Glance_Open_Sibling() {
Assert.equal(
glanceTab._tPos,
selectedTab._tPos + 1,
- 'The glance tab should be on the right of the selected tab'
+ "The glance tab should be on the right of the selected tab"
);
BrowserTestUtils.removeTab(glanceTab);
}, false);
@@ -52,7 +53,7 @@ add_task(async function test_Glance_Open_Sibling() {
add_task(async function test_Glance_Basic_Open() {
const tabsToRemove = [];
for (let i = 0; i < 3; i++) {
- await BrowserTestUtils.openNewForegroundTab(window.gBrowser, 'https://example.com/', true);
+ await BrowserTestUtils.openNewForegroundTab(window.gBrowser, "https://example.com/", true);
gBrowser.pinTab(gBrowser.selectedTab);
tabsToRemove.push(gBrowser.selectedTab);
}
@@ -64,7 +65,7 @@ add_task(async function test_Glance_Basic_Open() {
Assert.equal(
glanceTab,
gBrowser.visibleTabs.find((tab) => !tab.pinned),
- 'The glance tab should be the first normal tab (Ignoring empty tabs)'
+ "The glance tab should be the first normal tab (Ignoring empty tabs)"
);
BrowserTestUtils.removeTab(glanceTab);
}, false);
@@ -75,17 +76,18 @@ add_task(async function test_Glance_Basic_Open() {
});
add_task(async function test_Glance_New_From_essential() {
- ok(true, 'todo:');
+ ok(true, "todo:");
return; // TODO: Fix this test, it currently fails
- await BrowserTestUtils.withNewTab({ gBrowser, url: 'https://example.com/' }, async (browser) => {
+ /* eslint-disable no-unreachable, no-unused-vars */
+ await BrowserTestUtils.withNewTab({ gBrowser, url: "https://example.com/" }, async (browser) => {
const selectedTab = gBrowser.selectedTab;
gZenPinnedTabManager.addToEssentials(selectedTab);
await openGlanceOnTab(async (glanceTab) => {
await gZenGlanceManager.fullyOpenGlance();
- ok(!glanceTab.pinned, 'The glance tab should not be pinned');
+ ok(!glanceTab.pinned, "The glance tab should not be pinned");
ok(
- !glanceTab.parentNode.hasAttribute('container'),
- 'The glance tab should not be in an essentials container'
+ !glanceTab.parentNode.hasAttribute("container"),
+ "The glance tab should not be in an essentials container"
);
await BrowserTestUtils.removeTab(gBrowser.selectedTab);
await BrowserTestUtils.removeTab(glanceTab);
diff --git a/src/zen/tests/glance/browser_glance_next_tab.js b/src/zen/tests/glance/browser_glance_next_tab.js
index a5ca0fe92..50e102a60 100644
--- a/src/zen/tests/glance/browser_glance_next_tab.js
+++ b/src/zen/tests/glance/browser_glance_next_tab.js
@@ -1,11 +1,11 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Glance_Next_Tab() {
const tabToCheck = gBrowser.selectedTab;
- await BrowserTestUtils.openNewForegroundTab(window.gBrowser, 'https://example.com/', true, {
+ await BrowserTestUtils.openNewForegroundTab(window.gBrowser, "https://example.com/", true, {
skipAnimation: true,
});
await openGlanceOnTab(async (glanceTab) => {
@@ -14,7 +14,7 @@ add_task(async function test_Glance_Next_Tab() {
gBrowser.selectedTab = glanceTab;
await new Promise((resolve) => {
setTimeout(() => {
- Assert.equal(nextTab, tabToCheck, 'Next glance tab should equal');
+ Assert.equal(nextTab, tabToCheck, "Next glance tab should equal");
resolve();
});
});
diff --git a/src/zen/tests/glance/browser_glance_prev_tab.js b/src/zen/tests/glance/browser_glance_prev_tab.js
index 762e944db..d669b721b 100644
--- a/src/zen/tests/glance/browser_glance_prev_tab.js
+++ b/src/zen/tests/glance/browser_glance_prev_tab.js
@@ -1,11 +1,11 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Glance_Prev_Tab() {
await openGlanceOnTab(async (glanceTab) => {
- await BrowserTestUtils.openNewForegroundTab(window.gBrowser, 'https://example.com/', true, {
+ await BrowserTestUtils.openNewForegroundTab(window.gBrowser, "https://example.com/", true, {
skipAnimation: true,
});
const tabToCheck = gBrowser.selectedTab;
@@ -15,7 +15,7 @@ add_task(async function test_Glance_Prev_Tab() {
gBrowser.selectedTab = glanceTab;
await new Promise((resolve) => {
setTimeout(() => {
- Assert.equal(prevTab, tabToCheck, 'Previous glance tab should equal');
+ Assert.equal(prevTab, tabToCheck, "Previous glance tab should equal");
resolve();
});
});
diff --git a/src/zen/tests/glance/browser_glance_select_parent.js b/src/zen/tests/glance/browser_glance_select_parent.js
index 29b55ac62..7f6d6a3e5 100644
--- a/src/zen/tests/glance/browser_glance_select_parent.js
+++ b/src/zen/tests/glance/browser_glance_select_parent.js
@@ -1,15 +1,15 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Glance_Select_Parent() {
await openGlanceOnTab(async (glanceTab) => {
ok(
- glanceTab.hasAttribute('zen-glance-tab'),
- 'The glance tab should have the zen-glance-tab attribute'
+ glanceTab.hasAttribute("zen-glance-tab"),
+ "The glance tab should have the zen-glance-tab attribute"
);
- await BrowserTestUtils.openNewForegroundTab(window.gBrowser, 'https://example.com/', true, {
+ await BrowserTestUtils.openNewForegroundTab(window.gBrowser, "https://example.com/", true, {
skipAnimation: true,
});
const tabToRemove = gBrowser.selectedTab;
@@ -17,7 +17,7 @@ add_task(async function test_Glance_Select_Parent() {
await BrowserTestUtils.waitForCondition(() => {
return glanceTab.selected;
});
- ok(true, 'The glance tab should be selected');
+ ok(true, "The glance tab should be selected");
await BrowserTestUtils.removeTab(tabToRemove);
});
});
diff --git a/src/zen/tests/glance/head.js b/src/zen/tests/glance/head.js
index 2d884456e..59f742585 100644
--- a/src/zen/tests/glance/head.js
+++ b/src/zen/tests/glance/head.js
@@ -3,7 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
const { openGlanceOnTab: internalGlanceHandle } = ChromeUtils.importESModule(
- 'resource://testing-common/GlanceTestUtils.sys.mjs'
+ "resource://testing-common/GlanceTestUtils.sys.mjs"
);
function openGlanceOnTab(callback, close = true) {
diff --git a/src/zen/tests/mochitests/reportbrokensite/head.js b/src/zen/tests/mochitests/reportbrokensite/head.js
index 04357acad..acc04fc92 100644
--- a/src/zen/tests/mochitests/reportbrokensite/head.js
+++ b/src/zen/tests/mochitests/reportbrokensite/head.js
@@ -601,6 +601,7 @@ class ReportBrokenSiteHelper {
}
}
+
class MenuHelper {
menuDescription = undefined;
@@ -696,6 +697,7 @@ class MenuHelper {
}
}
+
class AppMenuHelper extends MenuHelper {
menuDescription = "AppMenu";
@@ -718,6 +720,7 @@ class AppMenuHelper extends MenuHelper {
}
}
+
class HelpMenuHelper extends MenuHelper {
menuDescription = "Help Menu";
@@ -786,6 +789,7 @@ class HelpMenuHelper extends MenuHelper {
}
}
+
class ProtectionsPanelHelper extends MenuHelper {
menuDescription = "Protections Panel";
diff --git a/src/zen/tests/mochitests/reportbrokensite/send_more_info.js b/src/zen/tests/mochitests/reportbrokensite/send_more_info.js
index f5d28248d..8907d4fdb 100644
--- a/src/zen/tests/mochitests/reportbrokensite/send_more_info.js
+++ b/src/zen/tests/mochitests/reportbrokensite/send_more_info.js
@@ -15,6 +15,7 @@ Services.scriptloader.loadSubScript(
this
);
+// eslint-disable-next-line complexity
async function reformatExpectedWebCompatInfo(tab, overrides) {
const gfxInfo = Cc["@mozilla.org/gfx/info;1"].getService(Ci.nsIGfxInfo);
const snapshot = await Troubleshoot.snapshot();
diff --git a/src/zen/tests/mochitests/safebrowsing/browser_bug400731.js b/src/zen/tests/mochitests/safebrowsing/browser_bug400731.js
index e3861bc7a..a93661289 100644
--- a/src/zen/tests/mochitests/safebrowsing/browser_bug400731.js
+++ b/src/zen/tests/mochitests/safebrowsing/browser_bug400731.js
@@ -11,7 +11,7 @@ add_task(async function testMalware() {
await BrowserTestUtils.openNewForegroundTab(gBrowser, "about:blank");
- const url = "http://www.itisatrap.org/firefox/its-an-attack.html";
+ const url = "https://www.itisatrap.org/firefox/its-an-attack.html";
BrowserTestUtils.startLoadingURIString(gBrowser.selectedBrowser, url);
await BrowserTestUtils.browserLoaded(
gBrowser.selectedBrowser,
@@ -28,7 +28,7 @@ add_task(async function testUnwanted() {
Services.prefs.setBoolPref("browser.safebrowsing.allowOverride", false);
// Now launch the unwanted software test
- const url = "http://www.itisatrap.org/firefox/unwanted.html";
+ const url = "https://www.itisatrap.org/firefox/unwanted.html";
BrowserTestUtils.startLoadingURIString(gBrowser.selectedBrowser, url);
await BrowserTestUtils.browserLoaded(
gBrowser.selectedBrowser,
@@ -49,7 +49,7 @@ add_task(async function testPhishing() {
Services.prefs.setBoolPref("browser.safebrowsing.allowOverride", true);
// Now launch the phishing test
- const url = "http://www.itisatrap.org/firefox/its-a-trap.html";
+ const url = "https://www.itisatrap.org/firefox/its-a-trap.html";
BrowserTestUtils.startLoadingURIString(gBrowser.selectedBrowser, url);
await BrowserTestUtils.browserLoaded(
gBrowser.selectedBrowser,
diff --git a/src/zen/tests/mochitests/safebrowsing/browser_bug415846.js b/src/zen/tests/mochitests/safebrowsing/browser_bug415846.js
index 8cd2ee36f..a90e1deac 100644
--- a/src/zen/tests/mochitests/safebrowsing/browser_bug415846.js
+++ b/src/zen/tests/mochitests/safebrowsing/browser_bug415846.js
@@ -4,8 +4,8 @@ menu items.
Mac makes this astonishingly painful to test since their help menu is special magic,
but we can at least test it on the other platforms.*/
-const NORMAL_PAGE = "http://example.com";
-const PHISH_PAGE = "http://www.itisatrap.org/firefox/its-a-trap.html";
+const NORMAL_PAGE = "https://example.com";
+const PHISH_PAGE = "https://www.itisatrap.org/firefox/its-a-trap.html";
/**
* Opens a new tab and browses to some URL, tests for the existence
@@ -13,14 +13,13 @@ const PHISH_PAGE = "http://www.itisatrap.org/firefox/its-a-trap.html";
* the state of the menu once opened. This function will take care of
* opening and closing the menu.
*
- * @param url (string)
- * The URL to browse the tab to.
- * @param testFn (function)
+ * @param {string} url The URL to browse the tab to.
+ * @param {Function} testFn
* The function to run once the menu has been opened. This
* function will be passed the "reportMenu" and "errorMenu"
* DOM nodes as arguments, in that order. This function
* should not yield anything.
- * @returns Promise
+ * @returns {Promise} Promise that resolves when the test is complete
*/
function check_menu_at_page(url, testFn) {
return BrowserTestUtils.withNewTab(
diff --git a/src/zen/tests/mochitests/safebrowsing/browser_whitelisted.js b/src/zen/tests/mochitests/safebrowsing/browser_whitelisted.js
index eb217d618..3d74d7a36 100644
--- a/src/zen/tests/mochitests/safebrowsing/browser_whitelisted.js
+++ b/src/zen/tests/mochitests/safebrowsing/browser_whitelisted.js
@@ -1,7 +1,7 @@
/* Ensure that hostnames in the whitelisted pref are not blocked. */
const PREF_WHITELISTED_HOSTNAMES = "urlclassifier.skipHostnames";
-const TEST_PAGE = "http://www.itisatrap.org/firefox/its-an-attack.html";
+const TEST_PAGE = "https://www.itisatrap.org/firefox/its-an-attack.html";
var tabbrowser = null;
registerCleanupFunction(function () {
diff --git a/src/zen/tests/mochitests/safebrowsing/head.js b/src/zen/tests/mochitests/safebrowsing/head.js
index ffbdb18d1..f0ce5ad16 100644
--- a/src/zen/tests/mochitests/safebrowsing/head.js
+++ b/src/zen/tests/mochitests/safebrowsing/head.js
@@ -6,15 +6,10 @@ const PHISH_URL = "https://www.itisatrap.org/firefox/its-a-trap.html";
* Waits for a load (or custom) event to finish in a given tab. If provided
* load an uri into the tab.
*
- * @param tab
- * The tab to load into.
- * @param [optional] url
- * The url to load, or the current url.
- * @param [optional] event
- * The load event type to wait for. Defaults to "load".
- * @return {Promise} resolved when the event is handled.
- * @resolves to the received event
- * @rejects if a valid load event is not received within a meaningful interval
+ * @param {MozTabbrowserTab} tab The tab to load into.
+ * @param {string} [url] The url to load, or the current url.
+ * @param {string} [eventType] The load event type to wait for. Defaults to "load".
+ * @returns {Promise} Promise resolved when the event is handled.
*/
function promiseTabLoadEvent(tab, url, eventType = "load") {
info(`Wait tab event: ${eventType}`);
diff --git a/src/zen/tests/mochitests/shell/unit/test_macOS_showSecurityPreferences.js b/src/zen/tests/mochitests/shell/unit/test_macOS_showSecurityPreferences.js
index 3b9837aac..0c8c7f00c 100644
--- a/src/zen/tests/mochitests/shell/unit/test_macOS_showSecurityPreferences.js
+++ b/src/zen/tests/mochitests/shell/unit/test_macOS_showSecurityPreferences.js
@@ -36,5 +36,6 @@ add_task(async function test_prefsOpen() {
);
shellSvc.showSecurityPreferences("Privacy_AllFiles");
+ // eslint-disable-next-line no-undef
equal(killSystemPreferences(), 0, "Ensure System Preferences was started");
});
diff --git a/src/zen/tests/mochitests/tooltiptext/browser_bug581947.js b/src/zen/tests/mochitests/tooltiptext/browser_bug581947.js
index 097173547..258a78c2f 100644
--- a/src/zen/tests/mochitests/tooltiptext/browser_bug581947.js
+++ b/src/zen/tests/mochitests/tooltiptext/browser_bug581947.js
@@ -2,6 +2,7 @@ function check(aBrowser, aElementName, aBarred, aType) {
return SpecialPowers.spawn(
aBrowser,
[[aElementName, aBarred, aType]],
+ // eslint-disable-next-line no-shadow
async function ([aElementName, aBarred, aType]) {
let e = content.document.createElement(aElementName);
let contentElement = content.document.getElementById("content");
@@ -55,6 +56,7 @@ function todo_check(aBrowser, aElementName, aBarred) {
return SpecialPowers.spawn(
aBrowser,
[[aElementName, aBarred]],
+ // eslint-disable-next-line no-shadow
async function ([aElementName]) {
let e = content.document.createElement(aElementName);
let contentElement = content.document.getElementById("content");
@@ -63,6 +65,7 @@ function todo_check(aBrowser, aElementName, aBarred) {
let caught = false;
try {
e.setCustomValidity("foo");
+ // eslint-disable-next-line no-shadow
} catch (e) {
caught = true;
}
diff --git a/src/zen/tests/mochitests/tooltiptext/browser_input_file_tooltips.js b/src/zen/tests/mochitests/tooltiptext/browser_input_file_tooltips.js
index 2f1385f37..12c468923 100644
--- a/src/zen/tests/mochitests/tooltiptext/browser_input_file_tooltips.js
+++ b/src/zen/tests/mochitests/tooltiptext/browser_input_file_tooltips.js
@@ -42,6 +42,7 @@ async function do_test(test) {
);
info("creating input field");
+ // eslint-disable-next-line no-shadow
await SpecialPowers.spawn(tab.linkedBrowser, [test], async function (test) {
let doc = content.document;
let input = doc.createElement("input");
diff --git a/src/zen/tests/pinned/browser_issue_8726.js b/src/zen/tests/pinned/browser_issue_8726.js
index 79bbee3ca..433a2baed 100644
--- a/src/zen/tests/pinned/browser_issue_8726.js
+++ b/src/zen/tests/pinned/browser_issue_8726.js
@@ -1,14 +1,14 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
const { TabStateFlusher } = ChromeUtils.importESModule(
- 'resource:///modules/sessionstore/TabStateFlusher.sys.mjs'
+ "resource:///modules/sessionstore/TabStateFlusher.sys.mjs"
);
async function makeNewEmptyTab() {
- let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, 'about:blank');
+ let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "about:blank");
gBrowser.selectedTab = tab;
return tab;
}
@@ -17,20 +17,20 @@ add_task(async function test_Restore_Pinned_Tab() {
await BrowserTestUtils.withNewTab(
{
gBrowser,
- url: 'https://example.com/',
+ url: "https://example.com/",
},
async function (browser) {
let tab = gBrowser.getTabForBrowser(browser);
gBrowser.pinTab(tab);
- ok(tab.pinned, 'The tab should be pinned after being created');
+ ok(tab.pinned, "The tab should be pinned after being created");
await BrowserTestUtils.removeTab(tab);
await TabStateFlusher.flushWindow(window);
SessionWindowUI.restoreLastClosedTabOrWindowOrSession(window);
tab = gBrowser.selectedTab;
- ok(tab.pinned, 'The tab should be pinned after restore');
+ ok(tab.pinned, "The tab should be pinned after restore");
ok(
- tab.parentElement.closest('.zen-workspace-pinned-tabs-section'),
- 'The tab should be in the pinned tabs section after restore'
+ tab.parentElement.closest(".zen-workspace-pinned-tabs-section"),
+ "The tab should be in the pinned tabs section after restore"
);
await makeNewEmptyTab();
await BrowserTestUtils.removeTab(tab);
@@ -42,23 +42,23 @@ add_task(async function test_Restore_Essential_Tab() {
await BrowserTestUtils.withNewTab(
{
gBrowser,
- url: 'https://example.com/',
+ url: "https://example.com/",
},
async function (browser) {
let tab = gBrowser.getTabForBrowser(browser);
gZenPinnedTabManager.addToEssentials(tab);
ok(
- tab.hasAttribute('zen-essential'),
- 'The tab should be marked as essential after being created'
+ tab.hasAttribute("zen-essential"),
+ "The tab should be marked as essential after being created"
);
await BrowserTestUtils.removeTab(tab);
await TabStateFlusher.flushWindow(window);
SessionWindowUI.restoreLastClosedTabOrWindowOrSession(window);
tab = gBrowser.selectedTab;
- ok(tab.hasAttribute('zen-essential'), 'The tab should be marked as essential after restore');
+ ok(tab.hasAttribute("zen-essential"), "The tab should be marked as essential after restore");
ok(
- tab.parentElement.closest('.zen-essentials-container'),
- 'The tab should be in the essentials tabs section after restore'
+ tab.parentElement.closest(".zen-essentials-container"),
+ "The tab should be in the essentials tabs section after restore"
);
await BrowserTestUtils.removeTab(tab);
}
diff --git a/src/zen/tests/pinned/browser_pinned_changed.js b/src/zen/tests/pinned/browser_pinned_changed.js
index f2ffb466f..57426c450 100644
--- a/src/zen/tests/pinned/browser_pinned_changed.js
+++ b/src/zen/tests/pinned/browser_pinned_changed.js
@@ -1,7 +1,7 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Changed_Pinned() {
let resolvePromise;
@@ -9,18 +9,18 @@ add_task(async function test_Changed_Pinned() {
resolvePromise = resolve;
});
- await BrowserTestUtils.withNewTab({ gBrowser, url: 'https://example.com/1' }, async (browser) => {
+ await BrowserTestUtils.withNewTab({ gBrowser, url: "https://example.com/1" }, async (browser) => {
const tab = gBrowser.getTabForBrowser(browser);
gBrowser.pinTab(tab);
- ok(tab.pinned, 'The tab should be pinned after calling gBrowser.pinTab()');
+ ok(tab.pinned, "The tab should be pinned after calling gBrowser.pinTab()");
- BrowserTestUtils.startLoadingURIString(browser, 'https://example.com/2');
- await BrowserTestUtils.browserLoaded(browser, false, 'https://example.com/2');
+ BrowserTestUtils.startLoadingURIString(browser, "https://example.com/2");
+ await BrowserTestUtils.browserLoaded(browser, false, "https://example.com/2");
setTimeout(() => {
ok(
- tab.hasAttribute('zen-pinned-changed'),
- 'The tab should have a zen-pinned-changed attribute after being pinned'
+ tab.hasAttribute("zen-pinned-changed"),
+ "The tab should have a zen-pinned-changed attribute after being pinned"
);
resolvePromise();
}, 0);
diff --git a/src/zen/tests/pinned/browser_pinned_close.js b/src/zen/tests/pinned/browser_pinned_close.js
index b283a8c10..55b56fc8e 100644
--- a/src/zen/tests/pinned/browser_pinned_close.js
+++ b/src/zen/tests/pinned/browser_pinned_close.js
@@ -1,11 +1,11 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Unload_NoReset_Pinned() {
await SpecialPowers.pushPrefEnv({
- set: [['zen.pinned-tab-manager.close-shortcut-behavior', 'close']],
+ set: [["zen.pinned-tab-manager.close-shortcut-behavior", "close"]],
});
let resolvePromise;
@@ -13,13 +13,14 @@ add_task(async function test_Unload_NoReset_Pinned() {
resolvePromise = resolve;
});
- await BrowserTestUtils.withNewTab({ gBrowser, url: 'https://example.com/1' }, async (browser) => {
+ await BrowserTestUtils.withNewTab({ gBrowser, url: "https://example.com/1" }, async (browser) => {
const tab = gBrowser.getTabForBrowser(browser);
gBrowser.pinTab(tab);
- document.getElementById('cmd_close').doCommand();
+ document.getElementById("cmd_close").doCommand();
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
setTimeout(() => {
- ok(tab.closing, 'The tab should be closing after being closed');
+ ok(tab.closing, "The tab should be closing after being closed");
resolvePromise();
}, 100);
await promise;
diff --git a/src/zen/tests/pinned/browser_pinned_created.js b/src/zen/tests/pinned/browser_pinned_created.js
index bc7658fcb..bcc7f6913 100644
--- a/src/zen/tests/pinned/browser_pinned_created.js
+++ b/src/zen/tests/pinned/browser_pinned_created.js
@@ -1,7 +1,7 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Create_Pinned() {
let resolvePromise;
@@ -9,24 +9,20 @@ add_task(async function test_Create_Pinned() {
resolvePromise = resolve;
});
- await BrowserTestUtils.openNewForegroundTab(window.gBrowser, 'https://example.com/', true);
+ await BrowserTestUtils.openNewForegroundTab(window.gBrowser, "https://example.com/", true);
const newTab = gBrowser.selectedTab;
gBrowser.pinTab(newTab);
- ok(newTab.pinned, 'The tab should be pinned after calling gBrowser.pinTab()');
+ ok(newTab.pinned, "The tab should be pinned after calling gBrowser.pinTab()");
- try {
- const pinObject = newTab.__zenPinnedInitialState;
- ok(pinObject, 'The pin object should exist in the ZenPinnedTabsStorage');
- Assert.equal(
- pinObject.entry.url,
- 'https://example.com/',
- 'The pin object should have the correct URL'
- );
- } catch (error) {
- ok(false, 'Error while checking the pin object in ZenPinnedTabsStorage: ' + error);
- }
+ const pinObject = newTab._zenPinnedInitialState;
+ ok(pinObject, "The pin object should be created in the tab's _zenPinnedInitialState");
+ Assert.equal(
+ pinObject.entry.url,
+ "https://example.com/",
+ "The pin object should have the correct URL"
+ );
resolvePromise();
diff --git a/src/zen/tests/pinned/browser_pinned_nounload_reset.js b/src/zen/tests/pinned/browser_pinned_nounload_reset.js
index 8effbee1f..1f9f05c5d 100644
--- a/src/zen/tests/pinned/browser_pinned_nounload_reset.js
+++ b/src/zen/tests/pinned/browser_pinned_nounload_reset.js
@@ -1,11 +1,11 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_NoUnload_Changed_Pinned() {
await SpecialPowers.pushPrefEnv({
- set: [['zen.pinned-tab-manager.close-shortcut-behavior', 'reset-switch']],
+ set: [["zen.pinned-tab-manager.close-shortcut-behavior", "reset-switch"]],
});
let resolvePromise;
@@ -13,25 +13,30 @@ add_task(async function test_NoUnload_Changed_Pinned() {
resolvePromise = resolve;
});
- await BrowserTestUtils.withNewTab({ gBrowser, url: 'https://example.com/1' }, async (browser) => {
+ await BrowserTestUtils.withNewTab({ gBrowser, url: "https://example.com/1" }, async (browser) => {
const tab = gBrowser.getTabForBrowser(browser);
gBrowser.pinTab(tab);
- BrowserTestUtils.startLoadingURIString(browser, 'https://example.com/2');
- await BrowserTestUtils.browserLoaded(browser, false, 'https://example.com/2');
+ BrowserTestUtils.startLoadingURIString(browser, "https://example.com/2");
+ await BrowserTestUtils.browserLoaded(browser, false, "https://example.com/2");
setTimeout(() => {
ok(
- tab.hasAttribute('zen-pinned-changed'),
- 'The tab should have a zen-pinned-changed attribute after being pinned'
+ tab.hasAttribute("zen-pinned-changed"),
+ "The tab should have a zen-pinned-changed attribute after being pinned"
);
- document.getElementById('cmd_close').doCommand();
+ document.getElementById("cmd_close").doCommand();
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
setTimeout(() => {
ok(
- !tab.hasAttribute('zen-pinned-changed'),
- 'The tab should not have a zen-pinned-changed attribute after being closed'
+ !tab.hasAttribute("zen-pinned-changed"),
+ "The tab should not have a zen-pinned-changed attribute after being closed"
+ );
+ ok(!tab.hasAttribute("discarded"), "The tab should not be discarded after being closed");
+ Assert.notEqual(
+ tab,
+ gBrowser.selectedTab,
+ "The tab should not be selected after being closed"
);
- ok(!tab.hasAttribute('discarded'), 'The tab should not be discarded after being closed');
- ok(tab != gBrowser.selectedTab, 'The tab should not be selected after being closed');
resolvePromise();
}, 100);
}, 0);
diff --git a/src/zen/tests/pinned/browser_pinned_reset_noswitch.js b/src/zen/tests/pinned/browser_pinned_reset_noswitch.js
index 458e62af9..4829c278d 100644
--- a/src/zen/tests/pinned/browser_pinned_reset_noswitch.js
+++ b/src/zen/tests/pinned/browser_pinned_reset_noswitch.js
@@ -1,11 +1,11 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Unload_NoReset_Pinned() {
await SpecialPowers.pushPrefEnv({
- set: [['zen.pinned-tab-manager.close-shortcut-behavior', 'reset']],
+ set: [["zen.pinned-tab-manager.close-shortcut-behavior", "reset"]],
});
let resolvePromise;
@@ -13,25 +13,30 @@ add_task(async function test_Unload_NoReset_Pinned() {
resolvePromise = resolve;
});
- await BrowserTestUtils.withNewTab({ gBrowser, url: 'https://example.com/1' }, async (browser) => {
+ await BrowserTestUtils.withNewTab({ gBrowser, url: "https://example.com/1" }, async (browser) => {
const tab = gBrowser.getTabForBrowser(browser);
gBrowser.pinTab(tab);
- BrowserTestUtils.startLoadingURIString(browser, 'https://example.com/2');
- await BrowserTestUtils.browserLoaded(browser, false, 'https://example.com/2');
+ BrowserTestUtils.startLoadingURIString(browser, "https://example.com/2");
+ await BrowserTestUtils.browserLoaded(browser, false, "https://example.com/2");
setTimeout(() => {
ok(
- tab.hasAttribute('zen-pinned-changed'),
- 'The tab should have a zen-pinned-changed attribute after being pinned'
+ tab.hasAttribute("zen-pinned-changed"),
+ "The tab should have a zen-pinned-changed attribute after being pinned"
);
- document.getElementById('cmd_close').doCommand();
+ document.getElementById("cmd_close").doCommand();
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
setTimeout(() => {
ok(
- !tab.hasAttribute('zen-pinned-changed'),
- 'The tab should not have a zen-pinned-changed attribute after being closed'
+ !tab.hasAttribute("zen-pinned-changed"),
+ "The tab should not have a zen-pinned-changed attribute after being closed"
+ );
+ ok(!tab.hasAttribute("discarded"), "The tab should not be discarded after being closed");
+ Assert.strictEqual(
+ tab,
+ gBrowser.selectedTab,
+ "The tab should not be selected after being closed"
);
- ok(!tab.hasAttribute('discarded'), 'The tab should not be discarded after being closed');
- ok(tab === gBrowser.selectedTab, 'The tab should not be selected after being closed');
resolvePromise();
}, 100);
}, 0);
diff --git a/src/zen/tests/pinned/browser_pinned_switch.js b/src/zen/tests/pinned/browser_pinned_switch.js
index 8d62e5fc4..23826d54c 100644
--- a/src/zen/tests/pinned/browser_pinned_switch.js
+++ b/src/zen/tests/pinned/browser_pinned_switch.js
@@ -1,11 +1,11 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Unload_NoReset_Pinned() {
await SpecialPowers.pushPrefEnv({
- set: [['zen.pinned-tab-manager.close-shortcut-behavior', 'switch']],
+ set: [["zen.pinned-tab-manager.close-shortcut-behavior", "switch"]],
});
let resolvePromise;
@@ -13,25 +13,30 @@ add_task(async function test_Unload_NoReset_Pinned() {
resolvePromise = resolve;
});
- await BrowserTestUtils.withNewTab({ gBrowser, url: 'https://example.com/1' }, async (browser) => {
+ await BrowserTestUtils.withNewTab({ gBrowser, url: "https://example.com/1" }, async (browser) => {
const tab = gBrowser.getTabForBrowser(browser);
gBrowser.pinTab(tab);
- BrowserTestUtils.startLoadingURIString(browser, 'https://example.com/2');
- await BrowserTestUtils.browserLoaded(browser, false, 'https://example.com/2');
+ BrowserTestUtils.startLoadingURIString(browser, "https://example.com/2");
+ await BrowserTestUtils.browserLoaded(browser, false, "https://example.com/2");
setTimeout(() => {
ok(
- tab.hasAttribute('zen-pinned-changed'),
- 'The tab should have a zen-pinned-changed attribute after being pinned'
+ tab.hasAttribute("zen-pinned-changed"),
+ "The tab should have a zen-pinned-changed attribute after being pinned"
);
- document.getElementById('cmd_close').doCommand();
+ document.getElementById("cmd_close").doCommand();
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
setTimeout(() => {
ok(
- tab.hasAttribute('zen-pinned-changed'),
- 'The tab should not have a zen-pinned-changed attribute after being closed'
+ tab.hasAttribute("zen-pinned-changed"),
+ "The tab should not have a zen-pinned-changed attribute after being closed"
+ );
+ ok(!tab.hasAttribute("discarded"), "The tab should not be discarded after being closed");
+ Assert.notEqual(
+ tab,
+ gBrowser.selectedTab,
+ "The tab should not be selected after being closed"
);
- ok(!tab.hasAttribute('discarded'), 'The tab should not be discarded after being closed');
- ok(tab != gBrowser.selectedTab, 'The tab should not be selected after being closed');
resolvePromise();
}, 100);
}, 0);
diff --git a/src/zen/tests/pinned/browser_pinned_to_essential.js b/src/zen/tests/pinned/browser_pinned_to_essential.js
index 2a605c1be..9833ab6be 100644
--- a/src/zen/tests/pinned/browser_pinned_to_essential.js
+++ b/src/zen/tests/pinned/browser_pinned_to_essential.js
@@ -1,7 +1,7 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Pinned_To_Essential() {
let resolvePromise;
@@ -9,17 +9,17 @@ add_task(async function test_Pinned_To_Essential() {
resolvePromise = resolve;
});
- await BrowserTestUtils.openNewForegroundTab(window.gBrowser, 'https://example.com/', true);
+ await BrowserTestUtils.openNewForegroundTab(window.gBrowser, "https://example.com/", true);
const newTab = gBrowser.selectedTab;
gBrowser.pinTab(newTab);
- ok(newTab.pinned, 'The tab should be pinned after calling gBrowser.pinTab()');
+ ok(newTab.pinned, "The tab should be pinned after calling gBrowser.pinTab()");
gZenPinnedTabManager.addToEssentials(newTab);
ok(
- newTab.hasAttribute('zen-essential') && newTab.parentNode.getAttribute('container') == '0',
- 'New tab should be marked as essential.'
+ newTab.hasAttribute("zen-essential") && newTab.parentNode.getAttribute("container") == "0",
+ "New tab should be marked as essential."
);
resolvePromise();
diff --git a/src/zen/tests/pinned/browser_pinned_unload_changed.js b/src/zen/tests/pinned/browser_pinned_unload_changed.js
index ca4d77cf4..2ed533045 100644
--- a/src/zen/tests/pinned/browser_pinned_unload_changed.js
+++ b/src/zen/tests/pinned/browser_pinned_unload_changed.js
@@ -1,11 +1,11 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Unload_Changed_Pinned() {
await SpecialPowers.pushPrefEnv({
- set: [['zen.pinned-tab-manager.close-shortcut-behavior', 'reset-unload-switch']],
+ set: [["zen.pinned-tab-manager.close-shortcut-behavior", "reset-unload-switch"]],
});
let resolvePromise;
@@ -13,26 +13,31 @@ add_task(async function test_Unload_Changed_Pinned() {
resolvePromise = resolve;
});
- await BrowserTestUtils.withNewTab({ gBrowser, url: 'https://example.com/1' }, async (browser) => {
+ await BrowserTestUtils.withNewTab({ gBrowser, url: "https://example.com/1" }, async (browser) => {
const tab = gBrowser.getTabForBrowser(browser);
gBrowser.pinTab(tab);
- BrowserTestUtils.startLoadingURIString(browser, 'https://example.com/2');
- await BrowserTestUtils.browserLoaded(browser, false, 'https://example.com/2');
+ BrowserTestUtils.startLoadingURIString(browser, "https://example.com/2");
+ await BrowserTestUtils.browserLoaded(browser, false, "https://example.com/2");
setTimeout(() => {
ok(
- tab.hasAttribute('zen-pinned-changed'),
- 'The tab should have a zen-pinned-changed attribute after being pinned'
+ tab.hasAttribute("zen-pinned-changed"),
+ "The tab should have a zen-pinned-changed attribute after being pinned"
);
- document.getElementById('cmd_close').doCommand();
+ document.getElementById("cmd_close").doCommand();
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
setTimeout(() => {
ok(
- !tab.hasAttribute('zen-pinned-changed'),
- 'The tab should not have a zen-pinned-changed attribute after being closed'
+ !tab.hasAttribute("zen-pinned-changed"),
+ "The tab should not have a zen-pinned-changed attribute after being closed"
);
- ok(tab.hasAttribute('discarded'), 'The tab should not be discarded after being closed');
- ok(tab != gBrowser.selectedTab, 'The tab should not be selected after being closed');
+ ok(tab.hasAttribute("discarded"), "The tab should not be discarded after being closed");
+ Assert.notEqual(
+ tab,
+ gBrowser.selectedTab,
+ "The tab should not be selected after being closed"
+ );
resolvePromise();
}, 100);
}, 0);
diff --git a/src/zen/tests/pinned/browser_pinned_unload_noreset.js b/src/zen/tests/pinned/browser_pinned_unload_noreset.js
index 0163a5a73..4543a89f0 100644
--- a/src/zen/tests/pinned/browser_pinned_unload_noreset.js
+++ b/src/zen/tests/pinned/browser_pinned_unload_noreset.js
@@ -1,11 +1,11 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Unload_NoReset_Pinned() {
await SpecialPowers.pushPrefEnv({
- set: [['zen.pinned-tab-manager.close-shortcut-behavior', 'unload-switch']],
+ set: [["zen.pinned-tab-manager.close-shortcut-behavior", "unload-switch"]],
});
let resolvePromise;
@@ -13,25 +13,31 @@ add_task(async function test_Unload_NoReset_Pinned() {
resolvePromise = resolve;
});
- await BrowserTestUtils.withNewTab({ gBrowser, url: 'https://example.com/1' }, async (browser) => {
+ await BrowserTestUtils.withNewTab({ gBrowser, url: "https://example.com/1" }, async (browser) => {
const tab = gBrowser.getTabForBrowser(browser);
gBrowser.pinTab(tab);
- BrowserTestUtils.startLoadingURIString(browser, 'https://example.com/2');
- await BrowserTestUtils.browserLoaded(browser, false, 'https://example.com/2');
+ BrowserTestUtils.startLoadingURIString(browser, "https://example.com/2");
+ await BrowserTestUtils.browserLoaded(browser, false, "https://example.com/2");
+ /* eslint-disable-next-line mozilla/no-arbitrary-setTimeout */
setTimeout(() => {
ok(
- tab.hasAttribute('zen-pinned-changed'),
- 'The tab should have a zen-pinned-changed attribute after being pinned'
+ tab.hasAttribute("zen-pinned-changed"),
+ "The tab should have a zen-pinned-changed attribute after being pinned"
);
- document.getElementById('cmd_close').doCommand();
+ document.getElementById("cmd_close").doCommand();
+ /* eslint-disable-next-line mozilla/no-arbitrary-setTimeout */
setTimeout(() => {
ok(
- tab.hasAttribute('zen-pinned-changed'),
- 'The tab should not have a zen-pinned-changed attribute after being closed'
+ tab.hasAttribute("zen-pinned-changed"),
+ "The tab should not have a zen-pinned-changed attribute after being closed"
+ );
+ ok(tab.hasAttribute("discarded"), "The tab should not be discarded after being closed");
+ Assert.notEqual(
+ tab,
+ gBrowser.selectedTab,
+ "The tab should not be selected after being closed"
);
- ok(tab.hasAttribute('discarded'), 'The tab should not be discarded after being closed');
- ok(tab != gBrowser.selectedTab, 'The tab should not be selected after being closed');
resolvePromise();
}, 100);
}, 0);
diff --git a/src/zen/tests/pinned/browser_private_mode_no_ctx_menu.js b/src/zen/tests/pinned/browser_private_mode_no_ctx_menu.js
index 2974005bb..88b53f5c2 100644
--- a/src/zen/tests/pinned/browser_private_mode_no_ctx_menu.js
+++ b/src/zen/tests/pinned/browser_private_mode_no_ctx_menu.js
@@ -1,30 +1,32 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Private_Mode_No_Essentials() {
let privateWindow = await BrowserTestUtils.openNewBrowserWindow({
private: true,
});
await privateWindow.gZenWorkspaces.promiseInitialized;
- await BrowserTestUtils.openNewForegroundTab(privateWindow.gBrowser, 'https://example.com/', true);
+ await BrowserTestUtils.openNewForegroundTab(privateWindow.gBrowser, "https://example.com/", true);
await new Promise((resolve) => {
- privateWindow.gBrowser.selectedTab.addEventListener('popupshown', function (event) {
+ privateWindow.gBrowser.selectedTab.addEventListener("popupshown", function () {
ok(
- privateWindow.document.getElementById('context_zen-add-essentials').hidden,
- 'Context menu should not show Zen Essentials option in private mode'
+ privateWindow.document.getElementById("context_zen-add-essentials").hidden,
+ "Context menu should not show Zen Essentials option in private mode"
);
ok(
- privateWindow.document.getElementById('context_pinTab').hidden,
- 'Context menu should not show Pin Tab option in private mode'
+ privateWindow.document.getElementById("context_pinTab").hidden,
+ "Context menu should not show Pin Tab option in private mode"
);
+
+ resolve();
});
EventUtils.synthesizeMouseAtCenter(privateWindow.gBrowser.selectedTab, {
- type: 'contextmenu',
+ type: "contextmenu",
});
});
diff --git a/src/zen/tests/pinned/browser_private_mode_no_essentials.js b/src/zen/tests/pinned/browser_private_mode_no_essentials.js
deleted file mode 100644
index 8de324771..000000000
--- a/src/zen/tests/pinned/browser_private_mode_no_essentials.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- https://creativecommons.org/publicdomain/zero/1.0/ */
-
-'use strict';
-
-add_task(async function test_Private_Mode_No_Essentials() {
- await BrowserTestUtils.openNewForegroundTab(window.gBrowser, 'https://example.com/', true);
- let resolvePromise;
- const promise = new Promise((resolve) => {
- resolvePromise = resolve;
- });
-
- const newTab = gBrowser.selectedTab;
- gBrowser.pinTab(newTab);
-
- ok(newTab.pinned, 'The tab should be pinned after calling gBrowser.pinTab()');
-
- try {
- const pins = await ZenPinnedTabsStorage.getPins();
- const pinObject = pins.find((pin) => pin.uuid === pinTabID);
- ok(pinObject, 'The pin object should exist in the ZenPinnedTabsStorage');
-
- let privateWindow = await BrowserTestUtils.openNewBrowserWindow({
- private: true,
- });
- await privateWindow.gZenWorkspaces.promiseInitialized;
- ok(
- !privateWindow.gBrowser.tabs.some((tab) => tab.pinned),
- 'Private window should not have any pinned tabs initially'
- );
-
- await BrowserTestUtils.closeWindow(privateWindow);
- } catch (error) {
- ok(false, 'Error while checking the pin object in ZenPinnedTabsStorage: ' + error);
- }
- resolvePromise();
- gZenPinnedTabManager.addToEssentials(newTab);
-
- await promise;
- await BrowserTestUtils.removeTab(newTab);
-});
diff --git a/src/zen/tests/split_view/browser_basic_split_view.js b/src/zen/tests/split_view/browser_basic_split_view.js
index 2beb8a291..c1c39d480 100644
--- a/src/zen/tests/split_view/browser_basic_split_view.js
+++ b/src/zen/tests/split_view/browser_basic_split_view.js
@@ -1,31 +1,31 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Basic_Split_View() {
- await basicSplitNTabs(async (tabs) => {
+ await basicSplitNTabs(() => {
ok(
- gBrowser.tabpanels.hasAttribute('zen-split-view'),
- 'The split view should not have crashed with two tabs in it'
+ gBrowser.tabpanels.hasAttribute("zen-split-view"),
+ "The split view should not have crashed with two tabs in it"
);
});
ok(
- !gBrowser.tabpanels.hasAttribute('zen-split-view'),
- 'Unsplit view should not have crashed with two tabs in it'
+ !gBrowser.tabpanels.hasAttribute("zen-split-view"),
+ "Unsplit view should not have crashed with two tabs in it"
);
});
add_task(async function test_Browser_Elements_Attributes() {
- await basicSplitNTabs(async (tabs) => {
+ await basicSplitNTabs(() => {
Assert.equal(
document.querySelectorAll('.browserSidebarContainer[zen-split="true"]').length,
2,
- 'There should be two split browser sidebars'
+ "There should be two split browser sidebars"
);
});
ok(
!document.querySelector('.browserSidebarContainer[zen-split="true"]'),
- 'There should be no split browser sidebars in unsplit view'
+ "There should be no split browser sidebars in unsplit view"
);
});
diff --git a/src/zen/tests/split_view/browser_split_browser_duplication.js b/src/zen/tests/split_view/browser_split_browser_duplication.js
index 968e58a8a..4355e2b0a 100644
--- a/src/zen/tests/split_view/browser_split_browser_duplication.js
+++ b/src/zen/tests/split_view/browser_split_browser_duplication.js
@@ -1,35 +1,36 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Basic_Split_View_Duplication() {
const [normal, pinned] = await Promise.all([
addTabTo(gBrowser, getUrlForNthTab(1)),
addTabTo(gBrowser, getUrlForNthTab(2)),
]);
- const pinEvent = BrowserTestUtils.waitForEvent(pinned, 'TabPinned');
+ const pinEvent = BrowserTestUtils.waitForEvent(pinned, "TabPinned");
gBrowser.pinTab(pinned);
await pinEvent;
- Assert.ok(
- gBrowser.tabs.length === 4, // empty + initial + 2 split tabs
- 'There should be four tabs after pinning the second tab'
+ Assert.strictEqual(
+ gBrowser.tabs.length,
+ 4,
+ "There should be four tabs after pinning the second tab"
);
- await createSplitView([normal, pinned], 'grid');
- ok(!pinned.group, 'The pinned tab should not be in a split group after duplication');
+ await createSplitView([normal, pinned], "grid");
+ ok(!pinned.group, "The pinned tab should not be in a split group after duplication");
ok(
- normal.group.hasAttribute('split-view-group'),
- 'The normal tab should be in a split group after duplication'
+ normal.group.hasAttribute("split-view-group"),
+ "The normal tab should be in a split group after duplication"
);
const group = normal.group;
for (const tab of group.tabs) {
- Assert.ok(!tab.pinned, 'All tabs in the split group should not be pinned after duplication');
+ Assert.ok(!tab.pinned, "All tabs in the split group should not be pinned after duplication");
Assert.ok(
tab.splitView,
- 'All tabs in the split group should be in a split view after duplication'
+ "All tabs in the split group should be in a split view after duplication"
);
}
- Assert.ok(!group.pinned, 'The split group should not be pinned after duplication');
+ Assert.ok(!group.pinned, "The split group should not be pinned after duplication");
for (const tab of [pinned, ...group.tabs]) {
await BrowserTestUtils.removeTab(tab);
}
@@ -40,34 +41,32 @@ add_task(async function test_Split_View_Duplication_Both_Pinned() {
addTabTo(gBrowser, getUrlForNthTab(1)),
addTabTo(gBrowser, getUrlForNthTab(2)),
]);
- const pinEvent1 = BrowserTestUtils.waitForEvent(tab1, 'TabPinned');
- const pinEvent2 = BrowserTestUtils.waitForEvent(tab2, 'TabPinned');
+ const pinEvent1 = BrowserTestUtils.waitForEvent(tab1, "TabPinned");
+ const pinEvent2 = BrowserTestUtils.waitForEvent(tab2, "TabPinned");
gBrowser.pinTab(tab1);
gBrowser.pinTab(tab2);
await Promise.all([pinEvent1, pinEvent2]);
- Assert.ok(
- gBrowser.tabs.length === 4, // empty + initial + 2 split tabs
- 'There should be four tabs after pinning both tabs'
- );
- await createSplitView([tab1, tab2], 'grid');
- ok(tab1.group, 'The first pinned tab should be in a split group after duplication');
- ok(
- tab2.group === tab1.group,
- 'The second pinned tab should be in the same split group after duplication'
+ Assert.strictEqual(gBrowser.tabs.length, 4, "There should be four tabs after pinning both tabs");
+ await createSplitView([tab1, tab2], "grid");
+ ok(tab1.group, "The first pinned tab should be in a split group after duplication");
+ Assert.strictEqual(
+ tab2.group,
+ tab1.group,
+ "The second pinned tab should be in the same split group after duplication"
);
Assert.equal(
gBrowser.tabs.length,
4,
- 'There should not be any duplicate tabs after pinning both tabs'
+ "There should not be any duplicate tabs after pinning both tabs"
);
for (const tab of tab1.group.tabs) {
- Assert.ok(tab.pinned, 'All tabs in the split group should be pinned after duplication');
+ Assert.ok(tab.pinned, "All tabs in the split group should be pinned after duplication");
Assert.ok(
tab.splitView,
- 'All tabs in the split group should be in a split view after duplication'
+ "All tabs in the split group should be in a split view after duplication"
);
}
- Assert.ok(tab1.group.pinned, 'The split group should be pinned after duplication of both tabs');
+ Assert.ok(tab1.group.pinned, "The split group should be pinned after duplication of both tabs");
for (const tab of tab1.group.tabs) {
await BrowserTestUtils.removeTab(tab);
}
@@ -81,26 +80,28 @@ add_task(async function test_Split_View_Duplication_Pinned_Essential() {
addTabTo(gBrowser, getUrlForNthTab(1)),
addTabTo(gBrowser, getUrlForNthTab(2)),
]);
- const pinEvent = BrowserTestUtils.waitForEvent(pinned, 'TabPinned');
+ const pinEvent = BrowserTestUtils.waitForEvent(pinned, "TabPinned");
gBrowser.pinTab(pinned);
await pinEvent;
gZenPinnedTabManager.addToEssentials(essential);
- Assert.ok(
- gBrowser.tabs.length === 4, // empty + initial + 2 split tabs
- 'There should be four tabs after pinning the first tab and adding the second to essentials'
+ Assert.strictEqual(
+ gBrowser.tabs.length,
+ 4,
+ "There should be four tabs after pinning the first tab and adding the second to essentials"
);
- await createSplitView([pinned, essential], 'grid');
- ok(
- gBrowser.tabs.length === 4 + 2,
- 'There should be six tabs after creating a split view with the pinned and essential tabs'
+ await createSplitView([pinned, essential], "grid");
+ Assert.strictEqual(
+ gBrowser.tabs.length,
+ 4 + 2,
+ "There should be six tabs after creating a split view with the pinned and essential tabs"
);
ok(
!pinned.group,
- 'The pinned tab should not be in a split group after duplication with an essential tab'
+ "The pinned tab should not be in a split group after duplication with an essential tab"
);
ok(
!essential.group,
- 'The essential tab should not be in a split group after duplication with a pinned tab'
+ "The essential tab should not be in a split group after duplication with a pinned tab"
);
for (const tab of gBrowser.tabs) {
if (existingTabs.includes(tab)) {
@@ -118,18 +119,20 @@ add_task(async function test_Split_View_Duplication_Essential() {
essentials.forEach((tab) => {
gZenPinnedTabManager.addToEssentials(tab);
});
- ok(
- gBrowser.tabs.length === 4, // empty + initial + 2 essential tabs
- 'There should be four tabs after adding two essential tabs'
+ Assert.strictEqual(
+ gBrowser.tabs.length,
+ 4,
+ "There should be four tabs after adding two essential tabs"
);
- await createSplitView(essentials, 'grid');
- ok(
- gBrowser.tabs.length === 4 + 2,
- 'There should be six tabs after creating a split view with two essential tabs'
+ await createSplitView(essentials, "grid");
+ Assert.strictEqual(
+ gBrowser.tabs.length,
+ 4 + 2,
+ "There should be six tabs after creating a split view with two essential tabs"
);
for (const tab of essentials) {
- ok(!tab.group, 'Each essential tab should not be in a split group after duplication');
- ok(!tab.splitView, 'Each essential tab should not be in a split view after duplication');
+ ok(!tab.group, "Each essential tab should not be in a split group after duplication");
+ ok(!tab.splitView, "Each essential tab should not be in a split view after duplication");
}
for (const tab of gBrowser.tabs) {
if (existingTabs.includes(tab)) {
diff --git a/src/zen/tests/split_view/browser_split_groups.js b/src/zen/tests/split_view/browser_split_groups.js
index 861986216..7ba57d239 100644
--- a/src/zen/tests/split_view/browser_split_groups.js
+++ b/src/zen/tests/split_view/browser_split_groups.js
@@ -1,44 +1,46 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Basic_Split_Groups() {
await basicSplitNTabs(async (tabs) => {
- ok(tabs[0].group.hasAttribute('split-view-group'), 'The first tab should be in a split group');
- Assert.equal(tabs[0].group.tabs.length, 2, 'The first split group should contain two tabs');
+ ok(tabs[0].group.hasAttribute("split-view-group"), "The first tab should be in a split group");
+ Assert.equal(tabs[0].group.tabs.length, 2, "The first split group should contain two tabs");
});
});
add_task(async function test_Basic_Split_Groups_Pinning() {
await basicSplitNTabs(async (tabs) => {
const group = tabs[0].group;
- ok(group.hasAttribute('split-view-group'), 'The first tab should be in a split group');
- const pinEvent = BrowserTestUtils.waitForEvent(tabs[0], 'TabPinned');
+ ok(group.hasAttribute("split-view-group"), "The first tab should be in a split group");
+ const pinEvent = BrowserTestUtils.waitForEvent(tabs[0], "TabPinned");
gBrowser.pinTab(tabs[0]);
await pinEvent;
for (const tab of tabs) {
- ok(tab.pinned, 'All tabs in the split group should be pinned after pinning the first tab');
- ok(
- tab.group === group,
- 'All tabs in the split group should remain in the same group after pinning'
+ ok(tab.pinned, "All tabs in the split group should be pinned after pinning the first tab");
+ Assert.strictEqual(
+ tab.group,
+ group,
+ "All tabs in the split group should remain in the same group after pinning"
);
}
- ok(group.pinned, 'The split group should be pinned after pinning a tab');
- const unpinEvent = BrowserTestUtils.waitForEvent(tabs[0], 'TabUnpinned');
+ ok(group.pinned, "The split group should be pinned after pinning a tab");
+ const unpinEvent = BrowserTestUtils.waitForEvent(tabs[0], "TabUnpinned");
gBrowser.unpinTab(tabs[0]);
await unpinEvent;
for (const tab of tabs) {
ok(
!tab.pinned,
- 'All tabs in the split group should be unpinned after unpinning the first tab'
+ "All tabs in the split group should be unpinned after unpinning the first tab"
);
- ok(
- tab.group === group,
- 'All tabs in the split group should remain in the same group after unpinning'
+ Assert.strictEqual(
+ tab.group,
+ group,
+ "All tabs in the split group should remain in the same group after unpinning"
);
}
- ok(!group.pinned, 'The split group should be unpinned after unpinning a tab');
+ ok(!group.pinned, "The split group should be unpinned after unpinning a tab");
});
});
@@ -47,6 +49,6 @@ add_task(async function test_Basic_Unsplit_Group_Removed() {
await basicSplitNTabs(async (tabs) => {
group = tabs[0].group;
});
- ok(group, 'The split group should exist');
- ok(!group.parentNode, 'The split group should be removed from the DOM after unsplitting');
+ ok(group, "The split group should exist");
+ ok(!group.parentNode, "The split group should be removed from the DOM after unsplitting");
});
diff --git a/src/zen/tests/split_view/browser_split_inset_checks.js b/src/zen/tests/split_view/browser_split_inset_checks.js
index 0ceb0950d..30c544c34 100644
--- a/src/zen/tests/split_view/browser_split_inset_checks.js
+++ b/src/zen/tests/split_view/browser_split_inset_checks.js
@@ -1,68 +1,68 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Basic_Split_View_Inset() {
let viewsToCheck = [];
- await basicSplitNTabs(async (tabs) => {
+ await basicSplitNTabs(() => {
viewsToCheck = document.querySelectorAll('.browserSidebarContainer[zen-split="true"]');
- ok(viewsToCheck.length, 'There should be split views present');
+ ok(viewsToCheck.length, "There should be split views present");
Assert.equal(
viewsToCheck[0].style.inset,
- '0% 50% 0% 0%',
- 'The split view should have correct inset style'
+ "0% 50% 0% 0%",
+ "The split view should have correct inset style"
);
Assert.equal(
viewsToCheck[1].style.inset,
- '0% 0% 0% 50%',
- 'The second split view should have correct inset style'
+ "0% 0% 0% 50%",
+ "The second split view should have correct inset style"
);
});
for (const view of viewsToCheck) {
- Assert.equal(view.style.inset, '', 'The unsplit view should not have correct inset style');
+ Assert.equal(view.style.inset, "", "The unsplit view should not have correct inset style");
}
});
add_task(async function test_Horizontal_Split_Inset() {
- await basicSplitNTabs(async (tabs) => {
+ await basicSplitNTabs(() => {
const viewsToCheck = document.querySelectorAll('.browserSidebarContainer[zen-split="true"]');
- ok(viewsToCheck.length, 'There should be split views present');
+ ok(viewsToCheck.length, "There should be split views present");
Assert.equal(
viewsToCheck[0].style.inset,
- '0% 50% 0% 0%',
- 'The horizontal split view should have correct inset style'
+ "0% 50% 0% 0%",
+ "The horizontal split view should have correct inset style"
);
Assert.equal(
viewsToCheck[1].style.inset,
- '0% 0% 0% 50%',
- 'The second horizontal split view should have correct inset style'
+ "0% 0% 0% 50%",
+ "The second horizontal split view should have correct inset style"
);
});
});
add_task(async function test_3_Splits_Grid_Inset() {
await basicSplitNTabs(
- async (tabs) => {
+ () => {
const viewsToCheck = document.querySelectorAll('.browserSidebarContainer[zen-split="true"]');
- ok(viewsToCheck.length, 'There should be split views present');
+ ok(viewsToCheck.length, "There should be split views present");
Assert.equal(
viewsToCheck[0].style.inset,
- '0% 0% 50% 50%',
- 'The first split view should have correct inset style'
+ "0% 0% 50% 50%",
+ "The first split view should have correct inset style"
);
Assert.equal(
viewsToCheck[1].style.inset,
- '50% 0% 0% 50%',
- 'The second split view should have correct inset style'
+ "50% 0% 0% 50%",
+ "The second split view should have correct inset style"
);
Assert.equal(
viewsToCheck[2].style.inset,
- '0% 50% 0% 0%',
- 'The third split view should have correct inset style'
+ "0% 50% 0% 0%",
+ "The third split view should have correct inset style"
);
},
- 'grid',
+ "grid",
3
);
});
diff --git a/src/zen/tests/split_view/browser_split_view_empty.js b/src/zen/tests/split_view/browser_split_view_empty.js
index a019524ee..1abe7342d 100644
--- a/src/zen/tests/split_view/browser_split_view_empty.js
+++ b/src/zen/tests/split_view/browser_split_view_empty.js
@@ -1,48 +1,49 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
const { UrlbarTestUtils } = ChromeUtils.importESModule(
- 'resource://testing-common/UrlbarTestUtils.sys.mjs'
+ "resource://testing-common/UrlbarTestUtils.sys.mjs"
);
add_task(async function test_Split_View_Empty() {
- await BrowserTestUtils.withNewTab('https://example.com', async function () {
+ await BrowserTestUtils.withNewTab("https://example.com", async function () {
const originalTab = gBrowser.selectedTab;
- const command = document.getElementById('cmd_zenNewEmptySplit');
+ const command = document.getElementById("cmd_zenNewEmptySplit");
command.doCommand();
await UrlbarTestUtils.promisePopupOpen(window, () => {});
await UrlbarTestUtils.promiseAutocompleteResultPopup({
window,
waitForFocus,
- value: 'https://example.com',
+ value: "https://example.com",
});
const waitForActivationPromise = BrowserTestUtils.waitForEvent(
window,
- 'ZenViewSplitter:SplitViewActivated'
+ "ZenViewSplitter:SplitViewActivated"
);
let result = await UrlbarTestUtils.getDetailsOfResultAt(window, 0);
EventUtils.synthesizeMouseAtCenter(result.element.row, {});
await waitForActivationPromise;
await new Promise((resolve) => {
+ /* eslint-disable mozilla/no-arbitrary-setTimeout */
setTimeout(async () => {
resolve();
}, 100);
});
const selectedTab = gBrowser.selectedTab;
ok(
- gBrowser.tabpanels.hasAttribute('zen-split-view'),
- 'The split view should not have crashed with two tabs in it'
+ gBrowser.tabpanels.hasAttribute("zen-split-view"),
+ "The split view should not have crashed with two tabs in it"
);
- ok(!gZenWorkspaces._emptyTab.splitView, 'The empty tab should not be in split view');
- ok(!gZenWorkspaces._emptyTab.group, 'The empty tab should not be in a group');
- ok(selectedTab.splitView, 'The selected tab should be in split view');
- ok(originalTab.splitView, 'The original tab should be in split view');
+ ok(!gZenWorkspaces._emptyTab.splitView, "The empty tab should not be in split view");
+ ok(!gZenWorkspaces._emptyTab.group, "The empty tab should not be in a group");
+ ok(selectedTab.splitView, "The selected tab should be in split view");
+ ok(originalTab.splitView, "The original tab should be in split view");
Assert.equal(
gBrowser.tabpanels.querySelectorAll('[zen-split="true"]').length,
2,
- 'There should be two split views present'
+ "There should be two split views present"
);
await BrowserTestUtils.removeTab(selectedTab);
});
diff --git a/src/zen/tests/split_view/browser_split_view_with_folders.js b/src/zen/tests/split_view/browser_split_view_with_folders.js
index 6200e1b59..2558d6980 100644
--- a/src/zen/tests/split_view/browser_split_view_with_folders.js
+++ b/src/zen/tests/split_view/browser_split_view_with_folders.js
@@ -1,40 +1,38 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Split_View_Inside_Folder() {
const [tab1, tab2] = await Promise.all([
addTabTo(gBrowser, getUrlForNthTab(1)),
addTabTo(gBrowser, getUrlForNthTab(2)),
]);
- const pinEvent1 = BrowserTestUtils.waitForEvent(tab1, 'TabPinned');
- const pinEvent2 = BrowserTestUtils.waitForEvent(tab2, 'TabPinned');
+ const pinEvent1 = BrowserTestUtils.waitForEvent(tab1, "TabPinned");
+ const pinEvent2 = BrowserTestUtils.waitForEvent(tab2, "TabPinned");
gBrowser.pinTab(tab1);
gBrowser.pinTab(tab2);
await Promise.all([pinEvent1, pinEvent2]);
- Assert.ok(
- gBrowser.tabs.length === 4, // empty + initial + 2 split tabs
- 'There should be four tabs after pinning both tabs'
- );
+ Assert.strictEqual(gBrowser.tabs.length, 4, "There should be four tabs after pinning both tabs");
const folder = await gZenFolders.createFolder([tab1, tab2], {
renameFolder: false,
- label: 'test',
+ label: "test",
});
- Assert.equal(tab1.group, folder, 'The first pinned tab should be in the folder group');
- Assert.equal(tab2.group, folder, 'The second pinned tab should be in the folder group');
- await createSplitView([tab1, tab2], 'grid');
- ok(
- tab2.group === tab1.group,
- 'The second pinned tab should be in the same split group after duplication'
+ Assert.equal(tab1.group, folder, "The first pinned tab should be in the folder group");
+ Assert.equal(tab2.group, folder, "The second pinned tab should be in the folder group");
+ await createSplitView([tab1, tab2], "grid");
+ Assert.strictEqual(
+ tab2.group,
+ tab1.group,
+ "The second pinned tab should be in the same split group after duplication"
);
ok(
- tab1.group.hasAttribute('split-view-group'),
- 'The first pinned tab should be in a split group after duplication'
+ tab1.group.hasAttribute("split-view-group"),
+ "The first pinned tab should be in a split group after duplication"
);
- Assert.ok(tab1.group.pinned, 'The split group should be pinned after duplication of both tabs');
- Assert.equal(tab1.group.group, folder, 'The split group should be the folder after duplication');
- const removeEvent = BrowserTestUtils.waitForEvent(window, 'TabGroupRemoved');
+ Assert.ok(tab1.group.pinned, "The split group should be pinned after duplication of both tabs");
+ Assert.equal(tab1.group.group, folder, "The split group should be the folder after duplication");
+ const removeEvent = BrowserTestUtils.waitForEvent(window, "TabGroupRemoved");
folder.delete();
await removeEvent;
});
diff --git a/src/zen/tests/split_view/browser_split_view_with_glance.js b/src/zen/tests/split_view/browser_split_view_with_glance.js
index 20a592221..3752f1a69 100644
--- a/src/zen/tests/split_view/browser_split_view_with_glance.js
+++ b/src/zen/tests/split_view/browser_split_view_with_glance.js
@@ -1,22 +1,22 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
const { openGlanceOnTab } = ChromeUtils.importESModule(
- 'resource://testing-common/GlanceTestUtils.sys.mjs'
+ "resource://testing-common/GlanceTestUtils.sys.mjs"
);
add_task(async function test_Basic_Split_View_Glance() {
- await basicSplitNTabs(async (tabs) => {
+ await basicSplitNTabs(async () => {
await openGlanceOnTab(window, async (glanceTab) => {
ok(
- glanceTab.hasAttribute('zen-glance-tab'),
- 'The glance tab should have the zen-glance-tab attribute'
+ glanceTab.hasAttribute("zen-glance-tab"),
+ "The glance tab should have the zen-glance-tab attribute"
);
ok(
- gBrowser.tabpanels.hasAttribute('zen-split-view'),
- 'The split view should not have crashed with two tabs in it'
+ gBrowser.tabpanels.hasAttribute("zen-split-view"),
+ "The split view should not have crashed with two tabs in it"
);
});
});
@@ -29,21 +29,21 @@ add_task(async function test_Basic_Split_View_Glance_Expand() {
async (glanceTab) => {
await gZenGlanceManager.fullyOpenGlance();
ok(
- !glanceTab.hasAttribute('zen-glance-tab'),
- 'The glance tab should not have the zen-glance-tab attribute after expanding'
+ !glanceTab.hasAttribute("zen-glance-tab"),
+ "The glance tab should not have the zen-glance-tab attribute after expanding"
);
- ok(!glanceTab.group, 'The glance tab should not be in a split group after expanding');
+ ok(!glanceTab.group, "The glance tab should not be in a split group after expanding");
for (const tab of tabs) {
ok(
- tab.group.hasAttribute('split-view-group'),
- 'All tabs in the split view should still be in a split group after expanding glance'
+ tab.group.hasAttribute("split-view-group"),
+ "All tabs in the split view should still be in a split group after expanding glance"
);
}
- const selectedBrowser = document.querySelectorAll('.browserSidebarContainer.deck-selected');
+ const selectedBrowser = document.querySelectorAll(".browserSidebarContainer.deck-selected");
Assert.equal(
selectedBrowser.length,
1,
- 'There should be one selected browser sidebar after expanding glance'
+ "There should be one selected browser sidebar after expanding glance"
);
BrowserTestUtils.removeTab(glanceTab);
},
@@ -54,15 +54,16 @@ add_task(async function test_Basic_Split_View_Glance_Expand() {
add_task(async function test_Basic_Split_View_Glance_No_More_Split() {
await basicSplitNTabs(
- async (tabs) => {
- await openGlanceOnTab(window, async (glanceTab) => {
- ok(
- document.getElementById('cmd_zenGlanceSplit').getAttribute('disabled') === 'true',
- 'The split command should be disabled when glance is open'
+ async () => {
+ await openGlanceOnTab(window, () => {
+ Assert.strictEqual(
+ document.getElementById("cmd_zenGlanceSplit").getAttribute("disabled"),
+ "true",
+ "The split command should be disabled when glance is open"
);
});
},
- 'grid',
+ "grid",
4
);
});
@@ -75,26 +76,26 @@ add_task(async function test_Basic_Split_View_Glance_Split() {
async (glanceTab) => {
const waitForSplitPromise = BrowserTestUtils.waitForEvent(
window,
- 'ZenViewSplitter:SplitViewActivated'
+ "ZenViewSplitter:SplitViewActivated"
);
- document.getElementById('cmd_zenGlanceSplit').doCommand();
+ document.getElementById("cmd_zenGlanceSplit").doCommand();
await waitForSplitPromise;
ok(
- !glanceTab.hasAttribute('zen-glance-tab'),
- 'The glance tab should not have the zen-glance-tab attribute after splitting'
+ !glanceTab.hasAttribute("zen-glance-tab"),
+ "The glance tab should not have the zen-glance-tab attribute after splitting"
);
ok(
- gBrowser.tabpanels.hasAttribute('zen-split-view'),
- 'The split view should not have crashed with two tabs in it'
+ gBrowser.tabpanels.hasAttribute("zen-split-view"),
+ "The split view should not have crashed with two tabs in it"
);
ok(
- glanceTab.group.hasAttribute('split-view-group'),
- 'The glance tab should be in a split group after splitting'
+ glanceTab.group.hasAttribute("split-view-group"),
+ "The glance tab should be in a split group after splitting"
);
Assert.equal(
tab.group,
glanceTab.group,
- 'The original tab should be in the same split group as the glance tab after splitting'
+ "The original tab should be in the same split group as the glance tab after splitting"
);
BrowserTestUtils.removeTab(glanceTab);
},
diff --git a/src/zen/tests/split_view/head.js b/src/zen/tests/split_view/head.js
index 5748459e7..47d7fe7c8 100644
--- a/src/zen/tests/split_view/head.js
+++ b/src/zen/tests/split_view/head.js
@@ -1,9 +1,9 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
-async function addTabTo(targetBrowser, url = 'http://mochi.test:8888/', params = {}) {
+async function addTabTo(targetBrowser, url = "http://mochi.test:8888/", params = {}) {
params.skipAnimation = true;
const tab = BrowserTestUtils.addTab(targetBrowser, url, params);
const browser = targetBrowser.getBrowserForTab(tab);
@@ -15,10 +15,10 @@ function getUrlForNthTab(n) {
return `data:text/plain,tab${n}`;
}
-async function createSplitView(tabs, type = 'grid') {
+async function createSplitView(tabs, type = "grid") {
const waitForActivationPromise = BrowserTestUtils.waitForEvent(
window,
- 'ZenViewSplitter:SplitViewActivated'
+ "ZenViewSplitter:SplitViewActivated"
);
gZenViewSplitter.splitTabs(tabs, type);
await waitForActivationPromise;
@@ -29,9 +29,9 @@ async function createSplitView(tabs, type = 'grid') {
});
}
-async function basicSplitNTabs(callback, type = 'grid', n = 2) {
- Assert.greater(n, 1, 'There should be at least two tabs');
- Assert.less(n, 5, 'There should be at most four tabs');
+async function basicSplitNTabs(callback, type = "grid", n = 2) {
+ Assert.greater(n, 1, "There should be at least two tabs");
+ Assert.less(n, 5, "There should be at most four tabs");
const tabs = await Promise.all(
[...Array(n)].map((_, i) => addTabTo(gBrowser, getUrlForNthTab(i + 1)))
);
diff --git a/src/zen/tests/tabs/browser_drag_drop_vertical.js b/src/zen/tests/tabs/browser_drag_drop_vertical.js
index d5f36fa90..0d0c513e8 100644
--- a/src/zen/tests/tabs/browser_drag_drop_vertical.js
+++ b/src/zen/tests/tabs/browser_drag_drop_vertical.js
@@ -1,15 +1,15 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
-const URL1 = 'data:text/plain,tab1';
-const URL2 = 'data:text/plain,tab2';
-const URL3 = 'data:text/plain,tab3';
+const URL1 = "data:text/plain,tab1";
+const URL2 = "data:text/plain,tab2";
+const URL3 = "data:text/plain,tab3";
const threshold = Math.min(
1.0,
- Math.max(0.5, Services.prefs.getIntPref('browser.tabs.dragDrop.moveOverThresholdPercent') / 100) +
+ Math.max(0.5, Services.prefs.getIntPref("browser.tabs.dragDrop.moveOverThresholdPercent") / 100) +
0.01
);
@@ -24,8 +24,8 @@ const threshold = Math.min(
* @param {Window} win
*/
async function drop(source, target, clientX, clientY, win) {
- const tabMove = BrowserTestUtils.waitForEvent(source, 'TabMove');
- EventUtils.synthesizeDrop(source, target, null, 'move', win, win, {
+ const tabMove = BrowserTestUtils.waitForEvent(source, "TabMove");
+ EventUtils.synthesizeDrop(source, target, null, "move", win, win, {
clientX,
clientY,
});
@@ -81,7 +81,7 @@ async function dropBefore(itemToDrag, itemToDropBefore, win) {
*/
async function ensureNotOverflowing() {
const tabHeight = Number.parseFloat(
- getComputedStyle(gBrowser.tabs[0]).getPropertyValue('--tab-height-with-margin-padding')
+ getComputedStyle(gBrowser.tabs[0]).getPropertyValue("--tab-height-with-margin-padding")
);
const requiredTabSpace = tabHeight * gBrowser.tabs.length;
const scrollboxWidth = gBrowser.tabContainer.arrowScrollbox.scrollSize;
@@ -94,7 +94,7 @@ async function ensureNotOverflowing() {
await BrowserTestUtils.waitForCondition(
() => !gBrowser.tabContainer.arrowScrollbox.overflowing,
- 'tabs scrollbox should not be overflowing',
+ "tabs scrollbox should not be overflowing",
100,
5
);
@@ -102,7 +102,7 @@ async function ensureNotOverflowing() {
add_setup(async () => {
await SpecialPowers.pushPrefEnv({
- set: [['zen.view.show-newtab-button-top', false]],
+ set: [["zen.view.show-newtab-button-top", false]],
});
// Wait for sidebar animations to complete so that the position of the tab
@@ -124,7 +124,7 @@ add_setup(async () => {
registerCleanupFunction(async () => {
// replace the default new tab in the test window
- addTabTo(gBrowser, 'about:blank');
+ addTabTo(gBrowser, "about:blank");
BrowserTestUtils.removeTab(tab1);
BrowserTestUtils.removeTab(tab2);
@@ -140,7 +140,7 @@ add_task(async function test_basic_unpinned_vertical_ltr() {
// Validate that dragging and dropping into the same position will result in
// the tab not moving
for (const tab of [tab1, tab2, tab3]) {
- EventUtils.synthesizeDrop(tab, tab, null, 'move', window, window, {});
+ EventUtils.synthesizeDrop(tab, tab, null, "move", window, window, {});
Assert.deepEqual(
gBrowser.tabs,
[emptyTab, tab1, tab2, tab3],
@@ -153,13 +153,13 @@ add_task(async function test_basic_unpinned_vertical_ltr() {
Assert.deepEqual(
gBrowser.tabs,
[emptyTab, tab2, tab1, tab3],
- 'confirm that tab1 moved after tab2'
+ "confirm that tab1 moved after tab2"
);
await dropAfter(tab1, tab3, window);
Assert.deepEqual(
gBrowser.tabs,
[emptyTab, tab2, tab3, tab1],
- 'confirm that tab1 moved after tab3'
+ "confirm that tab1 moved after tab3"
);
// Validate that it's possible to drag and drop a tab backward
@@ -167,12 +167,12 @@ add_task(async function test_basic_unpinned_vertical_ltr() {
Assert.deepEqual(
gBrowser.tabs,
[emptyTab, tab2, tab1, tab3],
- 'confirm that tab1 moved before tab3'
+ "confirm that tab1 moved before tab3"
);
await dropBefore(tab1, tab2, window);
Assert.deepEqual(
gBrowser.tabs,
[emptyTab, tab1, tab2, tab3],
- 'confirm that tab1 moved before tab2'
+ "confirm that tab1 moved before tab2"
);
});
diff --git a/src/zen/tests/tabs/browser_tabs_cycle_by_attribute.js b/src/zen/tests/tabs/browser_tabs_cycle_by_attribute.js
index f6dce0faf..5e7934134 100644
--- a/src/zen/tests/tabs/browser_tabs_cycle_by_attribute.js
+++ b/src/zen/tests/tabs/browser_tabs_cycle_by_attribute.js
@@ -1,20 +1,22 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
-const URL1 = 'data:text/plain,tab1';
-const URL2 = 'data:text/plain,tab2';
-const URL3 = 'data:text/plain,tab3';
-const URL4 = 'data:text/plain,tab4';
-const URL5 = 'data:text/plain,tab5';
-const URL6 = 'data:text/plain,tab6';
+const URL1 = "data:text/plain,tab1";
+const URL2 = "data:text/plain,tab2";
+const URL3 = "data:text/plain,tab3";
+const URL4 = "data:text/plain,tab4";
+const URL5 = "data:text/plain,tab5";
+const URL6 = "data:text/plain,tab6";
/**
* ensures that tab select action is completed
+ *
+ * @param {MozTabbrowserTab} tab - tab to select
*/
async function selectTab(tab) {
- const onSelect = BrowserTestUtils.waitForEvent(gBrowser.tabContainer, 'TabSelect');
+ const onSelect = BrowserTestUtils.waitForEvent(gBrowser.tabContainer, "TabSelect");
gBrowser.selectedTab = tab;
await onSelect;
}
@@ -35,21 +37,21 @@ add_setup(async () => {
gZenPinnedTabManager.addToEssentials(tabs.slice(0, 3));
await BrowserTestUtils.waitForCondition(
- () => tabs.slice(0, 3).every((tab) => tab.hasAttribute('zen-essential')),
- 'all essentials ready'
+ () => tabs.slice(0, 3).every((tab) => tab.hasAttribute("zen-essential")),
+ "all essentials ready"
);
- const essentialTabs = gBrowser.tabs.filter((tab) => tab.hasAttribute('zen-essential'));
- Assert.equal(essentialTabs.length, 3, '3 essential tabs created');
+ const essentialTabs = gBrowser.tabs.filter((tab) => tab.hasAttribute("zen-essential"));
+ Assert.equal(essentialTabs.length, 3, "3 essential tabs created");
const workspaceTabs = gBrowser.tabs.filter(
- (tab) => !tab.hasAttribute('zen-essential') && !tab.hasAttribute('zen-empty-tab')
+ (tab) => !tab.hasAttribute("zen-essential") && !tab.hasAttribute("zen-empty-tab")
);
- Assert.equal(workspaceTabs.length, 3, '3 workspace tabs created, excluding empty tab');
+ Assert.equal(workspaceTabs.length, 3, "3 workspace tabs created, excluding empty tab");
registerCleanupFunction(async () => {
// replace the default new tab in the test window
- addTabTo(gBrowser, 'about:blank');
+ addTabTo(gBrowser, "about:blank");
tabs.forEach((element) => {
BrowserTestUtils.removeTab(element);
});
@@ -59,22 +61,23 @@ add_setup(async () => {
add_task(async function cycleTabsByAttribute() {
await SpecialPowers.pushPrefEnv({
- set: [['zen.tabs.ctrl-tab.ignore-essential-tabs', true]],
+ set: [["zen.tabs.ctrl-tab.ignore-essential-tabs", true]],
});
- const essentialTabs = gBrowser.tabs.filter((tab) => tab.hasAttribute('zen-essential'));
+ const essentialTabs = gBrowser.tabs.filter((tab) => tab.hasAttribute("zen-essential"));
await selectTab(essentialTabs[0]);
gBrowser.tabContainer.advanceSelectedTab(1, true);
gBrowser.tabContainer.advanceSelectedTab(1, true);
gBrowser.tabContainer.advanceSelectedTab(1, true);
- ok(
- gBrowser.selectedTab === essentialTabs[0],
- 'tab cycling applies within essential tabs only, as the starting tab is a essential tab'
+ Assert.strictEqual(
+ gBrowser.selectedTab,
+ essentialTabs[0],
+ "tab cycling applies within essential tabs only, as the starting tab is a essential tab"
);
const workspaceTabs = gBrowser.tabs.filter(
- (tab) => !tab.hasAttribute('zen-essential') && !tab.hasAttribute('zen-empty-tab')
+ (tab) => !tab.hasAttribute("zen-essential") && !tab.hasAttribute("zen-empty-tab")
);
await selectTab(workspaceTabs[0]);
@@ -82,8 +85,9 @@ add_task(async function cycleTabsByAttribute() {
gBrowser.tabContainer.advanceSelectedTab(1, true);
gBrowser.tabContainer.advanceSelectedTab(1, true);
- ok(
- gBrowser.selectedTab === workspaceTabs[0],
- 'tab cycling applies within workspace tabs only, as the starting tab is a workspace tab'
+ Assert.strictEqual(
+ gBrowser.selectedTab,
+ workspaceTabs[0],
+ "tab cycling applies within workspace tabs only, as the starting tab is a workspace tab"
);
});
diff --git a/src/zen/tests/tabs/browser_tabs_empty_checks.js b/src/zen/tests/tabs/browser_tabs_empty_checks.js
index dd63cbe4a..0694275dc 100644
--- a/src/zen/tests/tabs/browser_tabs_empty_checks.js
+++ b/src/zen/tests/tabs/browser_tabs_empty_checks.js
@@ -1,28 +1,28 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Empty_Tab_Transparent() {
const emptyTab = gZenWorkspaces._emptyTab;
- ok(emptyTab, 'Empty tab should exist');
- ok(emptyTab.parentElement, 'Empty tab should be in the DOM');
- ok(emptyTab.hasAttribute('zen-empty-tab'), 'Empty tab should have the zen-empty-tab attribute');
+ ok(emptyTab, "Empty tab should exist");
+ ok(emptyTab.parentElement, "Empty tab should be in the DOM");
+ ok(emptyTab.hasAttribute("zen-empty-tab"), "Empty tab should have the zen-empty-tab attribute");
ok(
- emptyTab.linkedBrowser.hasAttribute('transparent'),
- 'Empty tab should have the transparent attribute'
+ emptyTab.linkedBrowser.hasAttribute("transparent"),
+ "Empty tab should have the transparent attribute"
);
});
add_task(async function test_Empty_Tab_Always_First() {
- ok(gBrowser.tabs[0].hasAttribute('zen-empty-tab'), 'First tab should be the empty tab');
+ ok(gBrowser.tabs[0].hasAttribute("zen-empty-tab"), "First tab should be the empty tab");
await BrowserTestUtils.withNewTab(
{
gBrowser,
- url: 'http://example.com',
+ url: "https://example.com",
},
async () => {
- ok(gBrowser.tabs[0].hasAttribute('zen-empty-tab'), 'First tab should be the empty tab');
+ ok(gBrowser.tabs[0].hasAttribute("zen-empty-tab"), "First tab should be the empty tab");
}
);
});
diff --git a/src/zen/tests/tabs/browser_tabs_fetch_checks.js b/src/zen/tests/tabs/browser_tabs_fetch_checks.js
index db6fa0f81..b40653f62 100644
--- a/src/zen/tests/tabs/browser_tabs_fetch_checks.js
+++ b/src/zen/tests/tabs/browser_tabs_fetch_checks.js
@@ -1,29 +1,37 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
// Each firefox update, we should run this check, even
// if its a very "basic" one. Just to make sure that we are
// returning tabs correctly.
add_task(async function test_Tabs_Getter() {
for (let tab of gBrowser.tabs) {
- ok(tab.tagName.toLowerCase() === 'tab', 'Each item in gBrowser.tabs is a tab element');
+ Assert.strictEqual(
+ tab.tagName.toLowerCase(),
+ "tab",
+ "Each item in gBrowser.tabs is a tab element"
+ );
}
Assert.equal(
gBrowser.tabs.length,
2,
- 'There should be 2 tabs (1 empty tab + 1 about:blank tab) at startup'
+ "There should be 2 tabs (1 empty tab + 1 about:blank tab) at startup"
);
});
add_task(async function test_Aria_Focusable_Tabs() {
for (let tab of gBrowser.tabContainer.ariaFocusableItems) {
- ok(tab.tagName.toLowerCase() === 'tab', 'Each item in ariaFocusableItems is a tab element');
+ Assert.strictEqual(
+ tab.tagName.toLowerCase(),
+ "tab",
+ "Each item in ariaFocusableItems is a tab element"
+ );
}
Assert.equal(
gBrowser.tabContainer.ariaFocusableItems.length,
1,
- 'There should be 1 focusable tab (1 about:blank tab) at startup'
+ "There should be 1 focusable tab (1 about:blank tab) at startup"
);
});
diff --git a/src/zen/tests/tabs/head.js b/src/zen/tests/tabs/head.js
index ba758a0fc..61d6a9aa5 100644
--- a/src/zen/tests/tabs/head.js
+++ b/src/zen/tests/tabs/head.js
@@ -1,22 +1,22 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
const { TabGroupTestUtils } = ChromeUtils.importESModule(
- 'resource://testing-common/TabGroupTestUtils.sys.mjs'
+ "resource://testing-common/TabGroupTestUtils.sys.mjs"
);
function promiseTabLoadEvent(tab, url) {
- info('Wait tab event: load');
+ info("Wait tab event: load");
function handle(loadedUrl) {
- if (loadedUrl === 'about:blank' || (url && loadedUrl !== url)) {
+ if (loadedUrl === "about:blank" || (url && loadedUrl !== url)) {
info(`Skipping spurious load event for ${loadedUrl}`);
return false;
}
- info('Tab event received: load');
+ info("Tab event received: load");
return true;
}
@@ -30,20 +30,20 @@ function promiseTabLoadEvent(tab, url) {
}
function updateTabContextMenu(tab) {
- let menu = document.getElementById('tabContextMenu');
+ let menu = document.getElementById("tabContextMenu");
if (!tab) {
tab = gBrowser.selectedTab;
}
- var evt = new Event('');
+ var evt = new Event("");
tab.dispatchEvent(evt);
- menu.openPopup(tab, 'end_after', 0, 0, true, false, evt);
- is(window.TabContextMenu.contextTab, tab, 'TabContextMenu context is the expected tab');
+ menu.openPopup(tab, "end_after", 0, 0, true, false, evt);
+ is(window.TabContextMenu.contextTab, tab, "TabContextMenu context is the expected tab");
menu.hidePopup();
}
function triggerClickOn(target, options) {
- let promise = BrowserTestUtils.waitForEvent(target, 'click');
- if (AppConstants.platform == 'macosx') {
+ let promise = BrowserTestUtils.waitForEvent(target, "click");
+ if (AppConstants.platform == "macosx") {
options = {
metaKey: options.ctrlKey,
shiftKey: options.shiftKey,
@@ -54,16 +54,16 @@ function triggerClickOn(target, options) {
}
function triggerMiddleClickOn(target) {
- let promise = BrowserTestUtils.waitForEvent(target, 'click');
+ let promise = BrowserTestUtils.waitForEvent(target, "click");
EventUtils.synthesizeMouseAtCenter(target, { button: 1 });
return promise;
}
-async function addTab(url = 'http://mochi.test:8888/', params) {
+async function addTab(url = "http://mochi.test:8888/", params) {
return addTabTo(gBrowser, url, params);
}
-async function addTabTo(targetBrowser, url = 'http://mochi.test:8888/', params = {}) {
+async function addTabTo(targetBrowser, url = "http://mochi.test:8888/", params = {}) {
params.skipAnimation = true;
const tab = BrowserTestUtils.addTab(targetBrowser, url, params);
const browser = targetBrowser.getBrowserForTab(tab);
@@ -73,7 +73,7 @@ async function addTabTo(targetBrowser, url = 'http://mochi.test:8888/', params =
async function addMediaTab() {
const PAGE =
- 'https://example.com/browser/browser/components/tabbrowser/test/browser/tabs/file_mediaPlayback.html';
+ "https://example.com/browser/browser/components/tabbrowser/test/browser/tabs/file_mediaPlayback.html";
const tab = BrowserTestUtils.addTab(gBrowser, PAGE, { skipAnimation: true });
const browser = gBrowser.getBrowserForTab(tab);
await BrowserTestUtils.browserLoaded(browser);
@@ -95,7 +95,7 @@ async function toggleMuteAudio(tab, expectMuted) {
}
async function pressIcon(icon) {
- let tooltip = document.getElementById('tabbrowser-tab-tooltip');
+ let tooltip = document.getElementById("tabbrowser-tab-tooltip");
await hover_icon(icon, tooltip);
EventUtils.synthesizeMouseAtCenter(icon, { button: 0 });
leave_icon(icon);
@@ -103,20 +103,20 @@ async function pressIcon(icon) {
async function wait_for_tab_playing_event(tab, expectPlaying) {
if (tab.soundPlaying == expectPlaying) {
- ok(true, 'The tab should ' + (expectPlaying ? '' : 'not ') + 'be playing');
+ ok(true, "The tab should " + (expectPlaying ? "" : "not ") + "be playing");
return true;
}
- return BrowserTestUtils.waitForEvent(tab, 'TabAttrModified', false, (event) => {
- if (event.detail.changed.includes('soundplaying')) {
+ return BrowserTestUtils.waitForEvent(tab, "TabAttrModified", false, (event) => {
+ if (event.detail.changed.includes("soundplaying")) {
is(
- tab.hasAttribute('soundplaying'),
+ tab.hasAttribute("soundplaying"),
expectPlaying,
- 'The tab should ' + (expectPlaying ? '' : 'not ') + 'be playing'
+ "The tab should " + (expectPlaying ? "" : "not ") + "be playing"
);
is(
tab.soundPlaying,
expectPlaying,
- 'The tab should ' + (expectPlaying ? '' : 'not ') + 'be playing'
+ "The tab should " + (expectPlaying ? "" : "not ") + "be playing"
);
return true;
}
@@ -126,20 +126,20 @@ async function wait_for_tab_playing_event(tab, expectPlaying) {
async function wait_for_tab_media_blocked_event(tab, expectMediaBlocked) {
if (tab.activeMediaBlocked == expectMediaBlocked) {
- ok(true, 'The tab should ' + (expectMediaBlocked ? '' : 'not ') + 'be activemedia-blocked');
+ ok(true, "The tab should " + (expectMediaBlocked ? "" : "not ") + "be activemedia-blocked");
return true;
}
- return BrowserTestUtils.waitForEvent(tab, 'TabAttrModified', false, (event) => {
- if (event.detail.changed.includes('activemedia-blocked')) {
+ return BrowserTestUtils.waitForEvent(tab, "TabAttrModified", false, (event) => {
+ if (event.detail.changed.includes("activemedia-blocked")) {
is(
- tab.hasAttribute('activemedia-blocked'),
+ tab.hasAttribute("activemedia-blocked"),
expectMediaBlocked,
- 'The tab should ' + (expectMediaBlocked ? '' : 'not ') + 'be activemedia-blocked'
+ "The tab should " + (expectMediaBlocked ? "" : "not ") + "be activemedia-blocked"
);
is(
tab.activeMediaBlocked,
expectMediaBlocked,
- 'The tab should ' + (expectMediaBlocked ? '' : 'not ') + 'be activemedia-blocked'
+ "The tab should " + (expectMediaBlocked ? "" : "not ") + "be activemedia-blocked"
);
return true;
}
@@ -150,7 +150,7 @@ async function wait_for_tab_media_blocked_event(tab, expectMediaBlocked) {
async function is_audio_playing(tab) {
let browser = tab.linkedBrowser;
let isPlaying = await SpecialPowers.spawn(browser, [], async function () {
- let audio = content.document.querySelector('audio');
+ let audio = content.document.querySelector("audio");
return !audio.paused;
});
return isPlaying;
@@ -159,7 +159,7 @@ async function is_audio_playing(tab) {
async function play(tab, expectPlaying = true) {
let browser = tab.linkedBrowser;
await SpecialPowers.spawn(browser, [], async function () {
- let audio = content.document.querySelector('audio');
+ let audio = content.document.querySelector("audio");
audio.play();
});
@@ -184,24 +184,24 @@ function disable_non_test_mouse(disable) {
function hover_icon(icon, tooltip) {
disable_non_test_mouse(true);
- let popupShownPromise = BrowserTestUtils.waitForEvent(tooltip, 'popupshown');
- EventUtils.synthesizeMouse(icon, 1, 1, { type: 'mouseover' });
- EventUtils.synthesizeMouse(icon, 2, 2, { type: 'mousemove' });
- EventUtils.synthesizeMouse(icon, 3, 3, { type: 'mousemove' });
- EventUtils.synthesizeMouse(icon, 4, 4, { type: 'mousemove' });
+ let popupShownPromise = BrowserTestUtils.waitForEvent(tooltip, "popupshown");
+ EventUtils.synthesizeMouse(icon, 1, 1, { type: "mouseover" });
+ EventUtils.synthesizeMouse(icon, 2, 2, { type: "mousemove" });
+ EventUtils.synthesizeMouse(icon, 3, 3, { type: "mousemove" });
+ EventUtils.synthesizeMouse(icon, 4, 4, { type: "mousemove" });
return popupShownPromise;
}
function leave_icon(icon) {
- EventUtils.synthesizeMouse(icon, 0, 0, { type: 'mouseout' });
+ EventUtils.synthesizeMouse(icon, 0, 0, { type: "mouseout" });
EventUtils.synthesizeMouseAtCenter(document.documentElement, {
- type: 'mousemove',
+ type: "mousemove",
});
EventUtils.synthesizeMouseAtCenter(document.documentElement, {
- type: 'mousemove',
+ type: "mousemove",
});
EventUtils.synthesizeMouseAtCenter(document.documentElement, {
- type: 'mousemove',
+ type: "mousemove",
});
disable_non_test_mouse(false);
@@ -212,27 +212,27 @@ function leave_icon(icon) {
let everMutedTabs = new WeakSet();
function get_wait_for_mute_promise(tab, expectMuted) {
- return BrowserTestUtils.waitForEvent(tab, 'TabAttrModified', false, (event) => {
+ return BrowserTestUtils.waitForEvent(tab, "TabAttrModified", false, (event) => {
if (
- event.detail.changed.includes('muted') ||
- event.detail.changed.includes('activemedia-blocked')
+ event.detail.changed.includes("muted") ||
+ event.detail.changed.includes("activemedia-blocked")
) {
is(
- tab.hasAttribute('muted'),
+ tab.hasAttribute("muted"),
expectMuted,
- 'The tab should ' + (expectMuted ? '' : 'not ') + 'be muted'
+ "The tab should " + (expectMuted ? "" : "not ") + "be muted"
);
is(
tab.muted,
expectMuted,
- 'The tab muted property ' + (expectMuted ? '' : 'not ') + 'be true'
+ "The tab muted property " + (expectMuted ? "" : "not ") + "be true"
);
if (expectMuted || everMutedTabs.has(tab)) {
everMutedTabs.add(tab);
- is(tab.muteReason, null, 'The tab should have a null muteReason value');
+ is(tab.muteReason, null, "The tab should have a null muteReason value");
} else {
- is(tab.muteReason, undefined, 'The tab should have an undefined muteReason value');
+ is(tab.muteReason, undefined, "The tab should have an undefined muteReason value");
}
return true;
}
@@ -245,7 +245,7 @@ async function test_mute_tab(tab, icon, expectMuted) {
let activeTab = gBrowser.selectedTab;
- let tooltip = document.getElementById('tabbrowser-tab-tooltip');
+ let tooltip = document.getElementById("tabbrowser-tab-tooltip");
await hover_icon(icon, tooltip);
EventUtils.synthesizeMouseAtCenter(icon, { button: 0 });
@@ -254,7 +254,7 @@ async function test_mute_tab(tab, icon, expectMuted) {
is(
gBrowser.selectedTab,
activeTab,
- 'Clicking on mute should not change the currently selected tab'
+ "Clicking on mute should not change the currently selected tab"
);
// If the audio is playing, we should check whether clicking on icon affects
@@ -294,19 +294,19 @@ async function dragAndDrop(
tab1,
tab2,
null,
- copy ? 'copy' : 'move',
+ copy ? "copy" : "move",
origWindow,
destWindow,
event
);
// Ensure dnd suppression is cleared.
- EventUtils.synthesizeMouseAtCenter(tab2, { type: 'mouseup' }, destWindow);
+ EventUtils.synthesizeMouseAtCenter(tab2, { type: "mouseup" }, destWindow);
if (!copy && destWindow == origWindow) {
await BrowserTestUtils.waitForCondition(() => {
return tab1.elementIndex != originalIndex;
- }, 'Waiting for tab position to be updated');
+ }, "Waiting for tab position to be updated");
} else if (destWindow != origWindow) {
- await BrowserTestUtils.waitForCondition(() => tab1.closing, 'Waiting for tab closing');
+ await BrowserTestUtils.waitForCondition(() => tab1.closing, "Waiting for tab closing");
}
}
@@ -318,12 +318,11 @@ function getUrl(tab) {
* Takes a xul:browser and makes sure that the remoteTypes for the browser in
* both the parent and the child processes are the same.
*
- * @param {xul:browser} browser
- * A xul:browser.
+ * @param {XULBrowser} browser
* @param {string} expectedRemoteType
* The expected remoteType value for the browser in both the parent
* and child processes.
- * @param {optional string} message
+ * @param {string?} message
* If provided, shows this string as the message when remoteType values
* do not match. If not present, it uses the default message defined
* in the function parameters.
@@ -338,14 +337,14 @@ function checkBrowserRemoteType(
ok(E10SUtils.isWebRemoteType(browser.remoteType), message);
ok(
E10SUtils.isWebRemoteType(browser.messageManager.remoteType),
- 'Parent and child process should agree on the remote type.'
+ "Parent and child process should agree on the remote type."
);
} else {
is(browser.remoteType, expectedRemoteType, message);
is(
browser.messageManager.remoteType,
expectedRemoteType,
- 'Parent and child process should agree on the remote type.'
+ "Parent and child process should agree on the remote type."
);
}
}
@@ -367,129 +366,129 @@ function test_url_for_process_types({
is(
E10SUtils.canLoadURIInRemoteType(url, /* fission */ false, CHROME_PROCESS),
chromeResult,
- 'Check URL in chrome process.'
+ "Check URL in chrome process."
);
is(
E10SUtils.canLoadURIInRemoteType(url, /* fission */ false, WEB_CONTENT_PROCESS),
webContentResult,
- 'Check URL in web content process.'
+ "Check URL in web content process."
);
is(
E10SUtils.canLoadURIInRemoteType(url, /* fission */ false, PRIVILEGEDABOUT_CONTENT_PROCESS),
privilegedAboutContentResult,
- 'Check URL in privileged about content process.'
+ "Check URL in privileged about content process."
);
is(
E10SUtils.canLoadURIInRemoteType(url, /* fission */ false, PRIVILEGEDMOZILLA_CONTENT_PROCESS),
privilegedMozillaContentResult,
- 'Check URL in privileged mozilla content process.'
+ "Check URL in privileged mozilla content process."
);
is(
E10SUtils.canLoadURIInRemoteType(url, /* fission */ false, EXTENSION_PROCESS),
extensionProcessResult,
- 'Check URL in extension process.'
+ "Check URL in extension process."
);
is(
- E10SUtils.canLoadURIInRemoteType(url + '#foo', /* fission */ false, CHROME_PROCESS),
+ E10SUtils.canLoadURIInRemoteType(url + "#foo", /* fission */ false, CHROME_PROCESS),
chromeResult,
- 'Check URL with ref in chrome process.'
+ "Check URL with ref in chrome process."
);
is(
- E10SUtils.canLoadURIInRemoteType(url + '#foo', /* fission */ false, WEB_CONTENT_PROCESS),
+ E10SUtils.canLoadURIInRemoteType(url + "#foo", /* fission */ false, WEB_CONTENT_PROCESS),
webContentResult,
- 'Check URL with ref in web content process.'
+ "Check URL with ref in web content process."
);
is(
E10SUtils.canLoadURIInRemoteType(
- url + '#foo',
+ url + "#foo",
/* fission */ false,
PRIVILEGEDABOUT_CONTENT_PROCESS
),
privilegedAboutContentResult,
- 'Check URL with ref in privileged about content process.'
+ "Check URL with ref in privileged about content process."
);
is(
E10SUtils.canLoadURIInRemoteType(
- url + '#foo',
+ url + "#foo",
/* fission */ false,
PRIVILEGEDMOZILLA_CONTENT_PROCESS
),
privilegedMozillaContentResult,
- 'Check URL with ref in privileged mozilla content process.'
+ "Check URL with ref in privileged mozilla content process."
);
is(
- E10SUtils.canLoadURIInRemoteType(url + '#foo', /* fission */ false, EXTENSION_PROCESS),
+ E10SUtils.canLoadURIInRemoteType(url + "#foo", /* fission */ false, EXTENSION_PROCESS),
extensionProcessResult,
- 'Check URL with ref in extension process.'
+ "Check URL with ref in extension process."
);
is(
- E10SUtils.canLoadURIInRemoteType(url + '?foo', /* fission */ false, CHROME_PROCESS),
+ E10SUtils.canLoadURIInRemoteType(url + "?foo", /* fission */ false, CHROME_PROCESS),
chromeResult,
- 'Check URL with query in chrome process.'
+ "Check URL with query in chrome process."
);
is(
- E10SUtils.canLoadURIInRemoteType(url + '?foo', /* fission */ false, WEB_CONTENT_PROCESS),
+ E10SUtils.canLoadURIInRemoteType(url + "?foo", /* fission */ false, WEB_CONTENT_PROCESS),
webContentResult,
- 'Check URL with query in web content process.'
+ "Check URL with query in web content process."
);
is(
E10SUtils.canLoadURIInRemoteType(
- url + '?foo',
+ url + "?foo",
/* fission */ false,
PRIVILEGEDABOUT_CONTENT_PROCESS
),
privilegedAboutContentResult,
- 'Check URL with query in privileged about content process.'
+ "Check URL with query in privileged about content process."
);
is(
E10SUtils.canLoadURIInRemoteType(
- url + '?foo',
+ url + "?foo",
/* fission */ false,
PRIVILEGEDMOZILLA_CONTENT_PROCESS
),
privilegedMozillaContentResult,
- 'Check URL with query in privileged mozilla content process.'
+ "Check URL with query in privileged mozilla content process."
);
is(
- E10SUtils.canLoadURIInRemoteType(url + '?foo', /* fission */ false, EXTENSION_PROCESS),
+ E10SUtils.canLoadURIInRemoteType(url + "?foo", /* fission */ false, EXTENSION_PROCESS),
extensionProcessResult,
- 'Check URL with query in extension process.'
+ "Check URL with query in extension process."
);
is(
- E10SUtils.canLoadURIInRemoteType(url + '?foo#bar', /* fission */ false, CHROME_PROCESS),
+ E10SUtils.canLoadURIInRemoteType(url + "?foo#bar", /* fission */ false, CHROME_PROCESS),
chromeResult,
- 'Check URL with query and ref in chrome process.'
+ "Check URL with query and ref in chrome process."
);
is(
- E10SUtils.canLoadURIInRemoteType(url + '?foo#bar', /* fission */ false, WEB_CONTENT_PROCESS),
+ E10SUtils.canLoadURIInRemoteType(url + "?foo#bar", /* fission */ false, WEB_CONTENT_PROCESS),
webContentResult,
- 'Check URL with query and ref in web content process.'
+ "Check URL with query and ref in web content process."
);
is(
E10SUtils.canLoadURIInRemoteType(
- url + '?foo#bar',
+ url + "?foo#bar",
/* fission */ false,
PRIVILEGEDABOUT_CONTENT_PROCESS
),
privilegedAboutContentResult,
- 'Check URL with query and ref in privileged about content process.'
+ "Check URL with query and ref in privileged about content process."
);
is(
E10SUtils.canLoadURIInRemoteType(
- url + '?foo#bar',
+ url + "?foo#bar",
/* fission */ false,
PRIVILEGEDMOZILLA_CONTENT_PROCESS
),
privilegedMozillaContentResult,
- 'Check URL with query and ref in privileged mozilla content process.'
+ "Check URL with query and ref in privileged mozilla content process."
);
is(
- E10SUtils.canLoadURIInRemoteType(url + '?foo#bar', /* fission */ false, EXTENSION_PROCESS),
+ E10SUtils.canLoadURIInRemoteType(url + "?foo#bar", /* fission */ false, EXTENSION_PROCESS),
extensionProcessResult,
- 'Check URL with query and ref in extension process.'
+ "Check URL with query and ref in extension process."
);
}
@@ -505,8 +504,8 @@ function fileURL(filename) {
/*
* Get a http URL for the local file name.
*/
-function httpURL(filename, host = 'https://example.com/') {
- let root = getRootDirectory(gTestPath).replace('chrome://mochitests/content/', host);
+function httpURL(filename, host = "https://example.com/") {
+ let root = getRootDirectory(gTestPath).replace("chrome://mochitests/content/", host);
return root + filename;
}
@@ -532,11 +531,11 @@ async function removeTabGroup(group) {
*/
async function getContextMenu(triggerNode, contextMenuId) {
let win = triggerNode.ownerGlobal;
- triggerNode.scrollIntoView({ behavior: 'instant' });
+ triggerNode.scrollIntoView({ behavior: "instant" });
const contextMenu = win.document.getElementById(contextMenuId);
- const contextMenuShown = BrowserTestUtils.waitForPopupEvent(contextMenu, 'shown');
+ const contextMenuShown = BrowserTestUtils.waitForPopupEvent(contextMenu, "shown");
- EventUtils.synthesizeMouseAtCenter(triggerNode, { type: 'contextmenu', button: 2 }, win);
+ EventUtils.synthesizeMouseAtCenter(triggerNode, { type: "contextmenu", button: 2 }, win);
await contextMenuShown;
return contextMenu;
}
@@ -546,7 +545,7 @@ async function getContextMenu(triggerNode, contextMenuId) {
* @returns {Promise}
*/
async function closeContextMenu(contextMenu) {
- let menuHidden = BrowserTestUtils.waitForPopupEvent(contextMenu, 'hidden');
+ let menuHidden = BrowserTestUtils.waitForPopupEvent(contextMenu, "hidden");
contextMenu.hidePopup();
await menuHidden;
}
diff --git a/src/zen/tests/ub-actions/browser_ub_actions_search.js b/src/zen/tests/ub-actions/browser_ub_actions_search.js
index 0456abda5..ba961eab2 100644
--- a/src/zen/tests/ub-actions/browser_ub_actions_search.js
+++ b/src/zen/tests/ub-actions/browser_ub_actions_search.js
@@ -1,11 +1,11 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
ChromeUtils.defineESModuleGetters(this, {
- globalActions: 'resource:///modules/ZenUBGlobalActions.sys.mjs',
- UrlbarTestUtils: 'resource://testing-common/UrlbarTestUtils.sys.mjs',
+ globalActions: "resource:///modules/ZenUBGlobalActions.sys.mjs",
+ UrlbarTestUtils: "resource://testing-common/UrlbarTestUtils.sys.mjs",
});
add_task(async function test_Ub_Actions_Search() {
@@ -22,9 +22,9 @@ add_task(async function test_Ub_Actions_Search() {
});
await new Promise((resolve) =>
setTimeout(async () => {
- let index = typeof action.suggestedIndex === 'number' ? action.suggestedIndex : Infinity;
+ let index = typeof action.suggestedIndex === "number" ? action.suggestedIndex : Infinity;
let { result } = await UrlbarTestUtils.getRowAt(window, Math.min(index, 1));
- Assert.equal(result.providerName, 'ZenUrlbarProviderGlobalActions');
+ Assert.equal(result.providerName, "ZenUrlbarProviderGlobalActions");
Assert.equal(result.payload.title, label);
resolve();
}, 0)
diff --git a/src/zen/tests/urlbar/browser_floating_urlbar.js b/src/zen/tests/urlbar/browser_floating_urlbar.js
index fa7e4f82c..02c52ce26 100644
--- a/src/zen/tests/urlbar/browser_floating_urlbar.js
+++ b/src/zen/tests/urlbar/browser_floating_urlbar.js
@@ -1,24 +1,24 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
ChromeUtils.defineESModuleGetters(this, {
- UrlbarTestUtils: 'resource://testing-common/UrlbarTestUtils.sys.mjs',
+ UrlbarTestUtils: "resource://testing-common/UrlbarTestUtils.sys.mjs",
});
add_task(async function test_Floating_Urlbar() {
gURLBar.blur();
await SimpleTest.promiseFocus(window);
- document.getElementById('Browser:OpenLocation').doCommand();
+ document.getElementById("Browser:OpenLocation").doCommand();
await UrlbarTestUtils.promiseAutocompleteResultPopup({
window,
waitForFocus: SimpleTest.waitForFocus,
- value: 'http://example.com/',
+ value: "https://example.com/",
});
- ok(gURLBar.textbox.hasAttribute('zen-floating-urlbar'), 'URL bar should be in floating mode');
+ ok(gURLBar.textbox.hasAttribute("zen-floating-urlbar"), "URL bar should be in floating mode");
});
add_task(async function test_Click_Shoudnt_FLoat_Urlbar() {
@@ -29,12 +29,12 @@ add_task(async function test_Click_Shoudnt_FLoat_Urlbar() {
await UrlbarTestUtils.promiseAutocompleteResultPopup({
window,
waitForFocus: SimpleTest.waitForFocus,
- value: 'http://example.com/',
+ value: "https://example.com/",
});
ok(
- !gURLBar.textbox.hasAttribute('zen-floating-urlbar'),
- 'URL bar should not be in floating mode'
+ !gURLBar.textbox.hasAttribute("zen-floating-urlbar"),
+ "URL bar should not be in floating mode"
);
});
@@ -43,12 +43,13 @@ add_task(async function test_Floating_Highlight_Everything() {
await SimpleTest.promiseFocus(window);
await selectWithMouseDrag(2, 5);
- document.getElementById('Browser:OpenLocation').doCommand();
+ document.getElementById("Browser:OpenLocation").doCommand();
// Selection range
- ok(gURLBar.selectionStart == 0, 'Selection start should be 0');
- ok(
- gURLBar.selectionEnd == gURLBar.value.length,
- 'Selection end should be the length of the value'
+ Assert.equal(gURLBar.selectionStart, 0, "Selection start should be 0");
+ Assert.equal(
+ gURLBar.selectionEnd,
+ gURLBar.value.length,
+ "Selection end should be the length of the value"
);
});
diff --git a/src/zen/tests/urlbar/browser_issue_7385.js b/src/zen/tests/urlbar/browser_issue_7385.js
index 3296cb360..991d1931f 100644
--- a/src/zen/tests/urlbar/browser_issue_7385.js
+++ b/src/zen/tests/urlbar/browser_issue_7385.js
@@ -1,15 +1,15 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
ChromeUtils.defineESModuleGetters(this, {
- UrlbarTestUtils: 'resource://testing-common/UrlbarTestUtils.sys.mjs',
+ UrlbarTestUtils: "resource://testing-common/UrlbarTestUtils.sys.mjs",
});
add_task(async function test_Selection_Remains_Double_Toolbar() {
await goToMultipleLayouts(async () => {
- const untrimmedValue = 'http://example.com';
+ const untrimmedValue = "https://example.com";
let trimmedValue = UrlbarTestUtils.trimURL(untrimmedValue);
gURLBar._setValue(untrimmedValue, {
allowTrim: true,
@@ -17,11 +17,11 @@ add_task(async function test_Selection_Remains_Double_Toolbar() {
});
gURLBar.blur();
await SimpleTest.promiseFocus(window);
- Assert.equal(gURLBar.value, trimmedValue, 'Value has been trimmed');
+ Assert.equal(gURLBar.value, trimmedValue, "Value has been trimmed");
await selectWithMouseDrag(100, 200);
- Assert.greater(gURLBar.selectionStart, 0, 'Selection start is positive.');
- Assert.greater(gURLBar.selectionEnd, gURLBar.selectionStart, 'Selection is not empty.');
+ Assert.greater(gURLBar.selectionStart, 0, "Selection start is positive.");
+ Assert.greater(gURLBar.selectionEnd, gURLBar.selectionStart, "Selection is not empty.");
Assert.equal(gURLBar.value, untrimmedValue, `Value should be untrimmed`);
diff --git a/src/zen/tests/urlbar/head.js b/src/zen/tests/urlbar/head.js
index b999721a5..cb89787fa 100644
--- a/src/zen/tests/urlbar/head.js
+++ b/src/zen/tests/urlbar/head.js
@@ -1,11 +1,11 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
function simulateClick(win = window) {
let target = win.gURLBar.inputField;
- let promise = BrowserTestUtils.waitForEvent(target, 'click');
+ let promise = BrowserTestUtils.waitForEvent(target, "click");
EventUtils.synthesizeMouseAtCenter(target, {});
return promise;
}
@@ -13,36 +13,37 @@ function simulateClick(win = window) {
function selectWithMouseDrag(fromX, toX, win = window) {
let target = win.gURLBar.inputField;
let rect = target.getBoundingClientRect();
- let promise = BrowserTestUtils.waitForEvent(target, 'mouseup');
+ let promise = BrowserTestUtils.waitForEvent(target, "mouseup");
EventUtils.synthesizeMouse(
target,
fromX,
rect.height / 2,
- { type: 'mousemove' },
+ { type: "mousemove" },
target.ownerGlobal
);
EventUtils.synthesizeMouse(
target,
fromX,
rect.height / 2,
- { type: 'mousedown' },
+ { type: "mousedown" },
target.ownerGlobal
);
EventUtils.synthesizeMouse(
target,
toX,
rect.height / 2,
- { type: 'mousemove' },
+ { type: "mousemove" },
target.ownerGlobal
);
- EventUtils.synthesizeMouse(target, toX, rect.height / 2, { type: 'mouseup' }, target.ownerGlobal);
+ EventUtils.synthesizeMouse(target, toX, rect.height / 2, { type: "mouseup" }, target.ownerGlobal);
return promise;
}
function goToMultipleLayouts(callback) {
+ // eslint-disable-next-line no-async-promise-executor
return new Promise(async (resolve) => {
await SpecialPowers.pushPrefEnv({
- set: [['zen.view.use-single-toolbar', false]],
+ set: [["zen.view.use-single-toolbar", false]],
});
setTimeout(async () => {
await callback();
diff --git a/src/zen/tests/welcome/browser_welcome.js b/src/zen/tests/welcome/browser_welcome.js
index 3b95fab20..c9f773050 100644
--- a/src/zen/tests/welcome/browser_welcome.js
+++ b/src/zen/tests/welcome/browser_welcome.js
@@ -1,7 +1,9 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
+
+/* eslint-disable mozilla/no-arbitrary-setTimeout */
add_task(async function test_Welcome_Steps() {
const selectedTab = gBrowser.selectedTab;
@@ -9,7 +11,7 @@ add_task(async function test_Welcome_Steps() {
setTimeout(async () => {
await waitForFocus();
await EventUtils.synthesizeMouseAtCenter(
- document.getElementById('zen-welcome-start-button'),
+ document.getElementById("zen-welcome-start-button"),
{}
);
setTimeout(() => {
@@ -17,35 +19,36 @@ add_task(async function test_Welcome_Steps() {
}, 4000); // Wait for the transition to complete
}, 2000); // Give tons of time for the welcome start button to be clicked
});
- ok(true, 'Welcome start button clicked successfully');
+ ok(true, "Welcome start button clicked successfully");
Assert.equal(
window.windowState,
window.STATE_MAXIMIZED,
- 'Window should be maximized after clicking the welcome start button'
+ "Window should be maximized after clicking the welcome start button"
);
- const welcomeContent = document.getElementById('zen-welcome-page-content');
+ const welcomeContent = document.getElementById("zen-welcome-page-content");
- for (const button of document.querySelectorAll('#zen-welcome-page-sidebar-buttons button')) {
- ok(
- getComputedStyle(button).pointerEvents !== 'none',
- `Button with l10n-id "${button.getAttribute('data-l10n-id')}" should be clickable`
+ for (const button of document.querySelectorAll("#zen-welcome-page-sidebar-buttons button")) {
+ Assert.notStrictEqual(
+ getComputedStyle(button).pointerEvents,
+ "none",
+ `Button with l10n-id "${button.getAttribute("data-l10n-id")}" should be clickable`
);
}
- await goNextWelcomePage('zen-welcome-skip-button');
- ok(true, 'Welcome Import Step Test Finished');
+ await goNextWelcomePage("zen-welcome-skip-button");
+ ok(true, "Welcome Import Step Test Finished");
Assert.greater(
welcomeContent.children.length,
0,
- 'Welcome page content should have children after clicking next action'
+ "Welcome page content should have children after clicking next action"
);
for (const child of welcomeContent.children) {
ok(
- child.querySelector('img').getAttribute('src').includes('blob:'),
- 'Welcome page content should have an image with a base64 data URL'
+ child.querySelector("img").getAttribute("src").includes("blob:"),
+ "Welcome page content should have an image with a base64 data URL"
);
}
@@ -55,56 +58,56 @@ add_task(async function test_Welcome_Steps() {
setTimeout(async () => {
let engineName = await Services.search.getDefault();
const selectedLabel = welcomeContent.children[1];
- ok(selectedLabel.querySelector('input').checked, 'The selected label should be checked');
+ ok(selectedLabel.querySelector("input").checked, "The selected label should be checked");
Assert.equal(
engineName.name,
- selectedLabel.querySelector('label').textContent.trim(),
- 'The default search engine should match the selected label'
+ selectedLabel.querySelector("label").textContent.trim(),
+ "The default search engine should match the selected label"
);
resolve();
}, 100); // Wait for the transition to complete
});
- await goNextWelcomePage('zen-generic-next');
- ok(true, 'Welcome Search Step Test Finished');
+ await goNextWelcomePage("zen-generic-next");
+ ok(true, "Welcome Search Step Test Finished");
await new Promise((resolve) => {
setTimeout(async () => {
const essentials = welcomeContent.querySelector(
- '#zen-welcome-initial-essentials-browser-sidebar-essentials'
+ "#zen-welcome-initial-essentials-browser-sidebar-essentials"
).children;
Assert.greater(
essentials.length,
3,
- 'Welcome page content should have more than 3 essentials after clicking next action'
+ "Welcome page content should have more than 3 essentials after clicking next action"
);
await EventUtils.synthesizeMouseAtCenter(essentials[0], {});
await EventUtils.synthesizeMouseAtCenter(essentials[1], {});
await EventUtils.synthesizeMouseAtCenter(essentials[2], {});
ok(
- essentials[0].hasAttribute('visuallyselected'),
- 'The first essential should be visually selected'
+ essentials[0].hasAttribute("visuallyselected"),
+ "The first essential should be visually selected"
);
ok(
- !essentials[1].hasAttribute('visuallyselected'),
- 'The second essential should be visually selected'
+ !essentials[1].hasAttribute("visuallyselected"),
+ "The second essential should be visually selected"
);
ok(
- essentials[2].hasAttribute('visuallyselected'),
- 'The third essential should be visually selected'
+ essentials[2].hasAttribute("visuallyselected"),
+ "The third essential should be visually selected"
);
const urlsToCheck = [
- essentials[0].getAttribute('data-url'),
- essentials[2].getAttribute('data-url'),
+ essentials[0].getAttribute("data-url"),
+ essentials[2].getAttribute("data-url"),
];
for (const url of urlsToCheck) {
- ok(url.startsWith('https://'), `The URL "${url}" should start with "https://"`);
+ ok(url.startsWith("https://"), `The URL "${url}" should start with "https://"`);
}
- await goNextWelcomePage('zen-generic-next');
+ await goNextWelcomePage("zen-generic-next");
- await new Promise((resolve) => {
+ await new Promise((r) => {
setTimeout(async () => {
for (const url of urlsToCheck) {
ok(
@@ -112,55 +115,57 @@ add_task(async function test_Welcome_Steps() {
`The URL "${url}" should have visits in history`
);
}
- resolve();
+ r();
}, 1000); // Wait for the transition to complete
});
resolve();
}, 1000); // Wait for the transition to complete
});
- await goNextWelcomePage('zen-generic-next');
- ok(true, 'Welcome Theme Step Test Finished');
+ await goNextWelcomePage("zen-generic-next");
+ ok(true, "Welcome Theme Step Test Finished");
- await goNextWelcomePage('zen-welcome-start-browsing');
- ok(true, 'Welcome Finish Step Test Finished');
+ await goNextWelcomePage("zen-welcome-start-browsing");
+ ok(true, "Welcome Finish Step Test Finished");
await new Promise((resolve) => {
setTimeout(async () => {
Assert.greater(
gBrowser._numZenEssentials,
3,
- 'There should be more than 3 Zen Essentials after the welcome process'
+ "There should be more than 3 Zen Essentials after the welcome process"
);
Assert.equal(
- gBrowser.tabs.filter((tab) => tab.pinned && !tab.hasAttribute('zen-essential')).length,
+ gBrowser.tabs.filter((tab) => tab.pinned && !tab.hasAttribute("zen-essential")).length,
3,
- 'There should be 3 pinned tabs after the welcome process'
+ "There should be 3 pinned tabs after the welcome process"
);
gBrowser.selectedTab = selectedTab;
const groups = gBrowser.tabGroups;
- Assert.equal(groups.length, 1, 'There should be one tab group after the welcome process');
+ Assert.equal(groups.length, 1, "There should be one tab group after the welcome process");
const group = groups[0];
Assert.equal(
group.tabs.length,
3,
- 'The first tab group should have 3 tabs after the welcome process'
+ "The first tab group should have 3 tabs after the welcome process"
);
Assert.equal(
group.label,
- 'zen basics',
+ "zen basics",
'The first tab group should be labeled "zen basics" after the welcome process'
);
for (const tab of gBrowser.tabs) {
- if (tab.hasAttribute('zen-empty-tab')) continue;
+ if (tab.hasAttribute("zen-empty-tab")) {
+ continue;
+ }
if (tab.pinned) {
- if (!tab.hasAttribute('zen-essential')) {
+ if (!tab.hasAttribute("zen-essential")) {
ok(
- tab.hasAttribute('zen-workspace-id'),
- 'Pinned tabs should have a zen-workspace-id attribute'
+ tab.hasAttribute("zen-workspace-id"),
+ "Pinned tabs should have a zen-workspace-id attribute"
);
- Assert.equal(tab.group, group, 'Pinned tabs should belong to the first tab group');
+ Assert.equal(tab.group, group, "Pinned tabs should belong to the first tab group");
}
}
}
@@ -173,5 +178,5 @@ add_task(async function test_Welcome_Steps() {
gBrowser.removeTab(tab);
}
}
- ok(true, 'Welcome process completed successfully');
+ ok(true, "Welcome process completed successfully");
});
diff --git a/src/zen/tests/welcome/head.js b/src/zen/tests/welcome/head.js
index 079a50b14..0ac97496d 100644
--- a/src/zen/tests/welcome/head.js
+++ b/src/zen/tests/welcome/head.js
@@ -3,6 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
async function goNextWelcomePage(l10nId) {
+ /* eslint-disable-next-line no-async-promise-executor */
await new Promise(async (resolve) => {
const button = document.querySelector(
`#zen-welcome-page-sidebar-buttons button[data-l10n-id="${l10nId}"]`
diff --git a/src/zen/tests/window_sync/browser_sync_tab_label.js b/src/zen/tests/window_sync/browser_sync_tab_label.js
index 2aaa54dee..9e89f0690 100644
--- a/src/zen/tests/window_sync/browser_sync_tab_label.js
+++ b/src/zen/tests/window_sync/browser_sync_tab_label.js
@@ -1,39 +1,39 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_SimpleLabelChange() {
- let newLabel = 'Test Label';
+ let newLabel = "Test Label";
await withNewTabAndWindow(async (newTab, win) => {
let otherTab = gZenWindowSync.getItemFromWindow(win, newTab.id);
await runSyncAction(
() => {
gBrowser._setTabLabel(newTab, newLabel);
- Assert.equal(newTab.label, newLabel, 'The original tab label should be changed');
+ Assert.equal(newTab.label, newLabel, "The original tab label should be changed");
},
async () => {
Assert.equal(
otherTab.label,
newLabel,
- 'The synced tab label should match the changed label'
+ "The synced tab label should match the changed label"
);
},
- 'ZenTabLabelChanged'
+ "ZenTabLabelChanged"
);
});
});
add_task(async function test_DontChangeBluredTabLabel() {
- let newLabel = 'Test Label';
+ let newLabel = "Test Label";
await withNewTabAndWindow(async (newTab, win) => {
let otherTab = gZenWindowSync.getItemFromWindow(win, newTab.id);
- Assert.ok(!otherTab._zenContentsVisible, 'The synced tab should be blured');
+ Assert.ok(!otherTab._zenContentsVisible, "The synced tab should be blured");
gBrowser._setTabLabel(newTab, newLabel);
Assert.notEqual(
otherTab.label,
newLabel,
- 'The synced tab label should NOT match the changed label'
+ "The synced tab label should NOT match the changed label"
);
});
});
diff --git a/src/zen/tests/window_sync/browser_sync_tab_open.js b/src/zen/tests/window_sync/browser_sync_tab_open.js
index 8d5fc1ff9..e92d1eebf 100644
--- a/src/zen/tests/window_sync/browser_sync_tab_open.js
+++ b/src/zen/tests/window_sync/browser_sync_tab_open.js
@@ -1,14 +1,14 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_SimpleTabOpen() {
await withNewTabAndWindow(async (newTab, win) => {
let tabId = newTab.id;
let otherTab = gZenWindowSync.getItemFromWindow(win, tabId);
- Assert.ok(otherTab, 'The opened tab should be found in the synced window');
- Assert.ok(newTab._zenContentsVisible, 'The opened tab should be visible');
- Assert.equal(otherTab.id, tabId, 'The opened tab ID should match the synced tab ID');
+ Assert.ok(otherTab, "The opened tab should be found in the synced window");
+ Assert.ok(newTab._zenContentsVisible, "The opened tab should be visible");
+ Assert.equal(otherTab.id, tabId, "The opened tab ID should match the synced tab ID");
});
});
diff --git a/src/zen/tests/window_sync/head.js b/src/zen/tests/window_sync/head.js
index 4ad9d8219..cc0e06b94 100644
--- a/src/zen/tests/window_sync/head.js
+++ b/src/zen/tests/window_sync/head.js
@@ -32,13 +32,13 @@ async function withNewTabAndWindow(action) {
await withNewSyncedWindow(async (win) => {
await runSyncAction(
() => {
- newTab = gBrowser.addTrustedTab('https://example.com/', { inBackground: true });
+ newTab = gBrowser.addTrustedTab("https://example.com/", { inBackground: true });
},
async (aEvent) => {
- Assert.equal(aEvent.type, 'TabOpen', 'Event type should be TabOpen');
+ Assert.equal(aEvent.type, "TabOpen", "Event type should be TabOpen");
await action(newTab, win);
},
- 'TabOpen'
+ "TabOpen"
);
});
let portalTabClosing = BrowserTestUtils.waitForTabClosing(newTab);
diff --git a/src/zen/tests/workspaces/browser_basic_workspaces.js b/src/zen/tests/workspaces/browser_basic_workspaces.js
index dc0bc7767..7a8a6f6ca 100644
--- a/src/zen/tests/workspaces/browser_basic_workspaces.js
+++ b/src/zen/tests/workspaces/browser_basic_workspaces.js
@@ -1,33 +1,35 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_setup(async function () {});
add_task(async function test_Check_Creation() {
const currentWorkspaceUUID = gZenWorkspaces.activeWorkspace;
- await gZenWorkspaces.createAndSaveWorkspace('Test Workspace 2');
+ await gZenWorkspaces.createAndSaveWorkspace("Test Workspace 2");
const workspaces = await gZenWorkspaces._workspaces();
- ok(workspaces.length === 2, 'Two workspaces should exist.');
- ok(
- currentWorkspaceUUID !== workspaces[1].uuid,
- 'The new workspace should be different from the current one.'
+ Assert.strictEqual(workspaces.length, 2, "Two workspaces should exist.");
+ Assert.notStrictEqual(
+ currentWorkspaceUUID,
+ workspaces[1].uuid,
+ "The new workspace should be different from the current one."
);
- let newTab = BrowserTestUtils.addTab(gBrowser, 'about:blank', {
+ let newTab = BrowserTestUtils.addTab(gBrowser, "about:blank", {
skipAnimation: true,
});
- ok(newTab, 'New tab should be opened.');
- ok(gBrowser.tabs.length === 2, 'There should be two tabs.');
+ ok(newTab, "New tab should be opened.");
+ Assert.strictEqual(gBrowser.tabs.length, 2, "There should be two tabs.");
BrowserTestUtils.removeTab(newTab);
await gZenWorkspaces.removeWorkspace(gZenWorkspaces.activeWorkspace);
const workspacesAfterRemove = await gZenWorkspaces._workspaces();
- ok(workspacesAfterRemove.workspaces.length === 1, 'One workspace should exist.');
- ok(
- workspacesAfterRemove[0].uuid === currentWorkspaceUUID,
- 'The workspace should be the one we started with.'
+ Assert.strictEqual(workspacesAfterRemove.workspaces.length, 1, "One workspace should exist.");
+ Assert.strictEqual(
+ workspacesAfterRemove[0].uuid,
+ currentWorkspaceUUID,
+ "The workspace should be the one we started with."
);
- ok(gBrowser.tabs.length === 2, 'There should be one tab.');
+ Assert.strictEqual(gBrowser.tabs.length, 2, "There should be one tab.");
});
diff --git a/src/zen/tests/workspaces/browser_change_to_empty.js b/src/zen/tests/workspaces/browser_change_to_empty.js
index 9913a988f..c9dcad942 100644
--- a/src/zen/tests/workspaces/browser_change_to_empty.js
+++ b/src/zen/tests/workspaces/browser_change_to_empty.js
@@ -1,24 +1,30 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Change_To_Empty() {
+ // eslint-disable-next-line no-unused-vars
const currentWorkspaceUUID = gZenWorkspaces.activeWorkspace;
- await gZenWorkspaces.createAndSaveWorkspace('Test Workspace 2');
+ await gZenWorkspaces.createAndSaveWorkspace("Test Workspace 2");
const workspaces = await gZenWorkspaces._workspaces();
const secondWorkspace = workspaces.workspaces[1];
await gZenWorkspaces.changeWorkspace(secondWorkspace.uuid);
- ok(gBrowser.selectedTab === gZenWorkspaces._emptyTab, 'The empty tab should be selected.');
+ Assert.strictEqual(
+ gBrowser.selectedTab,
+ gZenWorkspaces._emptyTab,
+ "The empty tab should be selected."
+ );
await gZenWorkspaces.removeWorkspace(gZenWorkspaces.activeWorkspace);
- ok(
- gBrowser.selectedTab !== gZenWorkspaces._emptyTab,
- 'The empty tab should not be selected anymore.'
+ Assert.notStrictEqual(
+ gBrowser.selectedTab,
+ gZenWorkspaces._emptyTab,
+ "The empty tab should not be selected anymore."
);
const workspacesAfterRemove = await gZenWorkspaces._workspaces();
- ok(workspacesAfterRemove.length === 1, 'One workspace should exist.');
- ok(gBrowser.tabs.length === 2, 'There should be two tabs.');
+ Assert.strictEqual(workspacesAfterRemove.length, 1, "One workspace should exist.");
+ Assert.strictEqual(gBrowser.tabs.length, 2, "There should be two tabs.");
});
diff --git a/src/zen/tests/workspaces/browser_double_click_newtab.js b/src/zen/tests/workspaces/browser_double_click_newtab.js
index affed09a7..024d114f1 100644
--- a/src/zen/tests/workspaces/browser_double_click_newtab.js
+++ b/src/zen/tests/workspaces/browser_double_click_newtab.js
@@ -1,11 +1,11 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_setup(async function () {
await SpecialPowers.pushPrefEnv({
- set: [['zen.urlbar.replace-newtab', false]],
+ set: [["zen.urlbar.replace-newtab", false]],
});
registerCleanupFunction(async () => {
@@ -15,12 +15,12 @@ add_setup(async function () {
add_task(async function test_Check_Creation() {
const placeToDoubleClick = gZenWorkspaces.activeWorkspaceElement.querySelector(
- '.zen-workspace-empty-space'
+ ".zen-workspace-empty-space"
);
- ok(placeToDoubleClick, 'We should have found the place to double click.');
- EventUtils.sendMouseEvent({ type: 'dblclick' }, placeToDoubleClick, window);
- await TestUtils.waitForCondition(() => gBrowser.tabs.length === 3, 'New tab should be opened.');
- ok(true, 'New tab should be opened.');
+ ok(placeToDoubleClick, "We should have found the place to double click.");
+ EventUtils.sendMouseEvent({ type: "dblclick" }, placeToDoubleClick, window);
+ await TestUtils.waitForCondition(() => gBrowser.tabs.length === 3, "New tab should be opened.");
+ ok(true, "New tab should be opened.");
await BrowserTestUtils.removeTab(gBrowser.tabs[1]);
- ok(gBrowser.tabs.length === 2, 'There should be one tab.');
+ Assert.strictEqual(gBrowser.tabs.length, 2, "There should be one tab.");
});
diff --git a/src/zen/tests/workspaces/browser_issue_10455.js b/src/zen/tests/workspaces/browser_issue_10455.js
index 06f428415..7deefcee8 100644
--- a/src/zen/tests/workspaces/browser_issue_10455.js
+++ b/src/zen/tests/workspaces/browser_issue_10455.js
@@ -1,44 +1,44 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Issue_10455() {
await SpecialPowers.pushPrefEnv({
- set: [['browser.tabs.closeWindowWithLastTab', true]],
+ set: [["browser.tabs.closeWindowWithLastTab", true]],
});
let newWindow = await BrowserTestUtils.openNewBrowserWindow();
await newWindow.gZenWorkspaces.promiseInitialized;
ok(
- newWindow.document.documentElement.hasAttribute('zen-workspace-id'),
- 'New window should have a zen-workspace-id attribute'
+ newWindow.document.documentElement.hasAttribute("zen-workspace-id"),
+ "New window should have a zen-workspace-id attribute"
);
- const unloadEvent = BrowserTestUtils.waitForEvent(newWindow, 'unload');
+ const unloadEvent = BrowserTestUtils.waitForEvent(newWindow, "unload");
newWindow.BrowserCommands.closeTabOrWindow();
await unloadEvent;
- ok(newWindow.closed, 'Window should be closing');
+ ok(newWindow.closed, "Window should be closing");
await SpecialPowers.popPrefEnv();
});
add_task(async function test_Issue_10455_Dont_Close() {
await SpecialPowers.pushPrefEnv({
- set: [['browser.tabs.closeWindowWithLastTab', false]],
+ set: [["browser.tabs.closeWindowWithLastTab", false]],
});
let newWindow = await BrowserTestUtils.openNewBrowserWindow();
await newWindow.gZenWorkspaces.promiseInitialized;
ok(
- newWindow.document.documentElement.hasAttribute('zen-workspace-id'),
- 'New window should have a zen-workspace-id attribute'
+ newWindow.document.documentElement.hasAttribute("zen-workspace-id"),
+ "New window should have a zen-workspace-id attribute"
);
newWindow.BrowserCommands.closeTabOrWindow();
- ok(newWindow.gBrowser.tabs.length === 1, 'Window should still have one tab');
- ok(newWindow.gBrowser.selectedTab.hasAttribute('zen-empty-tab'), 'Tab should be a zen empty tab');
- ok(!newWindow.closing, 'Window should be closing');
+ Assert.strictEqual(newWindow.gBrowser.tabs.length, 1, "Window should still have one tab");
+ ok(newWindow.gBrowser.selectedTab.hasAttribute("zen-empty-tab"), "Tab should be a zen empty tab");
+ ok(!newWindow.closing, "Window should be closing");
await BrowserTestUtils.closeWindow(newWindow);
await SpecialPowers.popPrefEnv();
diff --git a/src/zen/tests/workspaces/browser_issue_8699.js b/src/zen/tests/workspaces/browser_issue_8699.js
index b4af08b4b..ae71c2a73 100644
--- a/src/zen/tests/workspaces/browser_issue_8699.js
+++ b/src/zen/tests/workspaces/browser_issue_8699.js
@@ -1,7 +1,7 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Restore_Closed_Tabs() {
const tabsToIgnore = gBrowser.tabs;
@@ -21,7 +21,7 @@ add_task(async function test_Restore_Closed_Tabs() {
Assert.equal(
gBrowser.tabs.length,
5, // 1 initial tab + 3 new tabs
- 'There should be four tabs after opening three new tabs'
+ "There should be four tabs after opening three new tabs"
);
gBrowser.removeTabs(tabsToClose);
gBrowser.selectedTab = selected;
@@ -30,19 +30,19 @@ add_task(async function test_Restore_Closed_Tabs() {
Assert.equal(
gBrowser.selectedTab,
selected,
- 'Current tab should still be selected after closing tabs'
+ "Current tab should still be selected after closing tabs"
);
- Assert.equal(gBrowser.tabs.length, 2, 'There should be one tab left after closing all tabs');
+ Assert.equal(gBrowser.tabs.length, 2, "There should be one tab left after closing all tabs");
SessionWindowUI.restoreLastClosedTabOrWindowOrSession(window);
- ok(!selected.selected, 'Current tab should not be selected after restore');
+ ok(!selected.selected, "Current tab should not be selected after restore");
Assert.equal(
gBrowser.tabs.length,
4, // 3 restored tabs + 1 for empty tab
- 'There should be four tabs after restoring closed tabs'
+ "There should be four tabs after restoring closed tabs"
);
resolve();
});
- await BrowserTestUtils.openNewForegroundTab(window.gBrowser, 'about:blank', true, {
+ await BrowserTestUtils.openNewForegroundTab(window.gBrowser, "about:blank", true, {
skipAnimation: true,
});
for (const tab of gBrowser.tabs.filter((t) => !tabsToIgnore.includes(t))) {
diff --git a/src/zen/tests/workspaces/browser_issue_9900.js b/src/zen/tests/workspaces/browser_issue_9900.js
index dca9625d5..b0fdc3518 100644
--- a/src/zen/tests/workspaces/browser_issue_9900.js
+++ b/src/zen/tests/workspaces/browser_issue_9900.js
@@ -1,37 +1,37 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Invalid_Workspace_Name() {
const fakeWorkspace = {
- name: '',
+ name: "",
};
const icon = gZenWorkspaces.getWorkspaceIcon(fakeWorkspace);
- Assert.equal(icon, fakeWorkspace.icon, 'Test should not have crashed');
+ Assert.equal(icon, fakeWorkspace.icon, "Test should not have crashed");
});
add_task(async function test_Invalid_Workspace_Emoji() {
const fakeWorkspace = {
- name: '👍 test test',
+ name: "👍 test test",
};
const icon = gZenWorkspaces.getWorkspaceIcon(fakeWorkspace);
- Assert.equal(icon, '👍', 'Emoji icon should match the first character of the workspace name');
+ Assert.equal(icon, "👍", "Emoji icon should match the first character of the workspace name");
});
add_task(async function test_Invalid_Workspace_Name() {
const fakeWorkspace = {
- name: 'my workspace',
+ name: "my workspace",
};
const icon = gZenWorkspaces.getWorkspaceIcon(fakeWorkspace);
- Assert.equal(icon, 'M', 'Icon should match the first character of the workspace name');
+ Assert.equal(icon, "M", "Icon should match the first character of the workspace name");
});
add_task(async function test_Invalid_Workspace_Name() {
const fakeWorkspace = {
- name: 'my workspace',
- icon: '👍',
+ name: "my workspace",
+ icon: "👍",
};
const icon = gZenWorkspaces.getWorkspaceIcon(fakeWorkspace);
- Assert.equal(icon, '👍', 'Icon should be from the workspace icon');
+ Assert.equal(icon, "👍", "Icon should be from the workspace icon");
});
diff --git a/src/zen/tests/workspaces/browser_overflow_scrollbox.js b/src/zen/tests/workspaces/browser_overflow_scrollbox.js
index 11f212f1a..f177350ec 100644
--- a/src/zen/tests/workspaces/browser_overflow_scrollbox.js
+++ b/src/zen/tests/workspaces/browser_overflow_scrollbox.js
@@ -1,7 +1,7 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Check_ScrollBox_Overflow() {
const scrollbox = gZenWorkspaces.activeScrollbox;
@@ -9,31 +9,33 @@ add_task(async function test_Check_ScrollBox_Overflow() {
const selectedTab = gBrowser.selectedTab;
const tabsToRemove = [];
while (!scrollbox.overflowing) {
- await BrowserTestUtils.openNewForegroundTab(window.gBrowser, 'https://example.com/', true);
+ await BrowserTestUtils.openNewForegroundTab(window.gBrowser, "https://example.com/", true);
tabsToRemove.push(gBrowser.selectedTab);
}
// An extra tab to ensure the scrollbox is overflowing
- await BrowserTestUtils.openNewForegroundTab(window.gBrowser, 'https://example.com/', true);
+ await BrowserTestUtils.openNewForegroundTab(window.gBrowser, "https://example.com/", true);
tabsToRemove.push(gBrowser.selectedTab);
- ok(scrollbox.overflowing, 'The scrollbox should be overflowing after opening enough tabs');
+ ok(scrollbox.overflowing, "The scrollbox should be overflowing after opening enough tabs");
- ok(scrollbox.scrollPosition === 0, 'The scrollbox should be scrolled to the top');
+ Assert.strictEqual(scrollbox.scrollPosition, 0, "The scrollbox should be scrolled to the top");
gBrowser.selectedTab = gBrowser.tabs[gBrowser.tabs.length - 1];
await new Promise((resolve) => {
+ /* eslint-disable-next-line mozilla/no-arbitrary-setTimeout */
setTimeout(() => {
- Assert.greater(scrollbox.scrollPosition, 0, 'The scrollbox should be scrolled to the bottom');
+ Assert.greater(scrollbox.scrollPosition, 0, "The scrollbox should be scrolled to the bottom");
resolve();
}, 200);
});
gBrowser.selectedTab = gBrowser.visibleTabs[0];
await new Promise((resolve) => {
+ /* eslint-disable-next-line mozilla/no-arbitrary-setTimeout */
setTimeout(() => {
// TODO: Use a real scroll position check instead of a hardcoded value
- Assert.less(scrollbox.scrollPosition, 60, 'The scrollbox should be scrolled to the top');
+ Assert.less(scrollbox.scrollPosition, 60, "The scrollbox should be scrolled to the top");
resolve();
}, 200);
});
diff --git a/src/zen/tests/workspaces/browser_private_mode.js b/src/zen/tests/workspaces/browser_private_mode.js
index aa361ed55..b3f3bd66d 100644
--- a/src/zen/tests/workspaces/browser_private_mode.js
+++ b/src/zen/tests/workspaces/browser_private_mode.js
@@ -1,11 +1,11 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Private_Mode() {
await SpecialPowers.pushPrefEnv({
- set: [['privacy.userContext.enabled', true]],
+ set: [["privacy.userContext.enabled", true]],
});
let privateWindow = await BrowserTestUtils.openNewBrowserWindow({
@@ -13,8 +13,8 @@ add_task(async function test_Private_Mode() {
});
await privateWindow.gZenWorkspaces.promiseInitialized;
ok(
- privateWindow.document.documentElement.hasAttribute('zen-workspace-id'),
- 'Private window should have a zen-workspace-id attribute'
+ privateWindow.document.documentElement.hasAttribute("zen-workspace-id"),
+ "Private window should have a zen-workspace-id attribute"
);
await BrowserTestUtils.closeWindow(privateWindow);
diff --git a/src/zen/tests/workspaces/browser_private_mode_startup.js b/src/zen/tests/workspaces/browser_private_mode_startup.js
index 58ead2d83..4e0224b71 100644
--- a/src/zen/tests/workspaces/browser_private_mode_startup.js
+++ b/src/zen/tests/workspaces/browser_private_mode_startup.js
@@ -1,7 +1,7 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
add_task(async function test_Private_Mode_Startup() {
let privateWindow = await BrowserTestUtils.openNewBrowserWindow({
@@ -9,11 +9,12 @@ add_task(async function test_Private_Mode_Startup() {
});
await privateWindow.gZenWorkspaces.promiseInitialized;
await new Promise((resolve) => {
+ /* eslint-disable-next-line mozilla/no-arbitrary-setTimeout */
setTimeout(() => {
Assert.equal(
privateWindow.gBrowser.tabs.length,
2,
- 'Private window should start with one tab'
+ "Private window should start with one tab"
);
resolve();
}, 1000);
diff --git a/src/zen/tests/workspaces/browser_workspace_bookmarks.js b/src/zen/tests/workspaces/browser_workspace_bookmarks.js
index 4a9e7ec48..c29ba13e9 100644
--- a/src/zen/tests/workspaces/browser_workspace_bookmarks.js
+++ b/src/zen/tests/workspaces/browser_workspace_bookmarks.js
@@ -1,13 +1,15 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+/* eslint-disable mozilla/no-arbitrary-setTimeout */
-const TEST_URL = 'about:buildconfig';
+"use strict";
+
+const TEST_URL = "about:buildconfig";
const TEST_URI = Services.io.newURI(TEST_URL);
function getToolbarNodeForItemGuid(aItemTitle) {
- var children = document.getElementById('PlacesToolbarItems').children;
+ var children = document.getElementById("PlacesToolbarItems").children;
for (let child of children) {
if (aItemTitle == child._placesNode.title) {
return child;
@@ -17,10 +19,10 @@ function getToolbarNodeForItemGuid(aItemTitle) {
}
function isToolbarVisible(aToolbar) {
- let hidingAttribute = aToolbar.getAttribute('type') == 'menubar' ? 'autohide' : 'collapsed';
+ let hidingAttribute = aToolbar.getAttribute("type") == "menubar" ? "autohide" : "collapsed";
let hidingValue = aToolbar.getAttribute(hidingAttribute)?.toLowerCase();
// Check for both collapsed="true" and collapsed="collapsed"
- return hidingValue !== 'true' && hidingValue !== hidingAttribute;
+ return hidingValue !== "true" && hidingValue !== hidingAttribute;
}
function promiseSetToolbarVisibility(aToolbar, aVisible) {
@@ -34,19 +36,19 @@ function promiseSetToolbarVisibility(aToolbar, aVisible) {
async function changeWorkspaceForBookmark(aBookmark, aWorkspace) {
const toolbarNode = getToolbarNodeForItemGuid(aBookmark.title);
- ok(toolbarNode, 'Toolbar node should be found');
+ ok(toolbarNode, "Toolbar node should be found");
await withBookmarksDialog(
false,
async function openPropertiesDialog() {
- let placesContext = document.getElementById('placesContext');
- let promisePopup = BrowserTestUtils.waitForEvent(placesContext, 'popupshown');
+ let placesContext = document.getElementById("placesContext");
+ let promisePopup = BrowserTestUtils.waitForEvent(placesContext, "popupshown");
EventUtils.synthesizeMouseAtCenter(toolbarNode, {
button: 2,
- type: 'contextmenu',
+ type: "contextmenu",
});
await promisePopup;
- let properties = document.getElementById('placesContext_show_bookmark:info');
+ let properties = document.getElementById("placesContext_show_bookmark:info");
placesContext.activateItem(properties, {});
},
async function test(dialogWin) {
@@ -54,7 +56,7 @@ async function changeWorkspaceForBookmark(aBookmark, aWorkspace) {
await TestUtils.waitForCondition(() => dialogWin.document.title);
let openWorkspaceSelectorButton = dialogWin.document.getElementById(
- 'editBMPanel_workspacesSelectorExpander'
+ "editBMPanel_workspacesSelectorExpander"
);
// Open the workspace selector.
@@ -68,7 +70,7 @@ async function changeWorkspaceForBookmark(aBookmark, aWorkspace) {
await setTimeout(() => {}, 100);
// Confirm and close the dialog.
- EventUtils.synthesizeKey('VK_RETURN', {}, dialogWin);
+ EventUtils.synthesizeKey("VK_RETURN", {}, dialogWin);
await setTimeout(() => {}, 100);
}
);
@@ -76,7 +78,7 @@ async function changeWorkspaceForBookmark(aBookmark, aWorkspace) {
async function withBookmarksShowing(aCallback) {
await SpecialPowers.pushPrefEnv({
- set: [['zen.view.hide-window-controls', false]],
+ set: [["zen.view.hide-window-controls", false]],
});
await setTimeout(() => {}, 1000);
await aCallback();
@@ -84,7 +86,7 @@ async function withBookmarksShowing(aCallback) {
}
add_setup(async function () {
- let toolbar = document.getElementById('PersonalToolbar');
+ let toolbar = document.getElementById("PersonalToolbar");
let wasCollapsed = toolbar.collapsed;
// Uncollapse the personal toolbar if needed.
@@ -102,23 +104,25 @@ add_setup(async function () {
});
add_task(async function test_workspace_bookmark() {
- ok(true, 'todo');
+ ok(true, "todo");
+ /* eslint-disable no-unreachable */
return;
await withBookmarksShowing(async () => {
- await gZenWorkspaces.createAndSaveWorkspace('Test Workspace 2');
+ await gZenWorkspaces.createAndSaveWorkspace("Test Workspace 2");
const workspaces = await gZenWorkspaces._workspaces();
- ok(workspaces.length === 2, 'Two workspaces should exist.');
+ Assert.strictEqual(workspaces.length, 2, "Two workspaces should exist.");
const firstWorkspace = workspaces[0];
const secondWorkspace = workspaces[1];
- ok(
- firstWorkspace.uuid !== secondWorkspace.uuid,
- 'The new workspace should be different from the current one.'
+ Assert.notStrictEqual(
+ firstWorkspace.uuid,
+ secondWorkspace.uuid,
+ "The new workspace should be different from the current one."
);
await gZenWorkspaces.changeWorkspaceWithID(firstWorkspace.uuid);
const bookmark1 = await PlacesUtils.bookmarks.insert({
parentGuid: PlacesUtils.bookmarks.toolbarGuid,
- title: 'workspace1',
+ title: "workspace1",
url: TEST_URI,
});
@@ -127,7 +131,7 @@ add_task(async function test_workspace_bookmark() {
await new Promise((resolve) => setTimeout(resolve, 100));
const bookmark2 = await PlacesUtils.bookmarks.insert({
parentGuid: PlacesUtils.bookmarks.toolbarGuid,
- title: 'workspace2',
+ title: "workspace2",
url: TEST_URI,
});
@@ -137,15 +141,15 @@ add_task(async function test_workspace_bookmark() {
await new Promise((resolve) => setTimeout(resolve, 100));
const toolbarNode1 = getToolbarNodeForItemGuid(bookmark1.title);
const toolbarNode2 = getToolbarNodeForItemGuid(bookmark2.title);
- ok(!toolbarNode1, 'Bookmark1 should not be in the toolbar');
- ok(toolbarNode2, 'Bookmark2 should be in the toolbar');
+ ok(!toolbarNode1, "Bookmark1 should not be in the toolbar");
+ ok(toolbarNode2, "Bookmark2 should be in the toolbar");
await gZenWorkspaces.changeWorkspace(firstWorkspace);
await new Promise((resolve) => setTimeout(resolve, 100));
const toolbarNode3 = getToolbarNodeForItemGuid(bookmark1.title);
const toolbarNode4 = getToolbarNodeForItemGuid(bookmark2.title);
- ok(toolbarNode3, 'Bookmark1 should be in the toolbar');
- ok(!toolbarNode4, 'Bookmark2 should not be in the toolbar');
+ ok(toolbarNode3, "Bookmark1 should be in the toolbar");
+ ok(!toolbarNode4, "Bookmark2 should not be in the toolbar");
await PlacesUtils.bookmarks.remove(bookmark1);
await PlacesUtils.bookmarks.remove(bookmark2);
@@ -154,7 +158,7 @@ add_task(async function test_workspace_bookmark() {
Assert.equal(
(await gZenWorkspaces._workspaces()).workspaces.length,
1,
- 'Only one workspace should remain after removing the second one.'
+ "Only one workspace should remain after removing the second one."
);
});
});
diff --git a/src/zen/tests/workspaces/browser_workspace_unload.js b/src/zen/tests/workspaces/browser_workspace_unload.js
index 7f2c60f99..7497a0ef1 100644
--- a/src/zen/tests/workspaces/browser_workspace_unload.js
+++ b/src/zen/tests/workspaces/browser_workspace_unload.js
@@ -1,11 +1,11 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
-'use strict';
+"use strict";
// verify that workspace unloading works
add_task(async function test_UnloadWorkspace_WithMultipleTabs() {
- const workspaceId = await gZenWorkspaces.createAndSaveWorkspace('Test Workspace 1');
+ const workspaceId = await gZenWorkspaces.createAndSaveWorkspace("Test Workspace 1");
const tabs = [];
for (let i = 0; i < 3; i++) {
const tab = await BrowserTestUtils.openNewForegroundTab(
@@ -14,20 +14,20 @@ add_task(async function test_UnloadWorkspace_WithMultipleTabs() {
true,
{ skipAnimation: true }
);
- tab.setAttribute('zen-workspace-id', workspaceId);
+ tab.setAttribute("zen-workspace-id", workspaceId);
tabs.push(tab);
}
for (const tab of tabs) {
- ok(!tab.hasAttribute('pending'), 'Tab should not be pending before unload');
- ok(tab.linkedPanel, 'Tab should have linked panel before unload');
+ ok(!tab.hasAttribute("pending"), "Tab should not be pending before unload");
+ ok(tab.linkedPanel, "Tab should have linked panel before unload");
}
await gZenWorkspaces.unloadWorkspace();
for (const tab of tabs) {
- ok(tab.hasAttribute('pending'), 'Tab should be pending after unload');
- ok(!tab.linkedPanel, 'Tab should not have linked panel after unload');
+ ok(tab.hasAttribute("pending"), "Tab should be pending after unload");
+ ok(!tab.linkedPanel, "Tab should not have linked panel after unload");
}
await gZenWorkspaces.removeWorkspace(workspaceId);
@@ -35,32 +35,32 @@ add_task(async function test_UnloadWorkspace_WithMultipleTabs() {
// verify that essential tabs are not unloaded
add_task(async function test_UnloadWorkspace_WithEssentialTabs() {
- const workspaceId = await gZenWorkspaces.createAndSaveWorkspace('Test Workspace 2');
+ const workspaceId = await gZenWorkspaces.createAndSaveWorkspace("Test Workspace 2");
const regularTab = await BrowserTestUtils.openNewForegroundTab(
window.gBrowser,
- 'data:text/html,Hi! I am a Regular Tab',
+ "data:text/html,Hi! I am a Regular Tab",
true,
{ skipAnimation: true }
);
- regularTab.setAttribute('zen-workspace-id', workspaceId);
+ regularTab.setAttribute("zen-workspace-id", workspaceId);
const essentialTab = await BrowserTestUtils.openNewForegroundTab(
window.gBrowser,
- 'data:text/html,Hi! I am an Essential Tab',
+ "data:text/html,Hi! I am an Essential Tab",
true,
{ skipAnimation: true }
);
- essentialTab.setAttribute('zen-workspace-id', workspaceId);
- essentialTab.setAttribute('zen-essential', 'true');
+ essentialTab.setAttribute("zen-workspace-id", workspaceId);
+ essentialTab.setAttribute("zen-essential", "true");
await gZenWorkspaces.unloadWorkspace();
- ok(regularTab.hasAttribute('pending'), 'Regular tab should be unloaded');
- ok(!regularTab.linkedPanel, 'Regular tab should not have linked panel');
+ ok(regularTab.hasAttribute("pending"), "Regular tab should be unloaded");
+ ok(!regularTab.linkedPanel, "Regular tab should not have linked panel");
- ok(!essentialTab.hasAttribute('pending'), 'Essential tab should not be unloaded');
- ok(essentialTab.linkedPanel, 'Essential tab should still have linked panel');
+ ok(!essentialTab.hasAttribute("pending"), "Essential tab should not be unloaded");
+ ok(essentialTab.linkedPanel, "Essential tab should still have linked panel");
await gZenWorkspaces.removeWorkspace(workspaceId);
});
@@ -68,9 +68,9 @@ add_task(async function test_UnloadWorkspace_WithEssentialTabs() {
// only tabs from the targeted workspace should be unloaded
add_task(async function test_UnloadWorkspace_TargetedWorkspaceIsolation() {
const inActiveWorkspaceId = await gZenWorkspaces.createAndSaveWorkspace(
- 'Test In-Active Workspace'
+ "Test In-Active Workspace"
);
- const activeWorkspaceId = await gZenWorkspaces.createAndSaveWorkspace('Test Active Workspace');
+ const activeWorkspaceId = await gZenWorkspaces.createAndSaveWorkspace("Test Active Workspace");
const inActiveWorkspaceTabs = [];
for (let i = 0; i < 2; i++) {
@@ -80,7 +80,7 @@ add_task(async function test_UnloadWorkspace_TargetedWorkspaceIsolation() {
true,
{ skipAnimation: true }
);
- tab.setAttribute('zen-workspace-id', inActiveWorkspaceId);
+ tab.setAttribute("zen-workspace-id", inActiveWorkspaceId);
inActiveWorkspaceTabs.push(tab);
}
@@ -92,20 +92,20 @@ add_task(async function test_UnloadWorkspace_TargetedWorkspaceIsolation() {
true,
{ skipAnimation: true }
);
- tab.setAttribute('zen-workspace-id', activeWorkspaceId);
+ tab.setAttribute("zen-workspace-id", activeWorkspaceId);
activeWorkspaceTabs.push(tab);
}
await gZenWorkspaces.unloadWorkspace(); // this unloads the latest created workspace -> activeWorkspaceId
for (const tab of activeWorkspaceTabs) {
- ok(tab.hasAttribute('pending'), 'Active workspace tab should be pending after unload');
- ok(!tab.linkedPanel, 'Active workspace tab should not have linked panel after unload');
+ ok(tab.hasAttribute("pending"), "Active workspace tab should be pending after unload");
+ ok(!tab.linkedPanel, "Active workspace tab should not have linked panel after unload");
}
for (const tab of inActiveWorkspaceTabs) {
- ok(!tab.hasAttribute('pending'), 'In-Active workspace tab should NOT be pending after unload');
- ok(tab.linkedPanel, 'In-Active workspace tab should still have linked panel after unload');
+ ok(!tab.hasAttribute("pending"), "In-Active workspace tab should NOT be pending after unload");
+ ok(tab.linkedPanel, "In-Active workspace tab should still have linked panel after unload");
}
await gZenWorkspaces.removeWorkspace(inActiveWorkspaceId);
diff --git a/src/zen/tests/workspaces/head.js b/src/zen/tests/workspaces/head.js
index 9443d7683..4f0f97f8a 100644
--- a/src/zen/tests/workspaces/head.js
+++ b/src/zen/tests/workspaces/head.js
@@ -8,27 +8,27 @@ const TAB_STATE_NEEDS_RESTORE = 1;
const TAB_STATE_RESTORING = 2;
const ROOT = getRootDirectory(gTestPath);
-const HTTPROOT = ROOT.replace('chrome://mochitests/content/', 'http://example.com/');
-const HTTPSROOT = ROOT.replace('chrome://mochitests/content/', 'https://example.com/');
+const HTTPROOT = ROOT.replace("chrome://mochitests/content/", "https://example.com/");
+const HTTPSROOT = ROOT.replace("chrome://mochitests/content/", "https://example.com/");
const { SessionSaver } = ChromeUtils.importESModule(
- 'resource:///modules/sessionstore/SessionSaver.sys.mjs'
+ "resource:///modules/sessionstore/SessionSaver.sys.mjs"
);
const { SessionFile } = ChromeUtils.importESModule(
- 'resource:///modules/sessionstore/SessionFile.sys.mjs'
+ "resource:///modules/sessionstore/SessionFile.sys.mjs"
);
const { TabState } = ChromeUtils.importESModule(
- 'resource:///modules/sessionstore/TabState.sys.mjs'
+ "resource:///modules/sessionstore/TabState.sys.mjs"
);
const { TabStateFlusher } = ChromeUtils.importESModule(
- 'resource:///modules/sessionstore/TabStateFlusher.sys.mjs'
+ "resource:///modules/sessionstore/TabStateFlusher.sys.mjs"
);
const { SessionStoreTestUtils } = ChromeUtils.importESModule(
- 'resource://testing-common/SessionStoreTestUtils.sys.mjs'
+ "resource://testing-common/SessionStoreTestUtils.sys.mjs"
);
const { PageWireframes } = ChromeUtils.importESModule(
- 'resource:///modules/sessionstore/PageWireframes.sys.mjs'
+ "resource:///modules/sessionstore/PageWireframes.sys.mjs"
);
const ss = SessionStore;
@@ -37,20 +37,20 @@ SessionStoreTestUtils.init(this, window);
// Some tests here assume that all restored tabs are loaded without waiting for
// the user to bring them to the foreground. We ensure this by resetting the
// related preference (see the "firefox.js" defaults file for details).
-Services.prefs.setBoolPref('browser.sessionstore.restore_on_demand', false);
+Services.prefs.setBoolPref("browser.sessionstore.restore_on_demand", false);
registerCleanupFunction(function () {
- Services.prefs.clearUserPref('browser.sessionstore.restore_on_demand');
+ Services.prefs.clearUserPref("browser.sessionstore.restore_on_demand");
});
// Obtain access to internals
-Services.prefs.setBoolPref('browser.sessionstore.debug', true);
+Services.prefs.setBoolPref("browser.sessionstore.debug", true);
registerCleanupFunction(function () {
- Services.prefs.clearUserPref('browser.sessionstore.debug');
+ Services.prefs.clearUserPref("browser.sessionstore.debug");
});
// This kicks off the search service used on about:home and allows the
// session restore tests to be run standalone without triggering errors.
-Cc['@mozilla.org/browser/clh;1'].getService(Ci.nsIBrowserHandler).defaultArgs;
+Cc["@mozilla.org/browser/clh;1"].getService(Ci.nsIBrowserHandler).defaultArgs;
function provideWindow(aCallback, aURL, aFeatures) {
function callbackSoon(aWindow) {
@@ -61,19 +61,19 @@ function provideWindow(aCallback, aURL, aFeatures) {
let win = openDialog(
AppConstants.BROWSER_CHROME_URL,
- '',
- aFeatures || 'chrome,all,dialog=no',
- aURL || 'about:blank'
+ "",
+ aFeatures || "chrome,all,dialog=no",
+ aURL || "about:blank"
);
whenWindowLoaded(win, function onWindowLoaded(aWin) {
if (!aURL) {
- info('Loaded a blank window.');
+ info("Loaded a blank window.");
callbackSoon(aWin);
return;
}
aWin.gBrowser.selectedBrowser.addEventListener(
- 'load',
+ "load",
function () {
callbackSoon(aWin);
},
@@ -92,7 +92,7 @@ function promiseBrowserState(aState) {
}
function promiseTabState(tab, state) {
- if (typeof state != 'string') {
+ if (typeof state != "string") {
state = JSON.stringify(state);
}
@@ -103,23 +103,23 @@ function promiseTabState(tab, state) {
function promiseWindowRestoring(win) {
return new Promise((resolve) =>
- win.addEventListener('SSWindowRestoring', resolve, { once: true })
+ win.addEventListener("SSWindowRestoring", resolve, { once: true })
);
}
function promiseWindowRestored(win) {
return new Promise((resolve) =>
- win.addEventListener('SSWindowRestored', resolve, { once: true })
+ win.addEventListener("SSWindowRestored", resolve, { once: true })
);
}
async function setBrowserState(state, win = window) {
- ss.setBrowserState(typeof state != 'string' ? JSON.stringify(state) : state);
+ ss.setBrowserState(typeof state != "string" ? JSON.stringify(state) : state);
await promiseWindowRestored(win);
}
async function setWindowState(win, state, overwrite = false) {
- ss.setWindowState(win, typeof state != 'string' ? JSON.stringify(state) : state, overwrite);
+ ss.setWindowState(win, typeof state != "string" ? JSON.stringify(state) : state, overwrite);
await promiseWindowRestored(win);
}
@@ -159,19 +159,19 @@ function waitForTopic(aTopic, aTimeout, aCallback) {
* Wait until session restore has finished collecting its data and is
* has written that data ("sessionstore-state-write-complete").
*
- * @param {function} aCallback If sessionstore-state-write-complete is sent
+ * @param {() => void} aCallback If sessionstore-state-write-complete is sent
* within buffering interval + 100 ms, the callback is passed |true|,
* otherwise, it is passed |false|.
*/
function waitForSaveState(aCallback) {
- let timeout = 100 + Services.prefs.getIntPref('browser.sessionstore.interval');
- return waitForTopic('sessionstore-state-write-complete', timeout, aCallback);
+ let timeout = 100 + Services.prefs.getIntPref("browser.sessionstore.interval");
+ return waitForTopic("sessionstore-state-write-complete", timeout, aCallback);
}
function promiseSaveState() {
return new Promise((resolve, reject) => {
waitForSaveState((isSuccessful) => {
if (!isSuccessful) {
- reject(new Error('Save state timeout'));
+ reject(new Error("Save state timeout"));
} else {
resolve();
}
@@ -193,14 +193,14 @@ function promiseRecoveryFileContents() {
var promiseForEachSessionRestoreFile = async function (cb) {
for (let key of SessionFile.Paths.loadOrder) {
- let data = '';
+ let data = "";
try {
data = await IOUtils.readUTF8(SessionFile.Paths[key], {
decompress: true,
});
} catch (ex) {
// Ignore missing files
- if (!(DOMException.isInstance(ex) && ex.name == 'NotFoundError')) {
+ if (!(DOMException.isInstance(ex) && ex.name == "NotFoundError")) {
throw ex;
}
}
@@ -214,7 +214,7 @@ function promiseBrowserLoaded(aBrowser, ignoreSubFrames = true, wantLoad = null)
function whenWindowLoaded(aWindow, aCallback) {
aWindow.addEventListener(
- 'load',
+ "load",
function () {
executeSoon(function executeWhenWindowLoaded() {
aCallback(aWindow);
@@ -229,11 +229,11 @@ function promiseWindowLoaded(aWindow) {
var gUniqueCounter = 0;
function r() {
- return Date.now() + '-' + ++gUniqueCounter;
+ return Date.now() + "-" + ++gUniqueCounter;
}
function* BrowserWindowIterator() {
- for (let currentWindow of Services.wm.getEnumerator('navigator:browser')) {
+ for (let currentWindow of Services.wm.getEnumerator("navigator:browser")) {
if (!currentWindow.closed) {
yield currentWindow;
}
@@ -276,14 +276,14 @@ var gProgressListener = {
_callback: null,
setCallback(callback) {
- Services.obs.addObserver(this, 'sessionstore-debug-tab-restored');
+ Services.obs.addObserver(this, "sessionstore-debug-tab-restored");
this._callback = callback;
},
unsetCallback() {
if (this._callback) {
this._callback = null;
- Services.obs.removeObserver(this, 'sessionstore-debug-tab-restored');
+ Services.obs.removeObserver(this, "sessionstore-debug-tab-restored");
}
},
@@ -372,27 +372,30 @@ function forgetClosedTabGroups(win) {
* has been dispatched. browser-delayed-startup-finished might be deferred even
* further if parts of the window's initialization process take more time than
* expected (e.g. reading a big session state from disk).
+ *
+ * @param {object} aOptions
+ * @param {() => void} aCallback
*/
function whenNewWindowLoaded(aOptions, aCallback) {
- let features = '';
- let url = 'about:blank';
+ let features = "";
+ let url = "about:blank";
if ((aOptions && aOptions.private) || false) {
- features = ',private';
- url = 'about:privatebrowsing';
+ features = ",private";
+ url = "about:privatebrowsing";
}
- let win = openDialog(AppConstants.BROWSER_CHROME_URL, '', 'chrome,all,dialog=no' + features, url);
+ let win = openDialog(AppConstants.BROWSER_CHROME_URL, "", "chrome,all,dialog=no" + features, url);
let delayedStartup = promiseDelayedStartupFinished(win);
let browserLoaded = new Promise((resolve) => {
- if (url == 'about:blank') {
+ if (url == "about:blank") {
resolve();
return;
}
win.addEventListener(
- 'load',
+ "load",
function () {
let browser = win.gBrowser.selectedBrowser;
promiseBrowserLoaded(browser).then(resolve);
@@ -411,6 +414,9 @@ function promiseNewWindowLoaded(aOptions) {
* This waits for the browser-delayed-startup-finished notification of a given
* window. It indicates that the windows has loaded completely and is ready to
* be used for testing.
+ *
+ * @param {Window} aWindow
+ * @param {() => void} aCallback
*/
function whenDelayedStartupFinished(aWindow, aCallback) {
Services.obs.addObserver(function observer(aSubject, aTopic) {
@@ -418,18 +424,18 @@ function whenDelayedStartupFinished(aWindow, aCallback) {
Services.obs.removeObserver(observer, aTopic);
executeSoon(aCallback);
}
- }, 'browser-delayed-startup-finished');
+ }, "browser-delayed-startup-finished");
}
function promiseDelayedStartupFinished(aWindow) {
return new Promise((resolve) => whenDelayedStartupFinished(aWindow, resolve));
}
function promiseTabRestored(tab) {
- return BrowserTestUtils.waitForEvent(tab, 'SSTabRestored');
+ return BrowserTestUtils.waitForEvent(tab, "SSTabRestored");
}
function promiseTabRestoring(tab) {
- return BrowserTestUtils.waitForEvent(tab, 'SSTabRestoring');
+ return BrowserTestUtils.waitForEvent(tab, "SSTabRestoring");
}
// Removes the given tab immediately and returns a promise that resolves when
@@ -443,7 +449,7 @@ function promiseRemoveTabAndSessionState(tab) {
// Write DOMSessionStorage data to the given browser.
function modifySessionStorage(browser, storageData, storageOptions = {}) {
let browsingContext = browser.browsingContext;
- if (storageOptions && 'frameIndex' in storageOptions) {
+ if (storageOptions && "frameIndex" in storageOptions) {
browsingContext = browsingContext.children[storageOptions.frameIndex];
}
@@ -458,7 +464,7 @@ function modifySessionStorage(browser, storageData, storageOptions = {}) {
return new Promise((resolve) => {
docShell.chromeEventHandler.addEventListener(
- 'MozSessionStorageChanged',
+ "MozSessionStorageChanged",
function onStorageChanged(event) {
if (event.storageArea == storage) {
keys.delete(event.key);
@@ -466,7 +472,7 @@ function modifySessionStorage(browser, storageData, storageOptions = {}) {
if (keys.size == 0) {
docShell.chromeEventHandler.removeEventListener(
- 'MozSessionStorageChanged',
+ "MozSessionStorageChanged",
onStorageChanged,
true
);
@@ -500,10 +506,10 @@ function setScrollPosition(bc, x, y) {
return SpecialPowers.spawn(bc, [x, y], (childX, childY) => {
return new Promise((resolve) => {
content.addEventListener(
- 'mozvisualscroll',
+ "mozvisualscroll",
function onScroll(event) {
if (content.document.ownerGlobal.visualViewport == event.target) {
- content.removeEventListener('mozvisualscroll', onScroll, {
+ content.removeEventListener("mozvisualscroll", onScroll, {
mozSystemGroup: true,
});
resolve();
@@ -528,7 +534,7 @@ function whenDomWindowClosedHandled(aCallback) {
Services.obs.addObserver(function observer(aSubject, aTopic) {
Services.obs.removeObserver(observer, aTopic);
aCallback();
- }, 'sessionstore-debug-domwindowclosed-handled');
+ }, "sessionstore-debug-domwindowclosed-handled");
}
function getPropertyOfFormField(browserContext, selector, propName) {
@@ -549,8 +555,8 @@ function setPropertyOfFormField(browserContext, selector, propName, newValue) {
let node = content.document.querySelector(selectorChild);
node[propNameChild] = newValueChild;
- let event = node.ownerDocument.createEvent('UIEvents');
- event.initUIEvent('input', true, true, node.ownerGlobal, 0);
+ let event = node.ownerDocument.createEvent("UIEvents");
+ event.initUIEvent("input", true, true, node.ownerGlobal, 0);
node.dispatchEvent(event);
}
);
@@ -572,7 +578,7 @@ function promiseOnHistoryReplaceEntry(browser) {
resolve();
},
- QueryInterface: ChromeUtils.generateQI(['nsISHistoryListener', 'nsISupportsWeakReference']),
+ QueryInterface: ChromeUtils.generateQI(["nsISHistoryListener", "nsISupportsWeakReference"]),
};
sessionHistory.addSHistoryListener(historyListener);
@@ -591,7 +597,7 @@ function addCoopTask(aFile, aTest, aUrlRoot) {
let url = aUrlRoot + `coopHeaderCommon.sjs?fileRoot=${filePath}`;
await aTest(url);
}
- Object.defineProperty(taskToBeAdded, 'name', { value: aTest.name });
+ Object.defineProperty(taskToBeAdded, "name", { value: aTest.name });
add_task(taskToBeAdded);
}
@@ -599,7 +605,7 @@ function addNonCoopTask(aFile, aTest, aUrlRoot) {
async function taskToBeAdded() {
await aTest(aUrlRoot + aFile);
}
- Object.defineProperty(taskToBeAdded, 'name', { value: aTest.name });
+ Object.defineProperty(taskToBeAdded, "name", { value: aTest.name });
add_task(taskToBeAdded);
}
@@ -611,6 +617,8 @@ function openAndCloseTab(window, url) {
* This is regrettable, but when `promiseBrowserState` resolves, we're still
* midway through loading the tabs. To avoid race conditions in URLs for tabs
* being available, wait for all the loads to finish:
+ *
+ * @param {number} numberOfLoads
*/
function promiseSessionStoreLoads(numberOfLoads) {
let loadsSeen = 0;
@@ -622,17 +630,17 @@ function promiseSessionStoreLoads(numberOfLoads) {
}
// The typeof check is here to avoid one test messing with everything else by
// keeping the observer indefinitely.
- if (typeof info == 'undefined' || loadsSeen >= numberOfLoads) {
- Services.obs.removeObserver(obs, 'sessionstore-debug-tab-restored');
+ if (typeof info == "undefined" || loadsSeen >= numberOfLoads) {
+ Services.obs.removeObserver(obs, "sessionstore-debug-tab-restored");
}
- info('Saw load for ' + browser.currentURI.spec);
- }, 'sessionstore-debug-tab-restored');
+ info("Saw load for " + browser.currentURI.spec);
+ }, "sessionstore-debug-tab-restored");
});
}
function triggerClickOn(target, options) {
- let promise = BrowserTestUtils.waitForEvent(target, 'click');
- if (AppConstants.platform == 'macosx') {
+ let promise = BrowserTestUtils.waitForEvent(target, "click");
+ if (AppConstants.platform == "macosx") {
options.metaKey = options.ctrlKey;
delete options.ctrlKey;
}
@@ -641,21 +649,21 @@ function triggerClickOn(target, options) {
}
async function openTabMenuFor(tab) {
- let tabMenu = tab.ownerDocument.getElementById('tabContextMenu');
+ let tabMenu = tab.ownerDocument.getElementById("tabContextMenu");
- let tabMenuShown = BrowserTestUtils.waitForEvent(tabMenu, 'popupshown');
- EventUtils.synthesizeMouseAtCenter(tab, { type: 'contextmenu' }, tab.ownerGlobal);
+ let tabMenuShown = BrowserTestUtils.waitForEvent(tabMenu, "popupshown");
+ EventUtils.synthesizeMouseAtCenter(tab, { type: "contextmenu" }, tab.ownerGlobal);
await tabMenuShown;
return tabMenu;
}
var withBookmarksDialog = async function (autoCancel, openFn, taskFn, closeFn) {
- let dialogUrl = 'chrome://browser/content/places/bookmarkProperties.xhtml';
+ let dialogUrl = "chrome://browser/content/places/bookmarkProperties.xhtml";
let closed = false;
// We can't show the in-window prompt for windows which don't have
// gDialogBox, like the library (Places:Organizer) window.
- let hasDialogBox = !!Services.wm.getMostRecentWindow('').gDialogBox;
+ let hasDialogBox = !!Services.wm.getMostRecentWindow("").gDialogBox;
let dialogPromise;
if (hasDialogBox) {
dialogPromise = BrowserTestUtils.promiseAlertDialogOpen(null, dialogUrl, {
@@ -667,7 +675,7 @@ var withBookmarksDialog = async function (autoCancel, openFn, taskFn, closeFn) {
}).then((win) => {
ok(
win.location.href.startsWith(dialogUrl),
- 'The bookmark properties dialog is open: ' + win.location.href
+ "The bookmark properties dialog is open: " + win.location.href
);
// This is needed for the overlay.
return SimpleTest.promiseFocus(win).then(() => win);
@@ -677,8 +685,8 @@ var withBookmarksDialog = async function (autoCancel, openFn, taskFn, closeFn) {
if (!hasDialogBox) {
return BrowserTestUtils.domWindowClosed(win);
}
- let container = win.top.document.getElementById('window-modal-dialog');
- return BrowserTestUtils.waitForEvent(container, 'close').then(() => {
+ let container = win.top.document.getElementById("window-modal-dialog");
+ return BrowserTestUtils.waitForEvent(container, "close").then(() => {
return BrowserTestUtils.waitForMutationCondition(
container,
{ childList: true, attributes: true },
@@ -690,31 +698,31 @@ var withBookmarksDialog = async function (autoCancel, openFn, taskFn, closeFn) {
closed = true;
});
- info('withBookmarksDialog: opening the dialog');
+ info("withBookmarksDialog: opening the dialog");
// The dialog might be modal and could block our events loop, so executeSoon.
executeSoon(openFn);
- info('withBookmarksDialog: waiting for the dialog');
+ info("withBookmarksDialog: waiting for the dialog");
let dialogWin = await dialogPromise;
// Ensure overlay is loaded
- info('waiting for the overlay to be loaded');
+ info("waiting for the overlay to be loaded");
await dialogWin.document.mozSubdialogReady;
// Check the first input is focused.
let doc = dialogWin.document;
let elt = doc.querySelector('input:not([hidden="true"])');
- ok(elt, 'There should be an input to focus.');
+ ok(elt, "There should be an input to focus.");
if (elt) {
- info('waiting for focus on the first textfield');
+ info("waiting for focus on the first textfield");
await TestUtils.waitForCondition(
() => doc.activeElement == elt,
- 'The first non collapsed input should have been focused'
+ "The first non collapsed input should have been focused"
);
}
- info('withBookmarksDialog: executing the task');
+ info("withBookmarksDialog: executing the task");
let closePromise = () => Promise.resolve();
if (closeFn) {
@@ -725,8 +733,8 @@ var withBookmarksDialog = async function (autoCancel, openFn, taskFn, closeFn) {
await taskFn(dialogWin);
} finally {
if (!closed && autoCancel) {
- info('withBookmarksDialog: canceling the dialog');
- doc.getElementById('bookmarkpropertiesdialog').cancelDialog();
+ info("withBookmarksDialog: canceling the dialog");
+ doc.getElementById("bookmarkpropertiesdialog").cancelDialog();
await closePromise;
}
guid = await PlacesUIUtils.lastBookmarkDialogDeferred.promise;
diff --git a/src/zen/urlbar/ZenSiteDataPanel.sys.mjs b/src/zen/urlbar/ZenSiteDataPanel.sys.mjs
index 3f7b79bf0..f5396a96b 100644
--- a/src/zen/urlbar/ZenSiteDataPanel.sys.mjs
+++ b/src/zen/urlbar/ZenSiteDataPanel.sys.mjs
@@ -2,24 +2,24 @@
* 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";
const ADDONS_BUTTONS_HIDDEN = Services.prefs.getBoolPref(
- 'zen.theme.hide-unified-extensions-button',
+ "zen.theme.hide-unified-extensions-button",
true
);
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
- FeatureCallout: 'resource:///modules/asrouter/FeatureCallout.sys.mjs',
+ FeatureCallout: "resource:///modules/asrouter/FeatureCallout.sys.mjs",
});
export class nsZenSiteDataPanel {
#iconMap = {
- install: 'extension',
- 'site-protection': 'shield',
- '3rdPartyStorage': 'cookie',
+ install: "extension",
+ "site-protection": "shield",
+ "3rdPartyStorage": "cookie",
};
constructor(window) {
@@ -27,14 +27,14 @@ export class nsZenSiteDataPanel {
this.document = window.document;
this.unifiedPanel = this.#initUnifiedPanel();
- this.unifiedPanelView = 'unified-extensions-view';
- this.extensionsPanelView = 'original-unified-extensions-view';
+ this.unifiedPanelView = "unified-extensions-view";
+ this.extensionsPanelView = "original-unified-extensions-view";
if (ADDONS_BUTTONS_HIDDEN) {
this.window.gUnifiedExtensions._panel = this.unifiedPanel;
// Remove the old permissions dialog
- this.document.getElementById('unified-extensions-panel-template').remove();
+ this.document.getElementById("unified-extensions-panel-template").remove();
} else {
this.extensionsPanel = this.#initExtensionsPanel();
}
@@ -49,17 +49,17 @@ export class nsZenSiteDataPanel {
`);
- this.anchor = button.querySelector('#zen-site-data-icon-button');
- this.document.getElementById('identity-icon-box').before(button);
+ this.anchor = button.querySelector("#zen-site-data-icon-button");
+ this.document.getElementById("identity-icon-box").before(button);
- this.extensionsPanelButton = this.document.getElementById('unified-extensions-button');
+ this.extensionsPanelButton = this.document.getElementById("unified-extensions-button");
this.window.gUnifiedExtensions._button = ADDONS_BUTTONS_HIDDEN
? this.anchor
: this.extensionsPanelButton;
this.document
- .getElementById('nav-bar')
- .setAttribute('addon-webext-overflowbutton', 'zen-site-data-icon-button');
+ .getElementById("nav-bar")
+ .setAttribute("addon-webext-overflowbutton", "zen-site-data-icon-button");
this.#initCopyUrlButton();
this.#initEventListeners();
@@ -68,20 +68,20 @@ export class nsZenSiteDataPanel {
}
#initEventListeners() {
- this.unifiedPanel.addEventListener('popupshowing', this);
- this.document.getElementById('zen-site-data-manage-addons').addEventListener('click', this);
- this.document.getElementById('zen-site-data-settings-more').addEventListener('click', this);
- this.anchor.addEventListener('click', this);
+ this.unifiedPanel.addEventListener("popupshowing", this);
+ this.document.getElementById("zen-site-data-manage-addons").addEventListener("click", this);
+ this.document.getElementById("zen-site-data-settings-more").addEventListener("click", this);
+ this.anchor.addEventListener("click", this);
const kCommandIDs = [
- 'zen-site-data-header-share',
- 'zen-site-data-header-bookmark',
- 'zen-site-data-security-info',
- 'zen-site-data-actions',
- 'zen-site-data-new-addon-button',
+ "zen-site-data-header-share",
+ "zen-site-data-header-bookmark",
+ "zen-site-data-security-info",
+ "zen-site-data-actions",
+ "zen-site-data-new-addon-button",
];
for (let id of kCommandIDs) {
- this.document.getElementById(id).addEventListener('command', this);
+ this.document.getElementById(id).addEventListener("command", this);
}
this.#initContextMenuEventListener();
@@ -90,7 +90,7 @@ export class nsZenSiteDataPanel {
#initCopyUrlButton() {
// This function is a bit out of place, but it's related enough to the panel
// that it's easier to do it here than in a separate module.
- const container = this.document.getElementById('page-action-buttons');
+ const container = this.document.getElementById("page-action-buttons");
const fragment = this.window.MozXULElement.parseXULToFragment(`
{
- if (aElement.hasAttribute('disabled')) {
+ const aElement = this.document.getElementById("zen-copy-url-button");
+ aElement.addEventListener("click", () => {
+ if (aElement.hasAttribute("disabled")) {
return;
}
- this.document.getElementById('cmd_zenCopyCurrentURL').doCommand();
+ this.document.getElementById("cmd_zenCopyCurrentURL").doCommand();
});
this.window.gBrowser.addProgressListener({
@@ -115,9 +115,9 @@ export class nsZenSiteDataPanel {
if (aWebProgress.isTopLevel) {
const disabled = !this.#canCopyUrl(aLocation);
if (disabled) {
- aElement.setAttribute('disabled', true);
+ aElement.setAttribute("disabled", true);
} else {
- aElement.removeAttribute('disabled');
+ aElement.removeAttribute("disabled");
}
}
},
@@ -134,21 +134,21 @@ export class nsZenSiteDataPanel {
},
context_zenOpenSiteSettings: () => {
const { BrowserCommands } = this.window;
- BrowserCommands.pageInfo(null, 'permTab');
+ BrowserCommands.pageInfo(null, "permTab");
},
};
for (let [id, handler] of Object.entries(kCommands)) {
- this.document.getElementById(id).addEventListener('command', handler);
+ this.document.getElementById(id).addEventListener("command", handler);
}
}
#initUnifiedExtensionsManageHook() {
const manageExtensionItem = this.document.getElementById(
- 'unified-extensions-context-menu-manage-extension'
+ "unified-extensions-context-menu-manage-extension"
);
- manageExtensionItem.addEventListener('command', () => {
+ manageExtensionItem.addEventListener("command", () => {
this.unifiedPanel.hidePopup();
});
}
@@ -156,17 +156,17 @@ export class nsZenSiteDataPanel {
#initExtensionsPanel() {
const panel = this.window.gUnifiedExtensions.panel;
- const extensionsView = panel?.querySelector('#unified-extensions-view');
- extensionsView.setAttribute('id', this.extensionsPanelView);
+ const extensionsView = panel?.querySelector("#unified-extensions-view");
+ extensionsView.setAttribute("id", this.extensionsPanelView);
- const panelMultiView = panel?.querySelector('panelmultiview');
- panelMultiView.setAttribute('mainViewId', this.extensionsPanelView);
+ const panelMultiView = panel?.querySelector("panelmultiview");
+ panelMultiView.setAttribute("mainViewId", this.extensionsPanelView);
return panel;
}
#initUnifiedPanel() {
- const panel = this.document.getElementById('zen-unified-site-data-panel');
+ const panel = this.document.getElementById("zen-unified-site-data-panel");
this.window.gUnifiedExtensions.initializePanel(panel);
return panel;
}
@@ -179,57 +179,58 @@ export class nsZenSiteDataPanel {
}
#setAddonsOverflow() {
- const addons = this.document.getElementById('zen-site-data-addons');
+ const addons = this.document.getElementById("zen-site-data-addons");
if (addons.getBoundingClientRect().height > 420) {
- addons.setAttribute('overflowing', 'true');
+ addons.setAttribute("overflowing", "true");
} else {
- addons.removeAttribute('overflowing');
+ addons.removeAttribute("overflowing");
}
}
get #currentPageIsBookmarked() {
// A hacky way to check if the current page is bookmarked, but
// it works for our purposes.
- return this.window.BookmarkingUI.star?.hasAttribute('starred');
+ return this.window.BookmarkingUI.star?.hasAttribute("starred");
}
#setSiteHeader() {
{
- const button = this.document.getElementById('zen-site-data-header-reader-mode');
- const urlbarButton = this.window.document.getElementById('reader-mode-button');
- const isActive = urlbarButton?.hasAttribute('readeractive');
+ const button = this.document.getElementById("zen-site-data-header-reader-mode");
+ const urlbarButton = this.window.document.getElementById("reader-mode-button");
+ const isActive = urlbarButton?.hasAttribute("readeractive");
const isVisible = !urlbarButton?.hidden || isActive;
button.disabled = !isVisible;
if (isActive) {
- button.classList.add('active');
+ button.classList.add("active");
} else {
- button.classList.remove('active');
+ button.classList.remove("active");
}
- this.document.l10n.setAttributes(button, urlbarButton?.getAttribute('data-l10n-id'));
+ this.document.l10n.setAttributes(button, urlbarButton?.getAttribute("data-l10n-id"));
}
{
- const button = this.document.getElementById('zen-site-data-header-bookmark');
+ const button = this.document.getElementById("zen-site-data-header-bookmark");
const isPageBookmarked = this.#currentPageIsBookmarked;
if (isPageBookmarked) {
- button.classList.add('active');
+ button.classList.add("active");
} else {
- button.classList.remove('active');
+ button.classList.remove("active");
}
}
{
- const button = this.document.getElementById('zen-site-data-header-share');
+ const button = this.document.getElementById("zen-site-data-header-share");
if (this.#canCopyUrl(this.window.gBrowser.currentURI)) {
- button.removeAttribute('disabled');
+ button.removeAttribute("disabled");
} else {
- button.setAttribute('disabled', 'true');
+ button.setAttribute("disabled", "true");
}
}
}
- /*
+ /**
* Determines whether the copy URL button should be hidden for the given URI.
+ *
* @param {nsIURI} uri - The URI to check.
* @returns {boolean} True if the button should be hidden, false otherwise.
*/
@@ -238,12 +239,12 @@ export class nsZenSiteDataPanel {
return false;
}
- return uri.scheme.startsWith('http');
+ return uri.scheme.startsWith("http");
}
#setSiteSecurityInfo() {
const { gIdentityHandler } = this.window;
- const button = this.document.getElementById('zen-site-data-security-info');
+ const button = this.document.getElementById("zen-site-data-security-info");
if (gIdentityHandler._isSecureInternalUI) {
button.parentNode.hidden = true;
@@ -252,24 +253,24 @@ export class nsZenSiteDataPanel {
let identity;
if (gIdentityHandler._pageExtensionPolicy) {
- this.document.l10n.setAttributes(button, 'zen-site-data-security-info-extension');
- identity = 'extension';
+ this.document.l10n.setAttributes(button, "zen-site-data-security-info-extension");
+ identity = "extension";
} else if (gIdentityHandler._uriHasHost && gIdentityHandler._isSecureConnection) {
- this.document.l10n.setAttributes(button, 'zen-site-data-security-info-secure');
- identity = 'secure';
+ this.document.l10n.setAttributes(button, "zen-site-data-security-info-secure");
+ identity = "secure";
} else {
- this.document.l10n.setAttributes(button, 'zen-site-data-security-info-not-secure');
- identity = 'not-secure';
+ this.document.l10n.setAttributes(button, "zen-site-data-security-info-not-secure");
+ identity = "not-secure";
}
button.parentNode.hidden = false;
- button.setAttribute('identity', identity);
+ button.setAttribute("identity", identity);
}
#setSitePermissions() {
const { gBrowser, SitePermissions } = this.window;
- const list = this.document.getElementById('zen-site-data-settings-list');
- const section = list.closest('.zen-site-data-section');
+ const list = this.document.getElementById("zen-site-data-settings-list");
+ const section = list.closest(".zen-site-data-section");
// show permission icons
let permissions = SitePermissions.getAllPermissionDetailsForBrowser(gBrowser.selectedBrowser);
@@ -280,7 +281,7 @@ export class nsZenSiteDataPanel {
permissions
.map(function (permission) {
let [id, key] = permission.id.split(SitePermissions.PERM_KEY_DELIMITER);
- if (id == '3rdPartyFrameStorage' || id == '3rdPartyStorage') {
+ if (id == "3rdPartyFrameStorage" || id == "3rdPartyStorage") {
return key;
}
return null;
@@ -291,7 +292,7 @@ export class nsZenSiteDataPanel {
);
permissions = permissions.filter(function (permission) {
let [id, key] = permission.id.split(SitePermissions.PERM_KEY_DELIMITER);
- if (id != '3rdPartyStorage') {
+ if (id != "3rdPartyStorage") {
return true;
}
try {
@@ -306,10 +307,10 @@ export class nsZenSiteDataPanel {
this._sharingState = gBrowser.selectedTab._sharingState;
if (this._sharingState?.geo) {
- let geoPermission = permissions.find((perm) => perm.id === 'geo');
+ let geoPermission = permissions.find((perm) => perm.id === "geo");
if (!geoPermission) {
permissions.push({
- id: 'geo',
+ id: "geo",
state: SitePermissions.ALLOW,
scope: SitePermissions.SCOPE_REQUEST,
sharingState: true,
@@ -318,10 +319,10 @@ export class nsZenSiteDataPanel {
}
if (this._sharingState?.xr) {
- let xrPermission = permissions.find((perm) => perm.id === 'xr');
+ let xrPermission = permissions.find((perm) => perm.id === "xr");
if (!xrPermission) {
permissions.push({
- id: 'xr',
+ id: "xr",
state: SitePermissions.ALLOW,
scope: SitePermissions.SCOPE_REQUEST,
sharingState: true,
@@ -333,7 +334,7 @@ export class nsZenSiteDataPanel {
let webrtcState = this._sharingState.webRTC;
// If WebRTC device or screen are in use, we need to find
// the associated ALLOW permission item to set the sharingState field.
- for (let id of ['camera', 'microphone', 'screen']) {
+ for (let id of ["camera", "microphone", "screen"]) {
if (webrtcState[id]) {
let found = false;
for (let permission of permissions) {
@@ -361,26 +362,26 @@ export class nsZenSiteDataPanel {
// Add site protection permissions if needed.
const { gProtectionsHandler } = this.window;
if (
- gBrowser.currentURI.schemeIs('http') ||
- gBrowser.currentURI.schemeIs('https') ||
- gBrowser.currentURI.schemeIs('ftp')
+ gBrowser.currentURI.schemeIs("http") ||
+ gBrowser.currentURI.schemeIs("https") ||
+ gBrowser.currentURI.schemeIs("ftp")
) {
permissions.push({
- id: 'site-protection',
+ id: "site-protection",
state: gProtectionsHandler.hasException ? SitePermissions.BLOCK : SitePermissions.ALLOW,
scope: SitePermissions.SCOPE_PERSISTENT,
});
}
- const separator = this.document.createXULElement('toolbarseparator');
- list.innerHTML = '';
+ const separator = this.document.createXULElement("toolbarseparator");
+ list.innerHTML = "";
list.appendChild(separator);
const settingElements = [];
const crossSiteCookieElements = [];
for (let permission of permissions) {
let [id, key] = permission.id.split(SitePermissions.PERM_KEY_DELIMITER);
- if (id == 'storage-access') {
+ if (id == "storage-access") {
// Ignore storage access permissions here, they are made visible inside
// the Content Blocking UI.
continue;
@@ -417,16 +418,16 @@ export class nsZenSiteDataPanel {
switch (permission.state) {
// There should only be these types being displayed in the panel.
case SitePermissions.ALLOW:
- if (permission.id === 'site-protection') {
- return 'zen-site-data-protections-enabled';
+ if (permission.id === "site-protection") {
+ return "zen-site-data-protections-enabled";
}
- return 'zen-site-data-setting-allow';
+ return "zen-site-data-setting-allow";
case SitePermissions.BLOCK:
case SitePermissions.AUTOPLAY_BLOCKED_ALL:
- if (permission.id === 'site-protection') {
- return 'zen-site-data-protections-disabled';
+ if (permission.id === "site-protection") {
+ return "zen-site-data-protections-disabled";
}
- return 'zen-site-data-setting-block';
+ return "zen-site-data-setting-block";
default:
return null;
}
@@ -434,88 +435,88 @@ export class nsZenSiteDataPanel {
#createPermissionItem(id, key, permission) {
const { SitePermissions } = this.window;
- const isCrossSiteCookie = id === '3rdPartyStorage';
+ const isCrossSiteCookie = id === "3rdPartyStorage";
// Create a permission item for the site data panel.
- let container = this.document.createXULElement('hbox');
+ let container = this.document.createXULElement("hbox");
const idNoSuffix = permission.id;
container.classList.add(
- 'permission-popup-permission-item',
+ "permission-popup-permission-item",
`permission-popup-permission-item-${idNoSuffix}`
);
- container.setAttribute('align', 'center');
- container.setAttribute('role', 'group');
+ container.setAttribute("align", "center");
+ container.setAttribute("role", "group");
- container.setAttribute('state', permission.state == SitePermissions.ALLOW ? 'allow' : 'block');
+ container.setAttribute("state", permission.state == SitePermissions.ALLOW ? "allow" : "block");
- let img = this.document.createXULElement('toolbarbutton');
- img.classList.add('permission-popup-permission-icon', 'zen-site-data-permission-icon');
- img.setAttribute('closemenu', 'none');
+ let img = this.document.createXULElement("toolbarbutton");
+ img.classList.add("permission-popup-permission-icon", "zen-site-data-permission-icon");
+ img.setAttribute("closemenu", "none");
if (this.#iconMap[id]) {
img.classList.add(`zen-permission-${this.#iconMap[id]}-icon`);
}
- let labelContainer = this.document.createXULElement('vbox');
- labelContainer.setAttribute('flex', '1');
- labelContainer.setAttribute('align', 'start');
- labelContainer.classList.add('permission-popup-permission-label-container');
+ let labelContainer = this.document.createXULElement("vbox");
+ labelContainer.setAttribute("flex", "1");
+ labelContainer.setAttribute("align", "start");
+ labelContainer.classList.add("permission-popup-permission-label-container");
labelContainer._permission = permission;
- let nameLabel = this.document.createXULElement('label');
- nameLabel.setAttribute('flex', '1');
- nameLabel.setAttribute('class', 'permission-popup-permission-label');
+ let nameLabel = this.document.createXULElement("label");
+ nameLabel.setAttribute("flex", "1");
+ nameLabel.setAttribute("class", "permission-popup-permission-label");
if (isCrossSiteCookie) {
- this.document.l10n.setAttributes(nameLabel, 'zen-site-data-setting-cross-site');
+ this.document.l10n.setAttributes(nameLabel, "zen-site-data-setting-cross-site");
} else {
let label = SitePermissions.getPermissionLabel(permission.id);
if (label) {
nameLabel.textContent = label;
} else {
- this.document.l10n.setAttributes(nameLabel, 'zen-site-data-setting-' + idNoSuffix);
+ this.document.l10n.setAttributes(nameLabel, "zen-site-data-setting-" + idNoSuffix);
}
}
labelContainer.appendChild(nameLabel);
- let stateLabel = this.document.createXULElement('label');
- stateLabel.setAttribute('class', 'zen-permission-popup-permission-state-label');
+ let stateLabel = this.document.createXULElement("label");
+ stateLabel.setAttribute("class", "zen-permission-popup-permission-state-label");
if (isCrossSiteCookie) {
// The key should be the site for cross-site cookies.
stateLabel.textContent = key;
} else {
- stateLabel.setAttribute('data-l10n-id', this.#getPermissionStateLabelId(permission));
+ stateLabel.setAttribute("data-l10n-id", this.#getPermissionStateLabelId(permission));
}
labelContainer.appendChild(stateLabel);
container.appendChild(img);
container.appendChild(labelContainer);
- container.addEventListener('click', this);
+ container.addEventListener("click", this);
return [container, isCrossSiteCookie];
}
#openGetAddons() {
const { switchToTabHavingURI } = this.window;
- let amoUrl = Services.urlFormatter.formatURLPref('extensions.getAddons.link.url');
+ let amoUrl = Services.urlFormatter.formatURLPref("extensions.getAddons.link.url");
switchToTabHavingURI(amoUrl, true);
}
#onCommandEvent(event) {
const id = event.target.id;
switch (id) {
- case 'zen-site-data-new-addon-button': {
+ case "zen-site-data-new-addon-button": {
this.#openGetAddons();
break;
}
- case 'zen-site-data-security-info': {
+ case "zen-site-data-security-info": {
this.window.gIdentityHandler._openPopup(event);
break;
}
- case 'zen-site-data-actions': {
- const button = this.document.getElementById('zen-site-data-actions');
- const popup = this.document.getElementById('zenSiteDataActions');
+ case "zen-site-data-actions": {
+ const button = this.document.getElementById("zen-site-data-actions");
+ const popup = this.document.getElementById("zenSiteDataActions");
popup.openPopup(
button,
- 'after_start',
+ "after_start",
0,
0,
/* context menu */ true,
@@ -524,18 +525,20 @@ export class nsZenSiteDataPanel {
);
break;
}
- case 'zen-site-data-header-bookmark': {
+ case "zen-site-data-header-bookmark": {
this.window.BookmarkingUI.onStarCommand(event);
break;
}
- case 'zen-site-data-header-share': {
+ case "zen-site-data-header-share": {
+ /* eslint-disable mozilla/valid-services */
if (Services.zen.canShare()) {
const buttonRect = event.target.getBoundingClientRect();
const currentUrl = this.window.gBrowser.currentURI;
+ /* eslint-disable mozilla/valid-services */
Services.zen.share(
currentUrl,
- '',
- '',
+ "",
+ "",
buttonRect.left,
this.window.innerHeight - buttonRect.bottom,
buttonRect.width,
@@ -544,7 +547,7 @@ export class nsZenSiteDataPanel {
} else {
this.window.gZenCommonActions.copyCurrentURLToClipboard();
}
- if (AppConstants.platform !== 'macosx') {
+ if (AppConstants.platform !== "macosx") {
this.unifiedPanel.hidePopup();
}
}
@@ -568,7 +571,7 @@ export class nsZenSiteDataPanel {
return;
}
- if (permission.id === 'site-protection') {
+ if (permission.id === "site-protection") {
const { gProtectionsHandler } = this.window;
if (newState === SitePermissions.BLOCK) {
gProtectionsHandler.disableForCurrentPage();
@@ -579,31 +582,31 @@ export class nsZenSiteDataPanel {
SitePermissions.setForPrincipal(gBrowser.contentPrincipal, permission.id, newState);
}
- const isCrossSiteCookie = permission.id.startsWith('3rdPartyStorage');
- label.parentNode.setAttribute('state', newState == SitePermissions.ALLOW ? 'allow' : 'block');
+ const isCrossSiteCookie = permission.id.startsWith("3rdPartyStorage");
+ label.parentNode.setAttribute("state", newState == SitePermissions.ALLOW ? "allow" : "block");
label._permission.state = newState;
if (!isCrossSiteCookie) {
label
- .querySelector('.zen-permission-popup-permission-state-label')
- .setAttribute('data-l10n-id', this.#getPermissionStateLabelId(label._permission));
+ .querySelector(".zen-permission-popup-permission-state-label")
+ .setAttribute("data-l10n-id", this.#getPermissionStateLabelId(label._permission));
}
}
#onClickEvent(event) {
const id = event.target.id;
switch (id) {
- case 'zen-site-data-manage-addons': {
+ case "zen-site-data-manage-addons": {
const { BrowserAddonUI } = this.window;
- BrowserAddonUI.openAddonsMgr('addons://list/extension');
+ BrowserAddonUI.openAddonsMgr("addons://list/extension");
this.unifiedPanel.hidePopup();
break;
}
- case 'zen-site-data-settings-more': {
+ case "zen-site-data-settings-more": {
const { BrowserCommands } = this.window;
- BrowserCommands.pageInfo(null, 'permTab');
+ BrowserCommands.pageInfo(null, "permTab");
break;
}
- case 'zen-site-data-icon-button': {
+ case "zen-site-data-icon-button": {
this.window.gUnifiedExtensions.togglePanel(
event,
null,
@@ -614,11 +617,11 @@ export class nsZenSiteDataPanel {
break;
}
default: {
- const item = event.target.closest('.permission-popup-permission-item');
+ const item = event.target.closest(".permission-popup-permission-item");
if (!item) {
break;
}
- const label = item.querySelector('.permission-popup-permission-label-container');
+ const label = item.querySelector(".permission-popup-permission-label-container");
if (label?._permission) {
this.#onPermissionClick(label);
}
@@ -630,81 +633,80 @@ export class nsZenSiteDataPanel {
handleEvent(event) {
const type = event.type;
switch (type) {
- case 'click':
+ case "click":
this.#onClickEvent(event);
break;
- case 'command':
+ case "command":
this.#onCommandEvent(event);
break;
- case 'popupshowing':
+ case "popupshowing":
this.#preparePanel();
break;
}
}
async #maybeShowFeatureCallout() {
- const kPref = 'zen.site-data-panel.show-callout';
+ const kPref = "zen.site-data-panel.show-callout";
if (!Services.prefs.getBoolPref(kPref, false)) {
return;
}
Services.prefs.setBoolPref(kPref, false);
- const { FeatureCallout } = lazy;
const { gBrowser, gZenWorkspaces } = this.window;
await gZenWorkspaces.promiseInitialized;
await new Promise((resolve) => {
const checkEmptyTab = () => {
- if (!gBrowser.selectedTab.hasAttribute('zen-empty-tab')) {
+ if (!gBrowser.selectedTab.hasAttribute("zen-empty-tab")) {
resolve();
return;
}
- this.window.addEventListener('TabSelect', checkEmptyTab, { once: true });
+ this.window.addEventListener("TabSelect", checkEmptyTab, { once: true });
};
checkEmptyTab();
});
- const callout = new FeatureCallout({
+ const callout = new lazy.FeatureCallout({
win: this.window,
- location: 'chrome',
- context: 'chrome',
+ location: "chrome",
+ context: "chrome",
browser: gBrowser.selectedBrowser,
- theme: { preset: 'chrome' },
+ theme: { preset: "chrome" },
});
this.window.setTimeout(() => {
callout.showFeatureCallout({
- id: 'ZEN_EXTENSIONS_PANEL_MOVE_CALLOUT',
- template: 'feature_callout',
- groups: ['cfr'],
+ id: "ZEN_EXTENSIONS_PANEL_MOVE_CALLOUT",
+ template: "feature_callout",
+ groups: ["cfr"],
content: {
- id: 'ZEN_EXTENSIONS_PANEL_MOVE_CALLOUT',
- template: 'multistage',
- backdrop: 'transparent',
+ id: "ZEN_EXTENSIONS_PANEL_MOVE_CALLOUT",
+ template: "multistage",
+ backdrop: "transparent",
transitions: true,
screens: [
{
- id: 'ZEN_EXTENSIONS_PANEL_MOVE_CALLOUT',
+ id: "ZEN_EXTENSIONS_PANEL_MOVE_CALLOUT",
anchors: [
{
- selector: '#zen-site-data-icon-button',
+ selector: "#zen-site-data-icon-button",
panel_position: {
- anchor_attachment: 'bottomcenter',
- callout_attachment: 'topleft',
+ anchor_attachment: "bottomcenter",
+ callout_attachment: "topleft",
},
},
],
content: {
- position: 'callout',
- width: '355px',
+ position: "callout",
+ width: "355px",
title: {
- string_id: 'zen-site-data-panel-feature-callout-title',
+ string_id: "zen-site-data-panel-feature-callout-title",
},
subtitle: {
- string_id: 'zen-site-data-panel-feature-callout-subtitle',
+ string_id: "zen-site-data-panel-feature-callout-subtitle",
},
dismiss_button: {
action: {
dismiss: true,
},
background: true,
- size: 'small',
+ size: "small",
},
},
},
diff --git a/src/zen/urlbar/ZenUBActionsProvider.sys.mjs b/src/zen/urlbar/ZenUBActionsProvider.sys.mjs
index f17e98f7b..62e7ef3c3 100644
--- a/src/zen/urlbar/ZenUBActionsProvider.sys.mjs
+++ b/src/zen/urlbar/ZenUBActionsProvider.sys.mjs
@@ -2,17 +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 { XPCOMUtils } from 'resource://gre/modules/XPCOMUtils.sys.mjs';
+import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
import {
UrlbarProvider,
UrlbarUtils,
-} from 'moz-src:///browser/components/urlbar/UrlbarUtils.sys.mjs';
-import { globalActions } from 'resource:///modules/ZenUBGlobalActions.sys.mjs';
-import { zenUrlbarResultsLearner } from './ZenUBResultsLearner.sys.mjs';
+} from "moz-src:///browser/components/urlbar/UrlbarUtils.sys.mjs";
+import { globalActions } from "resource:///modules/ZenUBGlobalActions.sys.mjs";
+import { zenUrlbarResultsLearner } from "./ZenUBResultsLearner.sys.mjs";
const lazy = {};
-const DYNAMIC_TYPE_NAME = 'zen-actions';
+const DYNAMIC_TYPE_NAME = "zen-actions";
// The suggestion index of the actions row within the urlbar results.
const MAX_RECENT_ACTIONS = 5;
@@ -21,18 +21,16 @@ const MINIMUM_QUERY_SCORE = 92;
const MINIMUM_PREFIXED_QUERY_SCORE = 30;
ChromeUtils.defineESModuleGetters(lazy, {
- UrlbarResult: 'moz-src:///browser/components/urlbar/UrlbarResult.sys.mjs',
- QueryScorer: 'moz-src:///browser/components/urlbar/UrlbarProviderInterventions.sys.mjs',
- BrowserWindowTracker: 'resource:///modules/BrowserWindowTracker.sys.mjs',
- AddonManager: 'resource://gre/modules/AddonManager.sys.mjs',
- zenUrlbarResultsLearner: 'resource:///modules/ZenUBResultsLearner.sys.mjs',
- UrlUtils: 'resource://gre/modules/UrlUtils.sys.mjs',
+ UrlbarResult: "moz-src:///browser/components/urlbar/UrlbarResult.sys.mjs",
+ BrowserWindowTracker: "resource:///modules/BrowserWindowTracker.sys.mjs",
+ AddonManager: "resource://gre/modules/AddonManager.sys.mjs",
+ UrlUtils: "resource://gre/modules/UrlUtils.sys.mjs",
});
XPCOMUtils.defineLazyPreferenceGetter(
lazy,
- 'enabledPref',
- 'zen.urlbar.suggestions.quick-actions',
+ "enabledPref",
+ "zen.urlbar.suggestions.quick-actions",
true
);
@@ -48,7 +46,7 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider {
}
get name() {
- return 'ZenUrlbarProviderGlobalActions';
+ return "ZenUrlbarProviderGlobalActions";
}
/**
@@ -90,9 +88,9 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider {
if (workspace.uuid !== activeSpaceUUID) {
const accentColor = window.gZenWorkspaces
.workspaceElement(workspace.uuid)
- ?.style.getPropertyValue('--zen-primary-color');
+ ?.style.getPropertyValue("--zen-primary-color");
actions.push({
- label: 'Focus on',
+ label: "Focus on",
extraPayload: {
workspaceId: workspace.uuid,
prettyName: workspace.name,
@@ -100,7 +98,7 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider {
accentColor,
},
commandId: `zen:workspace-${workspace.uuid}`,
- icon: 'chrome://browser/skin/zen-icons/forward.svg',
+ icon: "chrome://browser/skin/zen-icons/forward.svg",
});
}
}
@@ -108,8 +106,8 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider {
}
async #getExtensionActions(window) {
- const addons = await lazy.AddonManager.getAddonsByTypes(['extension']);
- if (window.gBrowser.selectedTab.hasAttribute('zen-empty-tab')) {
+ const addons = await lazy.AddonManager.getAddonsByTypes(["extension"]);
+ if (window.gBrowser.selectedTab.hasAttribute("zen-empty-tab")) {
// Don't show extension actions on empty tabs, as extensions can't run there.
return [];
}
@@ -122,8 +120,8 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider {
)
.map((addon) => {
return {
- icon: 'chrome://browser/skin/zen-icons/extension.svg',
- label: 'Extension',
+ icon: "chrome://browser/skin/zen-icons/extension.svg",
+ label: "Extension",
commandId: `zen:extension-${addon.id}`,
extraPayload: {
extensionId: addon.id,
@@ -136,7 +134,7 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider {
/**
* @param {Window} window The window to check available actions for.
- * @returns All the available global actions.
+ * @returns {Array} All the available global actions.
*/
async #getAvailableActions(window) {
return globalActions
@@ -149,7 +147,7 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider {
* Starts a search query amongst the available global actions.
*
* @param {string} query The user's search query.
- *
+ * @param {boolean} isPrefixed Whether the query is prefixed.
*/
async #findMatchingActions(query, isPrefixed) {
const window = lazy.BrowserWindowTracker.getTopWindow();
@@ -179,20 +177,27 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider {
/**
* A VS Code-style fuzzy scoring algorithm.
+ *
* @param {string} target The string to score against.
* @param {string} query The user's search query.
* @returns {number} A score representing the match quality.
*
- * @credits Thanks a lot @BibekBhusal0 on GitHub for this implementation!
+ * -credits: Thanks a lot @BibekBhusal0 on GitHub for this implementation!
*/
#calculateFuzzyScore(target, query) {
- if (!target || !query) return 0;
+ if (!target || !query) {
+ return 0;
+ }
const targetLower = target.toLowerCase();
const queryLower = query.toLowerCase();
const targetLen = target.length;
const queryLen = query.length;
- if (queryLen > targetLen) return 0;
- if (queryLen === 0) return 0;
+ if (queryLen > targetLen) {
+ return 0;
+ }
+ if (queryLen === 0) {
+ return 0;
+ }
// 1. Exact match gets the highest score.
if (targetLower === queryLower) {
return 200;
@@ -209,7 +214,7 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider {
if (queryIndex < queryLen && targetLower[targetIndex] === queryLower[queryIndex]) {
let bonus = 10;
// Bonus for matching at the beginning of a word
- if (targetIndex === 0 || [' ', '-', '_'].includes(targetLower[targetIndex - 1])) {
+ if (targetIndex === 0 || [" ", "-", "_"].includes(targetLower[targetIndex - 1])) {
bonus += 15;
}
// Bonus for consecutive matches
@@ -258,7 +263,7 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider {
shortcutContent: ownerGlobal.gZenKeyboardShortcutsManager.getShortcutDisplayFromCommand(
action.command
),
- keywords: action.label.split(' '),
+ keywords: action.label.split(" "),
...action.extraPayload,
});
@@ -313,37 +318,38 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider {
getViewUpdate(result) {
const prettyIconIsSvg =
result.payload.prettyIcon &&
- (result.payload.prettyIcon.endsWith('.svg') || result.payload.prettyIcon.endsWith('.png'));
+ (result.payload.prettyIcon.endsWith(".svg") || result.payload.prettyIcon.endsWith(".png"));
return {
icon: {
attributes: {
- src: result.payload.icon || 'chrome://browser/skin/trending.svg',
+ src: result.payload.icon || "chrome://browser/skin/trending.svg",
},
},
titleStrong: {
textContent: result.payload.title,
- attributes: { dir: 'ltr' },
+ attributes: { dir: "ltr" },
},
shortcutContent: {
- textContent: result.payload.shortcutContent || '',
+ textContent: result.payload.shortcutContent || "",
},
prettyName: {
attributes: {
hidden: !result.payload.prettyName,
- style: `--zen-primary-color: ${result.payload.accentColor || 'currentColor'}`,
+ style: `--zen-primary-color: ${result.payload.accentColor || "currentColor"}`,
},
},
prettyNameTitle: {
+ /* eslint-disable-next-line no-nested-ternary */
textContent: result.payload.prettyName
? prettyIconIsSvg || !result.payload.prettyIcon
? result.payload.prettyName
: `${result.payload.prettyIcon} ${result.payload.prettyName}`
- : '',
- attributes: { dir: 'ltr' },
+ : "",
+ attributes: { dir: "ltr" },
},
prettyNameIcon: {
attributes: {
- src: result.payload.prettyIcon || '',
+ src: result.payload.prettyIcon || "",
hidden: !prettyIconIsSvg || !result.payload.prettyIcon,
},
},
@@ -357,42 +363,42 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider {
},
children: [
{
- name: 'icon',
- tag: 'img',
- classList: ['urlbarView-favicon'],
+ name: "icon",
+ tag: "img",
+ classList: ["urlbarView-favicon"],
},
{
- name: 'title',
- tag: 'span',
- classList: ['urlbarView-title'],
+ name: "title",
+ tag: "span",
+ classList: ["urlbarView-title"],
children: [
{
- name: 'titleStrong',
- tag: 'strong',
+ name: "titleStrong",
+ tag: "strong",
},
],
},
{
- tag: 'span',
- classList: ['urlbarView-prettyName'],
+ tag: "span",
+ classList: ["urlbarView-prettyName"],
hidden: true,
- name: 'prettyName',
+ name: "prettyName",
children: [
{
- tag: 'img',
- name: 'prettyNameIcon',
+ tag: "img",
+ name: "prettyNameIcon",
attributes: { hidden: true },
},
{
- name: 'prettyNameTitle',
- tag: 'span',
+ name: "prettyNameTitle",
+ tag: "span",
},
],
},
{
- name: 'shortcutContent',
- tag: 'span',
- classList: ['urlbarView-shortcutContent'],
+ name: "shortcutContent",
+ tag: "span",
+ classList: ["urlbarView-shortcutContent"],
},
],
};
@@ -417,7 +423,7 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider {
const command = payload.zenCommand;
const ownerGlobal = details.element.ownerGlobal;
ownerGlobal.gBrowser.selectedBrowser.focus();
- if (typeof command === 'function') {
+ if (typeof command === "function") {
command(ownerGlobal);
return;
}
diff --git a/src/zen/urlbar/ZenUBGlobalActions.sys.mjs b/src/zen/urlbar/ZenUBGlobalActions.sys.mjs
index d75085fb4..41424a52c 100644
--- a/src/zen/urlbar/ZenUBGlobalActions.sys.mjs
+++ b/src/zen/urlbar/ZenUBGlobalActions.sys.mjs
@@ -2,191 +2,191 @@
* 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 = {};
-XPCOMUtils.defineLazyPreferenceGetter(lazy, 'currentTheme', 'zen.view.window.scheme', 2);
+XPCOMUtils.defineLazyPreferenceGetter(lazy, "currentTheme", "zen.view.window.scheme", 2);
function isNotEmptyTab(window) {
- return !window.gBrowser.selectedTab.hasAttribute('zen-empty-tab');
+ return !window.gBrowser.selectedTab.hasAttribute("zen-empty-tab");
}
const globalActionsTemplate = [
{
- label: 'Toggle Compact Mode',
- command: 'cmd_zenCompactModeToggle',
- icon: 'chrome://browser/skin/zen-icons/sidebar.svg',
+ label: "Toggle Compact Mode",
+ command: "cmd_zenCompactModeToggle",
+ icon: "chrome://browser/skin/zen-icons/sidebar.svg",
},
{
- label: 'Open Theme Picker',
- command: 'cmd_zenOpenZenThemePicker',
- icon: 'chrome://browser/skin/zen-icons/edit-theme.svg',
+ label: "Open Theme Picker",
+ command: "cmd_zenOpenZenThemePicker",
+ icon: "chrome://browser/skin/zen-icons/edit-theme.svg",
},
{
- label: 'New Split View',
- command: 'cmd_zenNewEmptySplit',
- icon: 'chrome://browser/skin/zen-icons/split.svg',
+ label: "New Split View",
+ command: "cmd_zenNewEmptySplit",
+ icon: "chrome://browser/skin/zen-icons/split.svg",
},
{
- label: 'New Folder',
- command: 'cmd_zenOpenFolderCreation',
- icon: 'chrome://browser/skin/zen-icons/folder.svg',
+ label: "New Folder",
+ command: "cmd_zenOpenFolderCreation",
+ icon: "chrome://browser/skin/zen-icons/folder.svg",
},
{
- label: 'Copy Current URL',
- command: 'cmd_zenCopyCurrentURL',
- icon: 'chrome://browser/skin/zen-icons/link.svg',
+ label: "Copy Current URL",
+ command: "cmd_zenCopyCurrentURL",
+ icon: "chrome://browser/skin/zen-icons/link.svg",
},
{
- label: 'Settings',
+ label: "Settings",
command: (window) => window.openPreferences(),
- icon: 'chrome://browser/skin/zen-icons/settings.svg',
+ icon: "chrome://browser/skin/zen-icons/settings.svg",
},
{
- label: 'Open Private Window',
- command: 'Tools:PrivateBrowsing',
- icon: 'chrome://browser/skin/zen-icons/private-window.svg',
+ label: "Open Private Window",
+ command: "Tools:PrivateBrowsing",
+ icon: "chrome://browser/skin/zen-icons/private-window.svg",
},
{
- label: 'Open New Window',
- command: 'cmd_newNavigator',
- icon: 'chrome://browser/skin/zen-icons/window.svg',
+ label: "Open New Window",
+ command: "cmd_newNavigator",
+ icon: "chrome://browser/skin/zen-icons/window.svg",
},
{
- label: 'Pin Tab',
- command: 'cmd_zenTogglePinTab',
- icon: 'chrome://browser/skin/zen-icons/pin.svg',
+ label: "Pin Tab",
+ command: "cmd_zenTogglePinTab",
+ icon: "chrome://browser/skin/zen-icons/pin.svg",
isAvailable: (window) => {
const tab = window.gBrowser.selectedTab;
- return !tab.hasAttribute('zen-empty-tab') && !tab.pinned;
+ return !tab.hasAttribute("zen-empty-tab") && !tab.pinned;
},
},
{
- label: 'Unpin Tab',
- command: 'cmd_zenTogglePinTab',
- icon: 'chrome://browser/skin/zen-icons/unpin.svg',
+ label: "Unpin Tab",
+ command: "cmd_zenTogglePinTab",
+ icon: "chrome://browser/skin/zen-icons/unpin.svg",
isAvailable: (window) => {
const tab = window.gBrowser.selectedTab;
- return !tab.hasAttribute('zen-empty-tab') && tab.pinned;
+ return !tab.hasAttribute("zen-empty-tab") && tab.pinned;
},
},
{
- label: 'Next Space',
- command: 'cmd_zenWorkspaceForward',
- icon: 'chrome://browser/skin/zen-icons/forward.svg',
+ label: "Next Space",
+ command: "cmd_zenWorkspaceForward",
+ icon: "chrome://browser/skin/zen-icons/forward.svg",
isAvailable: (window) => {
return window.gZenWorkspaces._workspaceCache.length > 1;
},
},
{
- label: 'Previous Space',
- command: 'cmd_zenWorkspaceBackward',
- icon: 'chrome://browser/skin/zen-icons/back.svg',
+ label: "Previous Space",
+ command: "cmd_zenWorkspaceBackward",
+ icon: "chrome://browser/skin/zen-icons/back.svg",
isAvailable: (window) => {
// This also covers the case of being in private mode
return window.gZenWorkspaces._workspaceCache.length > 1;
},
},
{
- label: 'Close Tab',
- command: 'cmd_close',
- icon: 'chrome://browser/skin/zen-icons/close.svg',
+ label: "Close Tab",
+ command: "cmd_close",
+ icon: "chrome://browser/skin/zen-icons/close.svg",
isAvailable: (window) => {
return isNotEmptyTab(window);
},
},
{
- label: 'Reload Tab',
- command: 'Browser:Reload',
- icon: 'chrome://browser/skin/zen-icons/reload.svg',
+ label: "Reload Tab",
+ command: "Browser:Reload",
+ icon: "chrome://browser/skin/zen-icons/reload.svg",
},
{
- label: 'Reload Tab Without Cache',
- command: 'Browser:ReloadSkipCache',
- icon: 'chrome://browser/skin/zen-icons/reload.svg',
+ label: "Reload Tab Without Cache",
+ command: "Browser:ReloadSkipCache",
+ icon: "chrome://browser/skin/zen-icons/reload.svg",
},
{
- label: 'Next Tab',
- command: 'Browser:NextTab',
- icon: 'chrome://browser/skin/zen-icons/forward.svg',
+ label: "Next Tab",
+ command: "Browser:NextTab",
+ icon: "chrome://browser/skin/zen-icons/forward.svg",
},
{
- label: 'Previous Tab',
- command: 'Browser:PrevTab',
- icon: 'chrome://browser/skin/zen-icons/back.svg',
+ label: "Previous Tab",
+ command: "Browser:PrevTab",
+ icon: "chrome://browser/skin/zen-icons/back.svg",
},
{
- label: 'Capture Screenshot',
- command: 'Browser:Screenshot',
- icon: 'chrome://browser/skin/zen-icons/screenshot.svg',
+ label: "Capture Screenshot",
+ command: "Browser:Screenshot",
+ icon: "chrome://browser/skin/zen-icons/screenshot.svg",
isAvailable: (window) => {
return isNotEmptyTab(window);
},
},
{
- label: 'Toggle Tabs on right',
- command: 'cmd_zenToggleTabsOnRight',
- icon: 'chrome://browser/skin/zen-icons/sidebars-right.svg',
+ label: "Toggle Tabs on right",
+ command: "cmd_zenToggleTabsOnRight",
+ icon: "chrome://browser/skin/zen-icons/sidebars-right.svg",
},
{
- label: 'Add to Essentials',
+ label: "Add to Essentials",
command: (window) => window.gZenPinnedTabManager.addToEssentials(window.gBrowser.selectedTab),
isAvailable: (window) => {
return (
window.gZenPinnedTabManager.canEssentialBeAdded(window.gBrowser.selectedTab) &&
- !window.gBrowser.selectedTab.hasAttribute('zen-essential')
+ !window.gBrowser.selectedTab.hasAttribute("zen-essential")
);
},
- icon: 'chrome://browser/skin/zen-icons/essential-add.svg',
+ icon: "chrome://browser/skin/zen-icons/essential-add.svg",
},
{
- label: 'Remove from Essentials',
+ label: "Remove from Essentials",
command: (window) => window.gZenPinnedTabManager.removeEssentials(window.gBrowser.selectedTab),
- isAvailable: (window) => window.gBrowser.selectedTab.hasAttribute('zen-essential'),
- icon: 'chrome://browser/skin/zen-icons/essential-remove.svg',
+ isAvailable: (window) => window.gBrowser.selectedTab.hasAttribute("zen-essential"),
+ icon: "chrome://browser/skin/zen-icons/essential-remove.svg",
},
{
- label: 'Find in Page',
- command: 'cmd_find',
- icon: 'chrome://browser/skin/zen-icons/search-page.svg',
+ label: "Find in Page",
+ command: "cmd_find",
+ icon: "chrome://browser/skin/zen-icons/search-page.svg",
isAvailable: (window) => {
return isNotEmptyTab(window);
},
},
{
- label: 'Manage Extensions',
- command: 'Tools:Addons',
- icon: 'chrome://browser/skin/zen-icons/extension.svg',
+ label: "Manage Extensions",
+ command: "Tools:Addons",
+ icon: "chrome://browser/skin/zen-icons/extension.svg",
},
{
- label: 'Switch to Automatic Appearance',
- command: () => Services.prefs.setIntPref('zen.view.window.scheme', 2),
- icon: 'chrome://browser/skin/zen-icons/sparkles.svg',
+ label: "Switch to Automatic Appearance",
+ command: () => Services.prefs.setIntPref("zen.view.window.scheme", 2),
+ icon: "chrome://browser/skin/zen-icons/sparkles.svg",
isAvailable: () => {
return lazy.currentTheme !== 2;
},
},
{
- label: 'Switch to Light Mode',
- command: () => Services.prefs.setIntPref('zen.view.window.scheme', 1),
- icon: 'chrome://browser/skin/zen-icons/face-sun.svg',
+ label: "Switch to Light Mode",
+ command: () => Services.prefs.setIntPref("zen.view.window.scheme", 1),
+ icon: "chrome://browser/skin/zen-icons/face-sun.svg",
isAvailable: () => {
return lazy.currentTheme !== 1;
},
},
{
- label: 'Switch to Dark Mode',
- command: () => Services.prefs.setIntPref('zen.view.window.scheme', 0),
- icon: 'chrome://browser/skin/zen-icons/moon-stars.svg',
+ label: "Switch to Dark Mode",
+ command: () => Services.prefs.setIntPref("zen.view.window.scheme", 0),
+ icon: "chrome://browser/skin/zen-icons/moon-stars.svg",
isAvailable: () => {
return lazy.currentTheme !== 0;
},
},
{
- label: 'Print',
- command: 'cmd_print',
- icon: 'chrome://browser/skin/zen-icons/print.svg',
+ label: "Print",
+ command: "cmd_print",
+ icon: "chrome://browser/skin/zen-icons/print.svg",
isAvailable: (window) => {
return isNotEmptyTab(window);
},
@@ -195,12 +195,12 @@ const globalActionsTemplate = [
export const globalActions = globalActionsTemplate.map((action) => ({
isAvailable: (window) => {
- return window.document.getElementById(action.command)?.getAttribute('disabled') !== 'true';
+ return window.document.getElementById(action.command)?.getAttribute("disabled") !== "true";
},
commandId:
- typeof action.command === 'string'
+ typeof action.command === "string"
? action.command
- : `zen:global-action-${action.label.toLowerCase().replace(/\s+/g, '-')}`,
+ : `zen:global-action-${action.label.toLowerCase().replace(/\s+/g, "-")}`,
extraPayload: {},
...action,
}));
diff --git a/src/zen/urlbar/ZenUBProvider.sys.mjs b/src/zen/urlbar/ZenUBProvider.sys.mjs
index 740e5af4e..2b6210d3f 100644
--- a/src/zen/urlbar/ZenUBProvider.sys.mjs
+++ b/src/zen/urlbar/ZenUBProvider.sys.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 { UrlbarProvidersManager } from 'moz-src:///browser/components/urlbar/UrlbarProvidersManager.sys.mjs';
+import { UrlbarProvidersManager } from "moz-src:///browser/components/urlbar/UrlbarProvidersManager.sys.mjs";
-const providers = {};
-ChromeUtils.defineESModuleGetters(providers, {
- ZenUrlbarProviderGlobalActions: 'resource:///modules/ZenUBActionsProvider.sys.mjs',
+const lazy = {};
+ChromeUtils.defineESModuleGetters(lazy, {
+ /* eslint-disable mozilla/valid-lazy */
+ ZenUrlbarProviderGlobalActions: "resource:///modules/ZenUBActionsProvider.sys.mjs",
});
export function registerZenUrlbarProviders() {
- for (let i = 0; i < Object.keys(providers).length; i++) {
- const provider = Object.values(providers)[i];
- const name = Object.keys(providers)[i];
+ for (let i = 0; i < Object.keys(lazy).length; i++) {
+ const provider = Object.values(lazy)[i];
+ const name = Object.keys(lazy)[i];
if (!UrlbarProvidersManager.getProvider(name)) {
UrlbarProvidersManager.registerProvider(new provider());
}
diff --git a/src/zen/urlbar/ZenUBResultsLearner.sys.mjs b/src/zen/urlbar/ZenUBResultsLearner.sys.mjs
index 73390b6a7..473503085 100644
--- a/src/zen/urlbar/ZenUBResultsLearner.sys.mjs
+++ b/src/zen/urlbar/ZenUBResultsLearner.sys.mjs
@@ -2,26 +2,26 @@
* 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 = {};
-const DEFAULT_DB_DATA = '{}';
+let lazyDatabaseData = {};
+
+const DEFAULT_DB_DATA = "{}";
const DEPRIORITIZE_MAX = -5;
const PRIORITIZE_MAX = 5;
function addDataToLazy(data) {
try {
- lazy.databaseData = JSON.parse(data);
- } catch {
- lazy.databaseData = {};
- }
+ lazyDatabaseData = JSON.parse(data);
+ } catch {}
}
XPCOMUtils.defineLazyPreferenceGetter(
lazy,
- 'rawDatabase',
- 'zen.urlbar.suggestions-learner',
+ "rawDatabase",
+ "zen.urlbar.suggestions-learner",
DEFAULT_DB_DATA,
(_aPreference, _previousValue, newValue) => {
addDataToLazy(newValue);
@@ -49,12 +49,12 @@ class ZenUrlbarResultsLearner {
}
get database() {
- return lazy.databaseData;
+ return lazyDatabaseData;
}
saveDatabase(db) {
Services.prefs.setStringPref(
- 'zen.urlbar.suggestions-learner',
+ "zen.urlbar.suggestions-learner",
JSON.stringify(db || DEFAULT_DB_DATA)
);
}
@@ -106,6 +106,7 @@ class ZenUrlbarResultsLearner {
/**
* Sorts the given commands by their priority in the database.
+ *
* @param {*} commands
*/
sortCommandsByPriority(commands) {
diff --git a/src/zen/welcome/ZenWelcome.mjs b/src/zen/welcome/ZenWelcome.mjs
index 9565c71f2..1154f2b52 100644
--- a/src/zen/welcome/ZenWelcome.mjs
+++ b/src/zen/welcome/ZenWelcome.mjs
@@ -5,14 +5,14 @@
{
let _tabsToPinEssentials = [];
- const kZenElementsToIgnore = ['zen-browser-background', 'zen-toast-container'];
+ const kZenElementsToIgnore = ["zen-browser-background", "zen-toast-container"];
function clearBrowserElements() {
- for (const element of document.getElementById('browser').children) {
+ for (const element of document.getElementById("browser").children) {
if (kZenElementsToIgnore.includes(element.id)) {
continue;
}
- element.style.display = 'none';
+ element.style.display = "none";
}
}
@@ -25,7 +25,7 @@
}
function initializeZenWelcome() {
- document.documentElement.setAttribute('zen-welcome-stage', 'true');
+ document.documentElement.setAttribute("zen-welcome-stage", "true");
const XUL = `
@@ -46,8 +46,8 @@
`;
const fragment = window.MozXULElement.parseXULToFragment(XUL);
- document.getElementById('browser').appendChild(fragment);
- window.MozXULElement.insertFTLIfNeeded('browser/zen-welcome.ftl');
+ document.getElementById("browser").appendChild(fragment);
+ window.MozXULElement.insertFTLIfNeeded("browser/zen-welcome.ftl");
}
var _iconToData = {};
@@ -65,7 +65,7 @@
const reader = new FileReader();
const data = await new Promise((resolve) => {
reader.onloadend = () => {
- const base64Data = reader.result.split(',')[1];
+ const base64Data = reader.result.split(",")[1];
_iconToData[iconURL] = `data:${blob.type};base64,${base64Data}`;
resolve(_iconToData[iconURL]);
};
@@ -74,6 +74,9 @@
return data;
}
+ /**
+ *
+ */
class nsZenWelcomePages {
constructor(pages) {
this._currentPage = -1;
@@ -83,71 +86,72 @@
}
init() {
- document.getElementById('zen-welcome-pages').style.display = 'flex';
- document.getElementById('zen-welcome-start').remove();
+ document.getElementById("zen-welcome-pages").style.display = "flex";
+ document.getElementById("zen-welcome-start").remove();
window.maximize();
- animate('#zen-welcome-pages', { opacity: [0, 1] }, { delay: 0.2, duration: 0.1 });
+ animate("#zen-welcome-pages", { opacity: [0, 1] }, { delay: 0.2, duration: 0.1 });
}
async fadeInTitles(page) {
const [title1, description1, description2] = await document.l10n.formatValues(page.text);
- const titleElement = document.getElementById('zen-welcome-page-sidebar-content');
+ const titleElement = document.getElementById("zen-welcome-page-sidebar-content");
+ /* eslint-disable no-unsanitized/property */
titleElement.innerHTML =
`${title1}${description1}` +
- (description2 ? `${description2}` : '');
+ (description2 ? `${description2}` : "");
await animate(
- '#zen-welcome-page-sidebar-content > *',
- { x: ['150%', 0] },
+ "#zen-welcome-page-sidebar-content > *",
+ { x: ["150%", 0] },
{
delay: getMotion().stagger(0.05),
- type: 'spring',
+ type: "spring",
bounce: 0.2,
}
);
}
async fadeInButtons(page) {
- const buttons = document.getElementById('zen-welcome-page-sidebar-buttons');
+ const buttons = document.getElementById("zen-welcome-page-sidebar-buttons");
let i = 0;
const insertedButtons = [];
for (const button of page.buttons) {
- const buttonElement = document.createXULElement('button');
+ const buttonElement = document.createXULElement("button");
document.l10n.setAttributes(buttonElement, button.l10n);
if (i++ === 0) {
- buttonElement.classList.add('primary');
+ buttonElement.classList.add("primary");
}
- buttonElement.classList.add('footer-button');
- buttonElement.addEventListener('click', async () => {
+ buttonElement.classList.add("footer-button");
+ buttonElement.addEventListener("click", async () => {
const shouldSkip = await button.onclick();
if (shouldSkip) {
this.next();
}
});
- buttonElement.style.pointerEvents = 'none'; // Disable pointer events until animation is done
+ buttonElement.style.pointerEvents = "none"; // Disable pointer events until animation is done
insertedButtons.push(buttonElement);
buttons.appendChild(buttonElement);
}
await animate(
- '#zen-welcome-page-sidebar-buttons button',
- { x: ['150%', 0] },
+ "#zen-welcome-page-sidebar-buttons button",
+ { x: ["150%", 0] },
{
delay: getMotion().stagger(0.1, { startDelay: 0.4 }),
- type: 'spring',
+ type: "spring",
bounce: 0.2,
}
);
for (const button of insertedButtons) {
- button.style.pointerEvents = ''; // Enable pointer events after animation
+ button.style.pointerEvents = ""; // Enable pointer events after animation
}
}
async fadeInContent() {
await animate(
- '#zen-welcome-page-content > *',
+ "#zen-welcome-page-content > *",
{ opacity: [0, 1] },
{
delay: getMotion().stagger(0.1),
- type: 'spring',
+ type: "spring",
bounce: 0.2,
}
);
@@ -155,25 +159,25 @@
async fadeOutButtons() {
await animate(
- '#zen-welcome-page-sidebar-buttons button',
- { x: [0, '-150%'] },
+ "#zen-welcome-page-sidebar-buttons button",
+ { x: [0, "-150%"] },
{
- type: 'spring',
+ type: "spring",
bounce: 0,
delay: getMotion().stagger(0.1, { startDelay: 0.4 }),
}
);
- document.getElementById('zen-welcome-page-sidebar-buttons').innerHTML = '';
- document.getElementById('zen-welcome-page-sidebar-content').innerHTML = '';
+ document.getElementById("zen-welcome-page-sidebar-buttons").innerHTML = "";
+ document.getElementById("zen-welcome-page-sidebar-content").innerHTML = "";
}
async fadeOutTitles() {
await animate(
- '#zen-welcome-page-sidebar-content > *',
- { x: [0, '-150%'] },
+ "#zen-welcome-page-sidebar-content > *",
+ { x: [0, "-150%"] },
{
delay: getMotion().stagger(0.05, { startDelay: 0.3 }),
- type: 'spring',
+ type: "spring",
bounce: 0,
}
);
@@ -181,11 +185,11 @@
async fadeOutContent() {
await animate(
- '#zen-welcome-page-content > *',
+ "#zen-welcome-page-content > *",
{ opacity: [1, 0] },
{
delay: getMotion().stagger(0.05, { startDelay: 0.3 }),
- type: 'spring',
+ type: "spring",
bounce: 0,
duration: 0.1,
}
@@ -201,7 +205,7 @@
}
await Promise.all(promises);
await previousPage.fadeOut();
- document.getElementById('zen-welcome-page-content').innerHTML = '';
+ document.getElementById("zen-welcome-page-content").innerHTML = "";
}
this._currentPage++;
const currentPage = this._pages[this._currentPage];
@@ -217,50 +221,50 @@
async finish() {
_iconToData = undefined; // Unload icon data
gZenWorkspaces.reorganizeTabsAfterWelcome();
- await animate('#zen-welcome-page-content', { x: [0, '100%'] }, { bounce: 0 });
- document.getElementById('zen-welcome-page-content').remove();
+ await animate("#zen-welcome-page-content", { x: [0, "100%"] }, { bounce: 0 });
+ document.getElementById("zen-welcome-page-content").remove();
await this.animHeart();
await this.#pinRemainingTabs();
- await animate('#zen-welcome-pages', { opacity: [1, 0] });
- document.getElementById('zen-welcome').remove();
- document.documentElement.removeAttribute('zen-welcome-stage');
- for (const element of document.getElementById('browser').children) {
+ await animate("#zen-welcome-pages", { opacity: [1, 0] });
+ document.getElementById("zen-welcome").remove();
+ document.documentElement.removeAttribute("zen-welcome-stage");
+ for (const element of document.getElementById("browser").children) {
if (kZenElementsToIgnore.includes(element.id)) {
continue;
}
element.style.opacity = 0;
- element.style.removeProperty('display');
+ element.style.removeProperty("display");
}
gZenUIManager.updateTabsToolbar();
- let elementsToIgnore = kZenElementsToIgnore.map((id) => `#${id}`).join(', ');
+ let elementsToIgnore = kZenElementsToIgnore.map((id) => `#${id}`).join(", ");
await animate(`#browser > *:not(${elementsToIgnore})`, { opacity: [0, 1] });
- gZenUIManager.showToast('zen-welcome-finished');
+ gZenUIManager.showToast("zen-welcome-finished");
}
async #pinRemainingTabs() {
for (const tab of _tabsToPinEssentials) {
- tab.removeAttribute('pending'); // Make it appear loaded
+ tab.removeAttribute("pending"); // Make it appear loaded
gZenPinnedTabManager.addToEssentials(tab);
}
let tabsToGroup = [];
- if (!gBrowser.selectedTab.hasAttribute('zen-empty-tab')) {
+ if (!gBrowser.selectedTab.hasAttribute("zen-empty-tab")) {
tabsToGroup.push(gBrowser.selectedTab);
}
gZenFolders.createFolder(tabsToGroup, {
renameFolder: false,
- label: 'zen basics',
+ label: "zen basics",
});
}
async animHeart() {
- const heart = document.createElement('div');
- heart.id = 'zen-welcome-heart';
- const sidebar = document.getElementById('zen-welcome-page-sidebar');
- sidebar.style.width = '100%';
+ const heart = document.createElement("div");
+ heart.id = "zen-welcome-heart";
+ const sidebar = document.getElementById("zen-welcome-page-sidebar");
+ sidebar.style.width = "100%";
sidebar.appendChild(heart);
- sidebar.setAttribute('animate-heart', 'true');
+ sidebar.setAttribute("animate-heart", "true");
await animate(
- '#zen-welcome-heart',
+ "#zen-welcome-heart",
{ opacity: [0, 1, 1, 1, 0], scale: [0.5, 1, 1.2, 1, 1.2] },
{
duration: 1.5,
@@ -271,6 +275,9 @@
}
}
+ /**
+ *
+ */
class ZenSearchEngineStore {
constructor() {
this._engines = [];
@@ -285,8 +292,8 @@
return this._engines.filter(
(engine) =>
!(
- engine.name.toLowerCase().includes('wikipedia') ||
- engine.name.toLowerCase().includes('ebay')
+ engine.name.toLowerCase().includes("wikipedia") ||
+ engine.name.toLowerCase().includes("ebay")
)
);
}
@@ -302,14 +309,14 @@
}
}
- getEngineByName(name) {
- return this._engines.find((engine) => engine.name == name);
+ getEngineByName(aName) {
+ return this._engines.find((engine) => engine.name == aName);
}
_cloneEngine(aEngine) {
const clonedObj = {};
- for (const i of ['name', 'alias', '_iconURI', 'hidden']) {
+ for (const i of ["name", "alias", "_iconURI", "hidden"]) {
clonedObj[i] = aEngine[i];
}
@@ -336,31 +343,31 @@
{
text: [
{
- id: 'zen-welcome-import-title',
+ id: "zen-welcome-import-title",
},
{
- id: 'zen-welcome-import-description-1',
+ id: "zen-welcome-import-description-1",
},
{
- id: 'zen-welcome-import-description-2',
+ id: "zen-welcome-import-description-2",
},
],
buttons: [
{
- l10n: 'zen-welcome-import-button',
+ l10n: "zen-welcome-import-button",
onclick: async () => {
MigrationUtils.showMigrationWizard(window, {
isStartupMigration: true,
});
- document.querySelector('#zen-welcome-page-sidebar-buttons button').remove();
- const newButton = document.querySelector('#zen-welcome-page-sidebar-buttons button');
- newButton.classList.add('primary');
- document.l10n.setAttributes(newButton, 'zen-generic-next');
+ document.querySelector("#zen-welcome-page-sidebar-buttons button").remove();
+ const newButton = document.querySelector("#zen-welcome-page-sidebar-buttons button");
+ newButton.classList.add("primary");
+ document.l10n.setAttributes(newButton, "zen-generic-next");
return false;
},
},
{
- l10n: 'zen-welcome-skip-button',
+ l10n: "zen-welcome-skip-button",
onclick: async () => {
return true;
},
@@ -378,11 +385,11 @@
`;
const fragment = window.MozXULElement.parseXULToFragment(xul);
- document.getElementById('zen-welcome-page-content').appendChild(fragment);
+ document.getElementById("zen-welcome-page-content").appendChild(fragment);
},
async fadeOut() {
const shouldSetDefault = document.getElementById(
- 'zen-welcome-set-default-browser'
+ "zen-welcome-set-default-browser"
).checked;
if (AppConstants.HAVE_SHELL_SERVICE && shouldSetDefault) {
let shellSvc = window.getShellService();
@@ -394,7 +401,6 @@
await shellSvc.setDefaultBrowser(false);
} catch (ex) {
console.error(ex);
- return;
}
}
},
@@ -402,57 +408,57 @@
{
text: [
{
- id: 'zen-welcome-default-search-title',
+ id: "zen-welcome-default-search-title",
},
{
- id: 'zen-welcome-default-search-description',
+ id: "zen-welcome-default-search-description",
},
],
buttons: [
{
- l10n: 'zen-generic-next',
+ l10n: "zen-generic-next",
onclick: async () => {
return true;
},
},
],
async fadeIn() {
- const content = document.getElementById('zen-welcome-page-content');
+ const content = document.getElementById("zen-welcome-page-content");
const engineStore = new ZenSearchEngineStore();
engineStore.init();
- content.setAttribute('select-engine', 'true');
+ content.setAttribute("select-engine", "true");
const defaultEngine = await Services.search.getDefault();
const promises = [];
engineStore.getEngines().forEach((engine) => {
- const label = document.createElement('label');
- const engineId = engine.name.replace(/\s+/g, '-').toLowerCase();
- label.setAttribute('for', engineId);
- const input = document.createElement('input');
- input.setAttribute('type', 'radio');
- input.setAttribute('id', engineId);
- input.setAttribute('name', 'zen-welcome-set-default-browser');
- input.setAttribute('hidden', 'true');
+ const label = document.createElement("label");
+ const engineId = engine.name.replace(/\s+/g, "-").toLowerCase();
+ label.setAttribute("for", engineId);
+ const input = document.createElement("input");
+ input.setAttribute("type", "radio");
+ input.setAttribute("id", engineId);
+ input.setAttribute("name", "zen-welcome-set-default-browser");
+ input.setAttribute("hidden", "true");
if (engine.name === defaultEngine.name) {
- input.setAttribute('checked', true);
+ input.setAttribute("checked", true);
}
label.appendChild(input);
- const engineLabel = document.createXULElement('label');
+ const engineLabel = document.createXULElement("label");
engineLabel.textContent = engine.name;
- const icon = document.createElement('img');
+ const icon = document.createElement("img");
promises.push(
(async () => {
- icon.setAttribute('src', await engine.originalEngine.getIconURL());
+ icon.setAttribute("src", await engine.originalEngine.getIconURL());
})()
);
- icon.setAttribute('width', '32');
- icon.setAttribute('height', '32');
- icon.setAttribute('class', 'engine-icon');
+ icon.setAttribute("width", "32");
+ icon.setAttribute("height", "32");
+ icon.setAttribute("class", "engine-icon");
label.appendChild(icon);
label.appendChild(engineLabel);
content.appendChild(label);
- label.addEventListener('click', async () => {
+ label.addEventListener("click", async () => {
const selectedEngine = engineStore.getEngineByName(engine.name);
if (selectedEngine) {
await engineStore.setDefaultEngine(selectedEngine);
@@ -462,24 +468,24 @@
await Promise.all(promises);
},
async fadeOut() {
- document.getElementById('zen-welcome-page-content').removeAttribute('select-engine');
+ document.getElementById("zen-welcome-page-content").removeAttribute("select-engine");
},
},
{
text: [
{
- id: 'zen-welcome-initial-essentials-title',
+ id: "zen-welcome-initial-essentials-title",
},
{
- id: 'zen-welcome-initial-essentials-description-1',
+ id: "zen-welcome-initial-essentials-description-1",
},
{
- id: 'zen-welcome-initial-essentials-description-2',
+ id: "zen-welcome-initial-essentials-description-2",
},
],
buttons: [
{
- l10n: 'zen-generic-next',
+ l10n: "zen-generic-next",
onclick: async () => {
return true;
},
@@ -547,26 +553,26 @@
`;
const fragment = window.MozXULElement.parseXULToFragment(xul);
- document.getElementById('zen-welcome-page-content').appendChild(fragment);
+ document.getElementById("zen-welcome-page-content").appendChild(fragment);
document
- .getElementById('zen-welcome-initial-essentials-browser-sidebar-essentials')
- .addEventListener('click', async (event) => {
- const tab = event.target.closest('.tabbrowser-tab');
+ .getElementById("zen-welcome-initial-essentials-browser-sidebar-essentials")
+ .addEventListener("click", async (event) => {
+ const tab = event.target.closest(".tabbrowser-tab");
if (!tab) {
return;
}
- tab.toggleAttribute('visuallyselected');
+ tab.toggleAttribute("visuallyselected");
});
},
async fadeOut() {
const selectedTabs = document
- .getElementById('zen-welcome-initial-essentials-browser-sidebar-essentials')
- .querySelectorAll('.tabbrowser-tab[visuallyselected]');
+ .getElementById("zen-welcome-initial-essentials-browser-sidebar-essentials")
+ .querySelectorAll(".tabbrowser-tab[visuallyselected]");
if (selectedTabs.length) {
await PlacesUtils.history.insertMany(
[...selectedTabs].map((tab) => ({
- url: tab.getAttribute('data-url'),
+ url: tab.getAttribute("data-url"),
visits: [
{
transition: PlacesUtils.history.TRANSITIONS.TYPED,
@@ -577,21 +583,21 @@
}
const { TabStateCache } = ChromeUtils.importESModule(
- 'resource:///modules/sessionstore/TabStateCache.sys.mjs'
+ "resource:///modules/sessionstore/TabStateCache.sys.mjs"
);
for (const tab of selectedTabs) {
- const url = tab.getAttribute('data-url');
+ const url = tab.getAttribute("data-url");
const createdTab = window.gBrowser.addTrustedTab(url, {
inBackground: true,
createLazyBrowser: true,
});
- let essentialIconUrl = tab.style.getPropertyValue('--zen-essential-tab-icon');
+ let essentialIconUrl = tab.style.getPropertyValue("--zen-essential-tab-icon");
// Remove url() from the icon URL
- essentialIconUrl = essentialIconUrl.replace(/url\(['"]?/, '').replace(/['"]?\)/, '');
+ essentialIconUrl = essentialIconUrl.replace(/url\(['"]?/, "").replace(/['"]?\)/, "");
essentialIconUrl = await getIconData(essentialIconUrl);
// Update the persistent tab state cache with |tabData| information.
TabStateCache.update(createdTab.linkedBrowser.permanentKey, {
- history: { entries: [{ url: url }], index: 0 },
+ history: { entries: [{ url }], index: 0 },
image: essentialIconUrl,
});
gBrowser.setIcon(createdTab, essentialIconUrl);
@@ -602,61 +608,61 @@
{
text: [
{
- id: 'zen-welcome-workspace-colors-title',
+ id: "zen-welcome-workspace-colors-title",
},
{
- id: 'zen-welcome-workspace-colors-description',
+ id: "zen-welcome-workspace-colors-description",
},
],
buttons: [
{
- l10n: 'zen-generic-next',
+ l10n: "zen-generic-next",
onclick: async () => {
return true;
},
},
],
fadeIn() {
- const anchor = document.createElement('div');
- anchor.id = 'zen-welcome-workspace-colors-anchor';
- document.getElementById('zen-welcome-page-content').appendChild(anchor);
- gZenThemePicker.panel.setAttribute('noautohide', 'true');
- gZenThemePicker.panel.setAttribute('consumeoutsideclicks', 'false');
+ const anchor = document.createElement("div");
+ anchor.id = "zen-welcome-workspace-colors-anchor";
+ document.getElementById("zen-welcome-page-content").appendChild(anchor);
+ gZenThemePicker.panel.setAttribute("noautohide", "true");
+ gZenThemePicker.panel.setAttribute("consumeoutsideclicks", "false");
gZenThemePicker.panel.addEventListener(
- 'popupshowing',
+ "popupshowing",
() => {
const panelRect = gZenThemePicker.panel.getBoundingClientRect();
// 20 is the shadow width * 2
- anchor.style.height = panelRect.height - 20 + 'px';
- anchor.style.width = panelRect.width - 20 + 'px';
+ anchor.style.height = panelRect.height - 20 + "px";
+ anchor.style.width = panelRect.width - 20 + "px";
},
{ once: true }
);
PanelMultiView.openPopup(gZenThemePicker.panel, anchor, {
- position: 'overlap',
+ position: "overlap",
});
},
dontFadeOut: true,
async fadeOut() {
- gZenThemePicker.panel.removeAttribute('noautohide');
- gZenThemePicker.panel.removeAttribute('consumeoutsideclicks');
+ gZenThemePicker.panel.removeAttribute("noautohide");
+ gZenThemePicker.panel.removeAttribute("consumeoutsideclicks");
await animate(gZenThemePicker.panel, { opacity: [1, 0] });
gZenThemePicker.panel.hidePopup();
- gZenThemePicker.panel.removeAttribute('style');
+ gZenThemePicker.panel.removeAttribute("style");
},
},
{
text: [
{
- id: 'zen-welcome-start-browsing-title',
+ id: "zen-welcome-start-browsing-title",
},
{
- id: 'zen-welcome-start-browsing-description-1',
+ id: "zen-welcome-start-browsing-description-1",
},
],
buttons: [
{
- l10n: 'zen-welcome-start-browsing',
+ l10n: "zen-welcome-start-browsing",
onclick: async () => {
return true;
},
@@ -670,29 +676,30 @@
async function animateInitialStage() {
const [title1, title2] = await document.l10n.formatValues([
- { id: 'zen-welcome-title-line1' },
- { id: 'zen-welcome-title-line2' },
+ { id: "zen-welcome-title-line1" },
+ { id: "zen-welcome-title-line2" },
]);
- const titleElement = document.getElementById('zen-welcome-title');
+ const titleElement = document.getElementById("zen-welcome-title");
+ /* eslint-disable no-unsanitized/property */
titleElement.innerHTML = `${title1}${title2}`;
await animate(
- '#zen-welcome-title span',
- { opacity: [0, 1], y: [20, 0], filter: ['blur(2px)', 'blur(0px)'] },
+ "#zen-welcome-title span",
+ { opacity: [0, 1], y: [20, 0], filter: ["blur(2px)", "blur(0px)"] },
{
delay: getMotion().stagger(0.6, { startDelay: 0.2 }),
- type: 'spring',
+ type: "spring",
stiffness: 300,
damping: 20,
mass: 1.8,
}
);
- const button = document.getElementById('zen-welcome-start-button');
- button.addEventListener('click', async () => {
+ const button = document.getElementById("zen-welcome-start-button");
+ button.addEventListener("click", async () => {
await animate(
- '#zen-welcome-title span, #zen-welcome-start-button',
- { opacity: [1, 0], y: [0, -10], filter: ['blur(0px)', 'blur(2px)'] },
+ "#zen-welcome-title span, #zen-welcome-start-button",
+ { opacity: [1, 0], y: [0, -10], filter: ["blur(0px)", "blur(2px)"] },
{
- type: 'spring',
+ type: "spring",
ease: [0.755, 0.05, 0.855, 0.06],
bounce: 0.4,
delay: getMotion().stagger(0.4),
@@ -702,10 +709,10 @@
});
await animate(
button,
- { opacity: [0, 1], y: [20, 0], filter: ['blur(2px)', 'blur(0px)'] },
+ { opacity: [0, 1], y: [20, 0], filter: ["blur(2px)", "blur(0px)"] },
{
delay: 0.1,
- type: 'spring',
+ type: "spring",
stiffness: 300,
damping: 20,
mass: 1.8,
@@ -715,7 +722,7 @@
function centerWindowOnScreen() {
window.addEventListener(
- 'MozAfterPaint',
+ "MozAfterPaint",
function () {
window.resizeTo(875, 560);
window.focus();
diff --git a/src/zen/welcome/zen-welcome.css b/src/zen/welcome/zen-welcome.css
index b7385e561..54ecc0641 100644
--- a/src/zen/welcome/zen-welcome.css
+++ b/src/zen/welcome/zen-welcome.css
@@ -153,7 +153,7 @@
flex-direction: column;
gap: 1.6rem;
- &[select-engine='true'] {
+ &[select-engine="true"] {
display: grid;
grid-template-columns: 1fr 1fr;
box-sizing: border-box;
@@ -185,7 +185,7 @@
}
}
- &[select-engine='true'] > label {
+ &[select-engine="true"] > label {
flex-direction: column;
font-weight: 600;
aspect-ratio: 1 / 0.7;
@@ -197,7 +197,7 @@
}
/* 3 or more engines */
- &[select-engine='true']:has(label:nth-of-type(3)) > label {
+ &[select-engine="true"]:has(label:nth-of-type(3)) > label {
height: 50%;
}
@@ -267,7 +267,7 @@
&::after {
position: absolute;
- content: '';
+ content: "";
width: 1.8rem;
height: 1.8rem;
top: 50%;
diff --git a/src/zen/workspaces/ZenGradientGenerator.mjs b/src/zen/workspaces/ZenGradientGenerator.mjs
index 48e48ef55..dc02b03c7 100644
--- a/src/zen/workspaces/ZenGradientGenerator.mjs
+++ b/src/zen/workspaces/ZenGradientGenerator.mjs
@@ -2,12 +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 { nsZenMultiWindowFeature } from 'chrome://browser/content/zen-components/ZenCommonUtils.mjs';
+import { nsZenMultiWindowFeature } from "chrome://browser/content/zen-components/ZenCommonUtils.mjs";
function parseSinePath(pathStr) {
const points = [];
const commands = pathStr.match(/[MCL]\s*[\d\s.\-,]+/g);
- if (!commands) return points;
+ if (!commands) {
+ return points;
+ }
commands.forEach((command) => {
const type = command.charAt(0);
@@ -15,10 +17,10 @@ function parseSinePath(pathStr) {
const coords = coordsStr.split(/[\s,]+/).map(Number);
switch (type) {
- case 'M':
- points.push({ x: coords[0], y: coords[1], type: 'M' });
+ case "M":
+ points.push({ x: coords[0], y: coords[1], type: "M" });
break;
- case 'C':
+ case "C":
if (coords.length >= 6 && coords.length % 6 === 0) {
for (let i = 0; i < coords.length; i += 6) {
points.push({
@@ -28,13 +30,13 @@ function parseSinePath(pathStr) {
y2: coords[i + 3],
x: coords[i + 4],
y: coords[i + 5],
- type: 'C',
+ type: "C",
});
}
}
break;
- case 'L':
- points.push({ x: coords[0], y: coords[1], type: 'L' });
+ case "L":
+ points.push({ x: coords[0], y: coords[1], type: "L" });
break;
}
});
@@ -43,26 +45,30 @@ function parseSinePath(pathStr) {
const lazy = {};
-ChromeUtils.defineLazyGetter(lazy, 'MAX_OPACITY', () => {
- return parseFloat(document.getElementById('PanelUI-zen-gradient-generator-opacity').max);
+ChromeUtils.defineLazyGetter(lazy, "MAX_OPACITY", () => {
+ return parseFloat(document.getElementById("PanelUI-zen-gradient-generator-opacity").max);
});
-ChromeUtils.defineLazyGetter(lazy, 'MIN_OPACITY', () => {
- return parseFloat(document.getElementById('PanelUI-zen-gradient-generator-opacity').min);
+ChromeUtils.defineLazyGetter(lazy, "MIN_OPACITY", () => {
+ return parseFloat(document.getElementById("PanelUI-zen-gradient-generator-opacity").min);
});
-const EXPLICIT_LIGHTNESS_TYPE = 'explicit-lightness';
-const EXPLICIT_BLACKWHITE_TYPE = 'explicit-black-white';
+const EXPLICIT_LIGHTNESS_TYPE = "explicit-lightness";
+const EXPLICIT_BLACKWHITE_TYPE = "explicit-black-white";
+/**
+ * A class that manages the theme picker for Zen Workspaces.
+ * It allows users to create and customize gradients for their workspace themes.
+ */
export class nsZenThemePicker extends nsZenMultiWindowFeature {
static MAX_DOTS = 3;
currentOpacity = 0.5;
dots = [];
- useAlgo = '';
+ useAlgo = "";
#currentLightness = 50;
- #allowTransparencyOnSidebar = Services.prefs.getBoolPref('zen.theme.acrylic-elements', false);
+ #allowTransparencyOnSidebar = Services.prefs.getBoolPref("zen.theme.acrylic-elements", false);
#linePath = `M 51.373 27.395 L 367.037 27.395`;
#sinePath = `M 51.373 27.395 C 60.14 -8.503 68.906 -8.503 77.671 27.395 C 86.438 63.293 95.205 63.293 103.971 27.395 C 112.738 -8.503 121.504 -8.503 130.271 27.395 C 139.037 63.293 147.803 63.293 156.57 27.395 C 165.335 -8.503 174.101 -8.503 182.868 27.395 C 191.634 63.293 200.4 63.293 209.167 27.395 C 217.933 -8.503 226.7 -8.503 235.467 27.395 C 244.233 63.293 252.999 63.293 261.765 27.395 C 270.531 -8.503 279.297 -8.503 288.064 27.395 C 296.83 63.293 305.596 63.293 314.363 27.395 C 323.13 -8.503 331.896 -8.503 340.662 27.395 M 314.438 27.395 C 323.204 -8.503 331.97 -8.503 340.737 27.395 C 349.503 63.293 358.27 63.293 367.037 27.395`;
@@ -82,30 +88,30 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
});
this.dragStartPosition = null;
- this.isLegacyVersion = Services.prefs.getIntPref('zen.theme.gradient-legacy-version', 1) === 0;
+ this.isLegacyVersion = Services.prefs.getIntPref("zen.theme.gradient-legacy-version", 1) === 0;
- ChromeUtils.defineLazyGetter(this, 'panel', () =>
- document.getElementById('PanelUI-zen-gradient-generator')
+ ChromeUtils.defineLazyGetter(this, "panel", () =>
+ document.getElementById("PanelUI-zen-gradient-generator")
);
- ChromeUtils.defineLazyGetter(this, 'toolbox', () => document.getElementById('TabsToolbar'));
- ChromeUtils.defineLazyGetter(this, 'customColorInput', () =>
- document.getElementById('PanelUI-zen-gradient-generator-custom-input')
+ ChromeUtils.defineLazyGetter(this, "toolbox", () => document.getElementById("TabsToolbar"));
+ ChromeUtils.defineLazyGetter(this, "customColorInput", () =>
+ document.getElementById("PanelUI-zen-gradient-generator-custom-input")
);
- ChromeUtils.defineLazyGetter(this, 'customColorList', () =>
- document.getElementById('PanelUI-zen-gradient-generator-custom-list')
+ ChromeUtils.defineLazyGetter(this, "customColorList", () =>
+ document.getElementById("PanelUI-zen-gradient-generator-custom-list")
);
- ChromeUtils.defineLazyGetter(this, 'sliderWavePath', () =>
- document.getElementById('PanelUI-zen-gradient-slider-wave').querySelector('path')
+ ChromeUtils.defineLazyGetter(this, "sliderWavePath", () =>
+ document.getElementById("PanelUI-zen-gradient-slider-wave").querySelector("path")
);
- this.panel.addEventListener('popupshowing', this.handlePanelOpen.bind(this));
- this.panel.addEventListener('popuphidden', this.handlePanelClose.bind(this));
- this.panel.addEventListener('command', this.handlePanelCommand.bind(this));
+ this.panel.addEventListener("popupshowing", this.handlePanelOpen.bind(this));
+ this.panel.addEventListener("popuphidden", this.handlePanelClose.bind(this));
+ this.panel.addEventListener("command", this.handlePanelCommand.bind(this));
document
- .getElementById('PanelUI-zen-gradient-generator-opacity')
- .addEventListener('input', this.onOpacityChange.bind(this));
+ .getElementById("PanelUI-zen-gradient-generator-opacity")
+ .addEventListener("input", this.onOpacityChange.bind(this));
// Call the rest of the initialization
this.initContextMenu();
@@ -120,17 +126,17 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
this.initColorPages();
const darkModeChange = this.handleDarkModeChange.bind(this);
- window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', darkModeChange);
+ window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", darkModeChange);
XPCOMUtils.defineLazyPreferenceGetter(
this,
- 'windowSchemeType',
- 'zen.view.window.scheme',
+ "windowSchemeType",
+ "zen.view.window.scheme",
2,
darkModeChange
);
- XPCOMUtils.defineLazyPreferenceGetter(this, 'darkModeBias', 'zen.theme.dark-mode-bias', '0.5');
+ XPCOMUtils.defineLazyPreferenceGetter(this, "darkModeBias", "zen.theme.dark-mode-bias", "0.5");
}
handleDarkModeChange() {
@@ -148,17 +154,17 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
return false;
default:
}
- return window.matchMedia('(prefers-color-scheme: dark)').matches;
+ return window.matchMedia("(prefers-color-scheme: dark)").matches;
}
get colorHarmonies() {
return [
- { type: 'complementary', angles: [180] },
- { type: 'singleAnalogous', angles: [310] },
- { type: 'splitComplementary', angles: [150, 210] },
- { type: 'analogous', angles: [50, 310] },
- { type: 'triadic', angles: [120, 240] },
- { type: 'floating', angles: [] },
+ { type: "complementary", angles: [180] },
+ { type: "singleAnalogous", angles: [310] },
+ { type: "splitComplementary", angles: [150, 210] },
+ { type: "analogous", angles: [50, 310] },
+ { type: "triadic", angles: [120, 240] },
+ { type: "floating", angles: [] },
];
}
@@ -168,22 +174,22 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
data-lazy-l10n-id="zen-workspaces-change-theme"
command="cmd_zenOpenZenThemePicker"/>
`);
- document.getElementById('toolbar-context-customize').before(menu);
+ document.getElementById("toolbar-context-customize").before(menu);
}
openThemePicker(event) {
const fromForm = event.explicitOriginalTarget?.classList?.contains(
- 'zen-workspace-creation-edit-theme-button'
+ "zen-workspace-creation-edit-theme-button"
);
PanelMultiView.openPopup(this.panel, this.toolbox, {
- position: 'topright topleft',
+ position: "topright topleft",
triggerEvent: event,
y: fromForm ? -160 : 0,
});
}
initCustomColorInput() {
- this.customColorInput.addEventListener('change', (event) => {
+ this.customColorInput.addEventListener("change", (event) => {
// Prevent the popup from closing when the input is focused
this.openThemePicker(event);
});
@@ -191,25 +197,25 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
initPredefinedColors() {
document
- .getElementById('PanelUI-zen-gradient-generator-color-pages')
- .addEventListener('click', async (event) => {
+ .getElementById("PanelUI-zen-gradient-generator-color-pages")
+ .addEventListener("click", async (event) => {
const target = event.target;
- const rawPosition = target.getAttribute('data-position');
+ const rawPosition = target.getAttribute("data-position");
if (!rawPosition) {
return;
}
- const algo = target.getAttribute('data-algo');
- const lightness = target.getAttribute('data-lightness');
- const numDots = parseInt(target.getAttribute('data-num-dots'));
+ const algo = target.getAttribute("data-algo");
+ const lightness = target.getAttribute("data-lightness");
+ const numDots = parseInt(target.getAttribute("data-num-dots"));
if (numDots < this.dots.length) {
for (let i = numDots; i < this.dots.length; i++) {
this.dots[i].element.remove();
}
this.dots = this.dots.slice(0, numDots);
}
- const type = target.getAttribute('data-type') || EXPLICIT_LIGHTNESS_TYPE;
+ const type = target.getAttribute("data-type") || EXPLICIT_LIGHTNESS_TYPE;
// Generate new gradient from the single color given
- const [x, y] = rawPosition.split(',').map((pos) => parseInt(pos));
+ const [x, y] = rawPosition.split(",").map((pos) => parseInt(pos));
let dots = [
{
ID: 0,
@@ -226,30 +232,32 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
});
}
this.useAlgo = algo;
- if (lightness !== null) this.#currentLightness = lightness;
- dots = this.calculateCompliments(dots, 'update', this.useAlgo);
+ if (lightness !== null) {
+ this.#currentLightness = lightness;
+ }
+ dots = this.calculateCompliments(dots, "update", this.useAlgo);
this.handleColorPositions(dots, true);
this.updateCurrentWorkspace();
});
}
initColorPages() {
- const leftButton = document.getElementById('PanelUI-zen-gradient-generator-color-page-left');
- const rightButton = document.getElementById('PanelUI-zen-gradient-generator-color-page-right');
- const pagesWrapper = document.getElementById('PanelUI-zen-gradient-generator-color-pages');
+ const leftButton = document.getElementById("PanelUI-zen-gradient-generator-color-page-left");
+ const rightButton = document.getElementById("PanelUI-zen-gradient-generator-color-page-right");
+ const pagesWrapper = document.getElementById("PanelUI-zen-gradient-generator-color-pages");
const pages = pagesWrapper.children;
- pagesWrapper.addEventListener('wheel', (event) => {
+ pagesWrapper.addEventListener("wheel", (event) => {
event.preventDefault();
event.stopPropagation();
});
- leftButton.addEventListener('command', () => {
+ leftButton.addEventListener("command", () => {
this.#colorPage = (this.#colorPage - 1 + pages.length) % pages.length;
// Scroll to the next page, by using scrollLeft
pagesWrapper.scrollLeft = (this.#colorPage * pagesWrapper.scrollWidth) / pages.length;
rightButton.disabled = false;
leftButton.disabled = this.#colorPage === 0;
});
- rightButton.addEventListener('command', () => {
+ rightButton.addEventListener("command", () => {
this.#colorPage = (this.#colorPage + 1) % pages.length;
// Scroll to the next page, by using scrollLeft
pagesWrapper.scrollLeft = (this.#colorPage * pagesWrapper.scrollWidth) / pages.length;
@@ -259,15 +267,15 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
}
initSchemeButtons() {
- const buttons = document.getElementById('PanelUI-zen-gradient-generator-scheme');
- buttons.addEventListener('click', (event) => {
- const target = event.target.closest('.subviewbutton');
+ const buttons = document.getElementById("PanelUI-zen-gradient-generator-scheme");
+ buttons.addEventListener("click", (event) => {
+ const target = event.target.closest(".subviewbutton");
if (!target) {
return;
}
event.preventDefault();
event.stopPropagation();
- const scheme = target.id.replace('PanelUI-zen-gradient-generator-scheme-', '');
+ const scheme = target.id.replace("PanelUI-zen-gradient-generator-scheme-", "");
if (!scheme) {
return;
}
@@ -279,25 +287,25 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
if (themeInt === undefined) {
return;
}
- Services.prefs.setIntPref('zen.view.window.scheme', themeInt);
+ Services.prefs.setIntPref("zen.view.window.scheme", themeInt);
});
}
initTextureInput() {
- const wrapper = document.getElementById('PanelUI-zen-gradient-generator-texture-wrapper');
+ const wrapper = document.getElementById("PanelUI-zen-gradient-generator-texture-wrapper");
const wrapperWidth = wrapper.getBoundingClientRect().width;
// Add elements in a circular pattern, where the center is the center of the wrapper
for (let i = 0; i < 16; i++) {
- const dot = document.createElement('div');
- dot.classList.add('zen-theme-picker-texture-dot');
+ const dot = document.createElement("div");
+ dot.classList.add("zen-theme-picker-texture-dot");
const position = (i / 16) * Math.PI * 2 + wrapperWidth;
dot.style.left = `${Math.cos(position) * 50 + 50}%`;
dot.style.top = `${Math.sin(position) * 50 + 50}%`;
wrapper.appendChild(dot);
}
- this._textureHandler = document.createElement('div');
- this._textureHandler.id = 'PanelUI-zen-gradient-generator-texture-handler';
- this._textureHandler.addEventListener('mousedown', this.onTextureHandlerMouseDown.bind(this));
+ this._textureHandler = document.createElement("div");
+ this._textureHandler.id = "PanelUI-zen-gradient-generator-texture-handler";
+ this._textureHandler.addEventListener("mousedown", this.onTextureHandlerMouseDown.bind(this));
wrapper.appendChild(this._textureHandler);
}
@@ -305,13 +313,13 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
event.preventDefault();
this._onTextureMouseMove = this.onTextureMouseMove.bind(this);
this._onTextureMouseUp = this.onTextureMouseUp.bind(this);
- document.addEventListener('mousemove', this._onTextureMouseMove);
- document.addEventListener('mouseup', this._onTextureMouseUp);
+ document.addEventListener("mousemove", this._onTextureMouseMove);
+ document.addEventListener("mouseup", this._onTextureMouseUp);
}
onTextureMouseMove(event) {
event.preventDefault();
- const wrapper = document.getElementById('PanelUI-zen-gradient-generator-texture-wrapper');
+ const wrapper = document.getElementById("PanelUI-zen-gradient-generator-texture-wrapper");
const wrapperRect = wrapper.getBoundingClientRect();
// Determine how much rotation there is based on the mouse position and the center of the wrapper
const rotation = Math.atan2(
@@ -333,36 +341,37 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
}
if (previousTexture !== this.currentTexture) {
this.updateCurrentWorkspace();
+ /* eslint-disable mozilla/valid-services */
Services.zen.playHapticFeedback();
}
}
onTextureMouseUp(event) {
event.preventDefault();
- document.removeEventListener('mousemove', this._onTextureMouseMove);
- document.removeEventListener('mouseup', this._onTextureMouseUp);
+ document.removeEventListener("mousemove", this._onTextureMouseMove);
+ document.removeEventListener("mouseup", this._onTextureMouseUp);
this._onTextureMouseMove = null;
this._onTextureMouseUp = null;
}
initThemePicker() {
- const themePicker = this.panel.querySelector('.zen-theme-picker-gradient');
+ const themePicker = this.panel.querySelector(".zen-theme-picker-gradient");
this._onDotMouseMove = this.onDotMouseMove.bind(this);
this._onDotMouseUp = this.onDotMouseUp.bind(this);
this._onDotMouseDown = this.onDotMouseDown.bind(this);
this._onThemePickerClick = this.onThemePickerClick.bind(this);
- document.addEventListener('mousemove', this._onDotMouseMove);
- document.addEventListener('mouseup', this._onDotMouseUp);
- themePicker.addEventListener('mousedown', this._onDotMouseDown);
- themePicker.addEventListener('click', this._onThemePickerClick);
+ document.addEventListener("mousemove", this._onDotMouseMove);
+ document.addEventListener("mouseup", this._onDotMouseUp);
+ themePicker.addEventListener("mousedown", this._onDotMouseDown);
+ themePicker.addEventListener("click", this._onThemePickerClick);
}
uninitThemePicker() {
- const themePicker = this.panel.querySelector('.zen-theme-picker-gradient');
- document.removeEventListener('mousemove', this._onDotMouseMove);
- document.removeEventListener('mouseup', this._onDotMouseUp);
- themePicker.removeEventListener('mousedown', this._onDotMouseDown);
- themePicker.removeEventListener('click', this._onThemePickerClick);
+ const themePicker = this.panel.querySelector(".zen-theme-picker-gradient");
+ document.removeEventListener("mousemove", this._onDotMouseMove);
+ document.removeEventListener("mouseup", this._onDotMouseUp);
+ themePicker.removeEventListener("mousedown", this._onDotMouseDown);
+ themePicker.removeEventListener("click", this._onThemePickerClick);
this._onDotMouseMove = null;
this._onDotMouseUp = null;
this._onDotMouseDown = null;
@@ -378,7 +387,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
* @param {number} h The hue
* @param {number} s The saturation
* @param {number} l The lightness
- * @return {Array} The RGB representation
+ * @returns {Array} The RGB representation
*/
hslToRgb(h, s, l) {
const { round } = Math;
@@ -405,21 +414,36 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
let min = Math.min(r, g, b);
let d = max - min;
let h;
- if (d === 0) h = 0;
- else if (max === r) h = ((g - b) / d) % 6;
- else if (max === g) h = (b - r) / d + 2;
- else if (max === b) h = (r - g) / d + 4;
+ if (d === 0) {
+ h = 0;
+ } else if (max === r) {
+ h = ((g - b) / d) % 6;
+ } else if (max === g) {
+ h = (b - r) / d + 2;
+ } else if (max === b) {
+ h = (r - g) / d + 4;
+ }
let l = (min + max) / 2;
let s = d === 0 ? 0 : d / (1 - Math.abs(2 * l - 1));
return [h * 60, s, l];
}
hueToRgb(p, q, t) {
- if (t < 0) t += 1;
- if (t > 1) t -= 1;
- if (t < 1 / 6) return p + (q - p) * 6 * t;
- if (t < 1 / 2) return q;
- if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
+ if (t < 0) {
+ t += 1;
+ }
+ if (t > 1) {
+ t -= 1;
+ }
+ if (t < 1 / 6) {
+ return p + (q - p) * 6 * t;
+ }
+ if (t < 1 / 2) {
+ return q;
+ }
+ if (t < 2 / 3) {
+ return p + (q - p) * (2 / 3 - t) * 6;
+ }
return p;
}
@@ -444,7 +468,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
getColorFromPosition(x, y, type = undefined) {
// Return a color as hsl based on the position in the gradient
- const gradient = this.panel.querySelector('.zen-theme-picker-gradient');
+ const gradient = this.panel.querySelector(".zen-theme-picker-gradient");
const rect = gradient.getBoundingClientRect();
const padding = 30; // each side
const dotHalfSize = 29; // half the size of the dot. -11 for correct centering
@@ -491,36 +515,36 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
createDot(color, fromWorkspace = false) {
const [r, g, b] = color.c;
- const dot = document.createElement('div');
+ const dot = document.createElement("div");
if (color.isPrimary) {
- dot.classList.add('primary');
+ dot.classList.add("primary");
}
if (color.isCustom) {
if (!color.c) {
return;
}
- dot.classList.add('custom');
+ dot.classList.add("custom");
dot.style.opacity = 0;
- dot.style.setProperty('--zen-theme-picker-dot-color', color.c);
+ dot.style.setProperty("--zen-theme-picker-dot-color", color.c);
} else {
const { x, y } = color.position || this.calculateInitialPosition([r, g, b]);
- const dotPad = this.panel.querySelector('.zen-theme-picker-gradient');
+ const dotPad = this.panel.querySelector(".zen-theme-picker-gradient");
- dot.classList.add('zen-theme-picker-dot');
+ dot.classList.add("zen-theme-picker-dot");
dot.style.left = `${x}px`;
dot.style.top = `${y}px`;
if (this.dots.length < 1) {
- dot.classList.add('primary');
+ dot.classList.add("primary");
}
dotPad.appendChild(dot);
let id = this.dots.length;
- dot.style.setProperty('--zen-theme-picker-dot-color', `rgb(${r}, ${g}, ${b})`);
- dot.setAttribute('data-position', this.getJSONPos(x, y));
- dot.setAttribute('data-type', color.type);
+ dot.style.setProperty("--zen-theme-picker-dot-color", `rgb(${r}, ${g}, ${b})`);
+ dot.setAttribute("data-position", this.getJSONPos(x, y));
+ dot.setAttribute("data-type", color.type);
this.dots.push({
ID: id,
@@ -543,14 +567,14 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
`);
- 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