Use displayNameForTrack instead of textTrack->label() for captions.
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 3 May 2014 01:13:40 +0000 (01:13 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 3 May 2014 01:13:40 +0000 (01:13 +0000)
https://bugs.webkit.org/show_bug.cgi?id=131311

Patch by Jeremy Jones <jeremyj@apple.com> on 2014-05-02
Reviewed by Darin Adler.

Use the same mechanism as the desktop to build the captions list so it has the correct
names in the correct order including none and automatic.

* platform/ios/WebVideoFullscreenModelMediaElement.h:
* platform/ios/WebVideoFullscreenModelMediaElement.mm:
(WebVideoFullscreenModelMediaElement::setMediaElement):
move legible track code into updateLegibleOptions()

(WebVideoFullscreenModelMediaElement::handleEvent):
updateLegibleOptions on addTrack and removeTrack

(WebVideoFullscreenModelMediaElement::selectLegibleMediaOption):
select the corresponding TextTrack on HTMLMediaElement.

(WebVideoFullscreenModelMediaElement::updateLegibleOptions):
use the same mechanism as desktop to build the captions menu.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@168216 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/ios/WebVideoFullscreenModelMediaElement.h
Source/WebCore/platform/ios/WebVideoFullscreenModelMediaElement.mm

index 6601987..d5e5a92 100644 (file)
@@ -1,5 +1,29 @@
 2014-05-02  Jeremy Jones  <jeremyj@apple.com>
 
+        Use displayNameForTrack instead of textTrack->label() for captions.
+        https://bugs.webkit.org/show_bug.cgi?id=131311
+
+        Reviewed by Darin Adler.
+
+        Use the same mechanism as the desktop to build the captions list so it has the correct
+        names in the correct order including none and automatic.
+
+        * platform/ios/WebVideoFullscreenModelMediaElement.h:
+        * platform/ios/WebVideoFullscreenModelMediaElement.mm:
+        (WebVideoFullscreenModelMediaElement::setMediaElement):
+        move legible track code into updateLegibleOptions()
+
+        (WebVideoFullscreenModelMediaElement::handleEvent):
+        updateLegibleOptions on addTrack and removeTrack
+
+        (WebVideoFullscreenModelMediaElement::selectLegibleMediaOption):
+        select the corresponding TextTrack on HTMLMediaElement.
+
+        (WebVideoFullscreenModelMediaElement::updateLegibleOptions):
+        use the same mechanism as desktop to build the captions menu.
+
+2014-05-02  Jeremy Jones  <jeremyj@apple.com>
+
         CSS-based Media Controls Show Different times content longer than 1 hour.
         https://bugs.webkit.org/show_bug.cgi?id=132443
 
index 8c9e610..ddf3fa6 100644 (file)
 #include <WebCore/WebVideoFullscreenModel.h>
 #include <wtf/RefPtr.h>
 #include <wtf/RetainPtr.h>
+#include <wtf/Vector.h>
 
 namespace WebCore {
 class HTMLMediaElement;
+class TextTrack;
 class WebVideoFullscreenInterface;
 
 class WebVideoFullscreenModelMediaElement : public WebVideoFullscreenModel, public EventListener {
-    RefPtr<HTMLMediaElement> m_mediaElement;
-    RetainPtr<PlatformLayer> m_videoFullscreenLayer;
-    bool m_isListening;
-    WebVideoFullscreenInterface* m_videoFullscreenInterface;
-    FloatRect m_videoFrame;
-    
 public:
     WebVideoFullscreenModelMediaElement();
     virtual ~WebVideoFullscreenModelMediaElement();
@@ -67,6 +63,16 @@ public:
     virtual void setVideoLayerGravity(WebVideoFullscreenModel::VideoGravity) override;
     virtual void selectAudioMediaOption(uint64_t index) override;
     virtual void selectLegibleMediaOption(uint64_t index) override;
+
+private:
+    RefPtr<HTMLMediaElement> m_mediaElement;
+    RetainPtr<PlatformLayer> m_videoFullscreenLayer;
+    bool m_isListening;
+    WebVideoFullscreenInterface* m_videoFullscreenInterface;
+    FloatRect m_videoFrame;
+    Vector<RefPtr<TextTrack>> m_legibleTracksForMenu;
+
+    void updateLegibleOptions();
 };
 
 }
index 94b695f..8b485b4 100644 (file)
 #import <WebCore/HTMLElement.h>
 #import <WebCore/HTMLMediaElement.h>
 #import <WebCore/HTMLVideoElement.h>
+#import <WebCore/Page.h>
+#import <WebCore/PageGroup.h>
 #import <WebCore/SoftLinking.h>
+#import <WebCore/TextTrackList.h>
 #import <WebCore/TimeRanges.h>
 #import <WebCore/WebCoreThreadRun.h>
 #import <QuartzCore/CoreAnimation.h>
@@ -68,6 +71,8 @@ void WebVideoFullscreenModelMediaElement::setMediaElement(HTMLMediaElement* medi
         m_mediaElement->removeEventListener(eventNames().playEvent, this, false);
         m_mediaElement->removeEventListener(eventNames().ratechangeEvent, this, false);
         m_mediaElement->removeEventListener(eventNames().timeupdateEvent, this, false);
+        m_mediaElement->removeEventListener(eventNames().addtrackEvent, this, false);
+        m_mediaElement->removeEventListener(eventNames().removetrackEvent, this, false);
     }
     m_isListening = false;
 
@@ -81,19 +86,16 @@ void WebVideoFullscreenModelMediaElement::setMediaElement(HTMLMediaElement* medi
     m_mediaElement->addEventListener(eventNames().playEvent, this, false);
     m_mediaElement->addEventListener(eventNames().ratechangeEvent, this, false);
     m_mediaElement->addEventListener(eventNames().timeupdateEvent, this, false);
+    m_mediaElement->addEventListener(eventNames().addtrackEvent, this, false);
+    m_mediaElement->addEventListener(eventNames().removetrackEvent, this, false);
     m_isListening = true;
 
     m_videoFullscreenInterface->setDuration(m_mediaElement->duration());
     m_videoFullscreenInterface->setSeekableRanges(*m_mediaElement->seekable());
     m_videoFullscreenInterface->setRate(!m_mediaElement->paused(), m_mediaElement->playbackRate());
 
-    Vector<String> legibleOptions;
-    
-    for (auto& textTrack : m_mediaElement->platformTextTracks())
-        legibleOptions.append(textTrack->label());
-    
-    m_videoFullscreenInterface->setLegibleMediaSelectionOptions(legibleOptions, 0);
-    
+    updateLegibleOptions();
+
     m_videoFullscreenInterface->setCurrentTime(m_mediaElement->currentTime(), [[NSProcessInfo processInfo] systemUptime]);
 
     if (isHTMLVideoElement(m_mediaElement.get())) {
@@ -120,7 +122,8 @@ void WebVideoFullscreenModelMediaElement::handleEvent(WebCore::ScriptExecutionCo
         m_videoFullscreenInterface->setCurrentTime(m_mediaElement->currentTime(), [[NSProcessInfo processInfo] systemUptime]);
         // FIXME: 130788 - find a better event to update seekable ranges from.
         m_videoFullscreenInterface->setSeekableRanges(*m_mediaElement->seekable());
-    }
+    } else if (event->type() == eventNames().addtrackEvent || event->type() == eventNames().removetrackEvent)
+        updateLegibleOptions();
 }
 
 void WebVideoFullscreenModelMediaElement::setVideoFullscreenLayer(PlatformLayer* videoLayer)
@@ -211,12 +214,28 @@ void WebVideoFullscreenModelMediaElement::selectAudioMediaOption(uint64_t)
 
 void WebVideoFullscreenModelMediaElement::selectLegibleMediaOption(uint64_t index)
 {
-    RefPtr<PlatformTextTrack> platformTrack;
+    TextTrack* textTrack = nullptr;
     
-    if (index < m_mediaElement->platformTextTracks().size())
-        platformTrack = m_mediaElement->platformTextTracks()[static_cast<size_t>(index)];
+    if (index < m_legibleTracksForMenu.size())
+        textTrack = m_legibleTracksForMenu[static_cast<size_t>(index)].get();
     
-    m_mediaElement->setSelectedTextTrack(platformTrack);
+    m_mediaElement->setSelectedTextTrack(textTrack);
+}
+
+void WebVideoFullscreenModelMediaElement::updateLegibleOptions()
+{
+    TextTrackList* trackList = m_mediaElement->textTracks();
+    if (!trackList || !trackList->length() || !m_mediaElement->document().page())
+        return;
+
+    CaptionUserPreferences& captionPreferences = *m_mediaElement->document().page()->group().captionPreferences();
+    m_legibleTracksForMenu = captionPreferences.sortedTrackListForMenu(trackList);
+
+    Vector<String> legibleOptions;
+    for (auto& track : m_legibleTracksForMenu)
+        legibleOptions.append(captionPreferences.displayNameForTrack(track.get()));
+
+    m_videoFullscreenInterface->setLegibleMediaSelectionOptions(legibleOptions, 0);
 }
 
 #endif