File webkit2gtk3-iochannel-network-cache.patch of Package webkit2gtk3.38255

diff -urp webkitgtk-2.48.0.orig/Source/WebKit/NetworkProcess/cache/NetworkCacheData.cpp webkitgtk-2.48.0/Source/WebKit/NetworkProcess/cache/NetworkCacheData.cpp
--- webkitgtk-2.48.0.orig/Source/WebKit/NetworkProcess/cache/NetworkCacheData.cpp	2025-02-25 02:25:41.875403200 -0600
+++ webkitgtk-2.48.0/Source/WebKit/NetworkProcess/cache/NetworkCacheData.cpp	2025-03-31 15:43:14.264082875 -0500
@@ -39,6 +39,18 @@
 namespace WebKit {
 namespace NetworkCache {
 
+#if !USE(GLIB) && USE(CURL)
+Data::Data(Vector<uint8_t>&& data)
+    : Data(std::variant<Vector<uint8_t>, FileSystem::MappedFileData> { WTFMove(data) })
+{
+}
+#elif !PLATFORM(COCOA)
+Data::Data(Vector<uint8_t>&& data)
+    : Data(data.span())
+{
+}
+#endif
+
 Data Data::mapToFile(const String& path) const
 {
     FileSystem::PlatformFileHandle handle;
diff -urp webkitgtk-2.48.0.orig/Source/WebKit/NetworkProcess/cache/NetworkCacheData.h webkitgtk-2.48.0/Source/WebKit/NetworkProcess/cache/NetworkCacheData.h
--- webkitgtk-2.48.0.orig/Source/WebKit/NetworkProcess/cache/NetworkCacheData.h	2025-02-25 02:25:41.875403200 -0600
+++ webkitgtk-2.48.0/Source/WebKit/NetworkProcess/cache/NetworkCacheData.h	2025-03-31 15:43:14.264313592 -0500
@@ -29,6 +29,7 @@
 #include <wtf/FileSystem.h>
 #include <wtf/SHA1.h>
 #include <wtf/ThreadSafeRefCounted.h>
+#include <wtf/Vector.h>
 #include <wtf/text/WTFString.h>
 
 #if PLATFORM(COCOA)
@@ -56,6 +57,7 @@ class Data {
 public:
     Data() { }
     Data(std::span<const uint8_t>);
+    Data(Vector<uint8_t>&& data);
 
     ~Data() { }
 
@@ -70,7 +72,6 @@ public:
     Data(GRefPtr<GBytes>&&, FileSystem::PlatformFileHandle fd = FileSystem::invalidPlatformFileHandle);
 #elif USE(CURL)
     Data(std::variant<Vector<uint8_t>, FileSystem::MappedFileData>&&);
-    Data(Vector<uint8_t>&& data) : Data(std::variant<Vector<uint8_t>, FileSystem::MappedFileData> { WTFMove(data) }) { }
 #endif
     bool isNull() const;
     bool isEmpty() const { return !size(); }
diff -urp webkitgtk-2.48.0.orig/Source/WebKit/NetworkProcess/cache/NetworkCacheStorage.cpp webkitgtk-2.48.0/Source/WebKit/NetworkProcess/cache/NetworkCacheStorage.cpp
--- webkitgtk-2.48.0.orig/Source/WebKit/NetworkProcess/cache/NetworkCacheStorage.cpp	2025-02-25 02:25:41.875403200 -0600
+++ webkitgtk-2.48.0/Source/WebKit/NetworkProcess/cache/NetworkCacheStorage.cpp	2025-03-31 15:59:59.199802547 -0500
@@ -206,11 +206,10 @@ void Storage::ReadOperation::finishReadB
 class Storage::WriteOperation {
     WTF_MAKE_TZONE_ALLOCATED(Storage::WriteOperation);
 public:
-    WriteOperation(const Record& record, MappedBodyHandler&& mappedBodyHandler, CompletionHandler<void(int)>&& completionHandler)
+    WriteOperation(const Record& record, MappedBodyHandler&& mappedBodyHandler)
         : m_identifier(Storage::WriteOperationIdentifier::generate())
         , m_record(record)
         , m_mappedBodyHandler(WTFMove(mappedBodyHandler))
-        , m_completionHandler(WTFMove(completionHandler))
     {
         ASSERT(isMainRunLoop());
     }
@@ -218,20 +217,16 @@ public:
     ~WriteOperation()
     {
         ASSERT(isMainRunLoop());
-        if (m_completionHandler)
-            m_completionHandler(0);
     }
 
     Storage::WriteOperationIdentifier identifier() const { return m_identifier; }
     const Record& record() const WTF_REQUIRES_CAPABILITY(mainThread) { return m_record; }
     void invokeMappedBodyHandler(const Data&);
-    void invokeCompletionHandler(int);
 
 private:
     Storage::WriteOperationIdentifier m_identifier;
     const Record m_record;
     const MappedBodyHandler m_mappedBodyHandler;
-    CompletionHandler<void(int)> m_completionHandler;
 };
 
 WTF_MAKE_TZONE_ALLOCATED_IMPL(Storage::WriteOperation);
@@ -242,12 +237,6 @@ void Storage::WriteOperation::invokeMapp
         m_mappedBodyHandler(data);
 }
 
-void Storage::WriteOperation::invokeCompletionHandler(int result)
-{
-    if (m_completionHandler)
-        m_completionHandler(result);
-}
-
 class TraverseOperation final : public ThreadSafeRefCounted<TraverseOperation, WTF::DestructionThread::MainRunLoop> {
 public:
     static Ref<TraverseOperation> create(Storage::TraverseHandler&& handler)
@@ -414,9 +403,9 @@ Storage::Storage(const String& baseDirec
     , m_capacity(capacity)
     , m_readOperationTimeoutTimer(*this, &Storage::cancelAllReadOperations)
     , m_writeOperationDispatchTimer(*this, &Storage::dispatchPendingWriteOperations)
-    , m_ioQueue(ConcurrentWorkQueue::create("com.apple.WebKit.Cache.Storage"_s))
-    , m_backgroundIOQueue(ConcurrentWorkQueue::create("com.apple.WebKit.Cache.Storage.background"_s, WorkQueue::QOS::Background))
-    , m_serialBackgroundIOQueue(WorkQueue::create("com.apple.WebKit.Cache.Storage.serialBackground"_s, WorkQueue::QOS::Background))
+    , m_ioQueue(ConcurrentWorkQueue::create("com.apple.WebKit.Cache.Storage"_s, WorkQueue::QOS::UserInteractive))
+    , m_backgroundIOQueue(ConcurrentWorkQueue::create("com.apple.WebKit.Cache.Storage.background"_s, WorkQueue::QOS::Utility))
+    , m_serialBackgroundIOQueue(WorkQueue::create("com.apple.WebKit.Cache.Storage.serialBackground"_s, WorkQueue::QOS::Utility))
     , m_blobStorage(makeBlobDirectoryPath(baseDirectoryPath), m_salt)
 {
     ASSERT(RunLoop::isMain());
@@ -883,22 +872,18 @@ void Storage::dispatchReadOperation(std:
         m_readOperationTimeoutTimer.startOneShot(readTimeout);
     }
 
-    protectedIOQueue()->dispatch([this, protectedThis = Ref { *this }, identifier, recordPath = crossThreadCopy(WTFMove(recordPath)), blobPath = crossThreadCopy(WTFMove(blobPath))]() mutable {
-        auto recordIOStartTime = MonotonicTime::now();
-        auto channel = IOChannel::open(recordPath, IOChannel::Type::Read);
-        channel->read(0, std::numeric_limits<size_t>::max(), protectedIOQueue(), [this, protectedThis = WTFMove(protectedThis), identifier, recordIOStartTime](auto fileData, int error) mutable {
-            readRecordFromData(identifier, recordIOStartTime, WTFMove(fileData), error);
-        });
+    ioQueue().dispatch([this, protectedThis = Ref { *this }, identifier, recordPath = crossThreadCopy(WTFMove(recordPath)), blobPath = crossThreadCopy(WTFMove(blobPath))]() mutable {
+        readRecordFromData(identifier, MonotonicTime::now(), FileSystem::readEntireFile(recordPath));
 
         readBlobIfNecessary(identifier, blobPath);
     });
 }
 
-void Storage::readRecordFromData(Storage::ReadOperationIdentifier identifier, MonotonicTime recordIOStartTime, Data&& data, int error)
+void Storage::readRecordFromData(Storage::ReadOperationIdentifier identifier, MonotonicTime recordIOStartTime, std::optional<Vector<uint8_t>>&& data)
 {
     Record record;
-    if (!error)
-        record = readRecord(data);
+    if (data)
+        record = readRecord(WTFMove(*data));
 
     auto recordIOEndTime = MonotonicTime::now();
     RunLoop::protectedMain()->dispatch([this, protectedThis = Ref { *this }, identifier, recordIOStartTime, recordIOEndTime, record = crossThreadCopy(WTFMove(record))]() mutable {
@@ -1039,15 +1024,14 @@ void Storage::dispatchWriteOperation(std
         bool shouldStoreAsBlob = shouldStoreBodyAsBlob(record.body);
         auto blob = shouldStoreAsBlob ? storeBodyAsBlob(identifier, record) : std::nullopt;
         auto recordData = encodeRecord(record, blob);
+        auto recordSize = recordData.size();
 
-        auto channel = IOChannel::open(WTFMove(recordPath), IOChannel::Type::Create);
-        size_t recordSize = recordData.size();
-        channel->write(0, recordData, WorkQueue::main(), [this, protectedThis = WTFMove(protectedThis), identifier, recordSize](int error) {
-            // On error the entry still stays in the contents filter until next synchronization.
-            m_approximateRecordsSize += recordSize;
-            finishWriteOperationActivity(identifier, error);
+        if (!FileSystem::overwriteEntireFile(recordPath, recordData.span()))
+            RELEASE_LOG_ERROR(NetworkCacheStorage, "Failed to write %zu bytes of network cache record data to %" PUBLIC_LOG_STRING, recordSize, recordPath.utf8().data());
 
-            LOG(NetworkCacheStorage, "(NetworkProcess) write complete error=%d", error);
+        RunLoop::protectedMain()->dispatch([this, protectedThis = Ref { *this }, identifier, recordSize]() mutable {
+            m_approximateRecordsSize += recordSize;
+            finishWriteOperationActivity(identifier);
         });
     });
 }
@@ -1065,7 +1049,7 @@ bool Storage::removeWriteOperationActivi
     return m_writeOperationActivities.remove(identifier);
 }
 
-void Storage::finishWriteOperationActivity(WriteOperationIdentifier identifier, int error)
+void Storage::finishWriteOperationActivity(WriteOperationIdentifier identifier)
 {
     ASSERT(RunLoop::isMain());
     if (!removeWriteOperationActivity(identifier))
@@ -1073,7 +1057,6 @@ void Storage::finishWriteOperationActivi
 
     auto writeOperation = m_activeWriteOperations.take(identifier);
     RELEASE_ASSERT(writeOperation);
-    writeOperation->invokeCompletionHandler(error);
 
     dispatchPendingWriteOperations();
 
@@ -1108,7 +1091,7 @@ void Storage::retrieve(const Key& key, u
     dispatchPendingReadOperations();
 }
 
-void Storage::store(const Record& record, MappedBodyHandler&& mappedBodyHandler, CompletionHandler<void(int)>&& completionHandler)
+void Storage::store(const Record& record, MappedBodyHandler&& mappedBodyHandler)
 {
     ASSERT(RunLoop::isMain());
     ASSERT(!record.key.isNull());
@@ -1116,7 +1099,7 @@ void Storage::store(const Record& record
     if (!m_capacity)
         return;
 
-    auto writeOperation = makeUnique<WriteOperation>(record, WTFMove(mappedBodyHandler), WTFMove(completionHandler));
+    auto writeOperation = makeUnique<WriteOperation>(record, WTFMove(mappedBodyHandler));
     m_pendingWriteOperations.prepend(WTFMove(writeOperation));
 
     // Add key to the filter already here as we do lookups from the pending operations too.
diff -urp webkitgtk-2.48.0.orig/Source/WebKit/NetworkProcess/cache/NetworkCacheStorage.h webkitgtk-2.48.0/Source/WebKit/NetworkProcess/cache/NetworkCacheStorage.h
--- webkitgtk-2.48.0.orig/Source/WebKit/NetworkProcess/cache/NetworkCacheStorage.h	2025-02-25 02:25:41.875403200 -0600
+++ webkitgtk-2.48.0/Source/WebKit/NetworkProcess/cache/NetworkCacheStorage.h	2025-03-31 15:43:16.149882652 -0500
@@ -103,7 +103,7 @@ public:
     void retrieve(const Key&, unsigned priority, RetrieveCompletionHandler&&);
 
     using MappedBodyHandler = Function<void (const Data& mappedBody)>;
-    void store(const Record&, MappedBodyHandler&&, CompletionHandler<void(int)>&& = { });
+    void store(const Record&, MappedBodyHandler&&);
 
     void remove(const Key&);
     void remove(const Vector<Key>&, CompletionHandler<void()>&&);
@@ -166,13 +166,13 @@ private:
     void dispatchPendingWriteOperations();
     void addWriteOperationActivity(WriteOperationIdentifier);
     bool removeWriteOperationActivity(WriteOperationIdentifier);
-    void finishWriteOperationActivity(WriteOperationIdentifier, int error = 0);
+    void finishWriteOperationActivity(WriteOperationIdentifier);
 
     bool shouldStoreBodyAsBlob(const Data& bodyData);
     std::optional<BlobStorage::Blob> storeBodyAsBlob(WriteOperationIdentifier, const Storage::Record&);
     Data encodeRecord(const Record&, std::optional<BlobStorage::Blob>);
     Record readRecord(const Data&);
-    void readRecordFromData(Storage::ReadOperationIdentifier, MonotonicTime, Data&&, int error);
+    void readRecordFromData(Storage::ReadOperationIdentifier, MonotonicTime, std::optional<Vector<uint8_t>>&&);
     void readBlobIfNecessary(Storage::ReadOperationIdentifier, const String& blobPath);
 
     void updateFileModificationTime(String&& path);
openSUSE Build Service is sponsored by