Title: [258587] trunk
Revision
258587
Author
[email protected]
Date
2020-03-17 13:52:00 -0700 (Tue, 17 Mar 2020)

Log Message

TextTrackBase should validate language before setting m_validBCP47Language
https://bugs.webkit.org/show_bug.cgi?id=209094
<rdar://problem/60439603>

Reviewed by Jer Noble.
Source/WebCore:

Test: media/track/track-bcp-language.html

* html/track/TextTrack.idl:
* html/track/TrackBase.cpp:
(WebCore::TrackBase::TrackBase): Don't set m_validBCP47Language unless the language is valid.
(WebCore::TrackBase::setLanguage): Clear m_validBCP47Language if the language is invalid.
Restructure the code to use early returns.
(WebCore::TrackBase::validBCP47Language const): Deleted.
* html/track/TrackBase.h:
(WebCore::TrackBase::validBCP47Language const):
* testing/Internals.cpp:
(WebCore::Internals::textTrackBCP47Language):
* testing/Internals.h:
* testing/Internals.idl:

LayoutTests:

* media/track/track-bcp-language-expected.txt: Added.
* media/track/track-bcp-language.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (258586 => 258587)


--- trunk/LayoutTests/ChangeLog	2020-03-17 20:47:44 UTC (rev 258586)
+++ trunk/LayoutTests/ChangeLog	2020-03-17 20:52:00 UTC (rev 258587)
@@ -1,3 +1,14 @@
+2020-03-17  Eric Carlson  <[email protected]>
+
+        TextTrackBase should validate language before setting m_validBCP47Language
+        https://bugs.webkit.org/show_bug.cgi?id=209094
+        <rdar://problem/60439603>
+
+        Reviewed by Jer Noble.
+
+        * media/track/track-bcp-language-expected.txt: Added.
+        * media/track/track-bcp-language.html: Added.
+
 2020-03-17  Jacob Uphoff  <[email protected]>
 
         [ macOS wk2 ] imported/w3c/web-platform-tests/webrtc/RTCRtpReceiver-getSynchronizationSources.https.html is flaky failing

Added: trunk/LayoutTests/media/track/track-bcp-language-expected.txt (0 => 258587)


--- trunk/LayoutTests/media/track/track-bcp-language-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/track/track-bcp-language-expected.txt	2020-03-17 20:52:00 UTC (rev 258587)
@@ -0,0 +1,19 @@
+CONSOLE MESSAGE: line 49: The language '-sl' is not a valid BCP 47 language tag.
+CONSOLE MESSAGE: line 24: The language 'zhHant' is not a valid BCP 47 language tag.
+Test that TextTrackBase.validBCP47Language is set and reset correctly.
+
+
+EXPECTED (internals.textTrackBCP47Language(track1.track) == 'zh') OK
+EXPECTED (track1.track.language == 'zh') OK
+EXPECTED (internals.textTrackBCP47Language(track1.track) == 'zh-Hant') OK
+EXPECTED (track1.track.language == 'zh-Hant') OK
+EXPECTED (internals.textTrackBCP47Language(track1.track) == '') OK
+EXPECTED (track1.track.language == 'zhHant') OK
+EXPECTED (internals.textTrackBCP47Language(track1.track) == 'zh-cmn-Hans-CN') OK
+EXPECTED (track1.track.language == 'zh-cmn-Hans-CN') OK
+EXPECTED (internals.textTrackBCP47Language(track2.track) == '') OK
+EXPECTED (track2.track.language == '-sl') OK
+EXPECTED (internals.textTrackBCP47Language(track2.track) == 'sl-rozaj-biske') OK
+EXPECTED (track2.track.language == 'sl-rozaj-biske') OK
+END OF TEST
+

Added: trunk/LayoutTests/media/track/track-bcp-language.html (0 => 258587)


