Commit b9aff248 authored by Matt Falkenhagen's avatar Matt Falkenhagen Committed by Commit Bot

service worker: Queue Client.postMessage() until onmessage is set.

This is a follow-up to
https://chromium-review.googlesource.com/c/chromium/src/+/1441657.

This enables the queue when onmessage is assigned to. It adheres to
the specification at
https://w3c.github.io/ServiceWorker/#dom-serviceworkercontainer-onmessage:
"The first time the context object’s onmessage IDL attribute is set, its
client message queue must be enabled."

This makes the test cases about "setting onmessage" in
the WPT postmessage-to-client-message-queue.https.html pass, but the
test file will still time out until startMessages() is implemented.

Bug: 915685
Change-Id: I4c4930b48df68ee351676e5c3edfb28969fe3610
Reviewed-on: https://chromium-review.googlesource.com/c/1441734
Commit-Queue: Matt Falkenhagen <falken@chromium.org>
Reviewed-by: default avatarHiroki Nakagawa <nhiroki@chromium.org>
Cr-Commit-Position: refs/heads/master@{#626929}
parent 38db9032
...@@ -557,6 +557,18 @@ const AtomicString& ServiceWorkerContainer::InterfaceName() const { ...@@ -557,6 +557,18 @@ const AtomicString& ServiceWorkerContainer::InterfaceName() const {
return event_target_names::kServiceWorkerContainer; return event_target_names::kServiceWorkerContainer;
} }
void ServiceWorkerContainer::setOnmessage(EventListener* listener) {
SetAttributeEventListener(event_type_names::kMessage, listener);
// https://w3c.github.io/ServiceWorker/#dom-serviceworkercontainer-onmessage:
// "The first time the context object’s onmessage IDL attribute is set, its
// client message queue must be enabled."
EnableClientMessageQueue();
}
EventListener* ServiceWorkerContainer::onmessage() {
return GetAttributeEventListener(event_type_names::kMessage);
}
ServiceWorkerRegistration* ServiceWorkerRegistration*
ServiceWorkerContainer::GetOrCreateServiceWorkerRegistration( ServiceWorkerContainer::GetOrCreateServiceWorkerRegistration(
WebServiceWorkerRegistrationObjectInfo info) { WebServiceWorkerRegistrationObjectInfo info) {
...@@ -600,6 +612,10 @@ ServiceWorkerContainer::CreateReadyProperty() { ...@@ -600,6 +612,10 @@ ServiceWorkerContainer::CreateReadyProperty() {
void ServiceWorkerContainer::EnableClientMessageQueue() { void ServiceWorkerContainer::EnableClientMessageQueue() {
dom_content_loaded_observer_ = nullptr; dom_content_loaded_observer_ = nullptr;
if (is_client_message_queue_enabled_) {
DCHECK(queued_messages_.empty());
return;
}
is_client_message_queue_enabled_ = true; is_client_message_queue_enabled_ = true;
std::vector<std::unique_ptr<MessageFromServiceWorker>> messages; std::vector<std::unique_ptr<MessageFromServiceWorker>> messages;
messages.swap(queued_messages_); messages.swap(queued_messages_);
......
...@@ -103,9 +103,9 @@ class MODULES_EXPORT ServiceWorkerContainer final ...@@ -103,9 +103,9 @@ class MODULES_EXPORT ServiceWorkerContainer final
const AtomicString& InterfaceName() const override; const AtomicString& InterfaceName() const override;
DEFINE_ATTRIBUTE_EVENT_LISTENER(controllerchange, kControllerchange); DEFINE_ATTRIBUTE_EVENT_LISTENER(controllerchange, kControllerchange);
// TODO(falken): Enable the client message queue when onmessage is assigned
// to. void setOnmessage(EventListener* listener);
DEFINE_ATTRIBUTE_EVENT_LISTENER(message, kMessage); EventListener* onmessage();
// Returns the ServiceWorkerRegistration object described by the given info. // Returns the ServiceWorkerRegistration object described by the given info.
// Creates a new object if needed, or else returns the existing one. // Creates a new object if needed, or else returns the existing one.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment