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