[webkit-changes] [WebKit/WebKit] eeb51f: Support preconnect via HTTP early hints

bnham noreply at github.com
Thu Mar 2 10:23:08 PST 2023


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: eeb51f0ea0f0e1f38d9330d3113c5392b6dad50f
      https://github.com/WebKit/WebKit/commit/eeb51f0ea0f0e1f38d9330d3113c5392b6dad50f
  Author: Ben Nham <nham at apple.com>
  Date:   2023-03-02 (Thu, 02 Mar 2023)

  Changed paths:
    M LayoutTests/TestExpectations
    A LayoutTests/http/wpt/loading/early-hints/preconnect-csp-allowed.h2.window-expected.txt
    A LayoutTests/http/wpt/loading/early-hints/preconnect-csp-allowed.h2.window.html
    A LayoutTests/http/wpt/loading/early-hints/preconnect-csp-allowed.h2.window.js
    A LayoutTests/http/wpt/loading/early-hints/preconnect-csp-blocked.h2.window-expected.txt
    A LayoutTests/http/wpt/loading/early-hints/preconnect-csp-blocked.h2.window.html
    A LayoutTests/http/wpt/loading/early-hints/preconnect-csp-blocked.h2.window.js
    A LayoutTests/http/wpt/loading/early-hints/preconnect.h2.window-expected.txt
    A LayoutTests/http/wpt/loading/early-hints/preconnect.h2.window.html
    A LayoutTests/http/wpt/loading/early-hints/preconnect.h2.window.js
    A LayoutTests/http/wpt/loading/early-hints/resources/blank.png
    A LayoutTests/http/wpt/loading/early-hints/resources/blank.png.headers
    A LayoutTests/http/wpt/loading/early-hints/resources/constants.sub.js
    A LayoutTests/http/wpt/loading/early-hints/resources/preconnect.h2.py
    A LayoutTests/http/wpt/loading/early-hints/resources/preconnect.html
    M LayoutTests/imported/w3c/resources/config.json
    M LayoutTests/platform/ios-wk2/TestExpectations
    M LayoutTests/platform/mac-wk2/TestExpectations
    M Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml
    M Source/WebCore/Headers.cmake
    M Source/WebCore/loader/LinkHeader.h
    A Source/WebKit/NetworkProcess/EarlyHintsResourceLoader.cpp
    A Source/WebKit/NetworkProcess/EarlyHintsResourceLoader.h
    M Source/WebKit/NetworkProcess/NetworkDataTask.cpp
    M Source/WebKit/NetworkProcess/NetworkDataTask.h
    M Source/WebKit/NetworkProcess/NetworkLoad.cpp
    M Source/WebKit/NetworkProcess/NetworkLoad.h
    M Source/WebKit/NetworkProcess/NetworkLoadClient.h
    M Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.cpp
    M Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.h
    M Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.serialization.in
    M Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp
    M Source/WebKit/NetworkProcess/NetworkResourceLoader.h
    M Source/WebKit/NetworkProcess/cache/NetworkCacheEntry.cpp
    M Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm
    M Source/WebKit/Sources.txt
    M Source/WebKit/WebKit.xcodeproj/project.pbxproj
    M Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp
    M Tools/Scripts/webkitpy/layout_tests/servers/web_platform_test_server.py
    M Tools/Scripts/webkitpy/port/base.py
    M Tools/Scripts/webkitpy/port/driver.py
    M Tools/Scripts/webkitpy/port/test.py

  Log Message:
  -----------
  Support preconnect via HTTP early hints
https://bugs.webkit.org/show_bug.cgi?id=253120
rdar://106055702

Reviewed by Youenn Fablet.

This adds support for preconnect via HTTP early hints (as documented in RFC8297 and the HTML
spec). A number of websites already use these, e.g. many Shopify websites send an early hint to
preconnect to cdn.shopify.com.

NetworkProcess parses and processes the early hint. The 103 Early Hints response is piped back from
the NSURLSessionDataTask delegate method back to NetworkResourceLoader. NetworkResourceLoader passes
the early hint response to EarlyHintsResourceLoader. EarlyHintsResourceLoader then parses the
response headers for a Content-Security-Policy (if it exists) and any Link headers with
`rel=preconnect`. EarlyHintsResourceLoader then starts preconnecting to origins that pass the CSP
check.

Like Chrome, we only handle the first 103 response on top level navigation received over HTTP/2 or
higher. This avoids having to think about various edge cases, e.g. a 103 response with a CSP
followed by another 103 response with a differing CSP.

