Skip to content

Implement speculation rules - same origin conservative prefetch#48322

Merged
webkit-commit-queue merged 1 commit into
WebKit:mainfrom
yoavweiss:eng/Implement-conservative-same-origin-prefetch-speculation-rules
Oct 1, 2025
Merged

Implement speculation rules - same origin conservative prefetch#48322
webkit-commit-queue merged 1 commit into
WebKit:mainfrom
yoavweiss:eng/Implement-conservative-same-origin-prefetch-speculation-rules

Conversation

@yoavweiss

@yoavweiss yoavweiss commented Jul 21, 2025

Copy link
Copy Markdown
Contributor

a4a9e7f

Implement speculation rules - same origin conservative prefetch
https://bugs.webkit.org/show_bug.cgi?id=295193

Reviewed by Alex Christensen.

This implements an initial version of same-origin prefetch speculation rules.

The feature enables prefetching an HTML document ahead of time ("immediate" eagerness),
or when the user started clicking an anchor element pointing at it ("conservative" eagerness).
That prefetched document is then used when the user actually navigates to this URL,
resulting in significant performance improvements.
Subresources of the prefetched document are not yet loaded before navigation, nor does it begin its processing.

HTML spec PR for speculation rules: whatwg/html#11426
Spec for the prefetch parts: https://wicg.github.io/nav-speculation/prefetch.html

