Diff
Modified: trunk/LayoutTests/imported/w3c/ChangeLog (237310 => 237311)
--- trunk/LayoutTests/imported/w3c/ChangeLog 2018-10-20 07:00:09 UTC (rev 237310)
+++ trunk/LayoutTests/imported/w3c/ChangeLog 2018-10-20 13:15:27 UTC (rev 237311)
@@ -1,3 +1,13 @@
+2018-10-20 YUHAN WU <[email protected]>
+
+ MediaRecorder should fire a stop event when all tracks are ended
+ https://bugs.webkit.org/show_bug.cgi?id=190642
+
+ Reviewed by Youenn Fablet.
+
+ * web-platform-tests/mediacapture-record/MediaRecorder-stop-expected.txt: Added.
+ * web-platform-tests/mediacapture-record/MediaRecorder-stop.html: Added.
+
2018-10-19 Commit Queue <[email protected]>
Unreviewed, rolling out r237254.
Added: trunk/LayoutTests/imported/w3c/web-platform-tests/mediacapture-record/MediaRecorder-stop-expected.txt (0 => 237311)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/mediacapture-record/MediaRecorder-stop-expected.txt (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/mediacapture-record/MediaRecorder-stop-expected.txt 2018-10-20 13:15:27 UTC (rev 237311)
@@ -0,0 +1,3 @@
+
+PASS MediaRecorder will stop recording and fire a stop event when all tracks are ended
+
Added: trunk/LayoutTests/imported/w3c/web-platform-tests/mediacapture-record/MediaRecorder-stop.html (0 => 237311)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/mediacapture-record/MediaRecorder-stop.html (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/mediacapture-record/MediaRecorder-stop.html 2018-10-20 13:15:27 UTC (rev 237311)
@@ -0,0 +1,35 @@
+<!doctype html>
+<html>
+<head>
+ <title>MediaRecorder Stop</title>
+ <link rel="help" href=""
+ <script src=""
+ <script src=""
+</head>
+<body>
+<canvas id="canvas" width="200" height="200">
+</canvas>
+<script>
+ function createVideoStream() {
+ let canvas = document.getElementById("canvas");
+ canvas.getContext('2d');
+ return canvas.captureStream();
+ }
+
+ async_test(t => {
+ let video = createVideoStream();
+ let recorder = new MediaRecorder(video);
+ recorder._onstop_ = t.step_func(errorEvent => {
+ assert_equals(errorEvent.type, 'stop', 'the error type should be stop');
+ assert_true(errorEvent.isTrusted, 'isTrusted should be true when the event is created by C++');
+ assert_equals(recorder.state, "inactive", "MediaRecorder has been stopped when all tracks are ended");
+ t.done();
+ });
+ assert_equals(video.getVideoTracks().length, 1, "video mediastream starts with one track");
+ recorder.start();
+ assert_equals(recorder.state, "recording", "MediaRecorder has been started successfully");
+ video.getVideoTracks()[0].stop();
+ }, "MediaRecorder will stop recording and fire a stop event when all tracks are ended", { timeout: 10000 });
+</script>
+</body>
+</html>
\ No newline at end of file
Modified: trunk/Source/WebCore/ChangeLog (237310 => 237311)
--- trunk/Source/WebCore/ChangeLog 2018-10-20 07:00:09 UTC (rev 237310)
+++ trunk/Source/WebCore/ChangeLog 2018-10-20 13:15:27 UTC (rev 237311)
@@ -1,3 +1,24 @@
+2018-10-20 YUHAN WU <[email protected]>
+
+ MediaRecorder should fire a stop event when all tracks are ended
+ https://bugs.webkit.org/show_bug.cgi?id=190642
+
+ Reviewed by Youenn Fablet.
+
+ This patch only implements to fire the stop event when all tracks are ended.
+ We will need to fire a dataavailable event when all tracks are ended.
+
+ Test: imported/w3c/web-platform-tests/mediacapture-record/MediaRecorder-stop.html
+
+ * Modules/mediarecorder/MediaRecorder.cpp:
+ (WebCore::MediaRecorder::MediaRecorder):
+ (WebCore::MediaRecorder::~MediaRecorder):
+ (WebCore::MediaRecorder::trackEnded):
+ * Modules/mediarecorder/MediaRecorder.h:
+ * Modules/mediarecorder/MediaRecorder.idl:
+ * WebCore.xcodeproj/project.pbxproj:
+ * dom/EventNames.h:
+
2018-10-19 Stephan Szabo <[email protected]>
[WinCairo] Search terms are not saved for <input type="search">
Modified: trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.cpp (237310 => 237311)
--- trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.cpp 2018-10-20 07:00:09 UTC (rev 237310)
+++ trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.cpp 2018-10-20 13:15:27 UTC (rev 237311)
@@ -46,6 +46,11 @@
, m_options(WTFMove(option))
, m_stream(WTFMove(stream))
{
+ m_tracks = WTF::map(m_stream->getTracks(), [this] (const auto& track) -> Ref<MediaStreamTrackPrivate> {
+ auto& privateTrack = track->privateTrack();
+ privateTrack.addObserver(*this);
+ return privateTrack;
+ });
m_stream->addObserver(this);
}
@@ -52,6 +57,8 @@
MediaRecorder::~MediaRecorder()
{
m_stream->removeObserver(this);
+ for (auto& track : m_tracks)
+ track->removeObserver(*this);
}
void MediaRecorder::stop()
@@ -89,6 +96,22 @@
});
}
+void MediaRecorder::trackEnded(MediaStreamTrackPrivate&)
+{
+ auto position = m_tracks.findMatching([](auto& track) {
+ return !track->ended();
+ });
+ if (position != notFound)
+ return;
+ scheduleDeferredTask([this] {
+ if (!m_isActive || state() == RecordingState::Inactive)
+ return;
+ // FIXME: Add a dataavailable event
+ auto event = Event::create(eventNames().stopEvent, Event::CanBubble::No, Event::IsCancelable::No);
+ setNewRecordingState(RecordingState::Inactive, WTFMove(event));
+ });
+}
+
void MediaRecorder::setNewRecordingState(RecordingState newState, Ref<Event>&& event)
{
m_state = newState;
Modified: trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.h (237310 => 237311)
--- trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.h 2018-10-20 07:00:09 UTC (rev 237310)
+++ trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.h 2018-10-20 13:15:27 UTC (rev 237311)
@@ -28,12 +28,19 @@
#include "ActiveDOMObject.h"
#include "EventTarget.h"
#include "MediaStream.h"
+#include "MediaStreamTrackPrivate.h"
namespace WebCore {
class Document;
-class MediaRecorder final : public ActiveDOMObject, public RefCounted<MediaRecorder>, public EventTargetWithInlineData, public CanMakeWeakPtr<MediaRecorder>, private MediaStream::Observer {
+class MediaRecorder final
+ : public ActiveDOMObject
+ , public RefCounted<MediaRecorder>
+ , public EventTargetWithInlineData
+ , public CanMakeWeakPtr<MediaRecorder>
+ , private MediaStream::Observer
+ , private MediaStreamTrackPrivate::Observer {
public:
enum class RecordingState { Inactive, Recording, Paused };
@@ -72,6 +79,12 @@
// MediaStream::Observer
void didAddOrRemoveTrack() final;
+ // MediaStreamTrackPrivate::Observer
+ void trackEnded(MediaStreamTrackPrivate&) final;
+ void trackMutedChanged(MediaStreamTrackPrivate&) final { };
+ void trackSettingsChanged(MediaStreamTrackPrivate&) final { };
+ void trackEnabledChanged(MediaStreamTrackPrivate&) final { };
+
void scheduleDeferredTask(Function<void()>&&);
void setNewRecordingState(RecordingState, Ref<Event>&&);
@@ -78,6 +91,7 @@
Options m_options;
Ref<MediaStream> m_stream;
RecordingState m_state { RecordingState::Inactive };
+ Vector<Ref<MediaStreamTrackPrivate>> m_tracks;
bool m_isActive { true };
};
Modified: trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.idl (237310 => 237311)
--- trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.idl 2018-10-20 07:00:09 UTC (rev 237310)
+++ trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.idl 2018-10-20 13:15:27 UTC (rev 237311)
@@ -37,7 +37,7 @@
// readonly attribute MediaStream stream;
// readonly attribute DOMString mimeType;
// attribute EventHandler onstart;
- // attribute EventHandler onstop;
+ attribute EventHandler onstop;
// attribute EventHandler ondataavailable;
// attribute EventHandler onpause;
// attribute EventHandler onresume;
Modified: trunk/Source/WebCore/dom/EventNames.h (237310 => 237311)
--- trunk/Source/WebCore/dom/EventNames.h 2018-10-20 07:00:09 UTC (rev 237310)
+++ trunk/Source/WebCore/dom/EventNames.h 2018-10-20 13:15:27 UTC (rev 237311)
@@ -237,6 +237,7 @@
macro(start) \
macro(started) \
macro(statechange) \
+ macro(stop) \
macro(storage) \
macro(submit) \
macro(success) \