Skip to content

Instantly share code, notes, and snippets.

@evanreichard
Forked from kfur/darkreader.js
Last active September 10, 2024 14:52
Show Gist options
  • Save evanreichard/f983ca26836d4af6ca0f6fb602b9dcaf to your computer and use it in GitHub Desktop.
Save evanreichard/f983ca26836d4af6ca0f6fb602b9dcaf to your computer and use it in GitHub Desktop.
Dark Reader UserScript for Safari Browser
// ==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();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment