Title: [295420] trunk/Source/WebKit
Revision
295420
Author
j...@apple.com
Date
2022-06-09 08:07:15 -0700 (Thu, 09 Jun 2022)

Log Message

Blame content process for media buffers allocated in the GPU Process
https://bugs.webkit.org/show_bug.cgi?id=241455
<rdar://94674194>

Reviewed by Jer Noble.

After copying the media content sent by the content process into a SharedMemory,
we send its SharedMemory's handle back to the content process for it to blame the
content.

Covered by existing tests.

* Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.cpp:
(WebKit::RemoteMediaResourceManager::dataReceived):
* Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.h:
* Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.messages.in:
* Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.cpp:
(WebKit::RemoteSourceBufferProxy::append):
* Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.h:
* Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.messages.in:
* Source/WebKit/Platform/IPC/SharedBufferReference.cpp:
(IPC::SharedBufferReference::sharedCopy const):
* Source/WebKit/Platform/IPC/SharedBufferReference.h:
* Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceProxy.cpp:
(WebKit::RemoteMediaResourceProxy::dataReceived):
* Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.cpp:
(WebKit::SourceBufferPrivateRemote::append):

Canonical link: https://commits.webkit.org/251426@main

Modified Paths

Diff

Modified: trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.cpp (295419 => 295420)


--- trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.cpp	2022-06-09 14:08:40 UTC (rev 295419)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.cpp	2022-06-09 15:07:15 UTC (rev 295420)
@@ -31,8 +31,10 @@
 #include "Connection.h"
 #include "RemoteMediaResource.h"
 #include "RemoteMediaResourceIdentifier.h"
+#include "SharedBufferReference.h"
 #include "WebCoreArgumentCoders.h"
 #include <WebCore/ResourceRequest.h>
+#include <wtf/Scope.h>
 
 namespace WebKit {
 
@@ -89,16 +91,24 @@
     resource->dataSent(bytesSent, totalBytesToBeSent);
 }
 
-void RemoteMediaResourceManager::dataReceived(RemoteMediaResourceIdentifier identifier, const SharedMemory::IPCHandle& bufferHandle)
+void RemoteMediaResourceManager::dataReceived(RemoteMediaResourceIdentifier identifier, IPC::SharedBufferReference&& buffer, CompletionHandler<void(SharedMemory::IPCHandle&&)>&& completionHandler)
 {
+    SharedMemory::Handle handle;
+
+    auto invokeCallbackAtScopeExit = makeScopeExit([&] {
+        completionHandler(SharedMemory::IPCHandle { WTFMove(handle), buffer.size() });
+    });
+
     auto* resource = m_remoteMediaResources.get(identifier);
     if (!resource)
         return;
 
-    auto sharedMemory = SharedMemory::map(bufferHandle.handle, SharedMemory::Protection::ReadOnly);
+    auto sharedMemory = buffer.sharedCopy();
     if (!sharedMemory)
         return;
-    resource->dataReceived(sharedMemory->createSharedBuffer(bufferHandle.dataSize));
+    sharedMemory->createHandle(handle, SharedMemory::Protection::ReadOnly);
+
+    resource->dataReceived(sharedMemory->createSharedBuffer(buffer.size()));
 }
 
 void RemoteMediaResourceManager::accessControlCheckFailed(RemoteMediaResourceIdentifier identifier, const ResourceError& error)

Modified: trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.h (295419 => 295420)


--- trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.h	2022-06-09 14:08:40 UTC (rev 295419)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.h	2022-06-09 15:07:15 UTC (rev 295420)
@@ -38,6 +38,7 @@
 namespace IPC {
 class Connection;
 class Decoder;
+class SharedBufferReference;
 }
 
 namespace WebCore {
@@ -66,7 +67,7 @@
     void responseReceived(RemoteMediaResourceIdentifier, const WebCore::ResourceResponse&, bool, CompletionHandler<void(WebCore::ShouldContinuePolicyCheck)>&&);
     void redirectReceived(RemoteMediaResourceIdentifier, WebCore::ResourceRequest&&, const WebCore::ResourceResponse&, CompletionHandler<void(WebCore::ResourceRequest&&)>&&);
     void dataSent(RemoteMediaResourceIdentifier, uint64_t, uint64_t);
-    void dataReceived(RemoteMediaResourceIdentifier, const SharedMemory::IPCHandle& bufferHandle);
+    void dataReceived(RemoteMediaResourceIdentifier, IPC::SharedBufferReference&&, CompletionHandler<void(WebKit::SharedMemory::IPCHandle&&)>&&);
     void accessControlCheckFailed(RemoteMediaResourceIdentifier, const WebCore::ResourceError&);
     void loadFailed(RemoteMediaResourceIdentifier, const WebCore::ResourceError&);
     void loadFinished(RemoteMediaResourceIdentifier, const WebCore::NetworkLoadMetrics&);

Modified: trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.messages.in (295419 => 295420)


--- trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.messages.in	2022-06-09 14:08:40 UTC (rev 295419)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteMediaResourceManager.messages.in	2022-06-09 15:07:15 UTC (rev 295420)
@@ -29,7 +29,7 @@
     ResponseReceived(WebKit::RemoteMediaResourceIdentifier identifier, WebCore::ResourceResponse response, bool didPassAccessControlCheck) -> (enum:bool WebCore::ShouldContinuePolicyCheck shouldContinue)
     RedirectReceived(WebKit::RemoteMediaResourceIdentifier identifier, WebCore::ResourceRequest request, WebCore::ResourceResponse response) -> (WebCore::ResourceRequest returnRequest)
     DataSent(WebKit::RemoteMediaResourceIdentifier identifier, uint64_t bytesSent, uint64_t totalBytesToBeSent)
-    DataReceived(WebKit::RemoteMediaResourceIdentifier identifier, WebKit::SharedMemory::IPCHandle data)
+    DataReceived(WebKit::RemoteMediaResourceIdentifier identifier, IPC::SharedBufferReference data) -> (WebKit::SharedMemory::IPCHandle remoteData)
     AccessControlCheckFailed(WebKit::RemoteMediaResourceIdentifier identifier, WebCore::ResourceError error)
     LoadFailed(WebKit::RemoteMediaResourceIdentifier identifier, WebCore::ResourceError error)
     LoadFinished(WebKit::RemoteMediaResourceIdentifier identifier, WebCore::NetworkLoadMetrics metrics)

Modified: trunk/Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.cpp (295419 => 295420)


--- trunk/Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.cpp	2022-06-09 14:08:40 UTC (rev 295419)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.cpp	2022-06-09 15:07:15 UTC (rev 295420)
@@ -32,6 +32,7 @@
 #include "InitializationSegmentInfo.h"
 #include "RemoteMediaPlayerProxy.h"
 #include "RemoteSourceBufferProxyMessages.h"
+#include "SharedBufferReference.h"
 #include "SourceBufferPrivateRemoteMessages.h"
 #include <WebCore/AudioTrackPrivate.h>
 #include <WebCore/ContentType.h>
@@ -38,6 +39,7 @@
 #include <WebCore/MediaDescription.h>
 #include <WebCore/PlatformTimeRanges.h>
 #include <WebCore/VideoTrackPrivate.h>
+#include <wtf/Scope.h>
 
 namespace WebKit {
 
@@ -192,13 +194,20 @@
     m_connectionToWebProcess->connection().send(Messages::SourceBufferPrivateRemote::SourceBufferPrivateBufferedDirtyChanged(flag), m_identifier);
 }
 
-void RemoteSourceBufferProxy::append(const SharedMemory::IPCHandle& bufferHandle)
+void RemoteSourceBufferProxy::append(IPC::SharedBufferReference&& buffer, CompletionHandler<void(SharedMemory::IPCHandle&&)>&& completionHandler)
 {
-    auto sharedMemory = SharedMemory::map(bufferHandle.handle, SharedMemory::Protection::ReadOnly);
+    SharedMemory::Handle handle;
+
+    auto invokeCallbackAtScopeExit = makeScopeExit([&] {
+        completionHandler(SharedMemory::IPCHandle { WTFMove(handle), buffer.size() });
+    });
+
+    auto sharedMemory = buffer.sharedCopy();
     if (!sharedMemory)
         return;
+    m_sourceBufferPrivate->append(sharedMemory->createSharedBuffer(buffer.size()));
 
-    m_sourceBufferPrivate->append(sharedMemory->createSharedBuffer(bufferHandle.dataSize));
+    sharedMemory->createHandle(handle, SharedMemory::Protection::ReadOnly);
 }
 
 void RemoteSourceBufferProxy::abort()

Modified: trunk/Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.h (295419 => 295420)


--- trunk/Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.h	2022-06-09 14:08:40 UTC (rev 295419)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.h	2022-06-09 15:07:15 UTC (rev 295420)
@@ -43,6 +43,7 @@
 namespace IPC {
 class Connection;
 class Decoder;
+class SharedBufferReference;
 }
 
 namespace WebCore {
@@ -88,7 +89,7 @@
     void setActive(bool);
     void canSwitchToType(const WebCore::ContentType&, CompletionHandler<void(bool)>&&);
     void setMode(WebCore::SourceBufferAppendMode);
-    void append(const SharedMemory::IPCHandle&);
+    void append(IPC::SharedBufferReference&&, CompletionHandler<void(WebKit::SharedMemory::IPCHandle&&)>&&);
     void abort();
     void resetParserState();
     void removedFromMediaSource();

Modified: trunk/Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.messages.in (295419 => 295420)


--- trunk/Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.messages.in	2022-06-09 14:08:40 UTC (rev 295419)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteSourceBufferProxy.messages.in	2022-06-09 15:07:15 UTC (rev 295420)
@@ -29,7 +29,7 @@
     SetActive(bool active)
     CanSwitchToType(WebCore::ContentType contentType) -> (bool canSwitch) Synchronous
     SetMode(WebCore::SourceBufferAppendMode appendMode)
-    Append(WebKit::SharedMemory::IPCHandle data)
+    Append(IPC::SharedBufferReference data) -> (WebKit::SharedMemory::IPCHandle remoteData)
     Abort()
     ResetParserState()
     RemovedFromMediaSource()

Modified: trunk/Source/WebKit/Platform/IPC/SharedBufferReference.cpp (295419 => 295420)


--- trunk/Source/WebKit/Platform/IPC/SharedBufferReference.cpp	2022-06-09 14:08:40 UTC (rev 295419)
+++ trunk/Source/WebKit/Platform/IPC/SharedBufferReference.cpp	2022-06-09 15:07:15 UTC (rev 295420)
@@ -123,4 +123,11 @@
     return downcast<SharedBuffer>(m_buffer.get())->data();
 }
 
+RefPtr<WebKit::SharedMemory> SharedBufferReference::sharedCopy() const
+{
+    if (!m_size)
+        return nullptr;
+    return SharedMemory::copyBuffer(*unsafeBuffer());
+}
+
 } // namespace IPC

Modified: trunk/Source/WebKit/Platform/IPC/SharedBufferReference.h (295419 => 295420)


--- trunk/Source/WebKit/Platform/IPC/SharedBufferReference.h	2022-06-09 14:08:40 UTC (rev 295419)
+++ trunk/Source/WebKit/Platform/IPC/SharedBufferReference.h	2022-06-09 15:07:15 UTC (rev 295420)
@@ -33,10 +33,6 @@
 #include <WebCore/SharedBuffer.h>
 #include <optional>
 
-namespace WebKit {
-class SharedMemory;
-}
-
 namespace IPC {
 
 class Decoder;
@@ -76,6 +72,7 @@
     // once it's deserialised over IPC.
     RefPtr<WebCore::SharedBuffer> unsafeBuffer() const;
     const uint8_t* data() const;
+    RefPtr<WebKit::SharedMemory> sharedCopy() const;
 
     void encode(Encoder&) const;
     static WARN_UNUSED_RETURN std::optional<SharedBufferReference> decode(Decoder&);

Modified: trunk/Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceProxy.cpp (295419 => 295420)


--- trunk/Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceProxy.cpp	2022-06-09 14:08:40 UTC (rev 295419)
+++ trunk/Source/WebKit/WebProcess/GPU/media/RemoteMediaResourceProxy.cpp	2022-06-09 15:07:15 UTC (rev 295420)
@@ -30,7 +30,7 @@
 
 #include "DataReference.h"
 #include "RemoteMediaResourceManagerMessages.h"
-#include "SharedMemory.h"
+#include "SharedBufferReference.h"
 #include "WebCoreArgumentCoders.h"
 #include <wtf/CompletionHandler.h>
 
@@ -74,16 +74,11 @@
 
 void RemoteMediaResourceProxy::dataReceived(WebCore::PlatformMediaResource&, const WebCore::SharedBuffer& buffer)
 {
-    SharedMemory::Handle handle;
-    {
-        auto sharedMemory = SharedMemory::copyBuffer(buffer);
-        if (!sharedMemory)
-            return;
-        sharedMemory->createHandle(handle, SharedMemory::Protection::ReadOnly);
-    }
-    // Take ownership of shared memory and mark it as media-related memory.
-    handle.takeOwnershipOfMemory(MemoryLedger::Media);
-    m_connection->send(Messages::RemoteMediaResourceManager::DataReceived(m_id, SharedMemory::IPCHandle { WTFMove(handle), buffer.size() }), 0);
+    m_connection->sendWithAsyncReply(Messages::RemoteMediaResourceManager::DataReceived(m_id, IPC::SharedBufferReference { buffer }), [] (auto&& bufferHandle) {
+        // Take ownership of shared memory and mark it as media-related memory.
+        if (!bufferHandle.handle.isNull())
+            bufferHandle.handle.takeOwnershipOfMemory(MemoryLedger::Media);
+    }, 0);
 }
 
 void RemoteMediaResourceProxy::accessControlCheckFailed(WebCore::PlatformMediaResource&, const WebCore::ResourceError& error)

Modified: trunk/Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.cpp (295419 => 295420)


--- trunk/Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.cpp	2022-06-09 14:08:40 UTC (rev 295419)
+++ trunk/Source/WebKit/WebProcess/GPU/media/SourceBufferPrivateRemote.cpp	2022-06-09 15:07:15 UTC (rev 295420)
@@ -33,6 +33,7 @@
 #include "MediaPlayerPrivateRemote.h"
 #include "MediaSourcePrivateRemote.h"
 #include "RemoteSourceBufferProxyMessages.h"
+#include "SharedBufferReference.h"
 #include "SourceBufferPrivateRemoteMessages.h"
 #include <WebCore/PlatformTimeRanges.h>
 #include <WebCore/SourceBufferPrivateClient.h>
@@ -83,17 +84,11 @@
     if (!m_gpuProcessConnection)
         return;
 
-    SharedMemory::Handle handle;
-    {
-        auto sharedData = SharedMemory::copyBuffer(data);
-        if (!sharedData)
-            return;
-        sharedData->createHandle(handle, SharedMemory::Protection::ReadOnly);
-    }
-    // Take ownership of shared memory and mark it as media-related memory.
-    handle.takeOwnershipOfMemory(MemoryLedger::Media);
-
-    m_gpuProcessConnection->connection().send(Messages::RemoteSourceBufferProxy::Append(SharedMemory::IPCHandle { WTFMove(handle), data->size() }), m_remoteSourceBufferIdentifier);
+    m_gpuProcessConnection->connection().sendWithAsyncReply(Messages::RemoteSourceBufferProxy::Append(IPC::SharedBufferReference { WTFMove(data) }), [] (auto&& bufferHandle) {
+        // Take ownership of shared memory and mark it as media-related memory.
+        if (!bufferHandle.handle.isNull())
+            bufferHandle.handle.takeOwnershipOfMemory(MemoryLedger::Media);
+    }, m_remoteSourceBufferIdentifier);
 }
 
 void SourceBufferPrivateRemote::abort()
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to