summaryrefslogtreecommitdiffstats
path: root/application/basilisk/base/content/browser-compacttheme.js
diff options
context:
space:
mode:
Diffstat (limited to 'application/basilisk/base/content/browser-compacttheme.js')
-rw-r--r--application/basilisk/base/content/browser-compacttheme.js106
1 files changed, 106 insertions, 0 deletions
diff --git a/application/basilisk/base/content/browser-compacttheme.js b/application/basilisk/base/content/browser-compacttheme.js
new file mode 100644
index 000000000..87095df51
--- /dev/null
+++ b/application/basilisk/base/content/browser-compacttheme.js
@@ -0,0 +1,106 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/**
+ * Listeners for the compact theme. This adds an extra stylesheet
+ * to browser.xul if a pref is set and no other themes are applied.
+ */
+var CompactTheme = {
+ styleSheetLocation: "chrome://browser/skin/compacttheme.css",
+ styleSheet: null,
+ initialized: false,
+
+ get isStyleSheetEnabled() {
+ return this.styleSheet && !this.styleSheet.sheet.disabled;
+ },
+
+ get isThemeCurrentlyApplied() {
+ let theme = LightweightThemeManager.currentTheme;
+ return theme && (
+ theme.id == "firefox-compact-dark@mozilla.org" ||
+ theme.id == "firefox-compact-light@mozilla.org");
+ },
+
+ init() {
+ this.initialized = true;
+ Services.obs.addObserver(this, "lightweight-theme-styling-update", false);
+
+ if (this.isThemeCurrentlyApplied) {
+ this._toggleStyleSheet(true);
+ }
+ },
+
+ createStyleSheet() {
+ let styleSheetAttr = `href="${this.styleSheetLocation}" type="text/css"`;
+ this.styleSheet = document.createProcessingInstruction(
+ "xml-stylesheet", styleSheetAttr);
+ this.styleSheet.addEventListener("load", this);
+ document.insertBefore(this.styleSheet, document.documentElement);
+ this.styleSheet.sheet.disabled = true;
+ },
+
+ observe(subject, topic, data) {
+ if (topic == "lightweight-theme-styling-update") {
+ let newTheme = JSON.parse(data);
+ if (newTheme && (
+ newTheme.id == "firefox-compact-light@mozilla.org" ||
+ newTheme.id == "firefox-compact-dark@mozilla.org")) {
+ // We are using the theme ID on this object instead of always referencing
+ // LightweightThemeManager.currentTheme in case this is a preview
+ this._toggleStyleSheet(true);
+ } else {
+ this._toggleStyleSheet(false);
+ }
+
+ }
+ },
+
+ handleEvent(e) {
+ if (e.type === "load") {
+ this.styleSheet.removeEventListener("load", this);
+ this.refreshBrowserDisplay();
+ }
+ },
+
+ refreshBrowserDisplay() {
+ // Don't touch things on the browser if gBrowserInit.onLoad hasn't
+ // yet fired.
+ if (this.initialized) {
+ gBrowser.tabContainer._positionPinnedTabs();
+ }
+ },
+
+ _toggleStyleSheet(enabled) {
+ let wasEnabled = this.isStyleSheetEnabled;
+ if (enabled) {
+ // The stylesheet may not have been created yet if it wasn't
+ // needed on initial load. Make it now.
+ if (!this.styleSheet) {
+ this.createStyleSheet();
+ }
+ this.styleSheet.sheet.disabled = false;
+ this.refreshBrowserDisplay();
+ } else if (!enabled && wasEnabled) {
+ this.styleSheet.sheet.disabled = true;
+ this.refreshBrowserDisplay();
+ }
+ },
+
+ uninit() {
+ Services.obs.removeObserver(this, "lightweight-theme-styling-update");
+ if (this.styleSheet) {
+ this.styleSheet.removeEventListener("load", this);
+ }
+ this.styleSheet = null;
+ }
+};
+
+#ifdef INSTALL_COMPACT_THEMES
+// If the compact theme is going to be applied in gBrowserInit.onLoad,
+// then preload it now. This prevents a flash of unstyled content where the
+// normal theme is applied while the compact theme stylesheet is loading.
+if (this != Services.appShell.hiddenDOMWindow && CompactTheme.isThemeCurrentlyApplied) {
+ CompactTheme.createStyleSheet();
+}
+#endif