Diff
Modified: trunk/LayoutTests/imported/w3c/ChangeLog (249650 => 249651)
--- trunk/LayoutTests/imported/w3c/ChangeLog 2019-09-09 17:52:07 UTC (rev 249650)
+++ trunk/LayoutTests/imported/w3c/ChangeLog 2019-09-09 17:52:15 UTC (rev 249651)
@@ -1,3 +1,16 @@
+2019-09-09 Ryan Haddad <ryanhad...@apple.com>
+
+ Unreviewed, rolling out r249574.
+
+ Caused fast/mediastream/media-stream-track-source-failure.html
+ to become flaky.
+
+ Reverted changeset:
+
+ "Remove MediaStreamPrivate::scheduleDeferredTask"
+ https://bugs.webkit.org/show_bug.cgi?id=200975
+ https://trac.webkit.org/changeset/249574
+
2019-09-09 Rob Buis <rb...@igalia.com>
[GTK][WPE] Remove attributes deprecated from MathML3
Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/mediacapture-streams/MediaStream-finished-add.https-expected.txt (249650 => 249651)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/mediacapture-streams/MediaStream-finished-add.https-expected.txt 2019-09-09 17:52:07 UTC (rev 249650)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/mediacapture-streams/MediaStream-finished-add.https-expected.txt 2019-09-09 17:52:15 UTC (rev 249651)
@@ -5,5 +5,5 @@
This test checks that adding a track to an inactive MediaStream is allowed.
-PASS Tests that adding a track to an inactive MediaStream is allowed
+FAIL Tests that adding a track to an inactive MediaStream is allowed assert_false: audio stream is inactive after stopping its only audio track expected false got true
Modified: trunk/Source/WebCore/ChangeLog (249650 => 249651)
--- trunk/Source/WebCore/ChangeLog 2019-09-09 17:52:07 UTC (rev 249650)
+++ trunk/Source/WebCore/ChangeLog 2019-09-09 17:52:15 UTC (rev 249651)
@@ -1,3 +1,16 @@
+2019-09-09 Ryan Haddad <ryanhad...@apple.com>
+
+ Unreviewed, rolling out r249574.
+
+ Caused fast/mediastream/media-stream-track-source-failure.html
+ to become flaky.
+
+ Reverted changeset:
+
+ "Remove MediaStreamPrivate::scheduleDeferredTask"
+ https://bugs.webkit.org/show_bug.cgi?id=200975
+ https://trac.webkit.org/changeset/249574
+
2019-09-09 Rob Buis <rb...@igalia.com>
[GTK][WPE] Remove attributes deprecated from MathML3
Modified: trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp (249650 => 249651)
--- trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp 2019-09-09 17:52:07 UTC (rev 249650)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp 2019-09-09 17:52:15 UTC (rev 249651)
@@ -101,14 +101,14 @@
{
ALWAYS_LOG(LOGIDENTIFIER);
+ setIsActive(m_private->active());
+ m_private->addObserver(*this);
+
for (auto& trackPrivate : m_private->tracks()) {
auto track = MediaStreamTrack::create(document, *trackPrivate);
track->addObserver(*this);
m_trackSet.add(track->id(), WTFMove(track));
}
-
- setIsActive(m_private->active());
- m_private->addObserver(*this);
suspendIfNeeded();
}
Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp (249650 => 249651)
--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp 2019-09-09 17:52:07 UTC (rev 249650)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.cpp 2019-09-09 17:52:15 UTC (rev 249651)
@@ -215,25 +215,15 @@
controller->requestUserMediaAccess(*this);
}
-static inline bool isMediaStreamCorrectlyStarted(const MediaStream& stream)
-{
- if (stream.getTracks().isEmpty())
- return false;
-
- return WTF::allOf(stream.getTracks(), [](auto& track) {
- return !track->source().captureDidFail();
- });
-}
-
void UserMediaRequest::allow(CaptureDevice&& audioDevice, CaptureDevice&& videoDevice, String&& deviceIdentifierHashSalt, CompletionHandler<void()>&& completionHandler)
{
RELEASE_LOG(MediaStream, "UserMediaRequest::allow %s %s", audioDevice ? audioDevice.persistentId().utf8().data() : "", videoDevice ? videoDevice.persistentId().utf8().data() : "");
auto callback = [this, protector = makePendingActivity(*this), completionHandler = WTFMove(completionHandler)](RefPtr<MediaStreamPrivate>&& privateStream) mutable {
- auto scopeExit = makeScopeExit([completionHandler = WTFMove(completionHandler)]() mutable {
+ auto scopeExit = makeScopeExit([&] {
completionHandler();
});
- if (isContextStopped())
+ if (!m_scriptExecutionContext)
return;
if (!privateStream) {
@@ -241,21 +231,16 @@
deny(MediaAccessDenialReason::HardwareError);
return;
}
+ privateStream->monitorOrientation(downcast<Document>(m_scriptExecutionContext)->orientationNotifier());
- auto& document = downcast<Document>(*m_scriptExecutionContext);
- privateStream->monitorOrientation(document.orientationNotifier());
-
- auto stream = MediaStream::create(document, privateStream.releaseNonNull());
- stream->startProducingData();
-
- if (!isMediaStreamCorrectlyStarted(stream)) {
+ auto stream = MediaStream::create(*downcast<Document>(m_scriptExecutionContext), privateStream.releaseNonNull());
+ if (stream->getTracks().isEmpty()) {
deny(MediaAccessDenialReason::HardwareError);
return;
}
- ASSERT(document.isCapturing());
- stream->document()->setHasCaptureMediaStreamTrack();
- m_promise.resolve(WTFMove(stream));
+ scopeExit.release();
+ m_pendingActivationMediaStream = makeUnique<PendingActivationMediaStream>(WTFMove(protector), *this, WTFMove(stream), WTFMove(completionHandler));
};
auto& document = downcast<Document>(*scriptExecutionContext());
@@ -325,6 +310,11 @@
void UserMediaRequest::stop()
{
+ // Protecting 'this' since nulling m_pendingActivationMediaStream might destroy it.
+ Ref<UserMediaRequest> protectedThis(*this);
+
+ m_pendingActivationMediaStream = nullptr;
+
auto& document = downcast<Document>(*m_scriptExecutionContext);
if (auto* controller = UserMediaController::from(document.page()))
controller->cancelUserMediaAccessRequest(*this);
@@ -345,6 +335,50 @@
return downcast<Document>(m_scriptExecutionContext);
}
+UserMediaRequest::PendingActivationMediaStream::PendingActivationMediaStream(Ref<PendingActivity<UserMediaRequest>>&& protectingUserMediaRequest, UserMediaRequest& userMediaRequest, Ref<MediaStream>&& stream, CompletionHandler<void()>&& completionHandler)
+ : m_protectingUserMediaRequest(WTFMove(protectingUserMediaRequest))
+ , m_userMediaRequest(userMediaRequest)
+ , m_mediaStream(WTFMove(stream))
+ , m_completionHandler(WTFMove(completionHandler))
+{
+ m_mediaStream->privateStream().addObserver(*this);
+ m_mediaStream->startProducingData();
+}
+
+UserMediaRequest::PendingActivationMediaStream::~PendingActivationMediaStream()
+{
+ m_mediaStream->privateStream().removeObserver(*this);
+ m_completionHandler();
+ if (auto* document = m_mediaStream->document())
+ document->updateIsPlayingMedia();
+}
+
+void UserMediaRequest::PendingActivationMediaStream::characteristicsChanged()
+{
+ if (!m_userMediaRequest.m_pendingActivationMediaStream)
+ return;
+
+ for (auto& track : m_mediaStream->privateStream().tracks()) {
+ if (track->source().captureDidFail()) {
+ m_userMediaRequest.mediaStreamDidFail(track->source().type());
+ return;
+ }
+ }
+
+ if (m_mediaStream->privateStream().hasVideo() || m_mediaStream->privateStream().hasAudio()) {
+ m_userMediaRequest.mediaStreamIsReady(WTFMove(m_mediaStream));
+ return;
+ }
+}
+
+void UserMediaRequest::mediaStreamIsReady(Ref<MediaStream>&& stream)
+{
+ RELEASE_LOG(MediaStream, "UserMediaRequest::mediaStreamIsReady");
+ stream->document()->setHasCaptureMediaStreamTrack();
+ m_promise.resolve(WTFMove(stream));
+ m_pendingActivationMediaStream = nullptr;
+}
+
void UserMediaRequest::mediaStreamDidFail(RealtimeMediaSource::Type type)
{
RELEASE_LOG(MediaStream, "UserMediaRequest::mediaStreamDidFail");
@@ -361,6 +395,7 @@
break;
}
m_promise.reject(NotReadableError, makeString("Failed starting capture of a "_s, typeDescription, " track"_s));
+ m_pendingActivationMediaStream = nullptr;
}
} // namespace WebCore
Modified: trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h (249650 => 249651)
--- trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h 2019-09-09 17:52:07 UTC (rev 249650)
+++ trunk/Source/WebCore/Modules/mediastream/UserMediaRequest.h 2019-09-09 17:52:15 UTC (rev 249651)
@@ -79,12 +79,29 @@
const char* activeDOMObjectName() const final;
bool canSuspendForDocumentSuspension() const final;
+ void mediaStreamIsReady(Ref<MediaStream>&&);
void mediaStreamDidFail(RealtimeMediaSource::Type);
+ class PendingActivationMediaStream : private MediaStreamPrivate::Observer {
+ WTF_MAKE_FAST_ALLOCATED;
+ public:
+ PendingActivationMediaStream(Ref<PendingActivity<UserMediaRequest>>&&, UserMediaRequest&, Ref<MediaStream>&&, CompletionHandler<void()>&&);
+ ~PendingActivationMediaStream();
+
+ private:
+ void characteristicsChanged() final;
+
+ Ref<PendingActivity<UserMediaRequest>> m_protectingUserMediaRequest;
+ UserMediaRequest& m_userMediaRequest;
+ Ref<MediaStream> m_mediaStream;
+ CompletionHandler<void()> m_completionHandler;
+ };
+
Vector<String> m_videoDeviceUIDs;
Vector<String> m_audioDeviceUIDs;
DOMPromiseDeferred<IDLInterface<MediaStream>> m_promise;
+ std::unique_ptr<PendingActivationMediaStream> m_pendingActivationMediaStream;
MediaStreamRequest m_request;
};
Modified: trunk/Source/WebCore/page/MediaProducer.h (249650 => 249651)
--- trunk/Source/WebCore/page/MediaProducer.h 2019-09-09 17:52:07 UTC (rev 249650)
+++ trunk/Source/WebCore/page/MediaProducer.h 2019-09-09 17:52:15 UTC (rev 249651)
@@ -58,13 +58,12 @@
AudioCaptureMask = HasActiveAudioCaptureDevice | HasMutedAudioCaptureDevice | HasInterruptedAudioCaptureDevice,
VideoCaptureMask = HasActiveVideoCaptureDevice | HasMutedVideoCaptureDevice | HasInterruptedVideoCaptureDevice,
DisplayCaptureMask = HasActiveDisplayCaptureDevice | HasMutedDisplayCaptureDevice | HasInterruptedDisplayCaptureDevice,
- ActiveCaptureMask = HasActiveAudioCaptureDevice | HasActiveVideoCaptureDevice | HasActiveDisplayCaptureDevice,
MutedCaptureMask = HasMutedAudioCaptureDevice | HasMutedVideoCaptureDevice | HasMutedDisplayCaptureDevice,
MediaCaptureMask = AudioCaptureMask | VideoCaptureMask | DisplayCaptureMask,
};
typedef unsigned MediaStateFlags;
- static bool isCapturing(MediaStateFlags state) { return (state & ActiveCaptureMask) || (state & MutedCaptureMask); }
+ static bool isCapturing(MediaStateFlags state) { return (state & HasActiveAudioCaptureDevice) || (state & HasActiveVideoCaptureDevice) || (state & HasMutedAudioCaptureDevice) || (state & HasMutedVideoCaptureDevice); }
virtual MediaStateFlags mediaState() const = 0;
Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp (249650 => 249651)
--- trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp 2019-09-09 17:52:07 UTC (rev 249650)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp 2019-09-09 17:52:15 UTC (rev 249651)
@@ -282,7 +282,9 @@
#endif
ALWAYS_LOG(LOGIDENTIFIER, track.logIdentifier(), " ", track.muted());
- characteristicsChanged();
+ scheduleDeferredTask([this] {
+ characteristicsChanged();
+ });
}
void MediaStreamPrivate::trackSettingsChanged(MediaStreamTrackPrivate&)
@@ -299,7 +301,9 @@
ALWAYS_LOG(LOGIDENTIFIER, track.logIdentifier(), " ", track.enabled());
updateActiveVideoTrack();
- characteristicsChanged();
+ scheduleDeferredTask([this] {
+ characteristicsChanged();
+ });
}
void MediaStreamPrivate::trackStarted(MediaStreamTrackPrivate& track)
@@ -309,7 +313,9 @@
#endif
ALWAYS_LOG(LOGIDENTIFIER, track.logIdentifier());
- characteristicsChanged();
+ scheduleDeferredTask([this] {
+ characteristicsChanged();
+ });
}
void MediaStreamPrivate::trackEnded(MediaStreamTrackPrivate& track)
@@ -319,10 +325,23 @@
#endif
ALWAYS_LOG(LOGIDENTIFIER, track.logIdentifier());
- updateActiveState(NotifyClientOption::Notify);
- characteristicsChanged();
+ scheduleDeferredTask([this] {
+ updateActiveState(NotifyClientOption::Notify);
+ characteristicsChanged();
+ });
}
+void MediaStreamPrivate::scheduleDeferredTask(Function<void ()>&& function)
+{
+ ASSERT(function);
+ callOnMainThread([weakThis = makeWeakPtr(*this), function = WTFMove(function)] {
+ if (!weakThis)
+ return;
+
+ function();
+ });
+}
+
void MediaStreamPrivate::monitorOrientation(OrientationNotifier& notifier)
{
for (auto& track : m_trackSet.values()) {
Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h (249650 => 249651)
--- trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h 2019-09-09 17:52:07 UTC (rev 249650)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h 2019-09-09 17:52:15 UTC (rev 249651)
@@ -47,6 +47,7 @@
#include <wtf/RefPtr.h>
#include <wtf/UUID.h>
#include <wtf/Vector.h>
+#include <wtf/WeakPtr.h>
namespace WebCore {
@@ -56,6 +57,7 @@
class MediaStreamPrivate final
: public MediaStreamTrackPrivate::Observer
, public RefCounted<MediaStreamPrivate>
+ , public CanMakeWeakPtr<MediaStreamPrivate>
#if !RELEASE_LOG_DISABLED
, private LoggerHelper
#endif
@@ -126,6 +128,7 @@
void characteristicsChanged();
void updateActiveVideoTrack();
+ void scheduleDeferredTask(Function<void ()>&&);
void forEachObserver(const WTF::Function<void(Observer&)>&) const;
#if !RELEASE_LOG_DISABLED