<!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>[175826] trunk</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/175826">175826</a></dd>
<dt>Author</dt> <dd>jer.noble@apple.com</dd>
<dt>Date</dt> <dd>2014-11-10 12:43:50 -0800 (Mon, 10 Nov 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>REGRESSION(<a href="http://trac.webkit.org/projects/webkit/changeset/174823">r174823</a>): Several tests fail due to canplaythrough firing before tracks are available
https://bugs.webkit.org/show_bug.cgi?id=137882

Reviewed by Eric Carlson.

Source/WebCore:

For HLS streams with only one video, audio, or text track, there will be no media selection group
for that media characteristic. When culling out AVPlayerItemTracks in tracksDidChange(), do not skip
tracks for which there is no matching AVMediaSelectionGroup.

* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
(WebCore::MediaPlayerPrivateAVFoundationObjC::hasLoadedMediaSelectionGroups): Refactored.
(WebCore::MediaPlayerPrivateAVFoundationObjC::safeMediaSelectionGroupForLegibleMedia): Call above.
(WebCore::MediaPlayerPrivateAVFoundationObjC::safeMediaSelectionGroupForAudibleMedia): Ditto.
(WebCore::MediaPlayerPrivateAVFoundationObjC::safeMediaSelectionGroupForVisualMedia): Ditto.
(WebCore::MediaPlayerPrivateAVFoundationObjC::tracksDidChange):

LayoutTests:

* platform/mac/TestExpectations:
* platform/mac/http/tests/media/hls/video-controls-live-stream-expected.txt:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsplatformmacTestExpectations">trunk/LayoutTests/platform/mac/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsplatformmachttptestsmediahlsvideocontrolslivestreamexpectedtxt">trunk/LayoutTests/platform/mac/http/tests/media/hls/video-controls-live-stream-expected.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</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>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (175825 => 175826)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-11-10 20:39:24 UTC (rev 175825)
+++ trunk/LayoutTests/ChangeLog        2014-11-10 20:43:50 UTC (rev 175826)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2014-11-04  Jer Noble  &lt;jer.noble@apple.com&gt;
+
+        REGRESSION(r174823): Several tests fail due to canplaythrough firing before tracks are available
+        https://bugs.webkit.org/show_bug.cgi?id=137882
+
+        Reviewed by Eric Carlson.
+
+        * platform/mac/TestExpectations:
+        * platform/mac/http/tests/media/hls/video-controls-live-stream-expected.txt:
+
</ins><span class="cx"> 2014-11-10  Commit Queue  &lt;commit-queue@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r175813.
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmacTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac/TestExpectations (175825 => 175826)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac/TestExpectations        2014-11-10 20:39:24 UTC (rev 175825)
+++ trunk/LayoutTests/platform/mac/TestExpectations        2014-11-10 20:43:50 UTC (rev 175826)
</span><span class="lines">@@ -1502,9 +1502,7 @@
</span><span class="cx"> [ Yosemite ] inspector/model/parse-script-syntax-tree.html [ Failure Crash ]
</span><span class="cx"> [ Yosemite ] inspector/protocol-promise-result.html [ Failure Crash ]
</span><span class="cx"> 
</span><del>-webkit.org/b/137882 http/tests/media/hls/video-controls-live-stream.html [ Failure ]
-webkit.org/b/137882 http/tests/media/track-in-band-hls-metadata.html [ Failure ]
-webkit.org/b/137882 media/track/audio-track.html [ Pass Failure ]
</del><ins>+webkit.org/b/138394 media/track/audio-track.html [ Pass Failure ]
</ins><span class="cx"> 
</span><span class="cx"> # Specific to Yosemite's font fallback
</span><span class="cx"> webkit.org/b/138328 [ Mavericks MountainLion ] platform/mac/fast/text/font-cursive-italic-cjk.html [ Skip ]
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmachttptestsmediahlsvideocontrolslivestreamexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac/http/tests/media/hls/video-controls-live-stream-expected.txt (175825 => 175826)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac/http/tests/media/hls/video-controls-live-stream-expected.txt        2014-11-10 20:39:24 UTC (rev 175825)
+++ trunk/LayoutTests/platform/mac/http/tests/media/hls/video-controls-live-stream-expected.txt        2014-11-10 20:43:50 UTC (rev 175826)
</span><span class="lines">@@ -2,7 +2,6 @@
</span><span class="cx"> EVENT(play)
</span><span class="cx"> EXPECTED (video.duration == 'Infinity') OK
</span><span class="cx"> -webkit-media-text-track-container: classes: [hidden]
</span><del>--webkit-media-controls-panel-composited-parent: classes: []
</del><span class="cx"> -webkit-media-controls-panel: classes: [paused]
</span><span class="cx"> -webkit-media-controls-play-button: classes: [paused]
</span><span class="cx"> -webkit-media-controls-status-display: classes: []
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (175825 => 175826)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-11-10 20:39:24 UTC (rev 175825)
+++ trunk/Source/WebCore/ChangeLog        2014-11-10 20:43:50 UTC (rev 175826)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2014-11-04  Jer Noble  &lt;jer.noble@apple.com&gt;
+
+        REGRESSION(r174823): Several tests fail due to canplaythrough firing before tracks are available
+        https://bugs.webkit.org/show_bug.cgi?id=137882
+
+        Reviewed by Eric Carlson.
+
+        For HLS streams with only one video, audio, or text track, there will be no media selection group
+        for that media characteristic. When culling out AVPlayerItemTracks in tracksDidChange(), do not skip
+        tracks for which there is no matching AVMediaSelectionGroup.
+
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::hasLoadedMediaSelectionGroups): Refactored.
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::safeMediaSelectionGroupForLegibleMedia): Call above.
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::safeMediaSelectionGroupForAudibleMedia): Ditto.
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::safeMediaSelectionGroupForVisualMedia): Ditto.
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::tracksDidChange):
+
</ins><span class="cx"> 2014-11-10  Commit Queue  &lt;commit-queue@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r175813.
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h (175825 => 175826)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h        2014-11-10 20:39:24 UTC (rev 175825)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h        2014-11-10 20:43:50 UTC (rev 175826)
</span><span class="lines">@@ -245,6 +245,8 @@
</span><span class="cx"> 
</span><span class="cx"> #if HAVE(AVFOUNDATION_MEDIA_SELECTION_GROUP)
</span><span class="cx">     void processMediaSelectionOptions();
</span><ins>+    bool hasLoadedMediaSelectionGroups();
+
</ins><span class="cx">     AVMediaSelectionGroup* safeMediaSelectionGroupForLegibleMedia();
</span><span class="cx">     AVMediaSelectionGroup* safeMediaSelectionGroupForAudibleMedia();
</span><span class="cx">     AVMediaSelectionGroup* safeMediaSelectionGroupForVisualMedia();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsavfoundationobjcMediaPlayerPrivateAVFoundationObjCmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm (175825 => 175826)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm        2014-11-10 20:39:24 UTC (rev 175825)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm        2014-11-10 20:43:50 UTC (rev 175826)
</span><span class="lines">@@ -2328,36 +2328,38 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if HAVE(AVFOUNDATION_MEDIA_SELECTION_GROUP)
</span><del>-AVMediaSelectionGroupType* MediaPlayerPrivateAVFoundationObjC::safeMediaSelectionGroupForLegibleMedia()
</del><ins>+bool MediaPlayerPrivateAVFoundationObjC::hasLoadedMediaSelectionGroups()
</ins><span class="cx"> {
</span><span class="cx">     if (!m_avAsset)
</span><del>-        return nil;
-    
</del><ins>+        return false;
+
</ins><span class="cx">     if ([m_avAsset.get() statusOfValueForKey:@&quot;availableMediaCharacteristicsWithMediaSelectionOptions&quot; error:NULL] != AVKeyValueStatusLoaded)
</span><ins>+        return false;
+
+    return true;
+}
+
+AVMediaSelectionGroupType* MediaPlayerPrivateAVFoundationObjC::safeMediaSelectionGroupForLegibleMedia()
+{
+    if (!hasLoadedMediaSelectionGroups())
</ins><span class="cx">         return nil;
</span><del>-    
</del><ins>+
</ins><span class="cx">     return [m_avAsset.get() mediaSelectionGroupForMediaCharacteristic:AVMediaCharacteristicLegible];
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> AVMediaSelectionGroupType* MediaPlayerPrivateAVFoundationObjC::safeMediaSelectionGroupForAudibleMedia()
</span><span class="cx"> {
</span><del>-    if (!m_avAsset)
</del><ins>+    if (!hasLoadedMediaSelectionGroups())
</ins><span class="cx">         return nil;
</span><span class="cx"> 
</span><del>-    if ([m_avAsset.get() statusOfValueForKey:@&quot;availableMediaCharacteristicsWithMediaSelectionOptions&quot; error:NULL] != AVKeyValueStatusLoaded)
-        return nil;
-
</del><span class="cx">     return [m_avAsset.get() mediaSelectionGroupForMediaCharacteristic:AVMediaCharacteristicAudible];
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> AVMediaSelectionGroupType* MediaPlayerPrivateAVFoundationObjC::safeMediaSelectionGroupForVisualMedia()
</span><span class="cx"> {
</span><del>-    if (!m_avAsset)
</del><ins>+    if (!hasLoadedMediaSelectionGroups())
</ins><span class="cx">         return nil;
</span><span class="cx"> 
</span><del>-    if ([m_avAsset.get() statusOfValueForKey:@&quot;availableMediaCharacteristicsWithMediaSelectionOptions&quot; error:NULL] != AVKeyValueStatusLoaded)
-        return nil;
-
</del><span class="cx">     return [m_avAsset.get() mediaSelectionGroupForMediaCharacteristic:AVMediaCharacteristicVisual];
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -2753,10 +2755,26 @@
</span><span class="cx"> 
</span><span class="cx">     NSArray *assetTracks = [m_avAsset tracks];
</span><span class="cx"> 
</span><del>-    // Tracks which are not present in the AVAsset are streaming tracks, and will instead be represented by
-    // AVMediaSelectionOptions.
</del><span class="cx">     m_cachedTracks = [tracks objectsAtIndexes:[tracks indexesOfObjectsPassingTest:^(id obj, NSUInteger, BOOL*) {
</span><del>-        return [assetTracks containsObject:[obj assetTrack]];
</del><ins>+        AVAssetTrack* assetTrack = [obj assetTrack];
+
+        if ([assetTracks containsObject:assetTrack])
+            return YES;
+
+        // Track is a streaming track. Omit if it belongs to a valid AVMediaSelectionGroup.
+        if (!hasLoadedMediaSelectionGroups())
+            return NO;
+
+        if ([assetTrack hasMediaCharacteristic:AVMediaCharacteristicAudible] &amp;&amp; safeMediaSelectionGroupForAudibleMedia())
+            return NO;
+
+        if ([assetTrack hasMediaCharacteristic:AVMediaCharacteristicVisual] &amp;&amp; safeMediaSelectionGroupForVisualMedia())
+            return NO;
+
+        if ([assetTrack hasMediaCharacteristic:AVMediaCharacteristicLegible] &amp;&amp; safeMediaSelectionGroupForLegibleMedia())
+            return NO;
+
+        return YES;
</ins><span class="cx">     }]];
</span><span class="cx"> 
</span><span class="cx">     for (AVPlayerItemTrack *track in m_cachedTracks.get())
</span></span></pre>
</div>
</div>

</body>
</html>