WebKit Bugzilla
Attachment 349453 Details for
Bug 189519
: Make IPC::SharedBufferDataReference a type that decodes into but does not inherit from IPC::DataReference
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-189519-20180911142315.patch (text/plain), 56.65 KB, created by
Alex Christensen
on 2018-09-11 14:23:16 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Alex Christensen
Created:
2018-09-11 14:23:16 PDT
Size:
56.65 KB
patch
obsolete
>Index: Source/WebCore/ChangeLog >=================================================================== >--- Source/WebCore/ChangeLog (revision 235862) >+++ Source/WebCore/ChangeLog (working copy) >@@ -1,3 +1,26 @@ >+2018-09-11 Alex Christensen <achristensen@webkit.org> >+ >+ Introduce WebCore::DataView, a safer replacement for IPC::DataReference >+ https://bugs.webkit.org/show_bug.cgi?id=189519 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Covered by new API tests and existing tests for its new use. >+ >+ * WebCore.xcodeproj/project.pbxproj: >+ * platform/DataView.h: Added. >+ (WebCore::DataView::DataView): >+ (WebCore::DataView::DataSizePair::operator==): >+ (WebCore::DataView::Iterator::Iterator): >+ (WebCore::DataView::Iterator::operator* const): >+ (WebCore::DataView::Iterator::operator==): >+ (WebCore::DataView::Iterator::operator!=): >+ (WebCore::DataView::Iterator::operator++): >+ (WebCore::DataView::begin const): >+ (WebCore::DataView::end const): >+ (WebCore::DataView::decode): >+ (WebCore::DataView::encode const): >+ > 2018-09-10 Simon Fraser <simon.fraser@apple.com> > > svg/W3C-SVG-1.1/render-groups-03-t.svg and some other SVG tests leak documents >Index: Source/WebCore/WebCore.xcodeproj/project.pbxproj >=================================================================== >--- Source/WebCore/WebCore.xcodeproj/project.pbxproj (revision 235862) >+++ Source/WebCore/WebCore.xcodeproj/project.pbxproj (working copy) >@@ -1845,6 +1845,7 @@ > 5CA1DEC61F71F1C700E71BD3 /* HTTPHeaderField.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CA1DEC41F71E68700E71BD3 /* HTTPHeaderField.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 5CB37FFF1C62D2A100F20188 /* ScrollAnimatorMock.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CB37FFD1C62D27800F20188 /* ScrollAnimatorMock.h */; }; > 5CBC8DAD1AAA302200E1C803 /* MediaAccessibilitySoftLink.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CBC8DAB1AAA302200E1C803 /* MediaAccessibilitySoftLink.h */; }; >+ 5CC5DB8121472618006CB8A8 /* DataView.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CC5DB7F21472517006CB8A8 /* DataView.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 5CD9F5661AA0F73C00DA45FF /* DFABytecode.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C39305D1AA0F6A90029C816 /* DFABytecode.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 5CD9F5671AA0F74200DA45FF /* DFABytecodeCompiler.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C39305F1AA0F6A90029C816 /* DFABytecodeCompiler.h */; settings = {ATTRIBUTES = (Private, ); }; }; > 5CD9F5681AA0F74600DA45FF /* DFABytecodeInterpreter.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C3930611AA0F6A90029C816 /* DFABytecodeInterpreter.h */; settings = {ATTRIBUTES = (Private, ); }; }; >@@ -8704,6 +8705,7 @@ > 5CB37FFD1C62D27800F20188 /* ScrollAnimatorMock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScrollAnimatorMock.h; sourceTree = "<group>"; }; > 5CBC8DAA1AAA302200E1C803 /* MediaAccessibilitySoftLink.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaAccessibilitySoftLink.cpp; sourceTree = "<group>"; }; > 5CBC8DAB1AAA302200E1C803 /* MediaAccessibilitySoftLink.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaAccessibilitySoftLink.h; sourceTree = "<group>"; }; >+ 5CC5DB7F21472517006CB8A8 /* DataView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataView.h; sourceTree = "<group>"; }; > 5CDD83391E4324BB00621E83 /* RealtimeIncomingVideoSourceCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RealtimeIncomingVideoSourceCocoa.mm; sourceTree = "<group>"; }; > 5CDD83391E4324BB00621E92 /* RealtimeIncomingVideoSource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RealtimeIncomingVideoSource.cpp; sourceTree = "<group>"; }; > 5CDD833A1E4324BB00621E83 /* RealtimeIncomingVideoSourceCocoa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RealtimeIncomingVideoSourceCocoa.h; sourceTree = "<group>"; }; >@@ -24439,6 +24441,7 @@ > F587868402DE3B8601EA4122 /* Cursor.h */, > E52CF54E20A35A2800DADA27 /* DataListSuggestionPicker.h */, > E52CF54C20A268AC00DADA27 /* DataListSuggestionsClient.h */, >+ 5CC5DB7F21472517006CB8A8 /* DataView.h */, > A5732B08136A161D005C8D7C /* DateComponents.cpp */, > A5732B09136A161D005C8D7C /* DateComponents.h */, > 37C738F11EDBDE87003F2B0B /* DateTimeChooser.h */, >@@ -27669,6 +27672,7 @@ > 81AC599A131636E60009A7E0 /* DataTransferItemList.h in Headers */, > E4A007831B820EC8002C5A6E /* DataURLDecoder.h in Headers */, > E4A007831B820EC8002C5A6E /* DataURLDecoder.h in Headers */, >+ 5CC5DB8121472618006CB8A8 /* DataView.h in Headers */, > A5732B0B136A161D005C8D7C /* DateComponents.h in Headers */, > F55B3DB61251F12D003EF269 /* DateInputType.h in Headers */, > 37C738F31EDBDE8A003F2B0B /* DateTimeChooser.h in Headers */, >Index: Source/WebCore/platform/DataView.h >=================================================================== >--- Source/WebCore/platform/DataView.h (nonexistent) >+++ Source/WebCore/platform/DataView.h (working copy) >@@ -0,0 +1,133 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' >+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, >+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS >+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR >+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF >+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS >+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN >+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) >+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF >+ * THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#pragma once >+ >+#include "SharedBuffer.h" >+#include <wtf/Variant.h> >+ >+namespace WebCore { >+ >+class DataView { >+public: >+ DataView(const uint8_t* data, size_t size) >+ : m_data(DataSizePair { data, size }) { } >+ >+ DataView(const SharedBuffer& buffer) >+ : m_data(buffer) { } >+ >+ DataView(DataView&&) = default; >+ DataView(const DataView&) = default; >+ DataView() = default; >+ DataView& operator=(const DataView&) = default; >+ DataView& operator=(DataView&&) = default; >+ >+ struct DataSizePair { >+ const uint8_t* data { nullptr }; >+ size_t size { 0 }; >+ bool operator==(const DataSizePair& other) { return other.data == data && other.size == size; } >+ }; >+ >+ class Iterator : public std::iterator<std::forward_iterator_tag, DataSizePair, ptrdiff_t, DataSizePair*, DataSizePair&> { >+ public: >+ Iterator(const uint8_t* data, size_t size) >+ : m_iterator(DataSizePair { data, size }) { } >+ Iterator(SharedBuffer::DataSegmentVector::const_iterator iterator) >+ : m_iterator(iterator) { } >+ >+ DataSizePair operator*() const >+ { >+ return WTF::visit(WTF::makeVisitor( >+ [](const DataSizePair& pair) { return pair; }, >+ [](const SharedBuffer::DataSegmentVector::const_iterator& iterator) { return DataSizePair { reinterpret_cast<const uint8_t*>(iterator->segment->data()), iterator->segment->size() }; } >+ ), m_iterator); >+ } >+ >+ bool operator==(const Iterator& other) >+ { >+ if (m_iterator.index() != other.m_iterator.index()) >+ return false; >+ if (!m_iterator.index()) >+ return WTF::get<0>(m_iterator) == WTF::get<0>(other.m_iterator); >+ return WTF::get<1>(m_iterator) == WTF::get<1>(other.m_iterator); >+ } >+ bool operator!=(const Iterator& other) { return !(*this == other); } >+ >+ Iterator& operator++() >+ { >+ WTF::visit(WTF::makeVisitor( >+ [](DataSizePair& pair) { pair = { nullptr, 0 }; }, >+ [](SharedBuffer::DataSegmentVector::const_iterator& iterator) { ++iterator; } >+ ), m_iterator); >+ return *this; >+ } >+ private: >+ Variant<DataSizePair, SharedBuffer::DataSegmentVector::const_iterator> m_iterator; >+ }; >+ >+ Iterator begin() const >+ { >+ return WTF::visit(WTF::makeVisitor( >+ [](const DataSizePair& pair) { return Iterator { pair.data, pair.size }; }, >+ [](const SharedBuffer& buffer) { return Iterator { buffer.begin() }; } >+ ), m_data); >+ } >+ Iterator end() const >+ { >+ return WTF::visit(WTF::makeVisitor( >+ [](const DataSizePair&) { return Iterator { nullptr, 0 }; }, >+ [](const SharedBuffer& buffer) { return Iterator { buffer.end() }; } >+ ), m_data); >+ } >+ >+ size_t size() const >+ { >+ return WTF::visit(WTF::makeVisitor( >+ [](const DataSizePair& pair) { return pair.size; }, >+ [](const SharedBuffer& buffer) { return buffer.size(); } >+ ), m_data); >+ } >+ >+ template<typename Decoder> static std::optional<DataView> decode(Decoder& decoder) >+ { >+ return decoder.decodeVariableLengthByteArray(); >+ } >+ >+ template<typename Encoder> void encode(Encoder& encoder) const >+ { >+ uint64_t totalSize = WTF::visit(WTF::makeVisitor( >+ [](const DataSizePair& pair) { return pair.size; }, >+ [](const SharedBuffer& buffer) { return buffer.size(); } >+ ), m_data); >+ encoder.reserve(totalSize + sizeof(uint64_t)); >+ encoder << totalSize; >+ for (auto pair : *this) >+ encoder.encodeFixedLengthData(pair.data, pair.size, 1); >+ } >+private: >+ Variant<DataSizePair, std::reference_wrapper<const SharedBuffer>> m_data; >+}; >+ >+} >Index: Source/WebKit/ChangeLog >=================================================================== >--- Source/WebKit/ChangeLog (revision 235862) >+++ Source/WebKit/ChangeLog (working copy) >@@ -1,3 +1,63 @@ >+2018-09-11 Alex Christensen <achristensen@webkit.org> >+ >+ Introduce WebCore::DataView, a safer replacement for IPC::DataReference >+ https://bugs.webkit.org/show_bug.cgi?id=189519 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * NetworkProcess/NetworkConnectionToWebProcess.cpp: >+ (WebKit::NetworkConnectionToWebProcess::storeDerivedDataToCache): >+ * NetworkProcess/NetworkConnectionToWebProcess.h: >+ * NetworkProcess/NetworkConnectionToWebProcess.messages.in: >+ * NetworkProcess/NetworkResourceLoader.cpp: >+ (WebKit::NetworkResourceLoader::bufferingTimerFired): >+ (WebKit::NetworkResourceLoader::sendBuffer): >+ * Platform/IPC/DataReference.cpp: >+ (IPC::DataReference::decode): >+ (IPC::SharedBufferDataReference::encode const): Deleted. >+ * Platform/IPC/DataReference.h: >+ (IPC::SharedBufferDataReference::SharedBufferDataReference): Deleted. >+ * Platform/IPC/Decoder.cpp: >+ (IPC::Decoder::decodeVariableLengthByteArray): >+ * Platform/IPC/Decoder.h: >+ * StorageProcess/ServiceWorker/WebSWServerConnection.cpp: >+ (WebKit::WebSWServerConnection::didReceiveFetchData): >+ * StorageProcess/ServiceWorker/WebSWServerConnection.h: >+ * StorageProcess/StorageProcess.cpp: >+ (WebKit::StorageProcess::didReceiveFetchData): >+ * StorageProcess/StorageProcess.h: >+ * StorageProcess/StorageProcess.messages.in: >+ * UIProcess/Cocoa/WebPageProxyCocoa.mm: >+ (WebKit::WebPageProxy::platformRegisterAttachment): >+ * UIProcess/WebPageProxy.cpp: >+ (WebKit::WebPageProxy::registerAttachmentIdentifierFromData): >+ * UIProcess/WebPageProxy.h: >+ * UIProcess/WebPageProxy.messages.in: >+ * UIProcess/WebURLSchemeTask.cpp: >+ (WebKit::WebURLSchemeTask::didReceiveData): >+ * WebProcess/Network/WebLoaderStrategy.cpp: >+ (WebKit::WebLoaderStrategy::storeDerivedDataToCache): >+ * WebProcess/Network/WebResourceLoader.cpp: >+ (WebKit::WebResourceLoader::didReceiveData): >+ * WebProcess/Network/WebResourceLoader.h: >+ * WebProcess/Network/WebResourceLoader.messages.in: >+ * WebProcess/Storage/ServiceWorkerClientFetch.cpp: >+ (WebKit::ServiceWorkerClientFetch::didReceiveData): >+ * WebProcess/Storage/ServiceWorkerClientFetch.h: >+ * WebProcess/Storage/ServiceWorkerClientFetch.messages.in: >+ * WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp: >+ (WebKit::WebServiceWorkerFetchTaskClient::didReceiveData): >+ (WebKit::WebServiceWorkerFetchTaskClient::didReceiveBlobChunk): >+ * WebProcess/WebCoreSupport/WebEditorClient.cpp: >+ (WebKit::WebEditorClient::registerAttachmentIdentifier): >+ * WebProcess/WebPage/WebPage.cpp: >+ (WebKit::WebPage::getContentsAsMHTMLData): >+ (WebKit::WebPage::getMainResourceDataOfFrame): >+ (WebKit::WebPage::getResourceDataFromFrame): >+ (WebKit::WebPage::urlSchemeTaskDidReceiveData): >+ * WebProcess/WebPage/WebPage.h: >+ * WebProcess/WebPage/WebPage.messages.in: >+ > 2018-09-10 Daniel Bates <dabates@apple.com> > > [iOS] Arrow keys do not dispatch DOM events to non-editable elements >Index: Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp >=================================================================== >--- Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp (revision 235862) >+++ Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp (working copy) >@@ -51,6 +51,7 @@ > #include "WebErrors.h" > #include "WebsiteDataStore.h" > #include "WebsiteDataStoreParameters.h" >+#include <WebCore/DataView.h> > #include <WebCore/NetworkStorageSession.h> > #include <WebCore/ResourceLoaderOptions.h> > #include <WebCore/ResourceRequest.h> >@@ -492,10 +493,12 @@ void NetworkConnectionToWebProcess::writ > }); > } > >-void NetworkConnectionToWebProcess::storeDerivedDataToCache(const WebKit::NetworkCache::DataKey& dataKey, const IPC::DataReference& data) >+void NetworkConnectionToWebProcess::storeDerivedDataToCache(const WebKit::NetworkCache::DataKey& dataKey, const WebCore::DataView& dataView) > { >- if (auto* cache = NetworkProcess::singleton().cache()) >- cache->storeData(dataKey, data.data(), data.size()); >+ if (auto* cache = NetworkProcess::singleton().cache()) { >+ for (auto data : dataView) >+ cache->storeData(dataKey, data.data, data.size); >+ } > } > > void NetworkConnectionToWebProcess::setCaptureExtraNetworkLoadMetricsEnabled(bool enabled) >Index: Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h >=================================================================== >--- Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h (revision 235862) >+++ Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h (working copy) >@@ -39,6 +39,7 @@ > > namespace WebCore { > class BlobDataFileReference; >+class DataView; > class HTTPHeaderMap; > class ResourceError; > class ResourceRequest; >@@ -164,7 +165,7 @@ private: > void unregisterBlobURL(const WebCore::URL&); > void writeBlobsToTemporaryFiles(const Vector<String>& blobURLs, uint64_t requestIdentifier); > >- void storeDerivedDataToCache(const WebKit::NetworkCache::DataKey&, const IPC::DataReference&); >+ void storeDerivedDataToCache(const WebKit::NetworkCache::DataKey&, const WebCore::DataView&); > > void setCaptureExtraNetworkLoadMetricsEnabled(bool); > >Index: Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in >=================================================================== >--- Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in (revision 235862) >+++ Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in (working copy) >@@ -51,7 +51,7 @@ messages -> NetworkConnectionToWebProces > BlobSize(WebCore::URL url) -> (uint64_t resultSize) > WriteBlobsToTemporaryFiles(Vector<String> blobURLs, uint64_t requestIdentifier) > >- StoreDerivedDataToCache(WebKit::NetworkCache::DataKey key, IPC::DataReference data) >+ StoreDerivedDataToCache(WebKit::NetworkCache::DataKey key, WebCore::DataView data) > > SetCaptureExtraNetworkLoadMetricsEnabled(bool enabled) > >Index: Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp >=================================================================== >--- Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp (revision 235862) >+++ Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp (working copy) >@@ -46,6 +46,7 @@ > #include <WebCore/BlobDataFileReference.h> > #include <WebCore/CertificateInfo.h> > #include <WebCore/ContentSecurityPolicy.h> >+#include <WebCore/DataView.h> > #include <WebCore/DiagnosticLoggingKeys.h> > #include <WebCore/HTTPHeaderNames.h> > #include <WebCore/HTTPParsers.h> >@@ -739,21 +740,17 @@ void NetworkResourceLoader::bufferingTim > if (m_bufferedData->isEmpty()) > return; > >- IPC::SharedBufferDataReference dataReference(m_bufferedData.get()); >- size_t encodedLength = m_bufferedDataEncodedDataLength; >- >+ send(Messages::WebResourceLoader::DidReceiveData({ *m_bufferedData }, m_bufferedDataEncodedDataLength)); >+ > m_bufferedData = SharedBuffer::create(); > m_bufferedDataEncodedDataLength = 0; >- >- send(Messages::WebResourceLoader::DidReceiveData(dataReference, encodedLength)); > } > > void NetworkResourceLoader::sendBuffer(SharedBuffer& buffer, size_t encodedDataLength) > { > ASSERT(!isSynchronous()); > >- IPC::SharedBufferDataReference dataReference(&buffer); >- send(Messages::WebResourceLoader::DidReceiveData(dataReference, encodedDataLength)); >+ send(Messages::WebResourceLoader::DidReceiveData({ buffer }, encodedDataLength)); > } > > void NetworkResourceLoader::tryStoreAsCacheEntry() >Index: Source/WebKit/Platform/IPC/DataReference.cpp >=================================================================== >--- Source/WebKit/Platform/IPC/DataReference.cpp (revision 235862) >+++ Source/WebKit/Platform/IPC/DataReference.cpp (working copy) >@@ -28,6 +28,7 @@ > > #include "Decoder.h" > #include "Encoder.h" >+#include <WebCore/DataView.h> > > namespace IPC { > >@@ -38,17 +39,14 @@ void DataReference::encode(Encoder& enco > > bool DataReference::decode(Decoder& decoder, DataReference& dataReference) > { >- return decoder.decodeVariableLengthByteArray(dataReference); >-} >- >-void SharedBufferDataReference::encode(Encoder& encoder) const >-{ >- uint64_t bufferSize = static_cast<uint64_t>(m_buffer->size()); >- encoder.reserve(bufferSize + sizeof(uint64_t)); >- encoder << bufferSize; >- >- for (const auto& element : *m_buffer) >- encoder.encodeFixedLengthData(reinterpret_cast<const uint8_t*>(element.segment->data()), element.segment->size(), 1); >+ auto view = decoder.decodeVariableLengthByteArray(); >+ if (!view) >+ return false; >+ auto data = view->begin(); >+ dataReference = { (*data).data, (*data).size }; >+ // FIXME: Replace DataReference with DataView entirely. >+ ASSERT(++data == view->end()); >+ return true; > } > > } // namespace IPC >Index: Source/WebKit/Platform/IPC/DataReference.h >=================================================================== >--- Source/WebKit/Platform/IPC/DataReference.h (revision 235862) >+++ Source/WebKit/Platform/IPC/DataReference.h (working copy) >@@ -83,30 +83,6 @@ private: > size_t m_size; > }; > >-class SharedBufferDataReference : public DataReference { >-public: >- // FIXME: This class doesn't handle null, so the argument should be a reference or PassRef. >- SharedBufferDataReference(WebCore::SharedBuffer* buffer) >- : m_buffer(buffer) >- { >- } >- >-private: >- // FIXME: It is a bad idea to violate the Liskov Substitution Principle as we do here. >- // Since we are using DataReference as a polymoprhic base class in this fashion, >- // then we need it to be a base class that does not have functions such as isEmpty, >- // size, data, and vector, all of which will do the wrong thing if they are called. >- // Deleting these functions here does not prevent them from being called. >- bool isEmpty() const = delete; >- size_t size() const = delete; >- const uint8_t* data() const = delete; >- Vector<uint8_t> vector() const = delete; >- >- void encode(Encoder&) const override; >- >- RefPtr<WebCore::SharedBuffer> m_buffer; >-}; >- > } // namespace IPC > > #endif // DataReference_h >Index: Source/WebKit/Platform/IPC/Decoder.cpp >=================================================================== >--- Source/WebKit/Platform/IPC/Decoder.cpp (revision 235862) >+++ Source/WebKit/Platform/IPC/Decoder.cpp (working copy) >@@ -28,6 +28,7 @@ > > #include "DataReference.h" > #include "MessageFlags.h" >+#include <WebCore/DataView.h> > #include <stdio.h> > > #if PLATFORM(MAC) >@@ -165,20 +166,19 @@ bool Decoder::decodeFixedLengthData(uint > return true; > } > >-bool Decoder::decodeVariableLengthByteArray(DataReference& dataReference) >+std::optional<WebCore::DataView> Decoder::decodeVariableLengthByteArray() > { > uint64_t size; > if (!decode(size)) >- return false; >+ return std::nullopt; > > if (!alignBufferPosition(1, size)) >- return false; >+ return std::nullopt; > > const uint8_t* data = m_bufferPos; > m_bufferPos += size; > >- dataReference = DataReference(data, size); >- return true; >+ return {{ data, static_cast<size_t>(size) }}; > } > > template<typename Type> >Index: Source/WebKit/Platform/IPC/Decoder.h >=================================================================== >--- Source/WebKit/Platform/IPC/Decoder.h (revision 235862) >+++ Source/WebKit/Platform/IPC/Decoder.h (working copy) >@@ -35,6 +35,10 @@ > #include <pthread/qos.h> > #endif > >+namespace WebCore { >+class DataView; >+} >+ > namespace IPC { > > class DataReference; >@@ -75,7 +79,7 @@ public: > bool decodeFixedLengthData(uint8_t*, size_t, unsigned alignment); > > // The data in the data reference here will only be valid for the lifetime of the ArgumentDecoder object. >- bool decodeVariableLengthByteArray(DataReference&); >+ std::optional<WebCore::DataView> decodeVariableLengthByteArray(); > > bool decode(bool&); > Decoder& operator>>(std::optional<bool>&); >Index: Source/WebKit/Shared/soup/WebCoreArgumentCodersSoup.cpp >=================================================================== >--- Source/WebKit/Shared/soup/WebCoreArgumentCodersSoup.cpp (revision 235862) >+++ Source/WebKit/Shared/soup/WebCoreArgumentCodersSoup.cpp (working copy) >@@ -30,6 +30,7 @@ > #include "WebCoreArgumentCoders.h" > > #include <WebCore/CertificateInfo.h> >+#include <WebCore/DataView.h> > #include <WebCore/ResourceError.h> > #include <WebCore/ResourceRequest.h> > #include <WebCore/ResourceResponse.h> >@@ -78,12 +79,14 @@ bool ArgumentCoder<CertificateInfo>::dec > if (!hasCertificate) > return true; > >- IPC::DataReference certificateDataReference; >- if (!decoder.decodeVariableLengthByteArray(certificateDataReference)) >+ auto dataView = decoder.decodeVariableLengthByteArray(); >+ if (!dataView) > return false; > >- GByteArray* certificateData = g_byte_array_sized_new(certificateDataReference.size()); >- certificateData = g_byte_array_append(certificateData, certificateDataReference.data(), certificateDataReference.size()); >+ GByteArray* certificateData = g_byte_array_sized_new(dataView->size()); >+ for (auto data : *dataView) >+ certificateData = g_byte_array_append(certificateData, data.data, data.size); >+ > GRefPtr<GByteArray> certificateBytes = adoptGRef(certificateData); > > GTlsBackend* backend = g_tls_backend_get_default(); >Index: Source/WebKit/StorageProcess/StorageProcess.cpp >=================================================================== >--- Source/WebKit/StorageProcess/StorageProcess.cpp (revision 235862) >+++ Source/WebKit/StorageProcess/StorageProcess.cpp (working copy) >@@ -516,7 +516,7 @@ void StorageProcess::didReceiveFetchResp > connection->didReceiveFetchResponse(fetchIdentifier, response); > } > >-void StorageProcess::didReceiveFetchData(SWServerConnectionIdentifier serverConnectionIdentifier, FetchIdentifier fetchIdentifier, const IPC::DataReference& data, int64_t encodedDataLength) >+void StorageProcess::didReceiveFetchData(SWServerConnectionIdentifier serverConnectionIdentifier, FetchIdentifier fetchIdentifier, const WebCore::DataView& data, int64_t encodedDataLength) > { > if (auto* connection = m_swServerConnections.get(serverConnectionIdentifier)) > connection->didReceiveFetchData(fetchIdentifier, data, encodedDataLength); >Index: Source/WebKit/StorageProcess/StorageProcess.h >=================================================================== >--- Source/WebKit/StorageProcess/StorageProcess.h (revision 235862) >+++ Source/WebKit/StorageProcess/StorageProcess.h (working copy) >@@ -43,6 +43,7 @@ class FormDataReference; > } > > namespace WebCore { >+class DataView; > class ResourceError; > class SWServer; > class ServiceWorkerRegistrationKey; >@@ -141,7 +142,7 @@ private: > #endif > #if ENABLE(SERVICE_WORKER) > void didReceiveFetchResponse(WebCore::SWServerConnectionIdentifier, WebCore::FetchIdentifier, const WebCore::ResourceResponse&); >- void didReceiveFetchData(WebCore::SWServerConnectionIdentifier, WebCore::FetchIdentifier, const IPC::DataReference&, int64_t encodedDataLength); >+ void didReceiveFetchData(WebCore::SWServerConnectionIdentifier, WebCore::FetchIdentifier, const WebCore::DataView&, int64_t encodedDataLength); > void didReceiveFetchFormData(WebCore::SWServerConnectionIdentifier, WebCore::FetchIdentifier, const IPC::FormDataReference&); > void didFinishFetch(WebCore::SWServerConnectionIdentifier, WebCore::FetchIdentifier); > void didFailFetch(WebCore::SWServerConnectionIdentifier, WebCore::FetchIdentifier, const WebCore::ResourceError&); >Index: Source/WebKit/StorageProcess/StorageProcess.messages.in >=================================================================== >--- Source/WebKit/StorageProcess/StorageProcess.messages.in (revision 235862) >+++ Source/WebKit/StorageProcess/StorageProcess.messages.in (working copy) >@@ -41,7 +41,7 @@ messages -> StorageProcess LegacyReceive > DidNotHandleFetch(WebCore::SWServerConnectionIdentifier serverConnectionIdentifier, WebCore::FetchIdentifier fetchIdentifier) > DidFailFetch(WebCore::SWServerConnectionIdentifier serverConnectionIdentifier, WebCore::FetchIdentifier fetchIdentifier, WebCore::ResourceError error) > DidReceiveFetchResponse(WebCore::SWServerConnectionIdentifier serverConnectionIdentifier, WebCore::FetchIdentifier fetchIdentifier, WebCore::ResourceResponse response) >- DidReceiveFetchData(WebCore::SWServerConnectionIdentifier serverConnectionIdentifier, WebCore::FetchIdentifier fetchIdentifier, IPC::DataReference data, int64_t encodedDataLength) >+ DidReceiveFetchData(WebCore::SWServerConnectionIdentifier serverConnectionIdentifier, WebCore::FetchIdentifier fetchIdentifier, WebCore::DataView data, int64_t encodedDataLength) > DidReceiveFetchFormData(WebCore::SWServerConnectionIdentifier serverConnectionIdentifier, WebCore::FetchIdentifier fetchIdentifier, IPC::FormDataReference data) > DidFinishFetch(WebCore::SWServerConnectionIdentifier serverConnectionIdentifier, WebCore::FetchIdentifier fetchIdentifier) > PostMessageToServiceWorkerClient(struct WebCore::ServiceWorkerClientIdentifier destinationIdentifier, struct WebCore::MessageWithMessagePorts message, WebCore::ServiceWorkerIdentifier sourceIdentifier, String sourceOrigin) >Index: Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.cpp >=================================================================== >--- Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.cpp (revision 235862) >+++ Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.cpp (working copy) >@@ -41,6 +41,7 @@ > #include "WebSWServerConnectionMessages.h" > #include "WebSWServerToContextConnection.h" > #include "WebToStorageProcessConnection.h" >+#include <WebCore/DataView.h> > #include <WebCore/DocumentIdentifier.h> > #include <WebCore/ExceptionData.h> > #include <WebCore/NotImplemented.h> >@@ -235,7 +236,7 @@ void WebSWServerConnection::didReceiveFe > m_contentConnection->send(Messages::ServiceWorkerClientFetch::DidReceiveResponse { response }, fetchIdentifier.toUInt64()); > } > >-void WebSWServerConnection::didReceiveFetchData(FetchIdentifier fetchIdentifier, const IPC::DataReference& data, int64_t encodedDataLength) >+void WebSWServerConnection::didReceiveFetchData(FetchIdentifier fetchIdentifier, const WebCore::DataView& data, int64_t encodedDataLength) > { > m_contentConnection->send(Messages::ServiceWorkerClientFetch::DidReceiveData { data, encodedDataLength }, fetchIdentifier.toUInt64()); > } >Index: Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.h >=================================================================== >--- Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.h (revision 235862) >+++ Source/WebKit/StorageProcess/ServiceWorker/WebSWServerConnection.h (working copy) >@@ -39,6 +39,7 @@ class FormDataReference; > } > > namespace WebCore { >+class DataView; > class ServiceWorkerRegistrationKey; > struct ClientOrigin; > struct ExceptionData; >@@ -62,7 +63,7 @@ public: > PAL::SessionID sessionID() const { return m_sessionID; } > > void didReceiveFetchResponse(WebCore::FetchIdentifier, const WebCore::ResourceResponse&); >- void didReceiveFetchData(WebCore::FetchIdentifier, const IPC::DataReference&, int64_t encodedDataLength); >+ void didReceiveFetchData(WebCore::FetchIdentifier, const WebCore::DataView&, int64_t encodedDataLength); > void didReceiveFetchFormData(WebCore::FetchIdentifier, const IPC::FormDataReference&); > void didFinishFetch(WebCore::FetchIdentifier); > void didFailFetch(WebCore::FetchIdentifier, const WebCore::ResourceError&); >Index: Source/WebKit/UIProcess/WebPageProxy.cpp >=================================================================== >--- Source/WebKit/UIProcess/WebPageProxy.cpp (revision 235862) >+++ Source/WebKit/UIProcess/WebPageProxy.cpp (working copy) >@@ -7724,7 +7724,7 @@ void WebPageProxy::updateAttachmentAttri > m_process->send(Messages::WebPage::UpdateAttachmentAttributes(attachment.identifier(), attachment.fileSizeForDisplay(), attachment.contentType(), attachment.fileName(), callbackID), m_pageID); > } > >-void WebPageProxy::registerAttachmentIdentifierFromData(const String& identifier, const String& contentType, const String& preferredFileName, const IPC::DataReference& data) >+void WebPageProxy::registerAttachmentIdentifierFromData(const String& identifier, const String& contentType, const String& preferredFileName, const WebCore::DataView& data) > { > if (attachmentForIdentifier(identifier)) > return; >Index: Source/WebKit/UIProcess/WebPageProxy.h >=================================================================== >--- Source/WebKit/UIProcess/WebPageProxy.h (revision 235862) >+++ Source/WebKit/UIProcess/WebPageProxy.h (working copy) >@@ -160,6 +160,7 @@ namespace WebCore { > class AuthenticationChallenge; > class CertificateInfo; > class Cursor; >+class DataView; > class DragData; > class FloatRect; > class FontAttributeChanges; >@@ -1804,11 +1805,11 @@ private: > void stopAllURLSchemeTasks(); > > #if ENABLE(ATTACHMENT_ELEMENT) >- void registerAttachmentIdentifierFromData(const String& identifier, const String& contentType, const String& preferredFileName, const IPC::DataReference&); >+ void registerAttachmentIdentifierFromData(const String& identifier, const String& contentType, const String& preferredFileName, const WebCore::DataView&); > void registerAttachmentIdentifierFromFilePath(const String& identifier, const String& contentType, const String& filePath); > void cloneAttachmentData(const String& fromIdentifier, const String& toIdentifier); > >- void platformRegisterAttachment(Ref<API::Attachment>&&, const String& preferredFileName, const IPC::DataReference&); >+ void platformRegisterAttachment(Ref<API::Attachment>&&, const String& preferredFileName, const WebCore::DataView&); > void platformRegisterAttachment(Ref<API::Attachment>&&, const String& filePath); > void platformCloneAttachment(Ref<API::Attachment>&& fromAttachment, Ref<API::Attachment>&& toAttachment); > >Index: Source/WebKit/UIProcess/WebPageProxy.messages.in >=================================================================== >--- Source/WebKit/UIProcess/WebPageProxy.messages.in (revision 235862) >+++ Source/WebKit/UIProcess/WebPageProxy.messages.in (working copy) >@@ -530,7 +530,7 @@ messages -> WebPageProxy { > #endif > > #if ENABLE(ATTACHMENT_ELEMENT) >- RegisterAttachmentIdentifierFromData(String identifier, String contentType, String preferredFileName, IPC::DataReference data) >+ RegisterAttachmentIdentifierFromData(String identifier, String contentType, String preferredFileName, WebCore::DataView data) > RegisterAttachmentIdentifierFromFilePath(String identifier, String contentType, String filePath) > CloneAttachmentData(String fromIdentifier, String toIdentifier) > DidInsertAttachmentWithIdentifier(String identifier, String source) >Index: Source/WebKit/UIProcess/WebURLSchemeTask.cpp >=================================================================== >--- Source/WebKit/UIProcess/WebURLSchemeTask.cpp (revision 235862) >+++ Source/WebKit/UIProcess/WebURLSchemeTask.cpp (working copy) >@@ -31,6 +31,7 @@ > #include "WebPageMessages.h" > #include "WebPageProxy.h" > #include "WebURLSchemeHandler.h" >+#include <WebCore/DataView.h> > > namespace WebKit { > using namespace WebCore; >@@ -116,7 +117,7 @@ auto WebURLSchemeTask::didReceiveData(Re > return ExceptionType::None; > } > >- m_page->send(Messages::WebPage::URLSchemeTaskDidReceiveData(m_urlSchemeHandler->identifier(), m_identifier, IPC::SharedBufferDataReference(buffer.ptr()))); >+ m_page->send(Messages::WebPage::URLSchemeTaskDidReceiveData(m_urlSchemeHandler->identifier(), m_identifier, { buffer })); > return ExceptionType::None; > } > >Index: Source/WebKit/UIProcess/Cocoa/WebPageProxyCocoa.mm >=================================================================== >--- Source/WebKit/UIProcess/Cocoa/WebPageProxyCocoa.mm (revision 235862) >+++ Source/WebKit/UIProcess/Cocoa/WebPageProxyCocoa.mm (working copy) >@@ -34,6 +34,7 @@ > #import "SafeBrowsingResult.h" > #import "SafeBrowsingSPI.h" > #import "WebProcessProxy.h" >+#import <WebCore/DataView.h> > #import <WebCore/DragItem.h> > #import <WebCore/NotImplemented.h> > #import <WebCore/SearchPopupMenuCocoa.h> >@@ -162,10 +163,12 @@ void WebPageProxy::setDragCaretRect(cons > > #if ENABLE(ATTACHMENT_ELEMENT) > >-void WebPageProxy::platformRegisterAttachment(Ref<API::Attachment>&& attachment, const String& preferredFileName, const IPC::DataReference& dataReference) >+void WebPageProxy::platformRegisterAttachment(Ref<API::Attachment>&& attachment, const String& preferredFileName, const WebCore::DataView& dataView) > { >- auto buffer = SharedBuffer::create(dataReference.data(), dataReference.size()); >- auto fileWrapper = adoptNS([[NSFileWrapper alloc] initRegularFileWithContents:buffer->createNSData().autorelease()]); >+ NSMutableData *mutableData = [NSMutableData dataWithCapacity:dataView.size()]; >+ for (auto data : dataView) >+ [mutableData appendBytes:data.data length:data.size]; >+ auto fileWrapper = adoptNS([[NSFileWrapper alloc] initRegularFileWithContents:mutableData]); > [fileWrapper setPreferredFilename:preferredFileName]; > attachment->setFileWrapper(fileWrapper.get()); > } >Index: Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp >=================================================================== >--- Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp (revision 235862) >+++ Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp (working copy) >@@ -48,6 +48,7 @@ > #include <WebCore/ApplicationCacheHost.h> > #include <WebCore/CachedResource.h> > #include <WebCore/ContentSecurityPolicy.h> >+#include <WebCore/DataView.h> > #include <WebCore/DiagnosticLoggingClient.h> > #include <WebCore/DiagnosticLoggingKeys.h> > #include <WebCore/Document.h> >@@ -649,8 +650,7 @@ void WebLoaderStrategy::didFinishPreconn > void WebLoaderStrategy::storeDerivedDataToCache(const SHA1::Digest& bodyHash, const String& type, const String& partition, WebCore::SharedBuffer& data) > { > NetworkCache::DataKey key { partition, type, bodyHash }; >- IPC::SharedBufferDataReference dataReference { &data }; >- WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::StoreDerivedDataToCache(key, dataReference), 0); >+ WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::StoreDerivedDataToCache(key, { data }), 0); > } > > bool WebLoaderStrategy::isOnLine() const >Index: Source/WebKit/WebProcess/Network/WebResourceLoader.cpp >=================================================================== >--- Source/WebKit/WebProcess/Network/WebResourceLoader.cpp (revision 235862) >+++ Source/WebKit/WebProcess/Network/WebResourceLoader.cpp (working copy) >@@ -132,17 +132,18 @@ void WebResourceLoader::didReceiveRespon > m_coreLoader->didReceiveResponse(response, WTFMove(policyDecisionCompletionHandler)); > } > >-void WebResourceLoader::didReceiveData(const IPC::DataReference& data, int64_t encodedDataLength) >+void WebResourceLoader::didReceiveData(const WebCore::DataView& dataView, int64_t encodedDataLength) > { >- LOG(Network, "(WebProcess) WebResourceLoader::didReceiveData of size %lu for '%s'", data.size(), m_coreLoader->url().string().latin1().data()); >- ASSERT_WITH_MESSAGE(!m_isProcessingNetworkResponse, "Network process should not send data until we've validated the response"); >+ for (auto data : dataView) { >+ LOG(Network, "(WebProcess) WebResourceLoader::didReceiveData of size %lu for '%s'", data.size, m_coreLoader->url().string().latin1().data()); >+ ASSERT_WITH_MESSAGE(!m_isProcessingNetworkResponse, "Network process should not send data until we've validated the response"); > >- if (!m_numBytesReceived) { >- RELEASE_LOG_IF_ALLOWED("didReceiveData: Started receiving data (pageID = %" PRIu64 ", frameID = %" PRIu64 ", resourceID = %" PRIu64 ")", m_trackingParameters.pageID, m_trackingParameters.frameID, m_trackingParameters.resourceID); >- } >- m_numBytesReceived += data.size(); >+ if (!m_numBytesReceived) >+ RELEASE_LOG_IF_ALLOWED("didReceiveData: Started receiving data (pageID = %" PRIu64 ", frameID = %" PRIu64 ", resourceID = %" PRIu64 ")", m_trackingParameters.pageID, m_trackingParameters.frameID, m_trackingParameters.resourceID); >+ m_numBytesReceived += data.size; > >- m_coreLoader->didReceiveData(reinterpret_cast<const char*>(data.data()), data.size(), encodedDataLength, DataPayloadBytes); >+ m_coreLoader->didReceiveData(reinterpret_cast<const char*>(data.data), data.size, encodedDataLength, DataPayloadBytes); >+ } > } > > void WebResourceLoader::didRetrieveDerivedData(const String& type, const IPC::DataReference& data) >Index: Source/WebKit/WebProcess/Network/WebResourceLoader.h >=================================================================== >--- Source/WebKit/WebProcess/Network/WebResourceLoader.h (revision 235862) >+++ Source/WebKit/WebProcess/Network/WebResourceLoader.h (working copy) >@@ -36,6 +36,7 @@ class DataReference; > } > > namespace WebCore { >+class DataView; > class NetworkLoadMetrics; > class ResourceError; > class ResourceLoader; >@@ -77,7 +78,7 @@ private: > void willSendRequest(WebCore::ResourceRequest&&, WebCore::ResourceResponse&&); > void didSendData(uint64_t bytesSent, uint64_t totalBytesToBeSent); > void didReceiveResponse(const WebCore::ResourceResponse&, bool needsContinueDidReceiveResponseMessage); >- void didReceiveData(const IPC::DataReference&, int64_t encodedDataLength); >+ void didReceiveData(const WebCore::DataView&, int64_t encodedDataLength); > void didRetrieveDerivedData(const String& type, const IPC::DataReference&); > void didFinishResourceLoad(const WebCore::NetworkLoadMetrics&); > void didFailResourceLoad(const WebCore::ResourceError&); >Index: Source/WebKit/WebProcess/Network/WebResourceLoader.messages.in >=================================================================== >--- Source/WebKit/WebProcess/Network/WebResourceLoader.messages.in (revision 235862) >+++ Source/WebKit/WebProcess/Network/WebResourceLoader.messages.in (working copy) >@@ -24,7 +24,7 @@ messages -> WebResourceLoader LegacyRece > WillSendRequest(WebCore::ResourceRequest request, WebCore::ResourceResponse redirectResponse) > DidSendData(uint64_t bytesSent, uint64_t totalBytesToBeSent) > DidReceiveResponse(WebCore::ResourceResponse response, bool needsContinueDidReceiveResponseMessage) >- DidReceiveData(IPC::DataReference data, int64_t encodedDataLength) >+ DidReceiveData(WebCore::DataView data, int64_t encodedDataLength) > DidFinishResourceLoad(WebCore::NetworkLoadMetrics networkLoadMetrics) > DidRetrieveDerivedData(String type, IPC::DataReference data) > DidFailResourceLoad(WebCore::ResourceError error) >Index: Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.cpp >=================================================================== >--- Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.cpp (revision 235862) >+++ Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.cpp (working copy) >@@ -32,6 +32,7 @@ > #include "WebSWClientConnection.h" > #include "WebServiceWorkerProvider.h" > #include <WebCore/CrossOriginAccessControl.h> >+#include <WebCore/DataView.h> > #include <WebCore/Document.h> > #include <WebCore/Frame.h> > #include <WebCore/MIMETypeRegistry.h> >@@ -162,15 +163,16 @@ void ServiceWorkerClientFetch::didReceiv > }); > } > >-void ServiceWorkerClientFetch::didReceiveData(const IPC::DataReference& dataReference, int64_t encodedDataLength) >+void ServiceWorkerClientFetch::didReceiveData(const WebCore::DataView& dataView, int64_t encodedDataLength) > { >- auto* data = reinterpret_cast<const char*>(dataReference.data()); >- if (!m_buffer) { >- m_buffer = SharedBuffer::create(data, dataReference.size()); >- m_encodedDataLength = encodedDataLength; >- } else { >- m_buffer->append(data, dataReference.size()); >- m_encodedDataLength += encodedDataLength; >+ for (auto data : dataView) { >+ if (!m_buffer) { >+ m_buffer = SharedBuffer::create(data.data, data.size); >+ m_encodedDataLength = encodedDataLength; >+ } else { >+ m_buffer->append(reinterpret_cast<const char*>(data.data), data.size); >+ m_encodedDataLength += encodedDataLength; >+ } > } > > if (m_isCheckingResponse) >Index: Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.h >=================================================================== >--- Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.h (revision 235862) >+++ Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.h (working copy) >@@ -36,6 +36,10 @@ > #include <WebCore/ResourceLoader.h> > #include <wtf/CompletionHandler.h> > >+namespace WebCore { >+class DataView; >+} >+ > namespace WebKit { > > class WebSWClientConnection; >@@ -62,7 +66,7 @@ private: > std::optional<WebCore::ResourceError> validateResponse(const WebCore::ResourceResponse&); > > void didReceiveResponse(WebCore::ResourceResponse&&); >- void didReceiveData(const IPC::DataReference&, int64_t encodedDataLength); >+ void didReceiveData(const WebCore::DataView&, int64_t encodedDataLength); > void didReceiveFormData(const IPC::FormDataReference&); > void didFinish(); > void didFail(WebCore::ResourceError&&); >Index: Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.messages.in >=================================================================== >--- Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.messages.in (revision 235862) >+++ Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.messages.in (working copy) >@@ -24,7 +24,7 @@ > > messages -> ServiceWorkerClientFetch { > DidReceiveResponse(WebCore::ResourceResponse response) >- DidReceiveData(IPC::DataReference data, int64_t encodedDataLength) >+ DidReceiveData(WebCore::DataView data, int64_t encodedDataLength) > DidReceiveFormData(IPC::FormDataReference data) > DidFinish() > DidFail(WebCore::ResourceError error) >Index: Source/WebKit/WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp >=================================================================== >--- Source/WebKit/WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp (revision 235862) >+++ Source/WebKit/WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp (working copy) >@@ -66,8 +66,7 @@ void WebServiceWorkerFetchTaskClient::di > { > if (!m_connection) > return; >- IPC::SharedBufferDataReference dataReference { buffer.ptr() }; >- m_connection->send(Messages::StorageProcess::DidReceiveFetchData { m_serverConnectionIdentifier, m_fetchIdentifier, dataReference, static_cast<int64_t>(buffer->size()) }, 0); >+ m_connection->send(Messages::StorageProcess::DidReceiveFetchData { m_serverConnectionIdentifier, m_fetchIdentifier, { buffer }, static_cast<int64_t>(buffer->size()) }, 0); > } > > void WebServiceWorkerFetchTaskClient::didReceiveFormDataAndFinish(Ref<FormData>&& formData) >@@ -108,7 +107,7 @@ void WebServiceWorkerFetchTaskClient::di > return; > > IPC::DataReference dataReference { reinterpret_cast<const uint8_t*>(data), size }; >- m_connection->send(Messages::StorageProcess::DidReceiveFetchData { m_serverConnectionIdentifier, m_fetchIdentifier, dataReference, static_cast<int64_t>(size) }, 0); >+ m_connection->send(Messages::StorageProcess::DidReceiveFetchData { m_serverConnectionIdentifier, m_fetchIdentifier, { reinterpret_cast<const uint8_t*>(data), size }, static_cast<int64_t>(size) }, 0); > } > > void WebServiceWorkerFetchTaskClient::didFinishBlobLoading() >Index: Source/WebKit/WebProcess/WebCoreSupport/WebEditorClient.cpp >=================================================================== >--- Source/WebKit/WebProcess/WebCoreSupport/WebEditorClient.cpp (revision 235862) >+++ Source/WebKit/WebProcess/WebCoreSupport/WebEditorClient.cpp (working copy) >@@ -37,6 +37,7 @@ > #include "WebProcess.h" > #include "WebUndoStep.h" > #include <WebCore/ArchiveResource.h> >+#include <WebCore/DataView.h> > #include <WebCore/DocumentFragment.h> > #include <WebCore/FocusController.h> > #include <WebCore/Frame.h> >@@ -161,7 +162,7 @@ bool WebEditorClient::shouldApplyStyle(S > > void WebEditorClient::registerAttachmentIdentifier(const String& identifier, const String& contentType, const String& preferredFileName, Ref<SharedBuffer>&& data) > { >- m_page->send(Messages::WebPageProxy::RegisterAttachmentIdentifierFromData(identifier, contentType, preferredFileName, IPC::SharedBufferDataReference { data.ptr() })); >+ m_page->send(Messages::WebPageProxy::RegisterAttachmentIdentifierFromData(identifier, contentType, preferredFileName, { data })); > } > > void WebEditorClient::registerAttachmentIdentifier(const String& identifier, const String& contentType, const String& filePath) >Index: Source/WebKit/WebProcess/WebPage/WebPage.cpp >=================================================================== >--- Source/WebKit/WebProcess/WebPage/WebPage.cpp (revision 235862) >+++ Source/WebKit/WebProcess/WebPage/WebPage.cpp (working copy) >@@ -140,6 +140,7 @@ > #include <WebCore/CommonVM.h> > #include <WebCore/ContextMenuController.h> > #include <WebCore/DataTransfer.h> >+#include <WebCore/DataView.h> > #include <WebCore/DatabaseManager.h> > #include <WebCore/DeprecatedGlobalSettings.h> > #include <WebCore/DocumentFragment.h> >@@ -2990,7 +2991,7 @@ void WebPage::getContentsAsMHTMLData(Cal > { > auto buffer = MHTMLArchive::generateMHTMLData(m_page.get()); > >- // FIXME: Use SharedBufferDataReference. >+ // FIXME: Use DataView. > IPC::DataReference dataReference; > dataReference = IPC::DataReference(reinterpret_cast<const uint8_t*>(buffer->data()), buffer->size()); > send(Messages::WebPageProxy::DataCallback(dataReference, callbackID)); >@@ -3059,7 +3060,7 @@ void WebPage::getMainResourceDataOfFrame > } > } > >- // FIXME: Use SharedBufferDataReference. >+ // FIXME: Use DataView. > IPC::DataReference dataReference; > if (buffer) > dataReference = IPC::DataReference(reinterpret_cast<const uint8_t*>(buffer->data()), buffer->size()); >@@ -3087,7 +3088,7 @@ void WebPage::getResourceDataFromFrame(u > buffer = resourceDataForFrame(frame->coreFrame(), resourceURL); > } > >- // FIXME: Use SharedBufferDataReference. >+ // FIXME: Use DataView. > IPC::DataReference dataReference; > if (buffer) > dataReference = IPC::DataReference(reinterpret_cast<const uint8_t*>(buffer->data()), buffer->size()); >@@ -5975,12 +5976,13 @@ void WebPage::urlSchemeTaskDidReceiveRes > handler->taskDidReceiveResponse(taskIdentifier, response); > } > >-void WebPage::urlSchemeTaskDidReceiveData(uint64_t handlerIdentifier, uint64_t taskIdentifier, const IPC::DataReference& data) >+void WebPage::urlSchemeTaskDidReceiveData(uint64_t handlerIdentifier, uint64_t taskIdentifier, const WebCore::DataView& dataView) > { > auto* handler = m_identifierToURLSchemeHandlerProxyMap.get(handlerIdentifier); > ASSERT(handler); > >- handler->taskDidReceiveData(taskIdentifier, data.size(), data.data()); >+ for (auto data : dataView) >+ handler->taskDidReceiveData(taskIdentifier, data.size, data.data); > } > > void WebPage::urlSchemeTaskDidComplete(uint64_t handlerIdentifier, uint64_t taskIdentifier, const ResourceError& error) >Index: Source/WebKit/WebProcess/WebPage/WebPage.h >=================================================================== >--- Source/WebKit/WebProcess/WebPage/WebPage.h (revision 235862) >+++ Source/WebKit/WebProcess/WebPage/WebPage.h (working copy) >@@ -134,6 +134,7 @@ class FormDataReference; > namespace WebCore { > > class CaptureDevice; >+class DataView; > class DocumentLoader; > class DragData; > class FontAttributeChanges; >@@ -1411,7 +1412,7 @@ private: > > void urlSchemeTaskDidPerformRedirection(uint64_t handlerIdentifier, uint64_t taskIdentifier, WebCore::ResourceResponse&&, WebCore::ResourceRequest&&); > void urlSchemeTaskDidReceiveResponse(uint64_t handlerIdentifier, uint64_t taskIdentifier, const WebCore::ResourceResponse&); >- void urlSchemeTaskDidReceiveData(uint64_t handlerIdentifier, uint64_t taskIdentifier, const IPC::DataReference&); >+ void urlSchemeTaskDidReceiveData(uint64_t handlerIdentifier, uint64_t taskIdentifier, const WebCore::DataView&); > void urlSchemeTaskDidComplete(uint64_t handlerIdentifier, uint64_t taskIdentifier, const WebCore::ResourceError&); > > void setIsSuspended(bool); >Index: Source/WebKit/WebProcess/WebPage/WebPage.messages.in >=================================================================== >--- Source/WebKit/WebProcess/WebPage/WebPage.messages.in (revision 235862) >+++ Source/WebKit/WebProcess/WebPage/WebPage.messages.in (working copy) >@@ -502,7 +502,7 @@ messages -> WebPage LegacyReceiver { > > URLSchemeTaskDidPerformRedirection(uint64_t handlerIdentifier, uint64_t taskIdentifier, WebCore::ResourceResponse response, WebCore::ResourceRequest request) > URLSchemeTaskDidReceiveResponse(uint64_t handlerIdentifier, uint64_t taskIdentifier, WebCore::ResourceResponse response) >- URLSchemeTaskDidReceiveData(uint64_t handlerIdentifier, uint64_t taskIdentifier, IPC::DataReference data) >+ URLSchemeTaskDidReceiveData(uint64_t handlerIdentifier, uint64_t taskIdentifier, WebCore::DataView data) > URLSchemeTaskDidComplete(uint64_t handlerIdentifier, uint64_t taskIdentifier, WebCore::ResourceError error) > > SetIsSuspended(bool suspended) >Index: Tools/ChangeLog >=================================================================== >--- Tools/ChangeLog (revision 235912) >+++ Tools/ChangeLog (working copy) >@@ -1 +1,18 @@ >+2018-09-11 Alex Christensen <achristensen@webkit.org> >+ >+ Introduce WebCore::DataView, a safer replacement for IPC::DataReference >+ https://bugs.webkit.org/show_bug.cgi?id=189519 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * TestWebKitAPI/Tests/WebCore/SharedBuffer.cpp: >+ (TestWebKitAPI::TestEncoder::reserve): >+ (TestWebKitAPI::TestEncoder::operator<<): >+ (TestWebKitAPI::TestEncoder::encodeFixedLengthData): >+ (TestWebKitAPI::TestEncoder::releaseBuffer): >+ (TestWebKitAPI::TestDecoder::TestDecoder): >+ (TestWebKitAPI::TestDecoder::decodeVariableLengthByteArray): >+ (TestWebKitAPI::TestDecoder::operator>>): >+ (TestWebKitAPI::TEST_F): >+ > == Rolled over to ChangeLog-2018-09-11 == >Index: Tools/TestWebKitAPI/Tests/WebCore/SharedBuffer.cpp >=================================================================== >--- Tools/TestWebKitAPI/Tests/WebCore/SharedBuffer.cpp (revision 235862) >+++ Tools/TestWebKitAPI/Tests/WebCore/SharedBuffer.cpp (working copy) >@@ -29,6 +29,7 @@ > > #include "SharedBufferTest.h" > #include "Test.h" >+#include <WebCore/DataView.h> > #include <WebCore/SharedBuffer.h> > #include <wtf/MainThread.h> > #include <wtf/StringExtras.h> >@@ -198,4 +199,129 @@ TEST_F(SharedBufferTest, getSomeData) > checkBuffer(l.data(), l.size(), "l"); > } > >+struct TestEncoder { >+ void reserve(size_t) { } >+ TestEncoder& operator<<(uint64_t expectedSize) >+ { >+ m_expectedSize = expectedSize; >+ return *this; >+ } >+ void encodeFixedLengthData(const uint8_t* data, size_t size, unsigned) >+ { >+ m_buffer.append(data, size); >+ } >+ Vector<uint8_t>&& releaseBuffer() >+ { >+ EXPECT_EQ(m_expectedSize, m_buffer.size()); >+ return WTFMove(m_buffer); >+ } >+ >+ template<typename T> >+ TestEncoder& operator<<(T&& t) >+ { >+ t.encode(*this); >+ return *this; >+ } >+ >+ Vector<uint8_t> m_buffer; >+ uint64_t m_expectedSize; >+}; >+ >+struct TestDecoder { >+ TestDecoder(Vector<uint8_t>&& buffer) >+ : m_buffer(WTFMove(buffer)) { } >+ std::optional<DataView> decodeVariableLengthByteArray() >+ { >+ return {{ &m_buffer[0], m_buffer.size() }}; >+ } >+ >+ template<typename T> >+ TestDecoder& operator>>(std::optional<T>& t) >+ { >+ t = WebCore::DataView::decode(*this); >+ return *this; >+ } >+ >+ Vector<uint8_t> m_buffer; >+}; >+ >+TEST_F(SharedBufferTest, DataView) >+{ >+ Vector<char> s1 = {'a', 'b', 'c', 'd'}; >+ Vector<char> s2 = {'e', 'f', 'g'}; >+ Vector<char> s3 = {'i', 'j'}; >+ >+ auto buffer = SharedBuffer::create(); >+ buffer->append(WTFMove(s1)); >+ buffer->append(WTFMove(s2)); >+ buffer->append(WTFMove(s3)); >+ >+ Vector<std::pair<const uint8_t*, size_t>> bytes; >+ DataView view(buffer); >+ for (auto pair : view) >+ bytes.append({pair.data, pair.size}); >+ EXPECT_EQ(bytes.size(), 3ull); >+ EXPECT_EQ(bytes[0].second, 4ull); >+ EXPECT_EQ(bytes[1].second, 3ull); >+ EXPECT_EQ(bytes[2].second, 2ull); >+ >+ EXPECT_EQ(bytes[0].first[0], 'a'); >+ EXPECT_EQ(bytes[0].first[1], 'b'); >+ EXPECT_EQ(bytes[0].first[2], 'c'); >+ EXPECT_EQ(bytes[0].first[3], 'd'); >+ EXPECT_EQ(bytes[1].first[0], 'e'); >+ EXPECT_EQ(bytes[1].first[1], 'f'); >+ EXPECT_EQ(bytes[1].first[2], 'g'); >+ EXPECT_EQ(bytes[2].first[0], 'i'); >+ EXPECT_EQ(bytes[2].first[1], 'j'); >+ EXPECT_EQ(buffer->size(), view.size()); >+ >+ Vector<std::pair<const uint8_t*, size_t>> bytes2; >+ const uint8_t asdfg[5] = {'a', 's', 'd', 'f', 'g'}; >+ DataView view2(asdfg, 5); >+ for (auto pair : view2) >+ bytes2.append({pair.data, pair.size}); >+ EXPECT_EQ(bytes2.size(), 1ull); >+ EXPECT_EQ(bytes2[0].second, 5ull); >+ EXPECT_EQ(bytes2[0].first[0], 'a'); >+ EXPECT_EQ(bytes2[0].first[1], 's'); >+ EXPECT_EQ(bytes2[0].first[2], 'd'); >+ EXPECT_EQ(bytes2[0].first[3], 'f'); >+ EXPECT_EQ(bytes2[0].first[4], 'g'); >+ EXPECT_EQ(sizeof(asdfg), view2.size()); >+ >+ TestEncoder encoder; >+ encoder << view; >+ >+ auto encoderBuffer = encoder.releaseBuffer(); >+ EXPECT_TRUE(encoderBuffer == Vector<uint8_t>({'a', 'b', 'c', 'd', 'e', 'f', 'g', 'i', 'j'})); >+ >+ std::optional<DataView> decoded; >+ TestDecoder decoder(WTFMove(encoderBuffer)); >+ decoder >> decoded; >+ >+ auto countIterations = [](const DataView& view) { >+ size_t i = 0; >+ for (auto pair : view) { >+ (void)pair; >+ ++i; >+ } >+ return i; >+ }; >+ EXPECT_EQ(countIterations(view), 3ull); >+ EXPECT_EQ(countIterations(*decoded), 1ull); >+ for (auto pair : *decoded) { >+ EXPECT_EQ(pair.size, 9ull); >+ EXPECT_EQ(pair.data[0], 'a'); >+ EXPECT_EQ(pair.data[1], 'b'); >+ EXPECT_EQ(pair.data[2], 'c'); >+ EXPECT_EQ(pair.data[3], 'd'); >+ EXPECT_EQ(pair.data[4], 'e'); >+ EXPECT_EQ(pair.data[5], 'f'); >+ EXPECT_EQ(pair.data[6], 'g'); >+ EXPECT_EQ(pair.data[7], 'i'); >+ EXPECT_EQ(pair.data[8], 'j'); >+ } >+} >+ > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 189519
:
349431
|
349434
|
349440
|
349445
|
349447
|
349453
|
349463
|
349502
|
349523
|
349526
|
349555
|
349558
|
349560