Changeset 292468 in webkit


Ignore:
Timestamp:
Apr 6, 2022 8:20:50 AM (4 months ago)
Author:
youenn@apple.com
Message:

In case of COOP-based process swap, we need to make sure the document gets controlled by its matching service worker registration
https://bugs.webkit.org/show_bug.cgi?id=238800
<rdar://problem/91288849>

Reviewed by Chris Dumez.

Source/WebKit:

Make sure in case loader is transferred to call controlClient in the new WebProcess.
To do so, we also update page and frame IDs.
Covered by API test.

  • NetworkProcess/NetworkConnectionToWebProcess.cpp:
  • NetworkProcess/NetworkLoadParameters.h:
  • NetworkProcess/NetworkResourceLoadParameters.h:
  • NetworkProcess/NetworkResourceLoader.cpp:
  • NetworkProcess/NetworkResourceLoader.h:
  • NetworkProcess/ServiceWorker/WebSWServerConnection.cpp:
  • NetworkProcess/ServiceWorker/WebSWServerConnection.h:

Tools:

  • TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm:
Location:
trunk
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r292461 r292468  
     12022-04-06  Youenn Fablet  <youenn@apple.com>
     2
     3        In case of COOP-based process swap, we need to make sure the document gets controlled by its matching service worker registration
     4        https://bugs.webkit.org/show_bug.cgi?id=238800
     5        <rdar://problem/91288849>
     6
     7        Reviewed by Chris Dumez.
     8
     9        Make sure in case loader is transferred to call controlClient in the new WebProcess.
     10        To do so, we also update page and frame IDs.
     11        Covered by API test.
     12
     13        * NetworkProcess/NetworkConnectionToWebProcess.cpp:
     14        * NetworkProcess/NetworkLoadParameters.h:
     15        * NetworkProcess/NetworkResourceLoadParameters.h:
     16        * NetworkProcess/NetworkResourceLoader.cpp:
     17        * NetworkProcess/NetworkResourceLoader.h:
     18        * NetworkProcess/ServiceWorker/WebSWServerConnection.cpp:
     19        * NetworkProcess/ServiceWorker/WebSWServerConnection.h:
     20
    1212022-04-06  Kimmo Kinnunen  <kkinnunen@apple.com>
    222
  • trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp

    r292197 r292468  
    590590                CONNECTION_RELEASE_LOG(Loading, "scheduleResourceLoad: Resuming existing NetworkResourceLoader");
    591591                m_networkResourceLoaders.add(identifier, *existingLoader);
    592                 existingLoader->transferToNewWebProcess(*this, identifier);
     592                existingLoader->transferToNewWebProcess(*this, loadParameters);
    593593                return;
    594594            }
  • trunk/Source/WebKit/NetworkProcess/NetworkLoadParameters.h

    r289134 r292468  
    4545class NetworkLoadParameters {
    4646public:
    47     WebPageProxyIdentifier webPageProxyID;
    48     WebCore::PageIdentifier webPageID;
    49     WebCore::FrameIdentifier webFrameID;
     47    mutable WebPageProxyIdentifier webPageProxyID;
     48    mutable WebCore::PageIdentifier webPageID;
     49    mutable WebCore::FrameIdentifier webFrameID;
    5050    RefPtr<WebCore::SecurityOrigin> topOrigin;
    5151    RefPtr<WebCore::SecurityOrigin> sourceOrigin;
  • trunk/Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.h

    r287010 r292468  
    5757    RefPtr<SandboxExtension> resourceSandboxExtension; // Created automatically for the sender.
    5858    mutable Seconds maximumBufferingTime;
    59     WebCore::FetchOptions options;
     59    mutable WebCore::FetchOptions options;
    6060    std::optional<WebCore::ContentSecurityPolicyResponseHeaders> cspResponseHeaders;
    6161    WebCore::CrossOriginEmbedderPolicy parentCrossOriginEmbedderPolicy;
  • trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp

    r292197 r292468  
    577577}
    578578
    579 void NetworkResourceLoader::transferToNewWebProcess(NetworkConnectionToWebProcess& newConnection, WebCore::ResourceLoaderIdentifier newCoreIdentifier)
     579void NetworkResourceLoader::transferToNewWebProcess(NetworkConnectionToWebProcess& newConnection, const NetworkResourceLoadParameters& parameters)
    580580{
    581581    m_connection = newConnection;
    582     m_parameters.identifier = newCoreIdentifier;
     582    m_parameters.identifier = parameters.identifier;
     583    m_parameters.webPageProxyID = parameters.webPageProxyID;
     584    m_parameters.webPageID = parameters.webPageID;
     585    m_parameters.webFrameID = parameters.webFrameID;
     586    m_parameters.options.clientIdentifier = parameters.options.clientIdentifier;
    583587
    584588#if ENABLE(SERVICE_WORKER)
    585589    ASSERT(m_responseCompletionHandler || m_cacheEntryWaitingForContinueDidReceiveResponse || m_serviceWorkerFetchTask);
     590    if (m_serviceWorkerRegistration) {
     591        if (auto* swConnection = newConnection.swConnection())
     592            swConnection->transferServiceWorkerLoadToNewWebProcess(*this, *m_serviceWorkerRegistration);
     593    }
    586594#else
    587595    ASSERT(m_responseCompletionHandler || m_cacheEntryWaitingForContinueDidReceiveResponse);
     
    12091217#if ENABLE(SERVICE_WORKER)
    12101218    if (parameters().options.mode == FetchOptions::Mode::Navigate) {
     1219        m_serviceWorkerRegistration = { };
    12111220        if (auto serviceWorkerFetchTask = m_connection->createFetchTask(*this, newRequest)) {
    12121221            LOADER_RELEASE_LOG("continueWillSendRequest: Created a ServiceWorkerFetchTask to handle the redirect (fetchIdentifier=%" PRIu64 ")", serviceWorkerFetchTask->fetchIdentifier().toUInt64());
  • trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.h

    r292197 r292468  
    4141#include <WebCore/PrivateClickMeasurement.h>
    4242#include <WebCore/ResourceResponse.h>
     43#include <WebCore/SWServerRegistration.h>
    4344#include <WebCore/SecurityPolicyViolationEvent.h>
    4445#include <WebCore/SharedBuffer.h>
     
    9495    void abort();
    9596
    96     void transferToNewWebProcess(NetworkConnectionToWebProcess&, WebCore::ResourceLoaderIdentifier);
     97    void transferToNewWebProcess(NetworkConnectionToWebProcess&, const NetworkResourceLoadParameters&);
    9798
    9899    // Message handlers.
     
    155156    void setResultingClientIdentifier(String&& identifier) { m_resultingClientIdentifier = WTFMove(identifier); }
    156157    const String& resultingClientIdentifier() const { return m_resultingClientIdentifier; }
     158    void setServiceWorkerRegistration(WebCore::SWServerRegistration& serviceWorkerRegistration) { m_serviceWorkerRegistration = serviceWorkerRegistration; }
    157159#endif
    158160
     
    289291    std::unique_ptr<ServiceWorkerFetchTask> m_serviceWorkerFetchTask;
    290292    String m_resultingClientIdentifier;
     293    WeakPtr<WebCore::SWServerRegistration> m_serviceWorkerRegistration;
    291294#endif
    292295    NetworkResourceLoadIdentifier m_resourceLoadID;
  • trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp

    r292459 r292468  
    205205        controlClient(loader.parameters(), *registration, request);
    206206        loader.setResultingClientIdentifier(loader.parameters().options.clientIdentifier->toString());
     207        loader.setServiceWorkerRegistration(*registration);
    207208    } else {
    208209        if (!loader.parameters().serviceWorkerRegistrationIdentifier)
     
    667668}
    668669
     670void WebSWServerConnection::transferServiceWorkerLoadToNewWebProcess(NetworkResourceLoader& loader, WebCore::SWServerRegistration& registration)
     671{
     672    controlClient(loader.parameters(), registration, loader.originalRequest());
     673}
     674
    669675} // namespace WebKit
    670676
  • trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.h

    r292459 r292468  
    8585    void fetchTaskTimedOut(WebCore::ServiceWorkerIdentifier);
    8686
     87    void transferServiceWorkerLoadToNewWebProcess(NetworkResourceLoader&, WebCore::SWServerRegistration&);
     88
    8789private:
    8890    // Implement SWServer::Connection (Messages to the client WebProcess)
  • trunk/Tools/ChangeLog

    r292464 r292468  
     12022-04-06  Youenn Fablet  <youenn@apple.com>
     2
     3        In case of COOP-based process swap, we need to make sure the document gets controlled by its matching service worker registration
     4        https://bugs.webkit.org/show_bug.cgi?id=238800
     5        <rdar://problem/91288849>
     6
     7        Reviewed by Chris Dumez.
     8
     9        * TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm:
     10
    1112022-04-06  Carlos Garcia Campos  <cgarcia@igalia.com>
    212
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm

    r292459 r292468  
    30783078"    };"
    30793079"}"
     3080""
     3081"function countServiceWorkerClients() {"
     3082"    worker.postMessage('countServiceWorkerClients');"
     3083"    navigator.serviceWorker.onmessage = (event) => {"
     3084"        alert(event.data);"
     3085"    };"
     3086"}"
    30803087"</script>"_s;
    30813088
     
    31003107"       return;"
    31013108"   }"
     3109"   if (event.data === 'countServiceWorkerClients') {"
     3110"       let currentClients = await self.clients.matchAll();"
     3111"       event.source.postMessage(currentClients.length + ' client(s)');"
     3112"       return;"
     3113"   }"
    31023114"});"_s;
    31033115
     
    31803192    [webView1 evaluateJavaScript:[NSString stringWithFormat:@"navigateOtherClientToURL('%@?swap')", baseURL] completionHandler: nil];
    31813193    EXPECT_WK_STREQ([webView1 _test_waitForAlert], "client");
     3194
     3195    [webView1 evaluateJavaScript:@"countServiceWorkerClients()" completionHandler: nil];
     3196    EXPECT_WK_STREQ([webView1 _test_waitForAlert], "1 client(s)");
    31823197}
    31833198
Note: See TracChangeset for help on using the changeset viewer.