import '../support/polyfills';
import {DEFAULT_THEME} from '../../../src/defaults';
import {createOrUpdateDynamicTheme, removeDynamicTheme} from '../../../src/inject/dynamic-theme';
import {multiline, timeout} from '../support/test-utils';
const theme = {
...DEFAULT_THEME,
darkSchemeBackgroundColor: 'black',
darkSchemeTextColor: 'white',
};
let container: HTMLElement;
beforeEach(() => {
container = document.body;
container.innerHTML = '';
});
afterEach(() => {
removeDynamicTheme();
container.innerHTML = '';
});
describe('INLINE STYLES', () => {
it('should override inline style', () => {
container.innerHTML = 'Inline style override';
createOrUpdateDynamicTheme(theme, null, false);
expect(getComputedStyle(document.querySelector('span')!).color).toBe('rgb(255, 26, 26)');
});
it('should watch for inline style change', async () => {
container.innerHTML = 'Watch inline style';
createOrUpdateDynamicTheme(theme, null, false);
const span = document.querySelector('span')!;
expect(getComputedStyle(span).color).toBe('rgb(255, 26, 26)');
span.style.color = 'green';
await timeout(0);
expect(getComputedStyle(span).color).toBe('rgb(140, 255, 140)');
});
it('should override only a single inline style property', async () => {
container.innerHTML = multiline(
'',
'Inline style override',
);
createOrUpdateDynamicTheme(theme, null, false);
const span = container.querySelector('span')!;
expect(getComputedStyle(span).backgroundColor).toBe('rgb(102, 102, 102)');
expect(getComputedStyle(span).color).toBe('rgb(255, 26, 26)');
span.style.color = 'green';
await timeout(0);
expect(getComputedStyle(span).color).toBe('rgb(140, 255, 140)');
expect(getComputedStyle(span).backgroundColor).toBe('rgb(102, 102, 102)');
});
it('should clean up the customProp after originial is gone', async () => {
container.innerHTML = 'Watch inline style';
createOrUpdateDynamicTheme(theme, null, false);
const span = document.querySelector('span')!;
expect(span.getAttribute('style')!.startsWith('color: red; --darkreader-inline-color:')).toBeTrue();
expect(span.getAttribute('style')!.includes('--darkreader-inline-color: var(--darkreader-text-ff0000, #ff1a1a);')).toBe(true);
span.style.color = '';
await timeout(0);
expect(span.getAttribute('style')).toBe('');
});
it(`shouldn't touch rel="mask-icon"`, async () => {
container.innerHTML = '';
createOrUpdateDynamicTheme(theme, null, false);
const maskIcon = document.querySelector('link[rel="mask-icon"]')!;
expect(maskIcon.getAttribute('style')).toBe(null);
});
it(`shouldn't touch a "none" value for fill`, async () => {
container.innerHTML = ``;
container.innerHTML += ``;
createOrUpdateDynamicTheme(theme, null, false);
const rect = container.querySelector('rect')!;
expect(getComputedStyle(rect).fill).toBe('rgb(255, 26, 26)');
});
});