Diff
Modified: trunk/LayoutTests/ChangeLog (270170 => 270171)
--- trunk/LayoutTests/ChangeLog 2020-11-27 00:40:58 UTC (rev 270170)
+++ trunk/LayoutTests/ChangeLog 2020-11-27 00:48:29 UTC (rev 270171)
@@ -1,3 +1,14 @@
+2020-11-26 Youenn Fablet <[email protected]>
+
+ https://collab-project.github.io/videojs-record/demo/video-only.html is not working
+ https://bugs.webkit.org/show_bug.cgi?id=219258
+ <rdar://problem/69759808>
+
+ Reviewed by Eric Carlson.
+
+ * http/wpt/mediarecorder/set-srcObject-MediaStream-Blob-expected.txt: Added.
+ * http/wpt/mediarecorder/set-srcObject-MediaStream-Blob.html: Added.
+
2020-11-22 Diego Pino Garcia <[email protected]>
[GLIB][GTK] Unreviewed test gardening. Updated expectations and baselines after 270164.
Added: trunk/LayoutTests/http/wpt/mediarecorder/set-srcObject-MediaStream-Blob-expected.txt (0 => 270171)
--- trunk/LayoutTests/http/wpt/mediarecorder/set-srcObject-MediaStream-Blob-expected.txt (rev 0)
+++ trunk/LayoutTests/http/wpt/mediarecorder/set-srcObject-MediaStream-Blob-expected.txt 2020-11-27 00:48:29 UTC (rev 270171)
@@ -0,0 +1,4 @@
+
+
+PASS Setting srcObject to MediaStream and then Blob
+
Added: trunk/LayoutTests/http/wpt/mediarecorder/set-srcObject-MediaStream-Blob.html (0 => 270171)
--- trunk/LayoutTests/http/wpt/mediarecorder/set-srcObject-MediaStream-Blob.html (rev 0)
+++ trunk/LayoutTests/http/wpt/mediarecorder/set-srcObject-MediaStream-Blob.html 2020-11-27 00:48:29 UTC (rev 270171)
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Setting a blob through srcObject after a MediaStream</title>
+ <script src=""
+ <script src=""
+</head>
+<body>
+ <video id="video1" controls autoplay playsInline></video>
+ <video id="video2" controls autoplay playsInline></video>
+ <script>
+function waitFor(duration)
+{
+ return new Promise((resolve) => setTimeout(resolve, duration));
+}
+
+promise_test(async (test) => {
+ const stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: true });
+ video1.srcObject = stream;
+ await video1.play();
+
+ const recorder = new MediaRecorder(stream);
+ const dataPromise = new Promise(resolve => recorder._ondataavailable_ = (e) => resolve(e.data));
+
+ const startPromise = new Promise(resolve => recorder._onstart_ = resolve);
+ recorder.start();
+ await startPromise;
+
+ await waitFor(100);
+ recorder.stop();
+ const blob = await dataPromise;
+
+ video1.srcObject = blob;
+ video2.srcObject = blob;
+ await video2.play();
+
+ assert_equals(video1.duration, video2.duration);
+}, "Setting srcObject to MediaStream and then Blob");
+
+ </script>
+</body>
+</html>
Modified: trunk/Source/WebCore/ChangeLog (270170 => 270171)
--- trunk/Source/WebCore/ChangeLog 2020-11-27 00:40:58 UTC (rev 270170)
+++ trunk/Source/WebCore/ChangeLog 2020-11-27 00:48:29 UTC (rev 270171)
@@ -1,3 +1,26 @@
+2020-11-26 Youenn Fablet <[email protected]>
+
+ https://collab-project.github.io/videojs-record/demo/video-only.html is not working
+ https://bugs.webkit.org/show_bug.cgi?id=219258
+ <rdar://problem/69759808>
+
+ Reviewed by Eric Carlson.
+
+ Make 'HTMLMediaElement.srcObject = blob' functional by making sure to register a blob URL before trying to load.
+ Clean-up internal slots when srcObject is set to make sure we do not load a MediaStream even if the current MediaProvider is a Blob.
+
+ Fix a Use-After-Move bug that can be triggered in case of synchronous media loading failure.
+
+ Test: http/wpt/mediarecorder/set-srcObject-MediaStream-Blob.html
+
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::~HTMLMediaElement):
+ (WebCore::HTMLMediaElement::setSrcObject):
+ (WebCore::HTMLMediaElement::loadResource):
+ * html/HTMLMediaElement.h:
+ * platform/graphics/avfoundation/objc/WebCoreAVFResourceLoader.mm:
+ (WebCore::WebCoreAVFResourceLoader::startLoading):
+
2020-11-26 Michael Catanzaro <[email protected]>
[WPE][GTK] Use Internet Explorer quirk for Google Docs
Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (270170 => 270171)
--- trunk/Source/WebCore/html/HTMLMediaElement.cpp 2020-11-27 00:40:58 UTC (rev 270170)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp 2020-11-27 00:48:29 UTC (rev 270171)
@@ -33,6 +33,7 @@
#include "Attribute.h"
#include "AudioTrackList.h"
#include "Blob.h"
+#include "BlobURL.h"
#include "CSSPropertyNames.h"
#include "CSSValueKeywords.h"
#include "Chrome.h"
@@ -105,6 +106,7 @@
#include "SleepDisabler.h"
#include "TextTrackCueList.h"
#include "TextTrackList.h"
+#include "ThreadableBlobRegistry.h"
#include "TimeRanges.h"
#include "UserContentController.h"
#include "UserGestureIndicator.h"
@@ -574,6 +576,9 @@
m_mediaSession = nullptr;
schedulePlaybackControlsManagerUpdate();
+
+ if (!m_blobURLForReading.isEmpty())
+ ThreadableBlobRegistry::unregisterBlobURL(m_blobURLForReading);
}
RefPtr<HTMLMediaElement> HTMLMediaElement::bestMediaElementForShowingPlaybackControlsManager(MediaElementSession::PlaybackControlsPurpose purpose)
@@ -996,6 +1001,14 @@
// value, and then invoke the element’s media element load algorithm.
INFO_LOG(LOGIDENTIFIER);
m_mediaProvider = WTFMove(mediaProvider);
+#if ENABLE(MEDIA_STREAM)
+ m_mediaStreamSrcObject = nullptr;
+#endif
+#if ENABLE(MEDIA_SOURCE)
+ m_mediaSource = nullptr;
+#endif
+ m_blob = nullptr;
+
prepareForLoad();
}
@@ -1477,7 +1490,12 @@
if (!loadAttempted && m_blob) {
loadAttempted = true;
ALWAYS_LOG(LOGIDENTIFIER, "loading generic blob");
- if (!m_player->load(m_blob->url(), contentType, keySystem))
+ if (!m_blobURLForReading.isEmpty())
+ ThreadableBlobRegistry::unregisterBlobURL(m_blobURLForReading);
+ m_blobURLForReading = BlobURL::createPublicURL(&document().securityOrigin());
+ ThreadableBlobRegistry::registerBlobURL(&document().securityOrigin(), m_blobURLForReading, m_blob->url());
+
+ if (!m_player->load(m_blobURLForReading, contentType, keySystem))
mediaLoadingFailed(MediaPlayer::NetworkState::FormatError);
}
Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (270170 => 270171)
--- trunk/Source/WebCore/html/HTMLMediaElement.h 2020-11-27 00:40:58 UTC (rev 270170)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h 2020-11-27 00:48:29 UTC (rev 270171)
@@ -1134,6 +1134,7 @@
friend class TrackDisplayUpdateScope;
RefPtr<Blob> m_blob;
+ URL m_blobURLForReading;
MediaProvider m_mediaProvider;
#if ENABLE(LEGACY_ENCRYPTED_MEDIA)
Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/WebCoreAVFResourceLoader.mm (270170 => 270171)
--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/WebCoreAVFResourceLoader.mm 2020-11-27 00:40:58 UTC (rev 270170)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/WebCoreAVFResourceLoader.mm 2020-11-27 00:48:29 UTC (rev 270171)
@@ -244,7 +244,7 @@
request.setPriority(ResourceLoadPriority::Low);
if (auto* loader = m_parent->player()->cachedResourceLoader()) {
- m_resourceMediaLoader = CachedResourceMediaLoader::create(*this, *loader, WTFMove(request));
+ m_resourceMediaLoader = CachedResourceMediaLoader::create(*this, *loader, ResourceRequest(request));
if (m_resourceMediaLoader)
return;
}
Modified: trunk/Source/WebKit/ChangeLog (270170 => 270171)
--- trunk/Source/WebKit/ChangeLog 2020-11-27 00:40:58 UTC (rev 270170)
+++ trunk/Source/WebKit/ChangeLog 2020-11-27 00:48:29 UTC (rev 270171)
@@ -1,3 +1,16 @@
+2020-11-26 Youenn Fablet <[email protected]>
+
+ https://collab-project.github.io/videojs-record/demo/video-only.html is not working
+ https://bugs.webkit.org/show_bug.cgi?id=219258
+ <rdar://problem/69759808>
+
+ Reviewed by Eric Carlson.
+
+ Fixed a potential null pointer crash in case load is aborted by WebCore at creation time.
+
+ * WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp:
+ (WebKit::MediaPlayerPrivateRemote::requestResource):
+
2020-11-26 Yoshiaki Jitsukawa <[email protected]>
[PlayStation] Enable ResourceLoadStatistics
Modified: trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp (270170 => 270171)
--- trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp 2020-11-27 00:40:58 UTC (rev 270170)
+++ trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp 2020-11-27 00:48:29 UTC (rev 270171)
@@ -35,6 +35,7 @@
#include "RemoteLegacyCDMSession.h"
#include "RemoteMediaPlayerManagerProxyMessages.h"
#include "RemoteMediaPlayerProxyMessages.h"
+#include "RemoteMediaResourceManagerMessages.h"
#include "SandboxExtension.h"
#include "VideoLayerRemote.h"
#include "WebCoreArgumentCoders.h"
@@ -1142,6 +1143,12 @@
ASSERT(!m_mediaResources.contains(remoteMediaResourceIdentifier));
auto resource = m_mediaResourceLoader->requestResource(WTFMove(request), options);
+ if (!resource) {
+ completionHandler();
+ // FIXME: Get the error from MediaResourceLoader::requestResource.
+ connection().send(Messages::RemoteMediaResourceManager::LoadFailed(remoteMediaResourceIdentifier, { ResourceError::Type::Cancellation }), 0);
+ return;
+ }
// PlatformMediaResource owns the PlatformMediaResourceClient
resource->setClient(makeUnique<RemoteMediaResourceProxy>(connection(), *resource, remoteMediaResourceIdentifier));
m_mediaResources.add(remoteMediaResourceIdentifier, WTFMove(resource));