diff --git a/feature/mail/message/reader/impl/src/androidHostTest/kotlin/net/thunderbird/feature/mail/message/reader/impl/css/DefaultGlobalCssStyleProviderTest.kt b/feature/mail/message/reader/impl/src/androidHostTest/kotlin/net/thunderbird/feature/mail/message/reader/impl/css/DefaultGlobalCssStyleProviderTest.kt index 99ed82712e8..4e23b4537e3 100644 --- a/feature/mail/message/reader/impl/src/androidHostTest/kotlin/net/thunderbird/feature/mail/message/reader/impl/css/DefaultGlobalCssStyleProviderTest.kt +++ b/feature/mail/message/reader/impl/src/androidHostTest/kotlin/net/thunderbird/feature/mail/message/reader/impl/css/DefaultGlobalCssStyleProviderTest.kt @@ -2,6 +2,7 @@ package net.thunderbird.feature.mail.message.reader.impl.css import assertk.assertThat import assertk.assertions.contains +import assertk.assertions.doesNotContain import kotlin.test.Test import net.thunderbird.core.common.mail.html.HtmlSettings import net.thunderbird.feature.mail.message.reader.api.css.CssClassNameProvider @@ -9,16 +10,42 @@ import net.thunderbird.feature.mail.message.reader.api.css.CssVariableNameProvid class DefaultGlobalCssStyleProviderTest { + @Test + fun `style should advertise light only color scheme when dark mode is enabled`() { + // Arrange + val testSubject = createTestSubject() + + // Act + val style = testSubject.create(createHtmlSettings(useDarkMode = true)).style + + // Assert + assertThat(style).contains(":root { color-scheme: only light; }") + } + + @Test + fun `style should not override color scheme when dark mode is disabled`() { + // Arrange + val testSubject = createTestSubject() + + // Act + val style = testSubject.create(createHtmlSettings(useDarkMode = false)).style + + // Assert + assertThat(style).doesNotContain("color-scheme") + } + @Test fun `style should set main content box sizing to border box`() { // Arrange val testSubject = createTestSubject() // Act - val style = testSubject.create(createHtmlSettings()).style + val styles = createStylesForBothThemeConfigurations(testSubject) // Assert - assertThat(style).contains("box-sizing: border-box") + styles.forEach { style -> + assertThat(style).contains("box-sizing: border-box") + } } @Test @@ -27,12 +54,16 @@ class DefaultGlobalCssStyleProviderTest { val testSubject = createTestSubject() // Act - val style = testSubject.create(createHtmlSettings()).style - val mainContentRule = style.mainContentRule() + val styles = createStylesForBothThemeConfigurations(testSubject) // Assert - assertThat(mainContentRule).contains("width: 100%") - assertThat(mainContentRule).contains("padding: 0 8px") + styles.forEach { style -> + val mainContentRule = style.mainContentRule() + + assertThat(mainContentRule).contains("width: 100%") + assertThat(mainContentRule).contains("overflow-wrap: break-word") + assertThat(mainContentRule).contains("padding: 0 8px") + } } @Test @@ -41,10 +72,45 @@ class DefaultGlobalCssStyleProviderTest { val testSubject = createTestSubject() // Act - val style = testSubject.create(createHtmlSettings()).style + val styles = createStylesForBothThemeConfigurations(testSubject) + + // Assert + styles.forEach { style -> + assertThat(style).contains("white-space: pre-wrap") + } + } + + @Test + fun `style should preserve selectable content`() { + // Arrange + val testSubject = createTestSubject() + + // Act + val styles = createStylesForBothThemeConfigurations(testSubject) + + // Assert + styles.forEach { style -> + assertThat(style).contains("\n user-select: auto;\n") + assertThat(style).contains("-webkit-user-select: auto") + } + } + + @Test + fun `style should preserve blockquote styling`() { + // Arrange + val testSubject = createTestSubject() + + // Act + val styles = createStylesForBothThemeConfigurations(testSubject) // Assert - assertThat(style).contains("white-space: pre-wrap") + styles.forEach { style -> + assertThat(style).contains("margin: auto 0 auto 0.8ex !important") + assertThat(style).contains("padding-left: 1ex !important") + assertThat(style).contains("border-left-width: 1px !important") + assertThat(style).contains("border-left-style: solid !important") + assertThat(style).contains("border-left-color: var(--blockquote-default-border-left-color, #ccc)") + } } private fun createTestSubject(): DefaultGlobalCssStyleProvider.Factory { @@ -54,9 +120,18 @@ class DefaultGlobalCssStyleProviderTest { ) } - private fun createHtmlSettings(): HtmlSettings { + private fun createStylesForBothThemeConfigurations( + testSubject: DefaultGlobalCssStyleProvider.Factory, + ): List { + return listOf( + testSubject.create(createHtmlSettings(useDarkMode = false)).style, + testSubject.create(createHtmlSettings(useDarkMode = true)).style, + ) + } + + private fun createHtmlSettings(useDarkMode: Boolean): HtmlSettings { return HtmlSettings( - useDarkMode = false, + useDarkMode = useDarkMode, useFixedWidthFont = false, ) } diff --git a/feature/mail/message/reader/impl/src/commonMain/kotlin/net/thunderbird/feature/mail/message/reader/impl/css/DefaultGlobalCssStyleProvider.kt b/feature/mail/message/reader/impl/src/commonMain/kotlin/net/thunderbird/feature/mail/message/reader/impl/css/DefaultGlobalCssStyleProvider.kt index 35a9fb20e8a..da5b69d86f8 100644 --- a/feature/mail/message/reader/impl/src/commonMain/kotlin/net/thunderbird/feature/mail/message/reader/impl/css/DefaultGlobalCssStyleProvider.kt +++ b/feature/mail/message/reader/impl/src/commonMain/kotlin/net/thunderbird/feature/mail/message/reader/impl/css/DefaultGlobalCssStyleProvider.kt @@ -10,10 +10,12 @@ import org.intellij.lang.annotations.Language internal class DefaultGlobalCssStyleProvider private constructor( cssClassNameProvider: CssClassNameProvider, cssVariableNameProvider: CssVariableNameProvider, + useDarkMode: Boolean, ) : GlobalCssStyleProvider { @Language("HTML") override val style: String = """ |