For testing, I wanted to use the existing early hints preconnect test in upstream WPT, but it
doesn't work right now due to bug 253043. Instead, I added a WebKit-only WPT to test early
preconnection with and without a CSP. Note that this required slightly changing our WPT driver to
properly invoke HTTP/2-only response handlers.

* LayoutTests/TestExpectations:
* LayoutTests/http/wpt/loading/early-hints/preconnect-csp-allowed.h2.window-expected.txt: Added.
* LayoutTests/http/wpt/loading/early-hints/preconnect-csp-allowed.h2.window.html: Added.
* LayoutTests/http/wpt/loading/early-hints/preconnect-csp-allowed.h2.window.js: Added.
(test):
* LayoutTests/http/wpt/loading/early-hints/preconnect-csp-blocked.h2.window-expected.txt: Added.
* LayoutTests/http/wpt/loading/early-hints/preconnect-csp-blocked.h2.window.html: Added.
* LayoutTests/http/wpt/loading/early-hints/preconnect-csp-blocked.h2.window.js: Added.
(test):
* LayoutTests/http/wpt/loading/early-hints/preconnect.h2.window-expected.txt: Added.
* LayoutTests/http/wpt/loading/early-hints/preconnect.h2.window.html: Added.
* LayoutTests/http/wpt/loading/early-hints/preconnect.h2.window.js: Added.
(test):
* LayoutTests/http/wpt/loading/early-hints/resources/blank.png: Added.
* LayoutTests/http/wpt/loading/early-hints/resources/blank.png.headers: Added.
* LayoutTests/http/wpt/loading/early-hints/resources/constants.sub.js: Added.
* LayoutTests/http/wpt/loading/early-hints/resources/preconnect.h2.py: Added.
(handle_headers):
(main):
* LayoutTests/http/wpt/loading/early-hints/resources/preconnect.html: Added.
* LayoutTests/imported/w3c/resources/config.json:
* LayoutTests/platform/ios-wk2/TestExpectations:
* LayoutTests/platform/mac-wk2/TestExpectations:
* Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml:
* Source/WebCore/Headers.cmake:
* Source/WebCore/loader/LinkHeader.h:
* Source/WebKit/NetworkProcess/EarlyHintsResourceLoader.cpp: Added.
(WebKit::EarlyHintsResourceLoader::EarlyHintsResourceLoader):
(WebKit::EarlyHintsResourceLoader::addConsoleMessage):
(WebKit::EarlyHintsResourceLoader::enqueueSecurityPolicyViolationEvent):
(WebKit::EarlyHintsResourceLoader::handleEarlyHintsResponse):
(WebKit::EarlyHintsResourceLoader::constructPreconnectRequest):
(WebKit::EarlyHintsResourceLoader::startPreconnectTask):
* Source/WebKit/NetworkProcess/EarlyHintsResourceLoader.h: Added.
* Source/WebKit/NetworkProcess/NetworkDataTask.cpp:
(WebKit::NetworkDataTask::didReceiveInformationalResponse):
* Source/WebKit/NetworkProcess/NetworkDataTask.h:
(WebKit::NetworkDataTaskClient::didReceiveInformationalResponse):
* Source/WebKit/NetworkProcess/NetworkLoad.cpp:
(WebKit::NetworkLoad::didReceiveInformationalResponse):
* Source/WebKit/NetworkProcess/NetworkLoad.h:
* Source/WebKit/NetworkProcess/NetworkLoadClient.h:
(WebKit::NetworkLoadClient::didReceiveInformationalResponse):
* Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.cpp:
(WebKit::NetworkResourceLoadParameters::NetworkResourceLoadParameters):
* Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.h:
* Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.serialization.in:
* Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp:
(WebKit::NetworkResourceLoader::didReceiveInformationalResponse):
* Source/WebKit/NetworkProcess/NetworkResourceLoader.h:
* Source/WebKit/NetworkProcess/cache/NetworkCacheEntry.cpp:
* Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm:
(-[WKNetworkSessionDelegate URLSession:task:_didReceiveInformationalResponse:]):
* Source/WebKit/Sources.txt:
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
* Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp:
(WebKit::addParametersShared):
* Tools/Scripts/webkitpy/layout_tests/servers/web_platform_test_server.py:
(base_h2_url):
(base_url_list):
* Tools/Scripts/webkitpy/port/base.py:
(Port.web_platform_test_server_base_h2_url):
* Tools/Scripts/webkitpy/port/driver.py:
(Driver.__init__):
(Driver.wpt_webkit_test_path_to_uri):
* Tools/Scripts/webkitpy/port/test.py:

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




More information about the webkit-changes mailing list