https://bugs.webkit.org/show_bug.cgi?id=120871
Reviewed by Jer Noble.
Merge https://chromium.googlesource.com/chromium/blink/+/
bebd179b65be69e46f2f434a3ec8b1e4aa85cc42
Source/WebCore:
Test: fast/mediastream/MediaStream-onended.html
* Modules/mediastream/MediaStream.cpp:
(WebCore::MediaStream::trackEnded): New.
* Modules/mediastream/MediaStream.h:
* Modules/mediastream/MediaStreamTrack.cpp:
(WebCore::MediaStreamTrack::sourceChangedState): Call didEndTrack when state changes to ReadyStateEnded.
(WebCore::MediaStreamTrack::didEndTrack): New.
(WebCore::MediaStreamTrack::stop): Call didEndTrack.
* Modules/mediastream/MediaStreamTrack.h:
* platform/mediastream/MediaStreamDescriptor.h:
(WebCore::MediaStreamDescriptor::MediaStreamDescriptor): Require didEndTrack.
LayoutTests:
* fast/mediastream/MediaStream-onended-expected.txt: Added.
* fast/mediastream/MediaStream-onended.html: Added.
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@155249
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2013-09-07 Eric Carlson <eric.carlson@apple.com>
+
+ MediaStream should fire ended event when all tracks are ended
+ https://bugs.webkit.org/show_bug.cgi?id=120871
+
+ Reviewed by Jer Noble.
+
+ Merge https://chromium.googlesource.com/chromium/blink/+/bebd179b65be69e46f2f434a3ec8b1e4aa85cc42
+
+ * fast/mediastream/MediaStream-onended-expected.txt: Added.
+ * fast/mediastream/MediaStream-onended.html: Added.
+
2013-09-06 Bem Jones-Bey <bjonesbe@adobe.com>
[CSS Shapes] Floats with shape-outside aren't painting in the correct order
--- /dev/null
+Tests MediaStream::onended callback.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS stream.ended is false
+PASS streamEnded was called.
+PASS stream.ended is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../js/resources/js-test-style.css">
+<script src="../js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script>
+description("Tests MediaStream::onended callback.");
+
+function error() {
+ testFailed('Stream generation failed.');
+ finishJSTest();
+}
+
+function getUserMedia(dictionary, callback) {
+ try {
+ navigator.webkitGetUserMedia(dictionary, callback, error);
+ } catch (e) {
+ testFailed('webkitGetUserMedia threw exception :' + e);
+ finishJSTest();
+ }
+}
+
+var stream;
+
+function streamEnded() {
+ testPassed('streamEnded was called.');
+ shouldBeTrue('stream.ended');
+ finishJSTest();
+}
+
+function gotStream(s) {
+ stream = new webkitMediaStream(s);
+ shouldBeFalse('stream.ended');
+ try {
+ stream.onended = streamEnded;
+ s.stop();
+ } catch (e) {
+ testFailed('LocalMediaStream threw exception :' + e);
+ finishJSTest();
+ }
+}
+
+getUserMedia({audio:true, video:true}, gotStream);
+
+window.jsTestIsAsync = true;
+window.successfullyParsed = true;
+</script>
+<script src="../js/resources/js-test-post.js"></script>
+</body>
+</html>
+2013-09-07 Eric Carlson <eric.carlson@apple.com>
+
+ MediaStream should fire ended event when all tracks are ended
+ https://bugs.webkit.org/show_bug.cgi?id=120871
+
+ Reviewed by Jer Noble.
+
+ Merge https://chromium.googlesource.com/chromium/blink/+/bebd179b65be69e46f2f434a3ec8b1e4aa85cc42
+
+ Test: fast/mediastream/MediaStream-onended.html
+
+ * Modules/mediastream/MediaStream.cpp:
+ (WebCore::MediaStream::trackEnded): New.
+ * Modules/mediastream/MediaStream.h:
+
+ * Modules/mediastream/MediaStreamTrack.cpp:
+ (WebCore::MediaStreamTrack::sourceChangedState): Call didEndTrack when state changes to ReadyStateEnded.
+ (WebCore::MediaStreamTrack::didEndTrack): New.
+ (WebCore::MediaStreamTrack::stop): Call didEndTrack.
+ * Modules/mediastream/MediaStreamTrack.h:
+
+ * platform/mediastream/MediaStreamDescriptor.h:
+ (WebCore::MediaStreamDescriptor::MediaStreamDescriptor): Require didEndTrack.
+
2013-09-06 Thiago de Barros Lacerda <thiago.lacerda@openbossa.org>
Get MEDIA_STREAM compiling for other ports (EFL and GTK)
return 0;
}
+void MediaStream::trackEnded()
+{
+ for (size_t i = 0; i < m_audioTracks.size(); ++i)
+ if (!m_audioTracks[i]->ended())
+ return;
+
+ for (size_t i = 0; i < m_videoTracks.size(); ++i)
+ if (!m_videoTracks[i]->ended())
+ return;
+
+ streamEnded();
+}
+
void MediaStream::streamEnded()
{
if (ended())
DEFINE_ATTRIBUTE_EVENT_LISTENER(removetrack);
// MediaStreamDescriptorClient
+ virtual void trackEnded() OVERRIDE;
virtual void streamEnded() OVERRIDE;
virtual bool isLocal() const { return false; }
break;
case MediaStreamSource::ReadyStateEnded:
dispatchEvent(Event::create(eventNames().endedEvent, false, false));
+ didEndTrack();
break;
}
}
+void MediaStreamTrack::didEndTrack()
+{
+ MediaStreamDescriptorClient* client = m_component->stream()->client();
+ if (!client)
+ return;
+
+ client->trackEnded();
+}
+
MediaStreamComponent* MediaStreamTrack::component()
{
return m_component.get();
void MediaStreamTrack::stop()
{
m_stopped = true;
+ didEndTrack();
}
const AtomicString& MediaStreamTrack::interfaceName() const
bool enabled() const;
void setEnabled(bool);
+ void didEndTrack();
+
String readyState() const;
DEFINE_ATTRIBUTE_EVENT_LISTENER(mute);
public:
virtual ~MediaStreamDescriptorClient() { }
+ virtual void trackEnded() = 0;
virtual void streamEnded() = 0;
virtual void addRemoteTrack(MediaStreamComponent*) = 0;
virtual void removeRemoteTrack(MediaStreamComponent*) = 0;