From aaded6fa490906ccad8e42f8cc2f1163e4c3dbf3 Mon Sep 17 00:00:00 2001 From: Tim Nguyen Date: Mon, 6 Aug 2018 17:46:43 +0100 Subject: [PATCH] Bug 1418602 - Allow theming sidebars. r=mconley MozReview-Commit-ID: 97zkU7raehV --HG-- extra : rebase_source : ae7fb55a913abd1d59b0dfbbca6e24a7e7b9ff15 --- browser/actors/LightweightThemeChild.jsm | 5 + browser/base/content/contentTheme.js | 43 +++++- .../places/content/bookmarksSidebar.js | 8 ++ .../places/content/bookmarksSidebar.xul | 2 + .../places/content/historySidebar.js | 8 ++ .../places/content/historySidebar.xul | 2 + browser/modules/ThemeVariableMap.jsm | 4 + browser/themes/linux/places/places.css | 7 - browser/themes/osx/places/places.css | 3 + browser/themes/shared/places/places.inc.css | 45 ++++++ browser/themes/windows/places/places.css | 8 -- .../components/extensions/parent/ext-theme.js | 4 + .../components/extensions/schemas/theme.json | 16 +++ .../extensions/test/browser/browser.ini | 1 + .../browser/browser_ext_themes_sidebars.js | 133 ++++++++++++++++++ .../extensions/test/browser/head.js | 6 + 16 files changed, 278 insertions(+), 17 deletions(-) create mode 100644 toolkit/components/extensions/test/browser/browser_ext_themes_sidebars.js diff --git a/browser/actors/LightweightThemeChild.jsm b/browser/actors/LightweightThemeChild.jsm index 3fd3675664ff..ab6cb18b9ede 100644 --- a/browser/actors/LightweightThemeChild.jsm +++ b/browser/actors/LightweightThemeChild.jsm @@ -13,6 +13,11 @@ ChromeUtils.import("resource://gre/modules/Services.jsm"); * LightweightThemeChild forwards theme data to in-content pages. */ class LightweightThemeChild extends ActorChild { + /** + * Initiate a new instance of this class from a message manager. + * It is possible to use a stub message manager for browsers that + * do not have one, like the non-remote browser sidebars. + */ constructor(mm) { super(mm); diff --git a/browser/base/content/contentTheme.js b/browser/base/content/contentTheme.js index 99e4016ec347..c43b5b7a8c5d 100644 --- a/browser/base/content/contentTheme.js +++ b/browser/base/content/contentTheme.js @@ -32,6 +32,43 @@ const inContentVariableMap = [ return `rgba(${r}, ${g}, ${b}, ${a})`; }, }], + ["--lwt-sidebar-background-color", { + lwtProperty: "sidebar", + }], + ["--lwt-sidebar-text-color", { + lwtProperty: "sidebar_text", + processColor(rgbaChannels, element) { + if (!rgbaChannels) { + element.removeAttribute("lwt-sidebar"); + element.removeAttribute("lwt-sidebar-brighttext"); + return null; + } + + element.setAttribute("lwt-sidebar", "true"); + const {r, g, b, a} = rgbaChannels; + if (!_isTextColorDark(r, g, b)) { + element.setAttribute("lwt-sidebar-brighttext", "true"); + } + + return `rgba(${r}, ${g}, ${b}, ${a})`; + }, + }], + ["--lwt-sidebar-highlight-background-color", { + lwtProperty: "sidebar_highlight", + }], + ["--lwt-sidebar-highlight-text-color", { + lwtProperty: "sidebar_highlight_text", + processColor(rgbaChannels, element) { + if (!rgbaChannels) { + element.removeAttribute("lwt-sidebar-highlight"); + return null; + } + element.setAttribute("lwt-sidebar-highlight", "true"); + + const {r, g, b, a} = rgbaChannels; + return `rgba(${r}, ${g}, ${b}, ${a})`; + }, + }], ]; /** @@ -58,7 +95,9 @@ const ContentThemeController = { if (!data) { data = {}; } - this._setProperties(document.body, data); + // XUL documents don't have a body + const element = document.body ? document.body : document.documentElement; + this._setProperties(element, data); } }, @@ -90,7 +129,7 @@ const ContentThemeController = { let value = themeData[lwtProperty]; if (processColor) { - value = processColor(value, document.body); + value = processColor(value, elem); } else if (value) { const {r, g, b, a} = value; value = `rgba(${r}, ${g}, ${b}, ${a})`; diff --git a/browser/components/places/content/bookmarksSidebar.js b/browser/components/places/content/bookmarksSidebar.js index fb34c5a6dc69..311c5b30df92 100644 --- a/browser/components/places/content/bookmarksSidebar.js +++ b/browser/components/places/content/bookmarksSidebar.js @@ -7,6 +7,7 @@ ChromeUtils.import("resource://gre/modules/Services.jsm"); ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm"); XPCOMUtils.defineLazyModuleGetters(this, { + LightweightThemeChild: "resource:///actors/LightweightThemeChild.jsm", PlacesUtils: "resource://gre/modules/PlacesUtils.jsm", PlacesUIUtils: "resource:///modules/PlacesUIUtils.jsm", PlacesTransactions: "resource://gre/modules/PlacesTransactions.jsm", @@ -25,6 +26,13 @@ function init() { document.documentElement.setAttribute("uidensity", uidensity); } + /* Listen for sidebar theme changes */ + new LightweightThemeChild({ + content: window, + chromeOuterWindowID: window.top.windowUtils.outerWindowID, + docShell: window.docShell, + }); + document.getElementById("bookmarks-view").place = "place:type=" + Ci.nsINavHistoryQueryOptions.RESULTS_AS_ROOTS_QUERY; } diff --git a/browser/components/places/content/bookmarksSidebar.xul b/browser/components/places/content/bookmarksSidebar.xul index 0bf495ca5912..bc33bd1fe676 100644 --- a/browser/components/places/content/bookmarksSidebar.xul +++ b/browser/components/places/content/bookmarksSidebar.xul @@ -30,6 +30,8 @@ src="chrome://global/content/globalOverlay.js"/>