* LayoutTests/TestExpectations: Add a few failing expectations.
* LayoutTests/imported/w3c/web-platform-tests/clear-site-data/support/clear-site-data-cache.py: Added.
(generate_png):
(generate_png.chunk):
(main):
* LayoutTests/imported/w3c/web-platform-tests/clear-site-data/support/clear-site-data-prefetchCache.py: Added.
(main):
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/external-speculation-rules-errors-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/invalid-rules.https_prefetch-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/invalid-rules.https_prerender-expected.txt: Progression
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/anonymous-client.https-expected.txt: Failure instead of timeout.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.https-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/cookie-indices.https_include=changed-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/cookie-indices.https_include=changedWithRedirect-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/cookie-indices.https_include=changedWithRedirect2-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/cookie-indices.https_include=changedWithRedirect3-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/cookie-indices.https_include=unchanged-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/cookie-indices.https_include=unchangedWithRedirect-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/cross-origin-cookies-anonymous-client-ip-duplicate.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/cross-origin-cookies.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/different-initiators-2.https-expected.txt: Timeout.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/different-initiators.sub.https_cross-site-1-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/different-initiators.sub.https_cross-site-2-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/different-initiators.sub.https_same-site-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=and-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=baseURLChangedByBaseElement-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=baseURLChangedBySameDocumentNavigation-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=defaultPredicate-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=hrefMatches-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=immediateMutation-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=invalidPredicate-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=linkHrefChanged-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=linkInShadowTree-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=linkToSelfFragment-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=newRuleSetAdded-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=not-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=or-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=selectorMatches-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=selectorMatchesDisplayLocked-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=selectorMatchesDisplayNone-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=selectorMatchesScopingRoot-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=unslottedLink-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/duplicate-urls.https-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/fragment.https-expected.txt: Progrssion.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/implicit-source.https-expected.txt: Progrssion.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/initiators-a-element.sub.https_cross-site-expected.txt: Progrsssion (partial failure).
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/initiators-a-element.sub.https_same-site-expected.txt: Progrsssion (partial failure).
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/initiators-iframe-location-href.sub.https_cross-site-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/initiators-iframe-location-href.sub.https_same-site-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/initiators-window-open.sub.https_cross-site-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/initiators-window-open.sub.https_same-site-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/multiple-url.https-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-delivery-type.https_prefetch=false&bypass_cache=false-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-delivery-type.https_prefetch=false&bypass_cache=true-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-delivery-type.https_prefetch=true&bypass_cache=false-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-delivery-type.https_prefetch=true&bypass_cache=true-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-requestStart-responseStart.https_include=afterResponse-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-requestStart-responseStart.https_include=noPrefetch-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-requestStart-responseStart.https_include=waitingForRedirect-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-requestStart-responseStart.https_include=waitingForResponse-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-sizes.https_bypass_cache=true-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-sizes.https_default-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-sizes.https_prefetch=true&bypass_cache=true-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-sizes.https_prefetch=true-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/no-http-cache-interference.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/no-prefetch-for-post.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=BaseCase-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=CSPExemption-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=EmptyRuleSet-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=FailCORS-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=FailToParseRuleSet-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=FailToParseSpeculationRulesHeader-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=FollowRedirect-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=InnerListInSpeculationRulesHeader-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=InvalidMimeType-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=InvalidUrlForSpeculationRulesSet-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=RelativeUrlForCandidate-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=RelativeUrlForSpeculationRulesSet-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=StatusCode199-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=StatusCode404-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=UseNonUTF8EncodingForSpeculationRulesSet-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-single.https_from_protocol=http&to_protocol=http-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-single.https_from_protocol=http&to_protocol=https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-single.https_from_protocol=https&to_protocol=http-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-single.https_from_protocol=https&to_protocol=https-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-status.https_status=200&should_prefetch=true-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-status.https_status=250&should_prefetch=true-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-status.https_status=299&should_prefetch=true-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-status.https_status=400&should_prefetch=false-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-status.https_status=500&should_prefetch=false-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-traverse-reload.sub-expected.txt: Progression (partial failure).
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-uses-cache.sub.https_cross-site-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-uses-cache.sub.https_same-site-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/redirect-middle-of-prefetch.https_origin=cross-site-initial-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/redirect-middle-of-prefetch.https_origin=cross-site-redirect-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/redirect-middle-of-prefetch.https_origin=same-origin-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/redirect-to-prefetch-url.https_origin=cross-site-initial-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/redirect-to-prefetch-url.https_origin=cross-site-redirect-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/redirect-to-prefetch-url.https_origin=same-origin-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/redirect-url.https_origin=cross-site-initial-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/redirect-url.https_origin=cross-site-redirect-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/redirect-url.https_origin=same-origin-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-from-rules.https_1-1-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-from-rules.https_2-2-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-from-rules.https_3-3-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-from-rules.https_4-4-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-from-rules.https_5-5-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-from-rules.https_6-6-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-from-rules.https_7-7-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-from-rules.https_8-last-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-not-accepted.https_1-1-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-not-accepted.https_2-2-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-not-accepted.https_3-last-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy.https_1-1-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy.https_2-2-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy.https_3-3-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy.https_4-last-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/same-origin-cookies.https_1-1-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/same-origin-cookies.https_2-last-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/sec-fetch-headers.https-expected.txt: Progression (partial failure).
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/user-pass.https_cross-origin=false-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/user-pass.https_cross-origin=true-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/script-supports.https-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/cross-site-prefetch.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/cross-site-to-same-site-redirection-prefetch.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/deduped-and-sorted-tags.https_type=prefetch-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/deduped-and-sorted-tags.https_type=prerender-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/invalid-tags.https_tag-level=rule&type=prefetch-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/invalid-tags.https_tag-level=rule&type=prerender-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/invalid-tags.https_tag-level=ruleset&type=prefetch-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/invalid-tags.https_tag-level=ruleset&type=prerender-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/no-tags.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/prefetch-eagerness-pointer-down.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/prefetch-eagerness-pointer-hover.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/prerender-target-hint.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/same-site-to-cross-site-redirection-prefetch.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/valid-tags.https_tag-level=rule&type=prefetch-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/valid-tags.https_tag-level=rule&type=prerender-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/valid-tags.https_tag-level=ruleset&type=prefetch-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/valid-tags.https_tag-level=ruleset&type=prerender-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/websockets/constants.sub.js: Updated.
* LayoutTests/platform/gtk/TestExpectations: Skip platform-specific failing tests for now.
* LayoutTests/platform/mac-wk1/TestExpectations: Skip service-worker reliant tests.
* LayoutTests/platform/win/TestExpectations: Skip platform-specific failing tests for now.
* LayoutTests/platform/wpe/TestExpectations: Skip platform-specific failing tests for now.
* Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml: Add a preference to enable the feature.
* Source/WebCore/Headers.cmake: Add new headers.
* Source/WebCore/Sources.txt: Add new source files.
* Source/WebCore/WebCore.xcodeproj/project.pbxproj: Add new files.
* Source/WebCore/bindings/js/ScriptController.cpp:
(WebCore::ScriptController::registerSpeculationRules): Parse and set new speculation rules.
* Source/WebCore/bindings/js/ScriptController.h:
* Source/WebCore/dom/Document.cpp:
(WebCore::Document::Document):
(WebCore::Document::resolveStyle): Call considerSpeculationRules.
(WebCore::Document::updateBaseURL): Call considerSpeculationRules.
(WebCore::Document::considerSpeculationRules): Check if speculation rules indicate we need to prefetch new documents.
(WebCore::Document::speculationRules const):
(WebCore::Document::speculationRules):
(WebCore::Document::prefetch): Kick off a document prefetch.
* Source/WebCore/dom/Document.h:
* Source/WebCore/dom/ScriptElement.cpp:
(WebCore::ScriptElement::determineScriptType): Add "speculationrules" as a script type.
(WebCore::ScriptElement::prepareScript): Call registerSpeculationRules.
(WebCore::ScriptElement::registerSpeculationRules): Register speculation rules for the document.
* Source/WebCore/dom/ScriptElement.h:
* Source/WebCore/dom/ScriptElementCachedScriptFetcher.h:
(WebCore::ScriptElementCachedScriptFetcher::isSpeculationRules const):
* Source/WebCore/dom/ScriptType.h:
* Source/WebCore/dom/SpeculationRulesMatcher.cpp: Implements speculation rules matching.
(WebCore::matches): Checks if a rule matches.
(WebCore::SpeculationRulesMatcher::hasMatchingRule): Entry point that that checks if an anchor element should be prefetched.
* Source/WebCore/dom/SpeculationRulesMatcher.h:
* Source/WebCore/dom/TrustedTypePolicy.cpp: Unified build fix.
* Source/WebCore/html/HTMLAnchorElement.cpp: Check if an anchor should be prefetched.
(WebCore::HTMLAnchorElement::defaultEventHandler): Implements the "conservative" eagerness heuristic and prefetches matching anchors on keydown/pointerdown.
(WebCore::HTMLAnchorElement::attributeChanged): Check speculation rules on attribute change.
(WebCore::HTMLAnchorElement::insertedIntoAncestor): Check speculation rules on insertion.
(WebCore::HTMLAnchorElement::setFullURL): Check speculation rules when the URL changes.
(WebCore::HTMLAnchorElement::setShouldBePrefetched): Indicates that an anchor should be prefetched.
(WebCore::HTMLAnchorElement::checkForSpeculationRules): Checks speculations rules and called setShouldBePrefetched.
* Source/WebCore/html/HTMLAnchorElement.h:
* Source/WebCore/html/HTMLScriptElement.h: Add "speculationrules" script type.
* Source/WebCore/loader/DocumentLoader.cpp:
(WebCore::DocumentLoader::setRequest):
(WebCore::DocumentLoader::loadMainResource):
* Source/WebCore/loader/DocumentPrefetcher.cpp: Handle document prefetching.
(WebCore::DocumentPrefetcher::DocumentPrefetcher):
(WebCore::DocumentPrefetcher::~DocumentPrefetcher):
(WebCore::isPassingSecurityChecks): Run security checks.
(WebCore::makePrefetchRequest): Request the prefetched document.
(WebCore::DocumentPrefetcher::prefetch): Prefetch the document if it passes all checks.
(WebCore::DocumentPrefetcher::responseReceived): Implement responseReceived to run the completion handler.
(WebCore::DocumentPrefetcher::redirectReceived): Handle redirect responses.
(WebCore::DocumentPrefetcher::notifyFinished): Handle the resource finish notification.
* Source/WebCore/loader/DocumentPrefetcher.h:
(WebCore::DocumentPrefetcher::create):
* Source/WebCore/loader/FrameLoader.cpp:
(WebCore::FrameLoader::FrameLoader): Initialize m_documentPrefetcher.
(WebCore::FrameLoader::commitProvisionalLoad):
(WebCore::FrameLoader::loadResourceSynchronously):
(WebCore::FrameLoader::continueLoadAfterNavigationPolicy): Match navigation with a prefetched resource.
(WebCore::FrameLoader::prefetch): Prefetch a document.
* Source/WebCore/loader/FrameLoader.h:
* Source/WebCore/loader/ResourceLoaderOptions.h:
* Source/WebCore/loader/SpeculationRules.cpp: Added.
(WebCore::SpeculationRules::create):
(WebCore::SpeculationRules::prefetchRules const):
(WebCore::SpeculationRules::DocumentPredicate::DocumentPredicate):
(WebCore::SpeculationRules::DocumentPredicate::value const):
(WebCore::parseStringOrStringList):
(WebCore::parseDocumentPredicate):
(WebCore::parseSingleRule):
(WebCore::parseRules):
(WebCore::SpeculationRules::parseSpeculationRules):
* Source/WebCore/loader/SpeculationRules.h: Added.
* Source/WebCore/loader/cache/CachedRawResource.cpp:
(WebCore::shouldIgnoreHeaderForCacheReuse):
* Source/WebCore/loader/cache/CachedResource.cpp:
(WebCore::CachedResource::CachedResource):
(WebCore::CachedResource::redirectReceived):
(WebCore::CachedResource::addClientToSet):
* Source/WebCore/loader/cache/CachedResource.h:
(WebCore::CachedResource::allowsCaching const):
* Source/WebCore/loader/cache/CachedResourceLoader.cpp:
(WebCore::CachedResourceLoader::allowedByContentSecurityPolicy const): Add MainResource as an option.
(WebCore::CachedResourceLoader::shouldUpdateCachedResourceWithCurrentRequest):
(WebCore::isResourceSuitableForDirectReuse):
(WebCore::CachedResourceLoader::updateCachedResourceWithCurrentRequest):
(WebCore::mustReloadFromServiceWorkerOptions):
(WebCore::CachedResourceLoader::determineRevalidationPolicy const):
* Source/WebCore/loader/cache/CachedResourceRequest.h:
(WebCore::CachedResourceRequest::allowsCaching const):
* Source/WebCore/page/PerformanceResourceTiming.cpp:
(WebCore::networkLoadTimeToDOMHighResTimeStamp):
* Source/WebCore/platform/ReferrerPolicy.cpp:
(WebCore::parseReferrerPolicy): Add SpeculationRules as a source for referrer policy.
* Source/WebCore/platform/ReferrerPolicy.h:
* Source/WebCore/platform/network/CacheValidation.cpp:
(WebCore::updateRedirectChainStatus):
* Source/WebCore/platform/network/CacheValidation.h:
* Source/WebCore/platform/network/HTTPHeaderNames.in: Add Sec-Speculation-Tags.
* Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.mm:
(WebFrameLoaderClient::dispatchDidReceiveServerRedirectForProvisionalLoad):

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

