Changeset 237311 in webkit


Ignore:
Timestamp:
Oct 20, 2018, 6:15:27 AM (7 years ago)
Author:
commit-queue@webkit.org
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 <yuhan_wu@apple.com> 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:
Location:
trunk
Files:
2 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r237299 r237311  
     12018-10-20  YUHAN WU  <yuhan_wu@apple.com>
     2
     3        MediaRecorder should fire a stop event when all tracks are ended
     4        https://bugs.webkit.org/show_bug.cgi?id=190642
     5
     6        Reviewed by Youenn Fablet.
     7
     8        * web-platform-tests/mediacapture-record/MediaRecorder-stop-expected.txt: Added.
     9        * web-platform-tests/mediacapture-record/MediaRecorder-stop.html: Added.
     10
    1112018-10-19  Commit Queue  <commit-queue@webkit.org>
    212
  • trunk/Source/WebCore/ChangeLog

    r237308 r237311  
     12018-10-20  YUHAN WU  <yuhan_wu@apple.com>
     2
     3        MediaRecorder should fire a stop event when all tracks are ended
     4        https://bugs.webkit.org/show_bug.cgi?id=190642
     5
     6        Reviewed by Youenn Fablet.
     7
     8        This patch only implements to fire the stop event when all tracks are ended.
     9        We will need to fire a dataavailable event when all tracks are ended.
     10
     11        Test: imported/w3c/web-platform-tests/mediacapture-record/MediaRecorder-stop.html
     12
     13        * Modules/mediarecorder/MediaRecorder.cpp:
     14        (WebCore::MediaRecorder::MediaRecorder):
     15        (WebCore::MediaRecorder::~MediaRecorder):
     16        (WebCore::MediaRecorder::trackEnded):
     17        * Modules/mediarecorder/MediaRecorder.h:
     18        * Modules/mediarecorder/MediaRecorder.idl:
     19        * WebCore.xcodeproj/project.pbxproj:
     20        * dom/EventNames.h:
     21
    1222018-10-19  Stephan Szabo  <stephan.szabo@sony.com>
    223
  • trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.cpp

    r237106 r237311  
    4747    , m_stream(WTFMove(stream))
    4848{
     49    m_tracks = WTF::map(m_stream->getTracks(), [this] (const auto& track) -> Ref<MediaStreamTrackPrivate> {
     50        auto& privateTrack = track->privateTrack();
     51        privateTrack.addObserver(*this);
     52        return privateTrack;
     53    });
    4954    m_stream->addObserver(this);
    5055}
     
    5358{
    5459    m_stream->removeObserver(this);
     60    for (auto& track : m_tracks)
     61        track->removeObserver(*this);
    5562}
    5663
     
    9097}
    9198
     99void MediaRecorder::trackEnded(MediaStreamTrackPrivate&)
     100{
     101    auto position = m_tracks.findMatching([](auto& track) {
     102        return !track->ended();
     103    });
     104    if (position != notFound)
     105        return;
     106    scheduleDeferredTask([this] {
     107        if (!m_isActive || state() == RecordingState::Inactive)
     108            return;
     109        // FIXME: Add a dataavailable event
     110        auto event = Event::create(eventNames().stopEvent, Event::CanBubble::No, Event::IsCancelable::No);
     111        setNewRecordingState(RecordingState::Inactive, WTFMove(event));
     112    });
     113}
     114
    92115void MediaRecorder::setNewRecordingState(RecordingState newState, Ref<Event>&& event)
    93116{
  • trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.h

    r237106 r237311  
    2929#include "EventTarget.h"
    3030#include "MediaStream.h"
     31#include "MediaStreamTrackPrivate.h"
    3132
    3233namespace WebCore {
     
    3435class Document;
    3536
    36 class MediaRecorder final : public ActiveDOMObject, public RefCounted<MediaRecorder>, public EventTargetWithInlineData, public CanMakeWeakPtr<MediaRecorder>, private MediaStream::Observer {
     37class MediaRecorder final
     38    : public ActiveDOMObject
     39    , public RefCounted<MediaRecorder>
     40    , public EventTargetWithInlineData
     41    , public CanMakeWeakPtr<MediaRecorder>
     42    , private MediaStream::Observer
     43    , private MediaStreamTrackPrivate::Observer {
    3744public:
    3845    enum class RecordingState { Inactive, Recording, Paused };
     
    7380    void didAddOrRemoveTrack() final;
    7481   
     82    // MediaStreamTrackPrivate::Observer
     83    void trackEnded(MediaStreamTrackPrivate&) final;
     84    void trackMutedChanged(MediaStreamTrackPrivate&) final { };
     85    void trackSettingsChanged(MediaStreamTrackPrivate&) final { };
     86    void trackEnabledChanged(MediaStreamTrackPrivate&) final { };
     87   
    7588    void scheduleDeferredTask(Function<void()>&&);
    7689    void setNewRecordingState(RecordingState, Ref<Event>&&);
     
    7992    Ref<MediaStream> m_stream;
    8093    RecordingState m_state { RecordingState::Inactive };
     94    Vector<Ref<MediaStreamTrackPrivate>> m_tracks;
    8195   
    8296    bool m_isActive { true };
  • trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.idl

    r237106 r237311  
    3838    // readonly attribute DOMString mimeType;
    3939    // attribute EventHandler onstart;
    40     // attribute EventHandler onstop;
     40    attribute EventHandler onstop;
    4141    // attribute EventHandler ondataavailable;
    4242    // attribute EventHandler onpause;
  • trunk/Source/WebCore/dom/EventNames.h

    r235625 r237311  
    238238    macro(started) \
    239239    macro(statechange) \
     240    macro(stop) \
    240241    macro(storage) \
    241242    macro(submit) \
Note: See TracChangeset for help on using the changeset viewer.