Changeset 222613 in webkit


Ignore:
Timestamp:
Sep 28, 2017 10:05:26 AM (7 years ago)
Author:
Chris Dumez
Message:

Add support for <link rel=preconnect>
https://bugs.webkit.org/show_bug.cgi?id=177474
<rdar://problem/33141380>

Reviewed by Alex Christensen.

Source/WebCore:

Add support for <link rel=preconnect>:

It is currently only enabled for WK2 on MacOS High Sierra+
and iOS 11+.

Tests: fast/dom/HTMLLinkElement/preconnect-support.html

http/tests/preconnect/link-rel-preconnect-http.html
http/tests/preconnect/link-rel-preconnect-https.html

  • bindings/js/JSDOMExceptionHandling.h:
  • bindings/scripts/CodeGeneratorJS.pm:

(GenerateCallbackHeaderContent):

  • bindings/scripts/IDLAttributes.json:
  • dom/Document.cpp:

(WebCore::Document::addConsoleMessage):
(WebCore::Document::setConsoleMessageListener):

  • dom/Document.h:
  • dom/StringCallback.idl:
  • html/DOMTokenList.cpp:

(WebCore::DOMTokenList::DOMTokenList):
(WebCore::DOMTokenList::supports):

  • html/DOMTokenList.h:

(WebCore::DOMTokenList::DOMTokenList):

  • html/HTMLAnchorElement.cpp:

(WebCore::HTMLAnchorElement::relList):

  • html/HTMLIFrameElement.cpp:

(WebCore::HTMLIFrameElement::sandbox):

  • html/HTMLLinkElement.cpp:

(WebCore::HTMLLinkElement::parseAttribute):
(WebCore::HTMLLinkElement::relList):

  • html/LinkRelAttribute.cpp:

(WebCore::LinkRelAttribute::LinkRelAttribute):
(WebCore::LinkRelAttribute::isSupported):

  • html/LinkRelAttribute.h:
  • html/parser/HTMLPreloadScanner.cpp:

(WebCore::TokenPreloadScanner::StartTagScanner::processAttribute):

  • loader/LinkLoader.cpp:

(WebCore::LinkLoader::loadLinksFromHeader):
(WebCore::LinkLoader::loadLink):

  • loader/LoaderStrategy.h:
  • page/Settings.in:
  • testing/Internals.cpp:

(WebCore::Internals::Internals):
(WebCore::Internals::setConsoleMessageListener):

  • testing/Internals.h:
  • testing/Internals.idl:

Source/WebCore/PAL:

Add new CFNetwork SPI for preconnecting.

  • pal/spi/cf/CFNetworkSPI.h:

Source/WebKit:

Add support for <link rel=preconnect>:

Also add corresponding native private API.

  • NetworkProcess/NetworkConnectionToWebProcess.cpp:

(WebKit::NetworkConnectionToWebProcess::preconnectTo):
(WebKit::NetworkConnectionToWebProcess::didFinishPreconnection):

  • NetworkProcess/NetworkConnectionToWebProcess.h:
  • NetworkProcess/NetworkConnectionToWebProcess.messages.in:
  • NetworkProcess/NetworkDataTask.cpp:

(WebKit::NetworkDataTask::create):

  • NetworkProcess/NetworkLoadParameters.h:
  • NetworkProcess/NetworkProcess.cpp:

(WebKit::NetworkProcess::preconnectTo):

  • NetworkProcess/NetworkProcess.h:
  • NetworkProcess/NetworkProcess.messages.in:
  • NetworkProcess/PreconnectTask.cpp: Added.

(WebKit::PreconnectTask::PreconnectTask):
(WebKit::PreconnectTask::~PreconnectTask):
(WebKit::PreconnectTask::willPerformHTTPRedirection):
(WebKit::PreconnectTask::didReceiveChallenge):
(WebKit::PreconnectTask::didReceiveResponseNetworkSession):
(WebKit::PreconnectTask::didReceiveData):
(WebKit::PreconnectTask::didCompleteWithError):
(WebKit::PreconnectTask::didSendData):
(WebKit::PreconnectTask::wasBlocked):
(WebKit::PreconnectTask::cannotShowURL):
(WebKit::PreconnectTask::didFinish):

  • NetworkProcess/PreconnectTask.h: Copied from Source/WebKit/NetworkProcess/NetworkLoadParameters.h.
  • NetworkProcess/cocoa/NetworkDataTaskCocoa.h:
  • NetworkProcess/cocoa/NetworkDataTaskCocoa.mm:

(WebKit::NetworkDataTaskCocoa::NetworkDataTaskCocoa):

  • Shared/WebCoreArgumentCoders.h:
  • Shared/WebPreferencesDefinitions.h:
  • UIProcess/API/C/WKContext.cpp:

(WKContextPreconnectToServer):

  • UIProcess/API/C/WKContextPrivate.h:
  • UIProcess/API/Cocoa/WKProcessPool.mm:

(-[WKProcessPool _preconnectToServer:]):

  • UIProcess/API/Cocoa/WKProcessPoolPrivate.h:
  • UIProcess/WebProcessPool.cpp:

(WebKit::WebProcessPool::preconnectToServer):

  • UIProcess/WebProcessPool.h:
  • WebKit.xcodeproj/project.pbxproj:
  • WebProcess/Network/NetworkProcessConnection.cpp:

(WebKit::NetworkProcessConnection::didFinishPreconnection):

  • WebProcess/Network/NetworkProcessConnection.h:
  • WebProcess/Network/NetworkProcessConnection.messages.in:
  • WebProcess/Network/WebLoaderStrategy.cpp:

(WebKit::WebLoaderStrategy::networkProcessCrashed):
(WebKit::generateLoadIdentifier):
(WebKit::WebLoaderStrategy::startPingLoad):
(WebKit::WebLoaderStrategy::preconnectTo):
(WebKit::WebLoaderStrategy::didFinishPreconnection):

  • WebProcess/Network/WebLoaderStrategy.h:
  • WebProcess/WebPage/WebPage.cpp:

(WebKit::WebPage::updatePreferences):

  • config.h:

Source/WebKitLegacy:

  • WebCoreSupport/WebResourceLoadScheduler.cpp:

(WebResourceLoadScheduler::preconnectTo):

  • WebCoreSupport/WebResourceLoadScheduler.h:

LayoutTests:

  • fast/dom/HTMLLinkElement/preconnect-support-expected.txt: Added.
  • fast/dom/HTMLLinkElement/preconnect-support.html: Added.
  • http/tests/preconnect/link-rel-preconnect-http-expected.txt: Added.
  • http/tests/preconnect/link-rel-preconnect-http.html: Added.
  • http/tests/preconnect/link-rel-preconnect-https-expected.txt: Added.
  • http/tests/preconnect/link-rel-preconnect-https.html: Added.

Add layout test coverage.

  • platform/mac-elcapitan-wk2/fast/dom/HTMLLinkElement/preconnect-support-expected.txt: Added.
  • platform/mac-wk1/TestExpectations:
  • platform/mac-wk1/fast/dom/HTMLLinkElement/preconnect-support-expected.txt: Added.
  • platform/mac-wk2/TestExpectations:

Skip or land failure expectations for platforms where the feature is disabled.

