Title: [237311] trunk
Revision
237311
Author
[email protected]
Date
2018-10-20 06:15:27 -0700 (Sat, 20 Oct 2018)

Log Message

MediaRecorder should fire a stop event when all tracks are ended
https://bugs.webkit.org/show_bug.cgi?id=190642

Patch by YUHAN WU <[email protected]> on 2018-10-20
Reviewed by Youenn Fablet.

LayoutTests/imported/w3c:

* web-platform-tests/mediacapture-record/MediaRecorder-stop-expected.txt: Added.
* web-platform-tests/mediacapture-record/MediaRecorder-stop.html: Added.

Source/WebCore:

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:

Modified Paths

Added Paths

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) \
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to