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);
}
}