diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 683e2d3146..4ab1d10e8a 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -116,6 +116,9 @@ horizontally. * Implement steps 4-10 of the [WebVTT line computation algorithm](https://www.w3.org/TR/webvtt1/#cue-computed-line). + * Stop parsing unsupported WebVTT CSS properties. The spec provides an + [exhaustive list](https://www.w3.org/TR/webvtt1/#the-cue-pseudo-element) + of which are supported. * DRM: * Add support for attaching DRM sessions to clear content in the demo app. * Remove `DrmSessionManager` references from all renderers. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/CssParser.java b/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/CssParser.java index 5efe378a9b..d87f88ce75 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/CssParser.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/CssParser.java @@ -36,7 +36,7 @@ import java.util.regex.Pattern; private static final String RULE_START = "{"; private static final String RULE_END = "}"; - private static final String PROPERTY_BGCOLOR = "background-color"; + private static final String PROPERTY_COLOR = "color"; private static final String PROPERTY_FONT_FAMILY = "font-family"; private static final String PROPERTY_FONT_WEIGHT = "font-weight"; private static final String PROPERTY_TEXT_COMBINE_UPRIGHT = "text-combine-upright"; @@ -184,10 +184,8 @@ import java.util.regex.Pattern; return; } // At this point we have a presumably valid declaration, we need to parse it and fill the style. - if ("color".equals(property)) { + if (PROPERTY_COLOR.equals(property)) { style.setFontColor(ColorParser.parseCssColor(value)); - } else if (PROPERTY_BGCOLOR.equals(property)) { - style.setBackgroundColor(ColorParser.parseCssColor(value)); } else if (PROPERTY_TEXT_COMBINE_UPRIGHT.equals(property)) { style.setCombineUpright(VALUE_ALL.equals(value) || value.startsWith(VALUE_DIGITS)); } else if (PROPERTY_TEXT_DECORATION.equals(property)) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssStyle.java b/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssStyle.java index cd08ad18cf..41b0ba650f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssStyle.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCssStyle.java @@ -16,7 +16,6 @@ package com.google.android.exoplayer2.text.webvtt; import android.graphics.Typeface; -import android.text.Layout; import android.text.TextUtils; import androidx.annotation.IntDef; import androidx.annotation.Nullable; @@ -86,15 +85,12 @@ public final class WebvttCssStyle { @Nullable private String fontFamily; private int fontColor; private boolean hasFontColor; - private int backgroundColor; - private boolean hasBackgroundColor; @OptionalBoolean private int linethrough; @OptionalBoolean private int underline; @OptionalBoolean private int bold; @OptionalBoolean private int italic; @FontSizeUnit private int fontSizeUnit; private float fontSize; - @Nullable private Layout.Alignment textAlign; private boolean combineUpright; // Calling reset() is forbidden because `this` isn't initialized. This can be safely suppressed @@ -112,13 +108,11 @@ public final class WebvttCssStyle { targetVoice = ""; fontFamily = null; hasFontColor = false; - hasBackgroundColor = false; linethrough = UNSPECIFIED; underline = UNSPECIFIED; bold = UNSPECIFIED; italic = UNSPECIFIED; fontSizeUnit = UNSPECIFIED; - textAlign = null; combineUpright = false; } @@ -244,33 +238,6 @@ public final class WebvttCssStyle { return hasFontColor; } - public int getBackgroundColor() { - if (!hasBackgroundColor) { - throw new IllegalStateException("Background color not defined."); - } - return backgroundColor; - } - - public WebvttCssStyle setBackgroundColor(int backgroundColor) { - this.backgroundColor = backgroundColor; - hasBackgroundColor = true; - return this; - } - - public boolean hasBackgroundColor() { - return hasBackgroundColor; - } - - @Nullable - public Layout.Alignment getTextAlign() { - return textAlign; - } - - public WebvttCssStyle setTextAlign(@Nullable Layout.Alignment textAlign) { - this.textAlign = textAlign; - return this; - } - public WebvttCssStyle setFontSize(float fontSize) { this.fontSize = fontSize; return this; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java b/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java index 3c974d8a41..bded70e981 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/webvtt/WebvttCueParser.java @@ -26,7 +26,6 @@ import android.text.Spanned; import android.text.SpannedString; import android.text.TextUtils; import android.text.style.AbsoluteSizeSpan; -import android.text.style.AlignmentSpan; import android.text.style.BackgroundColorSpan; import android.text.style.ForegroundColorSpan; import android.text.style.RelativeSizeSpan; @@ -647,14 +646,6 @@ public final class WebvttCueParser { end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } - if (style.hasBackgroundColor()) { - addOrReplaceSpan( - spannedText, - new BackgroundColorSpan(style.getBackgroundColor()), - start, - end, - Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - } if (style.getFontFamily() != null) { addOrReplaceSpan( spannedText, @@ -663,15 +654,6 @@ public final class WebvttCueParser { end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } - Layout.Alignment textAlign = style.getTextAlign(); - if (textAlign != null) { - addOrReplaceSpan( - spannedText, - new AlignmentSpan.Standard(textAlign), - start, - end, - Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - } switch (style.getFontSizeUnit()) { case WebvttCssStyle.FONT_SIZE_UNIT_PIXEL: addOrReplaceSpan( diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/CssParserTest.java b/library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/CssParserTest.java index 7dc41eda82..b77d4f14ab 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/CssParserTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/CssParserTest.java @@ -89,41 +89,33 @@ public final class CssParserTest { @Test public void parseMethodSimpleInput() { WebvttCssStyle expectedStyle = new WebvttCssStyle(); - String styleBlock1 = " ::cue { color : black; background-color: PapayaWhip }"; - expectedStyle.setFontColor(0xFF000000); - expectedStyle.setBackgroundColor(0xFFFFEFD5); + String styleBlock1 = " ::cue { color : PapayaWhip }"; + expectedStyle.setFontColor(0xFFFFEFD5); assertParserProduces(styleBlock1, expectedStyle); String styleBlock2 = " ::cue { color : black }\n\n::cue { color : invalid }"; expectedStyle = new WebvttCssStyle(); expectedStyle.setFontColor(0xFF000000); assertParserProduces(styleBlock2, expectedStyle); - - String styleBlock3 = "::cue {\n background-color\n:#00fFFe}"; - expectedStyle = new WebvttCssStyle(); - expectedStyle.setBackgroundColor(0xFF00FFFE); - assertParserProduces(styleBlock3, expectedStyle); } @Test public void parseMethodMultipleRulesInBlockInput() { - String styleBlock = - "::cue {\n background-color\n:#00fFFe} \n::cue {\n background-color\n:#00000000}\n"; + String styleBlock = "::cue {\n color\n:#00fFFe} \n::cue {\n color\n:#00000000}\n"; WebvttCssStyle expectedStyle = new WebvttCssStyle(); - expectedStyle.setBackgroundColor(0xFF00FFFE); + expectedStyle.setFontColor(0xFF00FFFE); WebvttCssStyle secondExpectedStyle = new WebvttCssStyle(); - secondExpectedStyle.setBackgroundColor(0x000000); + secondExpectedStyle.setFontColor(0x000000); assertParserProduces(styleBlock, expectedStyle, secondExpectedStyle); } @Test public void multiplePropertiesInBlock() { - String styleBlock = "::cue(#id){text-decoration:underline; background-color:green;" - + "color:red; font-family:Courier; font-weight:bold}"; + String styleBlock = + "::cue(#id){text-decoration:underline; color:red; font-family:Courier; font-weight:bold}"; WebvttCssStyle expectedStyle = new WebvttCssStyle(); expectedStyle.setTargetId("id"); expectedStyle.setUnderline(true); - expectedStyle.setBackgroundColor(0xFF008000); expectedStyle.setFontColor(0xFFFF0000); expectedStyle.setFontFamily("courier"); expectedStyle.setBold(true); @@ -133,12 +125,10 @@ public final class CssParserTest { @Test public void rgbaColorExpression() { - String styleBlock = "::cue(#rgb){background-color: rgba(\n10/* Ugly color */,11\t, 12\n,.1);" - + "color:rgb(1,1,\n1)}"; + String styleBlock = "::cue(#rgb){color: rgba(\n10/* Ugly color */,11\t, 12\n,.1);}"; WebvttCssStyle expectedStyle = new WebvttCssStyle(); expectedStyle.setTargetId("rgb"); - expectedStyle.setBackgroundColor(0x190A0B0C); - expectedStyle.setFontColor(0xFF010101); + expectedStyle.setFontColor(0x190A0B0C); assertParserProduces(styleBlock, expectedStyle); } @@ -222,10 +212,6 @@ public final class CssParserTest { for (int i = 0; i < expectedStyles.length; i++) { WebvttCssStyle expected = expectedStyles[i]; WebvttCssStyle actualElem = styles.get(i); - assertThat(actualElem.hasBackgroundColor()).isEqualTo(expected.hasBackgroundColor()); - if (expected.hasBackgroundColor()) { - assertThat(actualElem.getBackgroundColor()).isEqualTo(expected.getBackgroundColor()); - } assertThat(actualElem.hasFontColor()).isEqualTo(expected.hasFontColor()); if (expected.hasFontColor()) { assertThat(actualElem.getFontColor()).isEqualTo(expected.getFontColor()); @@ -236,7 +222,6 @@ public final class CssParserTest { assertThat(actualElem.getStyle()).isEqualTo(expected.getStyle()); assertThat(actualElem.isLinethrough()).isEqualTo(expected.isLinethrough()); assertThat(actualElem.isUnderline()).isEqualTo(expected.isUnderline()); - assertThat(actualElem.getTextAlign()).isEqualTo(expected.getTextAlign()); } } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoderTest.java b/library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoderTest.java index 3de75a249f..a2fcfd2f01 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoderTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/text/webvtt/WebvttDecoderTest.java @@ -371,9 +371,6 @@ public class WebvttDecoderTest { assertThat(firstCueText) .hasForegroundColorSpanBetween(0, firstCueText.length()) .withColor(ColorParser.parseCssColor("papayawhip")); - assertThat(firstCueText) - .hasBackgroundColorSpanBetween(0, firstCueText.length()) - .withColor(ColorParser.parseCssColor("green")); Spanned secondCueText = getUniqueSpanTextAt(subtitle, 2_345_000); assertThat(secondCueText.toString()).isEqualTo("This is the second subtitle."); @@ -388,7 +385,7 @@ public class WebvttDecoderTest { Spanned fourthCueText = getUniqueSpanTextAt(subtitle, 25_000_000); assertThat(fourthCueText.toString()).isEqualTo("You are an idiot\nYou don't have the guts"); assertThat(fourthCueText) - .hasBackgroundColorSpanBetween(0, "You are an idiot".length()) + .hasForegroundColorSpanBetween(0, "You are an idiot".length()) .withColor(ColorParser.parseCssColor("lime")); assertThat(fourthCueText) .hasBoldSpanBetween("You are an idiot\n".length(), fourthCueText.length()); diff --git a/testdata/src/test/assets/webvtt/with_css_styles b/testdata/src/test/assets/webvtt/with_css_styles index c2d47d8192..179f31f90c 100644 --- a/testdata/src/test/assets/webvtt/with_css_styles +++ b/testdata/src/test/assets/webvtt/with_css_styles @@ -2,7 +2,6 @@ WEBVTT STYLE ::cue { - background-color: green; color: papayawhip; } /* Style blocks cannot use blank lines nor "dash dash greater than" */ @@ -13,7 +12,7 @@ STYLE ::cue(#id2) { color: peachpuff; } -::cue(v[voice="LaGord"]) { background-color: lime } +::cue(v[voice="LaGord"]) { color: lime } STYLE ::cue(v[voice="The Frog"]) { font-weight: bold }