--- trunk/LayoutTests/media/track/track-bcp-language.html	                        (rev 0)
+++ trunk/LayoutTests/media/track/track-bcp-language.html	2020-03-17 20:52:00 UTC (rev 258587)
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html>
+
+    <title>BCP Language</title>
+    <script src=""
+    <script src=""
+
+    <script>
+        var test = 0;
+        if (window.testRunner)
+            testRunner.dumpAsText();
+
+        window.addEventListener('load', function() {
+            findMediaElement();
+
+            testExpected("internals.textTrackBCP47Language(track1.track)", "zh");
+            testExpected("track1.track.language", "zh");
+
+            track1.setAttribute("srclang", "zh-Hant");
+            testExpected("internals.textTrackBCP47Language(track1.track)", "zh-Hant");
+            testExpected("track1.track.language", "zh-Hant");
+
+            // Set to invalid code (country code must be <= 3)
+            track1.setAttribute("srclang", "zhHant");
+            testExpected("internals.textTrackBCP47Language(track1.track)", "");
+            testExpected("track1.track.language", "zhHant");
+
+            track1.setAttribute("srclang", "zh-cmn-Hans-CN");
+            testExpected("internals.textTrackBCP47Language(track1.track)", "zh-cmn-Hans-CN");
+            testExpected("track1.track.language", "zh-cmn-Hans-CN");
+
+            // <track> srclang attribute is invalid (invalid first character)
+            testExpected("internals.textTrackBCP47Language(track2.track)", "");
+            testExpected("track2.track.language", "-sl");
+
+            track2.setAttribute("srclang", "sl-rozaj-biske");
+            testExpected("internals.textTrackBCP47Language(track2.track)", "sl-rozaj-biske");
+            testExpected("track2.track.language", "sl-rozaj-biske");
+
+            endTest();
+        });
+
+    </script>
+
+    <body>
+        <p>Test that TextTrackBase.validBCP47Language is set and reset correctly.</p>
+        <video width="500" height="300" controls>
+            <track id="track1" kind="captions" srclang="zh" label="" />
+            <track id="track2" kind="captions" srclang="-sl" />
+        </video>
+    </body>
+</html>
+

Modified: trunk/Source/WebCore/ChangeLog (258586 => 258587)


--- trunk/Source/WebCore/ChangeLog	2020-03-17 20:47:44 UTC (rev 258586)
+++ trunk/Source/WebCore/ChangeLog	2020-03-17 20:52:00 UTC (rev 258587)
@@ -1,3 +1,26 @@
+2020-03-17  Eric Carlson  <[email protected]>
+
+        TextTrackBase should validate language before setting m_validBCP47Language
+        https://bugs.webkit.org/show_bug.cgi?id=209094
+        <rdar://problem/60439603>
+
+        Reviewed by Jer Noble.
+        
+        Test: media/track/track-bcp-language.html
+
+        * html/track/TextTrack.idl:
+        * html/track/TrackBase.cpp:
+        (WebCore::TrackBase::TrackBase): Don't set m_validBCP47Language unless the language is valid.
+        (WebCore::TrackBase::setLanguage): Clear m_validBCP47Language if the language is invalid. 
+        Restructure the code to use early returns.
+        (WebCore::TrackBase::validBCP47Language const): Deleted.
+        * html/track/TrackBase.h:
+        (WebCore::TrackBase::validBCP47Language const):
+        * testing/Internals.cpp:
+        (WebCore::Internals::textTrackBCP47Language):
+        * testing/Internals.h:
+        * testing/Internals.idl:
+
 2020-03-17  Alex Christensen  <[email protected]>
 
         REGRESSION(r254856) Add exception for window.openDatabase to not masquerade as undefined in currently shipping Jesus Calling Devotional app

Modified: trunk/Source/WebCore/html/track/TextTrack.idl (258586 => 258587)


