├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ └── config.yml └── dependabot.yml ├── integrity └── firefox │ ├── 4.9.53 │ ├── info.json │ ├── cose.sig │ ├── mozilla.rsa │ └── mozilla-recommendation.json │ ├── 4.9.54 │ ├── info.json │ ├── cose.sig │ ├── mozilla.rsa │ └── mozilla-recommendation.json │ ├── 4.9.55 │ ├── info.json │ ├── cose.sig │ ├── mozilla.rsa │ └── mozilla-recommendation.json │ ├── 4.9.56 │ ├── info.json │ ├── cose.sig │ ├── mozilla.rsa │ └── mozilla-recommendation.json │ ├── 4.9.57 │ ├── info.json │ ├── cose.sig │ ├── mozilla.rsa │ └── mozilla-recommendation.json │ ├── 4.9.58 │ ├── info.json │ ├── cose.sig │ ├── mozilla.rsa │ └── mozilla-recommendation.json │ ├── 4.9.59 │ ├── info.json │ ├── cose.sig │ ├── mozilla.rsa │ └── mozilla-recommendation.json │ ├── 4.9.60 │ ├── info.json │ ├── cose.sig │ ├── mozilla.rsa │ └── mozilla-recommendation.json │ ├── 4.9.61 │ ├── info.json │ ├── cose.sig │ ├── mozilla.rsa │ └── mozilla-recommendation.json │ ├── 4.9.62 │ ├── info.json │ ├── cose.sig │ ├── mozilla.rsa │ └── mozilla-recommendation.json │ ├── 4.0.0 │ ├── info.json │ └── mozilla.rsa │ ├── 4.0.1 │ ├── info.json │ └── mozilla.rsa │ ├── 4.1.0 │ ├── info.json │ └── mozilla.rsa │ ├── 4.2.0 │ ├── info.json │ └── mozilla.rsa │ ├── 4.2.1 │ ├── info.json │ └── mozilla.rsa │ ├── 4.2.2 │ ├── info.json │ └── mozilla.rsa │ ├── 4.2.3 │ ├── info.json │ └── mozilla.rsa │ ├── 4.2.5 │ ├── info.json │ └── mozilla.rsa │ ├── 4.2.6 │ ├── info.json │ └── mozilla.rsa │ ├── 4.2.7 │ ├── info.json │ └── mozilla.rsa │ ├── 4.2.8 │ ├── info.json │ └── mozilla.rsa │ ├── 4.3.0 │ ├── info.json │ └── mozilla.rsa │ ├── 4.3.1 │ ├── info.json │ └── mozilla.rsa │ ├── 4.3.2 │ ├── info.json │ └── mozilla.rsa │ ├── 4.3.3 │ ├── info.json │ └── mozilla.rsa │ ├── 4.4.0 │ ├── info.json │ └── mozilla.rsa │ ├── 4.4.1 │ ├── info.json │ └── mozilla.rsa │ ├── 4.4.2 │ ├── info.json │ └── mozilla.rsa │ ├── 4.4.3 │ ├── info.json │ └── mozilla.rsa │ ├── 4.4.4 │ ├── info.json │ └── mozilla.rsa │ ├── 4.4.5 │ ├── info.json │ └── mozilla.rsa │ ├── 4.5.0 │ ├── info.json │ └── mozilla.rsa │ ├── 4.5.1 │ ├── info.json │ └── mozilla.rsa │ ├── 4.5.2 │ ├── info.json │ └── mozilla.rsa │ ├── 4.5.3 │ ├── info.json │ └── mozilla.rsa │ ├── 4.5.4 │ ├── info.json │ └── mozilla.rsa │ ├── 4.5.5 │ ├── info.json │ └── mozilla.rsa │ ├── 4.5.6 │ ├── info.json │ └── mozilla.rsa │ ├── 4.5.7 │ ├── info.json │ └── mozilla.rsa │ ├── 4.5.8 │ ├── info.json │ └── mozilla.rsa │ ├── 4.5.9 │ ├── info.json │ └── mozilla.rsa │ ├── 4.6.0 │ ├── info.json │ └── mozilla.rsa │ ├── 4.6.1 │ ├── info.json │ └── mozilla.rsa │ ├── 4.6.10 │ ├── info.json │ └── mozilla.rsa │ ├── 4.6.11 │ ├── info.json │ └── mozilla.rsa │ ├── 4.6.12 │ ├── info.json │ └── mozilla.rsa │ ├── 4.6.2 │ ├── info.json │ └── mozilla.rsa │ ├── 4.6.3 │ ├── info.json │ └── mozilla.rsa │ ├── 4.6.4 │ ├── info.json │ └── mozilla.rsa │ ├── 4.6.5 │ ├── info.json │ └── mozilla.rsa │ ├── 4.6.6 │ ├── info.json │ └── mozilla.rsa │ ├── 4.6.7 │ ├── info.json │ └── mozilla.rsa │ ├── 4.6.8 │ ├── info.json │ └── mozilla.rsa │ ├── 4.6.9 │ ├── info.json │ └── mozilla.rsa │ ├── 4.7.0 │ ├── info.json │ └── mozilla.rsa │ ├── 4.7.1 │ ├── info.json │ └── mozilla.rsa │ ├── 4.7.2 │ ├── info.json │ └── mozilla.rsa │ ├── 4.7.5 │ ├── info.json │ └── mozilla.rsa │ ├── 4.7.6 │ ├── info.json │ └── mozilla.rsa │ ├── 4.7.7 │ ├── info.json │ └── mozilla.rsa │ ├── 4.7.8 │ ├── info.json │ └── mozilla.rsa │ ├── 4.7.9 │ ├── info.json │ └── mozilla.rsa │ ├── 4.9.63 │ ├── info.json │ ├── cose.sig │ ├── mozilla.rsa │ └── mozilla-recommendation.json │ ├── 4.9.64 │ ├── info.json │ ├── cose.sig │ ├── mozilla.rsa │ └── mozilla-recommendation.json │ ├── 4.9.65 │ ├── info.json │ ├── cose.sig │ ├── mozilla.rsa │ └── mozilla-recommendation.json │ ├── 4.9.66 │ ├── info.json │ ├── cose.sig │ ├── mozilla.rsa │ └── mozilla-recommendation.json │ ├── 4.9.67 │ ├── info.json │ ├── cose.sig │ ├── mozilla.rsa │ └── mozilla-recommendation.json │ ├── 4.9.68 │ ├── info.json │ ├── cose.sig │ ├── mozilla.rsa │ └── mozilla-recommendation.json │ ├── 4.9.70 │ ├── info.json │ ├── cose.sig │ ├── mozilla.rsa │ └── mozilla-recommendation.json │ ├── .gitattributes │ ├── 4.7.10 │ ├── cose.sig │ ├── mozilla.rsa │ └── info.json │ ├── 4.7.11 │ ├── cose.sig │ ├── mozilla.rsa │ └── info.json │ ├── 4.7.12 │ ├── cose.sig │ ├── mozilla.rsa │ └── info.json │ ├── 4.7.13 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.7.14 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.7.16 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.7.17 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.8.0 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.8.1 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.8.10 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.8.2 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.8.3 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.8.4 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.8.5 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.8.6 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.8.7 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.8.8 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.8.9 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.0 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.12 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.13 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.14 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.15 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.16 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.17 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.18 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.19 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.2 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.20 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.21 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.22 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.23 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.24 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.25 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.26 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.27 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.29 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.3 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.30 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.31 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.32 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.33 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.34 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.35 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.36 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.39 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.4 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.40 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.41 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.42 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.43 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.44 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.45 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.46 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.47 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.48 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.5 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.50 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.51 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.52 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.6 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.7 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.73 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.74 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.75 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.76 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.77 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.78 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.8 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 4.9.9 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json │ ├── 3.5.3 │ ├── mozilla.rsa │ └── info.json │ ├── 3.5.4 │ ├── mozilla.rsa │ └── info.json │ └── 4.9.37.1 │ ├── cose.sig │ ├── mozilla.rsa │ ├── mozilla-recommendation.json │ └── info.json ├── tasks ├── package.json ├── check-exists.js ├── platform.js ├── clean.js └── paths.js ├── tests ├── package.json ├── browser │ ├── jest.config.firefox.mjs │ ├── jest.config.chrome-mv3.mjs │ ├── e2e │ │ ├── news.tests.ts │ │ └── export.tests.ts │ ├── tsconfig.json │ └── settings │ │ └── sitelist.tests.ts ├── inject │ ├── support │ │ ├── echo-client.ts │ │ ├── customize.ts │ │ ├── test-utils.ts │ │ └── polyfills.ts │ ├── karma.conf.cjs │ └── tsconfig.json ├── unit │ ├── csp │ │ └── csp.tests.ts │ ├── tsconfig.json │ └── jest.config.mjs └── support │ └── test-utils.ts ├── .npmignore ├── src ├── ui │ ├── stylesheet-editor │ │ ├── style.less │ │ └── index.tsx │ ├── popup │ │ ├── theme │ │ │ └── controls │ │ │ │ ├── format.ts │ │ │ │ ├── theme-control.tsx │ │ │ │ ├── use-font.tsx │ │ │ │ ├── text-stroke.tsx │ │ │ │ ├── immediate-modify.tsx │ │ │ │ ├── style-system-controls.tsx │ │ │ │ ├── theme-control.less │ │ │ │ ├── sepia.tsx │ │ │ │ ├── contrast.tsx │ │ │ │ ├── brightness.tsx │ │ │ │ ├── grayscale.tsx │ │ │ │ ├── scheme.tsx │ │ │ │ ├── text-color.tsx │ │ │ │ ├── background-color.tsx │ │ │ │ ├── color-scheme.tsx │ │ │ │ ├── reset-button.tsx │ │ │ │ ├── scrollbar.tsx │ │ │ │ ├── selection.tsx │ │ │ │ └── mode.less │ │ ├── utils │ │ │ ├── markdown.tsx │ │ │ └── issues.ts │ │ ├── components │ │ │ ├── site-toggle │ │ │ │ ├── checkmark-icon.tsx │ │ │ │ └── style.less │ │ │ ├── site-list-settings │ │ │ │ └── style.less │ │ │ ├── custom-settings-toggle │ │ │ │ └── style.less │ │ │ ├── font-settings │ │ │ │ └── style.less │ │ │ └── header │ │ │ │ └── more-new-highlight.tsx │ │ ├── main-page │ │ │ └── help.tsx │ │ └── page-viewer │ │ │ └── style.less │ ├── assets │ │ ├── fonts │ │ │ ├── OpenSans-Light.ttf │ │ │ ├── OpenSans-Regular.ttf │ │ │ └── OpenSans-SemiBold.ttf │ │ └── images │ │ │ └── darkreader-icon-256x256.png │ ├── devtools │ │ └── types.d.ts │ ├── options │ │ ├── about │ │ │ ├── about.less │ │ │ ├── version.tsx │ │ │ └── about-tab.tsx │ │ ├── advanced │ │ │ ├── advanced.less │ │ │ ├── sync-config.tsx │ │ │ ├── fetch-news.tsx │ │ │ ├── sync-settings.tsx │ │ │ ├── devtools.tsx │ │ │ └── enable-for-protected-pages.tsx │ │ ├── general │ │ │ ├── general-tab.tsx │ │ │ ├── enabled-for-pdf.tsx │ │ │ ├── change-browser-theme.tsx │ │ │ ├── detect-dark-theme.tsx │ │ │ └── enabled-by-default.tsx │ │ └── hotkeys │ │ │ └── hotkeys.less │ ├── icons │ │ ├── list-icon.tsx │ │ ├── system-icon.tsx │ │ ├── help-icon.tsx │ │ ├── index.tsx │ │ ├── delete-icon.tsx │ │ └── keyboard-icon.tsx │ └── controls │ │ ├── overlay │ │ └── style.less │ │ ├── tab-panel │ │ └── tab.tsx │ │ ├── nav-button │ │ ├── style.less │ │ └── index.tsx │ │ ├── time-range-picker │ │ └── style.less │ │ ├── button │ │ ├── index.tsx │ │ └── style.less │ │ ├── control-group │ │ ├── control-group.less │ │ └── control-group.tsx │ │ ├── reset-button │ │ ├── style.less │ │ └── index.tsx │ │ ├── color-dropdown │ │ └── style.less │ │ ├── textbox │ │ └── index.tsx │ │ ├── style.less │ │ ├── message-box │ │ └── style.less │ │ ├── shortcut │ │ └── style.less │ │ ├── checkbox │ │ └── index.tsx │ │ └── utils.ts ├── icons │ ├── dr_128.png │ ├── dr_16.png │ ├── dr_48.png │ ├── dr_active_19.png │ ├── dr_active_38.png │ ├── dr_inactive_19.png │ └── dr_inactive_38.png ├── api │ ├── tsconfig.json │ └── fetch.ts ├── stubs │ └── popup │ │ └── plus-body.tsx ├── utils │ ├── automation.ts │ ├── css-text │ │ └── css-text.ts │ ├── debounce.ts │ ├── cache.ts │ ├── uid.ts │ └── locales.ts ├── generators │ └── theme-engines.ts ├── manifest-thunderbird.json ├── background │ ├── utils │ │ ├── tab.ts │ │ └── sendLog.ts │ └── make-firefox-happy.ts ├── manifest-firefox.json ├── inject │ └── dynamic-theme │ │ └── watch │ │ └── index.ts └── tsconfig.json ├── .gitattributes ├── SECURITY.md └── .gitignore /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | open_collective: darkreader 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.53/info.json: -------------------------------------------------------------------------------- 1 | {"type":2} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.54/info.json: -------------------------------------------------------------------------------- 1 | {"type":2} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.55/info.json: -------------------------------------------------------------------------------- 1 | {"type":2} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.56/info.json: -------------------------------------------------------------------------------- 1 | {"type":2} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.57/info.json: -------------------------------------------------------------------------------- 1 | {"type":2} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.58/info.json: -------------------------------------------------------------------------------- 1 | {"type":2} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.59/info.json: -------------------------------------------------------------------------------- 1 | {"type":2} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.60/info.json: -------------------------------------------------------------------------------- 1 | {"type":2} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.61/info.json: -------------------------------------------------------------------------------- 1 | {"type":2} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.62/info.json: -------------------------------------------------------------------------------- 1 | {"type":2} 2 | -------------------------------------------------------------------------------- /tasks/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module" 3 | } 4 | -------------------------------------------------------------------------------- /tests/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module" 3 | } 4 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | * 2 | 3 | !darkreader.js 4 | !index.d.ts 5 | -------------------------------------------------------------------------------- /src/ui/stylesheet-editor/style.less: -------------------------------------------------------------------------------- 1 | @import "../devtools/style"; 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.0.0/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.0.1/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.1.0/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.2.0/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.2.1/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.2.2/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.2.3/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.2.5/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.2.6/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.2.7/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.2.8/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.3.0/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.3.1/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.3.2/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.3.3/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.4.0/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.4.1/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.4.2/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.4.3/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.4.4/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.4.5/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.5.0/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.5.1/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.5.2/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.5.3/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.5.4/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.5.5/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.5.6/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.5.7/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.5.8/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.5.9/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.6.0/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.6.1/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.6.10/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.6.11/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.6.12/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.6.2/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.6.3/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.6.4/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.6.5/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.6.6/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.6.7/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.6.8/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.6.9/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.7.0/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.7.1/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.7.2/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.7.5/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.7.6/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.7.7/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.7.8/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.7.9/info.json: -------------------------------------------------------------------------------- 1 | {"type":1,"manifest":{"indent":4}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.63/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"settings":1}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.64/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"settings":1}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.65/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"settings":1}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.66/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"settings":1}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.67/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"settings":1}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.68/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"settings":1}} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.70/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"settings":1}} 2 | -------------------------------------------------------------------------------- /src/icons/dr_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/src/icons/dr_128.png -------------------------------------------------------------------------------- /src/icons/dr_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/src/icons/dr_16.png -------------------------------------------------------------------------------- /src/icons/dr_48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/src/icons/dr_48.png -------------------------------------------------------------------------------- /src/icons/dr_active_19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/src/icons/dr_active_19.png -------------------------------------------------------------------------------- /src/icons/dr_active_38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/src/icons/dr_active_38.png -------------------------------------------------------------------------------- /src/icons/dr_inactive_19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/src/icons/dr_inactive_19.png -------------------------------------------------------------------------------- /src/icons/dr_inactive_38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/src/icons/dr_inactive_38.png -------------------------------------------------------------------------------- /integrity/firefox/.gitattributes: -------------------------------------------------------------------------------- 1 | cose.sig binary 2 | mozilla.rsa binary 3 | mozilla-recommendation.json binary 4 | -------------------------------------------------------------------------------- /integrity/firefox/4.7.10/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.10/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.7.11/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.11/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.7.12/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.12/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.7.13/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.13/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.7.14/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.14/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.7.16/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.16/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.7.17/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.17/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.8.0/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.0/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.8.1/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.1/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.8.10/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.10/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.8.2/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.2/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.8.3/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.3/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.8.4/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.4/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.8.5/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.5/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.8.6/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.6/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.8.7/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.7/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.8.8/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.8/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.8.9/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.9/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.0/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.0/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.12/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.12/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.13/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.13/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.14/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.14/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.15/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.15/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.16/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.16/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.17/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.17/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.18/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.18/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.19/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.19/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.2/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.2/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.20/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.20/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.21/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.21/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.22/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.22/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.23/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.23/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.24/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.24/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.25/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.25/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.26/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.26/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.27/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.27/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.29/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.29/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.3/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.3/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.30/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.30/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.31/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.31/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.32/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.32/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.33/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.33/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.34/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.34/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.35/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.35/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.36/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.36/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.39/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.39/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.4/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.4/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.40/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.40/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.41/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.41/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.42/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.42/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.43/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.43/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.44/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.44/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.45/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.45/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.46/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.46/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.47/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.47/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.48/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.48/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.5/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.5/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.50/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.50/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.51/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.51/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.52/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.52/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.53/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.53/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.54/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.54/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.55/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.55/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.56/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.56/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.57/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.57/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.58/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.58/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.59/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.59/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.6/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.6/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.60/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.60/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.61/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.61/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.62/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.62/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.63/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.63/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.64/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.64/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.65/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.65/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.66/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.66/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.67/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.67/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.68/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.68/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.7/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.7/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.70/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.70/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.73/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.73/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.74/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.74/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.75/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.75/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.76/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.76/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.77/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.77/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.78/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.78/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.8/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.8/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.9/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.9/cose.sig -------------------------------------------------------------------------------- /src/ui/popup/theme/controls/format.ts: -------------------------------------------------------------------------------- 1 | export function formatPercent(v: number): string { 2 | return `${v}%`; 3 | } 4 | -------------------------------------------------------------------------------- /integrity/firefox/3.5.3/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/3.5.3/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/3.5.4/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/3.5.4/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.0.0/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.0.0/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.0.1/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.0.1/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.1.0/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.1.0/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.2.0/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.2.0/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.2.1/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.2.1/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.2.2/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.2.2/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.2.3/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.2.3/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.2.5/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.2.5/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.2.6/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.2.6/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.2.7/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.2.7/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.2.8/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.2.8/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.3.0/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.3.0/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.3.1/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.3.1/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.3.2/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.3.2/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.3.3/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.3.3/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.4.0/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.4.0/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.4.1/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.4.1/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.4.2/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.4.2/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.4.3/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.4.3/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.4.4/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.4.4/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.4.5/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.4.5/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.5.0/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.5.0/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.5.1/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.5.1/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.5.2/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.5.2/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.5.3/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.5.3/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.5.4/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.5.4/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.5.5/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.5.5/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.5.6/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.5.6/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.5.7/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.5.7/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.5.8/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.5.8/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.5.9/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.5.9/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.6.0/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.6.0/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.6.1/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.6.1/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.6.10/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.6.10/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.6.11/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.6.11/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.6.12/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.6.12/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.6.2/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.6.2/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.6.3/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.6.3/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.6.4/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.6.4/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.6.5/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.6.5/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.6.6/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.6.6/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.6.7/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.6.7/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.6.8/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.6.8/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.6.9/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.6.9/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.7.0/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.0/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.7.1/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.1/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.7.10/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.10/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.7.11/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.11/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.7.12/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.12/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.7.13/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.13/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.7.14/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.14/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.7.16/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.16/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.7.17/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.17/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.7.2/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.2/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.7.5/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.5/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.7.6/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.6/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.7.7/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.7/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.7.8/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.8/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.7.9/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.7.9/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.8.0/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.0/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.8.1/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.1/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.8.10/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.10/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.8.2/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.2/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.8.3/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.3/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.8.4/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.4/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.8.5/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.5/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.8.6/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.6/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.8.7/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.7/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.8.8/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.8/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.8.9/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.8.9/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.0/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.0/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.12/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.12/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.13/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.13/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.14/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.14/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.15/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.15/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.16/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.16/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.17/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.17/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.18/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.18/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.19/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.19/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.2/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.2/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.20/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.20/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.21/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.21/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.22/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.22/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.23/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.23/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.24/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.24/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.25/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.25/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.26/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.26/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.27/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.27/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.29/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.29/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.3/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.3/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.30/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.30/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.31/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.31/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.32/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.32/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.33/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.33/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.34/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.34/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.35/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.35/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.36/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.36/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.37.1/cose.sig: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.37.1/cose.sig -------------------------------------------------------------------------------- /integrity/firefox/4.9.39/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.39/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.4/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.4/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.40/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.40/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.41/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.41/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.42/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.42/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.43/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.43/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.44/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.44/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.45/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.45/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.46/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.46/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.47/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.47/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.48/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.48/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.5/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.5/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.50/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.50/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.51/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.51/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.52/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.52/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.53/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.53/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.54/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.54/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.55/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.55/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.56/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.56/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.57/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.57/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.58/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.58/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.59/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.59/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.6/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.6/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.60/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.60/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.61/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.61/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.62/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.62/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.63/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.63/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.64/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.64/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.65/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.65/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.66/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.66/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.67/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.67/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.68/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.68/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.7/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.7/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.70/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.70/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.73/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.73/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.74/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.74/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.75/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.75/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.76/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.76/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.77/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.77/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.78/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.78/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.8/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.8/mozilla.rsa -------------------------------------------------------------------------------- /integrity/firefox/4.9.9/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.9/mozilla.rsa -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | 3 | *.* text eol=lf 4 | src/config/*.json text eol=crlf 5 | 6 | *.png binary 7 | *.ttf binary 8 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.37.1/mozilla.rsa: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/integrity/firefox/4.9.37.1/mozilla.rsa -------------------------------------------------------------------------------- /src/ui/assets/fonts/OpenSans-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/src/ui/assets/fonts/OpenSans-Light.ttf -------------------------------------------------------------------------------- /src/ui/assets/fonts/OpenSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/src/ui/assets/fonts/OpenSans-Regular.ttf -------------------------------------------------------------------------------- /src/ui/assets/fonts/OpenSans-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/src/ui/assets/fonts/OpenSans-SemiBold.ttf -------------------------------------------------------------------------------- /src/api/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "target": "ES2020" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/stubs/popup/plus-body.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | 3 | export function PlusBody(): Malevic.Child { 4 | return ; 5 | } 6 | -------------------------------------------------------------------------------- /src/ui/assets/images/darkreader-icon-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/0PandaDEV/darkreader/main/src/ui/assets/images/darkreader-icon-256x256.png -------------------------------------------------------------------------------- /src/utils/automation.ts: -------------------------------------------------------------------------------- 1 | export enum AutomationMode { 2 | NONE = '', 3 | TIME = 'time', 4 | SYSTEM = 'system', 5 | LOCATION = 'location' 6 | } 7 | -------------------------------------------------------------------------------- /src/ui/devtools/types.d.ts: -------------------------------------------------------------------------------- 1 | import type {DevToolsData, ExtWrapper} from '../../definitions'; 2 | 3 | export type DevtoolsProps = ExtWrapper & {devtools: DevToolsData}; 4 | -------------------------------------------------------------------------------- /integrity/firefox/3.5.3/info.json: -------------------------------------------------------------------------------- 1 | {"type":0,"manifest":{"indent":4},"order":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,23,24,17,18,19,20,21,22,25,26,27,28,29,30,31,32,33]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/3.5.4/info.json: -------------------------------------------------------------------------------- 1 | {"type":0,"manifest":{"indent":4},"order":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,23,24,17,18,19,20,21,22,25,26,27,28,29,30,31,32,33]} 2 | -------------------------------------------------------------------------------- /tests/browser/jest.config.firefox.mjs: -------------------------------------------------------------------------------- 1 | import config from './jest.config.mjs'; 2 | config.globals.product = 'firefox'; 3 | config.globals.__CHROMIUM_MV2__ = false; 4 | export default config; 5 | -------------------------------------------------------------------------------- /src/ui/options/about/about.less: -------------------------------------------------------------------------------- 1 | .about-tab { 2 | .darkreader-version { 3 | color: @color-control-fore; 4 | } 5 | 6 | a { 7 | color: @color-fore; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/generators/theme-engines.ts: -------------------------------------------------------------------------------- 1 | export enum ThemeEngine { 2 | cssFilter = 'cssFilter', 3 | svgFilter = 'svgFilter', 4 | staticTheme = 'staticTheme', 5 | dynamicTheme = 'dynamicTheme' 6 | } 7 | -------------------------------------------------------------------------------- /src/utils/css-text/css-text.ts: -------------------------------------------------------------------------------- 1 | const cssCommentsRegex = /\/\*[\s\S]*?\*\//g; 2 | 3 | export function removeCSSComments(cssText: string): string { 4 | return cssText.replace(cssCommentsRegex, ''); 5 | } 6 | -------------------------------------------------------------------------------- /integrity/firefox/4.7.13/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2024-07-09T13:08:57Z","not_before":"2019-07-10T07:08:57Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.7.14/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2024-07-22T14:54:14Z","not_before":"2019-07-23T08:54:14Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.7.16/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2024-08-14T14:56:15Z","not_before":"2019-08-15T08:56:15Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.7.17/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2024-08-25T02:36:46Z","not_before":"2019-08-25T20:36:46Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.8.0/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2024-09-11T18:16:23Z","not_before":"2019-09-12T12:16:23Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.8.1/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2024-09-15T15:11:19Z","not_before":"2019-09-16T09:11:19Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.8.10/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2025-03-04T22:36:01Z","not_before":"2020-03-04T16:36:01Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.8.2/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2024-10-21T17:12:11Z","not_before":"2019-10-22T11:12:11Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.8.3/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2024-10-24T14:58:35Z","not_before":"2019-10-25T08:58:35Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.8.4/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2024-10-31T15:49:20Z","not_before":"2019-11-01T09:49:20Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.8.5/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2024-11-24T19:44:11Z","not_before":"2019-11-25T13:44:11Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.8.6/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2024-12-04T23:04:18Z","not_before":"2019-12-05T17:04:18Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.8.7/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2025-01-15T19:12:33Z","not_before":"2020-01-16T13:12:33Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.8.8/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2025-02-03T18:30:57Z","not_before":"2020-02-04T12:30:57Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.8.9/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2025-02-05T19:01:46Z","not_before":"2020-02-06T13:01:46Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.0/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2025-03-16T23:31:25Z","not_before":"2020-03-16T17:31:25Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.12/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2025-06-29T16:45:15Z","not_before":"2020-06-29T10:45:15Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.13/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2025-06-29T22:52:23Z","not_before":"2020-06-29T16:52:23Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.14/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2025-07-06T19:15:59Z","not_before":"2020-07-06T13:15:59Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.15/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2025-07-10T16:32:08Z","not_before":"2020-07-10T10:32:08Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.16/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2025-07-28T15:01:11Z","not_before":"2020-07-28T09:01:11Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.17/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2025-09-02T17:16:20Z","not_before":"2020-09-02T11:16:20Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.18/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2025-09-04T18:31:22Z","not_before":"2020-09-04T12:31:22Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.19/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2025-09-08T12:53:23Z","not_before":"2020-09-08T06:53:23Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.2/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2025-03-18T17:38:06Z","not_before":"2020-03-18T11:38:06Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.3/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2025-03-26T00:46:31Z","not_before":"2020-03-25T18:46:31Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.4/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2025-03-30T20:30:30Z","not_before":"2020-03-30T14:30:30Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.5/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2025-04-22T19:26:02Z","not_before":"2020-04-22T13:26:02Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.6/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2025-04-23T20:43:48Z","not_before":"2020-04-23T14:43:48Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.7/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2025-04-28T11:42:03Z","not_before":"2020-04-28T05:42:03Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.8/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2025-05-04T20:46:28Z","not_before":"2020-05-04T14:46:28Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.9/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended"],"validity":{"not_after":"2025-05-25T23:27:12Z","not_before":"2020-05-25T17:27:12Z"},"schema_version":1} -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Questions 4 | url: https://github.com/darkreader/darkreader/discussions 5 | about: Ask a question about Dark Reader. 6 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.20/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2025-09-25T17:54:28Z","not_before":"2020-09-25T11:54:28Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.21/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2025-09-26T11:34:47Z","not_before":"2020-09-26T05:34:47Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.22/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2025-10-26T19:31:34Z","not_before":"2020-10-26T13:31:34Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.23/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2025-10-27T14:23:28Z","not_before":"2020-10-27T08:23:28Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.24/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2025-11-19T18:43:42Z","not_before":"2020-11-19T12:43:42Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.25/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2025-11-25T18:03:10Z","not_before":"2020-11-25T12:03:10Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.26/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2025-11-27T18:36:25Z","not_before":"2020-11-27T12:36:25Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.27/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2026-01-22T15:16:27Z","not_before":"2021-01-22T09:16:27Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.29/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2026-02-22T21:00:20Z","not_before":"2021-02-22T15:00:20Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.30/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2026-04-01T18:28:10Z","not_before":"2021-04-01T12:28:10Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.31/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2026-04-05T16:12:36Z","not_before":"2021-04-05T10:12:36Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.32/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2026-04-21T21:04:05Z","not_before":"2021-04-21T15:04:05Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.33/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2026-05-28T20:02:13Z","not_before":"2021-05-28T14:02:13Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.34/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2026-07-07T18:32:15Z","not_before":"2021-07-07T12:32:15Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.35/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2026-09-20T20:34:50Z","not_before":"2021-09-20T14:34:50Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.36/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2026-09-22T14:21:06Z","not_before":"2021-09-22T08:21:06Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.39/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2026-10-04T15:03:41Z","not_before":"2021-10-04T09:03:41Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.40/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2026-11-04T15:06:23Z","not_before":"2021-11-04T09:06:23Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.41/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2026-11-05T18:35:53Z","not_before":"2021-11-05T12:35:53Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.42/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2026-11-08T17:23:39Z","not_before":"2021-11-08T11:23:39Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.43/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2026-12-07T22:09:37Z","not_before":"2021-12-07T16:09:37Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.44/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2027-02-05T01:03:29Z","not_before":"2022-02-04T19:03:29Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.45/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2027-02-07T18:07:46Z","not_before":"2022-02-07T12:07:46Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.46/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2027-03-11T18:30:56Z","not_before":"2022-03-11T12:30:56Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.47/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2027-03-14T19:52:00Z","not_before":"2022-03-14T13:52:00Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.48/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2027-04-19T14:15:11Z","not_before":"2022-04-19T08:15:11Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.50/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2027-05-02T17:07:46Z","not_before":"2022-05-02T11:07:46Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.51/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2027-05-27T14:36:59Z","not_before":"2022-05-27T08:36:59Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.52/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2027-06-28T18:13:53Z","not_before":"2022-06-28T12:13:53Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.53/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2027-08-10T00:32:47Z","not_before":"2022-08-09T18:32:47Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.54/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2027-08-10T17:37:49Z","not_before":"2022-08-10T11:37:49Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.55/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2027-08-11T15:35:33Z","not_before":"2022-08-11T09:35:33Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.56/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2027-08-16T22:37:03Z","not_before":"2022-08-16T16:37:03Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.57/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2027-08-23T21:16:46Z","not_before":"2022-08-23T15:16:46Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.58/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2027-09-23T17:31:51Z","not_before":"2022-09-23T11:31:51Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.59/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2027-10-25T22:18:14Z","not_before":"2022-10-25T16:18:14Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.60/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2027-10-27T17:39:54Z","not_before":"2022-10-27T11:39:54Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.61/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2028-01-04T20:30:51Z","not_before":"2023-01-04T14:30:51Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.62/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2028-01-09T18:25:04Z","not_before":"2023-01-09T12:25:04Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.63/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2028-04-12T19:17:03Z","not_before":"2023-04-13T13:17:03Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.64/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2028-06-25T18:31:24Z","not_before":"2023-06-26T12:31:24Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.65/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2028-08-13T16:45:07Z","not_before":"2023-08-14T10:45:07Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.66/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2028-09-26T12:58:39Z","not_before":"2023-09-27T06:58:39Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.67/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2028-10-02T18:42:54Z","not_before":"2023-10-03T12:42:54Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.68/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2028-11-15T00:43:57Z","not_before":"2023-11-15T18:43:57Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.70/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2028-11-26T15:24:31Z","not_before":"2023-11-27T09:24:31Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.73/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2028-12-07T18:55:42Z","not_before":"2023-12-08T12:55:42Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.74/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2029-01-07T14:34:08Z","not_before":"2024-01-08T08:34:08Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.75/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2029-01-16T20:02:03Z","not_before":"2024-01-17T14:02:03Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.76/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended-android","recommended"],"validity":{"not_after":"2029-01-21T17:18:11Z","not_before":"2024-01-22T11:18:11Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.77/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2029-02-07T14:33:03Z","not_before":"2024-02-08T08:33:03Z"},"schema_version":1} -------------------------------------------------------------------------------- /integrity/firefox/4.9.78/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2029-03-05T14:23:39Z","not_before":"2024-03-05T08:23:39Z"},"schema_version":1} -------------------------------------------------------------------------------- /src/ui/popup/utils/markdown.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | 3 | export function compileMarkdown(markdown: string) { 4 | return markdown.split('**') 5 | .map((text, i) => i % 2 ? ({text}) : text); 6 | } 7 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.37.1/mozilla-recommendation.json: -------------------------------------------------------------------------------- 1 | {"addon_id":"addon@darkreader.org","states":["recommended","recommended-android"],"validity":{"not_after":"2026-09-24T14:23:32Z","not_before":"2021-09-24T08:23:32Z"},"schema_version":1} -------------------------------------------------------------------------------- /tests/browser/jest.config.chrome-mv3.mjs: -------------------------------------------------------------------------------- 1 | import config from './jest.config.mjs'; 2 | config.globals.product = 'chrome-mv3'; 3 | config.globals.__CHROMIUM_MV2__ = false; 4 | config.globals.__CHROMIUM_MV3__ = true; 5 | export default config; 6 | -------------------------------------------------------------------------------- /integrity/firefox/4.7.10/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[24,23,36,34,31,33,37,35,32,29,30,7,8,22,20,21,13,6,14,1,18,3,9,2,11,10,15,4,12,5,19,17,0,16,26,27,25,28,50,49,48,54,51,53,52,57,56,55,40,41,39,42,45,46,44,47,43,38]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.7.11/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[24,23,36,34,31,33,37,35,32,29,30,7,8,22,20,21,13,6,14,1,18,3,9,2,11,10,15,4,12,5,19,17,0,16,26,27,25,28,50,49,48,54,51,53,52,57,56,55,40,41,39,42,45,46,44,47,43,38]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.7.12/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[24,23,36,34,31,33,37,35,32,29,30,7,8,22,20,21,13,6,14,1,18,3,9,2,11,10,15,4,12,5,19,17,0,16,26,27,25,28,50,49,48,54,51,53,52,57,56,55,40,41,39,42,45,46,44,47,43,38]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.7.13/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[24,23,36,34,31,33,37,35,32,29,30,7,8,22,20,21,13,6,14,1,18,3,9,2,11,10,15,4,12,5,19,17,0,16,26,27,25,28,50,49,48,54,51,53,52,57,56,55,40,41,39,42,45,46,44,47,43,38]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.7.14/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[26,25,36,33,35,37,34,31,32,22,7,8,20,24,21,23,13,6,14,1,18,3,9,2,11,10,15,4,12,5,19,17,0,16,28,29,27,30,50,49,48,54,51,53,52,57,56,55,40,41,39,42,45,46,44,47,43,38]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.7.16/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[26,25,36,33,35,37,34,31,32,22,7,8,20,24,21,23,13,6,14,1,18,3,9,2,11,10,15,4,12,5,19,17,0,16,28,29,27,30,50,49,48,54,51,53,52,57,56,55,40,41,39,42,45,46,44,47,43,38]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.7.17/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[26,25,36,33,35,37,34,31,32,22,7,8,20,24,21,23,13,6,14,1,18,3,9,2,11,10,15,4,12,5,19,17,0,16,28,29,27,30,50,49,48,54,51,53,52,57,56,55,40,41,39,42,45,46,44,47,43,38]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.8.0/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[27,26,37,34,36,38,35,32,33,23,7,8,20,25,21,24,13,6,14,1,22,18,3,9,2,11,10,15,4,12,5,19,17,0,16,29,30,28,31,51,50,49,55,52,54,53,58,57,56,41,42,40,43,46,47,45,48,44,39]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.8.1/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[27,26,37,34,36,38,35,32,33,23,7,8,20,25,21,24,13,6,14,1,22,18,3,9,2,11,10,15,4,12,5,19,17,0,16,29,30,28,31,51,50,49,55,52,54,53,58,57,56,41,42,40,43,46,47,45,48,44,39]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.8.2/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[26,27,28,29,30,31,32,33,34,35,36,37,38,39,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,49,50,51,52,53,54,55,56,57,58,40,41,42,43,44,45,46,47,48]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.8.3/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[26,27,28,29,30,31,32,33,34,35,36,37,38,39,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,49,50,51,52,53,54,55,56,57,58,40,41,42,43,44,45,46,47,48]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.8.4/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[26,27,28,29,30,31,32,33,34,35,36,37,38,39,0,1,2,3,4,5,6,7,8,9,10,11,12,14,13,15,16,17,19,18,20,21,22,23,24,25,49,50,51,52,53,54,55,56,57,58,40,41,42,43,44,45,46,47,48]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.8.5/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[27,28,29,30,31,32,33,34,35,36,37,38,39,40,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,50,51,52,53,54,55,56,57,58,59,41,42,43,44,45,46,47,48,49]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.8.6/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[35,36,37,38,39,40,41,31,32,33,34,29,30,42,0,1,2,3,4,5,6,7,8,10,9,12,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,52,53,54,55,56,57,58,43,44,45,46,47,48,49,50,51,59,60,61]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.34/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"order":[37,38,39,40,35,36,41,42,43,44,45,46,47,48,49,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,59,60,61,62,63,64,65,66,67,68,50,51,52,53,54,55,56,57,58]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.35/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"order":[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,59,60,61,62,63,64,65,66,67,68,50,51,52,53,54,55,56,57,58]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.36/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"order":[37,38,39,40,35,36,41,42,43,44,45,46,47,48,49,0,1,2,3,4,5,6,7,8,9,10,12,11,13,15,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,59,60,61,62,63,64,65,66,67,68,50,51,52,53,54,55,56,57,58]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.37.1/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"order":[35,36,41,42,43,44,45,46,47,37,38,39,40,48,49,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,59,60,61,62,63,64,65,66,67,68,50,51,52,53,54,55,56,57,58]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.39/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"order":[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,0,1,2,3,4,5,7,8,6,9,10,11,12,13,15,16,14,17,18,20,19,21,22,23,24,26,25,27,28,29,31,30,32,33,34,59,60,61,62,63,64,65,66,67,68,54,55,56,57,58,50,51,52,53]} 2 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "github-actions" 4 | directory: "/" 5 | schedule: 6 | interval: "monthly" 7 | groups: 8 | github-actions: 9 | patterns: 10 | - "*" 11 | -------------------------------------------------------------------------------- /integrity/firefox/4.8.10/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[32,33,34,35,36,37,38,39,40,41,42,43,44,45,0,1,3,2,4,5,6,7,8,9,11,10,13,12,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,55,56,57,58,59,60,61,62,63,64,46,47,48,49,50,51,52,53,54]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.8.7/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[31,32,33,34,35,36,37,38,39,40,41,42,43,44,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,54,55,56,57,58,59,60,61,62,63,45,46,47,48,49,50,51,52,53]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.8.8/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[31,32,33,34,35,36,37,38,39,40,41,42,43,44,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,54,55,56,57,58,59,60,61,62,63,45,46,47,48,49,50,51,52,53]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.8.9/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[31,32,33,34,35,36,37,38,39,40,41,42,43,44,0,1,2,4,3,5,6,7,8,10,9,11,12,13,14,15,16,17,18,20,19,21,22,23,24,25,26,27,28,29,30,57,58,59,60,54,55,56,61,62,63,49,50,51,52,53,45,46,47,48]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.40/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"order":[37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,1,0,2,3,4,5,6,7,8,9,10,12,11,14,16,15,13,18,17,19,20,21,22,24,23,25,26,27,28,30,29,31,32,33,34,35,36,62,63,64,65,66,67,68,69,70,71,53,54,55,56,57,58,59,60,61]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.41/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"order":[37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,0,1,2,4,3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,62,63,64,69,70,71,65,66,67,68,53,54,55,56,57,58,59,60,61]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.42/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"order":[37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,0,1,2,3,4,5,6,8,7,9,11,12,10,13,14,16,17,15,18,19,21,20,22,24,23,25,26,27,29,28,31,30,32,33,35,34,36,62,63,64,69,70,71,65,66,67,68,53,54,55,56,57,58,59,60,61]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.43/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"order":[39,40,41,42,43,37,38,51,52,44,45,46,47,48,49,50,0,1,2,3,4,7,5,6,8,9,10,11,12,13,14,15,16,17,19,18,20,21,22,23,24,25,26,27,28,30,29,31,32,33,34,35,36,62,63,64,65,66,67,68,69,70,71,53,54,55,56,57,58,59,60,61]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.44/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"order":[37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,0,1,2,3,4,6,5,7,8,9,10,12,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,65,66,67,68,62,63,64,69,70,71,53,54,55,56,57,58,59,60,61]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.45/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"order":[37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,0,1,2,3,4,5,7,6,8,9,10,11,12,14,13,15,16,17,18,19,20,21,22,23,24,25,26,27,28,30,29,31,32,34,33,35,36,62,63,64,65,66,67,68,69,70,71,53,54,55,56,57,58,59,60,61]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.46/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"order":[39,40,41,42,43,37,38,44,45,46,47,48,49,50,51,52,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,30,29,31,32,33,34,35,36,62,63,64,65,66,67,68,69,70,71,53,54,55,56,57,58,59,60,61]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.47/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"order":[37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,0,1,2,4,5,6,3,7,9,10,8,11,13,12,14,16,17,18,15,20,19,21,23,22,25,27,26,24,30,28,29,31,32,34,35,33,36,62,63,64,65,66,67,68,53,54,55,56,57,58,59,60,61,69,70,71]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.48/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"order":[37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,0,1,2,4,3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,62,63,64,65,66,67,68,69,70,71,53,54,55,56,57,58,59,60,61]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.50/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"order":[37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,62,63,64,65,66,67,68,69,70,71,53,54,55,56,57,58,59,60,61]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.0/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[33,34,35,36,37,38,39,40,41,42,43,44,45,46,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,56,57,58,59,60,61,62,63,64,65,47,48,49,50,51,52,53,54,55]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.2/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[33,34,35,36,37,38,46,39,40,41,42,43,44,45,0,1,2,3,4,5,6,9,7,8,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,56,57,58,59,60,61,62,63,64,65,47,48,49,50,51,52,53,54,55]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.3/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[33,34,35,36,37,38,39,40,41,42,43,44,45,46,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,56,57,58,59,60,61,62,63,64,65,47,48,49,50,51,52,53,54,55]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.4/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[33,34,35,36,37,38,39,40,41,42,43,44,45,46,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,56,57,58,59,60,61,62,63,64,65,51,52,53,54,55,47,48,49,50]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.5/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[34,35,36,37,38,39,40,41,42,43,44,45,46,47,0,1,2,3,4,5,6,8,7,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,57,58,59,60,61,62,63,64,65,66,48,49,50,51,52,53,54,55,56]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.51/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"order":[39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,64,65,66,67,68,69,70,71,72,73,55,56,57,58,59,60,61,62,63]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.52/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"order":[39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,0,1,2,3,4,5,6,8,7,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,64,65,66,67,68,69,70,71,72,73,55,56,57,58,59,60,61,62,63]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.6/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[34,35,36,37,38,39,40,41,42,43,44,45,46,47,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,57,58,59,60,61,62,63,64,65,66,48,49,50,51,52,53,54,55,56]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.7/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[34,35,36,37,38,39,47,40,41,42,43,44,45,46,0,1,3,2,4,5,6,7,8,9,10,11,12,13,14,16,15,17,18,19,20,22,21,23,24,25,26,27,28,29,30,31,32,33,57,58,59,60,61,62,63,64,65,66,48,49,50,51,52,53,54,55,56]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.8/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[34,35,36,37,38,39,40,41,42,43,44,45,46,47,0,1,3,4,2,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,57,58,59,60,61,62,63,64,65,66,48,49,50,51,52,53,54,55,56]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.9/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[34,35,36,37,38,39,40,41,42,43,44,45,46,47,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,57,58,59,60,61,62,63,64,65,66,48,49,50,51,52,53,54,55,56]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.12/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[35,36,37,38,39,40,41,42,43,44,45,46,47,48,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,58,59,60,61,62,63,64,65,66,67,49,50,51,52,53,54,55,56,57]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.13/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[35,36,41,42,43,44,45,46,47,37,38,39,40,48,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,27,26,28,29,30,31,32,34,33,58,59,60,65,66,67,61,62,63,64,49,50,51,52,53,54,55,56,57]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.14/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[35,36,37,38,39,40,48,41,42,43,44,45,46,47,0,1,2,3,4,5,6,7,8,9,10,11,12,13,15,14,17,16,18,19,21,20,23,22,24,25,27,26,29,28,30,31,32,33,34,58,59,60,61,62,63,64,65,66,67,49,50,51,52,53,54,55,56,57]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.15/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[35,36,37,38,39,40,41,42,43,44,45,46,47,48,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,58,59,60,61,62,63,64,65,66,67,49,50,51,52,53,54,55,56,57]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.16/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[35,36,37,38,39,40,41,42,43,44,45,46,47,48,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,58,59,60,61,62,63,64,65,66,67,49,50,51,52,53,54,55,56,57]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.17/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,59,60,61,62,63,64,65,66,67,68,50,51,52,53,54,55,56,57,58]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.18/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,0,1,2,3,4,5,6,7,8,9,10,11,13,12,14,15,17,16,18,20,19,21,22,23,24,25,27,26,28,29,31,30,32,33,34,59,60,61,62,63,64,65,66,67,68,54,55,56,57,58,50,51,52,53]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.19/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,0,2,1,3,4,5,6,8,7,9,10,11,12,13,14,15,16,17,18,19,20,21,22,24,23,25,26,27,28,29,30,31,32,33,34,59,60,61,62,63,64,65,66,67,68,50,51,52,53,54,55,56,57,58]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.20/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,59,60,61,62,63,64,65,66,67,68,50,51,52,53,54,55,56,57,58]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.21/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,59,60,61,62,63,64,65,66,67,68,50,51,52,53,54,55,56,57,58]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.22/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,59,60,61,62,63,64,65,66,67,68,50,51,52,53,54,55,56,57,58]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.23/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,59,60,61,62,63,64,65,66,67,68,50,51,52,53,54,55,56,57,58]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.24/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,59,60,61,62,63,64,65,66,67,68,50,51,52,53,54,55,56,57,58]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.25/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,0,1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,14,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,59,60,61,66,67,68,62,63,64,65,50,51,52,53,54,55,56,57,58]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.26/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,59,60,61,62,63,64,65,66,67,68,50,51,52,53,54,55,56,57,58]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.27/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[37,38,39,40,35,36,41,42,43,44,45,46,47,48,49,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,59,60,61,62,63,64,65,66,67,68,50,51,52,53,54,55,56,57,58]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.29/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,59,60,61,62,63,64,65,66,67,68,50,51,52,53,54,55,56,57,58]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.30/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,59,60,61,62,63,64,65,66,67,68,50,51,52,53,54,55,56,57,58]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.31/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[35,36,41,42,43,44,45,46,47,37,38,39,40,48,49,0,1,2,3,4,5,6,7,9,8,11,10,12,14,15,13,16,17,18,19,20,21,22,24,25,23,26,27,29,28,31,30,32,33,34,59,60,61,62,63,64,65,66,67,68,50,51,52,53,54,55,56,57,58]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.32/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[37,38,39,40,35,36,41,42,43,44,45,46,47,48,49,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,59,60,61,62,63,64,65,66,67,68,50,51,52,53,54,55,56,57,58]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.33/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"indent":4},"order":[37,38,39,40,41,42,43,44,45,46,47,35,36,48,49,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,59,60,61,62,63,64,65,66,67,68,50,51,52,53,54,55,56,57,58]} 2 | -------------------------------------------------------------------------------- /src/ui/options/advanced/advanced.less: -------------------------------------------------------------------------------- 1 | .advanced { 2 | &__export-settings-button { 3 | box-sizing: border-box; 4 | width: 100%; 5 | } 6 | 7 | &__import-settings-button { 8 | box-sizing: border-box; 9 | width: 100%; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.73/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"settings":1},"order":[56,57,45,44,46,48,47,43,60,58,61,59,63,62,66,64,65,70,71,72,73,74,75,67,68,69,2,34,0,5,14,33,35,31,12,18,24,16,3,27,13,23,28,4,17,20,11,8,29,36,37,1,38,39,9,19,30,7,25,32,22,6,26,40,15,21,10,41,42,54,49,51,53,50,55,52]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.74/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"settings":1},"order":[56,57,45,44,46,48,47,43,60,58,61,59,63,62,66,64,65,73,74,75,76,77,78,67,68,69,70,71,72,2,34,0,5,14,33,35,31,12,18,24,16,3,27,13,23,28,4,17,20,11,8,29,36,37,1,38,39,9,19,30,7,25,32,22,6,26,40,15,21,10,41,42,54,49,51,53,50,55,52]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.75/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"settings":1},"order":[56,57,45,44,46,48,47,43,60,58,61,59,63,62,66,64,65,73,74,75,76,77,78,67,68,69,70,71,72,2,34,0,5,14,33,35,31,12,18,24,16,3,27,13,23,28,4,17,20,11,8,29,36,37,1,38,39,9,19,30,7,25,32,22,6,26,40,15,21,10,41,42,54,49,51,53,50,55,52]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.76/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"settings":1},"order":[56,57,45,44,46,48,47,43,60,58,61,59,63,62,66,64,65,73,74,75,76,77,78,67,68,69,70,71,72,2,34,0,5,14,33,35,31,12,18,24,16,3,27,13,23,28,4,17,20,11,8,29,36,37,1,38,39,9,19,30,7,25,32,22,6,26,40,15,21,10,41,42,54,49,51,53,50,55,52]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.77/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"settings":1},"order":[56,57,45,44,46,48,47,43,60,58,61,59,63,62,66,64,65,73,74,75,76,77,78,67,68,69,70,71,72,2,34,0,5,14,33,35,31,12,18,24,16,3,27,13,23,28,4,17,20,11,8,29,36,37,1,38,39,9,19,30,7,25,32,22,6,26,40,15,21,10,41,42,54,49,51,53,50,55,52]} 2 | -------------------------------------------------------------------------------- /integrity/firefox/4.9.78/info.json: -------------------------------------------------------------------------------- 1 | {"type":2,"manifest":{"settings":1},"order":[70,71,72,66,64,63,65,62,60,59,58,61,73,74,75,67,68,69,76,77,78,56,57,41,42,55,52,49,50,53,54,51,47,44,46,48,45,43,0,11,8,21,2,20,1,5,25,22,32,3,14,29,35,6,18,31,40,10,28,30,24,17,15,23,39,9,12,26,36,19,38,33,37,34,7,27,16,4,13]} 2 | -------------------------------------------------------------------------------- /src/ui/icons/list-icon.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | 3 | export function ListIcon(): Malevic.Child { 4 | return 5 | 6 | ; 7 | } 8 | -------------------------------------------------------------------------------- /src/ui/icons/system-icon.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | 3 | export function SystemIcon(): Malevic.Child { 4 | return ( 5 | 6 | 11 | 12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /tasks/check-exists.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | import {existsSync} from 'node:fs'; 3 | import {fileURLToPath} from 'node:url'; 4 | 5 | const __filename = fileURLToPath(import.meta.url); 6 | 7 | const lastArg = process.argv.pop(); 8 | if (lastArg === __filename) { 9 | throw new Error('Error: File or directory expected as a single argument'); 10 | } 11 | 12 | process.exit(existsSync(lastArg || '') ? 0 : 1); 13 | -------------------------------------------------------------------------------- /src/ui/popup/theme/controls/theme-control.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | 3 | export default function ThemeControl(props: {label: Malevic.Child}, controls: Malevic.Child[]) { 4 | return ( 5 | 6 | 9 | {controls} 10 | 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /tests/browser/e2e/news.tests.ts: -------------------------------------------------------------------------------- 1 | describe('News', () => { 2 | const newsSelector = 'div.news.news--expanded'; 3 | 4 | it('should display news', async () => { 5 | await backgroundUtils.setNews([{ 6 | id: 'some', 7 | date: '10', 8 | url: '/', 9 | headline: 'Test news', 10 | }]); 11 | 12 | popupUtils.exists(newsSelector); 13 | }); 14 | }); 15 | -------------------------------------------------------------------------------- /src/ui/options/about/version.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import {getLocalMessage} from '../../../utils/locales'; 3 | 4 | let appVersion: string; 5 | 6 | export function AppVersion(): Malevic.Child { 7 | if (!appVersion) { 8 | appVersion = chrome.runtime.getManifest().version; 9 | } 10 | return ( 11 | 12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /src/ui/controls/overlay/style.less: -------------------------------------------------------------------------------- 1 | @import "../../theme.less"; 2 | 3 | .overlay { 4 | align-items: center; 5 | background-color: fade(@color-back, 50%); 6 | flex-direction: column; 7 | display: inline-flex; 8 | height: 100%; 9 | justify-content: center; 10 | left: 0; 11 | position: fixed; 12 | top: 0; 13 | width: 100%; 14 | z-index: 2; 15 | 16 | &:empty { 17 | display: none; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /tests/inject/support/echo-client.ts: -------------------------------------------------------------------------------- 1 | export function getEchoURL(content: string, type = 'text/plain'): string { 2 | return `http://localhost:9966/echo?${new URLSearchParams({type, content})}`; 3 | } 4 | 5 | export function getCSSEchoURL(content: string): string { 6 | return getEchoURL(content, 'text/css'); 7 | } 8 | 9 | export function getJSEchoURL(script: string): string { 10 | return getEchoURL(script, 'application/javascript'); 11 | } 12 | -------------------------------------------------------------------------------- /src/ui/icons/help-icon.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | 3 | export function HelpIcon(): Malevic.Child { 4 | return ( 5 | 6 | 7 | 8 | ? 9 | 10 | 11 | ); 12 | } 13 | -------------------------------------------------------------------------------- /src/ui/controls/tab-panel/tab.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | 3 | interface TabProps { 4 | isActive: boolean; 5 | } 6 | 7 | export default function Tab({isActive}: TabProps, ...children: Malevic.Child[]) { 8 | const tabCls = { 9 | 'tab-panel__tab': true, 10 | 'tab-panel__tab--active': isActive, 11 | }; 12 | 13 | return ( 14 |
15 | {children} 16 |
17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /tasks/platform.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | export const PLATFORM = { 4 | API: /** @type {const} */('api'), 5 | CHROMIUM_MV2: /** @type {const} */('chrome'), 6 | CHROMIUM_MV2_PLUS: /** @type {const} */('chrome-plus'), 7 | CHROMIUM_MV3: /** @type {const} */('chrome-mv3'), 8 | FIREFOX_MV2: /** @type {const} */('firefox'), 9 | FIREFOX_MV3: /** @type {const} */('firefox-mv3'), 10 | THUNDERBIRD: /** @type {const} */('thunderbird'), 11 | }; 12 | -------------------------------------------------------------------------------- /src/manifest-thunderbird.json: -------------------------------------------------------------------------------- 1 | { 2 | "applications": { 3 | "gecko": { 4 | "id": "addon@darkreader.org", 5 | "strict_min_version": "78.0a1" 6 | } 7 | }, 8 | "background": { 9 | "page": "background/index.html" 10 | }, 11 | "permissions": [ 12 | "alarms", 13 | "storage", 14 | "tabs", 15 | "theme", 16 | "messagesModify", 17 | "" 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /src/ui/controls/nav-button/style.less: -------------------------------------------------------------------------------- 1 | @import "../../theme.less"; 2 | 3 | .nav-button { 4 | background-image: @icon-right; 5 | background-position: center right 0.25rem; 6 | background-repeat: no-repeat; 7 | background-size: 1rem; 8 | width: calc(100% - 2 * @size-border); 9 | 10 | &__content { 11 | align-items: center; 12 | display: inline-flex; 13 | flex-direction: row; 14 | height: 100%; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/ui/popup/components/site-toggle/checkmark-icon.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | 3 | export default function CheckmarkIcon({isChecked}: {isChecked: boolean}) { 4 | return ( 5 | 6 | 11 | 12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /src/utils/debounce.ts: -------------------------------------------------------------------------------- 1 | type AnyFn = (...args: any[]) => void; 2 | 3 | export function debounce(delay: number, fn: F): F { 4 | let timeoutId: ReturnType | null = null; 5 | return ((...args: any[]) => { 6 | if (timeoutId) { 7 | clearTimeout(timeoutId); 8 | } 9 | timeoutId = setTimeout(() => { 10 | timeoutId = null; 11 | fn(...args); 12 | }, delay); 13 | }) as F; 14 | } 15 | -------------------------------------------------------------------------------- /tests/inject/support/customize.ts: -------------------------------------------------------------------------------- 1 | (() => { 2 | if (window.top === window.self) { 3 | return; 4 | } 5 | const topDoc = window.top.document; 6 | const style = topDoc.createElement('style'); 7 | style.textContent = [ 8 | 'body { background-color: #222222; color: #dddddd; }', 9 | '#banner { background-color: #226644; }', 10 | '.executing { background-color: #662233; }', 11 | ].join('\n'); 12 | topDoc.head.append(style); 13 | })(); 14 | -------------------------------------------------------------------------------- /src/background/utils/tab.ts: -------------------------------------------------------------------------------- 1 | import {isOpera} from '../../utils/platform'; 2 | 3 | // On Thunderbird, sometimes sender.tab is undefined but accessing it will throw a very nice error. 4 | // On Vivaldi, sometimes sender.tab is undefined as well, but error is not very helpful. 5 | // On Opera, sender.tab.index === -1. 6 | export function isPanel(sender: chrome.runtime.MessageSender): boolean { 7 | return typeof sender === 'undefined' || typeof sender.tab === 'undefined' || (isOpera && sender.tab.index === -1); 8 | } 9 | -------------------------------------------------------------------------------- /src/ui/controls/time-range-picker/style.less: -------------------------------------------------------------------------------- 1 | @import "../../theme"; 2 | 3 | .time-range-picker { 4 | display: inline-flex; 5 | flex: auto; 6 | 7 | &__input { 8 | text-align: center; 9 | text-indent: 0; 10 | width: 100%; 11 | background-color: @color-input-back; 12 | } 13 | 14 | &__input--start { 15 | border-right: none; 16 | } 17 | 18 | &__input--end { 19 | border-left: @size-border-inner solid @color-border; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/ui/popup/components/site-list-settings/style.less: -------------------------------------------------------------------------------- 1 | @import "../../../theme"; 2 | 3 | .site-list-settings { 4 | align-items: stretch; 5 | display: flex; 6 | flex-direction: column; 7 | min-height: 0; 8 | width: 100%; 9 | 10 | &__toggle { 11 | border-bottom: none; 12 | flex: none; 13 | } 14 | 15 | &__shortcut { 16 | flex: none; 17 | white-space: nowrap; 18 | } 19 | 20 | &__text-list { 21 | flex: initial; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/ui/controls/button/index.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import {mergeClass, omitAttrs} from '../utils'; 3 | 4 | export default function Button(props: Malevic.NodeAttrs, ...children: Malevic.Child[]) { 5 | const cls = mergeClass('button', props.class); 6 | const attrs = omitAttrs(['class'], props); 7 | 8 | return ( 9 | 14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /src/utils/cache.ts: -------------------------------------------------------------------------------- 1 | export function cachedFactory(factory: (key: K) => V, size: number): (key: K) => V { 2 | const cache = new Map(); 3 | 4 | return (key: K) => { 5 | if (cache.has(key)) { 6 | return cache.get(key)!; 7 | } 8 | const value = factory(key); 9 | cache.set(key, value); 10 | if (cache.size > size) { 11 | const first = cache.keys().next().value; 12 | cache.delete(first); 13 | } 14 | return value; 15 | }; 16 | } 17 | -------------------------------------------------------------------------------- /src/manifest-firefox.json: -------------------------------------------------------------------------------- 1 | { 2 | "browser_specific_settings": { 3 | "gecko": { 4 | "id": "addon@darkreader.org", 5 | "strict_min_version": "78.0" 6 | }, 7 | "gecko_android": {} 8 | }, 9 | "background": { 10 | "page": "background/index.html" 11 | }, 12 | "permissions": [ 13 | "alarms", 14 | "contextMenus", 15 | "storage", 16 | "tabs", 17 | "theme", 18 | "" 19 | ], 20 | "optional_permissions": [] 21 | } 22 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | Any security vulnerability discovered in Dark Reader will be fixed as soon as possible with as minimal impact as possible when reported. 4 | 5 | Please ensure you are always running the [latest version available](https://github.com/darkreader/darkreader/releases). 6 | 7 | Some web browser extension stores may have an older version currently published. 8 | 9 | ## Security Vulnerability Report 10 | 11 | If you have discovered a security vulnerability, please email us at immediately. 12 | -------------------------------------------------------------------------------- /src/ui/controls/control-group/control-group.less: -------------------------------------------------------------------------------- 1 | @import "../../theme.less"; 2 | 3 | .control-group { 4 | align-items: stretch; 5 | display: inline-flex; 6 | flex-direction: column; 7 | width: 100%; 8 | 9 | &__control { 10 | height: 2 * @size-border + @size-control-inner; 11 | } 12 | 13 | &__description { 14 | font-size: @size-text-small; 15 | line-height: @size-text-small-height; 16 | text-align: center; 17 | -moz-user-select: none; 18 | user-select: none; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /tests/unit/csp/csp.tests.ts: -------------------------------------------------------------------------------- 1 | import {readFile} from 'node:fs/promises'; 2 | import {join} from 'node:path'; 3 | import {prepareCSPMV3} from '../../../src/utils/csp'; 4 | 5 | describe('Check that CSP matches expected one', () => { 6 | it('CSP should match', async () => { 7 | const file = join(__dirname, '../../../src/manifest-chrome-mv3.json'); 8 | const manifest: chrome.runtime.Manifest = JSON.parse(await readFile(file, {encoding: 'utf-8'})); 9 | expect(manifest.content_security_policy).toEqual(prepareCSPMV3()); 10 | }); 11 | }); 12 | -------------------------------------------------------------------------------- /src/ui/popup/components/site-toggle/style.less: -------------------------------------------------------------------------------- 1 | @import "../../../theme"; 2 | 3 | .site-toggle { 4 | color: @color-input-fore; 5 | white-space: normal; 6 | 7 | &--disabled { 8 | opacity: 0.5; 9 | pointer-events: none; 10 | } 11 | 12 | &__mark { 13 | svg { 14 | fill: currentColor; 15 | height: @size-text-normal; 16 | vertical-align: bottom; 17 | width: @size-text-normal; 18 | } 19 | } 20 | 21 | &--active { 22 | color: @color-input-fore-active; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/ui/controls/nav-button/index.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import Button from '../button'; 3 | 4 | interface NavButtonProps { 5 | class?: any; 6 | onClick: () => void; 7 | } 8 | 9 | export default function ResetButton(props: NavButtonProps, ...content: Malevic.Child[]) { 10 | return ( 11 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /src/ui/controls/reset-button/style.less: -------------------------------------------------------------------------------- 1 | @import "../../theme.less"; 2 | 3 | .reset-button { 4 | width: calc(100% - 2 * @size-border); 5 | 6 | &__content { 7 | align-items: center; 8 | display: inline-flex; 9 | flex-direction: row; 10 | height: 100%; 11 | } 12 | 13 | &__icon { 14 | background-image: @icon-reset; 15 | background-position: 0 0; 16 | background-size: 1rem; 17 | display: inline-block; 18 | height: 1rem; 19 | margin-right: 0.125rem; 20 | width: 1rem; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/ui/controls/color-dropdown/style.less: -------------------------------------------------------------------------------- 1 | @color-dropdown-height: 1.5rem; 2 | @color-dropdown-item-height: 1.25rem; 3 | @color-dropdown-item-active-height: 1.5rem; 4 | 5 | .color-dropdown { 6 | height: @color-dropdown-height; 7 | position: relative; 8 | width: 100%; 9 | 10 | &__options { 11 | width: 100%; 12 | } 13 | 14 | &__picker { 15 | height: 100%; 16 | position: absolute; 17 | right: 0; 18 | top: 0; 19 | width: 100%; 20 | 21 | &--hidden { 22 | display: none; 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/ui/controls/reset-button/index.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import Button from '../button'; 3 | 4 | interface ResetButtonProps { 5 | onClick: () => void; 6 | } 7 | 8 | export default function ResetButton(props: ResetButtonProps, ...content: Malevic.Child[]) { 9 | return ( 10 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /tests/browser/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2019", 4 | "module": "CommonJS", 5 | "lib": [ 6 | "ES2015", 7 | "Dom" 8 | ], 9 | "types": [ 10 | "chrome", 11 | "jest", 12 | "puppeteer-core" 13 | ], 14 | "allowJs": true, 15 | "downlevelIteration": true, 16 | "esModuleInterop": true, 17 | "jsx": "react", 18 | "jsxFactory": "m", 19 | "moduleResolution": "Node", 20 | "noEmit": true, 21 | "noImplicitAny": true, 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/ui/popup/theme/controls/use-font.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import {DropDown} from '../../../controls'; 3 | import ThemeControl from './theme-control'; 4 | 5 | export default function UseFont(props: {value: boolean; onChange: (value: boolean) => void}) { 6 | const options = [{id: true, content: 'Yes'}, {id: false, content: 'No'}]; 7 | return ( 8 | 9 | 14 | 15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /tasks/clean.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | import {getDestDir} from './paths.js'; 3 | import {PLATFORM} from './platform.js'; 4 | import {createTask} from './task.js'; 5 | import {removeFolder} from './utils.js'; 6 | 7 | async function clean({platforms, debug}) { 8 | const enabledPlatforms = Object.values(PLATFORM).filter((platform) => platform !== PLATFORM.API && platforms[platform]); 9 | for (const platform of enabledPlatforms) { 10 | await removeFolder(getDestDir({debug, platform})); 11 | } 12 | } 13 | 14 | const cleanTask = createTask( 15 | 'clean', 16 | clean, 17 | ); 18 | 19 | export default cleanTask; 20 | -------------------------------------------------------------------------------- /src/ui/popup/theme/controls/text-stroke.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import {Slider} from '../../../controls'; 3 | import ThemeControl from './theme-control'; 4 | 5 | export default function TextStroke(props: {value: number; onChange: (v: number) => void}) { 6 | return ( 7 | 8 | 16 | 17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /tests/browser/e2e/export.tests.ts: -------------------------------------------------------------------------------- 1 | import {timeout} from '../../support/test-utils'; 2 | 3 | describe('Export settings', () => { 4 | // TODO: remove flakes and remove this line 5 | jest.retryTimes(10, {logErrorsBeforeRetry: true}); 6 | 7 | it('Should download file', async () => { 8 | await timeout(1000); 9 | const p = new Promise<{ok: boolean}>((resolve) => backgroundUtils.onDownload(resolve)); 10 | await popupUtils.saveFile('example', 'content'); 11 | expect((await p).ok).toBe(true); 12 | if (product === 'firefox') { 13 | await timeout(1000); 14 | } 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /src/ui/icons/index.tsx: -------------------------------------------------------------------------------- 1 | import {AdvancedIcon} from './advanced-icon'; 2 | import {DeleteIcon} from './delete-icon'; 3 | import {HelpIcon} from './help-icon'; 4 | import {KeyboardIcon} from './keyboard-icon'; 5 | import {ListIcon} from './list-icon'; 6 | import {SettingsIcon} from './settings-icon'; 7 | import {SunMoonIcon} from './sun-moon-icon'; 8 | import {SystemIcon} from './system-icon'; 9 | import {WatchIcon} from './watch-icon'; 10 | 11 | export { 12 | AdvancedIcon, 13 | DeleteIcon, 14 | HelpIcon, 15 | KeyboardIcon, 16 | ListIcon, 17 | SettingsIcon, 18 | SunMoonIcon, 19 | SystemIcon, 20 | WatchIcon, 21 | }; 22 | -------------------------------------------------------------------------------- /src/ui/popup/theme/controls/immediate-modify.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import {DropDown} from '../../../controls'; 3 | import ThemeControl from './theme-control'; 4 | 5 | export default function ImmediateModify(props: {value: boolean; onChange: (value: boolean) => void}) { 6 | const options = [{id: true, content: 'Yes'}, {id: false, content: 'No'}]; 7 | return ( 8 | 9 | 14 | 15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /src/utils/uid.ts: -------------------------------------------------------------------------------- 1 | function hexify(number: number): string { 2 | return ((number < 16 ? '0' : '') + number.toString(16)); 3 | } 4 | 5 | export function generateUID(): string { 6 | if ('randomUUID' in crypto) { 7 | const uuid = crypto.randomUUID(); 8 | return uuid.substring(0, 8) + uuid.substring(9, 13) + uuid.substring(14, 18) + uuid.substring(19, 23) + uuid.substring(24); 9 | } 10 | 11 | if ('getRandomValues' in crypto) { 12 | return Array.from((crypto as Crypto).getRandomValues(new Uint8Array(16))).map((x) => hexify(x)).join(''); 13 | } 14 | 15 | return Math.floor(Math.random() * 2 ** 55).toString(36); 16 | } 17 | -------------------------------------------------------------------------------- /src/ui/popup/theme/controls/style-system-controls.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import {DropDown} from '../../../controls'; 3 | import ThemeControl from './theme-control'; 4 | 5 | export default function StyleSystemControls(props: {value: boolean; onChange: (value: boolean) => void}) { 6 | const options = [{id: true, content: 'Yes'}, {id: false, content: 'No'}]; 7 | return ( 8 | 9 | 14 | 15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /tests/unit/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "compilerOptions": { 4 | "target": "ESNext", 5 | "module": "CommonJS", 6 | "lib": [ 7 | "ESNext", 8 | "Dom" 9 | ], 10 | "types": [ 11 | "chrome", 12 | "node", 13 | "jest", 14 | "jest-extended" 15 | ], 16 | "esModuleInterop": true, 17 | "skipLibCheck": true, 18 | "forceConsistentCasingInFileNames": true, 19 | "noImplicitAny": true, 20 | "strictNullChecks": true, 21 | "inlineSourceMap": true 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /tests/support/test-utils.ts: -------------------------------------------------------------------------------- 1 | import {dirname, join} from 'node:path'; 2 | 3 | export const rootDir: string = dirname(require.resolve('../../package.json')); 4 | 5 | export function rootPath(...paths: string[]): string { 6 | return join(rootDir, ...paths); 7 | } 8 | 9 | export function multiline(...lines: string[]): string { 10 | if (lines.length < 1) { 11 | return '\n'; 12 | } 13 | if (lines[lines.length - 1] !== '') { 14 | lines.push(''); 15 | } 16 | return lines.join('\n'); 17 | } 18 | 19 | export function timeout(delay: number): Promise { 20 | return new Promise((resolve) => setTimeout(resolve, delay)); 21 | } 22 | -------------------------------------------------------------------------------- /src/ui/controls/textbox/index.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import {mergeClass, omitAttrs} from '../utils'; 3 | 4 | interface TextBoxProps extends Malevic.NodeAttrs { 5 | type?: 'text' | 'time'; 6 | oninput?: (e: Event & {target: HTMLInputElement}) => void; 7 | onchange?: (e: Event & {target: HTMLInputElement}) => void; 8 | } 9 | 10 | export default function TextBox(props: TextBoxProps) { 11 | const cls = mergeClass('textbox', props.class); 12 | const attrs = omitAttrs(['class', 'type'], props); 13 | const type = props.type || 'text'; 14 | 15 | return ( 16 | 17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /tests/inject/support/test-utils.ts: -------------------------------------------------------------------------------- 1 | // Loaded with HTML/DOM only 2 | 3 | export function multiline(...lines: string[]): string { 4 | if (lines.length < 1) { 5 | return '\n'; 6 | } 7 | if (lines[lines.length - 1] !== '') { 8 | lines.push(''); 9 | } 10 | return lines.join('\n'); 11 | } 12 | 13 | export function timeout(delay: number): Promise { 14 | return new Promise((resolve) => setTimeout(resolve, delay)); 15 | } 16 | 17 | export function waitForEvent(eventName: string): Promise { 18 | return new Promise((resolve) => { 19 | document.addEventListener(eventName, () => resolve(), {once: true}); 20 | }); 21 | } 22 | -------------------------------------------------------------------------------- /src/utils/locales.ts: -------------------------------------------------------------------------------- 1 | export function getLocalMessage(messageName: string): string { 2 | return chrome.i18n.getMessage(messageName) || messageName; 3 | } 4 | 5 | export function getUILanguage(): string { 6 | let code: string; 7 | if ('i18n' in chrome && 'getUILanguage' in chrome.i18n && typeof chrome.i18n.getUILanguage === 'function') { 8 | code = chrome.i18n.getUILanguage(); 9 | } else { 10 | // Background service workers do not have access to "foreground" APIs like chrome.i18n 11 | code = navigator.language.split('-')[0]; 12 | } 13 | if (code.endsWith('-mac')) { 14 | return code.substring(0, code.length - 4); 15 | } 16 | return code; 17 | } 18 | -------------------------------------------------------------------------------- /tests/inject/support/polyfills.ts: -------------------------------------------------------------------------------- 1 | if (!window.hasOwnProperty('chrome')) { 2 | window.chrome = {} as any; 3 | } 4 | if (!chrome.hasOwnProperty('runtime')) { 5 | chrome.runtime = {} as any; 6 | } 7 | if (!chrome.runtime.hasOwnProperty('onMessage')) { 8 | type AnyFunction = () => void; 9 | const listeners = new Set(); 10 | chrome.runtime.onMessage = { 11 | addListener: (listener: AnyFunction) => { 12 | listeners.add(listener); 13 | }, 14 | removeListener: (listener: AnyFunction) => { 15 | listeners.delete(listener); 16 | }, 17 | } as any; 18 | (chrome.runtime.onMessage as any)['__listeners__'] = listeners; 19 | } 20 | -------------------------------------------------------------------------------- /src/ui/icons/delete-icon.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | 3 | export function DeleteIcon(): Malevic.Child { 4 | return ( 5 | 6 | 7 | 8 | 9 | ); 10 | } 11 | -------------------------------------------------------------------------------- /src/ui/popup/theme/controls/theme-control.less: -------------------------------------------------------------------------------- 1 | .theme-control { 2 | align-items: center; 3 | display: flex; 4 | flex-direction: row; 5 | justify-content: center; 6 | min-height: @size-control-inner; 7 | width: 100%; 8 | 9 | &__label { 10 | font-size: @size-text-normal; 11 | line-height: @size-text-normal; 12 | text-align: left; 13 | -moz-user-select: none; 14 | user-select: none; 15 | width: 50%; 16 | } 17 | } 18 | 19 | .export-theme-button { 20 | background-color: @color-control-active; 21 | border: none; 22 | height: 1.25rem; 23 | margin-bottom: 0.25rem; 24 | margin-top: 0.625rem; 25 | width: 100%; 26 | } 27 | -------------------------------------------------------------------------------- /src/ui/popup/main-page/help.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import {HELP_URL} from '../../../utils/links'; 3 | import {getLocalMessage} from '../../../utils/locales'; 4 | import {ControlGroup} from '../../controls'; 5 | 6 | export default function HelpGroup() { 7 | return ( 8 | 9 | 10 | 11 | 12 | {getLocalMessage('help')} 13 | 14 | 15 | 16 | 17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /src/ui/options/advanced/sync-config.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import type {ViewProps} from '../../../definitions'; 3 | import {CheckButton} from '../../controls'; 4 | 5 | export function SyncConfig(props: ViewProps): Malevic.Child { 6 | function syncConfig(syncSitesFixes: boolean) { 7 | props.actions.changeSettings({syncSitesFixes}); 8 | props.actions.loadConfig({local: !syncSitesFixes}); 9 | } 10 | 11 | return ( 12 | 17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /src/ui/popup/theme/controls/sepia.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import {getLocalMessage} from '../../../../utils/locales'; 3 | import {Slider} from '../../../controls'; 4 | import {formatPercent} from './format'; 5 | import ThemeControl from './theme-control'; 6 | 7 | export default function Sepia(props: {value: number; onChange: (v: number) => void}) { 8 | return ( 9 | 10 | 18 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /src/ui/controls/style.less: -------------------------------------------------------------------------------- 1 | @import "./button/style"; 2 | @import "./check-button/check-button"; 3 | @import "./checkbox/style"; 4 | @import "./control-group/control-group"; 5 | @import "./dropdown/style"; 6 | @import "./message-box/style"; 7 | @import "./multi-switch/style"; 8 | @import "./overlay/style"; 9 | @import "./shortcut/style"; 10 | @import "./tab-panel/style"; 11 | @import "./select/style"; 12 | @import "./slider/style"; 13 | @import "./text-list/style"; 14 | @import "./textbox/style"; 15 | @import "./time-range-picker/style"; 16 | @import "./toggle/style"; 17 | @import "./updown/style"; 18 | 19 | @import "./color-picker/style"; 20 | @import "./color-dropdown/style"; 21 | @import "./nav-button/style"; 22 | @import "./reset-button/style"; 23 | 24 | -------------------------------------------------------------------------------- /src/inject/dynamic-theme/watch/index.ts: -------------------------------------------------------------------------------- 1 | import type {StyleElement} from '../style-manager'; 2 | import {stopWatchingForStylePositions, watchForStylePositions} from './style-position'; 3 | 4 | interface ChangedStyles { 5 | created: StyleElement[]; 6 | updated: StyleElement[]; 7 | removed: StyleElement[]; 8 | moved: StyleElement[]; 9 | } 10 | 11 | export function watchForStyleChanges( 12 | currentStyles: StyleElement[], 13 | update: (styles: ChangedStyles) => void, 14 | shadowRootDiscovered: (root: ShadowRoot) => void 15 | ): void { 16 | watchForStylePositions(currentStyles, update, shadowRootDiscovered); 17 | } 18 | 19 | export function stopWatchingForStyleChanges(): void { 20 | stopWatchingForStylePositions(); 21 | } 22 | -------------------------------------------------------------------------------- /src/ui/options/general/general-tab.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import type {ViewProps} from '../../../definitions'; 3 | import {isFirefox} from '../../../utils/platform'; 4 | import {ChangeBrowserTheme} from './change-browser-theme'; 5 | import {DetectDarkTheme} from './detect-dark-theme'; 6 | import {EnabledByDefault} from './enabled-by-default'; 7 | import {EnableForPDF} from './enabled-for-pdf'; 8 | 9 | export function GeneralTab(props: ViewProps): Malevic.Child { 10 | return
11 | 12 | 13 | {isFirefox ? null : } 14 | {isFirefox ? : null} 15 |
; 16 | } 17 | -------------------------------------------------------------------------------- /src/ui/popup/theme/controls/contrast.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import {getLocalMessage} from '../../../../utils/locales'; 3 | import {Slider} from '../../../controls'; 4 | import {formatPercent} from './format'; 5 | import ThemeControl from './theme-control'; 6 | 7 | export default function Contrast(props: {value: number; onChange: (v: number) => void}) { 8 | return ( 9 | 10 | 18 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /src/ui/popup/theme/controls/brightness.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import {getLocalMessage} from '../../../../utils/locales'; 3 | import {Slider} from '../../../controls'; 4 | import {formatPercent} from './format'; 5 | import ThemeControl from './theme-control'; 6 | 7 | export default function Brightness(props: {value: number; onChange: (v: number) => void}) { 8 | return ( 9 | 10 | 18 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /src/ui/popup/theme/controls/grayscale.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import {getLocalMessage} from '../../../../utils/locales'; 3 | import {Slider} from '../../../controls'; 4 | import {formatPercent} from './format'; 5 | import ThemeControl from './theme-control'; 6 | 7 | export default function Grayscale(props: {value: number; onChange: (v: number) => void}) { 8 | return ( 9 | 10 | 18 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /src/ui/popup/theme/controls/scheme.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import {getLocalMessage} from '../../../../utils/locales'; 3 | import {DropDown} from '../../../controls'; 4 | import ThemeControl from './theme-control'; 5 | 6 | export default function Scheme(props: {isDark: boolean; onChange: (dark: boolean) => void}) { 7 | return ( 8 | 9 | 17 | 18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /tests/inject/karma.conf.cjs: -------------------------------------------------------------------------------- 1 | /** 2 | * This file is necessary because Karma does not support configutation 3 | * via ES modules. This file is a CommonJS module which wraps a regular 4 | * ES module. 5 | */ 6 | 7 | 'use strict'; 8 | 9 | const realConfigureKarma = import('./karma.conf.js'); 10 | 11 | async function configureKarma(config, env) { 12 | return ((await realConfigureKarma).configureKarma)(config, env); 13 | } 14 | 15 | /** 16 | * @param {LocalConfig} config 17 | * @returns {void} 18 | */ 19 | module.exports = async (config) => 20 | config.set(await configureKarma(config, process.env)); 21 | 22 | if (process.env.NODE_ENV === 'test') { 23 | module.exports.configureKarma = async (config, env) => configureKarma(config, env); 24 | } 25 | -------------------------------------------------------------------------------- /src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2019", 4 | "baseUrl": "./", 5 | "module": "ES2015", 6 | "moduleResolution": "node", 7 | "lib": [ 8 | "ES2022", 9 | "Dom", 10 | "DOM.Iterable" 11 | ], 12 | "types": [ 13 | "chrome" 14 | ], 15 | "allowJs": true, 16 | "downlevelIteration": true, 17 | "noImplicitAny": true, 18 | "noUnusedLocals": true, 19 | "resolveJsonModule": true, 20 | "strictNullChecks": true, 21 | "jsx": "react", 22 | "jsxFactory": "m", 23 | "noEmit": true, 24 | "paths": { 25 | "@plus/*": ["./stubs/*"] 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/ui/options/advanced/fetch-news.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import type {ViewProps} from '../../../definitions'; 3 | import {CheckButton} from '../../controls'; 4 | 5 | export function FetchNews(props: ViewProps): Malevic.Child { 6 | function onFetchNewsChange(checked: boolean) { 7 | props.actions.changeSettings({fetchNews: checked}); 8 | } 9 | 10 | return ( 11 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /src/ui/options/general/enabled-for-pdf.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import type {ViewProps} from '../../../definitions'; 3 | import {CheckButton} from '../../controls'; 4 | 5 | export function EnableForPDF(props: ViewProps): Malevic.Child { 6 | function onInvertPDFChange(checked: boolean) { 7 | props.actions.changeSettings({enableForPDF: checked}); 8 | } 9 | 10 | return ( 11 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /tasks/paths.js: -------------------------------------------------------------------------------- 1 | import {dirname, join} from 'node:path'; 2 | import {createRequire} from 'node:module'; 3 | 4 | let rootDir = dirname(createRequire(import.meta.url).resolve('../package.json')); 5 | 6 | /** 7 | * @param {string} path 8 | * @returns {string} 9 | */ 10 | export const absolutePath = (path) => { 11 | return join(rootDir, path); 12 | }; 13 | 14 | /** 15 | * @param {string} dir 16 | */ 17 | export function setRootDir(dir) { 18 | rootDir = dir; 19 | } 20 | 21 | export function getDestDir({debug, platform}) { 22 | const buildTypeDir = `build/${debug ? 'debug' : 'release'}`; 23 | return `${buildTypeDir}/${platform}`; 24 | } 25 | 26 | export default { 27 | getDestDir, 28 | rootDir, 29 | absolutePath, 30 | setRootDir, 31 | }; 32 | -------------------------------------------------------------------------------- /src/ui/options/advanced/sync-settings.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import type {ViewProps} from '../../../definitions'; 3 | import {CheckButton} from '../../controls'; 4 | 5 | export function SyncSettings(props: ViewProps): Malevic.Child { 6 | function onSyncSettingsChange(checked: boolean) { 7 | props.actions.changeSettings({syncSettings: checked}); 8 | } 9 | 10 | return ( 11 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /src/ui/stylesheet-editor/index.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import {sync} from 'malevic/dom'; 3 | import Body from './components/body'; 4 | import Connector from '../connect/connector'; 5 | import type {ExtensionActions, ExtensionData} from '../../definitions'; 6 | 7 | function renderBody(data: ExtensionData, actions: ExtensionActions) { 8 | sync(document.body, ); 9 | } 10 | 11 | async function start() { 12 | const connector = new Connector(); 13 | window.addEventListener('unload', () => connector.disconnect(), {passive: true}); 14 | 15 | const data = await connector.getData(); 16 | renderBody(data, connector); 17 | connector.subscribeToChanges((data) => renderBody(data, connector)); 18 | } 19 | 20 | start(); 21 | -------------------------------------------------------------------------------- /src/ui/icons/keyboard-icon.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | 3 | export function KeyboardIcon(): Malevic.Child { 4 | return ( 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /src/ui/popup/theme/controls/text-color.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import {ColorPicker} from '../../../controls'; 3 | import ThemeControl from './theme-control'; 4 | 5 | type TextColorValue = 'auto' | string; 6 | 7 | interface TextColorEditorProps { 8 | value: TextColorValue; 9 | onChange: (value: TextColorValue) => void; 10 | canReset: boolean; 11 | onReset: () => void; 12 | } 13 | 14 | export default function TextColorEditor(props: TextColorEditorProps) { 15 | return ( 16 | 17 | 23 | 24 | ); 25 | } 26 | -------------------------------------------------------------------------------- /src/ui/controls/message-box/style.less: -------------------------------------------------------------------------------- 1 | @import "../../theme.less"; 2 | 3 | .message-box { 4 | background-color: @color-back; 5 | border-bottom: @size-border solid @color-border; 6 | border-top: @size-border solid @color-border; 7 | display: flex; 8 | flex-direction: column; 9 | padding: @indent-large; 10 | 11 | &__caption { 12 | text-align: center; 13 | } 14 | 15 | &__buttons { 16 | display: flex; 17 | flex-direction: row; 18 | justify-content: center; 19 | margin-top: @indent-small; 20 | } 21 | 22 | &__button { 23 | min-width: 4rem; 24 | 25 | &:not(:first-child) { 26 | margin-left: @indent-small; 27 | } 28 | } 29 | 30 | &__button-ok { 31 | border-color: gray; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/ui/options/general/change-browser-theme.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import type {ViewProps} from '../../../definitions'; 3 | import {CheckButton} from '../../controls'; 4 | 5 | export function ChangeBrowserTheme(props: ViewProps): Malevic.Child { 6 | function onBrowserThemeChange(checked: boolean) { 7 | props.actions.changeSettings({changeBrowserTheme: checked}); 8 | } 9 | 10 | return ( 11 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /src/ui/options/general/detect-dark-theme.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import type {ViewProps} from '../../../definitions'; 3 | import {CheckButton} from '../../controls'; 4 | 5 | export function DetectDarkTheme(props: ViewProps): Malevic.Child { 6 | function onDetectDarkThemeChange(checked: boolean) { 7 | props.actions.changeSettings({detectDarkTheme: checked}); 8 | } 9 | 10 | return ( 11 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /src/ui/options/general/enabled-by-default.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import type {ViewProps} from '../../../definitions'; 3 | import {CheckButton} from '../../controls'; 4 | 5 | export function EnabledByDefault(props: ViewProps): Malevic.Child { 6 | function onEnabledByDefaultChange(checked: boolean) { 7 | props.actions.changeSettings({enabledByDefault: checked}); 8 | } 9 | 10 | return ( 11 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /src/ui/popup/theme/controls/background-color.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import {ColorPicker} from '../../../controls'; 3 | import ThemeControl from './theme-control'; 4 | 5 | type BgColorValue = 'auto' | string; 6 | 7 | interface BgColorEditorProps { 8 | value: BgColorValue; 9 | onChange: (value: BgColorValue) => void; 10 | canReset: boolean; 11 | onReset: () => void; 12 | } 13 | 14 | export default function BackgroundColorEditor(props: BgColorEditorProps) { 15 | return ( 16 | 17 | 23 | 24 | ); 25 | } 26 | -------------------------------------------------------------------------------- /src/background/make-firefox-happy.ts: -------------------------------------------------------------------------------- 1 | import {MessageTypeCStoBG} from '../utils/message'; 2 | import type {MessageCStoBG, MessageUItoBG} from '../definitions'; 3 | import {isFirefox} from '../utils/platform'; 4 | 5 | // This function exists to prevent Firefox Sidebars from appearing broken 6 | // If the message does not have a proper sender, it aborts Dark Reader instance in that context 7 | export function makeFirefoxHappy(message: MessageUItoBG | MessageCStoBG, sender: chrome.runtime.MessageSender, sendResponse: (response: 'unsupportedSender') => void): boolean { 8 | if (isFirefox && (sender as any).envType === 'content_child' && sender.tab === undefined && message.type === MessageTypeCStoBG.DOCUMENT_CONNECT) { 9 | sendResponse('unsupportedSender'); 10 | return true; 11 | } 12 | return false; 13 | } 14 | -------------------------------------------------------------------------------- /src/ui/popup/page-viewer/style.less: -------------------------------------------------------------------------------- 1 | @import "../../theme.less"; 2 | 3 | .page-viewer { 4 | height: 100%; 5 | position: relative; 6 | } 7 | 8 | .page { 9 | align-items: stretch; 10 | background-color: @color-back; 11 | display: none; 12 | flex-direction: column; 13 | height: 100%; 14 | justify-content: stretch; 15 | left: 0; 16 | position: absolute; 17 | top: 0; 18 | width: 100%; 19 | 20 | &--active { 21 | display: flex; 22 | } 23 | 24 | &__back-button { 25 | background-image: @icon-left; 26 | background-position: center left 0.25rem; 27 | background-repeat: no-repeat; 28 | background-size: 1rem; 29 | flex: none; 30 | margin-top: @indent-small; 31 | width: calc(100% - 2 * @size-border); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/ui/options/hotkeys/hotkeys.less: -------------------------------------------------------------------------------- 1 | .hotkeys { 2 | &__control { 3 | align-items: center; 4 | border: @size-border solid @color-border; 5 | display: inline-flex; 6 | flex-direction: row; 7 | font-size: @size-text-normal; 8 | height: @size-control-inner; 9 | justify-content: center; 10 | text-decoration: none; 11 | transition: background-color @time-fast; 12 | width: calc(100% - 2 * @size-border); 13 | 14 | &.shortcut--set { 15 | color: @color-control-fore; 16 | } 17 | 18 | &:hover { 19 | background-color: @color-control-hover; 20 | text-decoration: none; 21 | 22 | &:not(.shortcut--edit)::before { 23 | display: none; 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/ui/popup/theme/controls/color-scheme.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import {DropDown} from '../../../controls'; 3 | import ThemeControl from './theme-control'; 4 | 5 | interface ColorSchemeDropDownProps { 6 | selected: string; 7 | values: Array<{id: string; content: string}>; 8 | onChange: (value: string) => void; 9 | } 10 | 11 | export default function ColorSchemeDropDown(props: ColorSchemeDropDownProps) { 12 | function onColorSchemeChange(value: string) { 13 | props.onChange(value); 14 | } 15 | 16 | return ( 17 | 18 | 23 | 24 | ); 25 | } 26 | -------------------------------------------------------------------------------- /src/ui/popup/utils/issues.ts: -------------------------------------------------------------------------------- 1 | declare const __THUNDERBIRD__: boolean; 2 | 3 | export function fixNotClosingPopupOnNavigation(): void { 4 | // This event listener must not be passive since it calls e.preventDefault() 5 | document.addEventListener('click', (e) => { 6 | if (e.defaultPrevented || e.button === 2) { 7 | return; 8 | } 9 | let target = e.target as HTMLElement; 10 | while (target && !(target instanceof HTMLAnchorElement)) { 11 | target = target.parentElement!; 12 | } 13 | if (target && target.hasAttribute('href')) { 14 | chrome.tabs.create({url: target.getAttribute('href')!}); 15 | e.preventDefault(); 16 | if (!__THUNDERBIRD__) { 17 | window.close(); 18 | } 19 | } 20 | }); 21 | } 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Build files 2 | #----------------------------------- 3 | build/ 4 | darkreader.js 5 | debug.log 6 | src/plus 7 | 8 | # Node.js modules 9 | #----------------------------------- 10 | node_modules/ 11 | 12 | # Test results 13 | #----------------------------------- 14 | test-results-*.json 15 | 16 | # Code coverage reports 17 | #----------------------------------- 18 | tests/coverage/ 19 | tests/browser/coverage/ 20 | tests/inject/coverage/ 21 | coverage/ 22 | 23 | # IDE and editor configs 24 | #----------------------------------- 25 | .idea/ 26 | .vscode/ 27 | .log/ 28 | *.code-workspace 29 | 30 | # Cache files 31 | #----------------------------------- 32 | .eslintcache 33 | 34 | # V8 Profiler logs 35 | #----------------------------------- 36 | isolate-*-v8.log 37 | 38 | # Deno 39 | #----------------------------------- 40 | deno.lock 41 | deno.json 42 | -------------------------------------------------------------------------------- /src/ui/options/advanced/devtools.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import {getLocalMessage} from '../../../utils/locales'; 3 | import {openExtensionPage} from '../../utils'; 4 | import {ControlGroup, NavButton} from '../../controls'; 5 | 6 | async function openDevTools() { 7 | await openExtensionPage('devtools'); 8 | } 9 | 10 | export function DevTools(): Malevic.Child { 11 | return ( 12 | 13 | 14 | 15 | 🛠 {getLocalMessage('open_dev_tools')} 16 | 17 | 18 | 19 | Make a fix for a website 20 | 21 | 22 | ); 23 | } 24 | -------------------------------------------------------------------------------- /tests/unit/jest.config.mjs: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | import {dirname} from 'node:path'; 4 | import {createRequire} from 'node:module'; 5 | const rootDir = dirname(createRequire(import.meta.url).resolve('../../package.json')); 6 | 7 | /** @type {import('@jest/types').Config.InitialOptions} */ 8 | const config = { 9 | rootDir, 10 | testMatch: ['/tests/unit/**/*.tests.ts'], 11 | moduleFileExtensions: ['ts', 'tsx', 'js'], 12 | transform: {'^.+\\.ts(x?)$': ['ts-jest', {tsconfig: '/tests/unit/tsconfig.json'}]}, 13 | globals: { 14 | __FIREFOX_MV2__: false, 15 | __CHROMIUM_MV2__: false, 16 | __CHROMIUM_MV3__: false, 17 | __THUNDERBIRD__: false, 18 | __DEBUG__: false, 19 | __TEST__: true, 20 | }, 21 | setupFilesAfterEnv: ['jest-extended/all'], 22 | }; 23 | 24 | export default config; 25 | -------------------------------------------------------------------------------- /src/ui/options/about/about-tab.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import {DONATE_URL, PRIVACY_URL, getHelpURL} from '../../../utils/links'; 3 | import {getLocalMessage} from '../../../utils/locales'; 4 | import {AppVersion} from './version'; 5 | 6 | export function AboutTab(): Malevic.Child { 7 | return ; 21 | } 22 | -------------------------------------------------------------------------------- /src/ui/popup/theme/controls/reset-button.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import {DEFAULT_SETTINGS} from '../../../../defaults'; 3 | import type {ViewProps} from '../../../../definitions'; 4 | import {ControlGroup, ResetButton} from '../../../controls'; 5 | 6 | export default function ResetButtonGroup(props: ViewProps) { 7 | function reset() { 8 | props.actions.setTheme(DEFAULT_SETTINGS.theme); 9 | } 10 | 11 | return ( 12 | 13 | 14 | 15 | Reset to defaults 16 | 17 | 18 | 19 | Restore current theme values to defaults 20 | 21 | 22 | ); 23 | } 24 | -------------------------------------------------------------------------------- /src/ui/options/advanced/enable-for-protected-pages.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import type {ViewProps} from '../../../definitions'; 3 | import {CheckButton} from '../../controls'; 4 | 5 | export function EnableForProtectedPages(props: ViewProps): Malevic.Child { 6 | function onEnableForProtectedPages(value: boolean) { 7 | props.actions.changeSettings({enableForProtectedPages: value}); 8 | } 9 | 10 | return ( 11 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /tests/inject/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "compilerOptions": { 4 | "target": "ES2019", 5 | "module": "ES2015", 6 | "lib": [ 7 | "ES2022", 8 | "DOM", 9 | "DOM.Iterable" 10 | ], 11 | "types": [ 12 | "chrome", 13 | "jasmine" 14 | ], 15 | "allowJs": true, 16 | "downlevelIteration": true, 17 | "esModuleInterop": true, 18 | "jsx": "react", 19 | "jsxFactory": "m", 20 | "moduleResolution": "Node", 21 | "noEmit": true, 22 | "noImplicitAny": true, 23 | "removeComments": false, 24 | "sourceMap": true, 25 | "inlineSources": true, 26 | "noEmitOnError": true 27 | }, 28 | "exclude": [ 29 | "./coverage" 30 | ] 31 | } 32 | -------------------------------------------------------------------------------- /src/ui/controls/shortcut/style.less: -------------------------------------------------------------------------------- 1 | @import "../../theme"; 2 | 3 | .shortcut { 4 | color: @color-fore; 5 | cursor: pointer; 6 | display: inline-block; 7 | font-size: @size-text-small; 8 | line-height: @size-text-small-height; 9 | outline: none; 10 | text-align: center; 11 | text-decoration: none; 12 | white-space: pre; 13 | 14 | &:hover { 15 | text-decoration: underline; 16 | } 17 | 18 | &--edit { 19 | color: @color-input-fore-active; 20 | } 21 | 22 | &::before { 23 | content: "✎"; 24 | direction: rtl; 25 | display: inline-block; 26 | line-height: @size-text-small-height; 27 | visibility: hidden; 28 | width: 0; 29 | } 30 | 31 | &:hover, 32 | &--edit { 33 | &::before { 34 | visibility: visible; 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/ui/popup/theme/controls/scrollbar.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import ThemeControl from './theme-control'; 3 | import {ColorDropDown} from '../../../controls'; 4 | 5 | type ScrollbarColorValue = '' | 'auto' | string; 6 | 7 | interface ScrollbarEditorProps { 8 | value: ScrollbarColorValue; 9 | onChange: (value: ScrollbarColorValue) => void; 10 | onReset: () => void; 11 | } 12 | 13 | export default function ScrollbarEditor(props: ScrollbarEditorProps) { 14 | return ( 15 | 16 | 24 | 25 | ); 26 | } 27 | -------------------------------------------------------------------------------- /src/ui/popup/theme/controls/selection.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import ThemeControl from './theme-control'; 3 | import {ColorDropDown} from '../../../controls'; 4 | 5 | type SelectionColorValue = '' | 'auto' | string; 6 | 7 | interface SelectionEditorProps { 8 | value: SelectionColorValue; 9 | onChange: (value: SelectionColorValue) => void; 10 | onReset: () => void; 11 | } 12 | 13 | export default function SelectionColorEditor(props: SelectionEditorProps) { 14 | return ( 15 | 16 | 24 | 25 | ); 26 | } 27 | -------------------------------------------------------------------------------- /src/ui/popup/theme/controls/mode.less: -------------------------------------------------------------------------------- 1 | @import "../../../theme"; 2 | 3 | .static-edit-button { 4 | background-color: @color-heading; 5 | border-radius: @size-text-small-height / 2; 6 | color: @color-control-fore; 7 | cursor: pointer; 8 | font-size: @size-text-small; 9 | line-height: @size-text-small-height; 10 | left: 0.25rem; 11 | min-width: @size-text-small-height; 12 | position: absolute; 13 | text-align: center; 14 | top: 0.25rem; 15 | 16 | &--hidden { 17 | display: none; 18 | } 19 | 20 | &::before { 21 | content: "\270E"; 22 | line-height: @size-text-small-height; 23 | } 24 | 25 | &:hover { 26 | box-shadow: 0 0 @indent-large @color-control-fore; 27 | } 28 | } 29 | 30 | .mode-control-container { 31 | height: @size-control-inner; 32 | position: relative; 33 | width: 100% 34 | } 35 | -------------------------------------------------------------------------------- /src/ui/popup/components/custom-settings-toggle/style.less: -------------------------------------------------------------------------------- 1 | @import "../../../theme"; 2 | 3 | .custom-settings-toggle { 4 | color: @color-fore; 5 | white-space: normal; 6 | 7 | &--checked, 8 | &:active, 9 | &--checked:hover { 10 | background-color: @color-control-active; 11 | color: mix(@color-fore, @color-control-fore, 80%); 12 | transition: background-color @time-fast, color @time-fast; 13 | } 14 | 15 | &--disabled { 16 | opacity: 0.5; 17 | pointer-events: none; 18 | } 19 | 20 | &__url { 21 | color: @color-control-fore; 22 | -moz-user-select: none; 23 | user-select: none; 24 | } 25 | 26 | .button__wrapper { 27 | align-items: center; 28 | display: inline-flex; 29 | justify-content: center; 30 | min-width: @popup-content-width - 2 * @size-border; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/ui/popup/components/font-settings/style.less: -------------------------------------------------------------------------------- 1 | @import "../../../theme"; 2 | 3 | .font-settings { 4 | display: flex; 5 | flex-direction: column; 6 | width: 100%; 7 | 8 | &__font-select-container { 9 | display: flex; 10 | flex-direction: column; 11 | 12 | &__line { 13 | display: flex; 14 | flex-direction: row; 15 | 16 | > :not(:first-child) { 17 | margin-left: @indent-small; 18 | } 19 | 20 | .select { 21 | flex: auto; 22 | } 23 | } 24 | 25 | &__label { 26 | font-size: @size-text-small; 27 | line-height: @size-text-small-height; 28 | text-align: center; 29 | white-space: nowrap; 30 | } 31 | } 32 | 33 | > :not(:first-child) { 34 | margin-top: @indent-small; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/ui/controls/checkbox/index.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | import {mergeClass, omitAttrs} from '../utils'; 3 | 4 | export default function CheckBox(props: Malevic.NodeAttrs, ...children: Malevic.Child[]) { 5 | const cls = mergeClass('checkbox', props.class); 6 | const attrs = omitAttrs(['class', 'checked', 'onchange'], props); 7 | const check = (domNode: HTMLInputElement) => domNode.checked = Boolean(props.checked); 8 | 9 | return ( 10 | 21 | ); 22 | } 23 | -------------------------------------------------------------------------------- /src/ui/controls/control-group/control-group.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | 3 | function ControlGroup( 4 | props: {class?: string}, 5 | control: Malevic.Spec, 6 | description: Malevic.Spec, 7 | ) { 8 | return ( 9 | 10 | {control} 11 | {description} 12 | 13 | ); 14 | } 15 | 16 | function Control(props: {class?: string}, ...content: Malevic.Child[]) { 17 | return ( 18 | 19 | {...content} 20 | 21 | ); 22 | } 23 | 24 | function Description(props: {class?: string}, ...content: Malevic.Child[]) { 25 | return ( 26 | 27 | {...content} 28 | 29 | ); 30 | } 31 | 32 | export default Object.assign(ControlGroup, {Control, Description}); 33 | -------------------------------------------------------------------------------- /src/ui/controls/button/style.less: -------------------------------------------------------------------------------- 1 | @import "../../theme"; 2 | 3 | .button { 4 | background-color: @color-control-back; 5 | border: @size-border solid @color-border; 6 | box-sizing: content-box; 7 | color: @color-control-fore; 8 | cursor: pointer; 9 | display: inline-block; 10 | height: @size-control-inner; 11 | line-height: @size-text-normal; 12 | min-width: @size-control-inner; 13 | outline: none; 14 | overflow: hidden; 15 | padding: 0; 16 | text-align: center; 17 | transition: background-color @time-slow; 18 | -moz-user-select: none; 19 | user-select: none; 20 | 21 | &:hover { 22 | background-color: @color-control-hover; 23 | transition: background-color @time-fast; 24 | } 25 | 26 | &:active { 27 | background-color: @color-control-active; 28 | } 29 | 30 | &__wrapper { 31 | height: 100%; 32 | width: 100%; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/api/fetch.ts: -------------------------------------------------------------------------------- 1 | const throwCORSError = async (url: string) => { 2 | return Promise.reject(new Error( 3 | [ 4 | 'Embedded Dark Reader cannot access a cross-origin resource', 5 | url, 6 | 'Overview your URLs and CORS policies or use', 7 | '`DarkReader.setFetchMethod(fetch: (url) => Promise))`.', 8 | 'See if using `DarkReader.setFetchMethod(window.fetch)`', 9 | 'before `DarkReader.enable()` works.', 10 | ].join(' '), 11 | )); 12 | }; 13 | 14 | type Fetcher = (url: string) => Promise; 15 | 16 | let fetcher: Fetcher = throwCORSError; 17 | 18 | export function setFetchMethod(fetch: Fetcher): void { 19 | if (fetch) { 20 | fetcher = fetch; 21 | } else { 22 | fetcher = throwCORSError; 23 | } 24 | } 25 | 26 | export async function callFetchMethod(url: string): Promise { 27 | return await fetcher(url); 28 | } 29 | -------------------------------------------------------------------------------- /tests/browser/settings/sitelist.tests.ts: -------------------------------------------------------------------------------- 1 | describe('Modifying settings', () => { 2 | // TODO: remove flakes and remove this line 3 | jest.retryTimes(10, {logErrorsBeforeRetry: true}); 4 | 5 | it('Modifying sync settings to contain long list', async () => { 6 | const newSettings = { 7 | enabledFor: [] as string[], 8 | disabledFor: [] as string[], 9 | syncSettings: true, 10 | }; 11 | 12 | // Cumulative length should be over the browser limit on record size 13 | for (let i = 0; i < 1000; i ++) { 14 | newSettings.disabledFor.push(`example${i}.com`); 15 | } 16 | 17 | await backgroundUtils.changeSettings(newSettings); 18 | 19 | const extensionData = await backgroundUtils.collectData(); 20 | expect(extensionData.settings.syncSettings).toBe(true); 21 | expect(extensionData.settings.disabledFor.length).toBe(1000); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/background/utils/sendLog.ts: -------------------------------------------------------------------------------- 1 | declare const __DEBUG__: boolean; 2 | declare const __LOG__: 'info' | 'warn' | 'assert'; 3 | 4 | let socket: WebSocket | null = null; 5 | let messageQueue: string[] = []; 6 | function createSocket(): void { 7 | if (socket) { 8 | return; 9 | } 10 | const newSocket = new WebSocket(`ws://localhost:${9000}`); 11 | socket = newSocket; 12 | newSocket.addEventListener('open', () => { 13 | messageQueue.forEach((message) => newSocket.send(message)); 14 | messageQueue = []; 15 | }); 16 | } 17 | 18 | export function sendLog(level: 'info' | 'warn' | 'assert', ...args: any[]): void { 19 | if (!__DEBUG__ || !__LOG__) { 20 | return; 21 | } 22 | const message = JSON.stringify({level, log: args}); 23 | if (socket && socket.readyState === socket.OPEN) { 24 | socket.send(message); 25 | } else { 26 | createSocket(); 27 | messageQueue.push(message); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/ui/controls/utils.ts: -------------------------------------------------------------------------------- 1 | import {classes} from '../utils'; 2 | 3 | function toArray(x: T | T[]): T[] { 4 | return Array.isArray(x) ? x : [x]; 5 | } 6 | 7 | export function mergeClass( 8 | cls: string | {[cls: string]: any} | Array, 9 | propsCls: string | {[cls: string]: any} | Array | undefined 10 | ): string { 11 | const normalized = toArray(cls).concat(toArray(propsCls)); 12 | return classes(...normalized); 13 | } 14 | 15 | export function omitAttrs(omit: string[], attrs: Malevic.NodeAttrs): Malevic.NodeAttrs { 16 | const result: Malevic.NodeAttrs = {}; 17 | Object.keys(attrs).forEach((key) => { 18 | if (omit.indexOf(key) < 0) { 19 | result[key] = attrs[key]; 20 | } 21 | }); 22 | return result; 23 | } 24 | 25 | export function isElementHidden(element: HTMLElement): boolean { 26 | return element.offsetParent === null; 27 | } 28 | -------------------------------------------------------------------------------- /src/ui/popup/components/header/more-new-highlight.tsx: -------------------------------------------------------------------------------- 1 | import {m} from 'malevic'; 2 | 3 | export default function MoreNewHighlight() { 4 | const a1 = {x: 244, y: 26}; 5 | const aq = {x: 144, y: 26}; 6 | const a2 = {x: 128, y: 8}; 7 | 8 | const b1 = {x: 244, y: 22}; 9 | const bq = {x: 208, y: 22}; 10 | const b2 = {x: 200, y: 8}; 11 | 12 | const r = 2; 13 | 14 | return ( 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 | New 23 |
24 | ); 25 | } 26 | --------------------------------------------------------------------------------