From c63783cf302a599cebd333b9c414bb1bfb52c4de Mon Sep 17 00:00:00 2001 From: Martin Brennan Date: Wed, 5 Apr 2023 19:08:44 +1000 Subject: [PATCH] FIX: Error in CSS generation for anon on login_required (#20978) Followup to 6ad9e4ad060f326ddb65887427d8589ebaac9f8d, I was not aware that `site.categories` is undefined if the user is anon and the site is login_required, this handles that scenario and does not continue trying to generate CSS. --- .../category-color-css-generator.js | 5 +++++ .../app/initializers/hashtag-css-generator.js | 9 +++++++++ .../app/lib/hashtag-types/category.js | 2 +- .../tests/acceptance/css-generator-test.js | 18 +++++++++++++++++- 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/discourse/app/initializers/category-color-css-generator.js b/app/assets/javascripts/discourse/app/initializers/category-color-css-generator.js index 1fe8f98a35e..d013a06d69e 100644 --- a/app/assets/javascripts/discourse/app/initializers/category-color-css-generator.js +++ b/app/assets/javascripts/discourse/app/initializers/category-color-css-generator.js @@ -12,6 +12,11 @@ export default { initialize(container) { this.site = container.lookup("service:site"); + // If the site is login_required and the user is anon there will be no categories preloaded. + if (!this.site.categories) { + return; + } + const generatedCssVariables = [ ":root {", ...this.site.categories.map( diff --git a/app/assets/javascripts/discourse/app/initializers/hashtag-css-generator.js b/app/assets/javascripts/discourse/app/initializers/hashtag-css-generator.js index 88fc930b2cb..44739229fbe 100644 --- a/app/assets/javascripts/discourse/app/initializers/hashtag-css-generator.js +++ b/app/assets/javascripts/discourse/app/initializers/hashtag-css-generator.js @@ -14,6 +14,15 @@ export default { * ones in core are CategoryHashtagType and TagHashtagType. */ initialize(container) { + this.site = container.lookup("service:site"); + + // If the site is login_required and the user is anon there will be no categories + // preloaded, so there will be no category color CSS variables generated by + // the category-color-css-generator initializer. + if (!this.site.categories) { + return; + } + let generatedCssClasses = []; Object.values(getHashtagTypeClasses()).forEach((hashtagTypeClass) => { diff --git a/app/assets/javascripts/discourse/app/lib/hashtag-types/category.js b/app/assets/javascripts/discourse/app/lib/hashtag-types/category.js index e03b07e4124..e167da8c11d 100644 --- a/app/assets/javascripts/discourse/app/lib/hashtag-types/category.js +++ b/app/assets/javascripts/discourse/app/lib/hashtag-types/category.js @@ -9,7 +9,7 @@ export default class CategoryHashtagType extends HashtagTypeBase { } get preloadedData() { - return this.site.categories; + return this.site.categories || []; } generateColorCssClasses(model) { diff --git a/app/assets/javascripts/discourse/tests/acceptance/css-generator-test.js b/app/assets/javascripts/discourse/tests/acceptance/css-generator-test.js index 6d1d7fc1a82..d95402be050 100644 --- a/app/assets/javascripts/discourse/tests/acceptance/css-generator-test.js +++ b/app/assets/javascripts/discourse/tests/acceptance/css-generator-test.js @@ -1,4 +1,4 @@ -import { acceptance } from "discourse/tests/helpers/qunit-helpers"; +import { acceptance, exists } from "discourse/tests/helpers/qunit-helpers"; import { visit } from "@ember/test-helpers"; import { test } from "qunit"; @@ -30,3 +30,19 @@ acceptance("CSS Generator", function (needs) { ); }); }); + +acceptance( + "CSS Generator | Anon user in login_required site", + function (needs) { + needs.site({ categories: null }); + needs.settings({ login_required: true }); + + test("category CSS variables are not generated", async function (assert) { + await visit("/"); + const cssTag = document.querySelector( + "style#category-color-css-generator" + ); + assert.notOk(exists(cssTag)); + }); + } +);