LayoutTests/ChangeLog

 12022-03-14 Youenn Fablet <youenn@apple.com>
 2
 3 redirectCount returns 0 when using a Service Worker
 4 https://bugs.webkit.org/show_bug.cgi?id=235710
 5 <rdar://problem/88432190>
 6
 7 Reviewed by NOBODY (OOPS!).
 8
 9 * http/wpt/service-workers/navigation-redirect-main-frame.https.html:
 10
1112022-03-12 Jean-Yves Avenard <jya@apple.com>
212
313 Safari produces scrambled output for some webm videos with vp8 codec.

LayoutTests/http/wpt/service-workers/navigation-redirect-main-frame.https.html

77async function doTest()
88{
99 if (window.location.hash === "#redirected") {
10  if (window.testRunner)
11  document.body.innerHTML = testRunner.didReceiveServerRedirectForProvisionalNavigation ? "PASS" : "FAIL";
12  else
13  document.body.innerHTML = "PASS";
14  if (window.testRunner) {
 10 let status = "PASS";
 11 if (window.performance.navigation.redirectCount !== 1)
 12 status = "FAIL: redirectCount is " + window.performance.navigation.redirectCount;
 13 else if (window.testRunner) {
 14 if (!testRunner.didReceiveServerRedirectForProvisionalNavigation)
 15 status = "FAIL: no server redirect for provisional navigation ";
1516 testRunner.clearDidReceiveServerRedirectForProvisionalNavigation();
16  testRunner.notifyDone();
1717 }
 18
 19 document.body.innerHTML = status;
 20
 21 if (window.testRunner)
 22 testRunner.notifyDone();
1823 return;
1924 }
2025 var registration = await navigator.serviceWorker.register("navigation-redirect-main-frame-worker.js", { scope : "resources" });

LayoutTests/imported/w3c/ChangeLog

 12022-03-14 Youenn Fablet <youenn@apple.com>
 2
 3 redirectCount returns 0 when using a Service Worker
 4 https://bugs.webkit.org/show_bug.cgi?id=235710
 5 <rdar://problem/88432190>
 6
 7 Reviewed by NOBODY (OOPS!).
 8
 9 * web-platform-tests/service-workers/service-worker/navigation-preload/resource-timing.https-expected.txt:
 10 * web-platform-tests/service-workers/service-worker/redirected-response.https-expected.txt:
 11
1122022-03-11 Antoine Quint <graouts@webkit.org>
213
314 [web-animations] shape-rendering should support discrete animation

LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/navigation-preload/resource-timing.https-expected.txt

11
2 
3 FAIL Navigation Preload Resource Timing. assert_greater_than: transferSize must greater then encodedBodySize. expected a number greater than 0 but got 0
 2PASS Navigation Preload Resource Timing.
43

LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/redirected-response.https-expected.txt

@@PASS mode: "error", manually-generated redirect response
1919PASS mode: "manual", manually-generated redirect response
2020PASS mode: "follow", generated relative redirect response
2121PASS mode: "error", generated relative redirect response
22 FAIL mode: "manual", generated relative redirect response promise_test: Unhandled rejection with value: object "TypeError: Load failed"
 22PASS mode: "manual", generated relative redirect response
2323PASS Fetch should follow the redirect response 20 times
2424PASS Fetch should not follow the redirect response 21 times.
2525PASS The URL for the service worker redirected request should be propagated to response.

Source/WebKit/ChangeLog

 12022-03-14 Youenn Fablet <youenn@apple.com>
 2
 3 redirectCount returns 0 when using a Service Worker
 4 https://bugs.webkit.org/show_bug.cgi?id=235710
 5 <rdar://problem/88432190>
 6
 7 Reviewed by NOBODY (OOPS!).
 8
 9 Pass an optional NetworkLoadMetrics when sending the response to web process.
 10 Include the redirectCount value computed by NetworkResourceLoader.
 11 Make service worker redirections go through NetworkResourceLoader to set the redirectCount value and for correctness.
 12
 13 Covered by updated test.
 14
 15 * NetworkProcess/NetworkResourceLoader.cpp:
 16 * NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp:
 17 (WebKit::ServiceWorkerFetchTask::processRedirectResponse):
 18 * WebProcess/Network/WebResourceLoader.cpp:
 19 * WebProcess/Network/WebResourceLoader.h:
 20 * WebProcess/Network/WebResourceLoader.messages.in:
 21
1222022-03-12 Simon Fraser <simon.fraser@apple.com>
223
324 In RemoteLayerBackingStore, group makeFrontBufferNonVolatile() and swapToValidFrontBuffer() into a single function

Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp

@@void NetworkResourceLoader::abort()
559559 cleanup(LoadResult::Cancel);
560560}
561561
 562std::optional<NetworkLoadMetrics> NetworkResourceLoader::computeResponseMetrics(const ResourceResponse& response)
 563{
 564 if (parameters().options.mode != FetchOptions::Mode::Navigate)
 565 return { };
 566
 567 NetworkLoadMetrics networkLoadMetrics;
 568 if (auto* metrics = response.deprecatedNetworkLoadMetricsOrNull())
 569 networkLoadMetrics = *metrics;
 570 networkLoadMetrics.redirectCount = m_redirectCount;
 571
 572 return networkLoadMetrics;
 573}
 574
562575void NetworkResourceLoader::transferToNewWebProcess(NetworkConnectionToWebProcess& newConnection, WebCore::ResourceLoaderIdentifier newCoreIdentifier)
563576{
564577 m_connection = newConnection;

@@void NetworkResourceLoader::transferToNewWebProcess(NetworkConnectionToWebProces
570583 ASSERT(m_responseCompletionHandler || m_cacheEntryWaitingForContinueDidReceiveResponse);
571584#endif
572585 bool willWaitForContinueDidReceiveResponse = true;
573  send(Messages::WebResourceLoader::DidReceiveResponse { m_response, m_privateRelayed, willWaitForContinueDidReceiveResponse });
 586 send(Messages::WebResourceLoader::DidReceiveResponse { m_response, m_privateRelayed, willWaitForContinueDidReceiveResponse, computeResponseMetrics(m_response) });
574587}
575588
576589bool NetworkResourceLoader::shouldInterruptLoadForXFrameOptions(const String& xFrameOptions, const URL& url)

@@void NetworkResourceLoader::sendDidReceiveResponsePotentiallyInNewBrowsingContex
857870{
858871 auto browsingContextGroupSwitchDecision = toBrowsingContextGroupSwitchDecision(m_currentCoopEnforcementResult);
859872 if (browsingContextGroupSwitchDecision == BrowsingContextGroupSwitchDecision::StayInGroup) {
860  send(Messages::WebResourceLoader::DidReceiveResponse { response, privateRelayed, needsContinueDidReceiveResponseMessage });
 873 send(Messages::WebResourceLoader::DidReceiveResponse { response, privateRelayed, needsContinueDidReceiveResponseMessage, computeResponseMetrics(response) });
861874 return;
862875 }
863876

@@std::optional<Seconds> NetworkResourceLoader::validateCacheEntryForMaxAgeCapVali
10201033}
10211034
10221035void NetworkResourceLoader::willSendRedirectedRequest(ResourceRequest&& request, ResourceRequest&& redirectRequest, ResourceResponse&& redirectResponse)
 1036{
 1037 willSendRedirectedRequestInternal(WTFMove(request), WTFMove(redirectRequest), WTFMove(redirectResponse), IsFromServiceWorker::No);
 1038}
 1039
 1040void NetworkResourceLoader::willSendServiceWorkerRedirectedRequest(ResourceRequest&& request, ResourceRequest&& redirectRequest, ResourceResponse&& redirectResponse)
 1041{
 1042 willSendRedirectedRequestInternal(WTFMove(request), WTFMove(redirectRequest), WTFMove(redirectResponse), IsFromServiceWorker::Yes);
 1043}
 1044
 1045void NetworkResourceLoader::willSendRedirectedRequestInternal(ResourceRequest&& request, ResourceRequest&& redirectRequest, ResourceResponse&& redirectResponse, IsFromServiceWorker isFromServiceWorker)
10231046{
10241047 LOADER_RELEASE_LOG("willSendRedirectedRequest:");
10251048 ++m_redirectCount;

@@void NetworkResourceLoader::willSendRedirectedRequest(ResourceRequest&& request,
10421065 addConsoleMessage(MessageSource::PrivateClickMeasurement, MessageLevel::Error, result.error());
10431066 }
10441067
1045  auto maxAgeCap = validateCacheEntryForMaxAgeCapValidation(request, redirectRequest, redirectResponse);
1046  if (redirectResponse.source() == ResourceResponse::Source::Network && canUseCachedRedirect(request))
1047  m_cache->storeRedirect(request, redirectResponse, redirectRequest, maxAgeCap);
 1068 if (isFromServiceWorker == IsFromServiceWorker::No) {
 1069 auto maxAgeCap = validateCacheEntryForMaxAgeCapValidation(request, redirectRequest, redirectResponse);
 1070 if (redirectResponse.source() == ResourceResponse::Source::Network && canUseCachedRedirect(request))
 1071 m_cache->storeRedirect(request, redirectResponse, redirectRequest, maxAgeCap);
 1072 }
10481073
10491074 if (isMainResource() && shouldInterruptNavigationForCrossOriginEmbedderPolicy(redirectResponse)) {
10501075 this->didFailLoading(ResourceError { errorDomainWebKitInternal, 0, redirectRequest.url(), "Redirection was blocked by Cross-Origin-Embedder-Policy"_s, ResourceError::Type::AccessControl });

Source/WebKit/NetworkProcess/NetworkResourceLoader.h

@@public:
165165 void deref() const final { RefCounted<NetworkResourceLoader>::deref(); }
166166#endif
167167
 168 void willSendServiceWorkerRedirectedRequest(WebCore::ResourceRequest&&, WebCore::ResourceRequest&& redirectRequest, WebCore::ResourceResponse&&);
 169
168170private:
169171 NetworkResourceLoader(NetworkResourceLoadParameters&&, NetworkConnectionToWebProcess&, Messages::NetworkConnectionToWebProcess::PerformSynchronousLoadDelayedReply&&);
170172

@@private:
242244 void startContentFiltering(WebCore::ResourceRequest&);
243245#endif
244246
 247 enum class IsFromServiceWorker { No, Yes };
 248 void willSendRedirectedRequestInternal(WebCore::ResourceRequest&&, WebCore::ResourceRequest&& redirectRequest, WebCore::ResourceResponse&&, IsFromServiceWorker);
 249 std::optional<WebCore::NetworkLoadMetrics> computeResponseMetrics(const WebCore::ResourceResponse&);
 250
245251 const NetworkResourceLoadParameters m_parameters;
246252
247253 Ref<NetworkConnectionToWebProcess> m_connection;

Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp

@@void ServiceWorkerFetchTask::processRedirectResponse(ResourceResponse&& response
183183 response.setSource(ResourceResponse::Source::ServiceWorker);
184184 auto newRequest = m_currentRequest.redirectedRequest(response, m_loader.parameters().shouldClearReferrerOnHTTPSToHTTPRedirect);
185185
186  sendToClient(Messages::WebResourceLoader::WillSendRequest { newRequest, IPC::FormDataReference { newRequest.httpBody() }, response });
 186 m_loader.willSendServiceWorkerRedirectedRequest(ResourceRequest(m_currentRequest), WTFMove(newRequest), WTFMove(response));
187187}
188188
189189void ServiceWorkerFetchTask::didReceiveResponse(WebCore::ResourceResponse&& response, bool needsContinueDidReceiveResponseMessage)

Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerNavigationPreloader.cpp

@@void ServiceWorkerNavigationPreloader::loadFromNetwork()
154154
155155void ServiceWorkerNavigationPreloader::willSendRedirectedRequest(ResourceRequest&&, ResourceRequest&&, ResourceResponse&& response)
156156{
 157 WeakPtr weakThis { *this };
157158 didReceiveResponse(WTFMove(response), PrivateRelayed::No, [](auto) { });
 159 if (!weakThis)
 160 return;
158161 didComplete();
159162}
160163

Source/WebKit/WebProcess/Network/WebResourceLoader.cpp

@@void WebResourceLoader::didSendData(uint64_t bytesSent, uint64_t totalBytesToBeS
149149 m_coreLoader->didSendData(bytesSent, totalBytesToBeSent);
150150}
151151
152 void WebResourceLoader::didReceiveResponse(const ResourceResponse& response, PrivateRelayed privateRelayed, bool needsContinueDidReceiveResponseMessage)
 152void WebResourceLoader::didReceiveResponse(ResourceResponse&& response, PrivateRelayed privateRelayed, bool needsContinueDidReceiveResponseMessage, std::optional<NetworkLoadMetrics>&& metrics)
153153{
154154 LOG(Network, "(WebProcess) WebResourceLoader::didReceiveResponse for '%s'. Status %d.", m_coreLoader->url().string().latin1().data(), response.httpStatusCode());
155155 WEBRESOURCELOADER_RELEASE_LOG("didReceiveResponse: (httpStatusCode=%d)", response.httpStatusCode());
156156
157157 Ref<WebResourceLoader> protectedThis(*this);
158158
 159 if (metrics)
 160 response.setDeprecatedNetworkLoadMetrics(Box<NetworkLoadMetrics>::create(WTFMove(*metrics)));
 161
159162 if (privateRelayed == PrivateRelayed::Yes && mainFrameMainResource() == MainFrameMainResource::Yes)
160163 WebProcess::singleton().setHadMainFrameMainResourcePrivateRelayed();
161164

Source/WebKit/WebProcess/Network/WebResourceLoader.h

@@private:
8585
8686 void willSendRequest(WebCore::ResourceRequest&&, IPC::FormDataReference&& requestBody, WebCore::ResourceResponse&&);
8787 void didSendData(uint64_t bytesSent, uint64_t totalBytesToBeSent);
88  void didReceiveResponse(const WebCore::ResourceResponse&, PrivateRelayed, bool needsContinueDidReceiveResponseMessage);
 88 void didReceiveResponse(WebCore::ResourceResponse&&, PrivateRelayed, bool needsContinueDidReceiveResponseMessage, std::optional<WebCore::NetworkLoadMetrics>&&);
8989 void didReceiveData(const IPC::SharedBufferCopy& data, int64_t encodedDataLength);
9090 void didFinishResourceLoad(const WebCore::NetworkLoadMetrics&);
9191 void didFailResourceLoad(const WebCore::ResourceError&);

Source/WebKit/WebProcess/Network/WebResourceLoader.messages.in

2323messages -> WebResourceLoader LegacyReceiver {
2424 WillSendRequest(WebCore::ResourceRequest request, IPC::FormDataReference requestBody, WebCore::ResourceResponse redirectResponse)
2525 DidSendData(uint64_t bytesSent, uint64_t totalBytesToBeSent)
26  DidReceiveResponse(WebCore::ResourceResponse response, enum:bool WebKit::PrivateRelayed privateRelayed, bool needsContinueDidReceiveResponseMessage)
 26 DidReceiveResponse(WebCore::ResourceResponse response, enum:bool WebKit::PrivateRelayed privateRelayed, bool needsContinueDidReceiveResponseMessage, std::optional<WebCore::NetworkLoadMetrics> optionalNetworkLoadMetrics)
2727 DidReceiveData(IPC::SharedBufferCopy data, int64_t encodedDataLength)
2828 DidFinishResourceLoad(WebCore::NetworkLoadMetrics networkLoadMetrics)
2929 DidFailResourceLoad(WebCore::ResourceError error)