// ==UserScript== // @name DarkReader // @version 0.0.7 // @match *://*/* // @downloadURL https://gist.github.com/evanreichard/f983ca26836d4af6ca0f6fb602b9dcaf/raw/darkreader.user.js // @require https://unpkg.com/darkreader@4.9.46/darkreader.js // @grant GM.xmlhttpRequest // @grant GM.registerMenuCommand // @grant GM.unregisterMenuCommand // @grant GM_getValue // @grant GM_setValue // @inject-into content // @noframes // @run-at document-start // ==/UserScript== /* globals DarkReader */ let options = { brightness: 70, contrast: 110, sepia: 50, }; let prefersDark = window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches; function toggleHost() { let disabledHosts = GM_getValue("disabledHosts", []); let isDisabled = disabledHosts.includes(window.location.hostname); if (isDisabled) { disabledHosts = disabledHosts.filter( (item) => item !== window.location.hostname, ); } else { disabledHosts.push(window.location.hostname); } GM_setValue("disabledHosts", disabledHosts); applySettings(); } function toggleSystem() { let useSystem = GM_getValue("useSystem", true); GM_setValue("useSystem", !useSystem); applySettings(); } /** * This is necessary for CORS related requests. GM.xmlhttpRequest * bypasses that restriction. **/ async function extensionFetch(url) { let responseData = await new Promise((resolve, reject) => { GM.xmlhttpRequest({ url, responseType: "blob", onerror: reject, onload: resolve, }); }); return new Response(responseData.response); } DarkReader.setFetchMethod(extensionFetch); function applySettings() { GM.unregisterMenuCommand("System Mode - Enable"); GM.unregisterMenuCommand("System Mode - Disable"); GM.unregisterMenuCommand("DarkReader - Disable"); GM.unregisterMenuCommand("DarkReader - Enable"); let disabledHosts = GM_getValue("disabledHosts", []); let useSystem = GM_getValue("useSystem", true); if (useSystem) { GM.registerMenuCommand("System Mode - Disable", toggleSystem); } else { GM.registerMenuCommand("System Mode - Enable", toggleSystem); } let isDisabled = disabledHosts.includes(window.location.hostname); if (isDisabled) { GM.registerMenuCommand("DarkReader - Enable", toggleHost); } else { GM.registerMenuCommand("DarkReader - Disable", toggleHost); } if (useSystem && prefersDark && !isDisabled) return DarkReader.enable(options); if (!useSystem && !isDisabled) return DarkReader.enable(options); DarkReader.disable(); } // System Change window .matchMedia("(prefers-color-scheme: dark)") .addEventListener("change", (event) => { prefersDark = event.matches; applySettings(); }); // Initial Load applySettings();