7c254ee

Misc iOS, visionOS, tvOS & watchOS macOS Linux Windows
❌ 🧪 style ✅ 🛠 ios ✅ 🛠 mac ✅ 🛠 wpe ✅ 🛠 win
✅ 🧪 bindings ✅ 🛠 ios-sim ✅ 🛠 mac-AS-debug ✅ 🧪 wpe-wk2 🧪 win-tests
✅ 🧪 webkitperl ✅ 🧪 ios-wk2 ✅ 🧪 api-mac ✅ 🧪 api-wpe
✅ 🧪 ios-wk2-wpt ✅ 🧪 mac-wk1 ✅ 🛠 wpe-cairo
✅ 🛠 🧪 jsc ✅ 🧪 api-ios ✅ 🧪 mac-wk2 ✅ 🛠 gtk
✅ 🛠 🧪 jsc-arm64 ✅ 🛠 vision ✅ 🧪 mac-AS-debug-wk2 ✅ 🧪 gtk-wk2
✅ 🛠 vision-sim ✅ 🧪 mac-wk2-stress ✅ 🧪 api-gtk
✅ 🧪 vision-wk2 ✅ 🧪 mac-intel-wk2 ✅ 🛠 playstation
✅ 🛠 🧪 unsafe-merge ✅ 🛠 tv ✅ 🛠 mac-safer-cpp ✅ 🛠 jsc-armv7
✅ 🛠 tv-sim ✅ 🧪 jsc-armv7-tests
✅ 🛠 watch
✅ 🛠 watch-sim

