Fix the white/black theme switch in Chrome

Chrome doesn't fire twice the load event on a stylesheet when the disabled attribute is toggled (enabled => disabled => enabled)
pull/28217/head
Florian Duros 2022-09-27 11:02:57 +02:00
parent be8e44e17e
commit f574247452
No known key found for this signature in database
GPG Key ID: 9700AA5870258A0B
1 changed files with 39 additions and 17 deletions

View File

@ -279,26 +279,48 @@ export async function setTheme(theme?: string): Promise<void> {
resolve(); resolve();
}; };
// turns out that Firefox preloads the CSS for link elements with const isStyleSheetLoaded = () => Boolean(
// the disabled attribute, but Chrome doesn't. [...document.styleSheets]
.find(styleSheet => styleSheet?.href === styleElements[stylesheetName].href),
);
let cssLoaded = false; function waitForStyleSheetLoading() {
// turns out that Firefox preloads the CSS for link elements with
styleElements[stylesheetName].onload = () => { // the disabled attribute, but Chrome doesn't.
switchTheme(); if (isStyleSheetLoaded()) {
}; switchTheme();
return;
for (let i = 0; i < document.styleSheets.length; i++) {
const ss = document.styleSheets[i];
if (ss && ss.href === styleElements[stylesheetName].href) {
cssLoaded = true;
break;
} }
let counter = 0;
// In case of theme toggling (white => black => white)
// Chrome doesn't fire the `load` event when the white theme is selected the second times
const intervalId = setInterval(() => {
if (isStyleSheetLoaded()) {
clearInterval(intervalId);
styleElements[stylesheetName].onload = undefined;
styleElements[stylesheetName].onerror = undefined;
switchTheme();
}
// Avoid to be stuck in an endless loop if there is an issue in the stylesheet loading
counter++;
if (counter === 5) {
clearInterval(intervalId);
}
}, 100);
styleElements[stylesheetName].onload = () => {
clearInterval(intervalId);
switchTheme();
};
styleElements[stylesheetName].onerror = () => {
clearInterval(intervalId);
};
} }
if (cssLoaded) { waitForStyleSheetLoading();
styleElements[stylesheetName].onload = undefined;
switchTheme();
}
}); });
} }