Changeset 288949 in webkit
- Timestamp:
- Feb 2, 2022 2:15:07 AM (6 months ago)
- Location:
- trunk
- Files:
-
- 2 added
- 5 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/http/wpt/service-workers/fetch-service-worker-preload-cache.https-expected.txt (added)
-
LayoutTests/http/wpt/service-workers/fetch-service-worker-preload-cache.https.html (added)
-
LayoutTests/http/wpt/service-workers/resources/fetch-service-worker-preload-script.py (modified) (1 diff)
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp (modified) (2 diffs)
-
Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerNavigationPreloader.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r288944 r288949 1 2022-02-02 Youenn Fablet <youenn@apple.com> 2 3 ServiceWorkerNavigationPreloader should only be used once 4 https://bugs.webkit.org/show_bug.cgi?id=235882 5 <rdar://88226432> 6 7 Reviewed by Chris Dumez. 8 9 * http/wpt/service-workers/fetch-service-worker-preload-cache.https-expected.txt: Added. 10 * http/wpt/service-workers/fetch-service-worker-preload-cache.https.html: Added. 11 * http/wpt/service-workers/resources/fetch-service-worker-preload-script.py: 12 1 13 2022-02-01 Alan Bujtas <zalan@apple.com> 2 14 -
trunk/LayoutTests/http/wpt/service-workers/resources/fetch-service-worker-preload-script.py
r286944 r288949 31 31 if not value: 32 32 value = b"nothing" 33 response.headers.set(b"Cache-Control", b"no-cache") 33 34 if b"cache" in request.GET: 35 response.headers.set(b"Cache-Control", b"max-age=31536000") 36 else: 37 response.headers.set(b"Cache-Control", b"no-cache") 34 38 35 39 if b"download" in request.GET: -
trunk/Source/WebKit/ChangeLog
r288942 r288949 1 2022-02-02 Youenn Fablet <youenn@apple.com> 2 3 ServiceWorkerNavigationPreloader should only be used once 4 https://bugs.webkit.org/show_bug.cgi?id=235882 5 <rdar://88226432> 6 7 Reviewed by Chris Dumez. 8 9 In case service worker preload is being used and related service worker context crashes (or service worker context sends bad messages), 10 We can end up in a bad state where we will ask the preload twice for the same response (once for good, and the next one as we go to didNotHandle case). 11 To prevent this, we add checks in loadResponseFromPreloader and loadBodyFromPreloader. 12 As part of this investigation, I found out that ServiceWorkerNavigationPreloader is not correctly handling the case of preload responses coming from cache. 13 In particular, no body will be given since we return early in waitForBody in case the preload network load is null. 14 Prevent this by making sure waitForBody calls the response completion handler if available, even if the preload network load is null. 15 And update the response body callback before executing the response completion handler to make sure data received synchronously from the preload is given to the service worker fetch task. 16 17 Test: http/wpt/service-workers/fetch-service-worker-preload-cache.https.html 18 19 * NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp: 20 * NetworkProcess/ServiceWorker/ServiceWorkerNavigationPreloader.cpp: 21 1 22 2022-02-01 Myles C. Maxfield <mmaxfield@apple.com> 2 23 -
trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp
r288898 r288949 364 364 SWFETCH_RELEASE_LOG("loadResponseFromPreloader"); 365 365 366 ASSERT(!m_isLoadingFromPreloader); 366 if (m_isLoadingFromPreloader) 367 return; 368 367 369 m_isLoadingFromPreloader = true; 368 370 … … 393 395 394 396 ASSERT(m_isLoadingFromPreloader); 397 if (!m_preloader) { 398 SWFETCH_RELEASE_LOG_ERROR("loadBodyFromPreloader preloader is null"); 399 didFail(ResourceError(errorDomainWebKitInternal, 0, m_loader.originalRequest().url(), "Request canceled from preloader"_s, ResourceError::Type::Cancellation)); 400 return; 401 } 402 395 403 m_preloader->waitForBody([weakThis = WeakPtr { *this }, this](auto&& chunk, int length) { 396 404 if (!weakThis) -
trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerNavigationPreloader.cpp
r287684 r288949 232 232 void ServiceWorkerNavigationPreloader::waitForBody(BodyCallback&& callback) 233 233 { 234 if (!m_error.isNull() ) {234 if (!m_error.isNull() || !m_responseCompletionHandler) { 235 235 callback({ }, 0); 236 236 return; … … 238 238 239 239 ASSERT(!m_response.isNull()); 240 ASSERT(m_responseCompletionHandler || !m_networkLoad);241 if (!m_networkLoad) {242 callback({ }, 0);243 return;244 }245 if (m_responseCompletionHandler)246 m_responseCompletionHandler(PolicyAction::Use);247 240 m_bodyCallback = WTFMove(callback); 241 m_responseCompletionHandler(PolicyAction::Use); 248 242 } 249 243
Note: See TracChangeset
for help on using the changeset viewer.