electron/spec-main/api-native-theme-spec.ts
Samuel Attard fea3366bc7
fix: propagate preferred color scheme to the renderer (#22896)
* fix: do not crash if the window is closed syncronously with a nativeTheme change

* fix: propogate preferred color scheme to the renderer and keep it up to date
2020-03-30 15:39:50 -07:00

102 lines
3.7 KiB
TypeScript

import { expect } from 'chai';
import { nativeTheme, systemPreferences, BrowserWindow } from 'electron';
import * as os from 'os';
import * as path from 'path';
import * as semver from 'semver';
import { delay, ifdescribe } from './spec-helpers';
import { emittedOnce } from './events-helpers';
import { closeAllWindows } from './window-helpers';
describe('nativeTheme module', () => {
describe('nativeTheme.shouldUseDarkColors', () => {
it('returns a boolean', () => {
expect(nativeTheme.shouldUseDarkColors).to.be.a('boolean');
});
});
describe('nativeTheme.themeSource', () => {
afterEach(async () => {
nativeTheme.themeSource = 'system';
// Wait for any pending events to emit
await delay(20);
closeAllWindows();
});
it('is system by default', () => {
expect(nativeTheme.themeSource).to.equal('system');
});
it('should override the value of shouldUseDarkColors', () => {
nativeTheme.themeSource = 'dark';
expect(nativeTheme.shouldUseDarkColors).to.equal(true);
nativeTheme.themeSource = 'light';
expect(nativeTheme.shouldUseDarkColors).to.equal(false);
});
it('should emit the "updated" event when it is set and the resulting "shouldUseDarkColors" value changes', async () => {
let updatedEmitted = emittedOnce(nativeTheme, 'updated');
nativeTheme.themeSource = 'dark';
await updatedEmitted;
updatedEmitted = emittedOnce(nativeTheme, 'updated');
nativeTheme.themeSource = 'light';
await updatedEmitted;
});
it('should not emit the "updated" event when it is set and the resulting "shouldUseDarkColors" value is the same', async () => {
nativeTheme.themeSource = 'dark';
// Wait a few ticks to allow an async events to flush
await delay(20);
let called = false;
nativeTheme.once('updated', () => {
called = true;
});
nativeTheme.themeSource = 'dark';
// Wait a few ticks to allow an async events to flush
await delay(20);
expect(called).to.equal(false);
});
ifdescribe(process.platform === 'darwin' && semver.gte(os.release(), '18.0.0'))('on macOS 10.14', () => {
it('should update appLevelAppearance when set', () => {
nativeTheme.themeSource = 'dark';
expect(systemPreferences.appLevelAppearance).to.equal('dark');
nativeTheme.themeSource = 'light';
expect(systemPreferences.appLevelAppearance).to.equal('light');
});
});
const getPrefersColorSchemeIsDark = async (w: Electron.BrowserWindow) => {
const isDark: boolean = await w.webContents.executeJavaScript(
'matchMedia("(prefers-color-scheme: dark)").matches'
);
return isDark;
};
it('should override the result of prefers-color-scheme CSS media query', async () => {
const w = new BrowserWindow({ show: false });
await w.loadFile(path.resolve(__dirname, 'fixtures', 'blank.html'));
const originalSystemIsDark = await getPrefersColorSchemeIsDark(w);
nativeTheme.themeSource = 'dark';
expect(await getPrefersColorSchemeIsDark(w)).to.equal(true);
nativeTheme.themeSource = 'light';
expect(await getPrefersColorSchemeIsDark(w)).to.equal(false);
nativeTheme.themeSource = 'system';
expect(await getPrefersColorSchemeIsDark(w)).to.equal(originalSystemIsDark);
w.close();
});
});
describe('nativeTheme.shouldUseInvertedColorScheme', () => {
it('returns a boolean', () => {
expect(nativeTheme.shouldUseInvertedColorScheme).to.be.a('boolean');
});
});
describe('nativeTheme.shouldUseHighContrastColors', () => {
it('returns a boolean', () => {
expect(nativeTheme.shouldUseHighContrastColors).to.be.a('boolean');
});
});
});