diff options
author | Andrew Dolgov <[email protected]> | 2019-12-15 11:57:26 +0300 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2019-12-15 11:57:26 +0300 |
commit | 07f4878d59a7459472e66a2ba0c1c0413232107e (patch) | |
tree | 872efda8bd355b8c200a75fea485b859b3b5c143 /js/AppBase.js | |
parent | 0d6add5d7f9475d60330f233a6b62f9bb81d01c0 (diff) |
workaround for a race condition between dojo.parse() and tt-rss loading proper day/night css on startup because of firefox async CSS loader
Diffstat (limited to 'js/AppBase.js')
-rw-r--r-- | js/AppBase.js | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/js/AppBase.js b/js/AppBase.js index a348c95f8..8d42fd382 100644 --- a/js/AppBase.js +++ b/js/AppBase.js @@ -9,7 +9,6 @@ define(["dojo/_base/declare"], function (declare) { hotkey_prefix_timeout: 0, constructor: function() { window.onerror = this.Error.onWindowError; - this.setupNightModeDetection(); }, getInitParam: function(k) { return this._initParams[k]; @@ -17,30 +16,47 @@ define(["dojo/_base/declare"], function (declare) { setInitParam: function(k, v) { this._initParams[k] = v; }, - nightModeChanged: function(is_night) { + nightModeChanged: function(is_night, link) { console.log("night mode changed to", is_night); - const link = $("theme_css"); - if (link) { - - if (link.getAttribute("data-orig-href").indexOf("css/default.css") !== -1) { - const css_override = is_night ? "themes/night.css" : "css/default.css"; - link.setAttribute("href", css_override + "?" + Date.now()); - } + const css_override = is_night ? "themes/night.css" : "css/default.css"; + link.setAttribute("href", css_override + "?" + Date.now()); } }, - setupNightModeDetection: function() { - if (window.matchMedia) { + setupNightModeDetection: function(callback) { + if (!$("theme_css")) { const mql = window.matchMedia('(prefers-color-scheme: dark)'); try { mql.addEventListener("change", () => { - this.nightModeChanged(mql.matches); + this.nightModeChanged(mql.matches, $("theme_auto_css")); }); - } catch (e) {} + } catch (e) { + console.warn("exception while trying to set MQL event listener"); + } - this.nightModeChanged(mql.matches); + const link = new Element("link", { + rel: "stylesheet", + id: "theme_auto_css" + }); + + if (callback) { + link.onload = function () { + document.querySelector("body").removeClassName("css_loading"); + callback(); + }; + + link.onerror = function(event) { + alert("Fatal error while loading application stylesheet: " + link.getAttribute("href")); + } + } + + this.nightModeChanged(mql.matches, link); + + document.querySelector("head").appendChild(link); + } else { + if (callback) callback(); } }, enableCsrfSupport: function() { |