Diff
Modified: trunk/LayoutTests/ChangeLog (226905 => 226906)
--- trunk/LayoutTests/ChangeLog 2018-01-12 20:01:02 UTC (rev 226905)
+++ trunk/LayoutTests/ChangeLog 2018-01-12 20:41:55 UTC (rev 226906)
@@ -1,5 +1,20 @@
2018-01-12 Youenn Fablet <[email protected]>
+ FormDataElement::lengthInBytes should use ThreadableBlobRegistry
+ https://bugs.webkit.org/show_bug.cgi?id=181554
+
+ Reviewed by Chris Dumez.
+
+ * http/tests/workers/service/resources/service-worker-cache-api-worker.js:
+ (async):
+ (event.event.request.url.indexOf): Deleted.
+ (event.event.request.url.endsWith): Deleted.
+ (event.event.respondWith.promise.then): Deleted.
+ * http/tests/workers/service/service-worker-cache-api.https-expected.txt:
+ * http/tests/workers/service/service-worker-cache-api.https.html:
+
+2018-01-12 Youenn Fablet <[email protected]>
+
WebProcess should pass the registration identifier and not the worker identifier for fetch events
https://bugs.webkit.org/show_bug.cgi?id=181591
Modified: trunk/LayoutTests/http/tests/workers/service/resources/service-worker-cache-api-worker.js (226905 => 226906)
--- trunk/LayoutTests/http/tests/workers/service/resources/service-worker-cache-api-worker.js 2018-01-12 20:01:02 UTC (rev 226905)
+++ trunk/LayoutTests/http/tests/workers/service/resources/service-worker-cache-api-worker.js 2018-01-12 20:41:55 UTC (rev 226906)
@@ -18,11 +18,20 @@
return new Response(null, {status: 200, statusText: status});
}
-self.addEventListener("fetch", (event) => {
+self.addEventListener("fetch", async (event) => {
if (event.request.url.indexOf("status") !== -1) {
event.respondWith(promise.then(statusResponse, statusResponse));
return;
}
+ if (event.request.url.indexOf("opaqueWithBlob") !== -1) {
+ event.respondWith(self.caches.open("opaque").then((cache) => {
+ let response = self.internals.createOpaqueWithBlobBodyResponse();
+ return cache.put("opaque", response);
+ }).then(() => {
+ return new Response("PASS");
+ }));
+ return;
+ }
if (!event.request.url.endsWith(".fromserviceworker")) {
state = "unknown url";
event.respondWith(new Response(null, {status: 404, statusText: "Not Found"}));
Modified: trunk/LayoutTests/http/tests/workers/service/service-worker-cache-api.https-expected.txt (226905 => 226906)
--- trunk/LayoutTests/http/tests/workers/service/service-worker-cache-api.https-expected.txt 2018-01-12 20:01:02 UTC (rev 226905)
+++ trunk/LayoutTests/http/tests/workers/service/service-worker-cache-api.https-expected.txt 2018-01-12 20:41:55 UTC (rev 226906)
@@ -1,4 +1,5 @@
PASS Testing cache API in service worker
+PASS Testing cache API with opaque response + blob
Modified: trunk/LayoutTests/http/tests/workers/service/service-worker-cache-api.https.html (226905 => 226906)
--- trunk/LayoutTests/http/tests/workers/service/service-worker-cache-api.https.html 2018-01-12 20:01:02 UTC (rev 226905)
+++ trunk/LayoutTests/http/tests/workers/service/service-worker-cache-api.https.html 2018-01-12 20:41:55 UTC (rev 226906)
@@ -6,8 +6,9 @@
</head>
<body>
<script>
+var frame;
promise_test(async (test) => {
- var frame = await interceptedFrame("resources/service-worker-cache-api-worker.js", "/workers/service/resources/");
+ frame = await interceptedFrame("resources/service-worker-cache-api-worker.js", "/workers/service/resources/");
var fetch = frame.contentWindow.fetch;
var response = await fetch("/resources/square100.png.fromserviceworker");
@@ -14,6 +15,14 @@
var buffer = await response.arrayBuffer();
assert_equals(buffer.byteLength, 12940);
}, "Testing cache API in service worker");
+
+promise_test(async (test) => {
+ if (!self.internals)
+ return Promise.reject("internals required for this test");
+
+ var response = await frame.contentWindow.fetch("opaqueWithBlob");
+ assert_equals(await response.text(), "PASS");
+}, "Testing cache API with opaque response + blob");
</script>
</body>
</html>
Modified: trunk/Source/WebCore/ChangeLog (226905 => 226906)
--- trunk/Source/WebCore/ChangeLog 2018-01-12 20:01:02 UTC (rev 226905)
+++ trunk/Source/WebCore/ChangeLog 2018-01-12 20:41:55 UTC (rev 226906)
@@ -1,3 +1,26 @@
+2018-01-12 Youenn Fablet <[email protected]>
+
+ FormDataElement::lengthInBytes should use ThreadableBlobRegistry
+ https://bugs.webkit.org/show_bug.cgi?id=181554
+
+ Reviewed by Chris Dumez.
+
+ Covered by updated test.
+
+ Fix blobRegistry() use and add support for creating a response that may trigger the issue.
+
+
+ * platform/network/FormData.cpp:
+ (WebCore::FormDataElement::lengthInBytes const): Was using directly blobRegistry() while ThreadableBlobRegistry is more appropriate
+ in case this is called from workers.
+ * Modules/fetch/FetchBody.h:
+ * Modules/fetch/FetchResponse.h:
+ * fileapi/Blob.h:
+ * testing/ServiceWorkerInternals.cpp:
+ (WebCore::ServiceWorkerInternals::createOpaqueWithBlobBodyResponse):
+ * testing/ServiceWorkerInternals.h:
+ * testing/ServiceWorkerInternals.idl:
+
2018-01-12 Jer Noble <[email protected]>
Wrap CDMFairPlayStreaming and related classes in ENABLE(ENCRYPTED_MEDIA) checks
Modified: trunk/Source/WebCore/Modules/fetch/FetchBody.h (226905 => 226906)
--- trunk/Source/WebCore/Modules/fetch/FetchBody.h 2018-01-12 20:01:02 UTC (rev 226905)
+++ trunk/Source/WebCore/Modules/fetch/FetchBody.h 2018-01-12 20:41:55 UTC (rev 226906)
@@ -58,7 +58,7 @@
static FetchBody extract(ScriptExecutionContext&, Init&&, String&);
FetchBody() = default;
- static std::optional<FetchBody> fromFormData(FormData&);
+ WEBCORE_EXPORT static std::optional<FetchBody> fromFormData(FormData&);
void loadingFailed();
void loadingSucceeded();
Modified: trunk/Source/WebCore/Modules/fetch/FetchResponse.h (226905 => 226906)
--- trunk/Source/WebCore/Modules/fetch/FetchResponse.h 2018-01-12 20:01:02 UTC (rev 226905)
+++ trunk/Source/WebCore/Modules/fetch/FetchResponse.h 2018-01-12 20:41:55 UTC (rev 226906)
@@ -53,7 +53,7 @@
std::optional<FetchHeaders::Init> headers;
};
- static Ref<FetchResponse> create(ScriptExecutionContext&, std::optional<FetchBody>&&, Ref<FetchHeaders>&&, ResourceResponse&&);
+ WEBCORE_EXPORT static Ref<FetchResponse> create(ScriptExecutionContext&, std::optional<FetchBody>&&, Ref<FetchHeaders>&&, ResourceResponse&&);
static ExceptionOr<Ref<FetchResponse>> create(ScriptExecutionContext&, std::optional<FetchBody::Init>&&, Init&&);
static Ref<FetchResponse> error(ScriptExecutionContext&);
@@ -101,6 +101,8 @@
void setBodySizeWithPadding(uint64_t size) { m_bodySizeWithPadding = size; }
uint64_t opaqueLoadIdentifier() const { return m_opaqueLoadIdentifier; }
+ void initializeOpaqueLoadIdentifierForTesting() { m_opaqueLoadIdentifier = 1; }
+
private:
FetchResponse(ScriptExecutionContext&, std::optional<FetchBody>&&, Ref<FetchHeaders>&&, ResourceResponse&&);
Modified: trunk/Source/WebCore/fileapi/Blob.h (226905 => 226906)
--- trunk/Source/WebCore/fileapi/Blob.h 2018-01-12 20:01:02 UTC (rev 226905)
+++ trunk/Source/WebCore/fileapi/Blob.h 2018-01-12 20:41:55 UTC (rev 226906)
@@ -103,7 +103,7 @@
}
protected:
- Blob();
+ WEBCORE_EXPORT Blob();
Blob(Vector<BlobPartVariant>&&, const BlobPropertyBag&);
Blob(const SharedBuffer&, const String& contentType);
Blob(Vector<uint8_t>&&, const String& contentType);
Modified: trunk/Source/WebCore/platform/network/FormData.cpp (226905 => 226906)
--- trunk/Source/WebCore/platform/network/FormData.cpp 2018-01-12 20:01:02 UTC (rev 226905)
+++ trunk/Source/WebCore/platform/network/FormData.cpp 2018-01-12 20:41:55 UTC (rev 226906)
@@ -143,7 +143,7 @@
return 0;
}
case Type::EncodedBlob:
- return blobRegistry().blobSize(m_url);
+ return ThreadableBlobRegistry::blobSize(m_url);
}
ASSERT_NOT_REACHED();
return 0;
Modified: trunk/Source/WebCore/testing/ServiceWorkerInternals.cpp (226905 => 226906)
--- trunk/Source/WebCore/testing/ServiceWorkerInternals.cpp 2018-01-12 20:01:02 UTC (rev 226905)
+++ trunk/Source/WebCore/testing/ServiceWorkerInternals.cpp 2018-01-12 20:41:55 UTC (rev 226906)
@@ -66,6 +66,20 @@
return event;
}
+Ref<FetchResponse> ServiceWorkerInternals::createOpaqueWithBlobBodyResponse(ScriptExecutionContext& context)
+{
+ auto blob = Blob::create();
+ auto formData = FormData::create();
+ formData->appendBlob(blob->url());
+
+ ResourceResponse response;
+ response.setType(ResourceResponse::Type::Cors);
+ response.setTainting(ResourceResponse::Tainting::Opaque);
+ auto fetchResponse = FetchResponse::create(context, FetchBody::fromFormData(formData), FetchHeaders::create(), WTFMove(response));
+ fetchResponse->initializeOpaqueLoadIdentifierForTesting();
+ return fetchResponse;
+}
+
} // namespace WebCore
#endif
Modified: trunk/Source/WebCore/testing/ServiceWorkerInternals.h (226905 => 226906)
--- trunk/Source/WebCore/testing/ServiceWorkerInternals.h 2018-01-12 20:01:02 UTC (rev 226905)
+++ trunk/Source/WebCore/testing/ServiceWorkerInternals.h 2018-01-12 20:41:55 UTC (rev 226906)
@@ -45,6 +45,7 @@
void setOnline(bool isOnline);
void waitForFetchEventToFinish(FetchEvent&, DOMPromiseDeferred<IDLInterface<FetchResponse>>&&);
Ref<FetchEvent> createBeingDispatchedFetchEvent(ScriptExecutionContext&);
+ Ref<FetchResponse> createOpaqueWithBlobBodyResponse(ScriptExecutionContext&);
private:
explicit ServiceWorkerInternals(ServiceWorkerIdentifier);
Modified: trunk/Source/WebCore/testing/ServiceWorkerInternals.idl (226905 => 226906)
--- trunk/Source/WebCore/testing/ServiceWorkerInternals.idl 2018-01-12 20:01:02 UTC (rev 226905)
+++ trunk/Source/WebCore/testing/ServiceWorkerInternals.idl 2018-01-12 20:41:55 UTC (rev 226906)
@@ -32,4 +32,5 @@
void setOnline(boolean isOnline);
Promise<Response> waitForFetchEventToFinish(FetchEvent event);
[CallWith=ScriptExecutionContext] FetchEvent createBeingDispatchedFetchEvent();
+ [CallWith=ScriptExecutionContext] FetchResponse createOpaqueWithBlobBodyResponse();
};