├── .gitattributes ├── .github ├── scripts │ ├── calculate_version.js │ ├── create_github_release.js │ └── process_changelog.js └── workflows │ ├── build.yml │ └── published.yml ├── .gitignore ├── @types ├── aboutaddons.d.ts ├── addon.d.ts ├── autoReload.d.ts ├── bootstrap.d.ts ├── content.d.ts ├── custom.gecko.dom.d.ts ├── extraTabmixUtils.d.ts ├── gecko │ ├── devtools │ │ ├── gecko.d.ts │ │ └── perf.d.ts │ └── tools │ │ ├── generated │ │ ├── lib.gecko.darwin.d.ts │ │ ├── lib.gecko.dom.d.ts │ │ ├── lib.gecko.glean.d.ts │ │ ├── lib.gecko.linux.d.ts │ │ ├── lib.gecko.modules.d.ts │ │ ├── lib.gecko.nsresult.d.ts │ │ ├── lib.gecko.services.d.ts │ │ ├── lib.gecko.win32.d.ts │ │ └── lib.gecko.xpcom.d.ts │ │ ├── index.d.ts │ │ ├── lib.gecko.custom.d.ts │ │ ├── lib.gecko.tweaks.d.ts │ │ ├── lib.gecko.xpidl.d.ts │ │ └── subs │ │ └── PromiseWorker.d.ts ├── general.d.ts ├── index.d.ts ├── modules.d.ts ├── numberInput.d.ts ├── overrideGecko.d.ts ├── overrideGeckoDom.d.ts ├── preferences.d.ts └── tabmix.d.ts ├── LICENSE.txt ├── README.md ├── addon ├── bootstrap.js ├── chrome.manifest ├── chrome │ ├── content │ │ ├── broadcaster.js │ │ ├── click │ │ │ ├── click.js │ │ │ └── listeners.js │ │ ├── extensions │ │ │ └── extensions.js │ │ ├── flst │ │ │ └── lasttab.js │ │ ├── links │ │ │ ├── contentLinks.js │ │ │ ├── setup.js │ │ │ └── userInterface.js │ │ ├── minit │ │ │ ├── minit.js │ │ │ └── tablib.js │ │ ├── overlay │ │ │ ├── autoReload.css │ │ │ ├── autoReload.js │ │ │ ├── autoReload.xhtml │ │ │ ├── autoReload_properties.css │ │ │ ├── browser.css │ │ │ ├── browser_before_119.css │ │ │ ├── multirow.css │ │ │ ├── renameTab.xhtml │ │ │ ├── tabContextMenu.xhtml │ │ │ ├── tsconfig.json │ │ │ └── zen_browser.css │ │ ├── places │ │ │ ├── places.js │ │ │ └── places.xhtml │ │ ├── preferences │ │ │ ├── appearance.js │ │ │ ├── appearance.xhtml │ │ │ ├── checkbox_tmp-ce.js │ │ │ ├── events.js │ │ │ ├── events.xhtml │ │ │ ├── incompatible.xhtml │ │ │ ├── links.js │ │ │ ├── links.xhtml │ │ │ ├── menu.js │ │ │ ├── menu.xhtml │ │ │ ├── mouse.js │ │ │ ├── mouse.xhtml │ │ │ ├── numberinput.js │ │ │ ├── overlay │ │ │ │ ├── aboutaddons.js │ │ │ │ └── aboutaddons.xhtml │ │ │ ├── preferences.js │ │ │ ├── preferences.xhtml │ │ │ ├── prefs-ce.js │ │ │ ├── session.js │ │ │ ├── session.xhtml │ │ │ ├── shortcuts-ce.js │ │ │ ├── shortcuts.js │ │ │ ├── subdialogs │ │ │ │ ├── pref-appearance-ce.js │ │ │ │ ├── pref-appearance.css │ │ │ │ ├── pref-appearance.js │ │ │ │ ├── pref-appearance.xhtml │ │ │ │ ├── pref-filetype.js │ │ │ │ └── pref-filetype.xhtml │ │ │ └── tsconfig.json │ │ ├── scripts │ │ │ ├── content.js │ │ │ └── tsconfig.json │ │ ├── session │ │ │ └── sessionStore.js │ │ ├── tab │ │ │ ├── scrollbox.js │ │ │ ├── tab.js │ │ │ ├── tabBindings.js │ │ │ └── tabsBindings.js │ │ ├── tabmix.js │ │ ├── tabmix.xhtml │ │ ├── tsconfig.json │ │ └── utils.js │ ├── locale │ │ ├── bg-BG │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── ca │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── cs-CZ │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── da │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── de │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── el │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── en-US │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── es-ES │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── et-EE │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── fa-IR │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── fr │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── he-IL │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── hr-HR │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── hu-HU │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── it │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── ja │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── ko-KR │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── nl │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── pl │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── pt-BR │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── pt-PT │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── ro │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── ru-RU │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── sk-SK │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── sr │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── sv-SE │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── tr │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── uk-UA │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── vi │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ ├── zh-CN │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ │ └── zh-TW │ │ │ ├── misc.dtd │ │ │ ├── pref-appearance.dtd │ │ │ ├── pref-filetype.dtd │ │ │ ├── pref-tabmix.dtd │ │ │ ├── shortcuts.dtd │ │ │ ├── tabmix.dtd │ │ │ └── tabmix.properties │ └── skin │ │ ├── app_version │ │ ├── 91 │ │ │ ├── linux │ │ │ │ ├── browser.css │ │ │ │ └── tabStyles.css │ │ │ ├── mac │ │ │ │ ├── browser.css │ │ │ │ └── tabStyles.css │ │ │ ├── pref-appearance.css │ │ │ ├── preferences.css │ │ │ ├── tabStyles.css │ │ │ └── win │ │ │ │ ├── browser.css │ │ │ │ └── tabStyles.css │ │ ├── 119 │ │ │ ├── linux │ │ │ │ ├── browser.css │ │ │ │ └── tabStyles.css │ │ │ ├── mac │ │ │ │ ├── browser.css │ │ │ │ └── tabStyles.css │ │ │ ├── pref-appearance.css │ │ │ ├── preferences.css │ │ │ ├── tabStyles.css │ │ │ └── win │ │ │ │ ├── browser.css │ │ │ │ └── tabStyles.css │ │ └── all │ │ │ ├── linux │ │ │ └── browser.css │ │ │ ├── mac │ │ │ ├── browser.css │ │ │ └── progress.css │ │ │ ├── numberinput.css │ │ │ ├── preferences-proton.css │ │ │ ├── preferences.css │ │ │ ├── prefwindow.css │ │ │ ├── themeStyles.css │ │ │ ├── themeStyles_before_126.css │ │ │ └── win │ │ │ ├── browser.css │ │ │ └── progress.css │ │ ├── arrow-up.svg │ │ ├── autoreload.png │ │ ├── disabled.svg │ │ ├── dropmarker-leftright.png │ │ ├── general.css │ │ ├── help.png │ │ ├── icons │ │ ├── appearance.png │ │ ├── closed-tabs-16x16-disabled.png │ │ ├── closed-tabs-16x16-hovered.png │ │ ├── closed-tabs-16x16.png │ │ ├── closed-tabs-24x24-disabled.png │ │ ├── closed-tabs-24x24-hovered.png │ │ ├── closed-tabs-24x24.png │ │ ├── closed-win-16x16-disabled.png │ │ ├── closed-win-16x16-hovered.png │ │ ├── closed-win-16x16.png │ │ ├── closed-win-24x24-disabled.png │ │ ├── closed-win-24x24-hovered.png │ │ ├── closed-win-24x24.png │ │ ├── events.png │ │ ├── links.png │ │ ├── menu.png │ │ ├── mouse.png │ │ ├── session-manager-16x16-disabled.png │ │ ├── session-manager-16x16-hovered.png │ │ ├── session-manager-16x16.png │ │ ├── session-manager-24x24-disabled.png │ │ ├── session-manager-24x24-hovered.png │ │ ├── session-manager-24x24.png │ │ ├── tab-list-16x16-disabled.png │ │ ├── tab-list-16x16-hovered.png │ │ ├── tab-list-16x16.png │ │ ├── tab-list-24x24-disabled.png │ │ ├── tab-list-24x24-hovered.png │ │ └── tab-list-24x24.png │ │ ├── locked.png │ │ ├── newtab.png │ │ ├── pin.png │ │ ├── pref-appearance.css │ │ ├── preferences.css │ │ ├── protected.png │ │ ├── question-16.png │ │ ├── refresh.svg │ │ ├── renameTab.css │ │ ├── shortcuts.css │ │ ├── tab.css │ │ ├── tabmix-preferences.css │ │ ├── tmp.png │ │ └── tmpsmall.png ├── defaults │ └── preferences │ │ └── tabmix.js ├── icon.png ├── install.rdf ├── modules │ ├── AutoReload.sys.mjs │ ├── BrowserDOMWindow.sys.mjs │ ├── BrowserVersion.sys.mjs │ ├── Changecode.sys.mjs │ ├── ChromeUtils.sys.mjs │ ├── ContentClick.sys.mjs │ ├── ContentSvc.sys.mjs │ ├── ContextMenu.sys.mjs │ ├── DocShellCapabilities.sys.mjs │ ├── DownloadLastDir.sys.mjs │ ├── DynamicRules.sys.mjs │ ├── Floorp.sys.mjs │ ├── LinkNodeUtils.sys.mjs │ ├── MergeWindows.sys.mjs │ ├── NewTabURL.sys.mjs │ ├── Places.sys.mjs │ ├── RenameTab.sys.mjs │ ├── Shortcuts.sys.mjs │ ├── SingleWindowModeUtils.sys.mjs │ ├── Slideshow.sys.mjs │ ├── SyncedTabs.sys.mjs │ ├── TabContextConfig.sys.mjs │ ├── TabmixSvc.sys.mjs │ ├── Utils.sys.mjs │ ├── VerticalTabs.sys.mjs │ ├── bootstrap │ │ ├── ChromeManifest.sys.mjs │ │ ├── Overlays.sys.mjs │ │ ├── PreferencesLoader.sys.mjs │ │ ├── ScriptsLoader.sys.mjs │ │ └── TabmixWidgets.sys.mjs │ ├── extensions │ │ ├── AddonManager.sys.mjs │ │ └── CompatibilityCheck.sys.mjs │ ├── log.sys.mjs │ └── tsconfig.json └── tsconfig.json ├── config ├── .prettierignore ├── .stylelintrc.json ├── base.tsconfig.json ├── eslint-plugin-tabmix │ ├── import-globals.js │ ├── index.js │ ├── lazy-getter-name-match.js │ ├── package.json │ └── valid-lazy.js ├── husky │ ├── commit-msg │ ├── commitlint.config.js │ ├── lint-staged.config.js │ └── pre-commit ├── prettier.config.js ├── release_dates.json ├── typecheck.js ├── updates-dev-build.json ├── updates.json └── zen_updates.json ├── eslint.config.js ├── package-lock.json ├── package.json └── tsconfig.json /.gitattributes: -------------------------------------------------------------------------------- 1 | # Maintain executable permissions on scripts 2 | *.js text eol=lf 3 | .github/scripts/*.js text eol=lf 4 | -------------------------------------------------------------------------------- /.github/scripts/create_github_release.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import {execSync} from "node:child_process"; 4 | 5 | // Use the same environment variable that's set in the workflow 6 | const changelogExists = process.env.CHANGELOG_EXIST === "true"; 7 | const previousTag = process.env.PREVIOUS_TAG; 8 | const notes = process.env.NOTES; 9 | const xpiName = process.env.XPI_NAME; 10 | 11 | console.log("Script environment variables:"); 12 | console.log(`- CHANGELOG_EXIST: ${process.env.CHANGELOG_EXIST} (parsed as: ${changelogExists})`); 13 | console.log(`- PREVIOUS_TAG: ${previousTag}`); 14 | console.log(`- NOTES: ${notes}`); 15 | console.log(`- XPI_NAME: ${xpiName}`); 16 | 17 | let updateNotesCommand = "gh release edit dev-build --draft=false"; 18 | if (changelogExists) { 19 | console.log("Changelog exists, using CHANGELOG.md for release notes"); 20 | updateNotesCommand += " --notes-file=CHANGELOG.md"; 21 | } else { 22 | console.log("No changelog exists, using default notes"); 23 | // No changes since last tag 24 | const url = `https://github.com/onemen/TabMixPlus/releases/tag/${previousTag}`; 25 | const releaseNotes = `${notes}

