Skip to content

Commit

Permalink
23.lts.1+ service worker cherry-picks (#627)
Browse files Browse the repository at this point in the history
* Disable flaky service-worker-header.https test (#215) (#578)

Temporarily disable in trunk and 23lts, until HasNoPendingEvents is in place.

* [Service Worker] Merge a few flaky tests into the same category (#322) (#579)
* [Service Worker] Fix service worker activates too early when installing (#547) (#615)
* [Service Worker]Fix updatefound event too late and worker state not changed after terminate (#568) (#616)

(cherry picked from commit 8357147)
(cherry picked from commit 50ddfd1)
(cherry picked from commit 51d20e3)
(cherry picked from commit c3bf2b0)

b/266234216
b/234788479
b/240174245

Co-authored-by: Sherry Zhou <[email protected]>
  • Loading branch information
kaidokert and sherryzy committed Jun 15, 2023
1 parent b28a4b3 commit 9d5e39e
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 58 deletions.
Original file line number Diff line number Diff line change
@@ -1,27 +1,32 @@
# Service Worker API tests

service-worker/activation-after-registration.https.html, PASS
service-worker/activate-event-after-install-state-change.https.html, PASS
service-worker/clients-matchall-on-evaluation.https.html, PASS
service-worker/fetch-event-add-async.https.html, PASS
service-worker/import-scripts-cross-origin.https.html, PASS
service-worker/import-scripts-resource-map.https.html, PASS
service-worker/import-scripts-updated-flag.https.html, PASS
service-worker/multiple-update.https.html, PASS
service-worker/register-default-scope.https.html, PASS
service-worker/registration-basic.https.html, PASS
service-worker/registration-security-error.https.html, PASS
service-worker/registration-service-worker-attributes.https.html, PASS
service-worker/registration-script-url.https.html, PASS
service-worker/rejections.https.html, PASS
service-worker/serviceworkerobject-scripturl.https.html, PASS
service-worker/service-worker-csp-default.https.html, PASS
service-worker/service-worker-csp-connect.https.html, PASS
service-worker/service-worker-header.https.html, PASS
service-worker/service-worker-csp-script.https.html, PASS
service-worker/service-worker-header.https.html, PASS
service-worker/Service-Worker-Allowed-header.https.html, PASS
service-worker/skip-waiting-without-client.https.html, PASS
service-worker/state.https.html, PASS
service-worker/synced-state.https.html, PASS
service-worker/uncontrolled-page.https.html, PASS
service-worker/unregister.https.html, PASS
service-worker/update-no-cache-request-headers.https.html, PASS

# b/278652803 flaky test.
service-worker/import-scripts-cross-origin.https.html, DISABLE

# b/274011216 flaky test
service-worker/update-result.https.html, DISABLE

Expand All @@ -31,18 +36,9 @@ service-worker/update-missing-import-scripts.https.html, DISABLE
# b/275643772 MIME type check is flaky
service-worker/import-scripts-mime-types.https.html, DISABLE

# TODO(b/279915935): Another service worker flaky test
service-worker/serviceworkerobject-scripturl.https.html, DISABLE

# b/234788479 Implement waiting for update worker state tasks in Install algorithm.
service-worker/activation-after-registration.https.html, DISABLE
service-worker/activate-event-after-install-state-change.https.html, DISABLE
service-worker/import-scripts-redirect.https.html, DISABLE
service-worker/multiple-update.https.html, DISABLE
service-worker/register-wait-forever-in-install-worker.https.html, DISABLE
service-worker/registration-service-worker-attributes.https.html, DISABLE
service-worker/state.https.html, DISABLE
service-worker/synced-state.https.html, DISABLE

# "Module" type of dedicated worker is supported in Cobalt
service-worker/dedicated-worker-service-worker-interception.https.html, DISABLE
Expand Down
75 changes: 39 additions & 36 deletions cobalt/worker/service_worker_jobs.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1126,9 +1126,9 @@ void ServiceWorkerJobs::Install(
if (context->environment_settings()->GetOrigin() == registration_origin) {
// 9. ... queue a task on settingsObject’s responsible event loop in the
// DOM manipulation task source to run the following steps:
context->message_loop()->task_runner()->PostTask(
context->message_loop()->task_runner()->PostBlockingTask(
FROM_HERE,
base::BindOnce(
base::Bind(
[](web::Context* context,
scoped_refptr<ServiceWorkerRegistrationObject> registration) {
// 9.1. Let registrationObjects be every
Expand Down Expand Up @@ -1677,9 +1677,9 @@ void ServiceWorkerJobs::UpdateRegistrationState(
// 2.2. For each registrationObject in registrationObjects:
for (auto& context : web_context_registrations_) {
// 2.2.1. Queue a task to...
context->message_loop()->task_runner()->PostTask(
context->message_loop()->task_runner()->PostBlockingTask(
FROM_HERE,
base::BindOnce(
base::Bind(
[](web::Context* context,
ServiceWorkerRegistrationObject* registration) {
// 2.2.1. ... set the installing attribute of
Expand Down Expand Up @@ -1707,9 +1707,9 @@ void ServiceWorkerJobs::UpdateRegistrationState(
// 3.2. For each registrationObject in registrationObjects:
for (auto& context : web_context_registrations_) {
// 3.2.1. Queue a task to...
context->message_loop()->task_runner()->PostTask(
context->message_loop()->task_runner()->PostBlockingTask(
FROM_HERE,
base::BindOnce(
base::Bind(
[](web::Context* context,
ServiceWorkerRegistrationObject* registration) {
// 3.2.1. ... set the waiting attribute of registrationObject
Expand All @@ -1735,9 +1735,9 @@ void ServiceWorkerJobs::UpdateRegistrationState(
// 4.2. For each registrationObject in registrationObjects:
for (auto& context : web_context_registrations_) {
// 4.2.1. Queue a task to...
context->message_loop()->task_runner()->PostTask(
context->message_loop()->task_runner()->PostBlockingTask(
FROM_HERE,
base::BindOnce(
base::Bind(
[](web::Context* context,
ServiceWorkerRegistrationObject* registration) {
// 4.2.1. ... set the active attribute of registrationObject
Expand Down Expand Up @@ -1785,34 +1785,31 @@ void ServiceWorkerJobs::UpdateWorkerState(ServiceWorkerObject* worker,
// 4. ... queue a task on
// settingsObject's responsible event loop in the DOM manipulation task
// source to run the following steps:
context->message_loop()->task_runner()->PostTask(
FROM_HERE,
base::BindOnce(
[](web::Context* context, ServiceWorkerObject* worker,
ServiceWorkerState state) {
DCHECK_EQ(context->message_loop(),
base::MessageLoop::current());
// 4.1. Let objectMap be settingsObject's service worker object
// map.
// 4.2. If objectMap[worker] does not exist, then abort these
// steps.
// 4.3. Let workerObj be objectMap[worker].
auto worker_obj = context->LookupServiceWorker(worker);
if (worker_obj) {
// 4.4. Set workerObj's state to state.
worker_obj->set_state(state);
// 4.5. Fire an event named statechange at workerObj.
context->message_loop()->task_runner()->PostTask(
FROM_HERE,
base::BindOnce(
[](scoped_refptr<ServiceWorker> worker_obj) {
worker_obj->DispatchEvent(
new web::Event(base::Tokens::statechange()));
},
worker_obj));
}
},
context, base::Unretained(worker), state));
context->message_loop()->task_runner()->PostBlockingTask(
FROM_HERE, base::Bind(
[](web::Context* context, ServiceWorkerObject* worker,
ServiceWorkerState state) {
DCHECK_EQ(context->message_loop(),
base::MessageLoop::current());
// 4.1. Let objectMap be settingsObject's service
// worker object
// map.
// 4.2. If objectMap[worker] does not exist, then
// abort these
// steps.
// 4.3. Let workerObj be objectMap[worker].
auto worker_obj =
context->LookupServiceWorker(worker);
if (worker_obj) {
// 4.4. Set workerObj's state to state.
worker_obj->set_state(state);
// 4.5. Fire an event named statechange at
// workerObj.
worker_obj->DispatchEvent(
new web::Event(base::Tokens::statechange()));
}
},
context, base::Unretained(worker), state));
}
}
}
Expand Down Expand Up @@ -1894,6 +1891,12 @@ void ServiceWorkerJobs::TerminateServiceWorker(ServiceWorkerObject* worker) {
context->message_loop()->task_runner()->PostBlockingTask(
FROM_HERE, base::Bind(
[](web::Context* context, ServiceWorkerObject* worker) {
auto worker_obj = context->LookupServiceWorker(worker);
if (worker_obj) {
worker_obj->set_state(kServiceWorkerStateRedundant);
worker_obj->DispatchEvent(
new web::Event(base::Tokens::statechange()));
}
context->RemoveServiceWorker(worker);
},
context, base::Unretained(worker)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,10 @@
// immediately followed by setting active to null, which means by the
// time the event loop turns and the Promise for statechange is
// resolved, this will be gone.
assert_equals(registration.active, null,
'active should be null after redundant');
// For Cobalt, this is not the case. Setting active to null can happen
// a little bit later after the Update State change.
// assert_equals(registration.active, null,
// 'active should be null after redundant');
});
}, 'installing/waiting/active after registration');
</script>
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,7 @@ function wait_for_update(test, registration) {
return new Promise(test.step_func(function(resolve) {
var handler = test.step_func(function() {
registration.removeEventListener('updatefound', handler);
// b/234788479 Implement waiting for update worker state tasks in
// Install algorithm, otherwise the worker is activated too early
resolve(get_newest_worker(registration));
resolve(registration.installing);
});
registration.addEventListener('updatefound', handler);
}));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,7 @@
// Do an update.
await registration.update();

// Ask the new worker what the request headers were.
// b/234788479 Implement waiting for update worker state tasks in
// Install algorithm, otherwise the worker is activated too early
const newWorker = get_newest_worker(registration);
const newWorker = registration.installing;
const sawMessage = new Promise((resolve) => {
navigator.serviceWorker.onmessage = (event) => {
resolve(event.data);
Expand Down

0 comments on commit 9d5e39e

Please sign in to comment.