Title: [293173] trunk
Revision
293173
Author
you...@apple.com
Date
2022-04-21 09:55:46 -0700 (Thu, 21 Apr 2022)

Log Message

A suspended remote shared worker should resume when a new SharedWorker is added
https://bugs.webkit.org/show_bug.cgi?id=239325

Reviewed by Chris Dumez.

Source/WebKit:

Check whether resuming/suspending remote shared worker in case of added/removed SharedWorker object.
Make sure to suspend the remote shared worker at launch time if needed.

Covered by updated test.

* NetworkProcess/SharedWorker/WebSharedWorker.cpp:
* NetworkProcess/SharedWorker/WebSharedWorker.h:
* NetworkProcess/SharedWorker/WebSharedWorkerServer.cpp:

LayoutTests:

* http/tests/navigation/page-cache-shared-worker-expected.txt:
* http/tests/navigation/page-cache-shared-worker.html:
* http/tests/navigation/resources/page-cache-helper-for-sharedworker.html:
* http/tests/navigation/resources/shared-worker-script.js:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (293172 => 293173)


--- trunk/LayoutTests/ChangeLog	2022-04-21 16:28:29 UTC (rev 293172)
+++ trunk/LayoutTests/ChangeLog	2022-04-21 16:55:46 UTC (rev 293173)
@@ -1,3 +1,15 @@
+2022-04-21  Youenn Fablet  <you...@apple.com>
+
+        A suspended remote shared worker should resume when a new SharedWorker is added
+        https://bugs.webkit.org/show_bug.cgi?id=239325
+
+        Reviewed by Chris Dumez.
+
+        * http/tests/navigation/page-cache-shared-worker-expected.txt:
+        * http/tests/navigation/page-cache-shared-worker.html:
+        * http/tests/navigation/resources/page-cache-helper-for-sharedworker.html:
+        * http/tests/navigation/resources/shared-worker-script.js:
+
 2022-04-21  Karl Rackler  <rack...@apple.com>
 
         [ macOS Release ] webanimations/css-transition-retargeting-during-ready-promise.html is a flaky failure

Modified: trunk/LayoutTests/http/tests/navigation/page-cache-shared-worker-expected.txt (293172 => 293173)


--- trunk/LayoutTests/http/tests/navigation/page-cache-shared-worker-expected.txt	2022-04-21 16:28:29 UTC (rev 293172)
+++ trunk/LayoutTests/http/tests/navigation/page-cache-shared-worker-expected.txt	2022-04-21 16:55:46 UTC (rev 293173)
@@ -8,6 +8,7 @@
 pageshow - from cache
 PASS Page did enter and was restored from the page cache
 PASS counter is below 100
+PASS state is "hungry"
 PASS successfullyParsed is true
 
 TEST COMPLETE

Modified: trunk/LayoutTests/http/tests/navigation/page-cache-shared-worker.html (293172 => 293173)


--- trunk/LayoutTests/http/tests/navigation/page-cache-shared-worker.html	2022-04-21 16:28:29 UTC (rev 293172)
+++ trunk/LayoutTests/http/tests/navigation/page-cache-shared-worker.html	2022-04-21 16:55:46 UTC (rev 293173)
@@ -8,7 +8,8 @@
 window.jsTestIsAsync = true;
 
 var restoredFromPageCache = false;
-var sw;
+var sw1, sw2;
+var state;
 
 window.addEventListener("pageshow", async function(event) {
     debug("pageshow - " + (event.persisted ? "" : "not ") + "from cache");
@@ -17,13 +18,17 @@
         testPassed("Page did enter and was restored from the page cache");
         restoredFromPageCache = true;
 
-        sw.port.postMessage('counter');
-        const counter = await new Promise(resolve => sw.port._onmessage_ = (event) => resolve(event.data));
+        sw1.port.postMessage('counter');
+        const counter = await new Promise(resolve => sw1.port._onmessage_ = (event) => resolve(event.data));
         if (counter < 100)
             testPassed("counter is below 100");
         else
             testFailed("counter is above 100");
 
+        sw2.port.postMessage('getState');
+        state = await new Promise(resolve => sw2.port._onmessage_ = (event) => resolve(event.data));
+        shouldBeEqualToString("state", "hungry");
+
         setTimeout(finishJSTest, 0);
     }
 }, false);