@yoavweiss yoavweiss requested review from a team, JonWBedard, cdumez, gsnedders and rniwa as code owners July 21, 2025 12:56
@yoavweiss yoavweiss self-assigned this Jul 21, 2025
@yoavweiss yoavweiss added the New Bugs Unclassified bugs are placed in this component until the correct component can be determined. label Jul 21, 2025
@yoavweiss yoavweiss marked this pull request as draft July 21, 2025 13:01
@webkit-ews-buildbot webkit-ews-buildbot added the merging-blocked Applied to prevent a change from being merged label Jul 21, 2025
@yoavweiss yoavweiss removed the merging-blocked Applied to prevent a change from being merged label Jul 21, 2025
@yoavweiss yoavweiss force-pushed the eng/Implement-conservative-same-origin-prefetch-speculation-rules branch from 71ece0b to 2540373 Compare July 21, 2025 16:51
@webkit-ews-buildbot webkit-ews-buildbot added the merging-blocked Applied to prevent a change from being merged label Jul 21, 2025
Comment thread Source/WebCore/dom/Document.cpp Outdated
@yoavweiss yoavweiss removed the merging-blocked Applied to prevent a change from being merged label Jul 22, 2025
@yoavweiss yoavweiss force-pushed the eng/Implement-conservative-same-origin-prefetch-speculation-rules branch from 2540373 to 755430e Compare July 22, 2025 01:33
@yoavweiss yoavweiss force-pushed the eng/Implement-conservative-same-origin-prefetch-speculation-rules branch from 755430e to b8b7acb Compare July 22, 2025 03:34
@webkit-ews-buildbot webkit-ews-buildbot added the merging-blocked Applied to prevent a change from being merged label Jul 22, 2025
@yoavweiss yoavweiss removed the merging-blocked Applied to prevent a change from being merged label Jul 22, 2025
@yoavweiss yoavweiss force-pushed the eng/Implement-conservative-same-origin-prefetch-speculation-rules branch from b8b7acb to 05727b8 Compare July 22, 2025 11:20
@webkit-ews-buildbot webkit-ews-buildbot added the merging-blocked Applied to prevent a change from being merged label Jul 22, 2025
@yoavweiss yoavweiss removed the merging-blocked Applied to prevent a change from being merged label Jul 25, 2025
@yoavweiss yoavweiss force-pushed the eng/Implement-conservative-same-origin-prefetch-speculation-rules branch from 05727b8 to 3de25c8 Compare July 25, 2025 15:31
@webkit-ews-buildbot webkit-ews-buildbot added the merging-blocked Applied to prevent a change from being merged label Jul 25, 2025
@yoavweiss yoavweiss removed the merging-blocked Applied to prevent a change from being merged label Jul 29, 2025
Comment thread Source/WebCore/dom/ScriptType.h Outdated
Comment thread Source/WebCore/dom/Document.cpp Outdated
Comment thread Source/WebCore/dom/Document.cpp
Comment thread Source/WebCore/dom/ScriptElement.cpp Outdated
Comment thread Source/WebCore/dom/SpeculationRulesMatcher.h Outdated
Comment thread Source/WebCore/loader/FrameLoader.h Outdated
Comment thread Source/WebCore/loader/SpeculationRules.cpp Outdated
Comment thread Source/WebCore/page/PerformanceResourceTiming.cpp Outdated
Comment thread Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.mm Outdated
Comment thread Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.mm Outdated
Comment thread Source/WebCore/dom/Document.cpp
Comment thread Source/WebCore/dom/Document.cpp Outdated
Comment thread Source/WebCore/dom/Document.cpp Outdated
Comment thread Source/WebCore/dom/ScriptElement.cpp Outdated
Comment thread Source/WebCore/dom/ScriptElement.cpp
Comment thread Source/WebCore/loader/DocumentLoader.cpp Outdated
Comment thread Source/WebCore/loader/DocumentLoader.cpp Outdated
Comment thread Source/WebCore/loader/FrameLoader.cpp Outdated
Comment thread Source/WebCore/loader/SpeculationRules.cpp Outdated
Comment thread Source/WebCore/loader/SpeculationRules.cpp Outdated
Comment thread Source/WebCore/dom/Document.cpp Outdated
Comment thread Source/WebCore/loader/DocumentPrefetcher.cpp Outdated
Comment thread Source/WebCore/loader/DocumentPrefetcher.cpp Outdated
Comment thread Source/WebCore/loader/DocumentPrefetcher.cpp Outdated
Comment thread Source/WebCore/loader/DocumentPrefetcher.cpp Outdated
Comment thread Source/WebCore/loader/DocumentPrefetcher.h Outdated
Comment thread Source/WebCore/loader/DocumentPrefetcher.h Outdated
Comment thread Source/WebCore/loader/DocumentPrefetcher.cpp Outdated
Comment thread Source/WebCore/dom/Document.cpp Outdated
Comment thread Source/WebCore/dom/Document.cpp Outdated
Comment thread Source/WebCore/html/HTMLAnchorElement.cpp
https://bugs.webkit.org/show_bug.cgi?id=295193

