WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
bug-183110-20180225153503.patch (text/plain), 6.35 KB, created by
youenn fablet
on 2018-02-25 15:35:04 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
youenn fablet
Created:
2018-02-25 15:35:04 PST
Size:
6.35 KB
patch
obsolete
>Subversion Revision: 228858 >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index f5e1b4e1807802b190550698f4bdcc7c2be31cd9..e9b0c65455b265794b69b56cda21f6906f9e7ac9 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,22 @@ >+2018-02-25 Youenn Fablet <youenn@apple.com> >+ >+ ServiceWorkerClientFetch should send data to its resource loader once the didReceiveResponse completion handler is called >+ https://bugs.webkit.org/show_bug.cgi?id=183110 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Buffering data/finish event/fail event until the response completion handler is called. >+ >+ * WebProcess/Storage/ServiceWorkerClientFetch.cpp: >+ (WebKit::ServiceWorkerClientFetch::didReceiveResponse): >+ (WebKit::ServiceWorkerClientFetch::didReceiveData): >+ (WebKit::ServiceWorkerClientFetch::didFinish): >+ (WebKit::ServiceWorkerClientFetch::didFail): >+ (WebKit::ServiceWorkerClientFetch::didNotHandle): >+ (WebKit::ServiceWorkerClientFetch::cancel): >+ (WebKit::ServiceWorkerClientFetch::continueLoadingAfterCheckingResponse): >+ * WebProcess/Storage/ServiceWorkerClientFetch.h: >+ > 2018-02-22 Youenn Fablet <youenn@apple.com> > > MessagePort is not always destroyed in the right thread >diff --git a/Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.cpp b/Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.cpp >index 1f72a30f3b35a21a4a76dcbdf38e64cc5eb4827a..f1c75c3f56d0ef8a39f7ca390150aada4174e668 100644 >--- a/Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.cpp >+++ b/Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.cpp >@@ -106,6 +106,7 @@ void ServiceWorkerClientFetch::didReceiveResponse(ResourceResponse&& response) > > if (auto error = validateResponse(response)) { > m_loader->didFail(error.value()); >+ ASSERT(!m_loader); > if (auto callback = WTFMove(m_callback)) > callback(Result::Succeeded); > return; >@@ -141,20 +142,36 @@ void ServiceWorkerClientFetch::didReceiveResponse(ResourceResponse&& response) > if (response.url().isNull()) > response.setURL(m_loader->request().url()); > >+ m_isCheckingResponse = true; > m_loader->didReceiveResponse(response, [this, protectedThis = WTFMove(protectedThis)] { >+ m_isCheckingResponse = false; >+ continueLoadingAfterCheckingResponse(); > if (auto callback = WTFMove(m_callback)) > callback(Result::Succeeded); > }); > }); > } > >-void ServiceWorkerClientFetch::didReceiveData(const IPC::DataReference& data, int64_t encodedDataLength) >+void ServiceWorkerClientFetch::didReceiveData(const IPC::DataReference& dataReference, int64_t encodedDataLength) > { >- callOnMainThread([this, protectedThis = makeRef(*this), data = data.vector(), 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; >+ } >+ >+ if (m_isCheckingResponse) >+ return; >+ >+ callOnMainThread([this, protectedThis = makeRef(*this)] { > if (!m_loader) > return; > >- m_loader->didReceiveData(reinterpret_cast<const char*>(data.data()), data.size(), encodedDataLength, DataPayloadBytes); >+ m_loader->didReceiveBuffer(m_buffer.releaseNonNull(), m_encodedDataLength, DataPayloadBytes); >+ m_encodedDataLength = 0; > }); > } > >@@ -165,6 +182,11 @@ void ServiceWorkerClientFetch::didReceiveFormData(const IPC::FormDataReference&) > > void ServiceWorkerClientFetch::didFinish() > { >+ m_didFinish = true; >+ >+ if (m_isCheckingResponse) >+ return; >+ > callOnMainThread([this, protectedThis = makeRef(*this)] { > if (!m_loader) > return; >@@ -192,6 +214,10 @@ void ServiceWorkerClientFetch::didFinish() > > void ServiceWorkerClientFetch::didFail() > { >+ m_didFail = true; >+ if (m_isCheckingResponse) >+ return; >+ > callOnMainThread([this, protectedThis = makeRef(*this)] { > if (!m_loader) > return; >@@ -207,6 +233,8 @@ void ServiceWorkerClientFetch::didFail() > > void ServiceWorkerClientFetch::didNotHandle() > { >+ ASSERT(!m_isCheckingResponse); >+ > callOnMainThread([this, protectedThis = makeRef(*this)] { > if (!m_loader) > return; >@@ -223,6 +251,31 @@ void ServiceWorkerClientFetch::cancel() > if (auto callback = WTFMove(m_callback)) > callback(Result::Cancelled); > m_loader = nullptr; >+ m_buffer = nullptr; >+} >+ >+void ServiceWorkerClientFetch::continueLoadingAfterCheckingResponse() >+{ >+ ASSERT(!m_isCheckingResponse); >+ if (!m_loader) >+ return; >+ >+ if (m_encodedDataLength) { >+ callOnMainThread([this, protectedThis = makeRef(*this)] { >+ if (!m_loader || !m_encodedDataLength) >+ return; >+ m_loader->didReceiveBuffer(m_buffer.releaseNonNull(), m_encodedDataLength, DataPayloadBytes); >+ m_encodedDataLength = 0; >+ }); >+ } >+ >+ if (m_didFinish) { >+ didFinish(); >+ return; >+ } >+ >+ if (m_didFail) >+ didFail(); > } > > } // namespace WebKit >diff --git a/Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.h b/Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.h >index 5e3103819c6ff644736f7aa1d39f71ff972a5b1d..8da1419dc58d2f9eeb2ad89331cfbea924c09055 100644 >--- a/Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.h >+++ b/Source/WebKit/WebProcess/Storage/ServiceWorkerClientFetch.h >@@ -66,6 +66,8 @@ private: > void didFail(); > void didNotHandle(); > >+ void continueLoadingAfterCheckingResponse(); >+ > WebServiceWorkerProvider& m_serviceWorkerProvider; > RefPtr<WebCore::ResourceLoader> m_loader; > uint64_t m_identifier { 0 }; >@@ -74,6 +76,11 @@ private: > enum class RedirectionStatus { None, Receiving, Following, Received }; > RedirectionStatus m_redirectionStatus { RedirectionStatus::None }; > bool m_shouldClearReferrerOnHTTPSToHTTPRedirect { true }; >+ RefPtr<WebCore::SharedBuffer> m_buffer; >+ int64_t m_encodedDataLength { 0 }; >+ bool m_isCheckingResponse { false }; >+ bool m_didFinish { false }; >+ bool m_didFail { false }; > }; > > } // 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 183110
:
334585
|
334823