<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[170379] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/170379">170379</a></dd>
<dt>Author</dt> <dd>eric.carlson@apple.com</dd>
<dt>Date</dt> <dd>2014-06-24 12:35:47 -0700 (Tue, 24 Jun 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Mac] process raw VTT in-band captions
https://bugs.webkit.org/show_bug.cgi?id=134178

Reviewed by Jer Noble.

* CMakeLists.txt: Add ISOVTTCue.cpp|h.
* WebCore.vcxproj/WebCore.vcxproj: Ditto.
* WebCore.xcodeproj/project.pbxproj: Ditto.

* html/track/BufferedLineReader.h:
(WebCore::BufferedLineReader::reset): New, empty the input buffer.

Make it possible to process WebVTT captions. 
* html/track/InbandGenericTextTrack.cpp:
(WebCore::InbandGenericTextTrack::parser): Allocate, if necessary, and return a WebVTT parser.
(WebCore::InbandGenericTextTrack::parseWebVTTCueData): Pass a cue to the parser.
(WebCore::InbandGenericTextTrack::parseWebVTTFileHeader): Pass a VTT file header to the parser.
(WebCore::InbandGenericTextTrack::newCuesParsed): Parser callback.
(WebCore::InbandGenericTextTrack::newRegionsParsed): Ditto.
(WebCore::InbandGenericTextTrack::fileFailedToParse): Ditto.
* html/track/InbandGenericTextTrack.h:

* html/track/InbandTextTrack.h:

* html/track/InbandWebVTTTextTrack.cpp:
(WebCore::InbandWebVTTTextTrack::parser): New, parser accessor.
(WebCore::InbandWebVTTTextTrack::parseWebVTTCueData): New, parse VTT data in an ISOWebVTTCue
    object.
(WebCore::InbandWebVTTTextTrack::newCuesParsed): Cleanup.
(WebCore::InbandWebVTTTextTrack::newRegionsParsed): Implement.
(WebCore::InbandWebVTTTextTrack::fileFailedToParse): Change the error message.
* html/track/InbandWebVTTTextTrack.h:

* html/track/TextTrackCueGeneric.cpp:
(WebCore::TextTrackCueGenericBoxElement::TextTrackCueGenericBoxElement): Change cue parameter
    from a pointer to a reference.
(WebCore::TextTrackCueGeneric::createDisplayTree): Ditto.

* html/track/VTTCue.cpp:
(WebCore::VTTCueBox::create): Change cue parameter from a pointer to a reference.
(WebCore::VTTCueBox::VTTCueBox): Ditto.
(WebCore::VTTCueBox::getCue): Return a reference.
(WebCore::VTTCueBox::applyCSSProperties): m_cue is a reference, not a pointer.
(WebCore::VTTCue::create): New, create a VTTCue from WebVTTCueData.
(WebCore::VTTCue::VTTCue): New, internal constructor that takes a WebVTTCueData.
(WebCore::VTTCue::initialize): New, shared constructor initialization.
(WebCore::VTTCue::createDisplayTree): m_cue is a reference, not a pointer.
(WebCore::VTTCue::markFutureAndPastNodes): Ditto.
(WebCore::VTTCue::setCueSettings): Ditto.
* html/track/VTTCue.h:
(WebCore::VTTCueBox::create): Deleted.
(WebCore::VTTCue::create): Deleted.

* html/track/WebVTTParser.cpp:
(WebCore::WebVTTParser::parseFileHeader): New. Reset the line reader buffer and parser state, 
    call the parser.
(WebCore::WebVTTParser::parseCueData): Create a cue from ISOWebVTTCue.
(WebCore::WebVTTParser::collectTimingsAndSettings): Return immediately if the string is empty.
(WebCore::WebVTTParser::collectTimeStamp): Ditto.
* html/track/WebVTTParser.h:
(WebCore::WebVTTCueData::originalStartTime): New.
(WebCore::WebVTTCueData::setOriginalStartTime): New.
(WebCore::WebVTTCueData::WebVTTCueData):

* loader/TextTrackLoader.cpp:
(WebCore::TextTrackLoader::getNewCues): Cleanup, use the new VTTCue::create.

Parse ISO WebVTT cue boxes.
* platform/graphics/ISOVTTCue.cpp: Added.
(WebCore::ISOBox::ISOBox):
(WebCore::ISOBox::peekType):
(WebCore::ISOBox::peekLength):
(WebCore::ISOBox::peekString):
(WebCore::vttCueBoxType):
(WebCore::vttIdBoxType):
(WebCore::vttSettingsBoxType):
(WebCore::vttPayloadBoxType):
(WebCore::vttCurrentTimeBoxType):
(WebCore::vttCueSourceIDBoxType):
(WebCore::ISOWebVTTCue::boxType):
(WebCore::ISOWebVTTCue::ISOWebVTTCue):
* platform/graphics/ISOVTTCue.h: Added.
(WebCore::ISOBox::boxHeaderSize):
(WebCore::ISOBox::length):
(WebCore::ISOBox::type):
(WebCore::ISOWebVTTCue::presentationTime):
(WebCore::ISOWebVTTCue::duration):
(WebCore::ISOWebVTTCue::sourceID):
(WebCore::ISOWebVTTCue::id):
(WebCore::ISOWebVTTCue::originalStartTime):
(WebCore::ISOWebVTTCue::settings):
(WebCore::ISOWebVTTCue::cueText):

* platform/graphics/InbandTextTrackPrivateClient.h:
(WebCore::InbandTextTrackPrivateClient::parseWebVTTFileHeader): New.

* platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp:
(WebCore::InbandTextTrackPrivateAVF::InbandTextTrackPrivateAVF): Add a cue format parameter.
(WebCore::InbandTextTrackPrivateAVF::processCue): Call processNativeSamples.
(WebCore::InbandTextTrackPrivateAVF::processAttributedStrings): Add logging. Minor cleanup.
(WebCore::InbandTextTrackPrivateAVF::processNativeSamples): New, process an array of 
    CMSampleBuffers, create ISOWebVTTCue from the sample data.
* platform/graphics/avfoundation/InbandTextTrackPrivateAVF.h:

* platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.cpp:
(WebCore::InbandTextTrackPrivateAVCF::InbandTextTrackPrivateAVCF):
* platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.h:
(WebCore::InbandTextTrackPrivateAVCF::create):
* platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp:
(WebCore::MediaPlayerPrivateAVFoundationCF::processMediaSelectionOptions):
(WebCore::LegibleOutputData::LegibleOutputData):
(WebCore::AVFWrapper::processCue):
(WebCore::AVFWrapper::legibleOutputCallback):

* platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.h:
(WebCore::InbandTextTrackPrivateAVFObjC::create): Add a cue format parameter.
* platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.mm:
(WebCore::InbandTextTrackPrivateAVFObjC::InbandTextTrackPrivateAVFObjC): Ditto.

* platform/graphics/avfoundation/InbandTextTrackPrivateLegacyAVFObjC.cpp:
(WebCore::InbandTextTrackPrivateLegacyAVFObjC::InbandTextTrackPrivateLegacyAVFObjC): Pass cue
    format to base class.

* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
(WebCore::MediaPlayerPrivateAVFoundationObjC::createAVAssetForURL): Improve logging.
(WebCore::MediaPlayerPrivateAVFoundationObjC::createAVPlayerItem): Don't leak an NSDictionary.
(WebCore::MediaPlayerPrivateAVFoundationObjC::tracksChanged): Don't process media selection
    options until we have tracks.
(WebCore::MediaPlayerPrivateAVFoundationObjC::processMediaSelectionOptions): 
(WebCore::MediaPlayerPrivateAVFoundationObjC::processCue): Pass native samples as well as 
    attributed strings to track.
(-[WebCoreAVFMovieObserver legibleOutput:didOutputAttributedStrings:nativeSampleBuffers:forItemTime:]):
* platform/graphics/avfoundation/objc/OutOfBandTextTrackPrivateAVF.h:
(WebCore::OutOfBandTextTrackPrivateAVF::OutOfBandTextTrackPrivateAVF):

