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