Reviewed by Darin.
Trigger media load on on src attribute changes as specified in new HTML5 draft.
Tests: media/video-src-change.html
media/video-src-remove.html
media/video-src-set.html
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::attributeChanged):
* html/HTMLMediaElement.h:
LayoutTests:
Reviewed by Darin.
Tests for media src attribute changes.
* media/video-src-change-expected.txt: Added.
* media/video-src-change.html: Added.
* media/video-src-remove-expected.txt: Added.
* media/video-src-remove.html: Added.
* media/video-src-set-expected.txt: Added.
* media/video-src-set.html: Added.
* media/video-test.js:
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@27480
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2007-11-06 Antti Koivisto <antti@apple.com>
+
+ Reviewed by Darin.
+
+ Tests for media src attribute changes.
+
+ * media/video-src-change-expected.txt: Added.
+ * media/video-src-change.html: Added.
+ * media/video-src-remove-expected.txt: Added.
+ * media/video-src-remove.html: Added.
+ * media/video-src-set-expected.txt: Added.
+ * media/video-src-set.html: Added.
+ * media/video-test.js:
+
2007-11-06 Dan Bernstein <mitz@apple.com>
Reviewed by Darin Adler.
--- /dev/null
+Test that changing src attribute triggers load when network state is empty.
+Test that it does not trigger load when network state is non-empty.
+EVENT(emptied)
+TEST(video.networkState == HTMLMediaElement.EMPTY) OK
+EVENT(begin) TEST(relativeURL(video.currentSrc) == 'content/test.mp4') OK
+EVENT(load)
+TEST(video.networkState != HTMLMediaElement.EMPTY) OK
+END OF TEST
+
--- /dev/null
+<video src=bogus></video>
+<div>
+Test that changing src attribute triggers load when network state is empty.<br>
+Test that it does not trigger load when network state is non-empty.
+</div>
+<script src=video-test.js></script>
+<script>
+waitForEvent('emptied', function () {
+ test('video.networkState == HTMLMediaElement.EMPTY');
+ video.setAttribute('src', 'content/test.mp4')
+ waitForEventAndTest('begin', "relativeURL(video.currentSrc) == 'content/test.mp4'");
+ waitForEvent('load', function () {
+ test('video.networkState != HTMLMediaElement.EMPTY');
+ video.setAttribute('src', 'content/test.wav');
+ waitForEventAndFail('begin');
+ setTimeout(endTest, 500);
+ });
+});
+</script>
--- /dev/null
+Test that removing src attribute triggers load
+EVENT(emptied)
+EVENT(begin) TEST(relativeURL(video.currentSrc) == 'content/test.mp4') OK
+END OF TEST
+
--- /dev/null
+<video src=bogus>
+ <source src=content/test.mp4></source>
+</video>
+<div>
+Test that removing src attribute triggers load
+</div>
+<script src=video-test.js></script>
+<script>
+waitForEvent('emptied', function () {
+ video.removeAttribute('src')
+ waitForEventTestAndEnd('begin', "relativeURL(video.currentSrc) == 'content/test.mp4'");
+});
+</script>
--- /dev/null
+Test that setting src attribute triggers load
+EVENT(begin) TEST(relativeURL(video.currentSrc) == 'content/test.mp4') OK
+END OF TEST
+
--- /dev/null
+<video></video>
+<div>
+Test that setting src attribute triggers load
+</div>
+<script src=video-test.js></script>
+<script>
+video.setAttribute('src', 'content/test.mp4')
+waitForEventTestAndEnd('begin', "relativeURL(video.currentSrc) == 'content/test.mp4'");
+</script>
waitForEventAndTest(eventName, testFuncString, true);
}
+function waitForEventAndFail(eventName)
+{
+ waitForEventAndTest(eventName, "false", true);
+}
+
function waitForEventAndTest(eventName, testFuncString, endit)
{
function _eventCallback(event)
+2007-11-06 Antti Koivisto <antti@apple.com>
+
+ Reviewed by Darin.
+
+ Trigger media load on on src attribute changes as specified in new HTML5 draft.
+
+ Tests: media/video-src-change.html
+ media/video-src-remove.html
+ media/video-src-set.html
+
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::attributeChanged):
+ * html/HTMLMediaElement.h:
+
2007-11-06 Dan Bernstein <mitz@apple.com>
Reviewed by Darin Adler.
return newChild->hasTagName(sourceTag) || HTMLElement::checkDTD(newChild);
}
+void HTMLMediaElement::attributeChanged(Attribute* attr, bool preserveDecls)
+{
+ HTMLElement::attributeChanged(attr, preserveDecls);
+
+ const QualifiedName& attrName = attr->name();
+ if (attrName == srcAttr) {
+ // 3.14.9.2.
+ // change to src attribute triggers load()
+ if (inDocument() && m_networkState == EMPTY)
+ scheduleLoad();
+ }
+}
+
void HTMLMediaElement::insertedIntoDocument()
{
HTMLElement::insertedIntoDocument();
virtual ~HTMLMediaElement();
bool checkDTD(const Node* newChild);
+
+ void attributeChanged(Attribute*, bool preserveDecls);
virtual bool rendererIsNeeded(RenderStyle*) { return false; }
virtual void insertedIntoDocument();