Title: [270171] trunk
Revision
270171
Author
[email protected]
Date
2020-11-26 16:48:29 -0800 (Thu, 26 Nov 2020)

Log Message

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.

Source/WebCore:

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):

Source/WebKit:

Fixed a potential null pointer crash in case load is aborted by WebCore at creation time.

* WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp:
(WebKit::MediaPlayerPrivateRemote::requestResource):

LayoutTests:

* http/wpt/mediarecorder/set-srcObject-MediaStream-Blob-expected.txt: Added.
* http/wpt/mediarecorder/set-srcObject-MediaStream-Blob.html: Added.

Modified Paths

Added Paths

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

Reply via email to