Reviewed by Alex Christensen.

This implements an initial version of same-origin prefetch speculation rules.

The feature enables prefetching an HTML document ahead of time ("immediate" eagerness),
or when the user started clicking an anchor element pointing at it ("conservative" eagerness).
That prefetched document is then used when the user actually navigates to this URL,
resulting in significant performance improvements.
Subresources of the prefetched document are not yet loaded before navigation, nor does it begin its processing.

HTML spec PR for speculation rules: whatwg/html#11426
Spec for the prefetch parts: https://wicg.github.io/nav-speculation/prefetch.html

* LayoutTests/TestExpectations: Add a few failing expectations.
* LayoutTests/imported/w3c/web-platform-tests/clear-site-data/support/clear-site-data-cache.py: Added.
(generate_png):
(generate_png.chunk):
(main):
* LayoutTests/imported/w3c/web-platform-tests/clear-site-data/support/clear-site-data-prefetchCache.py: Added.
(main):
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/external-speculation-rules-errors-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/invalid-rules.https_prefetch-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/invalid-rules.https_prerender-expected.txt: Progression
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/anonymous-client.https-expected.txt: Failure instead of timeout.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/clear-prefetch-cache-after-clear-site-data-cache.https-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/cookie-indices.https_include=changed-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/cookie-indices.https_include=changedWithRedirect-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/cookie-indices.https_include=changedWithRedirect2-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/cookie-indices.https_include=changedWithRedirect3-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/cookie-indices.https_include=unchanged-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/cookie-indices.https_include=unchangedWithRedirect-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/cross-origin-cookies-anonymous-client-ip-duplicate.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/cross-origin-cookies.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/different-initiators-2.https-expected.txt: Timeout.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/different-initiators.sub.https_cross-site-1-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/different-initiators.sub.https_cross-site-2-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/different-initiators.sub.https_same-site-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=and-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=baseURLChangedByBaseElement-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=baseURLChangedBySameDocumentNavigation-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=defaultPredicate-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=hrefMatches-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=immediateMutation-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=invalidPredicate-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=linkHrefChanged-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=linkInShadowTree-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=linkToSelfFragment-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=newRuleSetAdded-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=not-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=or-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=selectorMatches-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=selectorMatchesDisplayLocked-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=selectorMatchesDisplayNone-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=selectorMatchesScopingRoot-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/document-rules.https_include=unslottedLink-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/duplicate-urls.https-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/fragment.https-expected.txt: Progrssion.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/implicit-source.https-expected.txt: Progrssion.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/initiators-a-element.sub.https_cross-site-expected.txt: Progrsssion (partial failure).
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/initiators-a-element.sub.https_same-site-expected.txt: Progrsssion (partial failure).
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/initiators-iframe-location-href.sub.https_cross-site-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/initiators-iframe-location-href.sub.https_same-site-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/initiators-window-open.sub.https_cross-site-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/initiators-window-open.sub.https_same-site-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/multiple-url.https-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-delivery-type.https_prefetch=false&bypass_cache=false-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-delivery-type.https_prefetch=false&bypass_cache=true-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-delivery-type.https_prefetch=true&bypass_cache=false-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-delivery-type.https_prefetch=true&bypass_cache=true-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-requestStart-responseStart.https_include=afterResponse-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-requestStart-responseStart.https_include=noPrefetch-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-requestStart-responseStart.https_include=waitingForRedirect-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-requestStart-responseStart.https_include=waitingForResponse-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-sizes.https_bypass_cache=true-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-sizes.https_default-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-sizes.https_prefetch=true&bypass_cache=true-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/navigation-timing-sizes.https_prefetch=true-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/no-http-cache-interference.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/no-prefetch-for-post.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=BaseCase-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=CSPExemption-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=EmptyRuleSet-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=FailCORS-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=FailToParseRuleSet-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=FailToParseSpeculationRulesHeader-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=FollowRedirect-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=InnerListInSpeculationRulesHeader-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=InvalidMimeType-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=InvalidUrlForSpeculationRulesSet-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=RelativeUrlForCandidate-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=RelativeUrlForSpeculationRulesSet-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=StatusCode199-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=StatusCode404-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/out-of-document-rule-set.https_include=UseNonUTF8EncodingForSpeculationRulesSet-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-single.https_from_protocol=http&to_protocol=http-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-single.https_from_protocol=http&to_protocol=https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-single.https_from_protocol=https&to_protocol=http-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-single.https_from_protocol=https&to_protocol=https-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-status.https_status=200&should_prefetch=true-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-status.https_status=250&should_prefetch=true-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-status.https_status=299&should_prefetch=true-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-status.https_status=400&should_prefetch=false-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-status.https_status=500&should_prefetch=false-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-traverse-reload.sub-expected.txt: Progression (partial failure).
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-uses-cache.sub.https_cross-site-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/prefetch-uses-cache.sub.https_same-site-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/redirect-middle-of-prefetch.https_origin=cross-site-initial-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/redirect-middle-of-prefetch.https_origin=cross-site-redirect-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/redirect-middle-of-prefetch.https_origin=same-origin-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/redirect-to-prefetch-url.https_origin=cross-site-initial-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/redirect-to-prefetch-url.https_origin=cross-site-redirect-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/redirect-to-prefetch-url.https_origin=same-origin-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/redirect-url.https_origin=cross-site-initial-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/redirect-url.https_origin=cross-site-redirect-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/redirect-url.https_origin=same-origin-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-from-rules.https_1-1-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-from-rules.https_2-2-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-from-rules.https_3-3-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-from-rules.https_4-4-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-from-rules.https_5-5-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-from-rules.https_6-6-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-from-rules.https_7-7-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-from-rules.https_8-last-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-not-accepted.https_1-1-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-not-accepted.https_2-2-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy-not-accepted.https_3-last-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy.https_1-1-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy.https_2-2-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy.https_3-3-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/referrer-policy.https_4-last-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/same-origin-cookies.https_1-1-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/same-origin-cookies.https_2-last-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/sec-fetch-headers.https-expected.txt: Progression (partial failure).
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/user-pass.https_cross-origin=false-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/prefetch/user-pass.https_cross-origin=true-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/script-supports.https-expected.txt: Progression.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/cross-site-prefetch.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/cross-site-to-same-site-redirection-prefetch.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/deduped-and-sorted-tags.https_type=prefetch-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/deduped-and-sorted-tags.https_type=prerender-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/invalid-tags.https_tag-level=rule&type=prefetch-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/invalid-tags.https_tag-level=rule&type=prerender-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/invalid-tags.https_tag-level=ruleset&type=prefetch-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/invalid-tags.https_tag-level=ruleset&type=prerender-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/no-tags.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/prefetch-eagerness-pointer-down.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/prefetch-eagerness-pointer-hover.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/prerender-target-hint.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/same-site-to-cross-site-redirection-prefetch.https-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/valid-tags.https_tag-level=rule&type=prefetch-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/valid-tags.https_tag-level=rule&type=prerender-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/valid-tags.https_tag-level=ruleset&type=prefetch-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/speculation-rules/speculation-tags/valid-tags.https_tag-level=ruleset&type=prerender-expected.txt: Failure.
* LayoutTests/imported/w3c/web-platform-tests/websockets/constants.sub.js: Updated.
* LayoutTests/platform/gtk/TestExpectations: Skip platform-specific failing tests for now.
* LayoutTests/platform/mac-wk1/TestExpectations: Skip service-worker reliant tests.
* LayoutTests/platform/win/TestExpectations: Skip platform-specific failing tests for now.
* LayoutTests/platform/wpe/TestExpectations: Skip platform-specific failing tests for now.
* Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml: Add a preference to enable the feature.
* Source/WebCore/Headers.cmake: Add new headers.
* Source/WebCore/Sources.txt: Add new source files.
* Source/WebCore/WebCore.xcodeproj/project.pbxproj: Add new files.
* Source/WebCore/bindings/js/ScriptController.cpp:
(WebCore::ScriptController::registerSpeculationRules): Parse and set new speculation rules.
* Source/WebCore/bindings/js/ScriptController.h:
* Source/WebCore/dom/Document.cpp:
(WebCore::Document::Document):
(WebCore::Document::resolveStyle): Call considerSpeculationRules.
(WebCore::Document::updateBaseURL): Call considerSpeculationRules.
(WebCore::Document::considerSpeculationRules): Check if speculation rules indicate we need to prefetch new documents.
(WebCore::Document::speculationRules const):
(WebCore::Document::speculationRules):
(WebCore::Document::prefetch): Kick off a document prefetch.
* Source/WebCore/dom/Document.h:
* Source/WebCore/dom/ScriptElement.cpp:
(WebCore::ScriptElement::determineScriptType): Add "speculationrules" as a script type.
(WebCore::ScriptElement::prepareScript): Call registerSpeculationRules.
(WebCore::ScriptElement::registerSpeculationRules): Register speculation rules for the document.
* Source/WebCore/dom/ScriptElement.h:
* Source/WebCore/dom/ScriptElementCachedScriptFetcher.h:
(WebCore::ScriptElementCachedScriptFetcher::isSpeculationRules const):
* Source/WebCore/dom/ScriptType.h:
* Source/WebCore/dom/SpeculationRulesMatcher.cpp: Implements speculation rules matching.
(WebCore::matches): Checks if a rule matches.
(WebCore::SpeculationRulesMatcher::hasMatchingRule): Entry point that that checks if an anchor element should be prefetched.
* Source/WebCore/dom/SpeculationRulesMatcher.h:
* Source/WebCore/dom/TrustedTypePolicy.cpp: Unified build fix.
* Source/WebCore/html/HTMLAnchorElement.cpp: Check if an anchor should be prefetched.
(WebCore::HTMLAnchorElement::defaultEventHandler): Implements the "conservative" eagerness heuristic and prefetches matching anchors on keydown/pointerdown.
(WebCore::HTMLAnchorElement::attributeChanged): Check speculation rules on attribute change.
(WebCore::HTMLAnchorElement::insertedIntoAncestor): Check speculation rules on insertion.
(WebCore::HTMLAnchorElement::setFullURL): Check speculation rules when the URL changes.
(WebCore::HTMLAnchorElement::setShouldBePrefetched): Indicates that an anchor should be prefetched.
(WebCore::HTMLAnchorElement::checkForSpeculationRules): Checks speculations rules and called setShouldBePrefetched.
* Source/WebCore/html/HTMLAnchorElement.h:
* Source/WebCore/html/HTMLScriptElement.h: Add "speculationrules" script type.
* Source/WebCore/loader/DocumentLoader.cpp:
(WebCore::DocumentLoader::setRequest):
(WebCore::DocumentLoader::loadMainResource):
* Source/WebCore/loader/DocumentPrefetcher.cpp: Handle document prefetching.
(WebCore::DocumentPrefetcher::DocumentPrefetcher):
(WebCore::DocumentPrefetcher::~DocumentPrefetcher):
(WebCore::isPassingSecurityChecks): Run security checks.
(WebCore::makePrefetchRequest): Request the prefetched document.
(WebCore::DocumentPrefetcher::prefetch): Prefetch the document if it passes all checks.
(WebCore::DocumentPrefetcher::responseReceived): Implement responseReceived to run the completion handler.
(WebCore::DocumentPrefetcher::redirectReceived): Handle redirect responses.
(WebCore::DocumentPrefetcher::notifyFinished): Handle the resource finish notification.
* Source/WebCore/loader/DocumentPrefetcher.h:
(WebCore::DocumentPrefetcher::create):
* Source/WebCore/loader/FrameLoader.cpp:
(WebCore::FrameLoader::FrameLoader): Initialize m_documentPrefetcher.
(WebCore::FrameLoader::commitProvisionalLoad):
(WebCore::FrameLoader::loadResourceSynchronously):
(WebCore::FrameLoader::continueLoadAfterNavigationPolicy): Match navigation with a prefetched resource.
(WebCore::FrameLoader::prefetch): Prefetch a document.
* Source/WebCore/loader/FrameLoader.h:
* Source/WebCore/loader/ResourceLoaderOptions.h:
* Source/WebCore/loader/SpeculationRules.cpp: Added.
(WebCore::SpeculationRules::create):
(WebCore::SpeculationRules::prefetchRules const):
(WebCore::SpeculationRules::DocumentPredicate::DocumentPredicate):
(WebCore::SpeculationRules::DocumentPredicate::value const):
(WebCore::parseStringOrStringList):
(WebCore::parseDocumentPredicate):
(WebCore::parseSingleRule):
(WebCore::parseRules):
(WebCore::SpeculationRules::parseSpeculationRules):
* Source/WebCore/loader/SpeculationRules.h: Added.
* Source/WebCore/loader/cache/CachedRawResource.cpp:
(WebCore::shouldIgnoreHeaderForCacheReuse):
* Source/WebCore/loader/cache/CachedResource.cpp:
(WebCore::CachedResource::CachedResource):
(WebCore::CachedResource::redirectReceived):
(WebCore::CachedResource::addClientToSet):
* Source/WebCore/loader/cache/CachedResource.h:
(WebCore::CachedResource::allowsCaching const):
* Source/WebCore/loader/cache/CachedResourceLoader.cpp:
(WebCore::CachedResourceLoader::allowedByContentSecurityPolicy const): Add MainResource as an option.
(WebCore::CachedResourceLoader::shouldUpdateCachedResourceWithCurrentRequest):
(WebCore::isResourceSuitableForDirectReuse):
(WebCore::CachedResourceLoader::updateCachedResourceWithCurrentRequest):
(WebCore::mustReloadFromServiceWorkerOptions):
(WebCore::CachedResourceLoader::determineRevalidationPolicy const):
* Source/WebCore/loader/cache/CachedResourceRequest.h:
(WebCore::CachedResourceRequest::allowsCaching const):
* Source/WebCore/page/PerformanceResourceTiming.cpp:
(WebCore::networkLoadTimeToDOMHighResTimeStamp):
* Source/WebCore/platform/ReferrerPolicy.cpp:
(WebCore::parseReferrerPolicy): Add SpeculationRules as a source for referrer policy.
* Source/WebCore/platform/ReferrerPolicy.h:
* Source/WebCore/platform/network/CacheValidation.cpp:
(WebCore::updateRedirectChainStatus):
* Source/WebCore/platform/network/CacheValidation.h:
* Source/WebCore/platform/network/HTTPHeaderNames.in: Add Sec-Speculation-Tags.
* Source/WebKitLegacy/mac/WebCoreSupport/WebFrameLoaderClient.mm:
(WebFrameLoaderClient::dispatchDidReceiveServerRedirectForProvisionalLoad):

Canonical link: https://commits.webkit.org/300829@main
@webkit-commit-queue

Copy link
Copy Markdown
Collaborator

Committed 300829@main (a4a9e7f): https://commits.webkit.org/300829@main

Reviewed commits have been landed. Closing PR #48322 and removing active labels.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

New Bugs Unclassified bugs are placed in this component until the correct component can be determined.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants