Changeset 293417 in webkit


Ignore:
Timestamp:
Apr 25, 2022 11:57:34 PM (3 months ago)
Author:
youenn@apple.com
Message:

Service workers should not intercept embed/object related loads
https://bugs.webkit.org/show_bug.cgi?id=239642

Reviewed by Chris Dumez.

LayoutTests/imported/w3c:

  • web-platform-tests/service-workers/service-worker/embed-and-object-are-not-intercepted.https-expected.txt:

Source/WebCore:

In case document loader or image loader are triggered by embed/object elements,
set service worker mode to none.

Covered by rebased test.

  • loader/DocumentLoader.cpp:
  • loader/DocumentLoader.h:
  • loader/ImageLoader.cpp:
Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r293322 r293417  
     12022-04-25  Youenn Fablet  <youenn@apple.com>
     2
     3        Service workers should not intercept embed/object related loads
     4        https://bugs.webkit.org/show_bug.cgi?id=239642
     5
     6        Reviewed by Chris Dumez.
     7
     8        * web-platform-tests/service-workers/service-worker/embed-and-object-are-not-intercepted.https-expected.txt:
     9
    1102022-04-25  Ziran Sun  <zsun@igalia.com>
    211
  • trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/embed-and-object-are-not-intercepted.https-expected.txt

    r267647 r293417  
    11
    22PASS initialize global state
    3 FAIL requests for EMBED elements of embedded HTML content should not be intercepted by service workers assert_equals: expected "request for embedded content was not intercepted" but got "request for embedded content was intercepted by service worker"
    4 FAIL requests for OBJECT elements of embedded HTML content should not be intercepted by service workers assert_equals: expected "request for embedded content was not intercepted" but got "request for embedded content was intercepted by service worker"
    5 FAIL requests for EMBED elements of an image should not be intercepted by service workers assert_equals: expected "request was not intercepted" but got "FAIL: request was intercepted"
    6 FAIL requests for OBJECT elements of an image should not be intercepted by service workers assert_equals: expected "request was not intercepted" but got "FAIL: request was intercepted"
    7 FAIL post-load navigation of OBJECT elements should not be intercepted by service workers assert_equals: expected "request for embedded content was not intercepted" but got "request for embedded content was intercepted by service worker"
    8 FAIL post-load navigation of EMBED elements should not be intercepted by service workers assert_equals: expected "request for embedded content was not intercepted" but got "request for embedded content was intercepted by service worker"
     3PASS requests for EMBED elements of embedded HTML content should not be intercepted by service workers
     4PASS requests for OBJECT elements of embedded HTML content should not be intercepted by service workers
     5PASS requests for EMBED elements of an image should not be intercepted by service workers
     6PASS requests for OBJECT elements of an image should not be intercepted by service workers
     7PASS post-load navigation of OBJECT elements should not be intercepted by service workers
     8PASS post-load navigation of EMBED elements should not be intercepted by service workers
    99PASS restore global state
    1010
  • trunk/Source/WebCore/ChangeLog

    r293409 r293417  
     12022-04-25  Youenn Fablet  <youenn@apple.com>
     2
     3        Service workers should not intercept embed/object related loads
     4        https://bugs.webkit.org/show_bug.cgi?id=239642
     5
     6        Reviewed by Chris Dumez.
     7
     8        In case document loader or image loader are triggered by embed/object elements,
     9        set service worker mode to none.
     10
     11        Covered by rebased test.
     12
     13        * loader/DocumentLoader.cpp:
     14        * loader/DocumentLoader.h:
     15        * loader/ImageLoader.cpp:
     16
    1172022-04-25  Devin Rousso  <drousso@apple.com>
    218
  • trunk/Source/WebCore/loader/DocumentLoader.cpp

    r293309 r293417  
    572572void DocumentLoader::matchRegistration(const URL& url, SWClientConnection::RegistrationCallback&& callback)
    573573{
    574     auto shouldTryLoadingThroughServiceWorker = !frameLoader()->isReloadingFromOrigin() && m_frame->page() && m_frame->settings().serviceWorkersEnabled() && url.protocolIsInHTTPFamily();
     574    bool shouldTryLoadingThroughServiceWorker = m_canUseServiceWorkers && !frameLoader()->isReloadingFromOrigin() && m_frame->page() && url.protocolIsInHTTPFamily();
    575575    if (!shouldTryLoadingThroughServiceWorker) {
    576576        callback(std::nullopt);
     
    892892
    893893#if ENABLE(SERVICE_WORKER)
    894     if (m_frame && m_frame->settings().serviceWorkersEnabled() && response.source() == ResourceResponse::Source::MemoryCache) {
     894    if (m_canUseServiceWorkers && response.source() == ResourceResponse::Source::MemoryCache) {
    895895        matchRegistration(response.url(), [this, protectedThis = Ref { *this }, response, completionHandler = WTFMove(completionHandler)](auto&& registrationData) mutable {
    896896            if (!m_mainDocumentError.isNull() || !m_frame) {
     
    12451245#endif
    12461246#if ENABLE(SERVICE_WORKER)
    1247         if (m_frame && m_frame->settings().serviceWorkersEnabled()) {
     1247        if (m_canUseServiceWorkers) {
    12481248            if (!document.securityOrigin().isUnique()) {
    12491249                if (m_serviceWorkerRegistrationData && m_serviceWorkerRegistrationData->activeWorker) {
     
    20202020}
    20212021
     2022#if ENABLE(SERVICE_WORKER)
     2023static bool canUseServiceWorkers(Frame* frame)
     2024{
     2025    if (!frame || !frame->settings().serviceWorkersEnabled())
     2026        return false;
     2027    auto* ownerElement = frame->ownerElement();
     2028    return !ownerElement || !is<HTMLPlugInElement>(ownerElement);
     2029}
     2030#endif
     2031
    20222032void DocumentLoader::startLoadingMainResource()
    20232033{
     2034#if ENABLE(SERVICE_WORKER)
     2035    m_canUseServiceWorkers = canUseServiceWorkers(m_frame.get());
     2036#endif
    20242037    m_mainDocumentError = ResourceError();
    20252038    timing().markStartTime();
     
    21392152
    21402153#if ENABLE(SERVICE_WORKER)
    2141     if (m_frame && m_frame->settings().serviceWorkersEnabled()) {
    2142         if (!isSandboxingAllowingServiceWorkerFetchHandling(frameLoader()->effectiveSandboxFlags()))
    2143             mainResourceLoadOptions.serviceWorkersMode = ServiceWorkersMode::None;
    2144         else {
    2145             // The main navigation load will trigger the registration of the client.
    2146             if (m_resultingClientId)
    2147                 scriptExecutionContextIdentifierToLoaderMap().remove(m_resultingClientId);
    2148             m_resultingClientId = ScriptExecutionContextIdentifier::generate();
    2149             ASSERT(!scriptExecutionContextIdentifierToLoaderMap().contains(m_resultingClientId));
    2150             scriptExecutionContextIdentifierToLoaderMap().add(m_resultingClientId, this);
    2151             mainResourceLoadOptions.clientIdentifier = m_resultingClientId;
    2152         }
     2154    if (!m_canUseServiceWorkers || !isSandboxingAllowingServiceWorkerFetchHandling(frameLoader()->effectiveSandboxFlags()))
     2155        mainResourceLoadOptions.serviceWorkersMode = ServiceWorkersMode::None;
     2156    else {
     2157        // The main navigation load will trigger the registration of the client.
     2158        if (m_resultingClientId)
     2159            scriptExecutionContextIdentifierToLoaderMap().remove(m_resultingClientId);
     2160        m_resultingClientId = ScriptExecutionContextIdentifier::generate();
     2161        ASSERT(!scriptExecutionContextIdentifierToLoaderMap().contains(m_resultingClientId));
     2162        scriptExecutionContextIdentifierToLoaderMap().add(m_resultingClientId, this);
     2163        mainResourceLoadOptions.clientIdentifier = m_resultingClientId;
    21532164    }
    21542165#endif
  • trunk/Source/WebCore/loader/DocumentLoader.h

    r293195 r293417  
    709709#if ENABLE(SERVICE_WORKER)
    710710    std::optional<ServiceWorkerRegistrationData> m_serviceWorkerRegistrationData;
     711    bool m_canUseServiceWorkers { true };
    711712#endif
    712713    ScriptExecutionContextIdentifier m_resultingClientId;
  • trunk/Source/WebCore/loader/ImageLoader.cpp

    r292801 r293417  
    193193        options.loadedFromPluginElement = is<HTMLPlugInElement>(element()) ? LoadedFromPluginElement::Yes : LoadedFromPluginElement::No;
    194194        options.sameOriginDataURLFlag = SameOriginDataURLFlag::Set;
     195        options.serviceWorkersMode = is<HTMLPlugInElement>(element()) ? ServiceWorkersMode::None : ServiceWorkersMode::All;
    195196        bool isImageElement = is<HTMLImageElement>(element());
    196197        if (isImageElement)
Note: See TracChangeset for help on using the changeset viewer.