⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 294819 in webkit


Ignore:
Timestamp:
May 25, 2022, 12:53:21 PM (4 years ago)
Author:
Patrick Griffis
Message:

Add support for Link nonces
​https://bugs.webkit.org/show_bug.cgi?id=240817

This reads the nonce from link elements and Link headers.

This was implemented by Chromium in 2017 to be consistent with the HTMLPreloader:
​https://chromium-review.googlesource.com/c/chromium/src/+/676769/

Reviewed by Kate Cheney.

  • LayoutTests/imported/w3c/web-platform-tests/preload/link-header-preload-nonce-expected.txt:
  • LayoutTests/imported/w3c/web-platform-tests/preload/link-header-preload-nonce.html:

These test changes were already upstream: ​https://github.com/web-platform-tests/wpt/commit/306dc506adba97ca84ada67bdab6227dba65bbcb

  • Source/WebCore/html/HTMLLinkElement.cpp:

(WebCore::HTMLLinkElement::process):

  • Source/WebCore/loader/LinkHeader.cpp:

(WebCore::paramterNameFromString):
(WebCore::LinkHeader::setValue):

  • Source/WebCore/loader/LinkHeader.h:

(WebCore::LinkHeader::nonce const):

  • Source/WebCore/loader/LinkLoader.cpp:

(WebCore::LinkLoader::loadLinksFromHeader):
(WebCore::LinkLoader::preloadIfNeeded):
(WebCore::LinkLoader::prefetchIfNeeded):

  • Source/WebCore/loader/LinkLoader.h:

Canonical link: ​https://commits.webkit.org/250972@main

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/imported/w3c/web-platform-tests/preload/link-header-preload-nonce-expected.txt

    r259900 r294819  
    11CONSOLE MESSAGE: Refused to load http://localhost:8800/preload/resources/dummy.js?from-header&without-nonce because it does not appear in the script-src directive of the Content Security Policy.
    2 CONSOLE MESSAGE: Refused to load http://localhost:8800/preload/resources/dummy.js?from-header&with-nonce because it does not appear in the script-src directive of the Content Security Policy.
    3 CONSOLE MESSAGE: Error: assert_equals: resources/dummy.js?from-header&with-nonce expected 1 but got 0
    42
    5 Harness Error (FAIL), message = Error: assert_equals: resources/dummy.js?from-header&with-nonce expected 1 but got 0
     3PASS Makes sure that Link headers preload resources with CSP nonce
    64
    7 
  • trunk/LayoutTests/imported/w3c/web-platform-tests/preload/link-header-preload-nonce.html

    r246045 r294819  
    66<body>
    77<script nonce="abc">
    8     setup({explicit_done: true});
     8    setup({single_test: true});
    99
    1010    var iterations = 0;
  • trunk/Source/WebCore/html/HTMLLinkElement.cpp

    r294611 r294819  
    264264        attributeWithoutSynchronization(imagesrcsetAttr),
    265265        attributeWithoutSynchronization(imagesizesAttr),
     266        nonce(),
    266267        referrerPolicy(),
    267268    };
  • trunk/Source/WebCore/loader/LinkHeader.cpp

    r293484 r294819  
    158158    if (equalLettersIgnoringASCIICase(name, "imagesizes"_s))
    159159        return LinkHeader::LinkParameterImageSizes;
     160    if (equalLettersIgnoringASCIICase(name, "nonce"_s))
     161        return LinkHeader::LinkParameterNonce;
    160162    return LinkHeader::LinkParameterUnknown;
    161163}
    … …  
    281283        m_imageSizes = WTFMove(value);
    282284        break;
     285    case LinkParameterNonce:
     286        m_nonce = WTFMove(value);
     287        break;
    283288    case LinkParameterTitle:
    284289    case LinkParameterRev:
  • trunk/Source/WebCore/loader/LinkHeader.h

    r265177 r294819  
    4545    const String& imageSrcSet() const { return m_imageSrcSet; }
    4646    const String& imageSizes() const { return m_imageSizes; }
     47    const String& nonce() const { return m_nonce; }
    4748    bool valid() const { return m_isValid; }
    4849    bool isViewportDependent() const { return !media().isEmpty() || !imageSrcSet().isEmpty() || !imageSizes().isEmpty(); }
    … …  
    6263        LinkParameterImageSrcSet,
    6364        LinkParameterImageSizes,
     65        LinkParameterNonce,
    6466    };
    6567
    … …  
    7577    String m_imageSrcSet;
    7678    String m_imageSizes;
     79    String m_nonce;
    7780    bool m_isValid { true };
    7881};
  • trunk/Source/WebCore/loader/LinkLoader.cpp

    r293563 r294819  
    113113            continue;
    114114
    115         LinkLoadParameters params { relAttribute, url, header.as(), header.media(), header.mimeType(), header.crossOrigin(), header.imageSrcSet(), header.imageSizes(), ReferrerPolicy::EmptyString };
     115        LinkLoadParameters params { relAttribute, url, header.as(), header.media(), header.mimeType(), header.crossOrigin(), header.imageSrcSet(), header.imageSizes(), header.nonce(), ReferrerPolicy::EmptyString };
    116116        preconnectIfNeeded(params, document);
    117117        preloadIfNeeded(params, document, nullptr);
    … …  
    262262    auto options = CachedResourceLoader::defaultCachedResourceOptions();
    263263    options.referrerPolicy = params.referrerPolicy;
     264    options.nonce = params.nonce;
    264265    auto linkRequest = createPotentialAccessControlRequest(url, WTFMove(options), document, params.crossOrigin);
    265266    linkRequest.setPriority(DefaultResourceLoadPriority::forResourceType(type.value()));
    … …  
    303304    options.cachingPolicy = CachingPolicy::DisallowCaching;
    304305    options.referrerPolicy = params.referrerPolicy;
     306    options.nonce = params.nonce;
    305307    m_cachedLinkResource = document.cachedResourceLoader().requestLinkResource(type, CachedResourceRequest(ResourceRequest { document.completeURL(params.href.string()) }, options, priority)).value_or(nullptr);
    306308    if (m_cachedLinkResource)
  • trunk/Source/WebCore/loader/LinkLoader.h

    r293804 r294819  
    5353    String imageSrcSet;
    5454    String imageSizes;
     55    String nonce;
    5556    ReferrerPolicy referrerPolicy { ReferrerPolicy::EmptyString };
    5657};
Note: See TracChangeset for help on using the changeset viewer.