Commit 543995a7 authored by yoav's avatar yoav Committed by Commit bot

[preload] Split up media into video, audio and track

Align implementation with spec change https://github.com/whatwg/fetch/pull/437

PSA at https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/BN6tqGLBmuI

BUG=698521

Review-Url: https://codereview.chromium.org/2732853003
Cr-Commit-Position: refs/heads/master@{#455723}
parent 0e3dd8a2
...@@ -9,9 +9,9 @@ ...@@ -9,9 +9,9 @@
<link rel=preload href="resources/dummy.css" as=style> <link rel=preload href="resources/dummy.css" as=style>
<link rel=preload href="resources/square.png" as=image> <link rel=preload href="resources/square.png" as=image>
<link rel=preload href="/media/CanvasTest.ttf" as=font crossorigin> <link rel=preload href="/media/CanvasTest.ttf" as=font crossorigin>
<link rel=preload href="/media/white.mp4" as=media> <link rel=preload href="/media/white.mp4" as=video>
<link rel=preload href="/media/sound_5.oga" as=media> <link rel=preload href="/media/sound_5.oga" as=audio>
<link rel=preload href="/media/foo.vtt" as=media> <link rel=preload href="/media/foo.vtt" as=track>
<link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing> <link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing>
<link rel=preload href="resources/dummy.xml"> <link rel=preload href="resources/dummy.xml">
<body> <body>
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
<link rel=preload href="non-existent/Ahem.ttf" as=font crossorigin onerror="fontFailed = true;"> <link rel=preload href="non-existent/Ahem.ttf" as=font crossorigin onerror="fontFailed = true;">
<link rel=preload href="non-existent/test.mp4" as=video onerror="videoFailed = true;"> <link rel=preload href="non-existent/test.mp4" as=video onerror="videoFailed = true;">
<link rel=preload href="non-existent/test.oga" as=audio onerror="audioFailed = true;"> <link rel=preload href="non-existent/test.oga" as=audio onerror="audioFailed = true;">
<link rel=preload href="non-existent/security/captions.vtt" as=media onerror="trackFailed = true;"> <link rel=preload href="non-existent/security/captions.vtt" as=track onerror="trackFailed = true;">
<link rel=preload href="non-existent/dummy.xml" as=foobarxmlthing onerror="gibberishFailed = true;"> <link rel=preload href="non-existent/dummy.xml" as=foobarxmlthing onerror="gibberishFailed = true;">
<link rel=preload href="non-existent/dummy.xml" onerror="noTypeFailed = true;"> <link rel=preload href="non-existent/dummy.xml" onerror="noTypeFailed = true;">
<script src="resources/dummy.js?pipe=trickle(d5)"></script> <script src="resources/dummy.js?pipe=trickle(d5)"></script>
......
...@@ -19,9 +19,9 @@ ...@@ -19,9 +19,9 @@
<link rel=preload href="resources/dummy.css" as=style onload="styleLoaded = true;"> <link rel=preload href="resources/dummy.css" as=style onload="styleLoaded = true;">
<link rel=preload href="resources/square.png" as=image onload="imageLoaded = true;"> <link rel=preload href="resources/square.png" as=image onload="imageLoaded = true;">
<link rel=preload href="/media/CanvasTest.ttf" as=font crossorigin onload="fontLoaded = true;"> <link rel=preload href="/media/CanvasTest.ttf" as=font crossorigin onload="fontLoaded = true;">
<link rel=preload href="/media/white.mp4" as=media onload="videoLoaded = true;"> <link rel=preload href="/media/white.mp4" as=video onload="videoLoaded = true;">
<link rel=preload href="/media/sound_5.oga" as=media onload="audioLoaded = true;"> <link rel=preload href="/media/sound_5.oga" as=audio onload="audioLoaded = true;">
<link rel=preload href="/media/foo.vtt" as=media onload="trackLoaded = true;"> <link rel=preload href="/media/foo.vtt" as=track onload="trackLoaded = true;">
<link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing onload="gibberishLoaded = true;" onerror="gibberishErrored = true;"> <link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing onload="gibberishLoaded = true;" onerror="gibberishErrored = true;">
<link rel=preload href="resources/dummy.xml" onload="noTypeLoaded = true;"> <link rel=preload href="resources/dummy.xml" onload="noTypeLoaded = true;">
<body> <body>
......
...@@ -10,9 +10,9 @@ ...@@ -10,9 +10,9 @@
<link rel=preload href="resources/dummy.css" as=style> <link rel=preload href="resources/dummy.css" as=style>
<link rel=preload href="resources/square.png" as=image> <link rel=preload href="resources/square.png" as=image>
<link rel=preload href="/fonts/CanvasTest.ttf" as=font crossorigin> <link rel=preload href="/fonts/CanvasTest.ttf" as=font crossorigin>
<link rel=preload href="/media/white.mp4" as=media> <link rel=preload href="/media/white.mp4" as=video>
<link rel=preload href="/media/sound_5.oga" as=media> <link rel=preload href="/media/sound_5.oga" as=audio>
<link rel=preload href="/media/foo.vtt" as=media> <link rel=preload href="/media/foo.vtt" as=track>
<link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing> <link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing>
<link rel=preload href="resources/dummy.xml"> <link rel=preload href="resources/dummy.xml">
<body> <body>
......
...@@ -10,9 +10,9 @@ ...@@ -10,9 +10,9 @@
<link rel=preload href="resources/dummy.css" as=style> <link rel=preload href="resources/dummy.css" as=style>
<link rel=preload href="resources/square.png" as=image> <link rel=preload href="resources/square.png" as=image>
<link rel=preload href="/fonts/CanvasTest.ttf" as=font crossorigin> <link rel=preload href="/fonts/CanvasTest.ttf" as=font crossorigin>
<link rel=preload href="/media/white.mp4" as=media> <link rel=preload href="/media/white.mp4" as=video>
<link rel=preload href="/media/sound_5.oga" as=media> <link rel=preload href="/media/sound_5.oga" as=audio>
<link rel=preload href="/media/foo.vtt" as=media> <link rel=preload href="/media/foo.vtt" as=track>
<link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing> <link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing>
<link rel=preload href="resources/dummy.xml"> <link rel=preload href="resources/dummy.xml">
<body> <body>
......
...@@ -33,19 +33,19 @@ ...@@ -33,19 +33,19 @@
<link rel=preload href="resources/square.png" as=image type="image/png" onload="imageLoaded = true;"> <link rel=preload href="resources/square.png" as=image type="image/png" onload="imageLoaded = true;">
<link rel=preload href="/media/CanvasTest.ttf" as=font type="font/ttf" crossorigin onload="fontLoaded = true;"> <link rel=preload href="/media/CanvasTest.ttf" as=font type="font/ttf" crossorigin onload="fontLoaded = true;">
<script> <script>
document.write('<link rel=preload href="' + videoURL + '" as=media type="video/' + videoFormat + '" onload="videoLoaded = true;">'); document.write('<link rel=preload href="' + videoURL + '" as=video type="video/' + videoFormat + '" onload="videoLoaded = true;">');
document.write('<link rel=preload href="' + audioURL + '" as=media type="audio/' + audioFormat + '" onload="audioLoaded = true;">'); document.write('<link rel=preload href="' + audioURL + '" as=audio type="audio/' + audioFormat + '" onload="audioLoaded = true;">');
</script> </script>
<link rel=preload href="/media/foo.vtt" as=media type="text/vtt" onload="trackLoaded = true;"> <link rel=preload href="/media/foo.vtt" as=track type="text/vtt" onload="trackLoaded = true;">
<link rel=preload href="resources/dummy.js" as=script type="application/foobar" onload="gibberishLoaded++;"> <link rel=preload href="resources/dummy.js" as=script type="application/foobar" onload="gibberishLoaded++;">
<link rel=preload href="resources/dummy.css" as=style type="text/foobar" onload="gibberishLoaded++;"> <link rel=preload href="resources/dummy.css" as=style type="text/foobar" onload="gibberishLoaded++;">
<link rel=preload href="resources/square.png" as=image type="image/foobar" onload="gibberishLoaded++;"> <link rel=preload href="resources/square.png" as=image type="image/foobar" onload="gibberishLoaded++;">
<link rel=preload href="/media/CanvasTest.ttf" as=font type="font/foobar" crossorigin onload="gibberishLoaded++;"> <link rel=preload href="/media/CanvasTest.ttf" as=font type="font/foobar" crossorigin onload="gibberishLoaded++;">
<script> <script>
document.write('<link rel=preload href="' + videoURL + '" as=media type="video/foobar" onload="gibberishLoaded++;">'); document.write('<link rel=preload href="' + videoURL + '" as=video type="video/foobar" onload="gibberishLoaded++;">');
document.write('<link rel=preload href="' + audioURL + '" as=media type="audio/foobar" onload="gibberishLoaded++;">'); document.write('<link rel=preload href="' + audioURL + '" as=audio type="audio/foobar" onload="gibberishLoaded++;">');
</script> </script>
<link rel=preload href="/media/foo.vtt" as=media type="text/foobar" onload="gibberishLoaded++;"> <link rel=preload href="/media/foo.vtt" as=track type="text/foobar" onload="gibberishLoaded++;">
<body> <body>
<script src="resources/dummy.js?pipe=trickle(d5)"></script> <script src="resources/dummy.js?pipe=trickle(d5)"></script>
<script> <script>
......
...@@ -10,9 +10,9 @@ ...@@ -10,9 +10,9 @@
<link rel=preload href="resources/square.png" as=image> <link rel=preload href="resources/square.png" as=image>
<link rel=preload href="resources/square.png?background" as=image> <link rel=preload href="resources/square.png?background" as=image>
<link rel=preload href="/media/CanvasTest.ttf" as=font crossorigin> <link rel=preload href="/media/CanvasTest.ttf" as=font crossorigin>
<link rel=preload href="/media/white.mp4" as=media> <link rel=preload href="/media/white.mp4" as=video>
<link rel=preload href="/media/sound_5.oga" as=media> <link rel=preload href="/media/sound_5.oga" as=audio>
<link rel=preload href="/media/foo.vtt" as=media> <link rel=preload href="/media/foo.vtt" as=track>
<link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing> <link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing>
<link rel=preload href="resources/dummy.xml"> <link rel=preload href="resources/dummy.xml">
<body> <body>
......
CONSOLE WARNING: line 6: <link rel=preload> must have a valid `as` value
<!DOCTYPE html>
<script>
if (window.testRunner)
testRunner.dumpAsText();
</script>
<link rel=preload href="../resources/square.png" as=media>
<!DOCTYPE html>
<html>
<head></head>
<body>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script>
var t = async_test('Makes sure that preloaded resources are not downloaded again when used');
</script>
<link rel=preload href="../resources/dummy.js" as=script>
<link rel=preload href="../resources/dummy.css" as=style>
<link rel=preload href="../resources/square.png" as=image>
<link rel=preload href="../resources/square.png?background" as=image>
<link rel=preload href="../resources/Ahem.ttf" as=font crossorigin>
<link rel=preload href="../resources/test.mp4" as=media>
<link rel=preload href="../resources/test.oga" as=media>
<link rel=preload href="../security/resources/captions.vtt" as=track>
<link rel=preload href="../resources/dummy.xml" as=foobarxmlthing>
<link rel=preload href="../resources/dummy.xml">
<script src="../resources/slow-script.pl?delay=200"></script>
<script>
window.addEventListener("load", t.step_func(function() {
var entries = performance.getEntriesByType("resource");
for (var i = 0; i < entries.length; ++i) {
console.log(entries[i].name);
}
assert_equals(performance.getEntriesByType("resource").length, 12);
t.done();
}));
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head></head>
<body>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script>
var t = async_test('Makes sure that preloaded resources trigger the onload event');
var scriptLoaded = false;
var styleLoaded = false;
var imageLoaded = false;
var fontLoaded = false;
var videoLoaded = false;
var audioLoaded = false;
var trackLoaded = false;
var gibberishLoaded = false;
var gibberishErrored = false;
var noTypeLoaded = false;
</script>
<link rel=preload href="../resources/dummy.js" as=script onload="scriptLoaded = true;">
<link rel=preload href="../resources/dummy.css" as=style onload="styleLoaded = true;">
<link rel=preload href="../resources/square.png" as=image onload="imageLoaded = true;">
<link rel=preload href="../resources/Ahem.ttf" as=font crossorigin onload="fontLoaded = true;">
<link rel=preload href="../resources/test.mp4" as=media onload="videoLoaded = true;">
<link rel=preload href="../resources/test.oga" as=media onload="audioLoaded = true;">
<link rel=preload href="../security/resources/captions.vtt" as=track onload="trackLoaded = true;">
<link rel=preload href="../resources/dummy.xml" as=foobarxmlthing onload="gibberishLoaded = true;" onerror="gibberishErrored = true;">
<link rel=preload href="../resources/dummy.xml" onload="noTypeLoaded = true;">
<script src="../resources/slow-script.pl?delay=500"></script>
<script>
window.onload = t.step(function(){
assert_true(styleLoaded, "style triggered load event");
assert_true(scriptLoaded, "script triggered load event");
assert_true(imageLoaded, "image triggered load event");
assert_true(fontLoaded, "font triggered load event");
assert_true(videoLoaded, "video triggered load event");
assert_true(audioLoaded, "audio triggered load event");
assert_true(trackLoaded, "track triggered load event");
assert_false(gibberishLoaded, "gibberish as value triggered load event");
assert_true(gibberishErrored, "gibberish as value triggered error event");
assert_true(noTypeLoaded, "empty as triggered load event");
t.done();
});
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head></head>
<body>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script>
var t = async_test('Makes sure that preloaded resources trigger the onload event');
var scriptLoaded = false;
var styleLoaded = false;
var imageLoaded = false;
var fontLoaded = false;
var videoLoaded = false;
var audioLoaded = false;
var trackLoaded = false;
var gibberishLoaded = 0;
</script>
<link rel=preload href="../resources/dummy.js" as=script type="text/javascript" onload="scriptLoaded = true;">
<link rel=preload href="../resources/dummy.css" as=style type="text/css" onload="styleLoaded = true;">
<link rel=preload href="../resources/square.png" as=image type="image/png" onload="imageLoaded = true;">
<link rel=preload href="../resources/Ahem.ttf" as=font type="font/ttf" crossorigin onload="fontLoaded = true;">
<link rel=preload href="../resources/test.webm" as=media type="video/webm" onload="videoLoaded = true;">
<link rel=preload href="../resources/test.wav" as=media type="audio/wav" onload="audioLoaded = true;">
<link rel=preload href="../security/resources/captions.vtt" as=track type="text/vtt" onload="trackLoaded = true;">
<link rel=preload href="../resources/dummy.js" as=script type="application/foobar" onload="gibberishLoaded++;">
<link rel=preload href="../resources/dummy.css" as=style type="text/foobar" onload="gibberishLoaded++;">
<link rel=preload href="../resources/square.png" as=image type="image/foobar" onload="gibberishLoaded++;">
<link rel=preload href="../resources/Ahem.ttf" as=font type="font/foobar" crossorigin onload="gibberishLoaded++;">
<link rel=preload href="../resources/test.webm" as=media type="video/foobar" onload="gibberishLoaded++;">
<link rel=preload href="../resources/test.wav" as=media type="audio/foobar" onload="gibberishLoaded++;">
<link rel=preload href="../security/resources/captions.vtt" as=track type="text/foobar" onload="gibberishLoaded++;">
<script src="../resources/slow-script.pl?delay=500"></script>
<script>
window.onload = t.step(function(){
assert_true(styleLoaded, "style triggered load event");
assert_true(scriptLoaded, "script triggered load event");
assert_true(imageLoaded, "image triggered load event");
assert_true(fontLoaded, "font triggered load event");
assert_true(videoLoaded, "video triggered load event");
assert_true(audioLoaded, "audio triggered load event");
assert_true(trackLoaded, "track triggered load event");
assert_equals(gibberishLoaded, 0, "resources with gibberish type should not be loaded");
t.done();
});
</script>
</body>
</html>
<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script>
var t = async_test('Makes sure that preloaded resources are not downloaded again when used');
</script>
<link rel=preload href="../resources/dummy.js" as=script>
<link rel=preload href="../resources/dummy.css" as=style>
<link rel=preload href="../resources/square.png" as=image>
<link rel=preload href="../resources/square.png?background" as=image>
<link rel=preload href="../resources/Ahem.ttf" as=font crossorigin>
<link rel=preload href="../resources/test.mp4" as=media>
<link rel=preload href="../resources/test.oga" as=media>
<link rel=preload href="../security/resources/captions.vtt" as=track>
<link rel=preload href="../resources/dummy.xml" as=foobarxmlthing>
<link rel=preload href="../resources/dummy.xml">
<script src="../resources/slow-script.pl?delay=200"></script>
<style>
#background {
width: 200px;
height: 200px;
background-image: url(../resources/square.png?background);
}
@font-face {
font-family:ahem;
src: url(../resources/Ahem.ttf);
}
span { font-family: ahem, Arial; }
</style>
<link rel="stylesheet" href="../resources/dummy.css">
<script src="../resources/dummy.js"></script>
<div id="background"></div>
<img src="../resources/square.png">
<script src="../resources/slow-script.pl?delay=200"></script>
<video src="../resources/test.mp4">
<track kind=subtitles src="../security/resources/captions.vtt" srclang=en>
</video>
<audio src="../resources/test.oga"></audio>
<script>
var xhr = new XMLHttpRequest();
xhr.open("GET", "../resources/dummy.xml");
xhr.send();
window.addEventListener("load", t.step_func(function() {
// Audio and video show 2 extra requests as the main request is followed by a range request
assert_equals(performance.getEntriesByType("resource").length, 14);
t.done();
}));
</script>
<span>PASS - this text is here just so that the browser will download the font.</span
...@@ -750,7 +750,7 @@ TEST_F(HTMLPreloadScannerTest, testLinkRelPreload) { ...@@ -750,7 +750,7 @@ TEST_F(HTMLPreloadScannerTest, testLinkRelPreload) {
{"http://example.test", {"http://example.test",
"<link rel=preload href=bla as=font type='font/bla'>", nullptr, "<link rel=preload href=bla as=font type='font/bla'>", nullptr,
"http://example.test/", Resource::Font, 0}, "http://example.test/", Resource::Font, 0},
{"http://example.test", "<link rel=preload href=bla as=media>", "bla", {"http://example.test", "<link rel=preload href=bla as=video>", "bla",
"http://example.test/", Resource::Media, 0}, "http://example.test/", Resource::Media, 0},
{"http://example.test", "<link rel=preload href=bla as=track>", "bla", {"http://example.test", "<link rel=preload href=bla as=track>", "bla",
"http://example.test/", Resource::TextTrack, 0}, "http://example.test/", Resource::TextTrack, 0},
......
...@@ -193,8 +193,12 @@ WTF::Optional<Resource::Type> LinkLoader::getResourceTypeFromAsAttribute( ...@@ -193,8 +193,12 @@ WTF::Optional<Resource::Type> LinkLoader::getResourceTypeFromAsAttribute(
return Resource::Script; return Resource::Script;
} else if (as == "style") { } else if (as == "style") {
return Resource::CSSStyleSheet; return Resource::CSSStyleSheet;
} else if (as == "media") { } else if (as == "video") {
return Resource::Media; return Resource::Media;
} else if (as == "audio") {
return Resource::Media;
} else if (as == "track") {
return Resource::TextTrack;
} else if (as == "font") { } else if (as == "font") {
return Resource::Font; return Resource::Font;
} else if (as == "track") { } else if (as == "track") {
......
...@@ -105,10 +105,10 @@ TEST(LinkLoaderTest, Preload) { ...@@ -105,10 +105,10 @@ TEST(LinkLoaderTest, Preload) {
true, ReferrerPolicyDefault}, true, ReferrerPolicyDefault},
// TODO(yoav): It doesn't seem like the audio context is ever used. That // TODO(yoav): It doesn't seem like the audio context is ever used. That
// should probably be fixed (or we can consolidate audio and video). // should probably be fixed (or we can consolidate audio and video).
{"http://example.test/cat.wav", "media", "", "", ReferrerPolicyDefault, {"http://example.test/cat.wav", "audio", "", "", ReferrerPolicyDefault,
ResourceLoadPriorityLow, WebURLRequest::RequestContextVideo, true, true, ResourceLoadPriorityLow, WebURLRequest::RequestContextVideo, true, true,
ReferrerPolicyDefault}, ReferrerPolicyDefault},
{"http://example.test/cat.mp4", "media", "", "", ReferrerPolicyDefault, {"http://example.test/cat.mp4", "video", "", "", ReferrerPolicyDefault,
ResourceLoadPriorityLow, WebURLRequest::RequestContextVideo, true, true, ResourceLoadPriorityLow, WebURLRequest::RequestContextVideo, true, true,
ReferrerPolicyDefault}, ReferrerPolicyDefault},
{"http://example.test/cat.vtt", "track", "", "", ReferrerPolicyDefault, {"http://example.test/cat.vtt", "track", "", "", ReferrerPolicyDefault,
...@@ -151,16 +151,16 @@ TEST(LinkLoaderTest, Preload) { ...@@ -151,16 +151,16 @@ TEST(LinkLoaderTest, Preload) {
{"http://example.test/cat.css", "style", "text/sass", "", {"http://example.test/cat.css", "style", "text/sass", "",
ReferrerPolicyDefault, ResourceLoadPriorityUnresolved, ReferrerPolicyDefault, ResourceLoadPriorityUnresolved,
WebURLRequest::RequestContextStyle, false, false, ReferrerPolicyDefault}, WebURLRequest::RequestContextStyle, false, false, ReferrerPolicyDefault},
{"http://example.test/cat.wav", "media", "audio/wav", "", {"http://example.test/cat.wav", "audio", "audio/wav", "",
ReferrerPolicyDefault, ResourceLoadPriorityLow, ReferrerPolicyDefault, ResourceLoadPriorityLow,
WebURLRequest::RequestContextVideo, true, true, ReferrerPolicyDefault}, WebURLRequest::RequestContextVideo, true, true, ReferrerPolicyDefault},
{"http://example.test/cat.wav", "media", "audio/mp57", "", {"http://example.test/cat.wav", "audio", "audio/mp57", "",
ReferrerPolicyDefault, ResourceLoadPriorityUnresolved, ReferrerPolicyDefault, ResourceLoadPriorityUnresolved,
WebURLRequest::RequestContextVideo, false, false, ReferrerPolicyDefault}, WebURLRequest::RequestContextVideo, false, false, ReferrerPolicyDefault},
{"http://example.test/cat.webm", "media", "video/webm", "", {"http://example.test/cat.webm", "video", "video/webm", "",
ReferrerPolicyDefault, ResourceLoadPriorityLow, ReferrerPolicyDefault, ResourceLoadPriorityLow,
WebURLRequest::RequestContextVideo, true, true, ReferrerPolicyDefault}, WebURLRequest::RequestContextVideo, true, true, ReferrerPolicyDefault},
{"http://example.test/cat.mp199", "media", "video/mp199", "", {"http://example.test/cat.mp199", "video", "video/mp199", "",
ReferrerPolicyDefault, ResourceLoadPriorityUnresolved, ReferrerPolicyDefault, ResourceLoadPriorityUnresolved,
WebURLRequest::RequestContextVideo, false, false, ReferrerPolicyDefault}, WebURLRequest::RequestContextVideo, false, false, ReferrerPolicyDefault},
{"http://example.test/cat.vtt", "track", "text/vtt", "", {"http://example.test/cat.vtt", "track", "text/vtt", "",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment