Bug 864562 - Use CSS variables for lightweight theme styling. r?mattn
Original patch written by Raj Meghpara <meghpararajkumar@gmail.com>
MozReview-Commit-ID: 8z6tmUG0gdN
--- a/browser/base/content/browser-addons.js
+++ b/browser/base/content/browser-addons.js
@@ -789,78 +789,41 @@ var LightWeightThemeWebInstaller = {
return pm.testPermission(uri, "install") == pm.ALLOW_ACTION;
}
};
/*
* Listen for Lightweight Theme styling changes and update the browser's theme accordingly.
*/
var LightweightThemeListener = {
- _modifiedStyles: [],
-
init() {
- XPCOMUtils.defineLazyGetter(this, "styleSheet", function() {
- for (let i = document.styleSheets.length - 1; i >= 0; i--) {
- let sheet = document.styleSheets[i];
- if (sheet.href == "chrome://browser/skin/browser-lightweightTheme.css")
- return sheet;
- }
- return undefined;
- });
-
Services.obs.addObserver(this, "lightweight-theme-styling-update", false);
Services.obs.addObserver(this, "lightweight-theme-optimized", false);
if (document.documentElement.hasAttribute("lwtheme"))
this.updateStyleSheet(document.documentElement.style.backgroundImage);
},
uninit() {
Services.obs.removeObserver(this, "lightweight-theme-styling-update");
Services.obs.removeObserver(this, "lightweight-theme-optimized");
},
/**
- * Append the headerImage to the background-image property of all rulesets in
- * browser-lightweightTheme.css.
+ * Set the headerImage to a CSS variable which is used to apply the background-image
+ * property of all rulesets in browser-lightweightTheme.css.
*
* @param headerImage - a string containing a CSS image for the lightweight theme header.
*/
updateStyleSheet(headerImage) {
- if (!this.styleSheet)
- return;
- this.substituteRules(this.styleSheet.cssRules, headerImage);
- },
-
- substituteRules(ruleList, headerImage, existingStyleRulesModified = 0) {
- let styleRulesModified = 0;
- for (let i = 0; i < ruleList.length; i++) {
- let rule = ruleList[i];
- if (rule instanceof Ci.nsIDOMCSSGroupingRule) {
- // Add the number of modified sub-rules to the modified count
- styleRulesModified += this.substituteRules(rule.cssRules, headerImage, existingStyleRulesModified + styleRulesModified);
- } else if (rule instanceof Ci.nsIDOMCSSStyleRule) {
- if (!rule.style.backgroundImage)
- continue;
- let modifiedIndex = existingStyleRulesModified + styleRulesModified;
- if (!this._modifiedStyles[modifiedIndex])
- this._modifiedStyles[modifiedIndex] = { backgroundImage: rule.style.backgroundImage };
-
- rule.style.backgroundImage = this._modifiedStyles[modifiedIndex].backgroundImage + ", " + headerImage;
- styleRulesModified++;
- } else {
- Cu.reportError("Unsupported rule encountered");
- }
- }
- return styleRulesModified;
- },
-
+ document.documentElement.style.setProperty("--lwt-header-image", headerImage);
+},
// nsIObserver
observe(aSubject, aTopic, aData) {
- if ((aTopic != "lightweight-theme-styling-update" && aTopic != "lightweight-theme-optimized") ||
- !this.styleSheet)
+ if (aTopic != "lightweight-theme-styling-update" &&
+ aTopic != "lightweight-theme-optimized")
return;
if (aTopic == "lightweight-theme-optimized" && aSubject != window)
return;
let themeData = JSON.parse(aData);
if (!themeData)
return;
--- a/browser/themes/linux/browser-lightweightTheme.css
+++ b/browser/themes/linux/browser-lightweightTheme.css
@@ -1,31 +1,31 @@
/* 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/. */
%include linuxShared.inc
%filter substitution
/*
- * LightweightThemeListener will append the current lightweight theme's header
- * image to the background-image for each of the following rulesets.
+ * LightweightThemeListener will set the current lightweight theme's header
+ * image to the lwt-header-image variable, used in each of the following rulesets.
*/
/* Lightweight theme on tabs */
#tabbrowser-tabs:not([movingtab]) > .tabbrowser-tab > .tab-stack > .tab-background > .tab-background-start[selected=true]:-moz-lwtheme::before,
#tabbrowser-tabs:not([movingtab]) > .tabbrowser-tab > .tab-stack > .tab-background > .tab-background-end[selected=true]:-moz-lwtheme::before {
background-attachment: scroll, fixed;
background-color: transparent;
- background-image: @fgTabTextureLWT@;/*, lwtHeader;*/
+ background-image: @fgTabTextureLWT@, var(--lwt-header-image);
background-position: 0 0, right top;
background-repeat: repeat-x, no-repeat;
}
#tabbrowser-tabs:not([movingtab]) > .tabbrowser-tab > .tab-stack > .tab-background > .tab-background-middle[selected=true]:-moz-lwtheme {
background-attachment: scroll, scroll, fixed;
background-color: transparent;
background-image: url(chrome://browser/skin/tabbrowser/tab-active-middle.png),
- @fgTabTextureLWT@;/*,
- lwtHeader;*/
+ @fgTabTextureLWT@,
+ var(--lwt-header-image);
background-position: 0 0, 0 0, right top;
background-repeat: repeat-x, repeat-x, no-repeat;
}
--- a/browser/themes/linux/browser.css
+++ b/browser/themes/linux/browser.css
@@ -35,16 +35,18 @@
--toolbarbutton-checkedhover-backgroundcolor: rgba(200,200,200,.5);
--panel-separator-color: ThreeDShadow;
--arrowpanel-dimmed: hsla(0,0%,80%,.3);
--arrowpanel-dimmed-further: hsla(0,0%,80%,.45);
--arrowpanel-dimmed-even-further: hsla(0,0%,80%,.8);
--urlbar-separator-color: ThreeDShadow;
+
+ --lwt-header-image: none;
}
#menubar-items {
-moz-box-orient: vertical; /* for flex hack */
}
#main-menubar {
-moz-box-flex: 1; /* make menu items expand to fill toolbar height */
--- a/browser/themes/osx/browser-lightweightTheme.css
+++ b/browser/themes/osx/browser-lightweightTheme.css
@@ -1,38 +1,38 @@
/* 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/. */
%include shared.inc
/*
- * LightweightThemeListener will append the current lightweight theme's header
- * image to the background-image for each of the following rulesets.
+ * LightweightThemeListener will set the current lightweight theme's header
+ * image to the lwt-header-image variable, used in each of the following rulesets.
*/
/* Lightweight theme on tabs */
#tabbrowser-tabs:not([movingtab]) > .tabbrowser-tab > .tab-stack > .tab-background > .tab-background-start[selected=true]:-moz-lwtheme::before,
#tabbrowser-tabs:not([movingtab]) > .tabbrowser-tab > .tab-stack > .tab-background > .tab-background-end[selected=true]:-moz-lwtheme::before {
background-attachment: scroll, fixed;
background-color: transparent;
- background-image: @fgTabTextureLWT@;/*, lwtHeader;*/
+ background-image: @fgTabTextureLWT@, var(--lwt-header-image);
background-position: 0 0, right top;
background-repeat: repeat-x, no-repeat;
}
#tabbrowser-tabs:not([movingtab]) > .tabbrowser-tab > .tab-stack > .tab-background > .tab-background-middle[selected=true]:-moz-lwtheme {
background-attachment: scroll, scroll, fixed;
background-color: transparent;
background-image: url(chrome://browser/skin/tabbrowser/tab-active-middle.png),
- @fgTabTextureLWT@;/*,
- lwtHeader;*/
+ @fgTabTextureLWT@,
+ var(--lwt-header-image);
background-position: 0 0, 0 0, right top;
background-repeat: repeat-x, repeat-x, no-repeat;
}
@media (min-resolution: 2dppx) {
#tabbrowser-tabs:not([movingtab]) > .tabbrowser-tab > .tab-stack > .tab-background > .tab-background-middle[selected=true]:-moz-lwtheme {
background-image: url(chrome://browser/skin/tabbrowser/tab-active-middle@2x.png),
- @fgTabTextureLWT@;/*,
- lwtHeader;*/
+ @fgTabTextureLWT@,
+ var(--lwt-header-image);
}
}
--- a/browser/themes/osx/browser.css
+++ b/browser/themes/osx/browser.css
@@ -46,16 +46,18 @@
--urlbar-dropmarker-active-2x-region: rect(0, 44px, 28px, 22px);
--panel-separator-color: hsla(210,4%,10%,.14);
--arrowpanel-dimmed: hsla(210,4%,10%,.07);
--arrowpanel-dimmed-further: hsla(210,4%,10%,.12);
--arrowpanel-dimmed-even-further: hsla(210,4%,10%,.17);
--urlbar-separator-color: hsla(0,0%,16%,.2);
+
+ --lwt-header-image: none;
}
#urlbar:-moz-lwtheme:not([focused="true"]),
.searchbar-textbox:-moz-lwtheme:not([focused="true"]) {
opacity: .9;
}
#navigator-toolbox::after {
--- a/browser/themes/windows/browser-lightweightTheme.css
+++ b/browser/themes/windows/browser-lightweightTheme.css
@@ -1,39 +1,39 @@
/* 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/. */
%include windowsShared.inc
%filter substitution
/*
- * LightweightThemeListener will append the current lightweight theme's header
- * image to the background-image for each of the following rulesets.
+ * LightweightThemeListener will set the current lightweight theme's header
+ * image to the lwt-header-image variable, used in each of the following rulesets.
*/
/* Lightweight theme on tabs */
#tabbrowser-tabs:not([movingtab]) > .tabbrowser-tab > .tab-stack > .tab-background > .tab-background-start[selected=true]:-moz-lwtheme::before,
#tabbrowser-tabs:not([movingtab]) > .tabbrowser-tab > .tab-stack > .tab-background > .tab-background-end[selected=true]:-moz-lwtheme::before {
background-attachment: scroll, fixed;
background-color: transparent;
- background-image: @fgTabTextureLWT@;/*, lwtHeader;*/
+ background-image: @fgTabTextureLWT@, var(--lwt-header-image);
background-position: 0 0, right top;
background-repeat: repeat-x, no-repeat;
}
#tabbrowser-tabs:not([movingtab]) > .tabbrowser-tab > .tab-stack > .tab-background > .tab-background-middle[selected=true]:-moz-lwtheme {
background-attachment: scroll, scroll, fixed;
background-color: transparent;
background-image: url(chrome://browser/skin/tabbrowser/tab-active-middle.png),
- @fgTabTextureLWT@;/*,
- lwtHeader;*/
+ @fgTabTextureLWT@,
+ var(--lwt-header-image);
background-position: 0 0, 0 0, right top;
background-repeat: repeat-x, repeat-x, no-repeat;
}
@media (min-resolution: 1.25dppx) {
#tabbrowser-tabs:not([movingtab]) > .tabbrowser-tab > .tab-stack > .tab-background > .tab-background-middle[selected=true]:-moz-lwtheme {
background-image: url(chrome://browser/skin/tabbrowser/tab-active-middle@2x.png),
- @fgTabTextureLWT@;/*,
- lwtHeader;*/
+ @fgTabTextureLWT@,
+ var(--lwt-header-image);
}
}
--- a/browser/themes/windows/browser.css
+++ b/browser/themes/windows/browser.css
@@ -48,16 +48,18 @@
--urlbar-dropmarker-active-2x-region: rect(0, 66px, 28px, 44px);
--panel-separator-color: ThreeDLightShadow;
--arrowpanel-dimmed: hsla(0,0%,80%,.3);
--arrowpanel-dimmed-further: hsla(0,0%,80%,.45);
--arrowpanel-dimmed-even-further: hsla(0,0%,80%,.8);
--urlbar-separator-color: ThreeDLightShadow;
+
+ --lwt-header-image: none;
}
@media (-moz-windows-default-theme) {
:root {
--panel-separator-color: hsla(210,4%,10%,.14);
}
}