Skip to content

Commit fe929d5

Browse files
author
Gusted
authored
Add darkreader-lock meta (darkreader#9181)
- Add `<meta name="darkreader-lock">` to look for and if available remove Dark Reader. - Resolves darkreader#4325 - Resolves darkreader#4330 - Superseeds darkreader#4334
1 parent b8b7d49 commit fe929d5

3 files changed

Lines changed: 56 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
- Don't manage styles that have a empty `href` attribute.
44
- Use `navigator.UserAgentData` when possible.
5+
- Add a `<meta name="darkreader-lock">` detector, to disable Dark Reader when detected (only dynamic theme).
56

67
## 4.9.52 (June 28, 2022)
78

src/inject/dynamic-theme/index.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,18 @@ function stopWatchingForUpdates() {
431431
cleanReadyStateCompleteListeners();
432432
}
433433

434+
let metaObserver: MutationObserver;
435+
436+
function addMetaListener() {
437+
metaObserver = new MutationObserver(() => {
438+
if (document.querySelector('meta[name="darkreader-lock"]')) {
439+
metaObserver.disconnect();
440+
removeDynamicTheme();
441+
}
442+
});
443+
metaObserver.observe(document.head, {childList: true, subtree: true});
444+
}
445+
434446
function createDarkReaderInstanceMarker() {
435447
const metaElement: HTMLMetaElement = document.createElement('meta');
436448
metaElement.name = 'darkreader';
@@ -439,6 +451,10 @@ function createDarkReaderInstanceMarker() {
439451
}
440452

441453
function isAnotherDarkReaderInstanceActive() {
454+
if (document.querySelector('meta[name="darkreader-lock"]')) {
455+
return true;
456+
}
457+
442458
const meta: HTMLMetaElement = document.querySelector('meta[name="darkreader"]');
443459
if (meta) {
444460
if (meta.content !== INSTANCE_ID) {
@@ -447,6 +463,7 @@ function isAnotherDarkReaderInstanceActive() {
447463
return false;
448464
}
449465
createDarkReaderInstanceMarker();
466+
addMetaListener();
450467
return false;
451468
}
452469

@@ -532,6 +549,8 @@ export function removeDynamicTheme() {
532549
manager.destroy();
533550
});
534551
adoptedStyleManagers.splice(0);
552+
553+
metaObserver && metaObserver.disconnect();
535554
}
536555

537556
export function cleanDynamicThemeCache() {

tests/inject/dynamic/fixes.tests.ts

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import '../support/polyfills';
22
import {DEFAULT_THEME} from '../../../src/defaults';
33
import {createOrUpdateDynamicTheme, removeDynamicTheme} from '../../../src/inject/dynamic-theme';
4-
import {multiline} from '../support/test-utils';
4+
import {multiline, timeout} from '../support/test-utils';
55
import type {DynamicThemeFix} from '../../../src/definitions';
66
import {FilterMode} from '../../../src/generators/css-filter';
7+
import {removeNode} from '../../../src/inject/utils/dom';
78

89
let container: HTMLElement;
910

@@ -15,6 +16,7 @@ beforeEach(() => {
1516
afterEach(() => {
1617
removeDynamicTheme();
1718
container.innerHTML = '';
19+
removeNode(document.head.querySelector('meta[name="darkreader-lock"]'));
1820
});
1921

2022
describe('FIXES', () => {
@@ -77,4 +79,37 @@ describe('FIXES', () => {
7779
createOrUpdateDynamicTheme(DEFAULT_THEME, fixes, false);
7880
expect(getComputedStyle(container.querySelector('.text')).backgroundColor).toBe('rgb(128, 0, 128)');
7981
});
82+
83+
it('should ignore styling when darkreader-lock detected', async () => {
84+
document.head.innerHTML = '<meta name="darkreader-lock"></meta>',
85+
container.innerHTML = multiline(
86+
'<style>',
87+
' body {',
88+
' background-color: pink !important;',
89+
' }',
90+
'</style>',
91+
);
92+
createOrUpdateDynamicTheme(DEFAULT_THEME, null, false);
93+
94+
expect(getComputedStyle(document.body).backgroundColor).toBe('rgb(255, 192, 203)');
95+
});
96+
97+
it('should ignore styling when delayed darkreader-lock detected', async () => {
98+
container.innerHTML = multiline(
99+
'<style>',
100+
' body {',
101+
' background-color: pink !important;',
102+
' }',
103+
'</style>',
104+
);
105+
createOrUpdateDynamicTheme(DEFAULT_THEME, null, false);
106+
107+
expect(getComputedStyle(container).backgroundColor).toBe('rgb(89, 0, 16)');
108+
const metaElement: HTMLMetaElement = document.createElement('meta');
109+
metaElement.name = 'darkreader-lock';
110+
document.head.appendChild(metaElement);
111+
await timeout(100);
112+
113+
expect(getComputedStyle(container).backgroundColor).toBe('rgb(255, 192, 203)');
114+
});
80115
});

0 commit comments

Comments
 (0)