Title: [98736] trunk
Revision
98736
Author
ann...@chromium.org
Date
2011-10-28 10:54:32 -0700 (Fri, 28 Oct 2011)

Log Message

Implement load notification and events for <track>.
https://bugs.webkit.org/show_bug.cgi?id=71054

Reviewed by Eric Carlson.

Source/WebCore:

Tests: media/track/track-load-error-readyState.html
       media/track/track-load-from-element-readyState.html
       media/track/track-load-from-src-readyState.html

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::loadTextTracks):
(WebCore::HTMLMediaElement::loadNextTextTrack):
(WebCore::HTMLMediaElement::trackWasAdded):
(WebCore::HTMLMediaElement::trackWillBeRemoved):
(WebCore::HTMLMediaElement::trackSourceChanged):
* html/HTMLMediaElement.h:
* html/HTMLTrackElement.cpp:
(WebCore::HTMLTrackElement::insertedIntoTree):
(WebCore::HTMLTrackElement::willRemove):
(WebCore::HTMLTrackElement::parseMappedAttribute):
(WebCore::HTMLTrackElement::attributeChanged):
* html/HTMLTrackElement.h:
* html/LoadableTextTrack.cpp:
(WebCore::LoadableTextTrack::cueLoadingCompleted):

LayoutTests:

* media/track/track-load-error-readyState-expected.txt: Added.
* media/track/track-load-error-readyState.html: Added.
* media/track/track-load-from-element-readyState-expected.txt: Added.
* media/track/track-load-from-element-readyState.html: Added.
* media/track/track-load-from-src-readyState-expected.txt: Added.
* media/track/track-load-from-src-readyState.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (98735 => 98736)


--- trunk/LayoutTests/ChangeLog	2011-10-28 17:46:38 UTC (rev 98735)
+++ trunk/LayoutTests/ChangeLog	2011-10-28 17:54:32 UTC (rev 98736)
@@ -1,3 +1,17 @@
+2011-10-28  Anna Cavender  <ann...@chromium.org>
+
+        Implement load notification and events for <track>.
+        https://bugs.webkit.org/show_bug.cgi?id=71054
+
+        Reviewed by Eric Carlson.
+
+        * media/track/track-load-error-readyState-expected.txt: Added.
+        * media/track/track-load-error-readyState.html: Added.
+        * media/track/track-load-from-element-readyState-expected.txt: Added.
+        * media/track/track-load-from-element-readyState.html: Added.
+        * media/track/track-load-from-src-readyState-expected.txt: Added.
+        * media/track/track-load-from-src-readyState.html: Added.
+
 2011-10-28  Simon Fraser  <simon.fra...@apple.com>
 
         The HTML5 video element in Safari does not respect "visibility:hidden" CSS property

Added: trunk/LayoutTests/media/track/track-load-error-readyState-expected.txt (0 => 98736)


--- trunk/LayoutTests/media/track/track-load-error-readyState-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/track/track-load-error-readyState-expected.txt	2011-10-28 17:54:32 UTC (rev 98736)
@@ -0,0 +1,6 @@
+Tests the error event on HTMLTrackElement and ERROR readyState on TextTrack.
+
+EVENT(error)
+EXPECTED (track.track.readyState == '3') OK
+END OF TEST
+
Property changes on: trunk/LayoutTests/media/track/track-load-error-readyState-expected.txt
___________________________________________________________________

Added: svn:eol-style

Added: trunk/LayoutTests/media/track/track-load-error-readyState.html (0 => 98736)


--- trunk/LayoutTests/media/track/track-load-error-readyState.html	                        (rev 0)
+++ trunk/LayoutTests/media/track/track-load-error-readyState.html	2011-10-28 17:54:32 UTC (rev 98736)
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+        <script src=""
+        <script src=""
+        <script>
+
+            function trackError()
+            {
+                consoleWrite("EVENT(error)");
+                track = document.getElementById('testTrackError'); 
+                testExpected("track.track.readyState", TextTrack.Error);
+                endTest();
+            }
+
+        </script>
+    </head>
+    <body>
+        <p>Tests the error event on HTMLTrackElement and ERROR readyState on TextTrack.</p>
+        <video id="videotests">
+            <track id="testTrackError" src="" _onerror_="trackError()">
+        </video>
+    </body>
+</html>
\ No newline at end of file
Property changes on: trunk/LayoutTests/media/track/track-load-error-readyState.html
___________________________________________________________________

Added: svn:eol-style

Added: trunk/LayoutTests/media/track/track-load-from-element-readyState-expected.txt (0 => 98736)


--- trunk/LayoutTests/media/track/track-load-from-element-readyState-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/track/track-load-from-element-readyState-expected.txt	2011-10-28 17:54:32 UTC (rev 98736)
@@ -0,0 +1,6 @@
+Tests the load event on HTMLTrackElement and LOADED readyState on TextTrack when src is set on the element.
+
+EVENT(load)
+EXPECTED (track.track.readyState == '2') OK
+END OF TEST
+
Property changes on: trunk/LayoutTests/media/track/track-load-from-element-readyState-expected.txt
___________________________________________________________________

Added: svn:eol-style

Added: trunk/LayoutTests/media/track/track-load-from-element-readyState.html (0 => 98736)


--- trunk/LayoutTests/media/track/track-load-from-element-readyState.html	                        (rev 0)
+++ trunk/LayoutTests/media/track/track-load-from-element-readyState.html	2011-10-28 17:54:32 UTC (rev 98736)
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+        <script src=""
+        <script src=""
+        <script>
+
+            function trackLoaded()
+            {
+                consoleWrite("EVENT(load)");
+                track = document.getElementById('testTrackSrc'); 
+                testExpected("track.track.readyState", TextTrack.Loaded);
+                endTest();
+            }
+
+        </script>
+    </head>
+    <body>
+        <p>Tests the load event on HTMLTrackElement and LOADED readyState on TextTrack when src is set on the element.</p>
+        <video>
+            <track id="testTrackSrc" src="" _onload_="trackLoaded()">
+        </video>
+    </body>
+</html>
\ No newline at end of file
Property changes on: trunk/LayoutTests/media/track/track-load-from-element-readyState.html
___________________________________________________________________

Added: svn:eol-style

Added: trunk/LayoutTests/media/track/track-load-from-src-readyState-expected.txt (0 => 98736)


--- trunk/LayoutTests/media/track/track-load-from-src-readyState-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/track/track-load-from-src-readyState-expected.txt	2011-10-28 17:54:32 UTC (rev 98736)
@@ -0,0 +1,7 @@
+Tests the load event on HTMLTrackElement and LOADED readyState on TextTrack when src is set from _javascript_.
+
+EXPECTED (track.track.readyState == '0') OK
+EVENT(load)
+EXPECTED (track.track.readyState == '2') OK
+END OF TEST
+
Property changes on: trunk/LayoutTests/media/track/track-load-from-src-readyState-expected.txt
___________________________________________________________________

Added: svn:eol-style

Added: trunk/LayoutTests/media/track/track-load-from-src-readyState.html (0 => 98736)


--- trunk/LayoutTests/media/track/track-load-from-src-readyState.html	                        (rev 0)
+++ trunk/LayoutTests/media/track/track-load-from-src-readyState.html	2011-10-28 17:54:32 UTC (rev 98736)
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+        <script src=""
+        <script src=""
+    </head>
+    <body>
+        <p>Tests the load event on HTMLTrackElement and LOADED readyState on TextTrack when src is set from _javascript_.</p>
+        <video>
+            <track id="testTrackEmpty">
+        </video>
+        <script>
+
+            function trackLoaded()
+            {
+                consoleWrite("EVENT(load)");
+                testExpected("track.track.readyState", TextTrack.Loaded);
+                endTest();
+            }
+
+            track = document.getElementById('testTrackEmpty');
+            testExpected("track.track.readyState", TextTrack.None);
+            track.addEventListener("load", function () { trackLoaded(); }, true);
+            track.src = ""    
+
+        </script>
+    </body>
+</html>
\ No newline at end of file
Property changes on: trunk/LayoutTests/media/track/track-load-from-src-readyState.html
___________________________________________________________________

Added: svn:eol-style

Modified: trunk/Source/WebCore/ChangeLog (98735 => 98736)