No changes since [${previousTag}](${url})`; 26 | updateNotesCommand += ` --notes="${releaseNotes}"`; 27 | console.log(`Generated release notes: ${releaseNotes}`); 28 | } 29 | 30 | console.log(`Executing command: ${updateNotesCommand}`); 31 | // Update release notes 32 | execSync(updateNotesCommand, {stdio: "inherit"}); 33 | 34 | const uploadCommand = `gh release upload dev-build /tmp/${xpiName}.xpi --clobber`; 35 | console.log(`Uploading XPI file: ${uploadCommand}`); 36 | // Upload XPI file 37 | execSync(uploadCommand, { 38 | stdio: "inherit", 39 | }); 40 | 41 | console.log("GitHub release update completed successfully"); 42 | -------------------------------------------------------------------------------- /.github/workflows/published.yml: -------------------------------------------------------------------------------- 1 | name: release-published 2 | 3 | on: 4 | release: 5 | types: [published] 6 | 7 | workflow_dispatch: 8 | 9 | jobs: 10 | update-docs: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Update tabmixplus-docs 14 | env: 15 | GH_TOKEN: ${{ secrets.TABMIXPLUS_DOCS_TOKEN }} 16 | run: | 17 | gh workflow run --repo onemen/tabmixplus-docs --ref main deploy.yml 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Coverage directory used by tools like istanbul 10 | coverage 11 | *.lcov 12 | 13 | # temp files 14 | **/test/* 15 | **/draft/* 16 | *~.* 17 | *~* 18 | 19 | # Dependency directories 20 | node_modules/ 21 | 22 | # Optional npm cache directory 23 | .npm 24 | 25 | # Optional eslint cache 26 | .eslintcache 27 | 28 | # compressed files 29 | *.tgz 30 | *.xpi 31 | *.rar 32 | *.zip 33 | 34 | **/sysmjs.txt 35 | **/usedmjs.json 36 | 37 | #hide test folder 38 | test/* 39 | 40 | **/tsconfig.tsbuildinfo 41 | -------------------------------------------------------------------------------- /@types/aboutaddons.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | interface WindowProxy { 4 | readonly docShell: nsIDocShell; 5 | } 6 | 7 | declare var windowRoot: WindowRoot & {readonly ownerGlobal: WindowProxy}; 8 | -------------------------------------------------------------------------------- /@types/autoReload.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | declare var gNumberInput: typeof NumberInput; 4 | 5 | interface DocumentElement extends Omit {} 6 | 7 | interface GetByMap { 8 | autoreload_minutes: HTMLNumberInputElement; 9 | autoreload_seconds: HTMLNumberInputElement; 10 | reloadevery_custom_dialog: HTMLDialogElement & {readonly shadowRoot: ShadowRoot}; 11 | } 12 | 13 | interface GetClosestMap { 14 | ".combined-element": HTMLElement & {firstChild: HTMLNumberInputElement}; 15 | ".container": HTMLElement; 16 | } 17 | 18 | interface WindowProxy { 19 | arguments: any[]; 20 | } 21 | -------------------------------------------------------------------------------- /@types/gecko/tools/generated/lib.gecko.services.d.ts: -------------------------------------------------------------------------------- 1 | // don't check the imported files 2 | // @ts-nocheck 3 | 4 | /** 5 | * NOTE: Do not modify this file by hand. 6 | * Content was generated from services.json. 7 | * If you're updating some of the sources, see README for instructions. 8 | */ 9 | 10 | interface JSServices { 11 | DAPTelemetry: nsIDAPTelemetry; 12 | appShell: nsIAppShellService; 13 | appinfo: nsICrashReporter & nsIXULAppInfo & nsIXULRuntime; 14 | blocklist: nsIBlocklistService; 15 | cache2: nsICacheStorageService; 16 | catMan: nsICategoryManager; 17 | clearData: nsIClearDataService; 18 | clipboard: nsIClipboard; 19 | console: nsIConsoleService; 20 | cookieBanners: nsICookieBannerService; 21 | cookies: nsICookieManager & nsICookieService; 22 | cpmm: ContentProcessMessageManager; 23 | dirsvc: nsIDirectoryService & nsIProperties; 24 | dns: nsIDNSService; 25 | domStorageManager: nsIDOMStorageManager & nsILocalStorageManager; 26 | droppedLinkHandler: nsIDroppedLinkHandler; 27 | eTLD: nsIEffectiveTLDService; 28 | els: nsIEventListenerService; 29 | env: nsIEnvironment; 30 | focus: nsIFocusManager; 31 | fog: nsIFOG; 32 | intl: mozIMozIntl; 33 | io: nsIIOService & nsINetUtil & nsISpeculativeConnect; 34 | loadContextInfo: nsILoadContextInfoFactory; 35 | locale: mozILocaleService; 36 | logins: nsILoginManager; 37 | mm: ChromeMessageBroadcaster; 38 | obs: nsIObserverService; 39 | perms: nsIPermissionManager; 40 | policies: nsIEnterprisePolicies; 41 | ppmm: ParentProcessMessageManager; 42 | prefs: nsIPrefBranch & nsIPrefService; 43 | profiler: nsIProfiler; 44 | prompt: nsIPromptService; 45 | qms: nsIQuotaManagerService; 46 | rfp: nsIRFPService; 47 | scriptSecurityManager: nsIScriptSecurityManager; 48 | scriptloader: mozIJSSubScriptLoader; 49 | search: nsISearchService; 50 | sessionStorage: nsISessionStorageService; 51 | startup: nsIAppStartup; 52 | storage: mozIStorageService; 53 | strings: nsIStringBundleService; 54 | sysinfo: nsIPropertyBag2 & nsISystemInfo; 55 | telemetry: nsITelemetry; 56 | textToSubURI: nsITextToSubURI; 57 | tm: nsIThreadManager; 58 | uriFixup: nsIURIFixup; 59 | urlFormatter: nsIURLFormatter; 60 | uuid: nsIUUIDGenerator; 61 | vc: nsIVersionComparator; 62 | wm: nsIWindowMediator; 63 | ww: nsIWindowWatcher; 64 | xulStore: nsIXULStore; 65 | } 66 | -------------------------------------------------------------------------------- /@types/gecko/tools/index.d.ts: -------------------------------------------------------------------------------- 1 | // don't check the imported files 2 | // @ts-nocheck 3 | 4 | /* This Source Code Form is subject to the terms of the Mozilla Public 5 | * License, v. 2.0. If a copy of the MPL was not distributed with this 6 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 7 | 8 | /// 9 | /// 10 | 11 | /// 12 | /// 13 | /// 14 | /// 15 | /// 16 | /// 17 | /// 18 | 19 | /// Platform specific XPCOM modules. 20 | /// 21 | /// 22 | /// 23 | 24 | /// Order of references matters here, for overriding type signatures. 25 | /// 26 | 27 | declare global { 28 | const Cc: nsXPCComponents_Classes; 29 | const Ci: nsIXPCComponents_Interfaces; 30 | const Components: nsIXPCComponents; 31 | const Cr: nsIXPCComponents_Results; 32 | 33 | // Resolve typed generic overloads before the generated ones. 34 | const Cu: nsXPCComponents_Utils & nsIXPCComponents_Utils; 35 | 36 | const Services: JSServices; 37 | const uneval: (any) => string; 38 | } 39 | 40 | export {}; 41 | -------------------------------------------------------------------------------- /@types/gecko/tools/lib.gecko.custom.d.ts: -------------------------------------------------------------------------------- 1 | // don't check the imported files 2 | // @ts-nocheck 3 | 4 | /** 5 | * Custom artisanal types, handcrafted especially for Gecko. 6 | */ 7 | 8 | declare global { 9 | type DeclaredLazy = { 10 | [P in keyof T]: T[P] extends () => infer U 11 | ? U 12 | : T[P] extends keyof LazyModules 13 | ? Exports 14 | : T[P] extends { pref: string; default?: infer U } 15 | ? Widen 16 | : T[P] extends { service: string; iid?: infer U } 17 | ? nsQIResult 18 | : never; 19 | }; 20 | 21 | type LazyDefinition = Record< 22 | string, 23 | | string 24 | | (() => any) 25 | | { service: string; iid: nsIID } 26 | | { pref: string; default?; onUpdate?; transform? } 27 | >; 28 | } 29 | 30 | type Exports = M extends keyof LazyModules 31 | ? IfKey 32 | : never; 33 | type IfKey = K extends keyof T ? T[K] : never; 34 | 35 | type LazyModules = import("./generated/lib.gecko.modules").LazyModules; 36 | 37 | type Widen = T extends boolean 38 | ? boolean 39 | : T extends number 40 | ? number 41 | : T extends string 42 | ? string 43 | : never; 44 | 45 | export {}; 46 | -------------------------------------------------------------------------------- /@types/gecko/tools/lib.gecko.xpidl.d.ts: -------------------------------------------------------------------------------- 1 | // don't check the imported files 2 | // @ts-nocheck 3 | 4 | /** 5 | * Gecko XPIDL base types. 6 | */ 7 | 8 | /** 9 | * Generic IDs are created by most code which passes a nsID to js. 10 | * https://searchfox.org/mozilla-central/source/js/xpconnect/src/XPCJSID.cpp#24 11 | */ 12 | interface nsID { 13 | readonly number: uuid; 14 | } 15 | 16 | /** 17 | * In addition to nsID, interface IIDs support instanceof type guards, 18 | * and expose constants defined on the class, including variants from enums. 19 | * https://searchfox.org/mozilla-central/source/js/xpconnect/src/XPCJSID.cpp#45 20 | */ 21 | type nsJSIID = nsID & 22 | Constants & 23 | enums & { 24 | new (_: never): void; 25 | prototype: iface; 26 | }; 27 | 28 | /** A union type of all known interface IIDs. */ 29 | type nsIID = nsIXPCComponents_Interfaces[keyof nsIXPCComponents_Interfaces]; 30 | 31 | /** A generic to resolve QueryInterface return type from a nsIID. */ 32 | type nsQIResult = iid extends { prototype: infer U } ? U : never; 33 | 34 | /** Picks only const number properties from T. */ 35 | type Constants = { [K in keyof T as IfConst]: T[K] }; 36 | 37 | /** Resolves only for keys K whose corresponding type T is a narrow number. */ 38 | type IfConst = T extends number ? (number extends T ? never : K) : never; 39 | 40 | /** u32 */ 41 | type nsresult = u32; 42 | 43 | // Numeric typedefs, useful as a quick reference in method signatures. 44 | type double = number; 45 | type float = number; 46 | type i16 = number; 47 | type i32 = number; 48 | type i64 = number; 49 | type u16 = number; 50 | type u32 = number; 51 | type u64 = number; 52 | type u8 = number; 53 | -------------------------------------------------------------------------------- /@types/index.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | /// 5 | /// 6 | /// 7 | -------------------------------------------------------------------------------- /@types/numberInput.d.ts: -------------------------------------------------------------------------------- 1 | interface CustomEvent extends MouseEvent, KeyboardEvent { 2 | target: HTMLNumberInputElement; 3 | } 4 | 5 | interface HTMLNumberInputElement extends Omit { 6 | defaultValue: number | string; 7 | readonly editor: nsIEditor; 8 | min: number; 9 | max: number; 10 | value: number | string; 11 | oninput(e: CustomEvent): void; 12 | } 13 | 14 | declare namespace NumberInput { 15 | function init(delay?: boolean): void; 16 | function unload(): void; 17 | function changeExpr(event: CustomEvent): boolean; 18 | function inputExpr(event: CustomEvent): boolean; 19 | function handleEvent(event: CustomEvent): void; 20 | function updateAllSpinners(): void; 21 | function updateSpinnerDisabledState(item: HTMLNumberInputElement): void; 22 | } 23 | 24 | interface QuerySelectorMap { 25 | "input[type=number]": HTMLNumberInputElement; 26 | } 27 | 28 | interface XULPopupElement { 29 | openPopup(anchorElement?: Node | HTMLElement | null, options?: StringOrOpenPopupOptions, x?: number, y?: number, isContextMenu?: boolean, attributesOverride?: boolean, triggerEvent?: Event | null): void; 30 | } 31 | 32 | declare namespace Globals { 33 | function oninput(item: HTMLNumberInputElement): void; 34 | function onSelect(event: CustomEvent): void; 35 | function openPopup(button: HTMLButtonElement & {nextElementSibling: XULPopupElement}): void; 36 | } 37 | 38 | type NumberInput = typeof NumberInput; 39 | -------------------------------------------------------------------------------- /addon/chrome.manifest: -------------------------------------------------------------------------------- 1 | content tabmixplus chrome/content/ 2 | content tabmix-prefs defaults/preferences/ 3 | content tabmix-resource modules/ 4 | 5 | locale tabmixplus bg chrome/locale/bg-BG/ 6 | locale tabmixplus ca chrome/locale/ca/ 7 | locale tabmixplus cs chrome/locale/cs-CZ/ 8 | locale tabmixplus da chrome/locale/da/ 9 | locale tabmixplus de chrome/locale/de/ 10 | locale tabmixplus el chrome/locale/el/ 11 | locale tabmixplus en-US chrome/locale/en-US/ 12 | locale tabmixplus es-ES chrome/locale/es-ES/ 13 | locale tabmixplus et chrome/locale/et-EE/ 14 | locale tabmixplus fa chrome/locale/fa-IR/ 15 | locale tabmixplus fr chrome/locale/fr/ 16 | locale tabmixplus he chrome/locale/he-IL/ 17 | locale tabmixplus hr chrome/locale/hr-HR/ 18 | locale tabmixplus hu chrome/locale/hu-HU/ 19 | locale tabmixplus it chrome/locale/it/ 20 | locale tabmixplus ja chrome/locale/ja/ 21 | locale tabmixplus ko chrome/locale/ko-KR/ 22 | locale tabmixplus nl chrome/locale/nl/ 23 | locale tabmixplus pl chrome/locale/pl/ 24 | locale tabmixplus pt-BR chrome/locale/pt-BR/ 25 | locale tabmixplus pt-PT chrome/locale/pt-PT/ 26 | locale tabmixplus ro chrome/locale/ro/ 27 | locale tabmixplus ru chrome/locale/ru-RU/ 28 | locale tabmixplus sk chrome/locale/sk-SK/ 29 | locale tabmixplus sr chrome/locale/sr/ 30 | locale tabmixplus sv-SE chrome/locale/sv-SE/ 31 | locale tabmixplus tr chrome/locale/tr/ 32 | locale tabmixplus uk chrome/locale/uk-UA/ 33 | locale tabmixplus vi chrome/locale/vi/ 34 | locale tabmixplus zh-CN chrome/locale/zh-CN/ 35 | locale tabmixplus zh-TW chrome/locale/zh-TW/ 36 | 37 | skin tabmixplus classic/1.0 chrome/skin/ 38 | 39 | skin tabmix-version tabmixplus chrome/skin/app_version/91/ platformversion>=91 40 | skin tabmix-version tabmixplus chrome/skin/app_version/119/ platformversion>=119 41 | skin tabmix-os classic/1.0 chrome://tabmix-version/skin/win/ os=WINNT 42 | skin tabmix-os classic/1.0 chrome://tabmix-version/skin/mac/ os=Darwin 43 | skin tabmix-os classic/1.0 chrome://tabmix-version/skin/linux/ os=Linux 44 | -------------------------------------------------------------------------------- /addon/chrome/content/overlay/autoReload.css: -------------------------------------------------------------------------------- 1 | @namespace html url("http://www.w3.org/1999/xhtml"); 2 | 3 | html|fieldset { 4 | display: flex; 5 | justify-content: space-between; 6 | align-items: center; 7 | padding-block: 15px; 8 | margin-bottom: 10px; 9 | min-width: 235px; 10 | } 11 | 12 | .container { 13 | display: flex; 14 | align-items: center; 15 | } 16 | 17 | .container > label { 18 | margin-inline-end: 0; 19 | } 20 | 21 | .combined-element { 22 | background-color: var(--in-content-box-background); 23 | border: 1px solid var(--in-content-box-border-color); 24 | border-radius: var(--combined-element-border-radius); 25 | } 26 | 27 | .combined-element:focus-within { 28 | border-color: var(--in-content-focus-outline-color); 29 | outline: var(--combined-element-outline); 30 | } 31 | 32 | .select-button { 33 | background-color: var(--in-content-button-background); 34 | background-image: url("chrome://global/skin/icons/arrow-down.svg"); 35 | background-repeat: no-repeat; 36 | background-size: 8px; 37 | background-position: right 3px center; 38 | width: 14px; 39 | appearance: none; 40 | -moz-context-properties: fill; 41 | fill: currentcolor; 42 | } 43 | 44 | .select-button:hover { 45 | background-color: var(--in-content-button-background-hover); 46 | color: var(--in-content-button-text-color-hover); 47 | border-color: transparent; 48 | } 49 | 50 | .select-button:hover:active { 51 | background-color: var(--in-content-button-background-active); 52 | } 53 | 54 | .select-menupopup { 55 | padding-top: 1px; 56 | } 57 | 58 | .select-menupopup menuitem { 59 | padding-inline: 10px 0; 60 | 61 | /* for Waterfox 6.5.0 */ 62 | --menu-background-padding-default: 10px; 63 | --context-menu-mac-padding: 10px; 64 | } 65 | 66 | input[type="number"] { 67 | border: none; 68 | border-start-end-radius: 0; 69 | border-end-end-radius: 0; 70 | margin: 0; 71 | } 72 | 73 | input[type="number"]:focus { 74 | outline: none; 75 | } 76 | 77 | input[type="number"]::-moz-number-spin-box { 78 | border-inline-end: 1px solid var(--in-content-box-border-color); 79 | border-start-end-radius: 0; 80 | border-end-end-radius: 0; 81 | } 82 | -------------------------------------------------------------------------------- /addon/chrome/content/overlay/autoReload_properties.css: -------------------------------------------------------------------------------- 1 | /* custom properties for autoReload.xhtml */ 2 | 3 | :root { 4 | --in-content-box-background: rgb(255 255 255); 5 | --in-content-box-border-color: rgb(169 169 169); 6 | --in-content-focus-outline-color: rgb(10 132 255); 7 | --in-content-button-background: rgb(207 207 216 / 33%); 8 | --in-content-button-background-hover: rgb(229 241 251); 9 | --in-content-button-background-active: rgb(204 228 247); 10 | --in-content-button-text-color-hover: rgb(0 0 0); 11 | --combined-element-border-radius: 0; 12 | --combined-element-outline: none; 13 | } 14 | -------------------------------------------------------------------------------- /addon/chrome/content/overlay/renameTab.xhtml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | %miscDTD; 8 | ]> 9 | 10 | 13 | 14 |