[SecureContext, Exposed=(Window,Worker)] interface ServiceWorker : EventTarget { readonly attribute USVString scriptURL; readonly attribute ServiceWorkerState state; undefined postMessage(any message, sequence<object> transfer); undefined postMessage(any message, optional StructuredSerializeOptions options = {}); // событие attribute EventHandler onstatechange; }; ServiceWorker includes AbstractWorker; enum ServiceWorkerState { "parsed", "installing", "installed", "activating", "activated", "redundant" };
Объект ServiceWorker представляет работника службы. Каждый объект ServiceWorker связан с работником службы. Несколько отдельных объектов, реализующих интерфейс ServiceWorker для документов и рабочих, могут быть связаны с одним и тем же работником службы одновременно.
Объект ServiceWorker имеет связанный объект ServiceWorkerState, который сам связан с состоянием работника службы.
3.1.1 Получение экземпляров ServiceWorker
У объекта настроек среды есть карта объектов работника службы (service worker object map), карта, где ключи — работники службы, а значения — объекты ServiceWorker.
Чтобы получить объект работника службы (get the service worker object), представляющий serviceWorker (работник службы) в среде environment (объект настроек среды), выполните следующие действия:
1. Пусть objectMap будет картой объекта работника службы среды environment. 2. Если objectMap[serviceWorker] не существует, тогда: 2.1 Пусть serviceWorkerObj будет новым ServiceWorker в Области среды, и свяжите его с serviceWorker. 2.2 Установите состояние state serviceWorkerObj на состояние serviceWorker. 2.3 Установите для objectMap[serviceWorker] значение serviceWorkerObj. 3. Вернуть objectMap[serviceWorker].
3.1.2 Геттер scriptURL
Шаги получателя scriptURL должны вернуть сериализованный URL-адрес сценария работника службы.
Например, рассмотрим документ, созданный путем перехода на «https://example.com/app.html«, который соответствует следующему вызову регистрации, который был ранее выполнен:
// Сценарий на странице https://example.com/app.html navigator.serviceWorker.register("/service_worker.js");
Значение navigator.serviceWorker.controller.scriptURL будет «https://example.com/service_worker.js«.
3.1.3 Атрибут state
Атрибут состояния state должен возвращать значение (в перечислении ServiceWorkerState), которое было установлено в последний раз.
3.1.4 Метод postMessage(message, transfer)
Шаги метода postMessage(message, transfer):
1. Пусть options будут «[ "transfer" → transfer ]». 2. Вызов postMessage(message, options) с сообщением message и параметрами options в качестве аргументов.
3.1.5 Метод postMessage(message, options)
Шаги метода postMessage(message, options):
1. Пусть serviceWorker будет представителем этого работника службы. 2. Пусть incumbentSettings будет существующим объектом настроек. 3. Пусть incumbentGlobal будет глобальным объектом incumbentSettings. 4. Пусть serializeWithTransferResult будет StructuredSerializeWithTransfer (message, options["transfer"]). Перебросьте все исключения. 5. Если результат выполнения алгоритма Should Skip Event (Должен Пропустить Событие) с "message" и serviceWorker является true, то вернитесь. 6. Выполните эти подэтапы параллельно: 6.1 Если в результате выполнения алгоритма Run Service Worker (Запустить Работника Службы) с serviceWorker произошел сбой, вернитесь. 6.2 Поставьте задачу в очередь в источнике задачи манипулирования DOM, чтобы выполнить следующие шаги: 6.2.1 Пусть source определяется переключением типа incumbentGlobal: ServiceWorkerGlobalScope Результат получения объекта работника службы, который представляет работника службы incumbentGlobal в подходящем объекте настроек глобального объекта serviceWorker. Window новый объект WindowClient, представляющий подходящий объект настроек incumbentGlobal. В противном случае новый объект Client, который представляет работника, связанного с incumbentGlobal. 6.2.2 Пусть origin будет сериализацией источника incumbentSettings. 6.2.3 Пусть местом назначения destination будет объект ServiceWorkerGlobalScope, связанный с serviceWorker. 6.2.4 Пусть deserializeRecord будет StructuredDeserializeWithTransfer(serializeWithTransferResult, Область destination). Если это вызывает исключение, пусть e будет результатом создания события с именем messageerror, используя ExtendableMessageEvent, с атрибутом origin, инициализированным как origin, и атрибутом source, инициализированным как source. 6.2.5 Иначе 6.2.5.1 Пусть messageClone будет deserializeRecord.[[Deserialized]]. 6.2.5.2 Пусть newPorts будет новым замороженным массивом, состоящим из всех объектов MessagePort в deserializeRecord.[[TransferredValues]], если они есть, сохраняя их относительный порядок. 6.2.5.3 Пусть e будет результатом создания события с именем message с использованием ExtendableMessageEvent, с атрибутом origin, инициализированным значением origin, атрибутом source, инициализированным значением source, атрибутом data, инициализированным значением messageClone, и атрибутом ports, инициализированным значением newPorts. 6.2.6 Отправить e в пункте назначения destination. 6.2.7 Вызвать набор расширенных событий работника службы обновления (Update Service Worker Extended Events Set) с помощью serviceWorker и e.
3.1.6 Обработчик событий ServiceWorker
Ниже приводится обработчик событий (и соответствующий ему тип события обработчика событий), который должен поддерживаться в качестве IDL-атрибутов обработчика событий всеми объектами, реализующими интерфейс ServiceWorker:
| event handler | event handler event type |
|---|---|
| onstatechange | statechange |
Информационные ссылки
Стандарт Service Workers Nightly — https://w3c.github.io/ServiceWorker/#serviceworker-interface