@@ -37,7 +42,8 @@
 }, false);
 
 window.addEventListener('load', function() {
-    sw = new SharedWorker('resources/shared-worker-script.js');
+    sw1 = new SharedWorker('resources/shared-worker-script.js?1');
+    sw2 = new SharedWorker('resources/shared-worker-script.js?2');
     setTimeout(function() {
       // Force a back navigation back to this page.
       window.location.href = ""

Modified: trunk/LayoutTests/http/tests/navigation/resources/page-cache-helper-for-sharedworker.html (293172 => 293173)


--- trunk/LayoutTests/http/tests/navigation/resources/page-cache-helper-for-sharedworker.html	2022-04-21 16:28:29 UTC (rev 293172)
+++ trunk/LayoutTests/http/tests/navigation/resources/page-cache-helper-for-sharedworker.html	2022-04-21 16:55:46 UTC (rev 293173)
@@ -10,7 +10,7 @@
         return;
 
     channel.postMessage('ping');
-    return new Promise((resolve, reject) => {
+    await new Promise((resolve, reject) => {
          let myTimer = setTimeout(resolve, 1000);
          channel._onmessage_ = async () => {
              clearTimeout(myTimer);
@@ -19,6 +19,10 @@
              doTest(++counter).then(resolve, reject);
          };
     });
+
+    const sw2 = new SharedWorker('shared-worker-script.js?2');
+    sw2.port.postMessage({ action: 'setState', state: 'hungry' });
+    await new Promise(resolve => sw2.port._onmessage_ = resolve);
 }
 
 window.addEventListener("load", async () => {

Modified: trunk/LayoutTests/http/tests/navigation/resources/shared-worker-script.js (293172 => 293173)


--- trunk/LayoutTests/http/tests/navigation/resources/shared-worker-script.js	2022-04-21 16:28:29 UTC (rev 293172)
+++ trunk/LayoutTests/http/tests/navigation/resources/shared-worker-script.js	2022-04-21 16:55:46 UTC (rev 293173)
@@ -1,5 +1,6 @@
 var channel = new BroadcastChannel('shared-worker');
 var counter = 0;
+var state = 'empty';
 channel._onmessage_ = (event) => {
     if (event.data ="" 'ping') {
         counter++;
@@ -9,7 +10,17 @@
 self._onconnect_ = function(e) {
     const port = e.ports[0];
     port._onmessage_ = (event) => {
-        if (event.data ="" 'counter')
+        if (event.data ="" 'counter') {
             port.postMessage(counter);
+            return;
+        }
+        if (event.data ="" 'getState') {
+            port.postMessage(state);
+            return;
+        }
+        if (event.data.action ="" 'setState') {
+            state = event.data.state;
+            port.postMessage('ok');
+        }
     };
 }

Modified: trunk/Source/WebKit/ChangeLog (293172 => 293173)


--- trunk/Source/WebKit/ChangeLog	2022-04-21 16:28:29 UTC (rev 293172)
+++ trunk/Source/WebKit/ChangeLog	2022-04-21 16:55:46 UTC (rev 293173)
@@ -1,3 +1,19 @@
+2022-04-21  Youenn Fablet  <you...@apple.com>
+
+        A suspended remote shared worker should resume when a new SharedWorker is added
+        https://bugs.webkit.org/show_bug.cgi?id=239325
+
+        Reviewed by Chris Dumez.
+
+        Check whether resuming/suspending remote shared worker in case of added/removed SharedWorker object.
+        Make sure to suspend the remote shared worker at launch time if needed.
+
+        Covered by updated test.
+
+        * NetworkProcess/SharedWorker/WebSharedWorker.cpp:
+        * NetworkProcess/SharedWorker/WebSharedWorker.h:
+        * NetworkProcess/SharedWorker/WebSharedWorkerServer.cpp:
+
 2022-04-21  Eric Carlson  <eric.carl...@apple.com>
 
         AVSampleBufferRenderSynchronizer timeline sometimes goes backwards when playback begins

Modified: trunk/Source/WebKit/NetworkProcess/SharedWorker/WebSharedWorker.cpp (293172 => 293173)


--- trunk/Source/WebKit/NetworkProcess/SharedWorker/WebSharedWorker.cpp	2022-04-21 16:28:29 UTC (rev 293172)
+++ trunk/Source/WebKit/NetworkProcess/SharedWorker/WebSharedWorker.cpp	2022-04-21 16:55:46 UTC (rev 293173)
@@ -72,17 +72,35 @@
     return WebCore::RegistrableDomain { url() };
 }
 
+void WebSharedWorker::setFetchResult(WebCore::WorkerFetchResult&& fetchResult, WebSharedWorkerServerToContextConnection* contextConnection)
+{
+    m_fetchResult = WTFMove(fetchResult);
+    if (contextConnection)
+        launch(*contextConnection);
+}
+
 void WebSharedWorker::didCreateContextConnection(WebSharedWorkerServerToContextConnection& contextConnection)
 {
     for (auto& sharedWorkerObjectIdentifier : m_sharedWorkerObjects.keys())
         contextConnection.addSharedWorkerObject(sharedWorkerObjectIdentifier);
+    if (didFinishFetching())
+        launch(contextConnection);
 }
 
+void WebSharedWorker::launch(WebSharedWorkerServerToContextConnection& connection)
+{
+    connection.launchSharedWorker(*this);
+    if (m_isSuspended)
+        connection.suspendSharedWorker(identifier());
+}
+
 void WebSharedWorker::addSharedWorkerObject(WebCore::SharedWorkerObjectIdentifier sharedWorkerObjectIdentifier, const WebCore::TransferredMessagePort& port)
 {
     m_sharedWorkerObjects.add(sharedWorkerObjectIdentifier, SharedWorkerObjectState { false, port });
     if (auto* connection = contextConnection())
         connection->addSharedWorkerObject(sharedWorkerObjectIdentifier);
+
+    resumeIfNeeded();
 }
 
 void WebSharedWorker::removeSharedWorkerObject(WebCore::SharedWorkerObjectIdentifier sharedWorkerObjectIdentifier)
@@ -90,6 +108,8 @@
     m_sharedWorkerObjects.remove(sharedWorkerObjectIdentifier);
     if (auto* connection = contextConnection())
         connection->removeSharedWorkerObject(sharedWorkerObjectIdentifier);
+
+    suspendIfNeeded();
 }
 
 void WebSharedWorker::suspend(WebCore::SharedWorkerObjectIdentifier sharedWorkerObjectIdentifier)
@@ -100,6 +120,12 @@
 
     iterator->value.isSuspended = true;
     ASSERT(!m_isSuspended);
+
+    suspendIfNeeded();
+}
+
+void WebSharedWorker::suspendIfNeeded()
+{
     if (m_isSuspended)
         return;
 
@@ -120,6 +146,12 @@
         return;
 
     iterator->value.isSuspended = false;
+
+    resumeIfNeeded();
+}
+
+void WebSharedWorker::resumeIfNeeded()
+{
     if (!m_isSuspended)
         return;
 

Modified: trunk/Source/WebKit/NetworkProcess/SharedWorker/WebSharedWorker.h (293172 => 293173)


--- trunk/Source/WebKit/NetworkProcess/SharedWorker/WebSharedWorker.h	2022-04-21 16:28:29 UTC (rev 293172)
+++ trunk/Source/WebKit/NetworkProcess/SharedWorker/WebSharedWorker.h	2022-04-21 16:55:46 UTC (rev 293173)
@@ -72,7 +72,7 @@
     void markAsRunning() { m_isRunning = true; }
 
     const WebCore::WorkerFetchResult& fetchResult() const { return m_fetchResult; }
-    void setFetchResult(WebCore::WorkerFetchResult&& fetchResult) { m_fetchResult = WTFMove(fetchResult); }
+    void setFetchResult(WebCore::WorkerFetchResult&&, WebSharedWorkerServerToContextConnection*);
     bool didFinishFetching() const { return !!m_fetchResult.script; }
 
 private:
@@ -81,6 +81,10 @@
     WebSharedWorker(const WebSharedWorker&) = delete;
     WebSharedWorker& operator=(const WebSharedWorker&) = delete;
 
+    void suspendIfNeeded();
+    void resumeIfNeeded();
+    void launch(WebSharedWorkerServerToContextConnection&);
+
     struct SharedWorkerObjectState {
         bool isSuspended { false };
         WebCore::TransferredMessagePort port;

Modified: trunk/Source/WebKit/NetworkProcess/SharedWorker/WebSharedWorkerServer.cpp (293172 => 293173)


--- trunk/Source/WebKit/NetworkProcess/SharedWorker/WebSharedWorkerServer.cpp	2022-04-21 16:28:29 UTC (rev 293172)
+++ trunk/Source/WebKit/NetworkProcess/SharedWorker/WebSharedWorkerServer.cpp	2022-04-21 16:55:46 UTC (rev 293173)
@@ -107,13 +107,11 @@
         return;
     }
 
-    sharedWorker.setFetchResult(WTFMove(fetchResult));
+    auto* connection = m_contextConnections.get(sharedWorker.registrableDomain());
+    sharedWorker.setFetchResult(WTFMove(fetchResult), connection);
 
-    if (auto* contextConnection = sharedWorker.contextConnection()) {
-        contextConnection->launchSharedWorker(sharedWorker);
-        return;
-    }
-    createContextConnection(sharedWorker.registrableDomain(), sharedWorker.firstSharedWorkerObjectProcess());
+    if (!connection)
+        createContextConnection(sharedWorker.registrableDomain(), sharedWorker.firstSharedWorkerObjectProcess());
 }
 
 bool WebSharedWorkerServer::needsContextConnectionForRegistrableDomain(const WebCore::RegistrableDomain& registrableDomain) const
@@ -186,8 +184,6 @@
             continue;
 
         sharedWorker->didCreateContextConnection(contextConnection);
-        if (sharedWorker->didFinishFetching())
-            contextConnection.launchSharedWorker(*sharedWorker);
     }
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to