--- trunk/Source/WebCore/ChangeLog	2011-10-28 17:46:38 UTC (rev 98735)
+++ trunk/Source/WebCore/ChangeLog	2011-10-28 17:54:32 UTC (rev 98736)
@@ -1,3 +1,30 @@
+2011-10-28  Anna Cavender  <ann...@chromium.org>
+
+        Implement load notification and events for <track>.
+        https://bugs.webkit.org/show_bug.cgi?id=71054
+
+        Reviewed by Eric Carlson.
+
+        Tests: media/track/track-load-error-readyState.html
+               media/track/track-load-from-element-readyState.html
+               media/track/track-load-from-src-readyState.html
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::loadTextTracks):
+        (WebCore::HTMLMediaElement::loadNextTextTrack):
+        (WebCore::HTMLMediaElement::trackWasAdded):
+        (WebCore::HTMLMediaElement::trackWillBeRemoved):
+        (WebCore::HTMLMediaElement::trackSourceChanged):
+        * html/HTMLMediaElement.h:
+        * html/HTMLTrackElement.cpp:
+        (WebCore::HTMLTrackElement::insertedIntoTree):
+        (WebCore::HTMLTrackElement::willRemove):
+        (WebCore::HTMLTrackElement::parseMappedAttribute):
+        (WebCore::HTMLTrackElement::attributeChanged):
+        * html/HTMLTrackElement.h:
+        * html/LoadableTextTrack.cpp:
+        (WebCore::LoadableTextTrack::cueLoadingCompleted):
+
 2011-10-28  Simon Fraser  <simon.fra...@apple.com>
 
         The HTML5 video element in Safari does not respect "visibility:hidden" CSS property

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (98735 => 98736)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2011-10-28 17:46:38 UTC (rev 98735)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2011-10-28 17:54:32 UTC (rev 98736)
@@ -839,13 +839,19 @@
         return;
 
     for (Node* node = firstChild(); node; node = node->nextSibling()) {
-        if (node->hasTagName(trackTag)) {
-            HTMLTrackElement* track = static_cast<HTMLTrackElement*>(node);
-            track->load(ActiveDOMObject::scriptExecutionContext(), this);
-        }
+        if (node->hasTagName(trackTag))
+            loadNextTextTrack(static_cast<HTMLTrackElement*>(node));
     }
 }
 
