diff --git a/_locales/en/messages.json b/_locales/en/messages.json index 9b0f523..695cba2 100644 --- a/_locales/en/messages.json +++ b/_locales/en/messages.json @@ -185,6 +185,9 @@ "settings": { "message": "Settings" }, + "skipNativeDarkMode": { + "message": "Skip sites with native dark mode" + }, "softwareInformation": { "message": "Software information" }, diff --git a/content-scripts/filters.js b/content-scripts/filters.js index 59bccc1..351e774 100644 --- a/content-scripts/filters.js +++ b/content-scripts/filters.js @@ -134,6 +134,53 @@ extension.filters = function (changed) { >>> INITIALIZATION --------------------------------------------------------------*/ +extension.checkNativeDarkSupport = function () { + if (extension.storage.get('skip_on_native_dark') === false) { + return false; + } + + if (!window.matchMedia || window.matchMedia('(prefers-color-scheme: dark)').matches === false) { + return false; + } + + var stylesheets = document.styleSheets; + + for (var i = 0, l = stylesheets.length; i < l; i++) { + var rules; + + try { + rules = stylesheets[i].cssRules; + } catch (e) { + continue; + } + + if (!rules) { + continue; + } + + for (var j = 0, m = rules.length; j < m; j++) { + var rule = rules[j]; + + if ( + rule instanceof CSSMediaRule && + rule.media.mediaText.indexOf('prefers-color-scheme: dark') !== -1 + ) { + document.documentElement.setAttribute('dm-default-theme', 'dark'); + + if (localStorage) { + localStorage.setItem('dm-default-theme', 'dark'); + } + + extension.websiteHasDarkTheme = true; + + return true; + } + } + } + + return false; +}; + extension.checkDefaultTheme = function () { if (extension.dynamicFilter.status === false) { var colors = [], @@ -206,6 +253,7 @@ extension.checkDefaultTheme = function () { }; extension.events.on('extension-loaded', function () { + extension.checkNativeDarkSupport(); extension.checkDefaultTheme(); extension.filters(); @@ -213,6 +261,7 @@ extension.events.on('extension-loaded', function () { extension.events.on('website-loaded', function () { if (extension.ready > 2) { + extension.checkNativeDarkSupport(); extension.checkDefaultTheme(); extension.filters(); @@ -228,6 +277,7 @@ extension.events.on('storage-changed', function () { window.addEventListener('focus', function () { if (extension.ready > 2) { setTimeout(function () { + extension.checkNativeDarkSupport(); extension.checkDefaultTheme(); extension.filters(); }, 125); diff --git a/options-page/skeleton-parts/schedule.js b/options-page/skeleton-parts/schedule.js index 25c3f4b..5fd8cd0 100644 --- a/options-page/skeleton-parts/schedule.js +++ b/options-page/skeleton-parts/schedule.js @@ -93,4 +93,16 @@ skeleton.header.sectionEnd.menu.on.click.schedule.on.click.timeTo = { return satus.storage.get('use_24_hour_format') === false; }, storage: 'time_to' +}; + + +/*-------------------------------------------------------------- +# SKIP NATIVE DARK MODE +--------------------------------------------------------------*/ + +skeleton.header.sectionEnd.menu.on.click.schedule.on.click.skipNativeDarkMode = { + component: 'switch', + text: 'skipNativeDarkMode', + storage: 'skip_on_native_dark', + value: true }; \ No newline at end of file