--- trunk/Source/WebCore/html/track/TextTrack.idl	2020-03-17 20:47:44 UTC (rev 258586)
+++ trunk/Source/WebCore/html/track/TextTrack.idl	2020-03-17 20:52:00 UTC (rev 258587)
@@ -28,6 +28,7 @@
 
 [
     Conditional=VIDEO_TRACK,
+    ExportToWrappedFunction,
     GenerateIsReachable=ImplElementRoot,
     JSCustomMarkFunction,
     SkipVTableValidation,

Modified: trunk/Source/WebCore/html/track/TrackBase.cpp (258586 => 258587)


--- trunk/Source/WebCore/html/track/TrackBase.cpp	2020-03-17 20:47:44 UTC (rev 258586)
+++ trunk/Source/WebCore/html/track/TrackBase.cpp	2020-03-17 20:52:00 UTC (rev 258587)
@@ -38,6 +38,8 @@
 
 static int s_uniqueId = 0;
 
+static bool isValidBCP47LanguageTag(const String&);
+
 #if !RELEASE_LOG_DISABLED
 static RefPtr<Logger>& nullLogger()
 {
@@ -51,9 +53,11 @@
     , m_id(id)
     , m_label(label)
     , m_language(language)
-    , m_validBCP47Language(language)
 {
     ASSERT(type != BaseTrack);
+    if (isValidBCP47LanguageTag(language))
+        m_validBCP47Language = language;
+
     m_type = type;
 
 #if !RELEASE_LOG_DISABLED
@@ -129,28 +133,30 @@
     
 void TrackBase::setLanguage(const AtomString& language)
 {
-    if (!language.isEmpty() && !isValidBCP47LanguageTag(language)) {
-        String message;
-        if (language.contains((UChar)'\0'))
-            message = "The language contains a null character and is not a valid BCP 47 language tag."_s;
-        else {
-            StringBuilder stringBuilder;
-            stringBuilder.appendLiteral("The language '");
-            stringBuilder.append(language);
-            stringBuilder.appendLiteral("' is not a valid BCP 47 language tag.");
-            message = stringBuilder.toString();
-        }
-        if (auto element = this->element())
-            element->document().addConsoleMessage(MessageSource::Rendering, MessageLevel::Warning, message);
-    } else
+    m_language = language;
+    if (language.isEmpty() || isValidBCP47LanguageTag(language)) {
         m_validBCP47Language = language;
-    
-    m_language = language;
-}
+        return;
+    }
 
-AtomString TrackBase::validBCP47Language() const
-{
-    return m_validBCP47Language;
+    m_validBCP47Language = emptyAtom();
+
+    auto element = this->element();
+    if (!element)
+        return;
+
+    String message;
+    if (language.contains((UChar)'\0'))
+        message = "The language contains a null character and is not a valid BCP 47 language tag."_s;
+    else {
+        StringBuilder stringBuilder;
+        stringBuilder.appendLiteral("The language '");
+        stringBuilder.append(language);
+        stringBuilder.appendLiteral("' is not a valid BCP 47 language tag.");
+        message = stringBuilder.toString();
+    }
+
+    element->document().addConsoleMessage(MessageSource::Rendering, MessageLevel::Warning, message);
 }
 
 #if !RELEASE_LOG_DISABLED

Modified: trunk/Source/WebCore/html/track/TrackBase.h (258586 => 258587)


--- trunk/Source/WebCore/html/track/TrackBase.h	2020-03-17 20:47:44 UTC (rev 258586)
+++ trunk/Source/WebCore/html/track/TrackBase.h	2020-03-17 20:52:00 UTC (rev 258587)
@@ -59,7 +59,7 @@
     AtomString label() const { return m_label; }
     void setLabel(const AtomString& label) { m_label = label; }
 
-    AtomString validBCP47Language() const;
+    AtomString validBCP47Language() const { return m_validBCP47Language; }
     AtomString language() const { return m_language; }
     virtual void setLanguage(const AtomString&);
 

Modified: trunk/Source/WebCore/testing/Internals.cpp (258586 => 258587)


--- trunk/Source/WebCore/testing/Internals.cpp	2020-03-17 20:47:44 UTC (rev 258586)
+++ trunk/Source/WebCore/testing/Internals.cpp	2020-03-17 20:52:00 UTC (rev 258587)
@@ -237,6 +237,7 @@
 #if ENABLE(VIDEO_TRACK)
 #include "CaptionUserPreferences.h"
 #include "PageGroup.h"
+#include "TextTrack.h"
 #include "TextTrackCueGeneric.h"
 #endif
 
@@ -3769,6 +3770,11 @@
         return nullptr;
     return TextTrackCueGeneric::create(*document, MediaTime::createWithDouble(startTime), MediaTime::createWithDouble(endTime), text);
 }
+
+ExceptionOr<String> Internals::textTrackBCP47Language(TextTrack& track)
+{
+    return String { track.validBCP47Language() };
+}
 #endif
 
 #if ENABLE(VIDEO)

Modified: trunk/Source/WebCore/testing/Internals.h (258586 => 258587)


--- trunk/Source/WebCore/testing/Internals.h	2020-03-17 20:47:44 UTC (rev 258586)
+++ trunk/Source/WebCore/testing/Internals.h	2020-03-17 20:52:00 UTC (rev 258587)
@@ -98,6 +98,7 @@
 class SourceBuffer;
 class StringCallback;
 class StyleSheet;
+class TextTrack;
 class TimeRanges;
 class TypeConversions;
 class UnsuspendableActiveDOMObject;
@@ -594,6 +595,7 @@
     ExceptionOr<void> setCaptionDisplayMode(const String&);
 #if ENABLE(VIDEO_TRACK)
     RefPtr<TextTrackCueGeneric> createGenericCue(double startTime, double endTime, String text);
+    ExceptionOr<String> textTrackBCP47Language(TextTrack&);
 #endif
 
 #if ENABLE(VIDEO)

Modified: trunk/Source/WebCore/testing/Internals.idl (258586 => 258587)


--- trunk/Source/WebCore/testing/Internals.idl	2020-03-17 20:47:44 UTC (rev 258586)
+++ trunk/Source/WebCore/testing/Internals.idl	2020-03-17 20:52:00 UTC (rev 258587)
@@ -587,6 +587,7 @@
     [Conditional=VIDEO_TRACK, MayThrowException] void setPrimaryAudioTrackLanguageOverride(DOMString language);
     [Conditional=VIDEO_TRACK, MayThrowException] void setCaptionDisplayMode(DOMString mode);
     [Conditional=VIDEO_TRACK] TextTrackCueGeneric createGenericCue(double startTime, double endTime, DOMString text);
+    [Conditional=VIDEO_TRACK, MayThrowException] DOMString textTrackBCP47Language(TextTrack track);
 
     [Conditional=VIDEO] TimeRanges createTimeRanges(Float32Array startTimes, Float32Array
      endTimes);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to