Location:
trunk
Files:
17 added
56 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r222611 r222613  
     12017-09-28  Chris Dumez  <cdumez@apple.com>
     2
     3        Add support for <link rel=preconnect>
     4        https://bugs.webkit.org/show_bug.cgi?id=177474
     5        <rdar://problem/33141380>
     6
     7        Reviewed by Alex Christensen.
     8
     9        * fast/dom/HTMLLinkElement/preconnect-support-expected.txt: Added.
     10        * fast/dom/HTMLLinkElement/preconnect-support.html: Added.
     11        * http/tests/preconnect/link-rel-preconnect-http-expected.txt: Added.
     12        * http/tests/preconnect/link-rel-preconnect-http.html: Added.
     13        * http/tests/preconnect/link-rel-preconnect-https-expected.txt: Added.
     14        * http/tests/preconnect/link-rel-preconnect-https.html: Added.
     15        Add layout test coverage.
     16
     17        * platform/mac-elcapitan-wk2/fast/dom/HTMLLinkElement/preconnect-support-expected.txt: Added.
     18        * platform/mac-wk1/TestExpectations:
     19        * platform/mac-wk1/fast/dom/HTMLLinkElement/preconnect-support-expected.txt: Added.
     20        * platform/mac-wk2/TestExpectations:
     21        Skip or land failure expectations for platforms where the feature is disabled.
     22
    1232017-09-28  Ryan Haddad  <ryanhaddad@apple.com>
    224
  • trunk/LayoutTests/platform/mac-wk1/TestExpectations

    r222611 r222613  
    404404http/tests/workers/service [ Skip ]
    405405
     406# Link preconnect is disabled on WebKit1 because it does not use NETWORK_SESSION.
     407http/tests/preconnect [ Skip ]
     408
    406409webkit.org/b/175345 fast/images/animated-gif-scrolling-crash.html [ Pass Timeout ]
    407410
  • trunk/LayoutTests/platform/mac-wk2/TestExpectations

    r222423 r222613  
    794794[ HighSierra+ ] http/tests/media/video-buffered-range-contains-currentTime.html [ Pass ImageOnlyFailure ]
    795795
     796# Link preconnect is disabled on pre-High Sierra because the CFNetwork SPI is missing.
     797[ ElCapitan Sierra ] http/tests/preconnect [ Skip ]
     798
    796799webkit.org/b/176486 [ ElCapitan Debug ] imported/w3c/web-platform-tests/background-fetch/interfaces-worker.https.html [ Pass Failure ]
    797800
  • trunk/Source/WebCore/ChangeLog

    r222612 r222613  
     12017-09-28  Chris Dumez  <cdumez@apple.com>
     2
     3        Add support for <link rel=preconnect>
     4        https://bugs.webkit.org/show_bug.cgi?id=177474
     5        <rdar://problem/33141380>
     6
     7        Reviewed by Alex Christensen.
     8
     9        Add support for <link rel=preconnect>:
     10        - https://w3c.github.io/resource-hints/#preconnect
     11
     12        It is currently only enabled for WK2 on MacOS High Sierra+
     13        and iOS 11+.
     14
     15        Tests: fast/dom/HTMLLinkElement/preconnect-support.html
     16               http/tests/preconnect/link-rel-preconnect-http.html
     17               http/tests/preconnect/link-rel-preconnect-https.html
     18
     19        * bindings/js/JSDOMExceptionHandling.h:
     20        * bindings/scripts/CodeGeneratorJS.pm:
     21        (GenerateCallbackHeaderContent):
     22        * bindings/scripts/IDLAttributes.json:
     23        * dom/Document.cpp:
     24        (WebCore::Document::addConsoleMessage):
     25        (WebCore::Document::setConsoleMessageListener):
     26        * dom/Document.h:
     27        * dom/StringCallback.idl:
     28        * html/DOMTokenList.cpp:
     29        (WebCore::DOMTokenList::DOMTokenList):
     30        (WebCore::DOMTokenList::supports):
     31        * html/DOMTokenList.h:
     32        (WebCore::DOMTokenList::DOMTokenList):
     33        * html/HTMLAnchorElement.cpp:
     34        (WebCore::HTMLAnchorElement::relList):
     35        * html/HTMLIFrameElement.cpp:
     36        (WebCore::HTMLIFrameElement::sandbox):
     37        * html/HTMLLinkElement.cpp:
     38        (WebCore::HTMLLinkElement::parseAttribute):
     39        (WebCore::HTMLLinkElement::relList):
     40        * html/LinkRelAttribute.cpp:
     41        (WebCore::LinkRelAttribute::LinkRelAttribute):
     42        (WebCore::LinkRelAttribute::isSupported):
     43        * html/LinkRelAttribute.h:
     44        * html/parser/HTMLPreloadScanner.cpp:
     45        (WebCore::TokenPreloadScanner::StartTagScanner::processAttribute):
     46        * loader/LinkLoader.cpp:
     47        (WebCore::LinkLoader::loadLinksFromHeader):
     48        (WebCore::LinkLoader::loadLink):
     49        * loader/LoaderStrategy.h:
     50        * page/Settings.in:
     51        * testing/Internals.cpp:
     52        (WebCore::Internals::Internals):
     53        (WebCore::Internals::setConsoleMessageListener):
     54        * testing/Internals.h:
     55        * testing/Internals.idl:
     56
    1572017-09-28  Zalan Bujtas  <zalan@apple.com>
    258
  • trunk/Source/WebCore/PAL/ChangeLog

    r222592 r222613  
     12017-09-28  Chris Dumez  <cdumez@apple.com>
     2
     3        Add support for <link rel=preconnect>
     4        https://bugs.webkit.org/show_bug.cgi?id=177474
     5        <rdar://problem/33141380>
     6
     7        Reviewed by Alex Christensen.
     8
     9        Add new CFNetwork SPI for preconnecting.
     10
     11        * pal/spi/cf/CFNetworkSPI.h:
     12
    1132017-09-27  Tim Horton  <timothy_horton@apple.com>
    214
  • trunk/Source/WebCore/PAL/pal/spi/cf/CFNetworkSPI.h

    r221986 r222613  
    113113- (NSDictionary *)_timingData;
    114114@end
     115
     116#if (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101300) || (PLATFORM(IOS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 110000)
     117@interface NSURLSessionTask (ResourceHints)
     118@property (nonatomic, assign) BOOL _preconnect;
     119@end
     120#endif
    115121
    116122@interface NSHTTPCookie ()
  • trunk/Source/WebCore/bindings/js/JSDOMExceptionHandling.h

    r222250 r222613  
    6363
    6464WEBCORE_EXPORT JSC::EncodedJSValue throwArgumentMustBeEnumError(JSC::ExecState&, JSC::ThrowScope&, unsigned argumentIndex, const char* argumentName, const char* functionInterfaceName, const char* functionName, const char* expectedValues);
    65 JSC::EncodedJSValue throwArgumentMustBeFunctionError(JSC::ExecState&, JSC::ThrowScope&, unsigned argumentIndex, const char* argumentName, const char* functionInterfaceName, const char* functionName);
     65WEBCORE_EXPORT JSC::EncodedJSValue throwArgumentMustBeFunctionError(JSC::ExecState&, JSC::ThrowScope&, unsigned argumentIndex, const char* argumentName, const char* functionInterfaceName, const char* functionName);
    6666WEBCORE_EXPORT JSC::EncodedJSValue throwArgumentTypeError(JSC::ExecState&, JSC::ThrowScope&, unsigned argumentIndex, const char* argumentName, const char* functionInterfaceName, const char* functionName, const char* expectedType);
    6767WEBCORE_EXPORT JSC::EncodedJSValue throwRequiredMemberTypeError(JSC::ExecState&, JSC::ThrowScope&, const char* memberName, const char* dictionaryName, const char* expectedType);
  • trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm

    r222473 r222613  
    58195819    $includesRef->{"${name}.h"} = 1;
    58205820
    5821     push(@$contentRef, "class $className final : public ${name} {\n");
     5821    my $exportMacro = GetExportMacroForJSClass($interfaceOrCallback);
     5822
     5823    push(@$contentRef, "class $exportMacro$className final : public ${name} {\n");
    58225824    push(@$contentRef, "public:\n");
    58235825
     
    58765878
    58775879    # toJS().
    5878     push(@$contentRef, "JSC::JSValue toJS(${name}&);\n");
     5880    push(@$contentRef, $exportMacro . "JSC::JSValue toJS(${name}&);\n");
    58795881    push(@$contentRef, "inline JSC::JSValue toJS(${name}* impl) { return impl ? toJS(*impl) : JSC::jsNull(); }\n\n");
    58805882}
  • trunk/Source/WebCore/bindings/scripts/IDLAttributes.json

    r222454 r222613  
    187187        },
    188188        "ExportMacro": {
    189             "contextsAllowed": ["interface", "dictionary", "enum"],
     189            "contextsAllowed": ["interface", "dictionary", "enum", "callback-function"],
    190190            "values": ["WEBCORE_EXPORT", "WEBCORE_TESTSUPPORT_EXPORT"]
    191191        },
  • trunk/Source/WebCore/dom/Document.cpp

    r222575 r222613  
    174174#include "SocketProvider.h"
    175175#include "StorageEvent.h"
     176#include "StringCallback.h"
    176177#include "StyleProperties.h"
    177178#include "StyleResolveForDocument.h"
     
    56125613    if (Page* page = this->page())
    56135614        page->console().addMessage(source, level, message, requestIdentifier, this);
     5615
     5616    if (m_consoleMessageListener)
     5617        m_consoleMessageListener->scheduleCallback(*this, message);
    56145618}
    56155619
     
    73417345}
    73427346
     7347void Document::setConsoleMessageListener(RefPtr<StringCallback>&& listener)
     7348{
     7349    m_consoleMessageListener = listener;
     7350}
     7351
    73437352} // namespace WebCore
  • trunk/Source/WebCore/dom/Document.h

    r222422 r222613  
    169169class SerializedScriptValue;
    170170class Settings;
     171class StringCallback;
    171172class StyleResolver;
    172173class StyleSheet;
     
    13601361    void setUserGrantsStorageAccessOverride(bool value) { m_grantStorageAccessOverride = value; }
    13611362
     1363    WEBCORE_EXPORT void setConsoleMessageListener(RefPtr<StringCallback>&&); // For testing.
     1364
    13621365protected:
    13631366    enum ConstructionFlags { Synthesized = 1, NonRenderedPlaceholder = 1 << 1 };
     
    18091812    mutable PAL::SessionID m_sessionID;
    18101813    mutable RefPtr<PAL::Logger> m_logger;
     1814    RefPtr<StringCallback> m_consoleMessageListener;
    18111815
    18121816    static bool hasEverCreatedAnAXObjectCache;
  • trunk/Source/WebCore/dom/StringCallback.idl

    r208408 r222613  
    2929 */
    3030
    31 callback StringCallback = void (DOMString data);
     31[
     32    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT
     33] callback StringCallback = void (DOMString data);
  • trunk/Source/WebCore/html/DOMTokenList.cpp

    r219856 r222613  
    3636namespace WebCore {
    3737
    38 DOMTokenList::DOMTokenList(Element& element, const QualifiedName& attributeName, WTF::Function<bool(StringView)>&& isSupportedToken)
     38DOMTokenList::DOMTokenList(Element& element, const QualifiedName& attributeName, IsSupportedTokenFunction&& isSupportedToken)
    3939    : m_element(element)
    4040    , m_attributeName(attributeName)
     
    192192    if (!m_isSupportedToken)
    193193        return Exception { TypeError };
    194     return m_isSupportedToken(token);
     194    return m_isSupportedToken(m_element.document(), token);
    195195}
    196196
  • trunk/Source/WebCore/html/DOMTokenList.h

    r219237 r222613  
    3333    WTF_MAKE_FAST_ALLOCATED;
    3434public:
    35     DOMTokenList(Element&, const QualifiedName& attributeName, WTF::Function<bool(StringView)>&& isSupportedToken = { });
     35    using IsSupportedTokenFunction = WTF::Function<bool(Document&, StringView)>;
     36    DOMTokenList(Element&, const QualifiedName& attributeName, IsSupportedTokenFunction&& isSupportedToken = { });
    3637
    3738    void associatedAttributeValueChanged(const AtomicString&);
     
    7475    bool m_tokensNeedUpdating { true };
    7576    Vector<AtomicString> m_tokens;
    76     WTF::Function<bool(StringView)> m_isSupportedToken;
     77    IsSupportedTokenFunction m_isSupportedToken;
    7778};
    7879
  • trunk/Source/WebCore/html/HTMLAnchorElement.cpp

    r212972 r222613  
    308308{
    309309    if (!m_relList)
    310         m_relList = std::make_unique<DOMTokenList>(*this, HTMLNames::relAttr, [](StringView token) {
     310        m_relList = std::make_unique<DOMTokenList>(*this, HTMLNames::relAttr, [](Document&, StringView token) {
    311311            return equalIgnoringASCIICase(token, "noreferrer") || equalIgnoringASCIICase(token, "noopener");
    312312        });
  • trunk/Source/WebCore/html/HTMLIFrameElement.cpp

    r206616 r222613  
    5252{
    5353    if (!m_sandbox)
    54         m_sandbox = std::make_unique<DOMTokenList>(*this, sandboxAttr, [](StringView token) {
     54        m_sandbox = std::make_unique<DOMTokenList>(*this, sandboxAttr, [](Document&, StringView token) {
    5555            return SecurityContext::isSupportedSandboxPolicy(token);
    5656        });
  • trunk/Source/WebCore/html/HTMLLinkElement.cpp

    r220812 r222613  
    157157{
    158158    if (name == relAttr) {
    159         m_relAttribute = LinkRelAttribute(value);
     159        m_relAttribute = LinkRelAttribute(document(), value);
    160160        if (m_relList)
    161161            m_relList->associatedAttributeValueChanged(value);
     
    499499{
    500500    if (!m_relList)
    501         m_relList = std::make_unique<DOMTokenList>(*this, HTMLNames::relAttr, [](StringView token) {
    502             return LinkRelAttribute::isSupported(token);
     501        m_relList = std::make_unique<DOMTokenList>(*this, HTMLNames::relAttr, [](Document& document, StringView token) {
     502            return LinkRelAttribute::isSupported(document, token);
    503503        });
    504504    return *m_relList;
  • trunk/Source/WebCore/html/LinkRelAttribute.cpp

    r216102 r222613  
    3333#include "LinkRelAttribute.h"
    3434
     35#include "Document.h"
    3536#include "LinkIconType.h"
    3637#include "RuntimeEnabledFeatures.h"
     38#include "Settings.h"
    3739#include <wtf/text/StringView.h>
    3840#include <wtf/text/WTFString.h>
     
    4547
    4648// Keep LinkRelAttribute::isSupported() in sync when updating this constructor.
    47 LinkRelAttribute::LinkRelAttribute(const String& rel)
     49LinkRelAttribute::LinkRelAttribute(Document& document, const String& rel)
    4850{
    4951    if (equalLettersIgnoringASCIICase(rel, "stylesheet"))
     
    5759    else if (equalLettersIgnoringASCIICase(rel, "dns-prefetch"))
    5860        isDNSPrefetch = true;
     61    else if (document.settings().linkPreconnectEnabled() && equalLettersIgnoringASCIICase(rel, "preconnect"))
     62        isLinkPreconnect = true;
    5963    else if (RuntimeEnabledFeatures::sharedFeatures().linkPreloadEnabled() && equalLettersIgnoringASCIICase(rel, "preload"))
    6064        isLinkPreload = true;
     
    8892
    8993// https://html.spec.whatwg.org/#linkTypes
    90 bool LinkRelAttribute::isSupported(StringView attribute)
     94bool LinkRelAttribute::isSupported(Document& document, StringView attribute)
    9195{
    9296    static const char* const supportedAttributes[] = {
     
    102106    }
    103107
     108    if (document.settings().linkPreconnectEnabled() && equalIgnoringASCIICase(attribute, "preconnect"))
     109        return true;
     110
    104111    if (RuntimeEnabledFeatures::sharedFeatures().linkPreloadEnabled() && equalIgnoringASCIICase(attribute, "preload"))
    105112        return true;
  • trunk/Source/WebCore/html/LinkRelAttribute.h

    r208985 r222613  
    3838namespace WebCore {
    3939
     40class Document;
    4041enum class LinkIconType;
    4142
     
    4647    bool isDNSPrefetch { false };
    4748    bool isLinkPreload { false };
     49    bool isLinkPreconnect { false };
    4850#if ENABLE(LINK_PREFETCH)
    4951    bool isLinkPrefetch { false };
     
    5254
    5355    LinkRelAttribute();
    54     explicit LinkRelAttribute(const String&);
     56    LinkRelAttribute(Document&, const String&);
    5557
    56     static bool isSupported(StringView);
     58    static bool isSupported(Document&, StringView);
    5759};
    5860
  • trunk/Source/WebCore/html/parser/HTMLPreloadScanner.cpp

    r220812 r222613  
    233233                setUrlToLoad(attributeValue);
    234234            else if (match(attributeName, relAttr)) {
    235                 LinkRelAttribute parsedAttribute { attributeValue };
     235                LinkRelAttribute parsedAttribute { document, attributeValue };
    236236                m_linkIsStyleSheet = relAttributeIsStyleSheet(parsedAttribute);
    237237                m_linkIsPreload = parsedAttribute.isLinkPreload;
  • trunk/Source/WebCore/loader/LinkLoader.cpp

    r222422 r222613  
    4848#include "LinkPreloadResourceClients.h"
    4949#include "LinkRelAttribute.h"
     50#include "LoaderStrategy.h"
    5051#include "MIMETypeRegistry.h"
    5152#include "MediaQueryEvaluator.h"
     53#include "PlatformStrategies.h"
     54#include "ResourceError.h"
    5255#include "RuntimeEnabledFeatures.h"
    5356#include "Settings.h"
     
    103106        }
    104107
    105         LinkRelAttribute relAttribute(header.rel());
     108        LinkRelAttribute relAttribute(document, header.rel());
    106109        URL url(baseURL, header.url());
    107110        // Sanity check to avoid re-entrancy here.
     
    251254    }
    252255
     256    if (relAttribute.isLinkPreconnect && href.isValid() && href.protocolIsInHTTPFamily()) {
     257        ASSERT(document.settings().linkPreconnectEnabled());
     258        StoredCredentialsPolicy storageCredentialsPolicy = StoredCredentialsPolicy::Use;
     259        if (equalIgnoringASCIICase(crossOrigin, "anonymous") && document.securityOrigin().canAccess(SecurityOrigin::create(href)))
     260            storageCredentialsPolicy = StoredCredentialsPolicy::DoNotUse;
     261        platformStrategies()->loaderStrategy()->preconnectTo(document.sessionID(), href, storageCredentialsPolicy, [weakDocument = document.createWeakPtr(), href](ResourceError error) {
     262            if (!weakDocument)
     263                return;
     264
     265            if (!error.isNull())
     266                weakDocument->addConsoleMessage(MessageSource::Network, MessageLevel::Error, makeString(ASCIILiteral("Failed to preconnect to "), href.string(), ASCIILiteral(". Error: "), error.localizedDescription()));
     267            else
     268                weakDocument->addConsoleMessage(MessageSource::Network, MessageLevel::Info, makeString(ASCIILiteral("Successfuly preconnected to "), href.string()));
     269        });
     270    }
     271
    253272    if (m_client.shouldLoadLink()) {
    254273        auto resourceClient = preloadIfNeeded(relAttribute, href, document, as, media, mimeType, crossOrigin, this);
  • trunk/Source/WebCore/loader/LoaderStrategy.h

    r222467 r222613  
    2929#include "ResourceLoaderOptions.h"
    3030#include "StoredCredentialsPolicy.h"
     31#include <pal/SessionID.h>
    3132#include <wtf/Forward.h>
    3233#include <wtf/SHA1.h>
     
    6869    virtual void startPingLoad(Frame&, ResourceRequest&, const HTTPHeaderMap& originalRequestHeaders, const FetchOptions&, PingLoadCompletionHandler&& = { }) = 0;
    6970
     71    using PreconnectCompletionHandler = WTF::Function<void(const ResourceError&)>;
     72    virtual void preconnectTo(PAL::SessionID, const URL&, StoredCredentialsPolicy, PreconnectCompletionHandler&&) = 0;
     73
    7074    virtual void storeDerivedDataToCache(const SHA1::Digest& bodyKey, const String& type, const String& partition, WebCore::SharedBuffer&) = 0;
    7175
  • trunk/Source/WebCore/page/Settings.in

    r222006 r222613  
    292292subresourceIntegrityEnabled initial=true
    293293
     294linkPreconnectEnabled initial=false
     295
    294296beaconAPIEnabled initial=false
    295297
  • trunk/Source/WebCore/testing/Internals.cpp

    r222478 r222613  
    131131#include "SpellChecker.h"
    132132#include "StaticNodeList.h"
     133#include "StringCallback.h"
    133134#include "StyleRule.h"
    134135#include "StyleScope.h"
     
    504505        setAutomaticTextReplacementEnabled(true);
    505506    }
     507
     508    setConsoleMessageListener(nullptr);
    506509}
    507510
     
    41784181}
    41794182
     4183void Internals::setConsoleMessageListener(RefPtr<StringCallback>&& listener)
     4184{
     4185    if (!contextDocument())
     4186        return;
     4187
     4188    contextDocument()->setConsoleMessageListener(WTFMove(listener));
     4189}
     4190
    41804191} // namespace WebCore
  • trunk/Source/WebCore/testing/Internals.h

    r222006 r222613  
    7878class SerializedScriptValue;
    7979class SourceBuffer;
     80class StringCallback;
    8081class StyleSheet;
    8182class TimeRanges;
     
    604605    void cacheStorageEngineRepresentation(DOMPromiseDeferred<IDLDOMString>&&);
    605606
     607    void setConsoleMessageListener(RefPtr<StringCallback>&&);
     608
    606609private:
    607610    explicit Internals(Document&);
  • trunk/Source/WebCore/testing/Internals.idl

    r222006 r222613  
    549549    Promise<DOMString> cacheStorageEngineRepresentation();
    550550
     551    void setConsoleMessageListener(StringCallback callback);
     552
    551553    DOMString audioSessionCategory();
    552554};
  • trunk/Source/WebKit/ChangeLog

    r222610 r222613  
     12017-09-28  Chris Dumez  <cdumez@apple.com>
     2
     3        Add support for <link rel=preconnect>
     4        https://bugs.webkit.org/show_bug.cgi?id=177474
     5        <rdar://problem/33141380>
     6
     7        Reviewed by Alex Christensen.
     8
     9        Add support for <link rel=preconnect>:
     10        - https://w3c.github.io/resource-hints/#preconnect
     11
     12        Also add corresponding native private API.
     13
     14        * NetworkProcess/NetworkConnectionToWebProcess.cpp:
     15        (WebKit::NetworkConnectionToWebProcess::preconnectTo):
     16        (WebKit::NetworkConnectionToWebProcess::didFinishPreconnection):
     17        * NetworkProcess/NetworkConnectionToWebProcess.h:
     18        * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
     19        * NetworkProcess/NetworkDataTask.cpp:
     20        (WebKit::NetworkDataTask::create):
     21        * NetworkProcess/NetworkLoadParameters.h:
     22        * NetworkProcess/NetworkProcess.cpp:
     23        (WebKit::NetworkProcess::preconnectTo):
     24        * NetworkProcess/NetworkProcess.h:
     25        * NetworkProcess/NetworkProcess.messages.in:
     26        * NetworkProcess/PreconnectTask.cpp: Added.
     27        (WebKit::PreconnectTask::PreconnectTask):
     28        (WebKit::PreconnectTask::~PreconnectTask):
     29        (WebKit::PreconnectTask::willPerformHTTPRedirection):
     30        (WebKit::PreconnectTask::didReceiveChallenge):
     31        (WebKit::PreconnectTask::didReceiveResponseNetworkSession):
     32        (WebKit::PreconnectTask::didReceiveData):
     33        (WebKit::PreconnectTask::didCompleteWithError):
     34        (WebKit::PreconnectTask::didSendData):
     35        (WebKit::PreconnectTask::wasBlocked):
     36        (WebKit::PreconnectTask::cannotShowURL):
     37        (WebKit::PreconnectTask::didFinish):
     38        * NetworkProcess/PreconnectTask.h: Copied from Source/WebKit/NetworkProcess/NetworkLoadParameters.h.
     39        * NetworkProcess/cocoa/NetworkDataTaskCocoa.h:
     40        * NetworkProcess/cocoa/NetworkDataTaskCocoa.mm:
     41        (WebKit::NetworkDataTaskCocoa::NetworkDataTaskCocoa):
     42        * Shared/WebCoreArgumentCoders.h:
     43        * Shared/WebPreferencesDefinitions.h:
     44        * UIProcess/API/C/WKContext.cpp:
     45        (WKContextPreconnectToServer):
     46        * UIProcess/API/C/WKContextPrivate.h:
     47        * UIProcess/API/Cocoa/WKProcessPool.mm:
     48        (-[WKProcessPool _preconnectToServer:]):
     49        * UIProcess/API/Cocoa/WKProcessPoolPrivate.h:
     50        * UIProcess/WebProcessPool.cpp:
     51        (WebKit::WebProcessPool::preconnectToServer):
     52        * UIProcess/WebProcessPool.h:
     53        * WebKit.xcodeproj/project.pbxproj:
     54        * WebProcess/Network/NetworkProcessConnection.cpp:
     55        (WebKit::NetworkProcessConnection::didFinishPreconnection):
     56        * WebProcess/Network/NetworkProcessConnection.h:
     57        * WebProcess/Network/NetworkProcessConnection.messages.in:
     58        * WebProcess/Network/WebLoaderStrategy.cpp:
     59        (WebKit::WebLoaderStrategy::networkProcessCrashed):
     60        (WebKit::generateLoadIdentifier):
     61        (WebKit::WebLoaderStrategy::startPingLoad):
     62        (WebKit::WebLoaderStrategy::preconnectTo):
     63        (WebKit::WebLoaderStrategy::didFinishPreconnection):
     64        * WebProcess/Network/WebLoaderStrategy.h:
     65        * WebProcess/WebPage/WebPage.cpp:
     66        (WebKit::WebPage::updatePreferences):
     67        * config.h:
     68
    1692017-09-28  Zan Dobersek  <zdobersek@igalia.com>
    270
  • trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp

    r222570 r222613  
    4444#include "NetworkSocketStream.h"
    4545#include "NetworkSocketStreamMessages.h"
     46#include "PreconnectTask.h"
    4647#include "RemoteNetworkingContext.h"
    4748#include "SessionTracker.h"
    4849#include "WebCoreArgumentCoders.h"
     50#include "WebErrors.h"
    4951#include "WebsiteDataStoreParameters.h"
    5052#include <WebCore/NetworkStorageSession.h>
     
    290292}
    291293
     294void NetworkConnectionToWebProcess::preconnectTo(PAL::SessionID sessionID, uint64_t preconnectionIdentifier, const URL& url, WebCore::StoredCredentialsPolicy storedCredentialsPolicy)
     295{
     296#if ENABLE(SERVER_PRECONNECT)
     297    new PreconnectTask(sessionID, url, storedCredentialsPolicy, [this, protectedThis = makeRef(*this), identifier = preconnectionIdentifier] (const ResourceError& error) {
     298        didFinishPreconnection(identifier, error);
     299    });
     300#else
     301    UNUSED_PARAM(storedCredentialsPolicy);
     302    didFinishPreconnection(preconnectionIdentifier, internalError(url));
     303#endif
     304}
     305
     306void NetworkConnectionToWebProcess::didFinishPreconnection(uint64_t preconnectionIdentifier, const ResourceError& error)
     307{
     308    if (!m_connection->isValid())
     309        return;
     310
     311    m_connection->send(Messages::NetworkProcessConnection::DidFinishPreconnection(preconnectionIdentifier, error), 0);
     312}
     313
    292314static NetworkStorageSession& storageSession(PAL::SessionID sessionID)
    293315{
  • trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h

    r221275 r222613  
    7777    NetworkConnectionToWebProcess(IPC::Connection::Identifier);
    7878
     79    void didFinishPreconnection(uint64_t preconnectionIdentifier, const WebCore::ResourceError&);
     80
    7981    // IPC::Connection::Client
    8082    void didReceiveMessage(IPC::Connection&, IPC::Decoder&) override;
     
    9193    void loadPing(NetworkResourceLoadParameters&&, WebCore::HTTPHeaderMap&& originalRequestHeaders);
    9294    void prefetchDNS(const String&);
     95    void preconnectTo(PAL::SessionID, uint64_t preconnectionIdentifier, const WebCore::URL&, WebCore::StoredCredentialsPolicy);
    9396
    9497    void removeLoadIdentifier(ResourceLoadIdentifier);
  • trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in

    r221275 r222613  
    2929    SetDefersLoading(uint64_t resourceLoadIdentifier, bool defers)
    3030    PrefetchDNS(String hostname)
     31    PreconnectTo(PAL::SessionID sessionID, uint64_t preconnectionIdentifier, WebCore::URL url, enum WebCore::StoredCredentialsPolicy storedCredentialsPolicy);
    3132
    3233    StartDownload(PAL::SessionID sessionID, WebKit::DownloadID downloadID, WebCore::ResourceRequest request, String suggestedName)
  • trunk/Source/WebKit/NetworkProcess/NetworkDataTask.cpp

    r222492 r222613  
    5454
    5555#if PLATFORM(COCOA)
    56     return NetworkDataTaskCocoa::create(session, client, parameters.request, parameters.storedCredentialsPolicy, parameters.contentSniffingPolicy, parameters.shouldClearReferrerOnHTTPSToHTTPRedirect);
     56    return NetworkDataTaskCocoa::create(session, client, parameters.request, parameters.storedCredentialsPolicy, parameters.contentSniffingPolicy, parameters.shouldClearReferrerOnHTTPSToHTTPRedirect, parameters.shouldPreconnectOnly);
    5757#endif
    5858#if USE(SOUP)
  • trunk/Source/WebKit/NetworkProcess/NetworkLoadParameters.h

    r222467 r222613  
    3434namespace WebKit {
    3535
     36enum class PreconnectOnly { No, Yes };
     37
    3638class NetworkLoadParameters {
    3739public:
     
    5052    Vector<RefPtr<WebCore::BlobDataFileReference>> blobFileReferences;
    5153#endif
     54    PreconnectOnly shouldPreconnectOnly { PreconnectOnly::No };
    5255};
    5356
  • trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp

    r222396 r222613  
    4141#include "NetworkResourceLoader.h"
    4242#include "NetworkSession.h"
     43#include "PreconnectTask.h"
    4344#include "RemoteNetworkingContext.h"
    4445#include "SessionTracker.h"
     
    726727}
    727728
     729void NetworkProcess::preconnectTo(const WebCore::URL& url, WebCore::StoredCredentialsPolicy storedCredentialsPolicy)
     730{
     731#if ENABLE(SERVER_PRECONNECT)
     732    new PreconnectTask(PAL::SessionID::defaultSessionID(), url, storedCredentialsPolicy);
     733#else
     734    UNUSED_PARAM(url);
     735    UNUSED_PARAM(storedCredentialsPolicy);
     736#endif
     737}
     738
    728739#if !PLATFORM(COCOA)
    729740void NetworkProcess::initializeProcess(const ChildProcessInitializationParameters&)
  • trunk/Source/WebKit/NetworkProcess/NetworkProcess.h

    r222396 r222613  
    5555struct SecurityOriginData;
    5656struct SoupNetworkProxySettings;
     57enum class StoredCredentialsPolicy;
     58class URL;
    5759}
    5860
     
    138140    String cacheStorageDirectory(PAL::SessionID) const;
    139141
     142    void preconnectTo(const WebCore::URL&, WebCore::StoredCredentialsPolicy);
     143
    140144private:
    141145    NetworkProcess();
  • trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in

    r222396 r222613  
    8383    DidGrantSandboxExtensionsToStorageProcessForBlobs(uint64_t requestID)
    8484
     85    PreconnectTo(WebCore::URL url, enum WebCore::StoredCredentialsPolicy storedCredentialsPolicy);
     86
    8587#if HAVE(CFNETWORK_STORAGE_PARTITIONING)
    8688    UpdatePrevalentDomainsToPartitionOrBlockCookies(PAL::SessionID sessionID, Vector<String> domainsToPartition, Vector<String> domainsToBlock, Vector<String> domainsToNeitherPartitionNorBlock, bool shouldClearFirst)
  • trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.h

    r222467 r222613  
    2929
    3030#include "NetworkDataTask.h"
     31#include "NetworkLoadParameters.h"
    3132#include <WebCore/NetworkLoadMetrics.h>
    3233#include <wtf/RetainPtr.h>
     
    4142    friend class NetworkSessionCocoa;
    4243public:
    43     static Ref<NetworkDataTask> create(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& request, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, WebCore::ContentSniffingPolicy shouldContentSniff, bool shouldClearReferrerOnHTTPSToHTTPRedirect)
     44    static Ref<NetworkDataTask> create(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& request, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, WebCore::ContentSniffingPolicy shouldContentSniff, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly shouldPreconnectOnly)
    4445    {
    45         return adoptRef(*new NetworkDataTaskCocoa(session, client, request, storedCredentialsPolicy, shouldContentSniff, shouldClearReferrerOnHTTPSToHTTPRedirect));
     46        return adoptRef(*new NetworkDataTaskCocoa(session, client, request, storedCredentialsPolicy, shouldContentSniff, shouldClearReferrerOnHTTPSToHTTPRedirect, shouldPreconnectOnly));
    4647    }
    4748
     
    7273
    7374private:
    74     NetworkDataTaskCocoa(NetworkSession&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, WebCore::StoredCredentialsPolicy, WebCore::ContentSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect);
     75    NetworkDataTaskCocoa(NetworkSession&, NetworkDataTaskClient&, const WebCore::ResourceRequest&, WebCore::StoredCredentialsPolicy, WebCore::ContentSniffingPolicy, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly);
    7576
    7677    bool tryPasswordBasedAuthentication(const WebCore::AuthenticationChallenge&, ChallengeCompletionHandler&);
  • trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm

    r222467 r222613  
    7575}
    7676
    77 NetworkDataTaskCocoa::NetworkDataTaskCocoa(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& requestWithCredentials, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, WebCore::ContentSniffingPolicy shouldContentSniff, bool shouldClearReferrerOnHTTPSToHTTPRedirect)
     77NetworkDataTaskCocoa::NetworkDataTaskCocoa(NetworkSession& session, NetworkDataTaskClient& client, const WebCore::ResourceRequest& requestWithCredentials, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, WebCore::ContentSniffingPolicy shouldContentSniff, bool shouldClearReferrerOnHTTPSToHTTPRedirect, PreconnectOnly shouldPreconnectOnly)
    7878    : NetworkDataTask(session, client, requestWithCredentials, storedCredentialsPolicy, shouldClearReferrerOnHTTPSToHTTPRedirect)
    7979{
     
    127127        cocoaSession.m_dataTaskMapWithoutState.add([m_task taskIdentifier], this);
    128128        LOG(NetworkSession, "%llu Creating NetworkDataTask with URL %s", [m_task taskIdentifier], nsRequest.URL.absoluteString.UTF8String);
     129    }
     130
     131    if (shouldPreconnectOnly == PreconnectOnly::Yes) {
     132#if ENABLE(SERVER_PRECONNECT)
     133        m_task.get()._preconnect = true;
     134#else
     135        ASSERT_NOT_REACHED();
     136#endif
    129137    }
    130138
  • trunk/Source/WebKit/Shared/WebCoreArgumentCoders.h

    r222595 r222613  
    4040#include <WebCore/RealtimeMediaSource.h>
    4141#include <WebCore/ScrollSnapOffsetsInfo.h>
     42#include <WebCore/StoredCredentialsPolicy.h>
    4243
    4344namespace WTF {
     
    776777};
    777778
     779template <> struct EnumTraits<WebCore::StoredCredentialsPolicy> {
     780    using values = EnumValues<
     781        WebCore::StoredCredentialsPolicy,
     782        WebCore::StoredCredentialsPolicy::DoNotUse,
     783        WebCore::StoredCredentialsPolicy::Use
     784    >;
     785};
     786
    778787} // namespace WTF
  • trunk/Source/WebKit/Shared/WebPreferencesDefinitions.h

    r222490 r222613  
    4444#define DEFAULT_HIDDEN_PAGE_DOM_TIMER_THROTTLING_ENABLED false
    4545#define DEFAULT_HIDDEN_PAGE_CSS_ANIMATION_SUSPENSION_ENABLED false
     46#endif
     47
     48#if ENABLE(SERVER_PRECONNECT)
     49#define DEFAULT_LINK_PRECONNECT_ENABLED true
     50#else
     51#define DEFAULT_LINK_PRECONNECT_ENABLED false
    4652#endif
    4753
     
    182188    macro(JavaScriptCanAccessClipboard, javaScriptCanAccessClipboard, Bool, bool, false, "", "") \
    183189    macro(ShouldPrintBackgrounds, shouldPrintBackgrounds, Bool, bool, DEFAULT_SHOULD_PRINT_BACKGROUNDS, "", "") \
     190    macro(LinkPreconnect, linkPreconnect, Bool, bool, DEFAULT_LINK_PRECONNECT_ENABLED, "", "") \
    184191    macro(FullScreenEnabled, fullScreenEnabled, Bool, bool, false, "", "") \
    185192    macro(AsynchronousSpellCheckingEnabled, asynchronousSpellCheckingEnabled, Bool, bool, false, "", "") \
  • trunk/Source/WebKit/UIProcess/API/C/WKContext.cpp

    r222309 r222613  
    408408}
    409409
     410void WKContextPreconnectToServer(WKContextRef contextRef, WKURLRef serverURLRef)
     411{
     412    toImpl(contextRef)->preconnectToServer(URL(URL(), toWTFString(serverURLRef)));
     413}
     414
    410415WKCookieManagerRef WKContextGetCookieManager(WKContextRef contextRef)
    411416{
  • trunk/Source/WebKit/UIProcess/API/C/WKContextPrivate.h

    r222309 r222613  
    106106WK_EXPORT void WKContextSetFontWhitelist(WKContextRef, WKArrayRef);
    107107
     108WK_EXPORT void WKContextPreconnectToServer(WKContextRef context, WKURLRef serverURL);
     109
    108110WK_EXPORT WKProcessID WKContextGetNetworkProcessIdentifier(WKContextRef context);
    109111WK_EXPORT WKProcessID WKContextGetDatabaseProcessIdentifier(WKContextRef context);
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm

    r220857 r222613  
    416416}
    417417
     418- (void)_preconnectToServer:(NSURL *)serverURL
     419{
     420    _processPool->preconnectToServer(serverURL);
     421}
     422
    418423- (size_t)_pluginProcessCount
    419424{
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h

    r221930 r222613  
    8888+ (void)_forceGameControllerFramework WK_API_AVAILABLE(macosx(10.13), ios(11.0));
    8989
     90- (void)_preconnectToServer:(NSURL *)serverURL WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
     91
    9092@property (nonatomic, getter=_isCookieStoragePartitioningEnabled, setter=_setCookieStoragePartitioningEnabled:) BOOL _cookieStoragePartitioningEnabled WK_API_AVAILABLE(macosx(10.12.3), ios(10.3));
    9193
  • trunk/Source/WebKit/UIProcess/WebProcessPool.cpp

    r222309 r222613  
    11581158}
    11591159
     1160void WebProcessPool::preconnectToServer(const URL& url)
     1161{
     1162    if (!url.isValid() || !url.protocolIsInHTTPFamily())
     1163        return;
     1164
     1165    ensureNetworkProcess().send(Messages::NetworkProcess::PreconnectTo(url, StoredCredentialsPolicy::Use), 0);
     1166}
     1167
    11601168void WebProcessPool::registerURLSchemeAsLocal(const String& urlScheme)
    11611169{
  • trunk/Source/WebKit/UIProcess/WebProcessPool.h

    r222309 r222613  
    217217    void registerURLSchemeAsCORSEnabled(const String&);
    218218    void registerURLSchemeAsCachePartitioned(const String&);
     219    void preconnectToServer(const WebCore::URL&);
    219220
    220221    VisitedLinkStore& visitedLinkStore() { return m_visitedLinkStore.get(); }
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r222583 r222613  
    13811381                839A2F311E2067450039057E /* HighPerformanceGraphicsUsageSampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 839A2F2F1E2067390039057E /* HighPerformanceGraphicsUsageSampler.cpp */; };
    13821382                839A2F321E2067450039057E /* HighPerformanceGraphicsUsageSampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 839A2F301E2067390039057E /* HighPerformanceGraphicsUsageSampler.h */; };
     1383                83A0ED341F747CCD003299EB /* PreconnectTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83A0ED331F747CC7003299EB /* PreconnectTask.cpp */; };
     1384                83A0ED351F747CCF003299EB /* PreconnectTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 83A0ED321F747CC6003299EB /* PreconnectTask.h */; };
    13831385                83BDCCB91AC5FDB6003F6441 /* NetworkCacheStatistics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BDCCB81AC5FDB6003F6441 /* NetworkCacheStatistics.cpp */; };
    13841386                83BFAC421D96137C00433490 /* BlobDownloadClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 83BFAC401D96136000433490 /* BlobDownloadClient.h */; };
     
    37343736                839A2F2F1E2067390039057E /* HighPerformanceGraphicsUsageSampler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HighPerformanceGraphicsUsageSampler.cpp; sourceTree = "<group>"; };
    37353737                839A2F301E2067390039057E /* HighPerformanceGraphicsUsageSampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HighPerformanceGraphicsUsageSampler.h; sourceTree = "<group>"; };
     3738                83A0ED321F747CC6003299EB /* PreconnectTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PreconnectTask.h; path = NetworkProcess/PreconnectTask.h; sourceTree = "<group>"; };
     3739                83A0ED331F747CC7003299EB /* PreconnectTask.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PreconnectTask.cpp; path = NetworkProcess/PreconnectTask.cpp; sourceTree = "<group>"; };
    37363740                83BDCCB81AC5FDB6003F6441 /* NetworkCacheStatistics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkCacheStatistics.cpp; sourceTree = "<group>"; };
    37373741                83BFAC401D96136000433490 /* BlobDownloadClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BlobDownloadClient.h; path = NetworkProcess/Downloads/BlobDownloadClient.h; sourceTree = "<group>"; };
     
    61166120                                462107D71F38DBD300DD7810 /* PingLoad.cpp */,
    61176121                                5CE85B1F1C88E6430070BFCE /* PingLoad.h */,
     6122                                83A0ED331F747CC7003299EB /* PreconnectTask.cpp */,
     6123                                83A0ED321F747CC6003299EB /* PreconnectTask.h */,
    61186124                                E1B78470163F24690007B692 /* RemoteNetworkingContext.h */,
    61196125                        );
     
    87108716                                7CD622781739D863005BD7FF /* PluginSandboxProfile.h in Headers */,
    87118717                                1A6FB7AF11E64B6800DB1371 /* PluginView.h in Headers */,
     8718                                83A0ED351F747CCF003299EB /* PreconnectTask.h in Headers */,
    87128719                                E1CC1B9012D7EADF00625838 /* PrintInfo.h in Headers */,
    87138720                                86F9536518FF58F5001DB2EF /* ProcessAssertion.h in Headers */,
     
    1029110298                                BC82844D16B5081C00A278FE /* PluginServiceEntryPoint.mm in Sources */,
    1029210299                                1A6FB7AE11E64B6800DB1371 /* PluginView.cpp in Sources */,
     10300                                83A0ED341F747CCD003299EB /* PreconnectTask.cpp in Sources */,
    1029310301                                E18C92F412DB9E7100CF2AEB /* PrintInfo.cpp in Sources */,
    1029410302                                E1CC1B9112D7EADF00625838 /* PrintInfoMac.mm in Sources */,
  • trunk/Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp

    r220946 r222613  
    141141}
    142142
     143void NetworkProcessConnection::didFinishPreconnection(uint64_t preconnectionIdentifier, ResourceError&& error)
     144{
     145    WebProcess::singleton().webLoaderStrategy().didFinishPreconnection(preconnectionIdentifier, WTFMove(error));
     146}
     147
    143148#if ENABLE(SHAREABLE_RESOURCE)
    144149void NetworkProcessConnection::didCacheResource(const ResourceRequest& request, const ShareableResource::Handle& handle, PAL::SessionID sessionID)
  • trunk/Source/WebKit/WebProcess/Network/NetworkProcessConnection.h

    r220946 r222613  
    7575    void didWriteBlobsToTemporaryFiles(uint64_t requestIdentifier, const Vector<String>& filenames);
    7676    void didFinishPingLoad(uint64_t pingLoadIdentifier, WebCore::ResourceError&&);
     77    void didFinishPreconnection(uint64_t preconnectionIdentifier, WebCore::ResourceError&&);
    7778
    7879#if ENABLE(SHAREABLE_RESOURCE)
  • trunk/Source/WebKit/WebProcess/Network/NetworkProcessConnection.messages.in

    r220946 r222613  
    2929    DidWriteBlobsToTemporaryFiles(uint64_t requestIdentifier, Vector<String> filenames)
    3030    DidFinishPingLoad(uint64_t pingLoadIdentifier, WebCore::ResourceError error)
     31    DidFinishPreconnection(uint64_t preconnectionIdentifier, WebCore::ResourceError error)
    3132}
  • trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp

    r222467 r222613  
    357357    for (auto& pingLoadCompletionHandler : pingLoadCompletionHandlers.values())
    358358        pingLoadCompletionHandler(internalError(URL()));
     359
     360    auto preconnectCompletionHandlers = WTFMove(m_preconnectCompletionHandlers);
     361    for (auto& preconnectCompletionHandler : preconnectCompletionHandlers.values())
     362        preconnectCompletionHandler(internalError(URL()));
    359363}
    360364
     
    393397}
    394398
    395 static uint64_t generatePingLoadIdentifier()
     399static uint64_t generateLoadIdentifier()
    396400{
    397401    static uint64_t identifier = 0;
     
    423427   
    424428    NetworkResourceLoadParameters loadParameters;
    425     loadParameters.identifier = generatePingLoadIdentifier();
     429    loadParameters.identifier = generateLoadIdentifier();
    426430    loadParameters.request = request;
    427431    loadParameters.sourceOrigin = &document->securityOrigin();
     
    460464}
    461465
     466void WebLoaderStrategy::preconnectTo(PAL::SessionID sessionID, const WebCore::URL& url, StoredCredentialsPolicy storedCredentialsPolicy, PreconnectCompletionHandler&& completionHandler)
     467{
     468    uint64_t preconnectionIdentifier = generateLoadIdentifier();
     469    auto addResult = m_preconnectCompletionHandlers.add(preconnectionIdentifier, WTFMove(completionHandler));
     470    ASSERT_UNUSED(addResult, addResult.isNewEntry);
     471    WebProcess::singleton().networkConnection().connection().send(Messages::NetworkConnectionToWebProcess::PreconnectTo(sessionID, preconnectionIdentifier, url, storedCredentialsPolicy), 0);
     472}
     473
     474void WebLoaderStrategy::didFinishPreconnection(uint64_t preconnectionIdentifier, ResourceError&& error)
     475{
     476    if (auto completionHandler = m_preconnectCompletionHandlers.take(preconnectionIdentifier))
     477        completionHandler(WTFMove(error));
     478}
     479
    462480void WebLoaderStrategy::storeDerivedDataToCache(const SHA1::Digest& bodyHash, const String& type, const String& partition, WebCore::SharedBuffer& data)
    463481{
  • trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h

    r222467 r222613  
    6363    void didFinishPingLoad(uint64_t pingLoadIdentifier, WebCore::ResourceError&&);
    6464
     65    void preconnectTo(PAL::SessionID, const WebCore::URL&, WebCore::StoredCredentialsPolicy, PreconnectCompletionHandler&&) final;
     66    void didFinishPreconnection(uint64_t preconnectionIdentifier, WebCore::ResourceError&&);
     67
    6568    void storeDerivedDataToCache(const SHA1::Digest& bodyHash, const String& type, const String& partition, WebCore::SharedBuffer&) final;
    6669
     
    8790    HashMap<unsigned long, WebURLSchemeTaskProxy*> m_urlSchemeTasks;
    8891    HashMap<unsigned long, PingLoadCompletionHandler> m_pingLoadCompletionHandlers;
     92    HashMap<unsigned long, PreconnectCompletionHandler> m_preconnectCompletionHandlers;
    8993};
    9094
  • trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp

    r222492 r222613  
    30913091    settings.setDOMPasteAllowed(store.getBoolValueForKey(WebPreferencesKey::domPasteAllowedKey()));
    30923092    settings.setJavaScriptCanAccessClipboard(store.getBoolValueForKey(WebPreferencesKey::javaScriptCanAccessClipboardKey()));
     3093    settings.setLinkPreconnectEnabled(store.getBoolValueForKey(WebPreferencesKey::linkPreconnectKey()));
    30933094    settings.setShouldPrintBackgrounds(store.getBoolValueForKey(WebPreferencesKey::shouldPrintBackgroundsKey()));
    30943095    settings.setWebSecurityEnabled(store.getBoolValueForKey(WebPreferencesKey::webSecurityEnabledKey()));
  • trunk/Source/WebKit/config.h

    r221610 r222613  
    8989#endif
    9090
     91#if USE(NETWORK_SESSION) && ((PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101300) || (PLATFORM(IOS) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 110000))
     92#ifndef ENABLE_SERVER_PRECONNECT
     93#define ENABLE_SERVER_PRECONNECT 1
     94#endif
     95#endif
     96
    9197#ifndef HAVE_SEC_ACCESS_CONTROL
    9298#if PLATFORM(IOS) || PLATFORM(MAC)
  • trunk/Source/WebKitLegacy/ChangeLog

    r222526 r222613  
     12017-09-28  Chris Dumez  <cdumez@apple.com>
     2
     3        Add support for <link rel=preconnect>
     4        https://bugs.webkit.org/show_bug.cgi?id=177474
     5        <rdar://problem/33141380>
     6
     7        Reviewed by Alex Christensen.
     8
     9        * WebCoreSupport/WebResourceLoadScheduler.cpp:
     10        (WebResourceLoadScheduler::preconnectTo):
     11        * WebCoreSupport/WebResourceLoadScheduler.h:
     12
    1132017-09-26  Per Arne Vollan  <pvollan@apple.com>
    214
  • trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.cpp

    r222467 r222613  
    370370}
    371371
     372void WebResourceLoadScheduler::preconnectTo(PAL::SessionID, const URL&, StoredCredentialsPolicy, PreconnectCompletionHandler&&)
     373{
     374}
     375
  • trunk/Source/WebKitLegacy/WebCoreSupport/WebResourceLoadScheduler.h

    r222467 r222613  
    6262    void startPingLoad(WebCore::Frame&, WebCore::ResourceRequest&, const WebCore::HTTPHeaderMap&, const WebCore::FetchOptions&, PingLoadCompletionHandler&&) final;
    6363
     64    void preconnectTo(PAL::SessionID, const WebCore::URL&, WebCore::StoredCredentialsPolicy, PreconnectCompletionHandler&&) final;
     65
    6466    void storeDerivedDataToCache(const SHA1::Digest&, const String&, const String&, WebCore::SharedBuffer&) final { }
    6567
Note: See TracChangeset for help on using the changeset viewer.