* platform/graphics/avfoundation/objc/OutOfBandTextTrackPrivateAVF.h:
(WebCore::OutOfBandTextTrackPrivateAVF::OutOfBandTextTrackPrivateAVF):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreCMakeListstxt">trunk/Source/WebCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCorevcxprojWebCorevcxproj">trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorehtmltrackBufferedLineReaderh">trunk/Source/WebCore/html/track/BufferedLineReader.h</a></li>
<li><a href="#trunkSourceWebCorehtmltrackInbandGenericTextTrackcpp">trunk/Source/WebCore/html/track/InbandGenericTextTrack.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmltrackInbandGenericTextTrackh">trunk/Source/WebCore/html/track/InbandGenericTextTrack.h</a></li>
<li><a href="#trunkSourceWebCorehtmltrackInbandTextTrackh">trunk/Source/WebCore/html/track/InbandTextTrack.h</a></li>
<li><a href="#trunkSourceWebCorehtmltrackInbandWebVTTTextTrackcpp">trunk/Source/WebCore/html/track/InbandWebVTTTextTrack.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmltrackInbandWebVTTTextTrackh">trunk/Source/WebCore/html/track/InbandWebVTTTextTrack.h</a></li>
<li><a href="#trunkSourceWebCorehtmltrackTextTrackCueGenericcpp">trunk/Source/WebCore/html/track/TextTrackCueGeneric.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmltrackVTTCuecpp">trunk/Source/WebCore/html/track/VTTCue.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmltrackVTTCueh">trunk/Source/WebCore/html/track/VTTCue.h</a></li>
<li><a href="#trunkSourceWebCorehtmltrackWebVTTParsercpp">trunk/Source/WebCore/html/track/WebVTTParser.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmltrackWebVTTParserh">trunk/Source/WebCore/html/track/WebVTTParser.h</a></li>
<li><a href="#trunkSourceWebCoreloaderTextTrackLoadercpp">trunk/Source/WebCore/loader/TextTrackLoader.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsInbandTextTrackPrivateClienth">trunk/Source/WebCore/platform/graphics/InbandTextTrackPrivateClient.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationInbandTextTrackPrivateAVFcpp">trunk/Source/WebCore/platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationInbandTextTrackPrivateAVFh">trunk/Source/WebCore/platform/graphics/avfoundation/InbandTextTrackPrivateAVF.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationcfInbandTextTrackPrivateAVCFcpp">trunk/Source/WebCore/platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationcfInbandTextTrackPrivateAVCFh">trunk/Source/WebCore/platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationcfMediaPlayerPrivateAVFoundationCFcpp">trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcInbandTextTrackPrivateAVFObjCh">trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcInbandTextTrackPrivateAVFObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcInbandTextTrackPrivateLegacyAVFObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateLegacyAVFObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCh">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCmm">trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsavfoundationobjcOutOfBandTextTrackPrivateAVFh">trunk/Source/WebCore/platform/graphics/avfoundation/objc/OutOfBandTextTrackPrivateAVF.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreplatformgraphicsISOVTTCuecpp">trunk/Source/WebCore/platform/graphics/ISOVTTCue.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsISOVTTCueh">trunk/Source/WebCore/platform/graphics/ISOVTTCue.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/CMakeLists.txt (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/CMakeLists.txt        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/CMakeLists.txt        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -2090,6 +2090,7 @@
</span><span class="cx">     platform/graphics/IntPoint.cpp
</span><span class="cx">     platform/graphics/IntRect.cpp
</span><span class="cx">     platform/graphics/IntSize.cpp
</span><ins>+    platform/graphics/ISOVTTCue.cpp
</ins><span class="cx">     platform/graphics/LayoutBoxExtent.cpp
</span><span class="cx">     platform/graphics/LayoutRect.cpp
</span><span class="cx">     platform/graphics/MediaPlayer.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/ChangeLog        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -1,3 +1,144 @@
</span><ins>+2014-06-24  Eric Carlson  &lt;eric.carlson@apple.com&gt;
+
+        [Mac] process raw VTT in-band captions
+        https://bugs.webkit.org/show_bug.cgi?id=134178
+
+        Reviewed by Jer Noble.
+
+        * CMakeLists.txt: Add ISOVTTCue.cpp|h.
+        * WebCore.vcxproj/WebCore.vcxproj: Ditto.
+        * WebCore.xcodeproj/project.pbxproj: Ditto.
+
+        * html/track/BufferedLineReader.h:
+        (WebCore::BufferedLineReader::reset): New, empty the input buffer.
+
+        Make it possible to process WebVTT captions. 
+        * html/track/InbandGenericTextTrack.cpp:
+        (WebCore::InbandGenericTextTrack::parser): Allocate, if necessary, and return a WebVTT parser.
+        (WebCore::InbandGenericTextTrack::parseWebVTTCueData): Pass a cue to the parser.
+        (WebCore::InbandGenericTextTrack::parseWebVTTFileHeader): Pass a VTT file header to the parser.
+        (WebCore::InbandGenericTextTrack::newCuesParsed): Parser callback.
+        (WebCore::InbandGenericTextTrack::newRegionsParsed): Ditto.
+        (WebCore::InbandGenericTextTrack::fileFailedToParse): Ditto.
+        * html/track/InbandGenericTextTrack.h:
+
+        * html/track/InbandTextTrack.h:
+
+        * html/track/InbandWebVTTTextTrack.cpp:
+        (WebCore::InbandWebVTTTextTrack::parser): New, parser accessor.
+        (WebCore::InbandWebVTTTextTrack::parseWebVTTCueData): New, parse VTT data in an ISOWebVTTCue
+            object.
+        (WebCore::InbandWebVTTTextTrack::newCuesParsed): Cleanup.
+        (WebCore::InbandWebVTTTextTrack::newRegionsParsed): Implement.
+        (WebCore::InbandWebVTTTextTrack::fileFailedToParse): Change the error message.
+        * html/track/InbandWebVTTTextTrack.h:
+
+        * html/track/TextTrackCueGeneric.cpp:
+        (WebCore::TextTrackCueGenericBoxElement::TextTrackCueGenericBoxElement): Change cue parameter
+            from a pointer to a reference.
+        (WebCore::TextTrackCueGeneric::createDisplayTree): Ditto.
+
+        * html/track/VTTCue.cpp:
+        (WebCore::VTTCueBox::create): Change cue parameter from a pointer to a reference.
+        (WebCore::VTTCueBox::VTTCueBox): Ditto.
+        (WebCore::VTTCueBox::getCue): Return a reference.
+        (WebCore::VTTCueBox::applyCSSProperties): m_cue is a reference, not a pointer.
+        (WebCore::VTTCue::create): New, create a VTTCue from WebVTTCueData.
+        (WebCore::VTTCue::VTTCue): New, internal constructor that takes a WebVTTCueData.
+        (WebCore::VTTCue::initialize): New, shared constructor initialization.
+        (WebCore::VTTCue::createDisplayTree): m_cue is a reference, not a pointer.
+        (WebCore::VTTCue::markFutureAndPastNodes): Ditto.
+        (WebCore::VTTCue::setCueSettings): Ditto.
+        * html/track/VTTCue.h:
+        (WebCore::VTTCueBox::create): Deleted.
+        (WebCore::VTTCue::create): Deleted.
+
+        * html/track/WebVTTParser.cpp:
+        (WebCore::WebVTTParser::parseFileHeader): New. Reset the line reader buffer and parser state, 
+            call the parser.
+        (WebCore::WebVTTParser::parseCueData): Create a cue from ISOWebVTTCue.
+        (WebCore::WebVTTParser::collectTimingsAndSettings): Return immediately if the string is empty.
+        (WebCore::WebVTTParser::collectTimeStamp): Ditto.
+        * html/track/WebVTTParser.h:
+        (WebCore::WebVTTCueData::originalStartTime): New.
+        (WebCore::WebVTTCueData::setOriginalStartTime): New.
+        (WebCore::WebVTTCueData::WebVTTCueData):
+
+        * loader/TextTrackLoader.cpp:
+        (WebCore::TextTrackLoader::getNewCues): Cleanup, use the new VTTCue::create.
+
+        Parse ISO WebVTT cue boxes.
+        * platform/graphics/ISOVTTCue.cpp: Added.
+        (WebCore::ISOBox::ISOBox):
+        (WebCore::ISOBox::peekType):
+        (WebCore::ISOBox::peekLength):
+        (WebCore::ISOBox::peekString):
+        (WebCore::vttCueBoxType):
+        (WebCore::vttIdBoxType):
+        (WebCore::vttSettingsBoxType):
+        (WebCore::vttPayloadBoxType):
+        (WebCore::vttCurrentTimeBoxType):
+        (WebCore::vttCueSourceIDBoxType):
+        (WebCore::ISOWebVTTCue::boxType):
+        (WebCore::ISOWebVTTCue::ISOWebVTTCue):
+        * platform/graphics/ISOVTTCue.h: Added.
+        (WebCore::ISOBox::boxHeaderSize):
+        (WebCore::ISOBox::length):
+        (WebCore::ISOBox::type):
+        (WebCore::ISOWebVTTCue::presentationTime):
+        (WebCore::ISOWebVTTCue::duration):
+        (WebCore::ISOWebVTTCue::sourceID):
+        (WebCore::ISOWebVTTCue::id):
+        (WebCore::ISOWebVTTCue::originalStartTime):
+        (WebCore::ISOWebVTTCue::settings):
+        (WebCore::ISOWebVTTCue::cueText):
+
+        * platform/graphics/InbandTextTrackPrivateClient.h:
+        (WebCore::InbandTextTrackPrivateClient::parseWebVTTFileHeader): New.
+
+        * platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp:
+        (WebCore::InbandTextTrackPrivateAVF::InbandTextTrackPrivateAVF): Add a cue format parameter.
+        (WebCore::InbandTextTrackPrivateAVF::processCue): Call processNativeSamples.
+        (WebCore::InbandTextTrackPrivateAVF::processAttributedStrings): Add logging. Minor cleanup.
+        (WebCore::InbandTextTrackPrivateAVF::processNativeSamples): New, process an array of 
+            CMSampleBuffers, create ISOWebVTTCue from the sample data.
+        * platform/graphics/avfoundation/InbandTextTrackPrivateAVF.h:
+
+        * platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.cpp:
+        (WebCore::InbandTextTrackPrivateAVCF::InbandTextTrackPrivateAVCF):
+        * platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.h:
+        (WebCore::InbandTextTrackPrivateAVCF::create):
+        * platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp:
+        (WebCore::MediaPlayerPrivateAVFoundationCF::processMediaSelectionOptions):
+        (WebCore::LegibleOutputData::LegibleOutputData):
+        (WebCore::AVFWrapper::processCue):
+        (WebCore::AVFWrapper::legibleOutputCallback):
+
+        * platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.h:
+        (WebCore::InbandTextTrackPrivateAVFObjC::create): Add a cue format parameter.
+        * platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.mm:
+        (WebCore::InbandTextTrackPrivateAVFObjC::InbandTextTrackPrivateAVFObjC): Ditto.
+
+        * platform/graphics/avfoundation/InbandTextTrackPrivateLegacyAVFObjC.cpp:
+        (WebCore::InbandTextTrackPrivateLegacyAVFObjC::InbandTextTrackPrivateLegacyAVFObjC): Pass cue
+            format to base class.
+
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::createAVAssetForURL): Improve logging.
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::createAVPlayerItem): Don't leak an NSDictionary.
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::tracksChanged): Don't process media selection
+            options until we have tracks.
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::processMediaSelectionOptions): 
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::processCue): Pass native samples as well as 
+            attributed strings to track.
+        (-[WebCoreAVFMovieObserver legibleOutput:didOutputAttributedStrings:nativeSampleBuffers:forItemTime:]):
+        * platform/graphics/avfoundation/objc/OutOfBandTextTrackPrivateAVF.h:
+        (WebCore::OutOfBandTextTrackPrivateAVF::OutOfBandTextTrackPrivateAVF):
+
+        * platform/graphics/avfoundation/objc/OutOfBandTextTrackPrivateAVF.h:
+        (WebCore::OutOfBandTextTrackPrivateAVF::OutOfBandTextTrackPrivateAVF):
+
</ins><span class="cx"> 2014-06-24  Antti Koivisto  &lt;antti@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Only flush layers when the exposed rect actually changes
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorevcxprojWebCorevcxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -7256,6 +7256,7 @@
</span><span class="cx">     &lt;ClCompile Include=&quot;..\platform\FileChooser.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\platform\FileStream.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\platform\FileSystem.cpp&quot; /&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\platform\graphics\ISOVTTCue.cpp&quot; /&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;..\platform\audio\AudioSession.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\platform\audio\MediaSession.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\platform\audio\MediaSessionManager.cpp&quot; /&gt;
</span><span class="lines">@@ -19437,6 +19438,7 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\platform\graphics\IntRect.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\platform\graphics\IntSize.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\platform\graphics\IntSizeHash.h&quot; /&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\platform\graphics\ISOVTTCue.h&quot; /&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\platform\graphics\LayoutBoxExtent.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\platform\graphics\LayoutPoint.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\platform\graphics\LayoutRect.h&quot; /&gt;
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -314,6 +314,8 @@
</span><span class="cx">                 07AB996B18DA3C010018771E /* RTCIceServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 07AB996718DA3C010018771E /* RTCIceServer.h */; };
</span><span class="cx">                 07AB996F18DA3C740018771E /* RTCConfigurationPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 07AB996D18DA3C740018771E /* RTCConfigurationPrivate.h */; };
</span><span class="cx">                 07AB997018DA3C740018771E /* RTCIceServerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 07AB996E18DA3C740018771E /* RTCIceServerPrivate.h */; };
</span><ins>+                07AC47011952102100EE9723 /* ISOVTTCue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07AC46FF1952102100EE9723 /* ISOVTTCue.cpp */; };
+                07AC47021952102100EE9723 /* ISOVTTCue.h in Headers */ = {isa = PBXBuildFile; fileRef = 07AC47001952102100EE9723 /* ISOVTTCue.h */; };
</ins><span class="cx">                 07B0113F1032242200FBDC33 /* AccessibilityMediaControls.h in Headers */ = {isa = PBXBuildFile; fileRef = 07B0113E1032242200FBDC33 /* AccessibilityMediaControls.h */; };
</span><span class="cx">                 07B442D6166C70B000556CAD /* InbandTextTrackPrivateAVF.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07B442D4166C70B000556CAD /* InbandTextTrackPrivateAVF.cpp */; };
</span><span class="cx">                 07B442D7166C70B000556CAD /* InbandTextTrackPrivateAVF.h in Headers */ = {isa = PBXBuildFile; fileRef = 07B442D5166C70B000556CAD /* InbandTextTrackPrivateAVF.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -7203,6 +7205,8 @@
</span><span class="cx">                 07AB996818DA3C010018771E /* RTCIceServer.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = RTCIceServer.idl; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 07AB996D18DA3C740018771E /* RTCConfigurationPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCConfigurationPrivate.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 07AB996E18DA3C740018771E /* RTCIceServerPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCIceServerPrivate.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                07AC46FF1952102100EE9723 /* ISOVTTCue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ISOVTTCue.cpp; path = ISOVTTCue.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                07AC47001952102100EE9723 /* ISOVTTCue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ISOVTTCue.h; path = ISOVTTCue.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 07B0113E1032242200FBDC33 /* AccessibilityMediaControls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AccessibilityMediaControls.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 07B442D4166C70B000556CAD /* InbandTextTrackPrivateAVF.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InbandTextTrackPrivateAVF.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 07B442D5166C70B000556CAD /* InbandTextTrackPrivateAVF.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InbandTextTrackPrivateAVF.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -20403,6 +20407,8 @@
</span><span class="cx">                                 2D46F04F17B96FD2005647F0 /* IntSize.cpp */,
</span><span class="cx">                                 B27535470B053814002CE64F /* IntSize.h */,
</span><span class="cx">                                 B27535480B053814002CE64F /* IntSizeHash.h */,
</span><ins>+                                07AC46FF1952102100EE9723 /* ISOVTTCue.cpp */,
+                                07AC47001952102100EE9723 /* ISOVTTCue.h */,
</ins><span class="cx">                                 65CC6BED16014EC0000ED27D /* Latin1TextIterator.h */,
</span><span class="cx">                                 141DC049164834B900371E5A /* LayoutBoxExtent.cpp */,
</span><span class="cx">                                 141DC04A164834B900371E5A /* LayoutBoxExtent.h */,
</span><span class="lines">@@ -24907,6 +24913,7 @@
</span><span class="cx">                                 E1FF8F65180745D800132674 /* JSSubtleCrypto.h in Headers */,
</span><span class="cx">                                 B20111080AB7740500DB0E68 /* JSSVGAElement.h in Headers */,
</span><span class="cx">                                 24D9129213CA951E00D21915 /* JSSVGAltGlyphDefElement.h in Headers */,
</span><ins>+                                07AC47021952102100EE9723 /* ISOVTTCue.h in Headers */,
</ins><span class="cx">                                 6515EC920D9723FF0063D49A /* JSSVGAltGlyphElement.h in Headers */,
</span><span class="cx">                                 24D9129613CA956100D21915 /* JSSVGAltGlyphItemElement.h in Headers */,
</span><span class="cx">                                 B222F6990AB771950022EFAD /* JSSVGAngle.h in Headers */,
</span><span class="lines">@@ -29493,6 +29500,7 @@
</span><span class="cx">                                 B2227A530D00BF220071B782 /* SVGPaint.cpp in Sources */,
</span><span class="cx">                                 B2227A560D00BF220071B782 /* SVGParserUtilities.cpp in Sources */,
</span><span class="cx">                                 84C6784C1214814700A92902 /* SVGPathBlender.cpp in Sources */,
</span><ins>+                                07AC47011952102100EE9723 /* ISOVTTCue.cpp in Sources */,
</ins><span class="cx">                                 8476C9EA11DF6A2900555B02 /* SVGPathBuilder.cpp in Sources */,
</span><span class="cx">                                 8419D2A8120D92D000141F8F /* SVGPathByteStreamBuilder.cpp in Sources */,
</span><span class="cx">                                 8419D2AC120D92FC00141F8F /* SVGPathByteStreamSource.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackBufferedLineReaderh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/BufferedLineReader.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/BufferedLineReader.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/BufferedLineReader.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -68,6 +68,8 @@
</span><span class="cx">     // Returns true if EOS has been reached proper.
</span><span class="cx">     bool isAtEndOfStream() const { return m_endOfStream &amp;&amp; m_buffer.isEmpty(); }
</span><span class="cx"> 
</span><ins>+    void reset() { m_buffer.clear(); }
+
</ins><span class="cx"> private:
</span><span class="cx">     // Consume the next character the buffer if it is the character |c|.
</span><span class="cx">     void scanCharacter(UChar c)
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackInbandGenericTextTrackcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/InbandGenericTextTrack.cpp (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/InbandGenericTextTrack.cpp        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/InbandGenericTextTrack.cpp        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012 Apple Inc.  All rights reserved.
</del><ins>+ * Copyright (C) 2012-2014 Apple Inc.  All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -36,6 +36,10 @@
</span><span class="cx"> #include &lt;math.h&gt;
</span><span class="cx"> #include &lt;wtf/text/CString.h&gt;
</span><span class="cx"> 
</span><ins>+#if ENABLE(WEBVTT_REGIONS)
+#include &quot;VTTRegionList.h&quot;
+#endif
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> GenericTextTrackCueMap::GenericTextTrackCueMap()
</span><span class="lines">@@ -190,6 +194,59 @@
</span><span class="cx">     TextTrack::removeCue(cue, ec);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+WebVTTParser&amp; InbandGenericTextTrack::parser()
+{
+    if (!m_webVTTParser)
+        m_webVTTParser = std::make_unique&lt;WebVTTParser&gt;(static_cast&lt;WebVTTParserClient*&gt;(this), scriptExecutionContext());
+    return *m_webVTTParser;
+}
+
+void InbandGenericTextTrack::parseWebVTTCueData(InbandTextTrackPrivate* trackPrivate, const ISOWebVTTCue&amp; cueData)
+{
+    ASSERT_UNUSED(trackPrivate, trackPrivate == m_private);
+    parser().parseCueData(cueData);
+}
+
+void InbandGenericTextTrack::parseWebVTTFileHeader(InbandTextTrackPrivate* trackPrivate, String header)
+{
+    ASSERT_UNUSED(trackPrivate, trackPrivate == m_private);
+    parser().parseFileHeader(header);
+}
+
+void InbandGenericTextTrack::newCuesParsed()
+{
+    Vector&lt;RefPtr&lt;WebVTTCueData&gt;&gt; cues;
+    parser().getNewCues(cues);
+
+    for (auto&amp; cueData : cues) {
+        RefPtr&lt;VTTCue&gt; vttCue = VTTCue::create(*scriptExecutionContext(), *cueData);
+
+        if (hasCue(vttCue.get(), TextTrackCue::IgnoreDuration)) {
+            LOG(Media, &quot;InbandGenericTextTrack::newCuesParsed ignoring already added cue: start=%.2f, end=%.2f, content=\&quot;%s\&quot;\n&quot;, vttCue-&gt;startTime(), vttCue-&gt;endTime(), vttCue-&gt;text().utf8().data());
+            return;
+        }
+        addCue(vttCue.release(), ASSERT_NO_EXCEPTION);
+    }
+}
+
+#if ENABLE(WEBVTT_REGIONS)
+void InbandGenericTextTrack::newRegionsParsed()
+{
+    Vector&lt;RefPtr&lt;VTTRegion&gt;&gt; newRegions;
+    parser().getNewRegions(newRegions);
+
+    for (auto&amp; region : newRegions) {
+        region-&gt;setTrack(this);
+        regions()-&gt;add(region);
+    }
+}
+#endif
+
+void InbandGenericTextTrack::fileFailedToParse()
+{
+    LOG(Media, &quot;Error parsing WebVTT stream.&quot;);
+}
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackInbandGenericTextTrackh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/InbandGenericTextTrack.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/InbandGenericTextTrack.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/InbandGenericTextTrack.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;InbandTextTrack.h&quot;
</span><span class="cx"> #include &quot;TextTrackCueGeneric.h&quot;
</span><ins>+#include &quot;WebVTTParser.h&quot;
</ins><span class="cx"> #include &lt;wtf/RefPtr.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -59,7 +60,7 @@
</span><span class="cx">     CueDataToCueMap m_dataToCueMap;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-class InbandGenericTextTrack : public InbandTextTrack {
</del><ins>+class InbandGenericTextTrack : public InbandTextTrack, private WebVTTParserClient {
</ins><span class="cx"> public:
</span><span class="cx">     static PassRefPtr&lt;InbandGenericTextTrack&gt; create(ScriptExecutionContext*, TextTrackClient*, PassRefPtr&lt;InbandTextTrackPrivate&gt;);
</span><span class="cx">     virtual ~InbandGenericTextTrack();
</span><span class="lines">@@ -75,7 +76,18 @@
</span><span class="cx">     PassRefPtr&lt;TextTrackCueGeneric&gt; createCue(PassRefPtr&lt;GenericCueData&gt;);
</span><span class="cx">     void updateCueFromCueData(TextTrackCueGeneric*, GenericCueData*);
</span><span class="cx"> 
</span><ins>+    WebVTTParser&amp; parser();
+    virtual void parseWebVTTCueData(InbandTextTrackPrivate*, const ISOWebVTTCue&amp;) override;
+    virtual void parseWebVTTFileHeader(InbandTextTrackPrivate*, String) override;
+
+    virtual void newCuesParsed() override;
+#if ENABLE(WEBVTT_REGIONS)
+    virtual void newRegionsParsed() override;
+#endif
+    virtual void fileFailedToParse() override;
+
</ins><span class="cx">     GenericTextTrackCueMap m_cueMap;
</span><ins>+    std::unique_ptr&lt;WebVTTParser&gt; m_webVTTParser;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackInbandTextTrackh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/InbandTextTrack.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/InbandTextTrack.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/InbandTextTrack.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -81,7 +81,10 @@
</span><span class="cx">     virtual void updateGenericCue(InbandTextTrackPrivate*, GenericCueData*) override { ASSERT_NOT_REACHED(); }
</span><span class="cx">     virtual void removeGenericCue(InbandTextTrackPrivate*, GenericCueData*) override { ASSERT_NOT_REACHED(); }
</span><span class="cx"> 
</span><ins>+    virtual void parseWebVTTFileHeader(InbandTextTrackPrivate*, String) override { ASSERT_NOT_REACHED(); }
</ins><span class="cx">     virtual void parseWebVTTCueData(InbandTextTrackPrivate*, const char*, unsigned) override { ASSERT_NOT_REACHED(); }
</span><ins>+    virtual void parseWebVTTCueData(InbandTextTrackPrivate*, const ISOWebVTTCue&amp;) override { ASSERT_NOT_REACHED(); }
+
</ins><span class="cx">     virtual double startTimeVariance() const;
</span><span class="cx"> 
</span><span class="cx"> #if USE(PLATFORM_TEXT_TRACK_MENU)
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackInbandWebVTTTextTrackcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/InbandWebVTTTextTrack.cpp (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/InbandWebVTTTextTrack.cpp        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/InbandWebVTTTextTrack.cpp        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -34,6 +34,10 @@
</span><span class="cx"> #include &quot;NotImplemented.h&quot;
</span><span class="cx"> #include &lt;wtf/text/CString.h&gt;
</span><span class="cx"> 
</span><ins>+#if ENABLE(WEBVTT_REGIONS)
+#include &quot;VTTRegionList.h&quot;
+#endif
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> PassRefPtr&lt;InbandTextTrack&gt; InbandWebVTTTextTrack::create(ScriptExecutionContext* context, TextTrackClient* client, PassRefPtr&lt;InbandTextTrackPrivate&gt; playerPrivate)
</span><span class="lines">@@ -50,42 +54,57 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void InbandWebVTTTextTrack::parseWebVTTCueData(InbandTextTrackPrivate* trackPrivate, const char* data, unsigned length)
</del><ins>+WebVTTParser&amp; InbandWebVTTTextTrack::parser()
</ins><span class="cx"> {
</span><del>-    ASSERT_UNUSED(trackPrivate, trackPrivate == m_private);
</del><span class="cx">     if (!m_webVTTParser)
</span><span class="cx">         m_webVTTParser = std::make_unique&lt;WebVTTParser&gt;(static_cast&lt;WebVTTParserClient*&gt;(this), scriptExecutionContext());
</span><del>-    m_webVTTParser-&gt;parseBytes(data, length);
</del><ins>+    return *m_webVTTParser;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void InbandWebVTTTextTrack::parseWebVTTCueData(InbandTextTrackPrivate* trackPrivate, const char* data, unsigned length)
+{
+    ASSERT_UNUSED(trackPrivate, trackPrivate == m_private);
+    parser().parseBytes(data, length);
+}
+
+void InbandWebVTTTextTrack::parseWebVTTCueData(InbandTextTrackPrivate* trackPrivate, const ISOWebVTTCue&amp; cueData)
+{
+    ASSERT_UNUSED(trackPrivate, trackPrivate == m_private);
+    parser().parseCueData(cueData);
+}
+
</ins><span class="cx"> void InbandWebVTTTextTrack::newCuesParsed()
</span><span class="cx"> {
</span><span class="cx">     Vector&lt;RefPtr&lt;WebVTTCueData&gt;&gt; cues;
</span><del>-    m_webVTTParser-&gt;getNewCues(cues);
-    for (size_t i = 0; i &lt; cues.size(); ++i) {
-        RefPtr&lt;WebVTTCueData&gt; cueData = cues[i];
-        RefPtr&lt;VTTCue&gt; cue = VTTCue::create(*scriptExecutionContext(), cueData-&gt;startTime(), cueData-&gt;endTime(), cueData-&gt;content());
-        cue-&gt;setId(cueData-&gt;id());
-        cue-&gt;setCueSettings(cueData-&gt;settings());
</del><ins>+    parser().getNewCues(cues);
</ins><span class="cx"> 
</span><del>-        if (hasCue(cue.get(), TextTrackCue::IgnoreDuration)) {
-            LOG(Media, &quot;InbandWebVTTTextTrack::newCuesParsed ignoring already added cue: start=%.2f, end=%.2f, content=\&quot;%s\&quot;\n&quot;, cueData-&gt;startTime(), cueData-&gt;endTime(), cueData-&gt;content().utf8().data());
</del><ins>+    for (auto&amp; cueData : cues) {
+        RefPtr&lt;VTTCue&gt; vttCue = VTTCue::create(*scriptExecutionContext(), *cueData);
+
+        if (hasCue(vttCue.get(), TextTrackCue::IgnoreDuration)) {
+            LOG(Media, &quot;InbandWebVTTTextTrack::newCuesParsed ignoring already added cue: start=%.2f, end=%.2f, content=\&quot;%s\&quot;\n&quot;, vttCue-&gt;startTime(), vttCue-&gt;endTime(), vttCue-&gt;text().utf8().data());
</ins><span class="cx">             return;
</span><span class="cx">         }
</span><del>-        addCue(cue.release(), ASSERT_NO_EXCEPTION);
</del><ins>+        addCue(vttCue.release(), ASSERT_NO_EXCEPTION);
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx">     
</span><span class="cx"> #if ENABLE(WEBVTT_REGIONS)
</span><span class="cx"> void InbandWebVTTTextTrack::newRegionsParsed()
</span><span class="cx"> {
</span><del>-    notImplemented();
</del><ins>+    Vector&lt;RefPtr&lt;VTTRegion&gt;&gt; newRegions;
+    parser().getNewRegions(newRegions);
+
+    for (auto&amp; region : newRegions) {
+        region-&gt;setTrack(this);
+        regions()-&gt;add(region);
+    }
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx">     
</span><span class="cx"> void InbandWebVTTTextTrack::fileFailedToParse()
</span><span class="cx"> {
</span><del>-    LOG(Media, &quot;Unable to parse WebVTT stream.&quot;);
</del><ins>+    LOG(Media, &quot;Error parsing WebVTT stream.&quot;);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackInbandWebVTTTextTrackh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/InbandWebVTTTextTrack.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/InbandWebVTTTextTrack.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/InbandWebVTTTextTrack.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -43,7 +43,9 @@
</span><span class="cx"> private:
</span><span class="cx">     InbandWebVTTTextTrack(ScriptExecutionContext*, TextTrackClient*, PassRefPtr&lt;InbandTextTrackPrivate&gt;);
</span><span class="cx"> 
</span><ins>+    WebVTTParser&amp; parser();
</ins><span class="cx">     virtual void parseWebVTTCueData(InbandTextTrackPrivate*, const char* data, unsigned length) override;
</span><ins>+    virtual void parseWebVTTCueData(InbandTextTrackPrivate*, const ISOWebVTTCue&amp;) override;
</ins><span class="cx"> 
</span><span class="cx">     virtual void newCuesParsed() override;
</span><span class="cx"> #if ENABLE(WEBVTT_REGIONS)
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackTextTrackCueGenericcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/TextTrackCueGeneric.cpp (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/TextTrackCueGeneric.cpp        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/TextTrackCueGeneric.cpp        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -43,7 +43,7 @@
</span><span class="cx"> 
</span><span class="cx"> class TextTrackCueGenericBoxElement final : public VTTCueBox {
</span><span class="cx"> public:
</span><del>-    static PassRefPtr&lt;TextTrackCueGenericBoxElement&gt; create(Document&amp; document, TextTrackCueGeneric* cue)
</del><ins>+    static PassRefPtr&lt;TextTrackCueGenericBoxElement&gt; create(Document&amp; document, TextTrackCueGeneric&amp; cue)
</ins><span class="cx">     {
</span><span class="cx">         return adoptRef(new TextTrackCueGenericBoxElement(document, cue));
</span><span class="cx">     }
</span><span class="lines">@@ -51,10 +51,10 @@
</span><span class="cx">     virtual void applyCSSProperties(const IntSize&amp;) override;
</span><span class="cx">     
</span><span class="cx"> private:
</span><del>-    TextTrackCueGenericBoxElement(Document&amp;, VTTCue*);
</del><ins>+    TextTrackCueGenericBoxElement(Document&amp;, VTTCue&amp;);
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-TextTrackCueGenericBoxElement::TextTrackCueGenericBoxElement(Document&amp; document, VTTCue* cue)
</del><ins>+TextTrackCueGenericBoxElement::TextTrackCueGenericBoxElement(Document&amp; document, VTTCue&amp; cue)
</ins><span class="cx">     : VTTCueBox(document, cue)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="lines">@@ -118,7 +118,7 @@
</span><span class="cx"> 
</span><span class="cx"> PassRefPtr&lt;VTTCueBox&gt; TextTrackCueGeneric::createDisplayTree()
</span><span class="cx"> {
</span><del>-    return TextTrackCueGenericBoxElement::create(ownerDocument(), this);
</del><ins>+    return TextTrackCueGenericBoxElement::create(ownerDocument(), *this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void TextTrackCueGeneric::setLine(int line, ExceptionCode&amp; ec)
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackVTTCuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/VTTCue.cpp (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/VTTCue.cpp        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/VTTCue.cpp        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -119,7 +119,14 @@
</span><span class="cx"> 
</span><span class="cx"> // ----------------------------
</span><span class="cx"> 
</span><del>-VTTCueBox::VTTCueBox(Document&amp; document, VTTCue* cue)
</del><ins>+PassRefPtr&lt;VTTCueBox&gt; VTTCueBox::create(Document&amp; document, VTTCue&amp; cue)
+{
+    VTTCueBox* cueBox = new VTTCueBox(document, cue);
+    cueBox-&gt;setPseudo(VTTCueBox::vttCueBoxShadowPseudoId());
+    return adoptRef(cueBox);
+}
+
+VTTCueBox::VTTCueBox(Document&amp; document, VTTCue&amp; cue)
</ins><span class="cx">     : HTMLElement(divTag, document)
</span><span class="cx">     , m_cue(cue)
</span><span class="cx"> {
</span><span class="lines">@@ -128,14 +135,14 @@
</span><span class="cx"> 
</span><span class="cx"> VTTCue* VTTCueBox::getCue() const
</span><span class="cx"> {
</span><del>-    return m_cue;
</del><ins>+    return &amp;m_cue;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void VTTCueBox::applyCSSProperties(const IntSize&amp;)
</span><span class="cx"> {
</span><span class="cx">     // FIXME: Apply all the initial CSS positioning properties. http://wkb.ug/79916
</span><span class="cx"> #if ENABLE(WEBVTT_REGIONS)
</span><del>-    if (!m_cue-&gt;regionId().isEmpty()) {
</del><ins>+    if (!m_cue.regionId().isEmpty()) {
</ins><span class="cx">         setInlineStyleProperty(CSSPropertyPosition, CSSValueRelative);
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="lines">@@ -150,12 +157,12 @@
</span><span class="cx">     setInlineStyleProperty(CSSPropertyUnicodeBidi, CSSValueWebkitPlaintext);
</span><span class="cx"> 
</span><span class="cx">     // the 'direction' property must be set to direction
</span><del>-    setInlineStyleProperty(CSSPropertyDirection, m_cue-&gt;getCSSWritingDirection());
</del><ins>+    setInlineStyleProperty(CSSPropertyDirection, m_cue.getCSSWritingDirection());
</ins><span class="cx"> 
</span><span class="cx">     // the 'writing-mode' property must be set to writing-mode
</span><del>-    setInlineStyleProperty(CSSPropertyWebkitWritingMode, m_cue-&gt;getCSSWritingMode(), false);
</del><ins>+    setInlineStyleProperty(CSSPropertyWebkitWritingMode, m_cue.getCSSWritingMode(), false);
</ins><span class="cx"> 
</span><del>-    std::pair&lt;float, float&gt; position = m_cue-&gt;getCSSPosition();
</del><ins>+    std::pair&lt;float, float&gt; position = m_cue.getCSSPosition();
</ins><span class="cx"> 
</span><span class="cx">     // the 'top' property must be set to top,
</span><span class="cx">     setInlineStyleProperty(CSSPropertyTop, static_cast&lt;double&gt;(position.second), CSSPrimitiveValue::CSS_PERCENTAGE);
</span><span class="lines">@@ -164,21 +171,21 @@
</span><span class="cx">     setInlineStyleProperty(CSSPropertyLeft, static_cast&lt;double&gt;(position.first), CSSPrimitiveValue::CSS_PERCENTAGE);
</span><span class="cx"> 
</span><span class="cx">     // the 'width' property must be set to width, and the 'height' property  must be set to height
</span><del>-    if (m_cue-&gt;vertical() == horizontalKeyword()) {
-        setInlineStyleProperty(CSSPropertyWidth, static_cast&lt;double&gt;(m_cue-&gt;getCSSSize()), CSSPrimitiveValue::CSS_PERCENTAGE);
</del><ins>+    if (m_cue.vertical() == horizontalKeyword()) {
+        setInlineStyleProperty(CSSPropertyWidth, static_cast&lt;double&gt;(m_cue.getCSSSize()), CSSPrimitiveValue::CSS_PERCENTAGE);
</ins><span class="cx">         setInlineStyleProperty(CSSPropertyHeight, CSSValueAuto);
</span><span class="cx">     } else {
</span><span class="cx">         setInlineStyleProperty(CSSPropertyWidth, CSSValueAuto);
</span><del>-        setInlineStyleProperty(CSSPropertyHeight, static_cast&lt;double&gt;(m_cue-&gt;getCSSSize()),  CSSPrimitiveValue::CSS_PERCENTAGE);
</del><ins>+        setInlineStyleProperty(CSSPropertyHeight, static_cast&lt;double&gt;(m_cue.getCSSSize()),  CSSPrimitiveValue::CSS_PERCENTAGE);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // The 'text-align' property on the (root) List of WebVTT Node Objects must
</span><span class="cx">     // be set to the value in the second cell of the row of the table below
</span><span class="cx">     // whose first cell is the value of the corresponding cue's text track cue
</span><span class="cx">     // alignment:
</span><del>-    setInlineStyleProperty(CSSPropertyTextAlign, m_cue-&gt;getCSSAlignment());
</del><ins>+    setInlineStyleProperty(CSSPropertyTextAlign, m_cue.getCSSAlignment());
</ins><span class="cx"> 
</span><del>-    if (!m_cue-&gt;snapToLines()) {
</del><ins>+    if (!m_cue.snapToLines()) {
</ins><span class="cx">         // 10.13.1 Set up x and y:
</span><span class="cx">         // Note: x and y are set through the CSS left and top above.
</span><span class="cx"> 
</span><span class="lines">@@ -209,25 +216,35 @@
</span><span class="cx"> 
</span><span class="cx"> // ----------------------------
</span><span class="cx"> 
</span><ins>+PassRefPtr&lt;VTTCue&gt; VTTCue::create(ScriptExecutionContext&amp; context, double start, double end, const String&amp; content)
+{
+    return adoptRef(new VTTCue(context, start, end, content));
+}
+
+PassRefPtr&lt;VTTCue&gt; VTTCue::create(ScriptExecutionContext&amp; context, const WebVTTCueData&amp; data)
+{
+    return adoptRef(new VTTCue(context, data));
+}
+
</ins><span class="cx"> VTTCue::VTTCue(ScriptExecutionContext&amp; context, double start, double end, const String&amp; content)
</span><span class="cx">     : TextTrackCue(context, start, end)
</span><span class="cx">     , m_content(content)
</span><del>-    , m_linePosition(undefinedPosition)
-    , m_computedLinePosition(undefinedPosition)
-    , m_textPosition(50)
-    , m_cueSize(100)
-    , m_writingDirection(Horizontal)
-    , m_cueAlignment(Middle)
-    , m_webVTTNodeTree(nullptr)
-    , m_cueBackgroundBox(HTMLSpanElement::create(spanTag, toDocument(context)))
-    , m_displayDirection(CSSValueLtr)
-    , m_displaySize(0)
-    , m_snapToLines(true)
-    , m_displayTreeShouldChange(true)
-    , m_notifyRegion(true)
</del><span class="cx"> {
</span><ins>+    initialize(context);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+VTTCue::VTTCue(ScriptExecutionContext&amp; context, const WebVTTCueData&amp; cueData)
+    : TextTrackCue(context, 0, 0)
+{
+    initialize(context);
+    setText(cueData.content());
+    setStartTime(cueData.startTime(), IGNORE_EXCEPTION);
+    setEndTime(cueData.endTime(), IGNORE_EXCEPTION);
+    setId(cueData.id());
+    setCueSettings(cueData.settings());
+    m_originalStartTime = cueData.originalStartTime();
+}
+
</ins><span class="cx"> VTTCue::~VTTCue()
</span><span class="cx"> {
</span><span class="cx">     if (!hasDisplayTree())
</span><span class="lines">@@ -236,9 +253,27 @@
</span><span class="cx">     displayTreeInternal()-&gt;remove(ASSERT_NO_EXCEPTION);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void VTTCue::initialize(ScriptExecutionContext&amp; context)
+{
+    m_linePosition = undefinedPosition;
+    m_computedLinePosition = undefinedPosition;
+    m_textPosition = 50;
+    m_cueSize = 100;
+    m_writingDirection = Horizontal;
+    m_cueAlignment = Middle;
+    m_webVTTNodeTree = nullptr;
+    m_cueBackgroundBox = HTMLSpanElement::create(spanTag, toDocument(context));
+    m_displayDirection = CSSValueLtr;
+    m_displaySize = 0;
+    m_snapToLines = true;
+    m_displayTreeShouldChange = true;
+    m_notifyRegion = true;
+    m_originalStartTime = 0;
+}
+
</ins><span class="cx"> PassRefPtr&lt;VTTCueBox&gt; VTTCue::createDisplayTree()
</span><span class="cx"> {
</span><del>-    return VTTCueBox::create(ownerDocument(), this);
</del><ins>+    return VTTCueBox::create(ownerDocument(), *this);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> VTTCueBox* VTTCue::displayTreeInternal()
</span><span class="lines">@@ -699,6 +734,7 @@
</span><span class="cx">             bool check = WebVTTParser::collectTimeStamp(child-&gt;nodeValue(), currentTimestamp);
</span><span class="cx">             ASSERT_UNUSED(check, check);
</span><span class="cx">             
</span><ins>+            currentTimestamp += m_originalStartTime;
</ins><span class="cx">             if (currentTimestamp &gt; movieTime)
</span><span class="cx">                 isPastNode = false;
</span><span class="cx">         }
</span><span class="lines">@@ -884,6 +920,9 @@
</span><span class="cx"> 
</span><span class="cx"> void VTTCue::setCueSettings(const String&amp; inputString)
</span><span class="cx"> {
</span><ins>+    if (inputString.isEmpty())
+        return;
+
</ins><span class="cx">     VTTScanner input(inputString);
</span><span class="cx"> 
</span><span class="cx">     while (!input.isAtEnd()) {
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackVTTCueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/VTTCue.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/VTTCue.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/VTTCue.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -46,15 +46,13 @@
</span><span class="cx"> class ScriptExecutionContext;
</span><span class="cx"> class VTTCue;
</span><span class="cx"> class VTTScanner;
</span><ins>+class WebVTTCueData;
</ins><span class="cx"> 
</span><span class="cx"> // ----------------------------
</span><span class="cx"> 
</span><span class="cx"> class VTTCueBox : public HTMLElement {
</span><span class="cx"> public:
</span><del>-    static PassRefPtr&lt;VTTCueBox&gt; create(Document&amp; document, VTTCue* cue)
-    {
-        return adoptRef(new VTTCueBox(document, cue));
-    }
</del><ins>+    static PassRefPtr&lt;VTTCueBox&gt; create(Document&amp;, VTTCue&amp;);
</ins><span class="cx"> 
</span><span class="cx">     VTTCue* getCue() const;
</span><span class="cx">     virtual void applyCSSProperties(const IntSize&amp; videoSize);
</span><span class="lines">@@ -62,21 +60,19 @@
</span><span class="cx">     static const AtomicString&amp; vttCueBoxShadowPseudoId();
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    VTTCueBox(Document&amp;, VTTCue*);
</del><ins>+    VTTCueBox(Document&amp;, VTTCue&amp;);
</ins><span class="cx"> 
</span><span class="cx">     virtual RenderPtr&lt;RenderElement&gt; createElementRenderer(PassRef&lt;RenderStyle&gt;) override;
</span><span class="cx"> 
</span><del>-    VTTCue* m_cue;
</del><ins>+    VTTCue&amp; m_cue;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> // ----------------------------
</span><span class="cx"> 
</span><span class="cx"> class VTTCue : public TextTrackCue {
</span><span class="cx"> public:
</span><del>-    static PassRefPtr&lt;VTTCue&gt; create(ScriptExecutionContext&amp; context, double start, double end, const String&amp; content)
-    {
-        return adoptRef(new VTTCue(context, start, end, content));
-    }
</del><ins>+    static PassRefPtr&lt;VTTCue&gt; create(ScriptExecutionContext&amp;, double start, double end, const String&amp;);
+    static PassRefPtr&lt;VTTCue&gt; create(ScriptExecutionContext&amp;, const WebVTTCueData&amp;);
</ins><span class="cx"> 
</span><span class="cx">     virtual ~VTTCue();
</span><span class="cx"> 
</span><span class="lines">@@ -164,11 +160,13 @@
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     VTTCue(ScriptExecutionContext&amp;, double start, double end, const String&amp; content);
</span><ins>+    VTTCue(ScriptExecutionContext&amp;, const WebVTTCueData&amp;);
</ins><span class="cx"> 
</span><span class="cx">     virtual PassRefPtr&lt;VTTCueBox&gt; createDisplayTree();
</span><span class="cx">     VTTCueBox* displayTreeInternal();
</span><span class="cx"> 
</span><span class="cx"> private:
</span><ins>+    void initialize(ScriptExecutionContext&amp;);
</ins><span class="cx">     void createWebVTTNodeTree();
</span><span class="cx">     void copyWebVTTNodeToDOMTree(ContainerNode* WebVTTNode, ContainerNode* root);
</span><span class="cx"> 
</span><span class="lines">@@ -211,6 +209,8 @@
</span><span class="cx">     int m_displaySize;
</span><span class="cx">     std::pair&lt;float, float&gt; m_displayPosition;
</span><span class="cx"> 
</span><ins>+    double m_originalStartTime;
+
</ins><span class="cx">     bool m_snapToLines : 1;
</span><span class="cx">     bool m_displayTreeShouldChange : 1;
</span><span class="cx">     bool m_notifyRegion : 1;
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackWebVTTParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/WebVTTParser.cpp (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/WebVTTParser.cpp        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/WebVTTParser.cpp        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2011, 2013 Google Inc.  All rights reserved.
</span><span class="cx">  * Copyright (C) 2013 Cable Television Labs, Inc.
</span><del>- * Copyright (C) 2014 Apple Inc.  All rights reserved.
</del><ins>+ * Copyright (C) 2011-2014 Apple Inc.  All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions are
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;WebVTTParser.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;ISOVTTCue.h&quot;
</ins><span class="cx"> #include &quot;ProcessingInstruction.h&quot;
</span><span class="cx"> #include &quot;Text.h&quot;
</span><span class="cx"> #include &quot;VTTScanner.h&quot;
</span><span class="lines">@@ -108,6 +109,14 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+void WebVTTParser::parseFileHeader(const String&amp; data)
+{
+    m_state = Initial;
+    m_lineReader.reset();
+    m_lineReader.append(data);
+    parse();
+}
+
</ins><span class="cx"> void WebVTTParser::parseBytes(const char* data, unsigned length)
</span><span class="cx"> {
</span><span class="cx">     String textData = m_decoder-&gt;decode(data, length);
</span><span class="lines">@@ -115,6 +124,27 @@
</span><span class="cx">     parse();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebVTTParser::parseCueData(const ISOWebVTTCue&amp; data)
+{
+    RefPtr&lt;WebVTTCueData&gt; cue = WebVTTCueData::create();
+
+    double startTime = data.presentationTime().toDouble();
+    cue-&gt;setStartTime(startTime);
+    cue-&gt;setEndTime(startTime + data.duration().toDouble());
+
+    cue-&gt;setContent(data.cueText());
+    cue-&gt;setId(data.id());
+    cue-&gt;setSettings(data.settings());
+
+    double originalStartTime;
+    if (WebVTTParser::collectTimeStamp(data.originalStartTime(), originalStartTime))
+        cue-&gt;setOriginalStartTime(originalStartTime);
+
+    m_cuelist.append(cue);
+    if (m_client)
+        m_client-&gt;newCuesParsed();
+}
+
</ins><span class="cx"> void WebVTTParser::flush()
</span><span class="cx"> {
</span><span class="cx">     String textData = m_decoder-&gt;flush();
</span><span class="lines">@@ -271,6 +301,9 @@
</span><span class="cx"> 
</span><span class="cx"> WebVTTParser::ParseState WebVTTParser::collectTimingsAndSettings(const String&amp; line)
</span><span class="cx"> {
</span><ins>+    if (line.isEmpty())
+        return BadCue;
+
</ins><span class="cx">     VTTScanner input(line);
</span><span class="cx"> 
</span><span class="cx">     // Collect WebVTT cue timings and settings. (5.3 WebVTT cue timings and settings parsing.)
</span><span class="lines">@@ -434,6 +467,9 @@
</span><span class="cx"> 
</span><span class="cx"> bool WebVTTParser::collectTimeStamp(const String&amp; line, double&amp; timeStamp)
</span><span class="cx"> {
</span><ins>+    if (line.isEmpty())
+        return false;
+
</ins><span class="cx">     VTTScanner input(line);
</span><span class="cx">     return collectTimeStamp(input, timeStamp);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorehtmltrackWebVTTParserh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/track/WebVTTParser.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/track/WebVTTParser.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/html/track/WebVTTParser.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -49,6 +49,7 @@
</span><span class="cx"> using namespace HTMLNames;
</span><span class="cx"> 
</span><span class="cx"> class Document;
</span><ins>+class ISOWebVTTCue;
</ins><span class="cx"> class VTTScanner;
</span><span class="cx"> 
</span><span class="cx"> class WebVTTParserClient {
</span><span class="lines">@@ -83,15 +84,20 @@
</span><span class="cx">     String settings() const { return m_settings; }
</span><span class="cx">     void setSettings(String settings) { m_settings = settings; }
</span><span class="cx"> 
</span><ins>+    double originalStartTime() const { return m_originalStartTime; }
+    void setOriginalStartTime(double time) { m_originalStartTime = time; }
+
</ins><span class="cx"> private:
</span><span class="cx">     WebVTTCueData()
</span><span class="cx">         : m_startTime(0)
</span><span class="cx">         , m_endTime(0)
</span><ins>+        , m_originalStartTime(0)
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     double m_startTime;
</span><span class="cx">     double m_endTime;
</span><ins>+    double m_originalStartTime;
</ins><span class="cx">     String m_id;
</span><span class="cx">     String m_content;
</span><span class="cx">     String m_settings;
</span><span class="lines">@@ -140,7 +146,9 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     // Input data to the parser to parse.
</span><del>-    void parseBytes(const char* data, unsigned length);
</del><ins>+    void parseBytes(const char*, unsigned);
+    void parseFileHeader(const String&amp;);
+    void parseCueData(const ISOWebVTTCue&amp;);
</ins><span class="cx">     void flush();
</span><span class="cx">     void fileFinished();
</span><span class="cx"> 
</span><span class="lines">@@ -184,7 +192,7 @@
</span><span class="cx">     double m_currentEndTime;
</span><span class="cx">     StringBuilder m_currentContent;
</span><span class="cx">     String m_currentSettings;
</span><del>-    
</del><ins>+
</ins><span class="cx">     WebVTTParserClient* m_client;
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;RefPtr&lt;WebVTTCueData&gt;&gt; m_cuelist;
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderTextTrackLoadercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/TextTrackLoader.cpp (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/TextTrackLoader.cpp        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/loader/TextTrackLoader.cpp        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -215,13 +215,9 @@
</span><span class="cx">     if (m_cueParser) {
</span><span class="cx">         Vector&lt;RefPtr&lt;WebVTTCueData&gt;&gt; newCues;
</span><span class="cx">         m_cueParser-&gt;getNewCues(newCues);
</span><del>-        for (size_t i = 0; i &lt; newCues.size(); ++i) {
-            RefPtr&lt;WebVTTCueData&gt; data = newCues[i];
-            RefPtr&lt;VTTCue&gt; cue = VTTCue::create(*m_scriptExecutionContext, data-&gt;startTime(), data-&gt;endTime(), data-&gt;content());
-            cue-&gt;setId(data-&gt;id());
-            cue-&gt;setCueSettings(data-&gt;settings());
-            outputCues.append(cue);
-        }
</del><ins>+
+        for (auto&amp; cueData : newCues)
+            outputCues.append(VTTCue::create(*m_scriptExecutionContext, *cueData));
</ins><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsISOVTTCuecpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/graphics/ISOVTTCue.cpp (0 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ISOVTTCue.cpp                                (rev 0)
+++ trunk/Source/WebCore/platform/graphics/ISOVTTCue.cpp        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -0,0 +1,151 @@
</span><ins>+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include &quot;config.h&quot;
+#include &quot;ISOVTTCue.h&quot;
+
+#include &quot;Logging.h&quot;
+#include &lt;runtime/ArrayBuffer.h&gt;
+#include &lt;runtime/DataView.h&gt;
+#include &lt;runtime/Int8Array.h&gt;
+#include &lt;wtf/NeverDestroyed.h&gt;
+#include &lt;wtf/text/CString.h&gt;
+#include &lt;wtf/text/StringBuilder.h&gt;
+
+namespace JSC {
+class ArrayBuffer;
+}
+
+namespace WebCore {
+
+ISOBox::ISOBox(ArrayBuffer* data)
+{
+    m_type = peekType(data);
+    m_length = peekLength(data);
+    ASSERT(m_length &gt;= 8);
+}
+
+String ISOBox::peekType(ArrayBuffer* data)
+{
+    ASSERT_WITH_SECURITY_IMPLICATION(data-&gt;byteLength() &gt;= 2 * sizeof(uint32_t));
+    if (data-&gt;byteLength() &lt; 2 * sizeof(uint32_t))
+        return emptyString();
+
+    StringBuilder builder;
+    RefPtr&lt;Int8Array&gt; array = JSC::Int8Array::create(data, 4, sizeof(uint32_t));
+    for (int i = 0; i &lt; 4; ++i)
+        builder.append(array-&gt;item(i));
+    return builder.toString();
+}
+
+size_t ISOBox::peekLength(ArrayBuffer* data)
+{
+    ASSERT_WITH_SECURITY_IMPLICATION(data-&gt;byteLength() &gt;= sizeof(uint32_t));
+    if (data-&gt;byteLength() &lt; sizeof(uint32_t))
+        return 0;
+
+    return JSC::DataView::create(data, 0, sizeof(uint32_t))-&gt;get&lt;uint32_t&gt;(0, false);
+}
+
+String ISOBox::peekString(ArrayBuffer* data, unsigned offset, unsigned length)
+{
+    ASSERT_WITH_SECURITY_IMPLICATION(offset + length &lt;= data-&gt;byteLength());
+    if (data-&gt;byteLength() &lt; offset + length)
+        return emptyString();
+
+    return String(JSC::Uint8Array::create(data, offset, length)-&gt;data(), length);
+}
+
+static const AtomicString&amp; vttCueBoxType()
+{
+    static NeverDestroyed&lt;AtomicString&gt; vttc(&quot;vttc&quot;, AtomicString::ConstructFromLiteral);
+    return vttc;
+}
+
+static const AtomicString&amp; vttIdBoxType()
+{
+    static NeverDestroyed&lt;AtomicString&gt; iden(&quot;iden&quot;, AtomicString::ConstructFromLiteral);
+    return iden;
+}
+
+static const AtomicString&amp; vttSettingsBoxType()
+{
+    static NeverDestroyed&lt;AtomicString&gt; sttg(&quot;sttg&quot;, AtomicString::ConstructFromLiteral);
+    return sttg;
+}
+
+static const AtomicString&amp; vttPayloadBoxType()
+{
+    static NeverDestroyed&lt;AtomicString&gt; payl(&quot;payl&quot;, AtomicString::ConstructFromLiteral);
+    return payl;
+}
+
+static const AtomicString&amp; vttCurrentTimeBoxType()
+{
+    static NeverDestroyed&lt;AtomicString&gt; ctim(&quot;ctim&quot;, AtomicString::ConstructFromLiteral);
+    return ctim;
+}
+
+static const AtomicString&amp; vttCueSourceIDBoxType()
+{
+    static NeverDestroyed&lt;AtomicString&gt; vsid(&quot;vsid&quot;, AtomicString::ConstructFromLiteral);
+    return vsid;
+}
+
+const AtomicString&amp; ISOWebVTTCue::boxType()
+{
+    return vttCueBoxType();
+}
+
+ISOWebVTTCue::ISOWebVTTCue(const MediaTime&amp; presentationTime, const MediaTime&amp; duration, JSC::ArrayBuffer* buffer)
+    : ISOBox(buffer)
+    , m_presentationTime(presentationTime)
+    , m_duration(duration)
+{
+    size_t offset = ISOBox::boxHeaderSize();
+    while (offset &lt; length() &amp;&amp; length() - offset &gt; ISOBox::boxHeaderSize()) {
+        RefPtr&lt;ArrayBuffer&gt; subBuffer = buffer-&gt;slice(offset);
+        String boxType = ISOBox::peekType(subBuffer.get());
+        size_t boxSize = ISOBox::peekLength(subBuffer.get());
+        size_t boxDataSize = boxSize - ISOBox::boxHeaderSize();
+
+        if (boxType == vttCueSourceIDBoxType())
+            m_sourceID = peekString(subBuffer.get(), ISOBox::boxHeaderSize(), boxDataSize);
+        else if (boxType == vttIdBoxType())
+            m_identifer = peekString(subBuffer.get(), ISOBox::boxHeaderSize(), boxDataSize);
+        else if (boxType == vttCurrentTimeBoxType())
+            m_originalStartTime = peekString(subBuffer.get(), ISOBox::boxHeaderSize(), boxDataSize);
+        else if (boxType == vttSettingsBoxType())
+            m_settings = peekString(subBuffer.get(), ISOBox::boxHeaderSize(), boxDataSize);
+        else if (boxType == vttPayloadBoxType())
+            m_cueText = peekString(subBuffer.get(), ISOBox::boxHeaderSize(), boxDataSize);
+        else
+            LOG(Media, &quot;ISOWebVTTCue::ISOWebVTTCue - skipping box id = \&quot;%s\&quot;, size = %zu&quot;, boxType.utf8().data(), boxSize);
+
+        offset += boxSize;
+    }
+}
+
+} // namespace WebCore
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsISOVTTCueh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/graphics/ISOVTTCue.h (0 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ISOVTTCue.h                                (rev 0)
+++ trunk/Source/WebCore/platform/graphics/ISOVTTCue.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -0,0 +1,94 @@
</span><ins>+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#ifndef ISOVTTCue_h
+#define ISOVTTCue_h
+
+#include &lt;wtf/MediaTime.h&gt;
+#include &lt;wtf/text/WTFString.h&gt;
+
+namespace JSC {
+class ArrayBuffer;
+}
+
+namespace WebCore {
+
+// An ISOBox represents a ISO-BMFF box. Data in the structure is big-endian. The layout of the data structure as follows:
+// 4 bytes : 4CC : identifier
+// 4 bytes : unsigned : length
+class ISOBox {
+public:
+    static String peekType(JSC::ArrayBuffer*);
+    static size_t peekLength(JSC::ArrayBuffer*);
+    static String peekString(JSC::ArrayBuffer*, unsigned offset, unsigned length);
+    static unsigned boxHeaderSize() { return 2 * sizeof(uint32_t); }
+
+    size_t length() const { return m_length; }
+    const AtomicString&amp; type() const { return m_type; }
+
+protected:
+    ISOBox(JSC::ArrayBuffer*);
+    
+private:
+    size_t m_length;
+    AtomicString m_type;
+};
+
+// 4 bytes : 4CC : identifier = 'vttc'
+// 4 bytes : unsigned : length
+// N bytes : CueSourceIDBox : box : optional
+// N bytes : CueIDBox : box : optional
+// N bytes : CueTimeBox : box : optional
+// N bytes : CueSettingsBox : box : optional
+// N bytes : CuePayloadBox : box : required
+class ISOWebVTTCue : public ISOBox {
+public:
+    ISOWebVTTCue(const MediaTime&amp; presentationTime, const MediaTime&amp; duration, JSC::ArrayBuffer*);
+
+    static const AtomicString&amp; boxType();
+
+    const MediaTime&amp; presentationTime() const { return m_presentationTime; }
+    const MediaTime&amp; duration() const { return m_duration; }
+
+    const String&amp; sourceID() const { return m_sourceID; }
+    const String&amp; id() const { return m_identifer; }
+    const String&amp; originalStartTime() const { return m_originalStartTime; }
+    const String&amp; settings() const { return m_settings; }
+    const String&amp; cueText() const { return m_cueText; }
+
+private:
+    MediaTime m_presentationTime;
+    MediaTime m_duration;
+
+    String m_sourceID;
+    String m_identifer;
+    String m_originalStartTime;
+    String m_settings;
+    String m_cueText;
+};
+
+}
+
+#endif // ISOVTTCue_h
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsInbandTextTrackPrivateClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/InbandTextTrackPrivateClient.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/InbandTextTrackPrivateClient.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/InbandTextTrackPrivateClient.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -38,6 +38,7 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> class InbandTextTrackPrivate;
</span><ins>+class ISOWebVTTCue;
</ins><span class="cx"> 
</span><span class="cx"> class GenericCueData : public RefCounted&lt;GenericCueData&gt; {
</span><span class="cx"> public:
</span><span class="lines">@@ -180,7 +181,9 @@
</span><span class="cx">     virtual void updateGenericCue(InbandTextTrackPrivate*, GenericCueData*) = 0;
</span><span class="cx">     virtual void removeGenericCue(InbandTextTrackPrivate*, GenericCueData*) = 0;
</span><span class="cx"> 
</span><ins>+    virtual void parseWebVTTFileHeader(InbandTextTrackPrivate*, String) { ASSERT_NOT_REACHED(); }
</ins><span class="cx">     virtual void parseWebVTTCueData(InbandTextTrackPrivate*, const char* data, unsigned length) = 0;
</span><ins>+    virtual void parseWebVTTCueData(InbandTextTrackPrivate*, const ISOWebVTTCue&amp;) = 0;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationInbandTextTrackPrivateAVFcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/InbandTextTrackPrivateAVF.cpp        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2012-2014 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -29,16 +29,27 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;InbandTextTrackPrivateAVF.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;ISOVTTCue.h&quot;
</ins><span class="cx"> #include &quot;InbandTextTrackPrivateClient.h&quot;
</span><span class="cx"> #include &quot;Logging.h&quot;
</span><span class="cx"> #include &quot;SoftLinking.h&quot;
</span><span class="cx"> #include &lt;CoreMedia/CoreMedia.h&gt;
</span><ins>+#include &lt;runtime/ArrayBuffer.h&gt;
+#include &lt;runtime/DataView.h&gt;
+#include &lt;runtime/Int8Array.h&gt;
+#include &lt;wtf/MediaTime.h&gt;
+#include &lt;wtf/NeverDestroyed.h&gt;
</ins><span class="cx"> #include &lt;wtf/PassOwnPtr.h&gt;
</span><span class="cx"> #include &lt;wtf/text/CString.h&gt;
</span><ins>+#include &lt;wtf/text/StringBuilder.h&gt;
</ins><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</span><span class="cx"> #include &lt;wtf/unicode/CharacterNames.h&gt;
</span><span class="cx"> 
</span><span class="cx"> #if !PLATFORM(WIN)
</span><ins>+#include &quot;MediaTimeMac.h&quot;
+#endif
+
+#if !PLATFORM(WIN)
</ins><span class="cx"> #define SOFT_LINK_AVF_FRAMEWORK(Lib) SOFT_LINK_FRAMEWORK_OPTIONAL(Lib)
</span><span class="cx"> #define SOFT_LINK_AVF_POINTER(Lib, Name, Type) SOFT_LINK_POINTER_OPTIONAL(Lib, Name, Type)
</span><span class="cx"> #else
</span><span class="lines">@@ -53,6 +64,15 @@
</span><span class="cx"> 
</span><span class="cx"> SOFT_LINK_AVF_FRAMEWORK(CoreMedia)
</span><span class="cx"> 
</span><ins>+#if !PLATFORM(WIN)
+SOFT_LINK(CoreMedia, CMSampleBufferGetDataBuffer, CMBlockBufferRef, (CMSampleBufferRef sbuf), (sbuf))
+SOFT_LINK(CoreMedia, CMBlockBufferCopyDataBytes, OSStatus, (CMBlockBufferRef theSourceBuffer, size_t offsetToData, size_t dataLength, void* destination), (theSourceBuffer, offsetToData, dataLength, destination))
+SOFT_LINK(CoreMedia, CMBlockBufferGetDataLength, size_t, (CMBlockBufferRef theBuffer), (theBuffer))
+SOFT_LINK(CoreMedia, CMSampleBufferGetSampleTimingInfo, OSStatus, (CMSampleBufferRef sbuf, CMItemIndex sampleIndex, CMSampleTimingInfo* timingInfoOut), (sbuf, sampleIndex, timingInfoOut))
+SOFT_LINK(CoreMedia, CMFormatDescriptionGetExtensions, CFDictionaryRef, (CMFormatDescriptionRef desc), (desc))
+SOFT_LINK(CoreMedia, CMSampleBufferGetFormatDescription, CMFormatDescriptionRef, (CMSampleBufferRef sbuf), (sbuf))
+#endif
+
</ins><span class="cx"> SOFT_LINK_AVF_POINTER(CoreMedia, kCMTextMarkupAttribute_Alignment, CFStringRef)
</span><span class="cx"> SOFT_LINK_AVF_POINTER(CoreMedia, kCMTextMarkupAlignmentType_Start, CFStringRef)
</span><span class="cx"> SOFT_LINK_AVF_POINTER(CoreMedia, kCMTextMarkupAlignmentType_Middle, CFStringRef)
</span><span class="lines">@@ -72,6 +92,7 @@
</span><span class="cx"> SOFT_LINK_AVF_POINTER(CoreMedia, kCMTextMarkupAttribute_ForegroundColorARGB, CFStringRef)
</span><span class="cx"> SOFT_LINK_AVF_POINTER(CoreMedia, kCMTextMarkupAttribute_BackgroundColorARGB, CFStringRef)
</span><span class="cx"> SOFT_LINK_AVF_POINTER(CoreMedia, kCMTextMarkupAttribute_CharacterBackgroundColorARGB, CFStringRef)
</span><ins>+SOFT_LINK_AVF_POINTER(CoreMedia, kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms, CFStringRef)
</ins><span class="cx"> 
</span><span class="cx"> #define kCMTextMarkupAttribute_Alignment getkCMTextMarkupAttribute_Alignment()
</span><span class="cx"> #define kCMTextMarkupAlignmentType_Start getkCMTextMarkupAlignmentType_Start()
</span><span class="lines">@@ -92,20 +113,26 @@
</span><span class="cx"> #define kCMTextMarkupAttribute_ForegroundColorARGB getkCMTextMarkupAttribute_ForegroundColorARGB()
</span><span class="cx"> #define kCMTextMarkupAttribute_BackgroundColorARGB getkCMTextMarkupAttribute_BackgroundColorARGB()
</span><span class="cx"> #define kCMTextMarkupAttribute_CharacterBackgroundColorARGB getkCMTextMarkupAttribute_CharacterBackgroundColorARGB()
</span><ins>+#define kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms getkCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms()
</ins><span class="cx"> 
</span><ins>+namespace JSC {
+class ArrayBuffer;
+}
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> AVFInbandTrackParent::~AVFInbandTrackParent()
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-InbandTextTrackPrivateAVF::InbandTextTrackPrivateAVF(AVFInbandTrackParent* owner)
-    : InbandTextTrackPrivate(Generic)
</del><ins>+InbandTextTrackPrivateAVF::InbandTextTrackPrivateAVF(AVFInbandTrackParent* owner, CueFormat format)
+    : InbandTextTrackPrivate(format)
</ins><span class="cx">     , m_owner(owner)
</span><span class="cx">     , m_pendingCueStatus(None)
</span><span class="cx">     , m_index(0)
</span><span class="cx">     , m_hasBeenReported(false)
</span><span class="cx">     , m_seeking(false)
</span><ins>+    , m_haveReportedVTTHeader(false)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -353,13 +380,19 @@
</span><span class="cx">         cueData-&gt;setContent(content.toString());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void InbandTextTrackPrivateAVF::processCue(CFArrayRef attributedStrings, double time)
</del><ins>+void InbandTextTrackPrivateAVF::processCue(CFArrayRef attributedStrings, CFArrayRef nativeSamples, double time)
</ins><span class="cx"> {
</span><span class="cx">     if (!client())
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    LOG(Media, &quot;InbandTextTrackPrivateAVF::processCue - %li cues at time %.2f\n&quot;, attributedStrings ? CFArrayGetCount(attributedStrings) : 0, time);
</del><ins>+    processAttributedStrings(attributedStrings, time);
+    processNativeSamples(nativeSamples, time);
+}
</ins><span class="cx"> 
</span><ins>+void InbandTextTrackPrivateAVF::processAttributedStrings(CFArrayRef attributedStrings, double time)
+{
+    LOG(Media, &quot;InbandTextTrackPrivateAVF::processAttributedStrings - %li attributed strings at time %.2f\n&quot;, attributedStrings ? CFArrayGetCount(attributedStrings) : 0, time);
+
</ins><span class="cx">     Vector&lt;RefPtr&lt;GenericCueData&gt;&gt; arrivingCues;
</span><span class="cx">     if (attributedStrings) {
</span><span class="cx">         CFIndex count = CFArrayGetCount(attributedStrings);
</span><span class="lines">@@ -442,9 +475,9 @@
</span><span class="cx">         LOG(Media, &quot;InbandTextTrackPrivateAVF::processCue(%p) - adding cue for time = %.2f, position =  %.2f, line =  %.2f&quot;, this, cueData-&gt;startTime(), cueData-&gt;position(), cueData-&gt;line());
</span><span class="cx"> 
</span><span class="cx">         client()-&gt;addGenericCue(this, cueData.release());
</span><ins>+    }
</ins><span class="cx"> 
</span><del>-        m_pendingCueStatus = seeking() ? DeliveredDuringSeek : Valid;
-    }
</del><ins>+    m_pendingCueStatus = seeking() ? DeliveredDuringSeek : Valid;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InbandTextTrackPrivateAVF::beginSeeking()
</span><span class="lines">@@ -513,6 +546,109 @@
</span><span class="cx">     m_owner-&gt;trackModeChanged();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void InbandTextTrackPrivateAVF::processNativeSamples(CFArrayRef nativeSamples, double presentationTime)
+{
+#if PLATFORM(WIN)
+    UNUSED_PARAM(nativeSamples);
+    UNUSED_PARAM(presentationTime);
+    ASSERT_NOT_REACHED();
+#else
+    if (!nativeSamples)
+        return;
+
+    CFIndex count = CFArrayGetCount(nativeSamples);
+    if (!count)
+        return;
+
+    LOG(Media, &quot;InbandTextTrackPrivateAVF::processNativeSamples - %li sample buffers at time %.2f\n&quot;, count, presentationTime);
+
+    for (CFIndex i = 0; i &lt; count; i++) {
+
+        CMSampleBufferRef sampleBuffer = (CMSampleBufferRef)CFArrayGetValueAtIndex(nativeSamples, i);
+        if (!sampleBuffer)
+            continue;
+
+        CMSampleTimingInfo timingInfo;
+        OSStatus status = CMSampleBufferGetSampleTimingInfo(sampleBuffer, i, &amp;timingInfo);
+        if (status) {
+            LOG(Media, &quot;InbandTextTrackPrivateAVF::processNativeSamples(%p) - CMSampleBufferGetSampleTimingInfo returned error %x for sample %li&quot;, this, static_cast&lt;SInt32&gt;(status), i);
+            continue;
+        }
+
+        CMBlockBufferRef blockBuffer = CMSampleBufferGetDataBuffer(sampleBuffer);
+        size_t bufferLength = CMBlockBufferGetDataLength(blockBuffer);
+        if (bufferLength &lt; ISOBox::boxHeaderSize()) {
+            LOG(Media, &quot;InbandTextTrackPrivateAVF::processNativeSamples(%p) - ERROR: CMSampleBuffer size length unexpectedly small (%zu)!!&quot;, this, bufferLength);
+            continue;
+        }
+
+        m_sampleInputBuffer.resize(m_sampleInputBuffer.size() + bufferLength);
+        CMBlockBufferCopyDataBytes(blockBuffer, 0, bufferLength, m_sampleInputBuffer.data() + m_sampleInputBuffer.size() - bufferLength);
+
+        RefPtr&lt;ArrayBuffer&gt; buffer = ArrayBuffer::create(m_sampleInputBuffer.data(), m_sampleInputBuffer.size());
+
+        String type = ISOBox::peekType(buffer.get());
+        size_t boxLength = ISOBox::peekLength(buffer.get());
+        if (boxLength &gt; buffer-&gt;byteLength()) {
+            LOG(Media, &quot;InbandTextTrackPrivateAVF::processNativeSamples(%p) - ERROR: chunk '%s' size (%zu) larger than buffer length (%u)!!&quot;, this, type.utf8().data(), boxLength, buffer-&gt;byteLength());
+            continue;
+        }
+
+        LOG(Media, &quot;InbandTextTrackPrivateAVF::processNativeSamples(%p) - chunk type = '%s', size = %zu&quot;, this, type.utf8().data(), boxLength);
+
+        if (type == ISOWebVTTCue::boxType()) {
+#if !PLATFORM(WIN)
+            ISOWebVTTCue cueData = ISOWebVTTCue(MediaTime::createWithDouble(presentationTime), toMediaTime(timingInfo.duration), buffer.get());
+#else
+            ISOWebVTTCue cueData = ISOWebVTTCue(MediaTime::createWithDouble(presentationTime), MediaTime::createWithDouble(CMTimeGetSeconds(timingInfo.duration)), buffer.get());
+#endif
+            LOG(Media, &quot;    sample presentation time = %.2f, duration = %.2f&quot;, cueData.presentationTime().toDouble(), cueData.duration().toDouble());
+            LOG(Media, &quot;    id = \&quot;%s\&quot;, settings = \&quot;%s\&quot;, cue text = \&quot;%s\&quot;&quot;, cueData.id().utf8().data(), cueData.settings().utf8().data(), cueData.cueText().utf8().data());
+            LOG(Media, &quot;    sourceID = \&quot;%s\&quot;, originalStartTime = \&quot;%s\&quot;&quot;, cueData.sourceID().utf8().data(), cueData.originalStartTime().utf8().data());
+
+            client()-&gt;parseWebVTTCueData(this, cueData);
+        }
+
+        do {
+            if (m_haveReportedVTTHeader)
+                break;
+
+            CMFormatDescriptionRef formatDescription = CMSampleBufferGetFormatDescription(sampleBuffer);
+            if (!formatDescription)
+                break;
+
+            CFDictionaryRef extensions = CMFormatDescriptionGetExtensions(formatDescription);
+            if (!extensions)
+                break;
+
+            CFDictionaryRef sampleDescriptionExtensions = static_cast&lt;CFDictionaryRef&gt;(CFDictionaryGetValue(extensions, kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms));
+            if (!sampleDescriptionExtensions)
+                break;
+            
+            CFDataRef webvttHeaderData = static_cast&lt;CFDataRef&gt;(CFDictionaryGetValue(sampleDescriptionExtensions, CFSTR(&quot;vttC&quot;)));
+            if (!webvttHeaderData)
+                break;
+
+            unsigned length = CFDataGetLength(webvttHeaderData);
+            if (!length)
+                break;
+
+            // A WebVTT header is terminated by &quot;One or more WebVTT line terminators&quot; so append two line feeds to make sure the parser
+            // reccognized this string as a full header.
+            StringBuilder header;
+            header.append(reinterpret_cast&lt;const unsigned char*&gt;(CFDataGetBytePtr(webvttHeaderData)), length);
+            header.append(&quot;\n\n&quot;);
+
+            LOG(Media, &quot;    vtt header = \n%s&quot;, header.toString().utf8().data());
+            client()-&gt;parseWebVTTFileHeader(this, header.toString());
+            m_haveReportedVTTHeader = true;
+        } while (0);
+
+        m_sampleInputBuffer.remove(0, boxLength);
+    }
+#endif
+}
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(VIDEO) &amp;&amp; (USE(AVFOUNDATION) || PLATFORM(IOS))
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationInbandTextTrackPrivateAVFh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/InbandTextTrackPrivateAVF.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/InbandTextTrackPrivateAVF.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/InbandTextTrackPrivateAVF.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -55,7 +55,7 @@
</span><span class="cx">     bool hasBeenReported() const { return m_hasBeenReported; }
</span><span class="cx">     void setHasBeenReported(bool reported) { m_hasBeenReported = reported; }
</span><span class="cx"> 
</span><del>-    virtual void processCue(CFArrayRef, double);
</del><ins>+    virtual void processCue(CFArrayRef attributedStrings, CFArrayRef nativeSamples, double);
</ins><span class="cx">     virtual void resetCueValues();
</span><span class="cx"> 
</span><span class="cx">     void beginSeeking();
</span><span class="lines">@@ -68,13 +68,15 @@
</span><span class="cx">         InBand
</span><span class="cx">     };
</span><span class="cx">     virtual Category textTrackCategory() const = 0;
</span><del>-    
</del><ins>+
</ins><span class="cx">     virtual double startTimeVariance() const override { return 0.25; }
</span><del>-    
</del><ins>+
</ins><span class="cx"> protected:
</span><del>-    InbandTextTrackPrivateAVF(AVFInbandTrackParent*);
</del><ins>+    InbandTextTrackPrivateAVF(AVFInbandTrackParent*, CueFormat);
</ins><span class="cx"> 
</span><span class="cx">     void processCueAttributes(CFAttributedStringRef, GenericCueData*);
</span><ins>+    void processAttributedStrings(CFArrayRef, double);
+    void processNativeSamples(CFArrayRef, double);
</ins><span class="cx">     void removeCompletedCues();
</span><span class="cx"> 
</span><span class="cx">     double m_currentCueStartTime;
</span><span class="lines">@@ -83,6 +85,8 @@
</span><span class="cx">     Vector&lt;RefPtr&lt;GenericCueData&gt;&gt; m_cues;
</span><span class="cx">     AVFInbandTrackParent* m_owner;
</span><span class="cx"> 
</span><ins>+    Vector&lt;char&gt; m_sampleInputBuffer;
+
</ins><span class="cx">     enum PendingCueStatus {
</span><span class="cx">         None,
</span><span class="cx">         DeliveredDuringSeek,
</span><span class="lines">@@ -93,6 +97,7 @@
</span><span class="cx">     int m_index;
</span><span class="cx">     bool m_hasBeenReported;
</span><span class="cx">     bool m_seeking;
</span><ins>+    bool m_haveReportedVTTHeader;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationcfInbandTextTrackPrivateAVCFcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.cpp (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.cpp        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.cpp        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -45,8 +45,8 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-InbandTextTrackPrivateAVCF::InbandTextTrackPrivateAVCF(AVFInbandTrackParent* player, AVCFMediaSelectionOptionRef selection)
-    : InbandTextTrackPrivateAVF(player)
</del><ins>+InbandTextTrackPrivateAVCF::InbandTextTrackPrivateAVCF(AVFInbandTrackParent* player, AVCFMediaSelectionOptionRef selection, InbandTextTrackPrivate::CueFormat format)
+    : InbandTextTrackPrivateAVF(player, format)
</ins><span class="cx">     , m_mediaSelectionOption(selection)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationcfInbandTextTrackPrivateAVCFh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/cf/InbandTextTrackPrivateAVCF.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -36,9 +36,9 @@
</span><span class="cx"> 
</span><span class="cx"> class InbandTextTrackPrivateAVCF : public InbandTextTrackPrivateAVF {
</span><span class="cx"> public:
</span><del>-    static PassRefPtr&lt;InbandTextTrackPrivateAVCF&gt; create(AVFInbandTrackParent* player,  AVCFMediaSelectionOptionRef selection)
</del><ins>+    static PassRefPtr&lt;InbandTextTrackPrivateAVCF&gt; create(AVFInbandTrackParent* player,  AVCFMediaSelectionOptionRef selection, InbandTextTrackPrivate::CueFormat format)
</ins><span class="cx">     {
</span><del>-        return adoptRef(new InbandTextTrackPrivateAVCF(player, selection));
</del><ins>+        return adoptRef(new InbandTextTrackPrivateAVCF(player, selection, format));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ~InbandTextTrackPrivateAVCF() { }
</span><span class="lines">@@ -60,7 +60,7 @@
</span><span class="cx">     AVCFMediaSelectionOptionRef mediaSelectionOption() const { return m_mediaSelectionOption.get(); }
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    InbandTextTrackPrivateAVCF(AVFInbandTrackParent*, AVCFMediaSelectionOptionRef);
</del><ins>+    InbandTextTrackPrivateAVCF(AVFInbandTrackParent*, AVCFMediaSelectionOptionRef, InbandTextTrackPrivate::CueFormat);
</ins><span class="cx">     
</span><span class="cx">     RetainPtr&lt;AVCFMediaSelectionOptionRef&gt; m_mediaSelectionOption;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationcfMediaPlayerPrivateAVFoundationCFcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/cf/MediaPlayerPrivateAVFoundationCF.cpp        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -1093,7 +1093,7 @@
</span><span class="cx">         if (!newTrack)
</span><span class="cx">             continue;
</span><span class="cx"> 
</span><del>-        m_textTracks.append(InbandTextTrackPrivateAVCF::create(this, option));
</del><ins>+        m_textTracks.append(InbandTextTrackPrivateAVCF::create(this, option, InbandTextTrackPrivate::Generic));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     processNewAndRemovedTextTracks(removedTextTracks);
</span><span class="lines">@@ -1594,11 +1594,12 @@
</span><span class="cx"> #if HAVE(AVFOUNDATION_MEDIA_SELECTION_GROUP) &amp;&amp; HAVE(AVFOUNDATION_LEGIBLE_OUTPUT_SUPPORT)
</span><span class="cx"> struct LegibleOutputData {
</span><span class="cx">     RetainPtr&lt;CFArrayRef&gt; m_attributedStrings;
</span><ins>+    RetainPtr&lt;CFArrayRef&gt; m_samples;
</ins><span class="cx">     double m_time;
</span><span class="cx">     void* m_context;
</span><span class="cx"> 
</span><del>-    LegibleOutputData(CFArrayRef strings, double time, void* context)
-        : m_attributedStrings(strings), m_time(time), m_context(context)
</del><ins>+    LegibleOutputData(CFArrayRef strings, CFArrayRef samples, double time, void* context)
+        : m_attributedStrings(strings), m_samples(samples), m_time(time), m_context(context)
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="lines">@@ -1623,10 +1624,10 @@
</span><span class="cx">     if (!self-&gt;m_currentTextTrack)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    self-&gt;m_currentTextTrack-&gt;processCue(legibleOutputData-&gt;m_attributedStrings.get(), legibleOutputData-&gt;m_time);
</del><ins>+    self-&gt;m_currentTextTrack-&gt;processCue(legibleOutputData-&gt;m_attributedStrings.get(), legibleOutputData-&gt;m_samples.get(), legibleOutputData-&gt;m_time);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void AVFWrapper::legibleOutputCallback(void* context, AVCFPlayerItemLegibleOutputRef legibleOutput, CFArrayRef attributedStrings, CFArrayRef /*nativeSampleBuffers*/, CMTime itemTime)
</del><ins>+void AVFWrapper::legibleOutputCallback(void* context, AVCFPlayerItemLegibleOutputRef legibleOutput, CFArrayRef attributedStrings, CFArrayRef nativeSampleBuffers, CMTime itemTime)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(dispatch_get_main_queue() != dispatch_get_current_queue());
</span><span class="cx">     MutexLocker locker(mapLock());
</span><span class="lines">@@ -1640,7 +1641,7 @@
</span><span class="cx"> 
</span><span class="cx">     ASSERT(legibleOutput == self-&gt;m_legibleOutput);
</span><span class="cx"> 
</span><del>-    OwnPtr&lt;LegibleOutputData&gt; legibleOutputData = adoptPtr(new LegibleOutputData(attributedStrings, CMTimeGetSeconds(itemTime), context));
</del><ins>+    OwnPtr&lt;LegibleOutputData&gt; legibleOutputData = adoptPtr(new LegibleOutputData(attributedStrings, nativeSampleBuffers, CMTimeGetSeconds(itemTime), context));
</ins><span class="cx"> 
</span><span class="cx">     dispatch_async_f(dispatch_get_main_queue(), legibleOutputData.leakPtr(), processCue);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcInbandTextTrackPrivateAVFObjCh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -31,15 +31,16 @@
</span><span class="cx"> #include &quot;InbandTextTrackPrivateAVF.h&quot;
</span><span class="cx"> #include &lt;wtf/RetainPtr.h&gt;
</span><span class="cx"> 
</span><ins>+OBJC_CLASS AVAsset;
</ins><span class="cx"> OBJC_CLASS AVMediaSelectionOption;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> class InbandTextTrackPrivateAVFObjC : public InbandTextTrackPrivateAVF {
</span><span class="cx"> public:
</span><del>-    static PassRefPtr&lt;InbandTextTrackPrivateAVFObjC&gt; create(AVFInbandTrackParent* player,  AVMediaSelectionOption *selection)
</del><ins>+    static PassRefPtr&lt;InbandTextTrackPrivateAVFObjC&gt; create(AVFInbandTrackParent* player,  AVMediaSelectionOption *selection, InbandTextTrackPrivate::CueFormat format)
</ins><span class="cx">     {
</span><del>-        return adoptRef(new InbandTextTrackPrivateAVFObjC(player, selection));
</del><ins>+        return adoptRef(new InbandTextTrackPrivateAVFObjC(player, selection, format));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ~InbandTextTrackPrivateAVFObjC() { }
</span><span class="lines">@@ -61,7 +62,7 @@
</span><span class="cx">     AVMediaSelectionOption *mediaSelectionOption() const { return m_mediaSelectionOption.get(); }
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><del>-    InbandTextTrackPrivateAVFObjC(AVFInbandTrackParent*, AVMediaSelectionOption *);
</del><ins>+    InbandTextTrackPrivateAVFObjC(AVFInbandTrackParent*, AVMediaSelectionOption *, InbandTextTrackPrivate::CueFormat);
</ins><span class="cx">     
</span><span class="cx">     RetainPtr&lt;AVMediaSelectionOption&gt; m_mediaSelectionOption;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcInbandTextTrackPrivateAVFObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.mm (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.mm        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateAVFObjC.mm        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -76,8 +76,8 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-InbandTextTrackPrivateAVFObjC::InbandTextTrackPrivateAVFObjC(AVFInbandTrackParent* player, AVMediaSelectionOption *selection)
-    : InbandTextTrackPrivateAVF(player)
</del><ins>+InbandTextTrackPrivateAVFObjC::InbandTextTrackPrivateAVFObjC(AVFInbandTrackParent* player, AVMediaSelectionOption *selection, InbandTextTrackPrivate::CueFormat format)
+    : InbandTextTrackPrivateAVF(player, format)
</ins><span class="cx">     , m_mediaSelectionOption(selection)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcInbandTextTrackPrivateLegacyAVFObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateLegacyAVFObjC.mm (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateLegacyAVFObjC.mm        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/InbandTextTrackPrivateLegacyAVFObjC.mm        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -56,7 +56,7 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> InbandTextTrackPrivateLegacyAVFObjC::InbandTextTrackPrivateLegacyAVFObjC(MediaPlayerPrivateAVFoundationObjC* player, AVPlayerItemTrack* track)
</span><del>-    : InbandTextTrackPrivateAVF(player)
</del><ins>+    : InbandTextTrackPrivateAVF(player, InbandTextTrackPrivate::Generic)
</ins><span class="cx">     , m_playerItemTrack(track)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -76,7 +76,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if HAVE(AVFOUNDATION_MEDIA_SELECTION_GROUP)
</span><span class="cx">     RetainPtr&lt;AVPlayerItem&gt; playerItem() const { return m_avPlayerItem; }
</span><del>-    void processCue(NSArray *, double);
</del><ins>+    void processCue(NSArray *, NSArray *, double);
</ins><span class="cx">     void flushCues();
</span><span class="cx"> #endif
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -676,7 +676,7 @@
</span><span class="cx">     if (m_avAsset)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    LOG(Media, &quot;MediaPlayerPrivateAVFoundationObjC::createAVAssetForURL(%p)&quot;, this);
</del><ins>+    LOG(Media, &quot;MediaPlayerPrivateAVFoundationObjC::createAVAssetForURL(%p) - url = %s&quot;, this, url.utf8().data());
</ins><span class="cx"> 
</span><span class="cx">     setDelayCallbacks(true);
</span><span class="cx"> 
</span><span class="lines">@@ -808,7 +808,8 @@
</span><span class="cx"> #if HAVE(AVFOUNDATION_MEDIA_SELECTION_GROUP) &amp;&amp; HAVE(AVFOUNDATION_LEGIBLE_OUTPUT_SUPPORT)
</span><span class="cx">     const NSTimeInterval legibleOutputAdvanceInterval = 2;
</span><span class="cx"> 
</span><del>-    m_legibleOutput = adoptNS([[AVPlayerItemLegibleOutput alloc] initWithMediaSubtypesForNativeRepresentation:[NSArray array]]);
</del><ins>+    RetainPtr&lt;NSArray&gt; subtypes = adoptNS([[NSArray alloc] initWithObjects:[NSNumber numberWithUnsignedInt:kCMSubtitleFormatType_WebVTT], nil]);
+    m_legibleOutput = adoptNS([[AVPlayerItemLegibleOutput alloc] initWithMediaSubtypesForNativeRepresentation:subtypes.get()]);
</ins><span class="cx">     [m_legibleOutput.get() setSuppressesPlayerRendering:YES];
</span><span class="cx"> 
</span><span class="cx">     [m_legibleOutput.get() setDelegate:m_objcObserver.get() queue:dispatch_get_main_queue()];
</span><span class="lines">@@ -1577,7 +1578,8 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> #if HAVE(AVFOUNDATION_MEDIA_SELECTION_GROUP)
</span><del>-    if (AVMediaSelectionGroupType *legibleGroup = safeMediaSelectionGroupForLegibleMedia()) {
</del><ins>+    AVMediaSelectionGroupType *legibleGroup = safeMediaSelectionGroupForLegibleMedia();
+    if (legibleGroup &amp;&amp; m_cachedTracks) {
</ins><span class="cx">         hasCaptions = [[AVMediaSelectionGroup playableMediaSelectionOptionsFromArray:[legibleGroup options]] count];
</span><span class="cx">         if (hasCaptions)
</span><span class="cx">             processMediaSelectionOptions();
</span><span class="lines">@@ -2164,7 +2166,7 @@
</span><span class="cx">         }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-        m_textTracks.append(InbandTextTrackPrivateAVFObjC::create(this, option));
</del><ins>+        m_textTracks.append(InbandTextTrackPrivateAVFObjC::create(this, option, InbandTextTrackPrivate::Generic));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     processNewAndRemovedTextTracks(removedTextTracks);
</span><span class="lines">@@ -2180,12 +2182,12 @@
</span><span class="cx">     player()-&gt;addTextTrack(m_metadataTrack);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void MediaPlayerPrivateAVFoundationObjC::processCue(NSArray *attributedStrings, double time)
</del><ins>+void MediaPlayerPrivateAVFoundationObjC::processCue(NSArray *attributedStrings, NSArray *nativeSamples, double time)
</ins><span class="cx"> {
</span><span class="cx">     if (!m_currentTextTrack)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    m_currentTextTrack-&gt;processCue(reinterpret_cast&lt;CFArrayRef&gt;(attributedStrings), time);
</del><ins>+    m_currentTextTrack-&gt;processCue(reinterpret_cast&lt;CFArrayRef&gt;(attributedStrings), reinterpret_cast&lt;CFArrayRef&gt;(nativeSamples), time);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void MediaPlayerPrivateAVFoundationObjC::flushCues()
</span><span class="lines">@@ -2734,11 +2736,12 @@
</span><span class="cx"> 
</span><span class="cx">     RetainPtr&lt;WebCoreAVFMovieObserver&gt; strongSelf = self;
</span><span class="cx">     RetainPtr&lt;NSArray&gt; strongStrings = strings;
</span><del>-    callOnMainThread([strongSelf, strongStrings, itemTime] {
</del><ins>+    RetainPtr&lt;NSArray&gt; strongSamples = nativeSamples;
+    callOnMainThread([strongSelf, strongStrings, strongSamples, itemTime] {
</ins><span class="cx">         MediaPlayerPrivateAVFoundationObjC* callback = strongSelf-&gt;m_callback;
</span><span class="cx">         if (!callback)
</span><span class="cx">             return;
</span><del>-        callback-&gt;processCue(strongStrings.get(), CMTimeGetSeconds(itemTime));
</del><ins>+        callback-&gt;processCue(strongStrings.get(), strongSamples.get(), CMTimeGetSeconds(itemTime));
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcOutOfBandTextTrackPrivateAVFh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/OutOfBandTextTrackPrivateAVF.h (170378 => 170379)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/OutOfBandTextTrackPrivateAVF.h        2014-06-24 19:18:49 UTC (rev 170378)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/OutOfBandTextTrackPrivateAVF.h        2014-06-24 19:35:47 UTC (rev 170379)
</span><span class="lines">@@ -41,7 +41,7 @@
</span><span class="cx">         return adoptRef(new OutOfBandTextTrackPrivateAVF(player, selection));
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    virtual void processCue(CFArrayRef, double) override { }
</del><ins>+    virtual void processCue(CFArrayRef, CFArrayRef, double) override { }
</ins><span class="cx">     virtual void resetCueValues() override { }
</span><span class="cx">     
</span><span class="cx">     virtual Category textTrackCategory() const override { return OutOfBand; }
</span><span class="lines">@@ -50,7 +50,7 @@
</span><span class="cx">     
</span><span class="cx"> protected:
</span><span class="cx">     OutOfBandTextTrackPrivateAVF(AVFInbandTrackParent* player, AVMediaSelectionOption* selection)
</span><del>-        : InbandTextTrackPrivateAVF(player)
</del><ins>+        : InbandTextTrackPrivateAVF(player, InbandTextTrackPrivate::Generic)
</ins><span class="cx">         , m_mediaSelectionOption(selection)
</span><span class="cx">     {
</span><span class="cx">     }
</span></span></pre>
</div>
</div>

</body>
</html>