Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 29e582611afa3231dc0ace993968a49f8153d7aa
      
https://github.com/WebKit/WebKit/commit/29e582611afa3231dc0ace993968a49f8153d7aa
  Author: Yoav Weiss <[email protected]>
  Date:   2026-04-17 (Fri, 17 Apr 2026)

  Changed paths:
    A LayoutTests/http/tests/cache/resources/prefetch-delayed-error.py
    A 
LayoutTests/http/tests/cache/speculation-rules-prefetch-no-error-commit.https-expected.txt
    A 
LayoutTests/http/tests/cache/speculation-rules-prefetch-no-error-commit.https.html
    A 
LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/no-http-cache-interference-inflight.https-expected.txt
    A 
LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/no-http-cache-interference-inflight.https.html
    A 
LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/no-http-cache-interference-slow-error.https-expected.txt
    A 
LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/no-http-cache-interference-slow-error.https.html
    A 
LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-inflight-success.https-expected.txt
    A 
LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-inflight-success.https.html
    A 
LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/resources/delayed-conditional-status.py
    A 
LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/resources/slow-body-conditional-status.py
    M Source/WebCore/loader/DocumentLoader.cpp
    M Source/WebCore/loader/DocumentLoader.h
    M Source/WebCore/loader/DocumentPrefetcher.cpp
    M Source/WebCore/loader/DocumentPrefetcher.h
    M Source/WebCore/page/LocalFrame.cpp

  Log Message:
  -----------
  Speculation Rules - Fix race conditions with non-OK responses
https://bugs.webkit.org/show_bug.cgi?id=312252

Reviewed by Chris Dumez.

While the speculation rules implementation properly handled non-2XX status 
responses that came to completion,
it failed to handle responses that were not done before the navigation request 
for them was triggered.
This PR fixes that by:
* Ensuring that a failed response gets evicted from the memory cache even 
before it's done.
* Avoiding to commit and retrying a navigation request if its prefetch response 
has failed.
* Properly clearing prefetched resources when the DocumentPrefetcher gets 
destructed. (lack of that cleanup caused issues in some of the new test 
scenarios)

* LayoutTests/http/tests/cache/resources/prefetch-delayed-error.py: Added.
* 
LayoutTests/http/tests/cache/speculation-rules-prefetch-no-error-commit.https-expected.txt:
 Added.
* 
LayoutTests/http/tests/cache/speculation-rules-prefetch-no-error-commit.https.html:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/no-http-cache-interference-inflight.https-expected.txt:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/no-http-cache-interference-inflight.https.html:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/no-http-cache-interference-slow-error.https-expected.txt:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/no-http-cache-interference-slow-error.https.html:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-inflight-success.https-expected.txt:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-inflight-success.https.html:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/resources/delayed-conditional-status.py:
 Added.
(main):
* 
LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/resources/slow-body-conditional-status.py:
 Added.
(main):
* Source/WebCore/loader/DocumentLoader.cpp:
(WebCore::DocumentLoader::finishedLoading): If prefetch failed, retry the 
navigation after removing the resource from the memory cache.
(WebCore::DocumentLoader::responseReceived): Set the prefetch failed flag, for 
in-flight prefetched that are not successful.
(WebCore::DocumentLoader::commitLoad): Bail for failed prefetches.
* Source/WebCore/loader/DocumentLoader.h:
* Source/WebCore/loader/DocumentPrefetcher.cpp:
(WebCore::DocumentPrefetcher::~DocumentPrefetcher): Call clear().
(WebCore::DocumentPrefetcher::clear): Clear the resource, remove it from 
MemoryCache and clear m_prefetchData.
(WebCore::DocumentPrefetcher::responseReceived): Remove the resource from the 
MemoryCache if its response headers indicate it's not successful.
* Source/WebCore/loader/DocumentPrefetcher.h:
* Source/WebCore/page/LocalFrame.cpp:
(WebCore::LocalFrame::~LocalFrame): Clear the DocumentPrefetcher.

Canonical link: https://commits.webkit.org/311445@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications

Reply via email to