[Exposed=ServiceWorker] interface Clients { // Возвращаемые объекты будут каждый раз новыми экземплярами [NewObject] Promise<(Client or undefined)> get(DOMString id); [NewObject] Promise<FrozenArray<Client>> matchAll(optional ClientQueryOptions options = {}); [NewObject] Promise<WindowClient?> openWindow(USVString url); [NewObject] Promise<undefined> claim(); };
dictionary ClientQueryOptions { boolean includeUncontrolled = false; ClientType type = "window"; };
enum ClientType { "window", "worker", "sharedworker", "all" };
Пользовательский агент должен создать объект Clients («Клиенты») при создании объекта ServiceWorkerGlobalScope и связать его с этим объектом.
4.3.1. Метод get(id)
Шаги метода get(id):
1. Пусть обещание promise станет новым обещанием. 2. Выполните эти подэтапы параллельно: 2.1 Для каждого клиента работника службы client, источник которого совпадает с источником связанного работника службы: 2.1.1 Если идентификатор client не является id, продолжайте. 2.1.2 Подождите, пока не будет установлен флаг готовности к выполнению client или установлен флаг сброса client. 2.1.3 Если установлен флаг готовности к выполнению client, вызовите "Решите Получить Обещание Клиента" (Resolve Get Client Promise) с клиентом client и обещанием promise и прервите эти шаги. 2.2 Разрешить обещание promise с undefined. 3. Вернуть обещание promise.
4.3.2. Метод matchAll(options)
Шаги метода matchAll(options):
1. Пусть обещание promise станет новым обещанием. 2. Параллельно выполните следующие шаги: 2.1 Пусть targetClients будет новым списком. 2.2 Для каждого клиента работника службы client, источник которого совпадает с источником связанного работника службы: 2.2.1 Если флаг готовности к выполнению client не установлен или установлен флаг отказа client, продолжайте. 2.2.2 Если client не является безопасным контекстом, продолжайте. 2.2.3 Если options["includeUncontrolled"] имеет значение false, и если активный работник службы клиента client не является связанным работником службы, продолжайте. 2.2.4 Добавьте client в targetClients. 2.3 Пусть matchedWindowData будет новым списком. 2.4 Пусть matchedClients будет новым списком. 2.5 Для каждого клиента работника службы client в targetClients: 2.5.1 Если options["type"] - "window" или "all", а клиент client не является объектом настроек среды или клиентом окна, то: 2.5.1.1 Пусть windowData будет «["client" → client, "ancestorOriginsList" → новый список]». 2.5.1.2 Пусть browsingContext будет null. 2.5.1.3 Пусть isClientEnumerable будет true. 2.5.1.4 Если клиент client является объектом настроек среды, установите browsingContext равным контексту просмотра глобального объекта клиента client. 2.5.1.5 В противном случае установите browsingContext для целевого контекста просмотра клиента client. 2.5.1.6 Поставьте задачу в очередь task для выполнения следующих подшагов в цикле событий browsingContext, используя источник задачи взаимодействия с пользователем: 2.5.1.6.1 Если browsingContext был отброшен, установите для isClientEnumerable значение false и прервите эти шаги. 2.5.1.6.2 Если клиент client является оконным клиентом, а ответственный документ клиента client не является активным документом browsingContext, установите для isClientEnumerable значение false и прервите эти шаги. 2.5.1.6.3 Установите windowData["frameType"] равным результату выполнения "Получения Типа Кадра" (Get Frame Type) с browsingContext. 2.5.1.6.4 Задайте для windowData["visibilityState"] значение атрибута visibilityState активного документа browsingContext. 2.5.1.6.5 Установите windowData["focusState"] равным результату выполнения "имения фокусных шагов" с активным документом browsingContext в качестве аргумента. 2.5.1.6.6 Если клиент client является оконным клиентом, то установите windowData["ancestorOriginsList"] равным связанному списку, со списком происхождения предков объекта Location соответствующего глобального объекта активного документа browsingContext. 2.5.1.7 Подождите, пока задача task будет выполнена. Примечание. Ожидание - это ожидание с блокировкой, но разработчики могут запускать итерации параллельно, пока состояние не нарушено. 2.5.1.8 Если isClientEnumerable является true (истинно), то: 2.5.1.8.1 Добавьте windowData в matchedWindowData. 2.5.2 Иначе, если options["type"] равно "worker" или "all", а client является выделенным клиентом работника, или options["type"] равно "sharedworker" или "all", а client является совместно используемым клиентом работника, тогда: 2.5.2.1 Добавьте client в matchedClients. 2.6 Поставьте задачу в очередь для выполнения следующих шагов в ответственном цикле событий соответствующего объекта настроек обещания promise, используя источник задачи манипулирования DOM: 2.6.1 Пусть clientObjects будет новым списком. 2.6.2 Для каждого windowData в matchedWindowData: 2.6.2.1 Пусть windowClient будет результатом выполнения алгоритма "Создать Клиент Окна" (Create Window Client) с windowData["client"], windowData["frameType"], windowData["visibilityState"], windowData["focusState"] и windowData["ancestorOriginsList"] в качестве аргументов. . 2.6.2.2 Добавьте windowClient в clientObjects. 2.6.3 Для каждого клиента client в matchedClients: 2.6.3.1 Пусть clientObject будет результатом выполнения алгоритма "Создания Клиента" (Create Client) с клиентом client в качестве аргумента. 2.6.3.2 Добавьте clientObject в clientObjects. 2.6.4 Отсортируйте clientObjects таким образом, чтобы: Объекты WindowClient, контекст просмотра которых был сфокусирован, помещаются первыми и сортируются в порядке последнего фокусирования. Затем помещаются объекты WindowClient, контекст просмотра которых никогда не был сфокусирован, и отсортированы в порядке создания их клиента работника службы. Объекты Client, связанные с ними клиенты работника службы, являющиеся клиентом работника, помещаются затем, отсортированные в порядке создания их клиента работника службы. Примечание. Оконные клиенты всегда помещаются перед клиентами работника. 2.6.5 Выполните обещание promise с помощью нового замороженного массива clientObject в соответствующей Области обещания promise. 3. Вернуть обещание promise.
4.3.3. Метод openWindow(url)
Шаги метода openWindow(url):
1. Пусть url будет результатом синтаксического анализа url с базовым URL API соответствующего объекта настроек этого this. 2. Если url сбой, вернуть обещание, отклоненное с помощью TypeError. 3. Если url является about:blank, вернуть обещание, отклоненное с помощью TypeError. 4. Если этот алгоритм не запускается активацией пользователя, вернуть обещание, отклоненное с помощью исключения "InvalidAccessError" DOMException. 5. Пусть serviceWorkerEventLoop будет циклом событий текущего глобального объекта. 6. Пусть обещание promise станет новым обещанием. 7. Выполните эти подэтапы параллельно: 7.1 Пусть newContext будет новым контекстом просмотра верхнего уровня. 7.2 Поставьте задачу в очередь для выполнения следующих шагов в ответственном цикле событий объекта настроек среды объекта Window объекта newContext, используя источник задачи взаимодействия с пользователем: 7.2.1 HandleNavigate: Перейдите в newContext к url с включенными исключениями и включенной заменой. 7.2.2 Если шаги алгоритма, вызванные на шаге с меткой HandleNavigate, вызывают исключения, поставьте задачу в очередь для отклонения обещания promise с исключением в serviceWorkerEventLoop, используя источник задачи манипулирования DOM, и прервите эти шаги. 7.2.3 Пусть frameType будет результатом выполнения "Получить Тип Кадра" (Get Frame Type) с newContext. 7.2.4 Пусть visibilityState будет значением атрибута visibilityState активного документа newContext. 7.2.5 Пусть focusState будет результатом выполнения шагов имения фокуса с активным документом newContext в качестве аргумента. 7.2.6 Пусть ancestorOriginsList будет ассоциированным списком списка происхождения предков объекта Location соответствующего глобального объекта активного документа newContext. 7.2.7 Поставьте задачу в очередь для выполнения следующих шагов в serviceWorkerEventLoop, используя источник задачи манипулирования DOM: 7.2.7.1 Если источник создания URL объекта настроек среды объекта Window newContext не совпадает с тем же источником работника службы, разрешите обещание promise с помощью null и прервите эти шаги. 7.2.7.2 Пусть client будет результатом запуска "Создать Клиента Окна" (Create Window Client) с объектом настроек среды объекта Window newContext, frameType, visibilityState, focusState и ancestorOriginsList в качестве аргументов. 7.2.7.3 Выполните обещание promise с клиентом client. 8. Вернуть обещание promise.
4.3.4. Метод claim()
Шаги метода claim():
1. Если работник службы не является активным работником, верните обещание, отклонённое с помощью "InvalidStateError" DOMException. 2. Пусть обещание promise станет новым обещанием. 3. Параллельно выполните следующие подшаги: 3.1 Для каждого клиента работника службы client, источник которого совпадает с источником работника службы: 3.1.1 Если флаг готовности к выполнению клиента client не установлен или установлен флаг отказа клиента client, продолжайте. 3.1.2 Если клиент client не является безопасным контекстом, продолжайте. 3.1.3 Пусть регистрация registration будет результатом выполнения алгоритма (Match Service Worker Registration), передающего создание URL клиента client в качестве аргумента. 3.1.4 Если регистрация registration работника службы не связана с содержащим регистрацией работника службы, продолжите. Примечание: registration будет null, если содержащий регистрацию работник службы, работника службы, не зарегистрирован. 3.1.5 Если активный работник службы клиента client не является работником службы, тогда: 3.1.5.1 Вызов "Обработка Выгрузки Клиента Работника Службы" (Handle Service Worker Client Unload) с клиентом client в качестве аргумента. 3.1.5.2 Установите активного работника службы клиента client на работника службы. 3.1.5.3 Вызов алгоритма "Уведомления об Изменении Контроллера" (Notify Controller Change) с клиентом client в качестве аргумента. 3.2 Разрешить обещание promise с undefined. 4. Вернуть обещание promise.
Информационные ссылки
Стандарт Service Workers Nightly — https://w3c.github.io/ServiceWorker/#clients-interface