| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- /* global prefs */
- /* exported colorScheme */
- 'use strict';
- const colorScheme = (() => {
- let systemPreferDark = false;
- let timePreferDark = false;
- const changeListeners = new Set();
- const checkTime = ['schemeSwitcher.nightStart', 'schemeSwitcher.nightEnd'];
- prefs.subscribe(checkTime, (key, value) => {
- updateTimePreferDark();
- createAlarm(key, value);
- });
- checkTime.forEach(key => createAlarm(key, prefs.get(key)));
- prefs.subscribe(['schemeSwitcher.enabled'], emitChange);
- chrome.alarms.onAlarm.addListener(info => {
- if (checkTime.includes(info.name)) {
- updateTimePreferDark();
- }
- });
- updateSystemPreferDark();
- updateTimePreferDark();
- return {shouldIncludeStyle, onChange, updateSystemPreferDark};
- function createAlarm(key, value) {
- const date = new Date();
- applyDate(date, value);
- if (date.getTime() < Date.now()) {
- date.setDate(date.getDate() + 1);
- }
- chrome.alarms.create(key, {
- when: date.getTime(),
- periodInMinutes: 24 * 60,
- });
- }
- function shouldIncludeStyle(style) {
- const isDark = style.preferScheme === 'dark';
- const isLight = style.preferScheme === 'light';
- if (!isDark && !isLight) {
- return true;
- }
- const switcherState = prefs.get('schemeSwitcher.enabled');
- if (switcherState === 'never') {
- return true;
- }
- if (switcherState === 'system') {
- return systemPreferDark && isDark ||
- !systemPreferDark && isLight;
- }
- return timePreferDark && isDark ||
- !timePreferDark && isLight;
- }
- function updateSystemPreferDark() {
- const oldValue = systemPreferDark;
- systemPreferDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
- if (systemPreferDark !== oldValue) {
- emitChange();
- }
- return true;
- }
- function updateTimePreferDark() {
- const oldValue = timePreferDark;
- const date = new Date();
- const now = date.getTime();
- applyDate(date, prefs.get('schemeSwitcher.nightStart'));
- const start = date.getTime();
- applyDate(date, prefs.get('schemeSwitcher.nightEnd'));
- const end = date.getTime();
- timePreferDark = start > end ?
- now >= start || now < end :
- now >= start && now < end;
- if (timePreferDark !== oldValue) {
- emitChange();
- }
- }
- function applyDate(date, time) {
- const [h, m] = time.split(':').map(Number);
- date.setHours(h, m, 0, 0);
- }
- function onChange(listener) {
- changeListeners.add(listener);
- }
- function emitChange() {
- for (const listener of changeListeners) {
- listener();
- }
- }
- })();
|