WebKit Bugzilla
Attachment 372834 Details for
Bug 199189
: WebSockets: add support for sending blob messages when using web sockets platform APIs
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
wk2-websockets-blobs.diff (text/plain), 6.34 KB, created by
Carlos Garcia Campos
on 2019-06-25 04:28:46 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Carlos Garcia Campos
Created:
2019-06-25 04:28:46 PDT
Size:
6.34 KB
patch
obsolete
>diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index e54e326efc2..07ff1fc83a2 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,12 @@ >+2019-06-25 Carlos Garcia Campos <cgarcia@igalia.com> >+ >+ WebSockets: add support for sending blob messages when using web sockets platform APIs >+ https://bugs.webkit.org/show_bug.cgi?id=199189 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * Headers.cmake: Add missing headers. >+ > 2019-06-24 Wenson Hsieh <wenson_hsieh@apple.com> > > [Text autosizing] [iPadOS] Revise our heuristics to determine idempotent text autosizing candidates >diff --git a/Source/WebCore/Headers.cmake b/Source/WebCore/Headers.cmake >index a81d82ab8df..017c9129ef0 100644 >--- a/Source/WebCore/Headers.cmake >+++ b/Source/WebCore/Headers.cmake >@@ -515,7 +515,9 @@ set(WebCore_PRIVATE_FRAMEWORK_HEADERS > fileapi/BlobLineEndings.h > fileapi/BlobPropertyBag.h > fileapi/File.h >+ fileapi/FileError.h > fileapi/FileList.h >+ fileapi/FileReaderLoader.h > fileapi/FileReaderLoaderClient.h > > history/BackForwardClient.h >@@ -1168,6 +1170,7 @@ set(WebCore_PRIVATE_FRAMEWORK_HEADERS > platform/network/BlobPart.h > platform/network/BlobRegistry.h > platform/network/BlobRegistryImpl.h >+ platform/network/BlobResourceHandle.h > platform/network/CacheValidation.h > platform/network/CertificateInfoBase.h > platform/network/CookieRequestHeaderFieldProxy.h >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 4e8cb65c981..1aa2a270604 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,17 @@ >+2019-06-25 Carlos Garcia Campos <cgarcia@igalia.com> >+ >+ WebSockets: add support for sending blob messages when using web sockets platform APIs >+ https://bugs.webkit.org/show_bug.cgi?id=199189 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add helper private class BlobLoader that uses FileReaderLoader to load the blobs. >+ >+ * WebProcess/Network/WebSocketChannel.cpp: >+ (WebKit::WebSocketChannel::send): >+ (WebKit::WebSocketChannel::disconnect): >+ * WebProcess/Network/WebSocketChannel.h: >+ > 2019-06-24 Brady Eidson <beidson@apple.com> > > Null deref in WebFrameLoaderClient::dispatchDidReceiveServerRedirectForProvisionalLoad. >diff --git a/Source/WebKit/WebProcess/Network/WebSocketChannel.cpp b/Source/WebKit/WebProcess/Network/WebSocketChannel.cpp >index e3a23a44aa4..2ba75ef465e 100644 >--- a/Source/WebKit/WebProcess/Network/WebSocketChannel.cpp >+++ b/Source/WebKit/WebProcess/Network/WebSocketChannel.cpp >@@ -33,6 +33,8 @@ > #include "WebCoreArgumentCoders.h" > #include "WebProcess.h" > #include <WebCore/Document.h> >+#include <WebCore/FileReaderLoader.h> >+#include <WebCore/FileReaderLoaderClient.h> > #include <WebCore/NotImplemented.h> > #include <WebCore/WebSocketChannel.h> > #include <WebCore/WebSocketChannelClient.h> >@@ -125,10 +127,73 @@ WebSocketChannel::SendResult WebSocketChannel::send(const JSC::ArrayBuffer& bina > return SendSuccess; > } > >-WebSocketChannel::SendResult WebSocketChannel::send(WebCore::Blob&) >+class BlobLoader final : public WebCore::FileReaderLoaderClient { >+ WTF_MAKE_FAST_ALLOCATED; >+public: >+ BlobLoader(WebCore::Document* document, Blob& blob, CompletionHandler<void()>&& completionHandler) >+ : m_loader(std::make_unique<FileReaderLoader>(FileReaderLoader::ReadAsArrayBuffer, this)) >+ , m_completionHandler(WTFMove(completionHandler)) >+ { >+ m_loader->start(document, blob); >+ } >+ >+ ~BlobLoader() >+ { >+ if (m_loader) >+ m_loader->cancel(); >+ } >+ >+ bool isLoading() const { return !!m_loader; } >+ const RefPtr<JSC::ArrayBuffer>& result() const { return m_buffer; } >+ Optional<int> errorCode() const { return m_errorCode; } >+ >+private: >+ void didStartLoading() final { } >+ void didReceiveData() final { } >+ >+ void didFinishLoading() final >+ { >+ m_buffer = m_loader->arrayBufferResult(); >+ complete(); >+ } >+ >+ void didFail(int errorCode) final >+ { >+ m_errorCode = errorCode; >+ complete(); >+ } >+ >+ void complete() >+ { >+ m_loader = nullptr; >+ m_completionHandler(); >+ } >+ >+ std::unique_ptr<WebCore::FileReaderLoader> m_loader; >+ RefPtr<JSC::ArrayBuffer> m_buffer; >+ Optional<int> m_errorCode; >+ CompletionHandler<void()> m_completionHandler; >+}; >+ >+WebSocketChannel::SendResult WebSocketChannel::send(WebCore::Blob& blob) > { >- notImplemented(); >- return SendFail; >+ m_pendingBlobMessages.append(std::make_unique<BlobLoader>(m_document.get(), blob, [this, protectedThis = makeRef(*this)] { >+ while (!m_pendingBlobMessages.isEmpty()) { >+ auto& loader = m_pendingBlobMessages.first(); >+ if (loader->isLoading()) >+ return; >+ >+ if (const auto& result = loader->result()) >+ send(*result, 0, result->byteLength()); >+ else if (auto errorCode = loader->errorCode()) >+ fail(makeString("Failed to load Blob: error code = ", errorCode.value())); >+ else >+ ASSERT_NOT_REACHED(); >+ >+ m_pendingBlobMessages.removeFirst(); >+ } >+ })); >+ return SendSuccess; > } > > unsigned WebSocketChannel::bufferedAmount() const >@@ -157,6 +222,7 @@ void WebSocketChannel::disconnect() > m_client = nullptr; > m_document = nullptr; > m_pendingTasks.clear(); >+ m_pendingBlobMessages.clear(); > > MessageSender::send(Messages::NetworkSocketChannel::Close { 0, { } }); > } >diff --git a/Source/WebKit/WebProcess/Network/WebSocketChannel.h b/Source/WebKit/WebProcess/Network/WebSocketChannel.h >index d8a6aac2112..f938500f7aa 100644 >--- a/Source/WebKit/WebProcess/Network/WebSocketChannel.h >+++ b/Source/WebKit/WebProcess/Network/WebSocketChannel.h >@@ -41,6 +41,8 @@ class DataReference; > > namespace WebKit { > >+class BlobLoader; >+ > class WebSocketChannel : public IPC::MessageSender, public IPC::MessageReceiver, public WebCore::ThreadableWebSocketChannel, public RefCounted<WebSocketChannel>, public Identified<WebSocketChannel> { > public: > static Ref<WebSocketChannel> create(WebCore::Document&, WebCore::WebSocketChannelClient&); >@@ -92,6 +94,7 @@ private: > bool m_isClosing { false }; > bool m_isSuspended { false }; > Deque<Function<void()>> m_pendingTasks; >+ Deque<std::unique_ptr<BlobLoader>> m_pendingBlobMessages; > }; > > } // namespace WebKit
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 199189
:
372834
|
372915
|
373016
|
373019
|
373029
|
373031
|
373095