diff --git a/polygerrit-ui/app/elements/custom-dark-theme_test.js b/polygerrit-ui/app/elements/custom-dark-theme_test.js index 31c78a17c0..cc955ce68a 100644 --- a/polygerrit-ui/app/elements/custom-dark-theme_test.js +++ b/polygerrit-ui/app/elements/custom-dark-theme_test.js @@ -16,32 +16,45 @@ */ import '../test/common-test-setup-karma.js'; +import {getComputedStyleValue} from '../utils/dom-util.js'; import './shared/gr-rest-api-interface/gr-rest-api-interface.js'; import './gr-app.js'; import {pluginLoader} from './shared/gr-js-api-interface/gr-plugin-loader.js'; +import {removeTheme} from '../styles/themes/dark-theme.js'; + const basicFixture = fixtureFromElement('gr-app'); + suite('gr-app custom dark theme tests', () => { let sandbox; + let element; setup(done => { window.localStorage.setItem('dark-theme', 'true'); sandbox = sinon.sandbox.create(); - basicFixture.instantiate(); + element = basicFixture.instantiate(); pluginLoader.loadPlugins([]); pluginLoader.awaitPluginsLoaded().then(() => flush(done)); }); + teardown(() => { sandbox.restore(); window.localStorage.removeItem('dark-theme'); - const addedTheme = document - .querySelector('link[href="/styles/themes/dark-theme.html"]'); - if (addedTheme) { - addedTheme.remove(); - } + removeTheme(); }); test('should tried to load dark theme', () => { assert.isTrue( - !!document.querySelector('link[href="/styles/themes/dark-theme.html"]') + !!document.head.querySelector('#dark-theme') ); }); + + test('applies the right theme', () => { + assert.equal( + getComputedStyleValue('--header-background-color', element) + .toLowerCase(), + '#3b3d3f'); + assert.equal( + getComputedStyleValue('--footer-background-color', element) + .toLowerCase(), + '#3b3d3f'); + }); }); \ No newline at end of file diff --git a/polygerrit-ui/app/elements/custom-light-theme_test.js b/polygerrit-ui/app/elements/custom-light-theme_test.js index fa1f93f455..a866bb3e12 100644 --- a/polygerrit-ui/app/elements/custom-light-theme_test.js +++ b/polygerrit-ui/app/elements/custom-light-theme_test.js @@ -20,6 +20,7 @@ import {getComputedStyleValue} from '../utils/dom-util.js'; import './shared/gr-rest-api-interface/gr-rest-api-interface.js'; import './gr-app.js'; import {pluginLoader} from './shared/gr-js-api-interface/gr-plugin-loader.js'; + const basicFixture = fixtureFromElement('gr-app'); suite('gr-app custom light theme tests', () => { @@ -45,16 +46,11 @@ suite('gr-app custom light theme tests', () => { }); test('should not load dark theme', () => { - assert.isFalse( - !!document.querySelector('link[href="/styles/themes/dark-theme.html"]') - ); + assert.isFalse(!!document.head.querySelector('#dark-theme')); + assert.isTrue(!!document.head.querySelector('#light-theme')); }); test('applies the right theme', () => { - assert.equal( - getComputedStyleValue('--primary-text-color', element) - .toLowerCase(), - 'black'); assert.equal( getComputedStyleValue('--header-background-color', element) .toLowerCase(), diff --git a/polygerrit-ui/app/elements/gr-app-element.js b/polygerrit-ui/app/elements/gr-app-element.js index 4915eda00c..91af97c077 100644 --- a/polygerrit-ui/app/elements/gr-app-element.js +++ b/polygerrit-ui/app/elements/gr-app-element.js @@ -16,6 +16,7 @@ */ import '../styles/shared-styles.js'; import '../styles/themes/app-theme.js'; +import {applyTheme as applyDarkTheme} from '../styles/themes/dark-theme.js'; import './admin/gr-admin-view/gr-admin-view.js'; import './documentation/gr-documentation-search/gr-documentation-search.js'; import './change-list/gr-change-list-view/gr-change-list-view.js'; @@ -202,9 +203,7 @@ class GrAppElement extends mixinBehaviors( [ }); if (window.localStorage.getItem('dark-theme')) { - // No need to add the style module to element again as it's imported - // by importHref already - this.$.libLoader.getDarkTheme(); + applyDarkTheme(); } // Note: this is evaluated here to ensure that it only happens after the diff --git a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view.js b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view.js index 95f7a2c06d..0e8c68af46 100644 --- a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view.js +++ b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view.js @@ -20,6 +20,7 @@ import '../../../styles/gr-form-styles.js'; import '../../../styles/gr-menu-page-styles.js'; import '../../../styles/gr-page-nav-styles.js'; import '../../../styles/shared-styles.js'; +import {applyTheme as applyDarkTheme, removeTheme as removeDarkTheme} from '../../../styles/themes/dark-theme.js'; import '../../plugins/gr-endpoint-decorator/gr-endpoint-decorator.js'; import '../gr-change-table-editor/gr-change-table-editor.js'; import '../../shared/gr-button/gr-button.js'; @@ -68,8 +69,6 @@ const GERRIT_DOCS_FILTER_PATH = '/user-notify.html'; const ABSOLUTE_URL_PATTERN = /^https?:/; const TRAILING_SLASH_PATTERN = /\/$/; -const RELOAD_MESSAGE = 'Reloading...'; - const HTTP_AUTH = [ 'HTTP', 'HTTP_LDAP', @@ -475,17 +474,19 @@ class GrSettingsView extends mixinBehaviors( [ _handleToggleDark() { if (this._isDark) { window.localStorage.removeItem('dark-theme'); + removeDarkTheme(); } else { window.localStorage.setItem('dark-theme', 'true'); + applyDarkTheme(); } + this._isDark = !!window.localStorage.getItem('dark-theme'); this.dispatchEvent(new CustomEvent('show-alert', { - detail: {message: RELOAD_MESSAGE}, + detail: { + message: `Theme changed to ${this._isDark ? 'dark' : 'light'}.`, + }, bubbles: true, composed: true, })); - this.async(() => { - window.location.reload(); - }, 1); } _showHttpAuth(config) { diff --git a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.html b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.js similarity index 90% rename from polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.html rename to polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.js index e430ecbd0a..09ad0e371d 100644 --- a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.html +++ b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.js @@ -1,46 +1,28 @@ - - - - - -gr-settings-view - - - - - - - - - - - - - - - +}); \ No newline at end of file diff --git a/polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader.js b/polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader.js index e9cd441b9e..3c3fc6ad0d 100644 --- a/polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader.js +++ b/polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader.js @@ -15,7 +15,6 @@ * limitations under the License. */ import '../gr-js-api-interface/gr-js-api-interface.js'; -import {importHref} from '../../../scripts/import-href.js'; import {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js'; import {GestureEventListeners} from '@polymer/polymer/lib/mixins/gesture-event-listeners.js'; import {LegacyElementMixin} from '@polymer/polymer/lib/legacy/legacy-element-mixin.js'; @@ -23,7 +22,6 @@ import {PolymerElement} from '@polymer/polymer/polymer-element.js'; import {htmlTemplate} from './gr-lib-loader_html.js'; const HLJS_PATH = 'bower_components/highlightjs/highlight.min.js'; -const DARK_THEME_PATH = 'styles/themes/dark-theme.html'; /** @extends PolymerElement */ class GrLibLoader extends GestureEventListeners( @@ -75,28 +73,6 @@ class GrLibLoader extends GestureEventListeners( }); } - /** - * Loads the dark theme document. Returns a promise that resolves with a - * custom-style DOM element. - * - * @return {!Promise} - * @suppress {checkTypes} - */ - getDarkTheme() { - return new Promise((resolve, reject) => { - importHref( - this._getLibRoot() + DARK_THEME_PATH, () => { - const module = document.createElement('style'); - module.setAttribute('include', 'dark-theme'); - const cs = document.createElement('custom-style'); - cs.appendChild(module); - - resolve(cs); - }, - reject); - }); - } - /** * Execute callbacks awaiting the HLJS lib load. */ diff --git a/polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader_test.html b/polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader_test.js similarity index 68% rename from polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader_test.html rename to polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader_test.js index f2e5e3dfb6..6208252064 100644 --- a/polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader_test.html +++ b/polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader_test.js @@ -1,39 +1,25 @@ - - - - - -gr-lib-loader - - - - - - - - - - - +}); \ No newline at end of file diff --git a/polygerrit-ui/app/rules.bzl b/polygerrit-ui/app/rules.bzl index bc2830d7ee..5ccf92d54f 100644 --- a/polygerrit-ui/app/rules.bzl +++ b/polygerrit-ui/app/rules.bzl @@ -45,15 +45,6 @@ def polygerrit_bundle(name, srcs, outs, entry_point): srcs = native.glob(["styles/**/*.css"]), ) - native.filegroup( - name = name + "_theme_sources", - srcs = native.glob( - ["styles/themes/*.html"], - # app-theme.html already included via an import in gr-app.html. - exclude = ["styles/themes/app-theme.html"], - ), - ) - native.filegroup( name = name + "_top_sources", srcs = [ @@ -68,7 +59,6 @@ def polygerrit_bundle(name, srcs, outs, entry_point): srcs = [ name + "_app_sources", name + "_css_sources", - name + "_theme_sources", name + "_top_sources", "//lib/fonts:robotofonts", "//lib/js:highlightjs__files", @@ -84,7 +74,6 @@ def polygerrit_bundle(name, srcs, outs, entry_point): "cp $(locations //lib/fonts:robotofonts) $$TMP/polygerrit_ui/fonts/", "for f in $(locations " + name + "_top_sources); do cp $$f $$TMP/polygerrit_ui/; done", "for f in $(locations " + name + "_css_sources); do cp $$f $$TMP/polygerrit_ui/styles; done", - "for f in $(locations " + name + "_theme_sources); do cp $$f $$TMP/polygerrit_ui/styles/themes; done", "for f in $(locations //lib/js:highlightjs__files); do cp $$f $$TMP/polygerrit_ui/bower_components/highlightjs/ ; done", "cp $(location @ui_npm//:node_modules/@webcomponents/webcomponentsjs/webcomponents-lite.js) $$TMP/polygerrit_ui/bower_components/webcomponentsjs/webcomponents-lite.js", "cp $$FONT_DIR/roboto/*.ttf $$TMP/polygerrit_ui/fonts/roboto/", diff --git a/polygerrit-ui/app/styles/themes/app-theme.js b/polygerrit-ui/app/styles/themes/app-theme.js index 718d6a5e73..1a8296f636 100644 --- a/polygerrit-ui/app/styles/themes/app-theme.js +++ b/polygerrit-ui/app/styles/themes/app-theme.js @@ -16,217 +16,211 @@ */ const $_documentContainer = document.createElement('template'); -$_documentContainer.innerHTML = ``; -document.head.appendChild($_documentContainer.content); - -/* - FIXME(polymer-modulizer): the above comments were extracted - from HTML and may be out of place here. Review them and - then delete this comment! -*/ - +document.head.appendChild($_documentContainer.content); \ No newline at end of file diff --git a/polygerrit-ui/app/styles/themes/dark-theme.html b/polygerrit-ui/app/styles/themes/dark-theme.js similarity index 82% rename from polygerrit-ui/app/styles/themes/dark-theme.html rename to polygerrit-ui/app/styles/themes/dark-theme.js index 18b2fd6e85..6968b12cc7 100644 --- a/polygerrit-ui/app/styles/themes/dark-theme.html +++ b/polygerrit-ui/app/styles/themes/dark-theme.js @@ -1,21 +1,24 @@ - - - - + `; + + return $_documentContainer; +} + +export function applyTheme() { + document.head.appendChild(getStyleEl().content); +} + +export function removeTheme() { + const darkThemeEls = document.head.querySelectorAll('#dark-theme'); + if (darkThemeEls.length) { + darkThemeEls.forEach(darkThemeEl => darkThemeEl.remove()); + } +} diff --git a/polygerrit-ui/app/test/tests.js b/polygerrit-ui/app/test/tests.js index 2d795eca4a..712b48dbc1 100644 --- a/polygerrit-ui/app/test/tests.js +++ b/polygerrit-ui/app/test/tests.js @@ -143,7 +143,6 @@ const elements = [ 'settings/gr-identities/gr-identities_test.html', 'settings/gr-menu-editor/gr-menu-editor_test.html', 'settings/gr-registration-dialog/gr-registration-dialog_test.html', - 'settings/gr-settings-view/gr-settings-view_test.html', 'settings/gr-ssh-editor/gr-ssh-editor_test.html', 'settings/gr-watched-projects-editor/gr-watched-projects-editor_test.html', 'shared/gr-account-entry/gr-account-entry_test.html', @@ -185,7 +184,6 @@ const elements = [ 'shared/gr-fixed-panel/gr-fixed-panel_test.html', 'shared/gr-labeled-autocomplete/gr-labeled-autocomplete_test.html', 'shared/gr-label-info/gr-label-info_test.html', - 'shared/gr-lib-loader/gr-lib-loader_test.html', 'shared/gr-limited-text/gr-limited-text_test.html', 'shared/gr-linked-chip/gr-linked-chip_test.html', 'shared/gr-linked-text/gr-linked-text_test.html',