+void HTMLMediaElement::loadNextTextTrack(HTMLTrackElement* track)
+{
+    // FIXME(71124): This should schedule an *asynchronous* load.
+    track->load(ActiveDOMObject::scriptExecutionContext(), this);
+
+    // FIXME(71123): Add new track to list of text tracks and set the text track mode.
+}
+
 void HTMLMediaElement::textTrackReadyStateChanged(TextTrack*)
 {
     // FIXME(62885): Implement.
@@ -1978,8 +1984,40 @@
 {
     return TextTrack::create(this, kind, label, language);
 }
+
+void HTMLMediaElement::trackWasAdded(HTMLTrackElement* track)
+{
+#if !LOG_DISABLED
+    if (track->hasTagName(trackTag)) {
+        KURL url = ""
+        LOG(Media, "HTMLMediaElement::trackWasAdded - 'src' is %s", urlForLogging(url).utf8().data());
+    }
 #endif
+    loadNextTextTrack(track);
+}
+ 
+void HTMLMediaElement::trackWillBeRemoved(HTMLTrackElement* track)
+{
+#if !LOG_DISABLED
+    if (track->hasTagName(trackTag)) {
+        KURL url = ""
+        LOG(Media, "HTMLMediaElement::trackWillBeRemoved - 'src' is %s", urlForLogging(url).utf8().data());
+    }
+#endif
+}
 
+void HTMLMediaElement::trackSourceChanged(HTMLTrackElement* track)
+{
+#if !LOG_DISABLED
+    if (track->hasTagName(trackTag)) {
+        KURL url = ""
+        LOG(Media, "HTMLMediaElement::trackSourceChanged - 'src' is %s", urlForLogging(url).utf8().data());
+    }
+#endif
+    loadNextTextTrack(track);
+}
+#endif
+
 bool HTMLMediaElement::havePotentialSourceChild()
 {
     // Stash the current <source> node and next nodes so we can restore them after checking

Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (98735 => 98736)


--- trunk/Source/WebCore/html/HTMLMediaElement.h	2011-10-28 17:46:38 UTC (rev 98735)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h	2011-10-28 17:54:32 UTC (rev 98736)
@@ -57,6 +57,9 @@
 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
 class Widget;
 #endif
+#if ENABLE(VIDEO_TRACK)
+class HTMLTrackElement;
+#endif
 
 // FIXME: The inheritance from MediaPlayerClient here should be private inheritance.
 // But it can't be until the Chromium WebMediaPlayerClientImpl class is fixed so it
@@ -180,6 +183,9 @@
 
 #if ENABLE(VIDEO_TRACK)
     PassRefPtr<TextTrack> addTrack(const String& kind, const String& label = "", const String& language = "");
+    virtual void trackWasAdded(HTMLTrackElement*);
+    virtual void trackWillBeRemoved(HTMLTrackElement*);
+    virtual void trackSourceChanged(HTMLTrackElement*);
 #endif
 
 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
@@ -352,6 +358,7 @@
 
 #if ENABLE(VIDEO_TRACK)
     void loadTextTracks();
+    void loadNextTextTrack(HTMLTrackElement*);
 
     // TextTrackClient
     virtual void textTrackReadyStateChanged(TextTrack*);

Modified: trunk/Source/WebCore/html/HTMLTrackElement.cpp (98735 => 98736)


--- trunk/Source/WebCore/html/HTMLTrackElement.cpp	2011-10-28 17:46:38 UTC (rev 98735)
+++ trunk/Source/WebCore/html/HTMLTrackElement.cpp	2011-10-28 17:54:32 UTC (rev 98736)
@@ -32,6 +32,7 @@
 #include "HTMLMediaElement.h"
 #include "HTMLNames.h"
 #include "Logging.h"
+#include "ScriptEventListener.h"
 
 using namespace std;
 
@@ -59,22 +60,41 @@
 {
     HTMLElement::insertedIntoTree(deep);
     Element* parent = parentElement();
-    if (parent && parent->isMediaElement()) {
-        // TODO(annacc):
-        // static_cast<HTMLMediaElement*>(parentNode())->trackWasAdded(this);
-    }
+    if (parent && parent->isMediaElement())
+        static_cast<HTMLMediaElement*>(parentNode())->trackWasAdded(this);
 }
 
 void HTMLTrackElement::willRemove()
 {
     Element* parent = parentElement();
-    if (parent && parent->isMediaElement()) {
-        // TODO(annacc):
-        // static_cast<HTMLMediaElement*>(parentNode())->trackWillBeRemoved(this);
-    }
+    if (parent && parent->isMediaElement())
+        static_cast<HTMLMediaElement*>(parentNode())->trackWillBeRemoved(this);
     HTMLElement::willRemove();
 }
 
+void HTMLTrackElement::parseMappedAttribute(Attribute* attribute)
+{
+    const QualifiedName& attrName = attribute->name();
+    
+    if (attrName == onloadAttr)
+        setAttributeEventListener(eventNames().loadEvent, createAttributeEventListener(this, attribute));
+    else if (attrName == onerrorAttr)
+        setAttributeEventListener(eventNames().errorEvent, createAttributeEventListener(this, attribute));
+    else
+        HTMLElement::parseMappedAttribute(attribute);
+}
+
+void HTMLTrackElement::attributeChanged(Attribute* attr, bool preserveDecls)
+{
+    HTMLElement::attributeChanged(attr, preserveDecls);
+
+    const QualifiedName& attrName = attr->name();
+    if (attrName == srcAttr) {
+        if (!getAttribute(srcAttr).isEmpty() && parentNode())
+            static_cast<HTMLMediaElement*>(parentNode())->trackSourceChanged(this);
+    }
+}
+
 KURL HTMLTrackElement::src() const
 {
     return document()->completeURL(getAttribute(srcAttr));

Modified: trunk/Source/WebCore/html/HTMLTrackElement.h (98735 => 98736)


--- trunk/Source/WebCore/html/HTMLTrackElement.h	2011-10-28 17:46:38 UTC (rev 98735)
+++ trunk/Source/WebCore/html/HTMLTrackElement.h	2011-10-28 17:54:32 UTC (rev 98736)
@@ -60,6 +60,9 @@
     HTMLTrackElement(const QualifiedName&, Document*);
     virtual ~HTMLTrackElement();
 
+    virtual void parseMappedAttribute(Attribute*);
+    virtual void attributeChanged(Attribute*, bool preserveDecls);
+
     virtual void insertedIntoTree(bool);
     virtual void willRemove();
     virtual bool isURLAttribute(Attribute*) const;

Modified: trunk/Source/WebCore/html/LoadableTextTrack.cpp (98735 => 98736)


--- trunk/Source/WebCore/html/LoadableTextTrack.cpp	2011-10-28 17:46:38 UTC (rev 98735)
+++ trunk/Source/WebCore/html/LoadableTextTrack.cpp	2011-10-28 17:54:32 UTC (rev 98736)
@@ -63,11 +63,14 @@
     setReadyState(TextTrack::Loading);
 }
 
-void LoadableTextTrack::cueLoadingCompleted(TextTrackLoader* loader, bool)
+void LoadableTextTrack::cueLoadingCompleted(TextTrackLoader* loader, bool loadingFailed)
 {
     ASSERT_UNUSED(loader, m_loader == loader);
 
-    // FIXME(62885): Implement.
+    loadingFailed ? setReadyState(TextTrack::Error) : setReadyState(TextTrack::Loaded);
+
+    if (m_loadingClient)
+        m_loadingClient->textTrackLoadingCompleted(this, loadingFailed);
 }
 
 } // namespace WebCore
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to