summaryrefslogtreecommitdiffstats
path: root/browser/base/content/browser-devedition.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/base/content/browser-devedition.js')
-rw-r--r--browser/base/content/browser-devedition.js142
1 files changed, 142 insertions, 0 deletions
diff --git a/browser/base/content/browser-devedition.js b/browser/base/content/browser-devedition.js
new file mode 100644
index 000000000..0dc1e94da
--- /dev/null
+++ b/browser/base/content/browser-devedition.js
@@ -0,0 +1,142 @@
+/* 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 DevEdition theme. This adds an extra stylesheet
+ * to browser.xul if a pref is set and no other themes are applied.
+ */
+var DevEdition = {
+ _devtoolsThemePrefName: "devtools.theme",
+ styleSheetLocation: "chrome://browser/skin/devedition.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-devedition@mozilla.org";
+ },
+
+ init: function () {
+ this.initialized = true;
+ Services.prefs.addObserver(this._devtoolsThemePrefName, this, false);
+ Services.obs.addObserver(this, "lightweight-theme-styling-update", false);
+ Services.obs.addObserver(this, "lightweight-theme-window-updated", false);
+ this._updateDevtoolsThemeAttribute();
+
+ if (this.isThemeCurrentlyApplied) {
+ this._toggleStyleSheet(true);
+ }
+ },
+
+ createStyleSheet: function() {
+ 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: function (subject, topic, data) {
+ if (topic == "lightweight-theme-styling-update") {
+ let newTheme = JSON.parse(data);
+ if (newTheme && newTheme.id == "firefox-devedition@mozilla.org") {
+ this._toggleStyleSheet(true);
+ } else {
+ this._toggleStyleSheet(false);
+ }
+ } else if (topic == "lightweight-theme-window-updated" && subject == window) {
+ this._updateLWTBrightness();
+ }
+
+ if (topic == "nsPref:changed" && data == this._devtoolsThemePrefName) {
+ this._updateDevtoolsThemeAttribute();
+ }
+ },
+
+ _inferBrightness: function() {
+ ToolbarIconColor.inferFromText();
+ // Get an inverted full screen button if the dark theme is applied.
+ if (this.isStyleSheetEnabled &&
+ document.documentElement.getAttribute("devtoolstheme") == "dark") {
+ document.documentElement.setAttribute("brighttitlebarforeground", "true");
+ } else {
+ document.documentElement.removeAttribute("brighttitlebarforeground");
+ }
+ },
+
+ _updateLWTBrightness() {
+ if (this.isThemeCurrentlyApplied) {
+ let devtoolsTheme = Services.prefs.getCharPref(this._devtoolsThemePrefName);
+ let textColor = devtoolsTheme == "dark" ? "bright" : "dark";
+ document.documentElement.setAttribute("lwthemetextcolor", textColor);
+ }
+ },
+
+ _updateDevtoolsThemeAttribute: function() {
+ // Set an attribute on root element to make it possible
+ // to change colors based on the selected devtools theme.
+ let devtoolsTheme = Services.prefs.getCharPref(this._devtoolsThemePrefName);
+ if (devtoolsTheme != "dark") {
+ devtoolsTheme = "light";
+ }
+ document.documentElement.setAttribute("devtoolstheme", devtoolsTheme);
+ this._updateLWTBrightness();
+ this._inferBrightness();
+ },
+
+ handleEvent: function(e) {
+ if (e.type === "load") {
+ this.styleSheet.removeEventListener("load", this);
+ this.refreshBrowserDisplay();
+ }
+ },
+
+ refreshBrowserDisplay: function() {
+ // Don't touch things on the browser if gBrowserInit.onLoad hasn't
+ // yet fired.
+ if (this.initialized) {
+ gBrowser.tabContainer._positionPinnedTabs();
+ this._inferBrightness();
+ }
+ },
+
+ _toggleStyleSheet: function(deveditionThemeEnabled) {
+ let wasEnabled = this.isStyleSheetEnabled;
+ if (deveditionThemeEnabled && !wasEnabled) {
+ // 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 (!deveditionThemeEnabled && wasEnabled) {
+ this.styleSheet.sheet.disabled = true;
+ this.refreshBrowserDisplay();
+ }
+ },
+
+ uninit: function () {
+ Services.prefs.removeObserver(this._devtoolsThemePrefName, this);
+ Services.obs.removeObserver(this, "lightweight-theme-styling-update", false);
+ Services.obs.removeObserver(this, "lightweight-theme-window-updated", false);
+ if (this.styleSheet) {
+ this.styleSheet.removeEventListener("load", this);
+ }
+ this.styleSheet = null;
+ }
+};
+
+// If the DevEdition 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 DevEdition stylesheet is loading.
+if (!AppConstants.RELEASE_OR_BETA &&
+ this != Services.appShell.hiddenDOMWindow && DevEdition.isThemeCurrentlyApplied) {
+ DevEdition.createStyleSheet();
+}